mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
tunnel: Bareudp Tunnel Support.
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 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 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 Signed-off-by: Martin Varghese <martin.varghese@nokia.com> Acked-By: Greg Rose <gvrose8192@gmail.com> Tested-by: Greg Rose <gvrose8192@gmail.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
parent
55f2b065ac
commit
ebe0e518b0
@ -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 \
|
||||
|
82
Documentation/faq/bareudp.rst
Normal file
82
Documentation/faq/bareudp.rst
Normal file
@ -0,0 +1,82 @@
|
||||
..
|
||||
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 support for
|
||||
tunnelling different L3 protocols like MPLS, IP, NSH etc. inside a UDP
|
||||
tunnel.
|
||||
|
||||
An example to create bareudp device to tunnel MPLS unicast traffic is
|
||||
given below.::
|
||||
|
||||
$ ovs-vsctl add-port br0 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
|
||||
|
||||
The option payload_type specifies the ethertype of the l3 protocol which
|
||||
the bareudp device will be tunnelling.
|
||||
|
||||
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 br0 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
|
||||
|
||||
The below example ovs rule shows how a bareudp tunnel port is used to
|
||||
tunnel an MPLS packet inside a UDP tunnel.::
|
||||
|
||||
$ ovs-ofctl -O OpenFlow13 add-flow br0 "in_port=10,dl_type=0x0800,\
|
||||
actions=push_mpls:0x8847,set_field:3->mpls_label,\
|
||||
output:mpls_udp_port"
|
||||
|
||||
This rule does MPLS encapsulation on IP packets and sends the l3 MPLS
|
||||
packets on a bareudp tunnel port which has its payload_type configured
|
||||
to 0x8847.
|
||||
|
||||
An example to create bareudp device to tunnel
|
||||
IPv4 & IPv6 traffic is given below.::
|
||||
|
||||
$ ovs-vsctl add-port br0 ip_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=ip options:dst_port=6636
|
@ -30,6 +30,7 @@ Open vSwitch FAQ
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
bareudp
|
||||
configuration
|
||||
contributing
|
||||
design
|
||||
|
@ -138,6 +138,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.7 NO NO NO
|
||||
QoS - Policing YES 1.1 2.6 NO
|
||||
QoS - Shaping YES 1.1 NO NO
|
||||
sFlow YES 1.0 1.0 NO
|
||||
|
4
NEWS
4
NEWS
@ -31,6 +31,10 @@ Post-v2.14.0
|
||||
OpenFlow bundle actions.
|
||||
- Support for GitHub Actions based continuous integration builds has been
|
||||
added.
|
||||
- Bareudp Tunnel
|
||||
* Bareudp device support is present in linux kernel from version 5.7
|
||||
* Kernel bareudp device is not backported to ovs tree.
|
||||
* Userspace datapath support is not added
|
||||
|
||||
|
||||
v2.14.0 - 17 Aug 2020
|
||||
|
@ -246,6 +246,7 @@ enum ovs_vport_type {
|
||||
OVS_VPORT_TYPE_IP6ERSPAN = 108, /* ERSPAN tunnel. */
|
||||
OVS_VPORT_TYPE_IP6GRE = 109,
|
||||
OVS_VPORT_TYPE_GTPU = 110,
|
||||
OVS_VPORT_TYPE_BAREUDP = 111, /* Bareudp tunnel. */
|
||||
__OVS_VPORT_TYPE_MAX
|
||||
};
|
||||
|
||||
@ -308,6 +309,14 @@ enum {
|
||||
|
||||
#define OVS_VXLAN_EXT_MAX (__OVS_VXLAN_EXT_MAX - 1)
|
||||
|
||||
enum {
|
||||
OVS_BAREUDP_EXT_UNSPEC,
|
||||
OVS_BAREUDP_EXT_MULTIPROTO_MODE,
|
||||
__OVS_BAREUDP_EXT_MAX,
|
||||
};
|
||||
|
||||
#define OVS_BAREUDP_EXT_MAX (__OVS_BAREUDP_EXT_MAX - 1)
|
||||
|
||||
/* OVS_VPORT_ATTR_OPTIONS attributes for tunnels.
|
||||
*/
|
||||
enum {
|
||||
|
@ -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_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:
|
||||
@ -357,6 +396,16 @@ dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
|
||||
nl_msg_put_u8(&request, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, 1);
|
||||
nl_msg_put_be16(&request, IFLA_GENEVE_PORT, tnl_cfg->dst_port);
|
||||
break;
|
||||
case OVS_VPORT_TYPE_BAREUDP:
|
||||
nl_msg_put_be16(&request, IFLA_BAREUDP_ETHERTYPE,
|
||||
tnl_cfg->payload_ethertype);
|
||||
nl_msg_put_u16(&request, IFLA_BAREUDP_SRCPORT_MIN,
|
||||
BAREUDP_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_NETDEV:
|
||||
case OVS_VPORT_TYPE_INTERNAL:
|
||||
case OVS_VPORT_TYPE_LISP:
|
||||
@ -470,6 +519,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:
|
||||
|
@ -749,6 +749,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;
|
||||
@ -784,6 +787,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;
|
||||
}
|
||||
|
@ -47,6 +47,7 @@
|
||||
#include "unaligned.h"
|
||||
#include "unixctl.h"
|
||||
#include "openvswitch/vlog.h"
|
||||
#include "openvswitch/ofp-parse.h"
|
||||
#ifdef __linux__
|
||||
#include "netdev-linux.h"
|
||||
#endif
|
||||
@ -112,7 +113,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 +220,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 +441,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 +750,23 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
} else if (!strcmp(node->key, "payload_type")) {
|
||||
if (!strcmp(node->value, "mpls")) {
|
||||
tnl_cfg.payload_ethertype = htons(ETH_TYPE_MPLS);
|
||||
tnl_cfg.exts |= (1 << OVS_BAREUDP_EXT_MULTIPROTO_MODE);
|
||||
} else if (!strcmp(node->value, "ip")) {
|
||||
tnl_cfg.payload_ethertype = htons(ETH_TYPE_IP);
|
||||
tnl_cfg.exts |= (1 << OVS_BAREUDP_EXT_MULTIPROTO_MODE);
|
||||
} else {
|
||||
uint16_t payload_ethertype;
|
||||
|
||||
if (str_to_u16(node->value, "payload_type",
|
||||
&payload_ethertype)) {
|
||||
err = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
tnl_cfg.payload_ethertype = htons(payload_ethertype);
|
||||
}
|
||||
} else {
|
||||
ds_put_format(&errors, "%s: unknown %s argument '%s'\n", name,
|
||||
type, node->key);
|
||||
@ -917,7 +939,8 @@ get_tunnel_config(const struct netdev *dev, struct smap *args)
|
||||
(!strcmp("vxlan", type) && dst_port != VXLAN_DST_PORT) ||
|
||||
(!strcmp("lisp", type) && dst_port != LISP_DST_PORT) ||
|
||||
(!strcmp("stt", type) && dst_port != STT_DST_PORT) ||
|
||||
(!strcmp("gtpu", type) && dst_port != GTPU_DST_PORT)) {
|
||||
(!strcmp("gtpu", type) && dst_port != GTPU_DST_PORT) ||
|
||||
!strcmp("bareudp", type)) {
|
||||
smap_add_format(args, "dst_port", "%d", dst_port);
|
||||
}
|
||||
}
|
||||
@ -1243,6 +1266,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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -152,3 +152,99 @@ AT_CHECK([tail -1 stdout], [0],
|
||||
|
||||
OVS_VSWITCHD_STOP
|
||||
AT_CLEANUP
|
||||
|
||||
AT_SETUP([layer3 - ping over MPLS Bareudp])
|
||||
OVS_CHECK_MIN_KERNEL(5, 7)
|
||||
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
|
||||
|
||||
AT_SETUP([layer3 - ping over Bareudp])
|
||||
OVS_CHECK_MIN_KERNEL(5, 7)
|
||||
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=ip options:dst_port=6636])
|
||||
|
||||
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=ip options:dst_port=6636])
|
||||
|
||||
AT_DATA([flows0.txt], [dnl
|
||||
table=0,priority=100,dl_type=0x0800 in_port=ovs-p0, actions=output:at_bareudp0
|
||||
table=0,priority=100,dl_type=0x0800 in_port=at_bareudp0 actions=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 in_port=ovs-p1 actions=output:at_bareudp1
|
||||
table=0,priority=100,dl_type=0x0800 in_port=at_bareudp1 actions=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
|
||||
|
@ -2694,6 +2694,15 @@
|
||||
</p>
|
||||
</dd>
|
||||
|
||||
<dt><code>Bareudp</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
The Bareudp tunnel provides a generic L3 encapsulation support for
|
||||
tunnelling different L3 protocols like MPLS, IP, NSH etc. inside a
|
||||
UDP tunnel.
|
||||
</p>
|
||||
</dd>
|
||||
|
||||
</dl>
|
||||
</column>
|
||||
</group>
|
||||
@ -2701,8 +2710,9 @@
|
||||
<group title="Tunnel Options">
|
||||
<p>
|
||||
These options apply to interfaces with <ref column="type"/> of
|
||||
<code>geneve</code>, <code>gre</code>, <code>ip6gre</code>,
|
||||
<code>vxlan</code>, <code>lisp</code> and <code>stt</code>.
|
||||
<code>geneve</code>, <code>bareudp</code>, <code>gre</code>,
|
||||
<code>ip6gre</code>, <code>vxlan</code>, <code>lisp</code> and
|
||||
<code>stt</code>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@ -2714,6 +2724,8 @@
|
||||
one is matched first. <ref column="options" key="in_key"/> is
|
||||
considered more specific than <ref column="options" key="local_ip"/> if
|
||||
a port defines one and another port defines the other.
|
||||
<ref column="options" key="in_key"/> is not applicable for bareudp
|
||||
tunnels. Hence it is not considered while identifying a bareudp tunnel.
|
||||
</p>
|
||||
|
||||
<column name="options" key="remote_ip">
|
||||
@ -2780,7 +2792,10 @@
|
||||
</column>
|
||||
|
||||
<column name="options" key="in_key">
|
||||
<p>Optional. The key that received packets must contain, one of:</p>
|
||||
<p>
|
||||
Optional, not applicable for <code>bareudp</code>. The key that
|
||||
received packets must contain, one of:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@ -2807,7 +2822,10 @@
|
||||
</column>
|
||||
|
||||
<column name="options" key="out_key">
|
||||
<p>Optional. The key to be set on outgoing packets, one of:</p>
|
||||
<p>
|
||||
Optional, not applicable for <code>bareudp</code>. The key to be set
|
||||
on outgoing packets, one of:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@ -2999,10 +3017,11 @@
|
||||
</column>
|
||||
</group>
|
||||
|
||||
<group title="Tunnel Options: gre, ip6gre, geneve, and vxlan">
|
||||
<group title="Tunnel Options: gre, ip6gre, geneve, bareudp and vxlan">
|
||||
<p>
|
||||
<code>gre</code>, <code>ip6gre</code>, <code>geneve</code>,
|
||||
and <code>vxlan</code> interfaces support these options.
|
||||
<code>bareudp</code> and <code>vxlan</code> interfaces support these
|
||||
options.
|
||||
</p>
|
||||
|
||||
<column name="options" key="csum" type='{"type": "boolean"}'>
|
||||
@ -3092,6 +3111,17 @@
|
||||
</column>
|
||||
</group>
|
||||
|
||||
<group title="Tunnel Options: Bareudp only">
|
||||
<column name="options" key="payload_type">
|
||||
<p>
|
||||
Specifies the ethertype of the l3 protocol the bareudp
|
||||
device is tunnelling. For the tunnels which supports multiple
|
||||
ethertypes of a l3 protocol (IP, MPLS) this field specifies the
|
||||
protocol name as a string.
|
||||
</p>
|
||||
</column>
|
||||
</group>
|
||||
|
||||
<group title="Patch Options">
|
||||
<p>
|
||||
These options apply only to <dfn>patch ports</dfn>, that is, interfaces
|
||||
|
Loading…
x
Reference in New Issue
Block a user