On 3/24/23 11:05, Nobuhiro MIKI wrote: > 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 <nm...@yahoo-corp.jp> > --- > lib/tnl-ports.c | 83 ++++++++++++++++++++++++++++++------------------- > 1 file changed, 51 insertions(+), 32 deletions(-) > > diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c > index 050eafa6b8c3..3948bc10e6b0 100644 > --- a/lib/tnl-ports.c > +++ b/lib/tnl-ports.c > @@ -161,40 +161,31 @@ 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]) > { > - if (!strcmp(type, "geneve")) { > - return IPPROTO_UDP; > + nw_protos[0] = nw_protos[1] = 0; > + > + if (!strcmp(type, "geneve") || !strcmp(type, "vxlan") || > + !strcmp(type, "gtpu")) { > + nw_protos[0] = IPPROTO_UDP; > + } else if (!strcmp(type, "stt")) { > + nw_protos[0] = IPPROTO_TCP; > + } else if (!strcmp(type, "gre") || !strcmp(type, "erspan") || > + !strcmp(type, "ip6erspan") || !strcmp(type, "ip6gre")) { > + nw_protos[0] = IPPROTO_GRE; > + } else if (!strcmp(type, "srv6")) { > + nw_protos[0] = IPPROTO_IPIP; > + nw_protos[1] = IPPROTO_IPV6;
This last srv6 part belongs to patch #4. > } > - if (!strcmp(type, "stt")) { > - return IPPROTO_TCP; > - } > - if (!strcmp(type, "gre") || !strcmp(type, "erspan") || > - !strcmp(type, "ip6erspan") || !strcmp(type, "ip6gre")) { > - return IPPROTO_GRE; > - } > - if (!strcmp(type, "vxlan")) { > - return IPPROTO_UDP; > - } > - if (!strcmp(type, "gtpu")) { > - return 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 +211,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 +263,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 +284,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 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev