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: Louis Peens <louis.peens@corigine.com> Signed-off-by: Yinjun Zhang <yinjun.zhang@corigine.com> Signed-off-by: Simon Horman <simon.horman@corigine.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
29c691347e
commit
e30b2b68c1
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
err = nfp_flower_xmit_pre_tun_flow(app, flow_pay);
|
||||
else
|
||||
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 {
|
||||
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)
|
||||
err = nfp_flower_xmit_pre_tun_del_flow(app, nfp_flow);
|
||||
else
|
||||
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 {
|
||||
err = nfp_flower_xmit_flow(app, nfp_flow,
|
||||
NFP_FLOWER_CMSG_TYPE_FLOW_DEL);
|
||||
}
|
||||
/* Fall through on error. */
|
||||
|
||||
err_free_merge_flow:
|
||||
|
Loading…
x
Reference in New Issue
Block a user