nfp: flower: add/remove predt_list entries
authorLouis Peens <louis.peens@corigine.com>
Thu, 5 May 2022 05:43:41 +0000 (14:43 +0900)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 May 2022 10:21:33 +0000 (11:21 +0100)
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>
drivers/net/ethernet/netronome/nfp/flower/action.c
drivers/net/ethernet/netronome/nfp/flower/offload.c

index 1b9421e..0147de4 100644 (file)
@@ -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;
                }
index 92e8ade..0fe018b 100644 (file)
@@ -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: