Populate CT fields during CT action with original fields. This
is needed for tracking actions that use those fields.

Signed-off-by: Ales Musil <[email protected]>
---
v3: Rebase on top of current main.
    Address comments from Dumitru:
    - Populate IPv6 fields too.
    - Add missing dot.
---
 utilities/ovn-trace.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/utilities/ovn-trace.c b/utilities/ovn-trace.c
index a435b0ff1..4411f654d 100644
--- a/utilities/ovn-trace.c
+++ b/utilities/ovn-trace.c
@@ -2445,6 +2445,26 @@ execute_dns_lookup(const struct ovnact_result *dl, 
struct flow *uflow,
                          "*** dns_lookup action not implemented");
 }
 
+/* Populate CT fields from the flow corresponding counterpart. */
+static void
+populate_ct_fields(struct flow *ct_flow, struct flow *original_flow)
+{
+    ct_flow->ct_nw_proto = original_flow->nw_proto;
+    /* L3 */
+    if (original_flow->dl_type == htons(ETH_TYPE_IP)) {
+        ct_flow->ct_nw_src = original_flow->nw_src;
+        ct_flow->ct_nw_dst = original_flow->nw_dst;
+    } else if (original_flow->dl_type == htons(ETH_TYPE_IPV6)) {
+        memcpy(&ct_flow->ct_ipv6_src, &original_flow->ipv6_src,
+               sizeof ct_flow->ct_ipv6_src);
+        memcpy(&ct_flow->ct_ipv6_dst, &original_flow->ipv6_dst,
+               sizeof ct_flow->ct_ipv6_dst);
+    }
+    /* L4 */
+    ct_flow->ct_tp_src = original_flow->tp_src;
+    ct_flow->ct_tp_dst = original_flow->tp_dst;
+}
+
 static void
 execute_ct_next(const struct ovnact_ct_next *ct_next,
                 const struct ovntrace_datapath *dp, struct flow *uflow,
@@ -2466,6 +2486,8 @@ execute_ct_next(const struct ovnact_ct_next *ct_next,
     /* Trace the actions in the next table. */
     struct flow ct_flow = *uflow;
     ct_flow.ct_state = state;
+    populate_ct_fields(&ct_flow, uflow);
+
     trace__(dp, &ct_flow, ct_next->ltable, pipeline, &node->subs);
 
     /* Upon return, we will trace the actions following the ct action in the
@@ -2530,6 +2552,8 @@ execute_ct_nat(const struct ovnact_ct_nat *ct_nat,
         super, OVNTRACE_NODE_TRANSFORMATION, "%s", ds_cstr(&s));
     ds_destroy(&s);
 
+    populate_ct_fields(&ct_flow, uflow);
+
     /* Trace the actions in the next table. */
     trace__(dp, &ct_flow, ct_nat->ltable, pipeline, &node->subs);
 
@@ -2554,6 +2578,8 @@ ct_commit_to_zone__(const struct ovnact_ct_commit_to_zone 
*ct_nat,
     struct ovntrace_node *node = ovntrace_node_append(
         super, OVNTRACE_NODE_TRANSFORMATION, "%s", ds_cstr(action));
 
+    populate_ct_fields(&ct_flow, uflow);
+
     /* Trace the actions in the next table. */
     trace__(dp, &ct_flow, ct_nat->ltable, pipeline, &node->subs);
 
@@ -2657,6 +2683,9 @@ execute_ct_lb(const struct ovnact_ct_lb *ct_lb,
         ct_lb->ovnact.type == OVNACT_CT_LB_MARK ? "ct_lb_mark" : "ct_lb",
         ds_cstr_ro(&comment));
     ds_destroy(&comment);
+
+    populate_ct_fields(&ct_lb_flow, uflow);
+
     trace__(dp, &ct_lb_flow, ct_lb->ltable, pipeline, &node->subs);
 }
 
@@ -3771,7 +3800,7 @@ trace(const char *dp_s, const char *flow_s)
 
     return ds_steal_cstr(&output);
 }
-
+
 static void
 ovntrace_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
               const char *argv[] OVS_UNUSED, void *exiting_)
-- 
2.49.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to