Skip to content

Commit

Permalink
tunnel: Add layer 2 IPv6 GRE encapsulation support.
Browse files Browse the repository at this point in the history
The patch adds ip6gre support. Tunnel type 'ip6gre' with packet_type=
legacy_l2 is a layer 2 GRE tunnel over IPv6, carrying inner ethernet packets
and encap with GRE header with outer IPv6 header.  Encapsulation of layer 3
packet over IPv6 GRE, ip6gre, is not supported yet.  I tested it by running:
  # make check-kernel TESTSUITEFLAGS='-k ip6gre'
under kernel 5.2 and for userspace:
  # make check TESTSUITEFLAGS='-k ip6gre'

Tested-by: Greg Rose <[email protected]>
Tested-at: https://travis-ci.org/gvrose8192/ovs-experimental/builds/552977116
Reviewed-by: Greg Rose <[email protected]>
Reviewed-by: Eli Britstein <[email protected]>
Signed-off-by: William Tu <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
williamtu authored and blp committed Jul 3, 2019
1 parent ec7a138 commit a3173ee
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 14 deletions.
13 changes: 13 additions & 0 deletions Documentation/faq/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,19 @@ Q: Does Open vSwitch support ERSPAN?
options:erspan_ver=2 options:erspan_dir=1 \
options:erspan_hwid=4

Q: Does Open vSwitch support IPv6 GRE?

A: Yes. L2 tunnel interface GRE over IPv6 is supported.
L3 GRE tunnel over IPv6 is not supported.

::

$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 at_gre0 -- \
set int at_gre0 type=ip6gre \
options:remote_ip=fc00:100::1 \
options:packet_type=legacy_l2

Q: How do I connect two bridges?

A: First, why do you want to do this? Two connected bridges are not much
Expand Down
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ Post-v2.11.0
* Support for the kernel version 5.0.x.
- 'ovs-dpctl dump-flows' is no longer suitable for dumping offloaded flows.
'ovs-appctl dpctl/dump-flows' should be used instead.
- Add L2 GRE tunnel over IPv6 support.


v2.11.0 - 19 Feb 2019
Expand Down
2 changes: 1 addition & 1 deletion datapath/linux/compat/ip6_gre.c
Original file line number Diff line number Diff line change
Expand Up @@ -2437,7 +2437,7 @@ static struct rtnl_link_ops ip6gre_link_ops __read_mostly = {
};

static struct rtnl_link_ops ip6gre_tap_ops __read_mostly = {
.kind = "ip6gre",
.kind = "ip6gretap",
.maxtype = RPL_IFLA_GRE_MAX,
.policy = ip6gre_policy,
.priv_size = sizeof(struct ip6_tnl),
Expand Down
8 changes: 7 additions & 1 deletion lib/dpif-netlink-rtnl.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,13 @@ vport_type_to_kind(enum ovs_vport_type type,
case OVS_VPORT_TYPE_IP6ERSPAN:
return "ip6erspan";
case OVS_VPORT_TYPE_IP6GRE:
return "ip6gre";
if (tnl_cfg->pt_mode == NETDEV_PT_LEGACY_L2) {
return "ip6gretap";
} else if (tnl_cfg->pt_mode == NETDEV_PT_LEGACY_L3) {
return NULL;
} else {
return NULL;
}
case OVS_VPORT_TYPE_NETDEV:
case OVS_VPORT_TYPE_INTERNAL:
case OVS_VPORT_TYPE_LISP:
Expand Down
40 changes: 40 additions & 0 deletions tests/system-traffic.at
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,46 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PI
OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP

AT_SETUP([datapath - ping over ip6gre L2 tunnel])
OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
OVS_CHECK_GRE()
OVS_CHECK_ERSPAN()

OVS_TRAFFIC_VSWITCHD_START()
ADD_BR([br-underlay])

AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])

ADD_NAMESPACES(at_ns0)

dnl Set up underlay link from host into the namespace using veth pair.
ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", [], [], nodad)
AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
AT_CHECK([ip link set dev br-underlay up])

