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

Reply via email to