From b829ad716daf393925c5404953e0a2212c4d350a Mon Sep 17 00:00:00 2001 From: Numan Siddique Date: Fri, 16 Oct 2020 15:45:30 +0530 Subject: [PATCH 5/5] ovn-trace: Handle IPv6 packets for tcp_reset action. tcp_reset action can be used for both IPv4 and IPv6 TCP packets, but ovn-trace was not handling IPv6. Reported-by: Dumitru Ceara Acked-by: Mark Michelson Acked-by: Dumitru Ceara Signed-off-by: Numan Siddique (cherry-picked from upstream master commit 29b3fd650b99c0928951c4d537176c4924243cc4) Change-Id: I27b9a79b2091cc8980854387d18421fd6f6fcb78 --- utilities/ovn-trace.c | 57 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/utilities/ovn-trace.c b/utilities/ovn-trace.c index ad33f8e36..5d54c0fd8 100644 --- a/utilities/ovn-trace.c +++ b/utilities/ovn-trace.c @@ -1700,11 +1700,11 @@ execute_icmp6(const struct ovnact_nest *on, } static void -execute_tcp_reset(const struct ovnact_nest *on, - const struct ovntrace_datapath *dp, - const struct flow *uflow, uint8_t table_id, - bool loopback, enum ovnact_pipeline pipeline, - struct ovs_list *super) +execute_tcp4_reset(const struct ovnact_nest *on, + const struct ovntrace_datapath *dp, + const struct flow *uflow, uint8_t table_id, + bool loopback, enum ovnact_pipeline pipeline, + struct ovs_list *super) { struct flow tcp_flow = *uflow; @@ -1733,6 +1733,53 @@ execute_tcp_reset(const struct ovnact_nest *on, table_id, pipeline, &node->subs); } +static void +execute_tcp6_reset(const struct ovnact_nest *on, + const struct ovntrace_datapath *dp, + const struct flow *uflow, uint8_t table_id, + bool lookback, enum ovnact_pipeline pipeline, + struct ovs_list *super) +{ + struct flow tcp_flow = *uflow; + + /* Update fields for TCP segment. */ + if (lookback) { + tcp_flow.dl_dst = uflow->dl_src; + tcp_flow.dl_src = uflow->dl_dst; + tcp_flow.ipv6_dst = uflow->ipv6_src; + tcp_flow.ipv6_src = uflow->ipv6_dst; + } else { + tcp_flow.dl_dst = uflow->dl_dst; + tcp_flow.dl_src = uflow->dl_src; + tcp_flow.ipv6_dst = uflow->ipv6_dst; + tcp_flow.ipv6_src = uflow->ipv6_src; + } + tcp_flow.nw_proto = IPPROTO_TCP; + tcp_flow.nw_ttl = 255; + tcp_flow.tp_src = uflow->tp_src; + tcp_flow.tp_dst = uflow->tp_dst; + tcp_flow.tcp_flags = htons(TCP_RST); + + struct ovntrace_node *node = ovntrace_node_append( + super, OVNTRACE_NODE_TRANSFORMATION, "tcp_reset"); + + trace_actions(on->nested, on->nested_len, dp, &tcp_flow, + table_id, pipeline, &node->subs); +} + +static void +execute_tcp_reset(const struct ovnact_nest *on, + const struct ovntrace_datapath *dp, + const struct flow *uflow, uint8_t table_id, + bool lookback, enum ovnact_pipeline pipeline, + struct ovs_list *super) +{ + if (get_dl_type(uflow) == htons(ETH_TYPE_IP)) { + execute_tcp4_reset(on, dp, uflow, table_id, lookback, pipeline, super); + } else { + execute_tcp6_reset(on, dp, uflow, table_id, lookback, pipeline, super); + } +} static void execute_reject(const struct ovnact_nest *on, const struct ovntrace_datapath *dp, -- 2.26.2