Commit e30b2b68 authored by Louis Peens's avatar Louis Peens Committed by David S. Miller
Browse files

nfp: flower: add/remove predt_list entries



Add calls to add and remove flows to the predt_table. This very simply
just allocates and add a new pretun entry if detected as such, and
removes it when encountered on a delete flow.

Compatibility for older firmware is kept in place through the
DECAP_V2 feature bit.

Signed-off-by: default avatarLouis Peens <louis.peens@corigine.com>
Signed-off-by: default avatarYinjun Zhang <yinjun.zhang@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 29c69134
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -220,7 +220,8 @@ nfp_fl_output(struct nfp_app *app, struct nfp_fl_output *output,
		}
		output->port = cpu_to_be32(NFP_FL_LAG_OUT | gid);
	} else if (nfp_flower_internal_port_can_offload(app, out_dev)) {
		if (!(priv->flower_ext_feats & NFP_FL_FEATS_PRE_TUN_RULES)) {
		if (!(priv->flower_ext_feats & NFP_FL_FEATS_PRE_TUN_RULES) &&
		    !(priv->flower_ext_feats & NFP_FL_FEATS_DECAP_V2)) {
			NL_SET_ERR_MSG_MOD(extack, "unsupported offload: pre-tunnel rules not supported in loaded firmware");
			return -EOPNOTSUPP;
		}
+37 −6
Original line number Diff line number Diff line
@@ -1362,11 +1362,29 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
		goto err_release_metadata;
	}

	if (flow_pay->pre_tun_rule.dev)
	if (flow_pay->pre_tun_rule.dev) {
		if (priv->flower_ext_feats & NFP_FL_FEATS_DECAP_V2) {
			struct nfp_predt_entry *predt;

			predt = kzalloc(sizeof(*predt), GFP_KERNEL);
			if (!predt) {
				err = -ENOMEM;
				goto err_remove_rhash;
			}
			predt->flow_pay = flow_pay;
			INIT_LIST_HEAD(&predt->nn_list);
			spin_lock_bh(&priv->predt_lock);
			list_add(&predt->list_head, &priv->predt_list);
			spin_unlock_bh(&priv->predt_lock);
			flow_pay->pre_tun_rule.predt = predt;
		} else {
			err = nfp_flower_xmit_pre_tun_flow(app, flow_pay);
	else
		}
	} else {
		err = nfp_flower_xmit_flow(app, flow_pay,
					   NFP_FLOWER_CMSG_TYPE_FLOW_ADD);
	}

	if (err)
		goto err_remove_rhash;

@@ -1538,11 +1556,24 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,
		goto err_free_merge_flow;
	}

	if (nfp_flow->pre_tun_rule.dev)
	if (nfp_flow->pre_tun_rule.dev) {
		if (priv->flower_ext_feats & NFP_FL_FEATS_DECAP_V2) {
			struct nfp_predt_entry *predt;

			predt = nfp_flow->pre_tun_rule.predt;
			if (predt) {
				spin_lock_bh(&priv->predt_lock);
				list_del(&predt->list_head);
				spin_unlock_bh(&priv->predt_lock);
				kfree(predt);
			}
		} else {
			err = nfp_flower_xmit_pre_tun_del_flow(app, nfp_flow);
	else
		}
	} else {
		err = nfp_flower_xmit_flow(app, nfp_flow,
					   NFP_FLOWER_CMSG_TYPE_FLOW_DEL);
	}
	/* Fall through on error. */

err_free_merge_flow: