2
0
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:
Martin Varghese 2020-12-17 12:48:41 +05:30 committed by Ilya Maximets
parent 55f2b065ac
commit ebe0e518b0
13 changed files with 320 additions and 8 deletions

View File

@ -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 \

View 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

View File

@ -30,6 +30,7 @@ Open vSwitch FAQ
.. toctree::
:maxdepth: 2
bareudp
configuration
contributing
design

View File

@ -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
View File

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

View File

@ -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 {

View File

@ -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:

View File

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

View File

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

View File

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

View File

@ -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:

View File

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

View File

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