[ovs-dev] [PATCH v4] Bareudp Tunnel Support

Gregory Rose gvrose8192 at gmail.com
Tue Jun 2 15:57:19 UTC 2020


On 6/1/2020 7:37 PM, Martin Varghese wrote:
> Hi Greg,
> 
> I apologise for the confusion.
> All the bareudp patches got integrated into the net-next tree during
> 5.6 -rcX time frame.
> 
> I was not careful enough while announcing the linux kernel version
> bareudp is supported.
> 
> I checked the linux 5.7  kconfig and i could see bareudp support present there.
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/Kconfig?h=v5.7
> 
> config BAREUDP
>         tristate "Bare UDP Encapsulation"
>         depends on INET
>         depends on IPV6 || !IPV6
>         select NET_UDP_TUNNEL
>         select GRO_CELLS
>         help
>            This adds a bare UDP tunnel module for tunnelling different
>            kinds of traffic like MPLS, IP, etc. inside a UDP tunnel.
> 
>            To compile this driver as a module, choose M here: the module
>            will be called bareudp.
> 
> I could not find the default .config of 5.7 to see if the bareudp
> support is enabled by default.
> 
> I apologise again for wasting your time
> 
> Thanks
> Martin

Hi Martin,

First, let's not drop the list.  I've added it back to my response.

Then, don't worry about it.  These sorts of things are why we do
reviews.  You should see some of the screw ups I've done! Actually,
if you've kept up with this list you would have seen some of them.

;^)

So you're right, BAREUDP config is not present in 5.6 but I did
find it in the stable tree on branch linux-5.7.y.  I'll enable the
config, get a kernel built and retry.

Thanks,

- Greg



