Blob Blame History Raw
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