Commit 2f4f9fe5 authored by Pavan Chebbi's avatar Pavan Chebbi Committed by Jakub Kicinski
Browse files

bnxt_en: Support adding ntuple rules on RSS contexts



When the user wants to add an ntuple filter to an RSS context, select
the appropriate VNIC belonging to the selected RSS context and add the
VNIC destination rule.

Make the necessary changes to bnxt_add_ntuple_cls_rule().

Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarPavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240325222902.220712-13-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 61c814bf
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -5791,8 +5791,20 @@ bnxt_cfg_rfs_ring_tbl_idx(struct bnxt *bp,
			  struct hwrm_cfa_ntuple_filter_alloc_input *req,
			  struct bnxt_ntuple_filter *fltr)
{
	struct bnxt_rss_ctx *rss_ctx, *tmp;
	u16 rxq = fltr->base.rxq;

	if (fltr->base.flags & BNXT_ACT_RSS_CTX) {
		list_for_each_entry_safe(rss_ctx, tmp, &bp->rss_ctx_list, list) {
			if (rss_ctx->index == fltr->base.fw_vnic_id) {
				struct bnxt_vnic_info *vnic = &rss_ctx->vnic;

				req->dst_id = cpu_to_le16(vnic->fw_vnic_id);
				break;
			}
		}
		return;
	}
	if (BNXT_SUPPORTS_NTUPLE_VNIC(bp)) {
		struct bnxt_vnic_info *vnic;
		u32 enables;
@@ -9944,6 +9956,8 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
			  bool all)
{
	struct bnxt_vnic_info *vnic = &rss_ctx->vnic;
	struct bnxt_filter_base *usr_fltr, *tmp;
	struct bnxt_ntuple_filter *ntp_fltr;
	int i;

	bnxt_hwrm_vnic_free_one(bp, &rss_ctx->vnic);
@@ -9954,6 +9968,18 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
	if (!all)
		return;

	list_for_each_entry_safe(usr_fltr, tmp, &bp->usr_fltr_list, list) {
		if ((usr_fltr->flags & BNXT_ACT_RSS_CTX) &&
		    usr_fltr->fw_vnic_id == rss_ctx->index) {
			ntp_fltr = container_of(usr_fltr,
						struct bnxt_ntuple_filter,
						base);
			bnxt_hwrm_cfa_ntuple_filter_free(bp, ntp_fltr);
			bnxt_del_ntp_filter(bp, ntp_fltr);
			bnxt_del_one_usr_fltr(bp, usr_fltr);
		}
	}

	if (vnic->rss_table)
		dma_free_coherent(&bp->pdev->dev, vnic->rss_table_size,
				  vnic->rss_table,
+1 −0
Original line number Diff line number Diff line
@@ -1374,6 +1374,7 @@ struct bnxt_filter_base {
#define BNXT_ACT_RING_DST	2
#define BNXT_ACT_FUNC_DST	4
#define BNXT_ACT_NO_AGING	8
#define BNXT_ACT_RSS_CTX	0x10
	u16			sw_id;
	u16			rxq;
	u16			fw_vnic_id;
+24 −9
Original line number Diff line number Diff line
@@ -1312,22 +1312,24 @@ static bool bnxt_verify_ntuple_ip6_flow(struct ethtool_usrip6_spec *ip_spec,
}

static int bnxt_add_ntuple_cls_rule(struct bnxt *bp,
				    struct ethtool_rx_flow_spec *fs)
				    struct ethtool_rxnfc *cmd)
{
	u8 vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie);
	u32 ring = ethtool_get_flow_spec_ring(fs->ring_cookie);
	struct ethtool_rx_flow_spec *fs = &cmd->fs;
	struct bnxt_ntuple_filter *new_fltr, *fltr;
	u32 flow_type = fs->flow_type & 0xff;
	struct bnxt_l2_filter *l2_fltr;
	struct bnxt_flow_masks *fmasks;
	u32 flow_type = fs->flow_type;
	struct flow_keys *fkeys;
	u32 idx;
	u32 idx, ring;
	int rc;
	u8 vf;

	if (!bp->vnic_info)
		return -EAGAIN;

	if ((flow_type & (FLOW_MAC_EXT | FLOW_EXT)) || vf)
	vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie);
	ring = ethtool_get_flow_spec_ring(fs->ring_cookie);
	if ((fs->flow_type & (FLOW_MAC_EXT | FLOW_EXT)) || vf)
		return -EOPNOTSUPP;

	if (flow_type == IP_USER_FLOW) {
@@ -1435,6 +1437,19 @@ static int bnxt_add_ntuple_cls_rule(struct bnxt *bp,
	rcu_read_unlock();

	new_fltr->base.flags = BNXT_ACT_NO_AGING;
	if (fs->flow_type & FLOW_RSS) {
		struct bnxt_rss_ctx *rss_ctx;

		new_fltr->base.fw_vnic_id = 0;
		new_fltr->base.flags |= BNXT_ACT_RSS_CTX;
		rss_ctx = bnxt_get_rss_ctx_from_index(bp, cmd->rss_context);
		if (rss_ctx) {
			new_fltr->base.fw_vnic_id = rss_ctx->index;
		} else {
			rc = -EINVAL;
			goto ntuple_err;
		}
	}
	if (fs->ring_cookie == RX_CLS_FLOW_DISC)
		new_fltr->base.flags |= BNXT_ACT_DROP;
	else
@@ -1476,12 +1491,12 @@ static int bnxt_srxclsrlins(struct bnxt *bp, struct ethtool_rxnfc *cmd)
	     flow_type == IPV6_USER_FLOW) &&
	    !(bp->fw_cap & BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO))
		return -EOPNOTSUPP;
	if (flow_type & (FLOW_MAC_EXT | FLOW_RSS))
	if (flow_type & FLOW_MAC_EXT)
		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);
		return bnxt_add_ntuple_cls_rule(bp, cmd);

	ring = ethtool_get_flow_spec_ring(fs->ring_cookie);
	vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie);
@@ -1495,7 +1510,7 @@ static int bnxt_srxclsrlins(struct bnxt *bp, struct ethtool_rxnfc *cmd)
	if (flow_type == ETHER_FLOW)
		rc = bnxt_add_l2_cls_rule(bp, fs);
	else
		rc = bnxt_add_ntuple_cls_rule(bp, fs);
		rc = bnxt_add_ntuple_cls_rule(bp, cmd);
	return rc;
}