lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 32/32] bnxt_en: Fix ipv6 RFS filter matching logic.
    Date
    From: Michael Chan <michael.chan@broadcom.com>

    [ Upstream commit 6fc7caa84e713f7627e171ab1e7c4b5be0dc9b3d ]

    Fix bnxt_fltr_match() to match ipv6 source and destination addresses.
    The function currently only checks ipv4 addresses and will not work
    corrently on ipv6 filters.

    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/broadcom/bnxt/bnxt.c | 22 +++++++++++++++++-----
    1 file changed, 17 insertions(+), 5 deletions(-)

    diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    index 38ee7692132c5..7461e7b9eaae5 100644
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -7402,11 +7402,23 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
    struct flow_keys *keys1 = &f1->fkeys;
    struct flow_keys *keys2 = &f2->fkeys;

    - if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src &&
    - keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst &&
    - keys1->ports.ports == keys2->ports.ports &&
    - keys1->basic.ip_proto == keys2->basic.ip_proto &&
    - keys1->basic.n_proto == keys2->basic.n_proto &&
    + if (keys1->basic.n_proto != keys2->basic.n_proto ||
    + keys1->basic.ip_proto != keys2->basic.ip_proto)
    + return false;
    +
    + if (keys1->basic.n_proto == htons(ETH_P_IP)) {
    + if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
    + keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst)
    + return false;
    + } else {
    + if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src,
    + sizeof(keys1->addrs.v6addrs.src)) ||
    + memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst,
    + sizeof(keys1->addrs.v6addrs.dst)))
    + return false;
    + }
    +
    + if (keys1->ports.ports == keys2->ports.ports &&
    keys1->control.flags == keys2->control.flags &&
    ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
    ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-01-24 15:22    [W:4.097 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site