bnxt_en: Add drop action support for ntuple
authorVikas Gupta <vikas.gupta@broadcom.com>
Mon, 5 Feb 2024 22:31:55 +0000 (14:31 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 20:37:41 +0000 (12:37 -0800)
Add drop action for protocols TCP/UDP/ICMP
1) Drop action for TCP/UDP is supported via flow type
   tcp4/udp4/tcp6/udp6.
2) Drop action for ICMPV4/ICMPV6/wildcard is supported
   via flow type ipv4/ipv6.

Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240205223202.25341-7-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 027e360..0ebe6a2 100644 (file)
@@ -5747,8 +5747,9 @@ int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
        l2_fltr = fltr->l2_fltr;
        req->l2_filter_id = l2_fltr->base.filter_id;
 
-
-       if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2) {
+       if (fltr->base.flags & BNXT_ACT_DROP) {
+               flags = CFA_NTUPLE_FILTER_ALLOC_REQ_FLAGS_DROP;
+       } else if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2) {
                flags = CFA_NTUPLE_FILTER_ALLOC_REQ_FLAGS_DEST_RFS_RING_IDX;
                req->dst_id = cpu_to_le16(fltr->base.rxq);
        } else {
index 5a100ae..57fef0f 100644 (file)
@@ -1192,7 +1192,10 @@ static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                }
        }
 
-       fs->ring_cookie = fltr->base.rxq;
+       if (fltr->base.flags & BNXT_ACT_DROP)
+               fs->ring_cookie = RX_CLS_FLOW_DISC;
+       else
+               fs->ring_cookie = fltr->base.rxq;
        rc = 0;
 
 fltr_err:
@@ -1398,8 +1401,11 @@ static int bnxt_add_ntuple_cls_rule(struct bnxt *bp,
        }
        rcu_read_unlock();
 
-       new_fltr->base.rxq = ring;
        new_fltr->base.flags = BNXT_ACT_NO_AGING;
+       if (fs->ring_cookie == RX_CLS_FLOW_DISC)
+               new_fltr->base.flags |= BNXT_ACT_DROP;
+       else
+               new_fltr->base.rxq = ring;
        __set_bit(BNXT_FLTR_VALID, &new_fltr->base.state);
        rc = bnxt_insert_ntp_filter(bp, new_fltr, idx);
        if (!rc) {
@@ -1441,6 +1447,9 @@ static int bnxt_srxclsrlins(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                return -EINVAL;
        flow_type &= ~FLOW_EXT;
 
+       if (fs->ring_cookie == RX_CLS_FLOW_DISC && flow_type != ETHER_FLOW)
+               return bnxt_add_ntuple_cls_rule(bp, fs);
+
        ring = ethtool_get_flow_spec_ring(fs->ring_cookie);
        vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie);
        if (BNXT_VF(bp) && vf)