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

Gregory Rose gvrose8192 at gmail.com
Tue Jun 2 18:59:37 UTC 2020


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 built and installed a 5.7 kernel with bareudp configured and
the system traffic test worked fine.  I did not see any regressions
in any other system traffic tests.

The documentation and code looks pretty good but I do have a few
comments below.

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

5.7

>       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.

Maybe another line about kernel datapath is supported in the
Linux 5.7 kernel?  I know you will update the releases doc
but I think it would help to mention it here as well.

>   
>   
>   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";

Why is this changed?  From the diff I can't even tell what has changed.
It seems unrelated.

>   
>       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);
>       }

I notice that for GENEVE, VXLAN, LISP, STT and GTPU the code checks
if port has a value and then if it does not it will assign a
default port.  Is there some reason you do not follow this
format for the BAREUDP 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