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

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
...@@ -220,7 +220,8 @@ nfp_fl_output(struct nfp_app *app, struct nfp_fl_output *output, ...@@ -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); output->port = cpu_to_be32(NFP_FL_LAG_OUT | gid);
} else if (nfp_flower_internal_port_can_offload(app, out_dev)) { } 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"); NL_SET_ERR_MSG_MOD(extack, "unsupported offload: pre-tunnel rules not supported in loaded firmware");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -1362,11 +1362,29 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev, ...@@ -1362,11 +1362,29 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
goto err_release_metadata; goto err_release_metadata;
} }
if (flow_pay->pre_tun_rule.dev) if (flow_pay->pre_tun_rule.dev) {
err = nfp_flower_xmit_pre_tun_flow(app, flow_pay); if (priv->flower_ext_feats & NFP_FL_FEATS_DECAP_V2) {
else 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, err = nfp_flower_xmit_flow(app, flow_pay,
NFP_FLOWER_CMSG_TYPE_FLOW_ADD); NFP_FLOWER_CMSG_TYPE_FLOW_ADD);
}
if (err) if (err)
goto err_remove_rhash; goto err_remove_rhash;
...@@ -1538,11 +1556,24 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev, ...@@ -1538,11 +1556,24 @@ nfp_flower_del_offload(struct nfp_app *app, struct net_device *netdev,
goto err_free_merge_flow; goto err_free_merge_flow;
} }
if (nfp_flow->pre_tun_rule.dev) if (nfp_flow->pre_tun_rule.dev) {
err = nfp_flower_xmit_pre_tun_del_flow(app, nfp_flow); if (priv->flower_ext_feats & NFP_FL_FEATS_DECAP_V2) {
else 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, err = nfp_flower_xmit_flow(app, nfp_flow,
NFP_FLOWER_CMSG_TYPE_FLOW_DEL); NFP_FLOWER_CMSG_TYPE_FLOW_DEL);
}
/* Fall through on error. */ /* Fall through on error. */
err_free_merge_flow: err_free_merge_flow:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment