diff mbox series

[ovs-dev,v8,2/5] tnl-ports: Support multiple nw_protos.

Message ID 20230314065330.19056-3-nmiki@yahoo-corp.jp
State Superseded
Headers show
Series userspace: Add SRv6 tunnel support. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation fail test: fail

Commit Message

Nobuhiro MIKI March 14, 2023, 6:53 a.m. UTC
In some tunnels, inner packet needs to support both IPv4
and IPv6. Therefore, this patch improves to allow two
protocols to be tied together in one tunneling.

Signed-off-by: Nobuhiro MIKI <nmiki@yahoo-corp.jp>
---
 lib/tnl-ports.c | 67 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 45 insertions(+), 22 deletions(-)
diff mbox series

Patch

diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c
index 050eafa6b8c3..da9939afa8a1 100644
--- a/lib/tnl-ports.c
+++ b/lib/tnl-ports.c
@@ -161,40 +161,35 @@  map_insert_ipdev__(struct ip_device *ip_dev, char dev_name[],
     }
 }
 
-static uint8_t
-tnl_type_to_nw_proto(const char type[])
+static void
+tnl_type_to_nw_proto(const char type[], uint8_t nw_protos[2])
 {
+    nw_protos[0] = nw_protos[1] = 0;
+
     if (!strcmp(type, "geneve")) {
-        return IPPROTO_UDP;
+        nw_protos[0] = IPPROTO_UDP;
     }
     if (!strcmp(type, "stt")) {
-        return IPPROTO_TCP;
+        nw_protos[0] = IPPROTO_TCP;
     }
     if (!strcmp(type, "gre") || !strcmp(type, "erspan") ||
         !strcmp(type, "ip6erspan") || !strcmp(type, "ip6gre")) {
-        return IPPROTO_GRE;
+        nw_protos[0] = IPPROTO_GRE;
     }
     if (!strcmp(type, "vxlan")) {
-        return IPPROTO_UDP;
+        nw_protos[0] = IPPROTO_UDP;
     }
     if (!strcmp(type, "gtpu")) {
-        return IPPROTO_UDP;
+        nw_protos[0] = IPPROTO_UDP;
     }
-    return 0;
 }
 
-void
-tnl_port_map_insert(odp_port_t port, ovs_be16 tp_port,
-                    const char dev_name[], const char type[])
+static void
+tnl_port_map_insert__(odp_port_t port, ovs_be16 tp_port,
+                      const char dev_name[], uint8_t nw_proto)
 {
     struct tnl_port *p;
     struct ip_device *ip_dev;
-    uint8_t nw_proto;
-
-    nw_proto = tnl_type_to_nw_proto(type);
-    if (!nw_proto) {
-        return;
-    }
 
     ovs_mutex_lock(&mutex);
     LIST_FOR_EACH(p, node, &port_list) {
@@ -220,6 +215,22 @@  out:
     ovs_mutex_unlock(&mutex);
 }
 
+void
+tnl_port_map_insert(odp_port_t port, ovs_be16 tp_port,
+                    const char dev_name[], const char type[])
+{
+    uint8_t nw_protos[2];
+    int i;
+
+    tnl_type_to_nw_proto(type, nw_protos);
+
+    for (i = 0; i < 2; i++) {
+        if (nw_protos[i]) {
+            tnl_port_map_insert__(port, tp_port, dev_name, nw_protos[i]);
+        }
+    }
+}
+
 static void
 tnl_port_unref(const struct cls_rule *cr)
 {
@@ -256,14 +267,11 @@  ipdev_map_delete(struct ip_device *ip_dev, ovs_be16 tp_port, uint8_t nw_proto)
     }
 }
 
-void
-tnl_port_map_delete(odp_port_t port, const char type[])
+static void
+tnl_port_map_delete__(odp_port_t port, uint8_t nw_proto)
 {
     struct tnl_port *p;
     struct ip_device *ip_dev;
-    uint8_t nw_proto;
-
-    nw_proto = tnl_type_to_nw_proto(type);
 
     ovs_mutex_lock(&mutex);
     LIST_FOR_EACH_SAFE (p, node, &port_list) {
@@ -280,6 +288,21 @@  tnl_port_map_delete(odp_port_t port, const char type[])
     ovs_mutex_unlock(&mutex);
 }
 
+void
+tnl_port_map_delete(odp_port_t port, const char type[])
+{
+    uint8_t nw_protos[2];
+    int i;
+
+    tnl_type_to_nw_proto(type, nw_protos);
+
+    for (i = 0; i < 2; i++) {
+        if (nw_protos[i]) {
+            tnl_port_map_delete__(port, nw_protos[i]);
+        }
+    }
+}
+
 /* 'flow' is non-const to allow for temporary modifications during the lookup.
  * Any changes are restored before returning. */
 odp_port_t