From b829ad716daf393925c5404953e0a2212c4d350a Mon Sep 17 00:00:00 2001
From: Numan Siddique <numans@ovn.org>
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 <dceara@redhat.com>
Acked-by: Mark Michelson <mmichels@redhat.com>
Acked-by: Dumitru Ceara <dceara@redhat.com>
Signed-off-by: Numan Siddique <numans@ovn.org>
(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