]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Improve ntuple filters by checking destination MAC address.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 25 Jul 2016 16:33:35 +0000 (12:33 -0400)
committerDhaval Giani <dhaval.giani@oracle.com>
Fri, 20 Jan 2017 17:59:58 +0000 (12:59 -0500)
Orabug: 24567991

Include the destination MAC address in the ntuple filter structure.  The
current code assumes that the destination MAC address is always the MAC
address of the NIC.  This may not be true if there are macvlans, for
example.  Add destination MAC address checking and configure the filter
correctly using the correct index for the destination MAC address.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit a54c4d74989b769014b359e5b66f3e571d903d25)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index 3e155e807a151082c9f8d119c7179eb40fd119ab..61ef1d3ab796cbecb2678ae5635ddd8978ded6cb 100644 (file)
@@ -3244,7 +3244,7 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
        struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1];
 
        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_NTUPLE_FILTER_ALLOC, -1, -1);
-       req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[0];
+       req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[fltr->l2_fltr_idx];
 
        req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS);
 
@@ -6313,7 +6313,8 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
            keys1->ports.ports == keys2->ports.ports &&
            keys1->basic.ip_proto == keys2->basic.ip_proto &&
            keys1->basic.n_proto == keys2->basic.n_proto &&
-           ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr))
+           ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
+           ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
                return true;
 
        return false;
@@ -6348,12 +6349,28 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
        struct bnxt_ntuple_filter *fltr, *new_fltr;
        struct flow_keys *fkeys;
        struct ethhdr *eth = (struct ethhdr *)skb_mac_header(skb);
-       int rc = 0, idx, bit_id;
+       int rc = 0, idx, bit_id, l2_idx = 0;
        struct hlist_head *head;
 
        if (skb->encapsulation)
                return -EPROTONOSUPPORT;
 
+       if (!ether_addr_equal(dev->dev_addr, eth->h_dest)) {
+               struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
+               int off = 0, j;
+
+               netif_addr_lock_bh(dev);
+               for (j = 0; j < vnic->uc_filter_count; j++, off += ETH_ALEN) {
+                       if (ether_addr_equal(eth->h_dest,
+                                            vnic->uc_list + off)) {
+                               l2_idx = j + 1;
+                               break;
+                       }
+               }
+               netif_addr_unlock_bh(dev);
+               if (!l2_idx)
+                       return -EINVAL;
+       }
        new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC);
        if (!new_fltr)
                return -ENOMEM;
@@ -6394,6 +6411,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
 #endif
 #endif
 
+       memcpy(new_fltr->dst_mac_addr, eth->h_dest, ETH_ALEN);
        memcpy(new_fltr->src_mac_addr, eth->h_source, ETH_ALEN);
 
        idx = skb_get_hash_raw(skb) & BNXT_NTP_FLTR_HASH_MASK;
@@ -6419,6 +6437,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
 
        new_fltr->sw_id = (u16)bit_id;
        new_fltr->flow_id = flow_id;
+       new_fltr->l2_fltr_idx = l2_idx;
        new_fltr->rxq = rxq_index;
        hlist_add_head_rcu(&new_fltr->hash, head);
        bp->ntp_fltr_count++;
index 5307a2ee6a05eae25e002e310ca5618ddc6cceda..23e04a6142fbec06fa027bde6f94f7f5d9e49e83 100644 (file)
@@ -785,10 +785,12 @@ struct bnxt_pf_info {
 
 struct bnxt_ntuple_filter {
        struct hlist_node       hash;
+       u8                      dst_mac_addr[ETH_ALEN];
        u8                      src_mac_addr[ETH_ALEN];
        struct flow_keys        fkeys;
        __le64                  filter_id;
        u16                     sw_id;
+       u8                      l2_fltr_idx;
        u16                     rxq;
        u32                     flow_id;
        unsigned long           state;