]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfp: flower: add goto_chain_index for ct entry
authorWentao Jia <wentao.jia@corigine.com>
Tue, 14 Mar 2023 06:36:08 +0000 (08:36 +0200)
committerSasha Levin <sashal@kernel.org>
Fri, 15 Mar 2024 14:48:19 +0000 (10:48 -0400)
[ Upstream commit 3e44d19934b92398785b3ffc2353b9eba264140e ]

The chain_index has different means in pre ct entry and post ct entry.
In pre ct entry, it means chain index, but in post ct entry, it means
goto chain index, it is confused.

chain_index and goto_chain_index may be present in one flow rule, It
cannot be distinguished by one field chain_index, both chain_index
and goto_chain_index are required in the follow-up patch to support
multiple ct zones

Another field goto_chain_index is added to record the goto chain index.
If no goto action in post ct entry, goto_chain_index is 0.

Signed-off-by: Wentao Jia <wentao.jia@corigine.com>
Acked-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Louis Peens <louis.peens@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Stable-dep-of: cefa98e806fd ("nfp: flower: add hardware offload check for post ct entry")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/netronome/nfp/flower/conntrack.c
drivers/net/ethernet/netronome/nfp/flower/conntrack.h

index fc17e9b11d19d72da3d49891c7f81cd5af7bd747..0a5592b12e2d18b25734ba97bbc2f8f4063a59df 100644 (file)
@@ -1004,7 +1004,7 @@ static int nfp_ct_do_tc_merge(struct nfp_fl_ct_zone_entry *zt,
        /* Checks that the chain_index of the filter matches the
         * chain_index of the GOTO action.
         */
-       if (post_ct_entry->chain_index != pre_ct_entry->chain_index)
+       if (post_ct_entry->chain_index != pre_ct_entry->goto_chain_index)
                return -EINVAL;
 
        err = nfp_ct_merge_check(post_ct_entry, pre_ct_entry);
@@ -1450,7 +1450,8 @@ int nfp_fl_ct_handle_pre_ct(struct nfp_flower_priv *priv,
        if (IS_ERR(ct_entry))
                return PTR_ERR(ct_entry);
        ct_entry->type = CT_TYPE_PRE_CT;
-       ct_entry->chain_index = ct_goto->chain_index;
+       ct_entry->chain_index = flow->common.chain_index;
+       ct_entry->goto_chain_index = ct_goto->chain_index;
        list_add(&ct_entry->list_node, &zt->pre_ct_list);
        zt->pre_ct_count++;
 
@@ -1473,6 +1474,7 @@ int nfp_fl_ct_handle_post_ct(struct nfp_flower_priv *priv,
        struct nfp_fl_ct_zone_entry *zt;
        bool wildcarded = false;
        struct flow_match_ct ct;
+       struct flow_action_entry *ct_goto;
 
        flow_rule_match_ct(rule, &ct);
        if (!ct.mask->ct_zone) {
@@ -1497,6 +1499,8 @@ int nfp_fl_ct_handle_post_ct(struct nfp_flower_priv *priv,
 
        ct_entry->type = CT_TYPE_POST_CT;
        ct_entry->chain_index = flow->common.chain_index;
+       ct_goto = get_flow_act(flow->rule, FLOW_ACTION_GOTO);
+       ct_entry->goto_chain_index = ct_goto ? ct_goto->chain_index : 0;
        list_add(&ct_entry->list_node, &zt->post_ct_list);
        zt->post_ct_count++;
 
index beb6cceff9d8e88cbd1246beacca61f7368d4b2c..47607cd8a716daf905df60e61423ebbe1fb2c31c 100644 (file)
@@ -108,6 +108,7 @@ enum nfp_nfp_layer_name {
  * @cookie:    Flow cookie, same as original TC flow, used as key
  * @list_node: Used by the list
  * @chain_index:       Chain index of the original flow
+ * @goto_chain_index:  goto chain index of the flow
  * @netdev:    netdev structure.
  * @type:      Type of pre-entry from enum ct_entry_type
  * @zt:                Reference to the zone table this belongs to
@@ -120,6 +121,7 @@ struct nfp_fl_ct_flow_entry {
        unsigned long cookie;
        struct list_head list_node;
        u32 chain_index;
+       u32 goto_chain_index;
        enum ct_entry_type type;
        struct net_device *netdev;
        struct nfp_fl_ct_zone_entry *zt;