dnl Set up tunnel endpoints on OVS outside the namespace and with a native
dnl linux device inside the namespace.
ADD_OVS_TUNNEL6([ip6gre], [br0], [at_gre0], [fc00:100::1], [10.1.1.100/24],
[options:packet_type=legacy_l2])
ADD_NATIVE_TUNNEL6([ip6gretap], [ns_gretap0], [at_ns0], [fc00:100::100],
[10.1.1.1/24], [local fc00:100::1])

OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])

dnl First, check the underlay
NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
3 packets transmitted, 3 received, 0% packet loss, time 0ms
])

dnl Okay, now check the overlay with different packet sizes
NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
3 packets transmitted, 3 received, 0% packet loss, time 0ms
])
OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP


AT_SETUP([datapath - ping over erspan v1 tunnel])
OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
OVS_CHECK_GRE()
Expand Down
69 changes: 69 additions & 0 deletions tests/tunnel-push-pop-ipv6.at
Original file line number Diff line number Diff line change
@@ -1,5 +1,74 @@
AT_BANNER([tunnel_push_pop_ipv6])

AT_SETUP([tunnel_push_pop_ipv6 - ip6gre])

OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00])
AT_CHECK([ovs-vsctl add-br int-br -- set bridge int-br datapath_type=dummy], [0])
AT_CHECK([ovs-vsctl add-port int-br t2 -- set Interface t2 type=ip6gre \
options:remote_ip=2001:cafe::92 ofport_request=2\
options:packet_type=legacy_l2
], [0])

AT_CHECK([ovs-appctl dpif/show], [0], [dnl
dummy@ovs-dummy: hit:0 missed:0
br0:
br0 65534/100: (dummy-internal)
p0 1/1: (dummy)
int-br:
int-br 65534/2: (dummy-internal)
t2 2/6: (ip6gre: remote_ip=2001:cafe::92)
])

dnl First setup dummy interface IP address, then add the route
dnl so that tnl-port table can get valid IP address for the device.
AT_CHECK([ovs-appctl netdev-dummy/ip6addr br0 2001:cafe::88/24], [0], [OK
])
AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 1.1.2.88/24], [0], [OK
])
AT_CHECK([ovs-appctl ovs/route/add 2001:cafe::92/24 br0], [0], [OK
])

AT_CHECK([ovs-ofctl add-flow br0 action=normal])

dnl Check Neighbour discovery.
AT_CHECK([ovs-vsctl -- set Interface p0 options:pcap=p0.pcap])

AT_CHECK([ovs-appctl netdev-dummy/receive int-br 'in_port(2),eth(src=aa:55:aa:55:00:00,dst=f8:bc:12:ff:ff:ff),eth_type(0x0800),ipv4(src=1.1.3.92,dst=1.1.3.88,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
AT_CHECK([ovs-pcap p0.pcap > p0.pcap.txt 2>&1])

AT_CHECK([cat p0.pcap.txt | grep 92aa55aa55000086dd6000000000203aff2001cafe | uniq], [0], [dnl
3333ff000092aa55aa55000086dd6000000000203aff2001cafe000000000000000000000088ff0200000000000000000001ff00009287004d48000000002001cafe0000000000000000000000920101aa55aa550000
])

dnl
AT_CHECK([ovs-appctl netdev-dummy/receive p0 'in_port(1),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:cafe::92,dst=2001:cafe::88,label=0,proto=58,tclass=0,hlimit=255,frag=no),icmpv6(type=136,code=0),nd(target=2001:cafe::92,sll=00:00:00:00:00:00,tll=f8:bc:12:44:34:b6)'])

AT_CHECK([ovs-appctl tnl/arp/show | tail -n+3 | sort], [0], [dnl
2001:cafe::92 f8:bc:12:44:34:b6 br0
])

AT_CHECK([ovs-appctl tnl/ports/show |sort], [0], [dnl
Listening ports:
ip6gre_sys (6) ref_cnt=1
])

dnl Check IPv6 GRE tunnel pop
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:cafe::92,dst=2001:cafe::88,label=0,proto=47,tclass=0x0,hlimit=64)'], [0], [stdout])
AT_CHECK([tail -1 stdout], [0],
[Datapath actions: tnl_pop(6)
])

dnl Check IPv6 GRE tunnel push
AT_CHECK([ovs-ofctl add-flow int-br action=2])
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:01),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout])

AT_CHECK([tail -1 stdout], [0],
[Datapath actions: clone(tnl_push(tnl_port(6),header(size=58,type=109,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x86dd),ipv6(src=2001:cafe::88,dst=2001:cafe::92,label=0,proto=47,tclass=0x0,hlimit=64),gre((flags=0x0,proto=0x6558))),out_port(100)),1)
])

OVS_VSWITCHD_STOP
AT_CLEANUP

AT_SETUP([tunnel_push_pop_ipv6 - ip6erspan])

OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00])
Expand Down
32 changes: 20 additions & 12 deletions vswitchd/vswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2554,10 +2554,16 @@

<dt><code>gre</code></dt>
<dd>
Generic Routing Encapsulation (GRE) over IPv4/IPv6 tunnel,
Generic Routing Encapsulation (GRE) over IPv4 tunnel,
configurable to encapsulate layer 2 or layer 3 traffic.
</dd>

<dt><code>ip6gre</code></dt>
<dd>
Generic Routing Encapsulation (GRE) over IPv6 tunnel,
encapsulate layer 2 traffic.
</dd>

<dt><code>vxlan</code></dt>
<dd>
<p>
Expand Down Expand Up @@ -2616,8 +2622,8 @@
<group title="Tunnel Options">
<p>
These options apply to interfaces with <ref column="type"/> of
<code>geneve</code>, <code>gre</code>, <code>vxlan</code>,
<code>lisp</code> and <code>stt</code>.
<code>geneve</code>, <code>gre</code>, <code>ip6gre</code>,
<code>vxlan</code>, <code>lisp</code> and <code>stt</code>.
</p>

<p>
Expand Down Expand Up @@ -2914,10 +2920,10 @@
</column>
</group>

<group title="Tunnel Options: gre, geneve, and vxlan">
<group title="Tunnel Options: gre, ip6gre, geneve, and vxlan">
<p>
<code>gre</code>, <code>geneve</code>, and
<code>vxlan</code> interfaces support these options.
<code>gre</code>, <code>ip6gre</code>, <code>geneve</code>,
and <code>vxlan</code> interfaces support these options.
</p>

<column name="options" key="csum" type='{"type": "boolean"}'>
Expand All @@ -2931,8 +2937,9 @@
<p>
When using the upstream Linux kernel module, computation of
checksums for <code>geneve</code> and <code>vxlan</code> requires
Linux kernel version 4.0 or higher. <code>gre</code> supports
checksums for all versions of Open vSwitch that support GRE.
Linux kernel version 4.0 or higher. <code>gre</code> and
<code>ip6gre</code> support checksums for all versions of
Open vSwitch that support GRE.
The out of tree kernel module distributed as part of OVS
can compute all tunnel checksums on any kernel version that it
is compatible with.
Expand All @@ -2944,10 +2951,11 @@
<group title="Tunnel Options: IPsec">
<p>
Setting any of these options enables IPsec support for a given
tunnel. <code>gre</code>, <code>geneve</code>, <code>vxlan</code>,
and <code>stt</code> interfaces support these options. See the
<code>IPsec</code> section in the <ref table="Open_vSwitch"/> table
for a description of each mode.
tunnel. <code>gre</code>, <code>ip6gre</code>,
<code>geneve</code>, <code>vxlan</code> and <code>stt</code>
interfaces support these options. See the <code>IPsec</code>
section in the <ref table="Open_vSwitch"/> table for a description
of each mode.
</p>
<column name="options" key="psk" type='{"type": "string"}'>
<p>
Expand Down

0 comments on commit a3173ee

Please sign in to comment.