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
