nfp: flower: refactor function "is_pre_ct_flow"
authorWentao Jia <wentao.jia@corigine.com>
Tue, 14 Mar 2023 06:36:06 +0000 (08:36 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 16 Mar 2023 05:16:22 +0000 (22:16 -0700)
In the scenario of multiple ct zones, ct state key match and ct action
is present in one flow rule, the flow rule is classified to post_ct_flow
in design.

There is no ct state key match for pre ct flow, the judging condition
is added to function "is_pre_ct_flow".

Chain_index is another field for judging which flows are pre ct flow
If chain_index not 0, the flow is not pre ct flow.

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>
drivers/net/ethernet/netronome/nfp/flower/conntrack.c

index a54d374..e0d6c87 100644 (file)
@@ -55,9 +55,21 @@ static void *get_hashentry(struct rhashtable *ht, void *key,
 
 bool is_pre_ct_flow(struct flow_cls_offload *flow)
 {
+       struct flow_rule *rule = flow_cls_offload_flow_rule(flow);
+       struct flow_dissector *dissector = rule->match.dissector;
        struct flow_action_entry *act;
+       struct flow_match_ct ct;
        int i;
 
+       if (dissector->used_keys & BIT(FLOW_DISSECTOR_KEY_CT)) {
+               flow_rule_match_ct(rule, &ct);
+               if (ct.key->ct_state)
+                       return false;
+       }
+
+       if (flow->common.chain_index)
+               return false;
+
        flow_action_for_each(i, act, &flow->rule->action) {
                if (act->id == FLOW_ACTION_CT) {
                        /* The pre_ct rule only have the ct or ct nat action, cannot