> 
> On 6/2/20, Gregory Rose <gvrose8192 at gmail.com> wrote:
>> On 5/25/2020 8:31 PM, Martin Varghese wrote:
>>> From: Martin Varghese <martin.varghese at nokia.com>
>>>
>>> There are various L3 encapsulation standards using UDP being discussed to
>>> leverage the UDP based load balancing capability of different networks.
>>> MPLSoUDP (__ https://tools.ietf.org/html/rfc7510) is one among them.
>>>
>>> The Bareudp tunnel provides a generic L3 encapsulation tunnelling support
>>> for tunnelling different L3 protocols like MPLS, IP, NSH etc. inside a
>>> UDP
>>> tunnel.
>>>
>>> An example to create bareudp device to tunnel MPLS traffic is
>>> given
>>>
>>> $ ovs-vsctl add-port br_mpls udp_port -- set interface udp_port \
>>>                type=bareudp options:remote_ip=2.1.1.3
>>>                options:local_ip=2.1.1.2 \
>>>                options:payload_type=0x8847 options:dst_port=6635 \
>>>                options:packet_type="legacy_l3" \
>>>                ofport_request=$bareudp_egress_port
>>>
>>> The bareudp device supports special handling for MPLS & IP as
>>> they can have multiple ethertypes. MPLS procotcol can have ethertypes
>>> ETH_P_MPLS_UC (unicast) & ETH_P_MPLS_MC (multicast). IP protocol can have
>>> ethertypes ETH_P_IP (v4) & ETH_P_IPV6 (v6).
>>>
>>> The bareudp device to tunnel L3 traffic with multiple ethertypes
>>> (MPLS & IP) can be created by passing the L3 protocol name as string in
>>> the field payload_type. An example to create bareudp device to tunnel
>>> MPLS unicast & multicast traffic is given below.::
>>>
>>> $ ovs-vsctl add-port  br_mpls udp_port -- set interface
>>>               udp_port \
>>>               type=bareudp options:remote_ip=2.1.1.3
>>>               options:local_ip=2.1.1.2 \
>>>               options:payload_type=mpls options:dst_port=6635 \
>>>               options:packet_type="legacy_l3"
>>>
>>> Signed-off-by: Martin Varghese <martin.varghese at nokia.com>
>>
>> Hi Martin,
>>
>> I've built OVS with your patch and it applies cleanly, builds without
>> errors and seems OK so far as that goes.
>>
>> However, when running the system traffic test I get an error:
>> 134: layer3 - ping over MPLS Bareudp                 FAILED
>> (system-layer3-tunnels.at:163)
>>
>> If I look at the ovs-vswitchd.log I see the following errors:
>>
>> 2020-06-01T21:16:35.669Z|00035|dpif|WARN|system at ovs-system: failed to
>> add at_bareudp0 as port: Address family not supported by protocol
>> 2020-06-01T21:16:35.669Z|00036|bridge|WARN|could not add network device
>> at_bareudp0 to ofproto (Address family not supported by protocol)
>> 2020-06-01T21:16:35.691Z|00037|dpif|WARN|system at ovs-system: failed to
>> add at_bareudp0 as port: Address family not supported by protocol
>> 2020-06-01T21:16:35.691Z|00038|bridge|WARN|could not add network device
>> at_bareudp0 to ofproto (Address family not supported by protocol)
>> 2020-06-01T21:16:35.693Z|00039|ofproto|WARN|br1: cannot get STP status
>> on nonexistent port 1
>> 2020-06-01T21:16:35.693Z|00040|ofproto|WARN|br1: cannot get RSTP status
>> on nonexistent port 1
>> 2020-06-01T21:16:35.697Z|00041|bridge|INFO|bridge br1: deleted interface
>> ovs-p1 on port 1
>> 2020-06-01T21:16:35.701Z|00042|dpif|WARN|system at ovs-system: failed to
>> add at_bareudp0 as port: Address family not supported by protocol
>> 2020-06-01T21:16:35.701Z|00043|bridge|WARN|could not add network device
>> at_bareudp0 to ofproto (Address family not supported by protocol)
>> 2020-06-01T21:16:35.704Z|00044|bridge|WARN|could not open network device
>> ovs-p1 (No such device)
>> 2020-06-01T21:16:35.722Z|00045|bridge|WARN|could not add network device
>> at_bareudp0 to ofproto (Address family not supported by protocol)
>> 2020-06-01T21:16:35.726Z|00046|bridge|WARN|could not open network device
>> ovs-p1 (No such device)
>> 2020-06-01T21:16:35.727Z|00047|ofproto|WARN|br0: cannot get STP status
>> on nonexistent port 1
>> 2020-06-01T21:16:35.728Z|00048|ofproto|WARN|br0: cannot get RSTP status
>> on nonexistent port 1
>> 2020-06-01T21:16:35.730Z|00049|bridge|INFO|bridge br0: deleted interface
>> ovs-p0 on port 1
>> 2020-06-01T21:16:35.735Z|00050|bridge|WARN|could not add network device
>> at_bareudp0 to ofproto (Address family not supported by protocol)
>>
>> What I wonder is if I'm missing some CONFIG option in the kernel I've
>> built.  It's a 5.6.15 kernel.  Address family not supported errors are
>> often the result of not configuring a necessary piece of the kernel.
>>
>> gvrose at ubuntu-1804:~/prj/ovs-experimental/_build$ uname -r
>> 5.6.15
>>
>> I'm using the latest iproute2 package:
>> gvrose at ubuntu-1804:~/prj/ovs-experimental/_build$ ip -V
>> ip utility, iproute2-ss200330
>>
>> I've attached the config file I'm using, do you notice a CONFIG missing
>> that I should be using?
>>
>> Thanks,
>>
>> - Greg
>>
>>
>>> ---
>>>    Documentation/automake.mk                         |  1 +
>>>    Documentation/faq/bareudp.rst                     | 62
>>> +++++++++++++++++++++++
>>>    Documentation/faq/index.rst                       |  1 +
>>>    Documentation/faq/releases.rst                    |  1 +
>>>    NEWS                                              |  3 ++
>>>    datapath/linux/compat/include/linux/openvswitch.h | 10 ++++
>>>    lib/dpif-netlink-rtnl.c                           | 53
>>> +++++++++++++++++++
>>>    lib/dpif-netlink.c                                |  7 ++-
>>>    lib/netdev-vport.c                                | 24 ++++++++-
>>>    lib/netdev.h                                      |  1 +
>>>    ofproto/ofproto-dpif-xlate.c                      |  1 +
>>>    tests/system-layer3-tunnels.at                    | 47
>>> +++++++++++++++++
>>>    12 files changed, 209 insertions(+), 2 deletions(-)
>>>    create mode 100644 Documentation/faq/bareudp.rst
>>>
>>> diff --git a/Documentation/automake.mk b/Documentation/automake.mk
>>> index f85c432..ea3475f 100644
>>> --- a/Documentation/automake.mk
>>> +++ b/Documentation/automake.mk
>>> @@ -88,6 +88,7 @@ DOC_SOURCE = \
>>>    	Documentation/faq/terminology.rst \
>>>    	Documentation/faq/vlan.rst \
>>>    	Documentation/faq/vxlan.rst \
>>> +	Documentation/faq/bareudp.rst \
>>>    	Documentation/internals/index.rst \
>>>    	Documentation/internals/authors.rst \
>>>    	Documentation/internals/bugs.rst \
>>> diff --git a/Documentation/faq/bareudp.rst
>>> b/Documentation/faq/bareudp.rst
>>> new file mode 100644
>>> index 0000000..257f20e
>>> --- /dev/null
>>> +++ b/Documentation/faq/bareudp.rst
>>> @@ -0,0 +1,62 @@
>>> +..
>>> +      Licensed under the Apache License, Version 2.0 (the "License"); you
>>> may
>>> +      not use this file except in compliance with the License. You may
>>> obtain
>>> +      a copy of the License at
>>> +
>>> +          http://www.apache.org/licenses/LICENSE-2.0
>>> +
>>> +      Unless required by applicable law or agreed to in writing,
>>> software
>>> +      distributed under the License is distributed on an "AS IS" BASIS,
>>> WITHOUT
>>> +      WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>>> See the
>>> +      License for the specific language governing permissions and
>>> limitations
>>> +      under the License.
>>> +
>>> +      Convention for heading levels in Open vSwitch documentation:
>>> +
>>> +      =======  Heading 0 (reserved for the title in a document)
>>> +      -------  Heading 1
>>> +      ~~~~~~~  Heading 2
>>> +      +++++++  Heading 3
>>> +      '''''''  Heading 4
>>> +
>>> +      Avoid deeper levels because they do not render well.
>>> +
>>> +=======
>>> +Bareudp
>>> +=======
>>> +
>>> +Q: What is Bareudp?
>>> +
>>> +    A: There are various L3 encapsulation standards using UDP being
>>> discussed
>>> +       to leverage the UDP based load balancing capability of different
>>> +       networks. MPLSoUDP (__ https://tools.ietf.org/html/rfc7510) is one
>>> among
>>> +       them.
>>> +
>>> +       The Bareudp tunnel provides a generic L3 encapsulation tunnelling
>>> +       support for tunnelling different L3 protocols like MPLS, IP, NSH
>>> etc.
>>> +       inside a UDP tunnel.
>>> +
>>> +       An example to create bareudp device to tunnel MPLS traffic is
>>> given
>>> +       below.::
>>> +
>>> +           $ ovs-vsctl add-port br_mpls udp_port -- set interface
>>> udp_port \
>>> +             type=bareudp options:remote_ip=2.1.1.3
>>> options:local_ip=2.1.1.2 \
>>> +             options:payload_type=0x8847 options:dst_port=6635 \
>>> +             options:packet_type="legacy_l3" \
>>> +             ofport_request=$bareudp_egress_port
>>> +
>>> +       The bareudp device supports special handling for MPLS & IP as they
>>> can
>>> +       have multiple ethertypes.
>>> +       MPLS procotcol can have ethertypes ETH_P_MPLS_UC (unicast) &
>>> +       ETH_P_MPLS_MC (multicast). IP protocol can have ethertypes
>>> ETH_P_IP (v4)
>>> +       & ETH_P_IPV6 (v6).
>>> +
>>> +       The bareudp device to tunnel L3 traffic with multiple ethertypes
>>> +       (MPLS & IP) can be created by passing the L3 protocol name as
>>> string in
>>> +       the field payload_type. An example to create bareudp device to
>>> tunnel
>>> +       MPLS unicast & multicast traffic is given below.::
>>> +
>>> +            $ ovs-vsctl add-port  br_mpls udp_port -- set interface
>>> udp_port \
>>> +              type=bareudp options:remote_ip=2.1.1.3
>>> options:local_ip=2.1.1.2 \
>>> +              options:payload_type=mpls options:dst_port=6635 \
>>> +              options:packet_type="legacy_l3"
>>> diff --git a/Documentation/faq/index.rst b/Documentation/faq/index.rst
>>> index 334b828..1dd2998 100644
>>> --- a/Documentation/faq/index.rst
>>> +++ b/Documentation/faq/index.rst
>>> @@ -30,6 +30,7 @@ Open vSwitch FAQ
>>>    .. toctree::
>>>       :maxdepth: 2
>>>
>>> +   bareudp
>>>       configuration
>>>       contributing
>>>       design
>>> diff --git a/Documentation/faq/releases.rst
>>> b/Documentation/faq/releases.rst
>>> index e5cef39..93cb10a 100644
>>> --- a/Documentation/faq/releases.rst
>>> +++ b/Documentation/faq/releases.rst
>>> @@ -136,6 +136,7 @@ Q: Are all features available with all datapaths?
>>>        Tunnel - ERSPAN                 4.18           2.10         2.10
>>> NO
>>>        Tunnel - ERSPAN-IPv6            4.18           2.10         2.10
>>> NO
>>>        Tunnel - GTP-U                  NO             NO           2.14
>>> NO
>>> +    Tunnel - Bareudp                5.6            NO           2.14
>>> NO
>>>        QoS - Policing                  YES            1.1          2.6
>>> NO
>>>        QoS - Shaping                   YES            1.1          NO
>>> NO
>>>        sFlow                           YES            1.0          1.0
>>> NO
>>> diff --git a/NEWS b/NEWS
>>> index 3dbd8ec..e75b537 100644
>>> --- a/NEWS
>>> +++ b/NEWS
>>> @@ -16,6 +16,9 @@ Post-v2.13.0
>>>           by enabling interrupt mode.
>>>       - Userspace datapath:
>>>         * Add support for conntrack zone-based timeout policy.
>>> +   - Bareudp Tunnel
>>> +     * Userspace datapath support is not added.
>>> +     * Kernel datapath support not backported to ovs tree.
>>>
>>>
>>>    v2.13.0 - 14 Feb 2020
>>> diff --git a/datapath/linux/compat/include/linux/openvswitch.h
>>> b/datapath/linux/compat/include/linux/openvswitch.h
>>> index f7c3b2e..09f313a 100644
>>> --- a/datapath/linux/compat/include/linux/openvswitch.h
>>> +++ b/datapath/linux/compat/include/linux/openvswitch.h
>>> @@ -240,6 +240,7 @@ enum ovs_vport_type {
>>>    	OVS_VPORT_TYPE_GRE,      /* GRE tunnel. */
>>>    	OVS_VPORT_TYPE_VXLAN,	 /* VXLAN tunnel. */
>>>    	OVS_VPORT_TYPE_GENEVE,	 /* Geneve tunnel. */
>>> +	OVS_VPORT_TYPE_BAREUDP,  /* Bareudp tunnel. */
>>>    	OVS_VPORT_TYPE_LISP = 105,  /* LISP tunnel */
>>>    	OVS_VPORT_TYPE_STT = 106, /* STT tunnel */
>>>    	OVS_VPORT_TYPE_ERSPAN = 107, /* ERSPAN tunnel. */
>>> @@ -308,6 +309,15 @@ enum {
>>>
>>>    #define OVS_VXLAN_EXT_MAX (__OVS_VXLAN_EXT_MAX - 1)
>>>
>>> +enum {
>>> +        OVS_BAREUDP_EXT_UNSPEC,
>>> +        OVS_BAREUDP_EXT_MULTIPROTO_MODE,
>>> +        /* place new values here to fill gap. */
>>> +        __OVS_BAREUDP_EXT_MAX,
>>> +};
>>> +
>>> +#define OVS_BAREUDP_EXT_MAX (__OVS_BAREUDP_EXT_MAX - 1)
>>> +
>>>    /* OVS_VPORT_ATTR_OPTIONS attributes for tunnels.
>>>     */
>>>    enum {
>>> diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
>>> index fd157ce..b93b1fc 100644
>>> --- a/lib/dpif-netlink-rtnl.c
>>> +++ b/lib/dpif-netlink-rtnl.c
>>> @@ -58,6 +58,18 @@ VLOG_DEFINE_THIS_MODULE(dpif_netlink_rtnl);
>>>    #define IFLA_GENEVE_UDP_ZERO_CSUM6_RX 10
>>>    #endif
>>>
>>> +#ifndef __IFLA_BAREUDP_MAX
>>> +#define IFLA_BAREUDP_MAX 0
>>> +#endif
>>> +#if IFLA_BAREUDP_MAX < 4
>>> +#define IFLA_BAREUDP_PORT 1
>>> +#define IFLA_BAREUDP_ETHERTYPE 2
>>> +#define IFLA_BAREUDP_SRCPORT_MIN 3
>>> +#define IFLA_BAREUDP_MULTIPROTO_MODE 4
>>> +#endif
>>> +
>>> +#define BAREUDP_MPLS_SRCPORT_MIN 49153
>>> +
>>>    static const struct nl_policy rtlink_policy[] = {
>>>        [IFLA_LINKINFO] = { .type = NL_A_NESTED },
>>>    };
>>> @@ -81,6 +93,10 @@ static const struct nl_policy geneve_policy[] = {
>>>        [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NL_A_U8 },
>>>        [IFLA_GENEVE_PORT] = { .type = NL_A_U16 },
>>>    };
>>> +static const struct nl_policy bareudp_policy[] = {
>>> +    [IFLA_BAREUDP_PORT] = { .type = NL_A_U16 },
>>> +    [IFLA_BAREUDP_ETHERTYPE] = { .type = NL_A_U16 },
>>> +};
>>>
>>>    static const char *
>>>    vport_type_to_kind(enum ovs_vport_type type,
>>> @@ -113,6 +129,8 @@ vport_type_to_kind(enum ovs_vport_type type,
>>>            }
>>>        case OVS_VPORT_TYPE_GTPU:
>>>            return NULL;
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>> +        return "bareudp";
>>>        case OVS_VPORT_TYPE_NETDEV:
>>>        case OVS_VPORT_TYPE_INTERNAL:
>>>        case OVS_VPORT_TYPE_LISP:
>>> @@ -243,6 +261,24 @@ dpif_netlink_rtnl_geneve_verify(const struct
>>> netdev_tunnel_config *tnl_cfg,
>>>
>>>        return err;
>>>    }
>>> +static int
>>> +dpif_netlink_rtnl_bareudp_verify(const struct netdev_tunnel_config
>>> *tnl_cfg,
>>> +                                const char *kind, struct ofpbuf *reply)
>>> +{
>>> +    struct nlattr *bareudp[ARRAY_SIZE(bareudp_policy)];
>>> +    int err;
>>> +
>>> +    err = rtnl_policy_parse(kind, reply, bareudp_policy, bareudp,
>>> +                            ARRAY_SIZE(bareudp_policy));
>>> +    if (!err) {
>>> +        if ((tnl_cfg->dst_port !=
>>> nl_attr_get_be16(bareudp[IFLA_BAREUDP_PORT]))
>>> +            || (tnl_cfg->payload_ethertype
>>> +                != nl_attr_get_be16(bareudp[IFLA_BAREUDP_ETHERTYPE]))) {
>>> +            err = EINVAL;
>>> +        }
>>> +    }
>>> +    return err;
>>> +}
>>>
>>>    static int
>>>    dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg,
>>> @@ -275,6 +311,9 @@ dpif_netlink_rtnl_verify(const struct
>>> netdev_tunnel_config *tnl_cfg,
>>>        case OVS_VPORT_TYPE_GENEVE:
>>>            err = dpif_netlink_rtnl_geneve_verify(tnl_cfg, kind, reply);
>>>            break;
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>> +        err = dpif_netlink_rtnl_bareudp_verify(tnl_cfg, kind, reply);
>>> +        break;
>>>        case OVS_VPORT_TYPE_NETDEV:
>>>        case OVS_VPORT_TYPE_INTERNAL:
>>>        case OVS_VPORT_TYPE_LISP:
>>> @@ -362,6 +401,19 @@ dpif_netlink_rtnl_create(const struct
>>> netdev_tunnel_config *tnl_cfg,
>>>        case OVS_VPORT_TYPE_LISP:
>>>        case OVS_VPORT_TYPE_STT:
>>>        case OVS_VPORT_TYPE_GTPU:
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>> +        nl_msg_put_be16(&request, IFLA_BAREUDP_ETHERTYPE,
>>> +                        tnl_cfg->payload_ethertype);
>>> +        if ((tnl_cfg->payload_ethertype == htons(ETH_TYPE_MPLS)) ||
>>> +            (tnl_cfg->payload_ethertype ==  htons(ETH_TYPE_MPLS_MCAST)))
>>> {
>>> +            nl_msg_put_u16(&request, IFLA_BAREUDP_SRCPORT_MIN,
>>> +                            BAREUDP_MPLS_SRCPORT_MIN);
>>> +        }
>>> +        nl_msg_put_be16(&request, IFLA_BAREUDP_PORT, tnl_cfg->dst_port);
>>> +        if (tnl_cfg->exts & (1 << OVS_BAREUDP_EXT_MULTIPROTO_MODE)) {
>>> +            nl_msg_put_flag(&request, IFLA_BAREUDP_MULTIPROTO_MODE);
>>> +        }
>>> +        break;
>>>        case OVS_VPORT_TYPE_UNSPEC:
>>>        case __OVS_VPORT_TYPE_MAX:
>>>        default:
>>> @@ -470,6 +522,7 @@ dpif_netlink_rtnl_port_destroy(const char *name, const
>>> char *type)
>>>        case OVS_VPORT_TYPE_ERSPAN:
>>>        case OVS_VPORT_TYPE_IP6ERSPAN:
>>>        case OVS_VPORT_TYPE_IP6GRE:
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>>            return dpif_netlink_rtnl_destroy(name);
>>>        case OVS_VPORT_TYPE_NETDEV:
>>>        case OVS_VPORT_TYPE_INTERNAL:
>>> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
>>> index dc64210..ce7e5e6 100644
>>> --- a/lib/dpif-netlink.c
>>> +++ b/lib/dpif-netlink.c
>>> @@ -740,7 +740,7 @@ get_vport_type(const struct dpif_netlink_vport
>>> *vport)
>>>            return "erspan";
>>>
>>>        case OVS_VPORT_TYPE_IP6ERSPAN:
>>> -        return "ip6erspan";
>>> +        return "ip6erspan";
>>>
>>>        case OVS_VPORT_TYPE_IP6GRE:
>>>            return "ip6gre";
>>> @@ -748,6 +748,9 @@ get_vport_type(const struct dpif_netlink_vport
>>> *vport)
>>>        case OVS_VPORT_TYPE_GTPU:
>>>            return "gtpu";
>>>
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>> +        return "bareudp";
>>> +
>>>        case OVS_VPORT_TYPE_UNSPEC:
>>>        case __OVS_VPORT_TYPE_MAX:
>>>            break;
>>> @@ -783,6 +786,8 @@ netdev_to_ovs_vport_type(const char *type)
>>>            return OVS_VPORT_TYPE_GRE;
>>>        } else if (!strcmp(type, "gtpu")) {
>>>            return OVS_VPORT_TYPE_GTPU;
>>> +    } else if (!strcmp(type, "bareudp")) {
>>> +        return OVS_VPORT_TYPE_BAREUDP;
>>>        } else {
>>>            return OVS_VPORT_TYPE_UNSPEC;
>>>        }
>>> diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
>>> index 0252b61..3aca319 100644
>>> --- a/lib/netdev-vport.c
>>> +++ b/lib/netdev-vport.c
>>> @@ -112,7 +112,7 @@ netdev_vport_needs_dst_port(const struct netdev *dev)
>>>        return (class->get_config == get_tunnel_config &&
>>>                (!strcmp("geneve", type) || !strcmp("vxlan", type) ||
>>>                 !strcmp("lisp", type) || !strcmp("stt", type) ||
>>> -             !strcmp("gtpu", type)));
>>> +             !strcmp("gtpu", type) || !strcmp("bareudp",type)));
>>>    }
>>>
>>>    const char *
>>> @@ -219,6 +219,8 @@ netdev_vport_construct(struct netdev *netdev_)
>>>            dev->tnl_cfg.dst_port = port ? htons(port) :
>>> htons(STT_DST_PORT);
>>>        } else if (!strcmp(type, "gtpu")) {
>>>            dev->tnl_cfg.dst_port = port ? htons(port) :
>>> htons(GTPU_DST_PORT);
>>> +    } else if (!strcmp(type, "bareudp")) {
>>> +        dev->tnl_cfg.dst_port = htons(port);
>>>        }
>>>
>>>        dev->tnl_cfg.dont_fragment = true;
>>> @@ -438,6 +440,8 @@ tunnel_supported_layers(const char *type,
>>>            return TNL_L2 | TNL_L3;
>>>        } else if (!strcmp(type, "gtpu")) {
>>>            return TNL_L3;
>>> +    } else if (!strcmp(type, "bareudp")) {
>>> +        return TNL_L3;
>>>        } else {
>>>            return TNL_L2;
>>>        }
>>> @@ -745,6 +749,16 @@ set_tunnel_config(struct netdev *dev_, const struct
>>> smap *args, char **errp)
>>>                        goto out;
>>>                    }
>>>                }
>>> +        } else if (!strcmp(node->key, "payload_type")) {
>>> +            if (strcmp(node->key, "mpls")) {
>>> +                 tnl_cfg.payload_ethertype = htons(ETH_TYPE_MPLS);
>>> +                 tnl_cfg.exts |= (1 << OVS_BAREUDP_EXT_MULTIPROTO_MODE);
>>> +            } else if ((strcmp(node->key, "ip"))) {
>>> +                 tnl_cfg.payload_ethertype = htons(ETH_TYPE_IP);
>>> +                 tnl_cfg.exts |= (1 << OVS_BAREUDP_EXT_MULTIPROTO_MODE);
>>> +            } else {
>>> +                 tnl_cfg.payload_ethertype = htons(atoi(node->value));
>>> +            }
>>>            } else {
>>>                ds_put_format(&errors, "%s: unknown %s argument '%s'\n",
>>> name,
>>>                              type, node->key);
>>> @@ -1243,6 +1257,14 @@ netdev_vport_tunnel_register(void)
>>>              },
>>>              {{NULL, NULL, 0, 0}}
>>>            },
>>> +        { "udp_sys",
>>> +          {
>>> +              TUNNEL_FUNCTIONS_COMMON,
>>> +              .type = "bareudp",
>>> +              .get_ifindex = NETDEV_VPORT_GET_IFINDEX,
>>> +          },
>>> +          {{NULL, NULL, 0, 0}}
>>> +        },
>>>
>>>        };
>>>        static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
>>> diff --git a/lib/netdev.h b/lib/netdev.h
>>> index fdbe0e1..f15bca5 100644
>>> --- a/lib/netdev.h
>>> +++ b/lib/netdev.h
>>> @@ -107,6 +107,7 @@ struct netdev_tunnel_config {
>>>        bool out_key_flow;
>>>        ovs_be64 out_key;
>>>
>>> +    ovs_be16 payload_ethertype;
>>>        ovs_be16 dst_port;
>>>
>>>        bool ip_src_flow;
>>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>>> index 80fba84..ea88342 100644
>>> --- a/ofproto/ofproto-dpif-xlate.c
>>> +++ b/ofproto/ofproto-dpif-xlate.c
>>> @@ -3573,6 +3573,7 @@ propagate_tunnel_data_to_flow(struct xlate_ctx *ctx,
>>> struct eth_addr dmac,
>>>        case OVS_VPORT_TYPE_VXLAN:
>>>        case OVS_VPORT_TYPE_GENEVE:
>>>        case OVS_VPORT_TYPE_GTPU:
>>> +    case OVS_VPORT_TYPE_BAREUDP:
>>>            nw_proto = IPPROTO_UDP;
>>>            break;
>>>        case OVS_VPORT_TYPE_LISP:
>>> diff --git a/tests/system-layer3-tunnels.at
>>> b/tests/system-layer3-tunnels.at
>>> index 1232964..5d9ea93 100644
>>> --- a/tests/system-layer3-tunnels.at
>>> +++ b/tests/system-layer3-tunnels.at
>>> @@ -152,3 +152,50 @@ AT_CHECK([tail -1 stdout], [0],
>>>
>>>    OVS_VSWITCHD_STOP
>>>    AT_CLEANUP
>>> +
>>> +AT_SETUP([layer3 - ping over MPLS Bareudp])
>>> +OVS_TRAFFIC_VSWITCHD_START([_ADD_BR([br1])])
>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>> +
>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24", "36:b1:ee:7c:01:01")
>>> +ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24", "36:b1:ee:7c:01:02")
>>> +
>>> +ADD_OVS_TUNNEL([bareudp], [br0], [at_bareudp0], [8.1.1.3], [8.1.1.2/24],
>>> +               [ options:local_ip=8.1.1.2 options:packet_type="legacy_l3"
>>> options:payload_type=mpls options:dst_port=6635])
>>> +
>>> +ADD_OVS_TUNNEL([bareudp], [br1], [at_bareudp1], [8.1.1.2], [8.1.1.3/24],
>>> +               [options:local_ip=8.1.1.3 options:packet_type="legacy_l3"
>>> options:payload_type=mpls options:dst_port=6635])
>>> +
>>> +AT_DATA([flows0.txt], [dnl
>>> +table=0,priority=100,dl_type=0x0800
>>> actions=push_mpls:0x8847,set_mpls_label:3,output:at_bareudp0
>>> +table=0,priority=100,dl_type=0x8847 in_port=at_bareudp0
>>> actions=pop_mpls:0x0800,set_field:36:b1:ee:7c:01:01->dl_dst,set_field:36:b1:ee:7c:01:02->dl_src,output:ovs-p0
>>> +table=0,priority=10 actions=normal
>>> +])
>>> +
>>> +AT_DATA([flows1.txt], [dnl
>>> +table=0,priority=100,dl_type=0x0800
>>> actions=push_mpls:0x8847,set_mpls_label:3,output:at_bareudp1
>>> +table=0,priority=100,dl_type=0x8847 in_port=at_bareudp1
>>> actions=pop_mpls:0x0800,set_field:36:b1:ee:7c:01:02->dl_dst,set_field:36:b1:ee:7c:01:01->dl_src,output:ovs-p1
>>> +table=0,priority=10 actions=normal
>>> +])
>>> +
>>> +AT_CHECK([ip link add patch0 type veth peer name patch1])
>>> +on_exit 'ip link del patch0'
>>> +
>>> +AT_CHECK([ip link set dev patch0 up])
>>> +AT_CHECK([ip link set dev patch1 up])
>>> +AT_CHECK([ovs-vsctl add-port br0 patch0])
>>> +AT_CHECK([ovs-vsctl add-port br1 patch1])
>>> +
>>> +
>>> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-flows br0 flows0.txt])
>>> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-flows br1 flows1.txt])
>>> +
>>> +NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 |
>>> FORMAT_PING], [0], [dnl
>>> +3 packets transmitted, 3 received, 0% packet loss, time 0ms
>>> +])
>>> +
>>> +NS_CHECK_EXEC([at_ns1], [ping -q -c 3 -i 0.3 -w 2 10.1.1.1 |
>>> FORMAT_PING], [0], [dnl
>>> +3 packets transmitted, 3 received, 0% packet loss, time 0ms
>>> +])
>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>> +AT_CLEANUP
>>>
>>


More information about the dev mailing list