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 <[email protected]>
> ---
> 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
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev