nfp: flower: refactor function "is_post_ct_flow"
authorWentao Jia <wentao.jia@corigine.com>
Tue, 14 Mar 2023 06:36:07 +0000 (08:36 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 16 Mar 2023 05:16:22 +0000 (22:16 -0700)
'ct_clear' action only or no ct action is supported for 'post_ct_flow'.
But in scenario of multiple ct zones, one non 'ct_clear' ct action or
more ct actions, including 'ct_clear action', may be present in one flow
rule. If ct state match key is 'ct_established', the flow rule is still
expected to be classified as 'post_ct_flow'. Check ct status first in
function "is_post_ct_flow" to achieve this.

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 e0d6c87..6b90b92 100644 (file)
@@ -94,24 +94,23 @@ bool is_post_ct_flow(struct flow_cls_offload *flow)
        struct flow_match_ct ct;
        int i;
 
-       /* post ct entry cannot contains any ct action except ct_clear. */
-       flow_action_for_each(i, act, &flow->rule->action) {
-               if (act->id == FLOW_ACTION_CT) {
-                       /* ignore ct clear action. */
-                       if (act->ct.action == TCA_CT_ACT_CLEAR) {
-                               exist_ct_clear = true;
-                               continue;
-                       }
-
-                       return false;
-               }
-       }
-
        if (dissector->used_keys & BIT(FLOW_DISSECTOR_KEY_CT)) {
                flow_rule_match_ct(rule, &ct);
                if (ct.key->ct_state & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED)
                        return true;
        } else {
+               /* post ct entry cannot contains any ct action except ct_clear. */
+               flow_action_for_each(i, act, &flow->rule->action) {
+                       if (act->id == FLOW_ACTION_CT) {
+                               /* ignore ct clear action. */
+                               if (act->ct.action == TCA_CT_ACT_CLEAR) {
+                                       exist_ct_clear = true;
+                                       continue;
+                               }
+
+                               return false;
+                       }
+               }
                /* when do nat with ct, the post ct entry ignore the ct status,
                 * will match the nat field(sip/dip) instead. In this situation,
                 * the flow chain index is not zero and contains ct clear action.