-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: forwarding: Add MPLS L2VPN test
Connect hosts H1 and H2 using two intermediate encapsulation routers (LER1 and LER2). These routers encapsulate traffic from the hosts, including the original Ethernet header, into MPLS. Use ping to test reachability between H1 and H2. Signed-off-by: Guillaume Nault <gnault@redhat.com> Link: https://lore.kernel.org/r/625f5c1aafa3a8085f8d3e082d680a82e16ffbaa.1606918980.git.gnault@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Guillaume Nault
authored and
Jakub Kicinski
committed
Dec 5, 2020
1 parent
0911d46
commit 41fdfff
Showing
3 changed files
with
196 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
192 changes: 192 additions & 0 deletions
192
tools/testing/selftests/net/forwarding/tc_mpls_l2vpn.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
# +-----------------------+ | ||
# | H1 (v$h1) | | ||
# | 192.0.2.1/24 | | ||
# | 2001:db8::1/124 | | ||
# | + $h1 | | ||
# +-----------------|-----+ | ||
# | | ||
# | (Plain Ethernet traffic) | ||
# | | ||
# +-----------------|-----------------------------------------+ | ||
# | LER1 + $edge1 | | ||
# | -ingress: | | ||
# | -encapsulate Ethernet into MPLS | | ||
# | -add outer Ethernet header | | ||
# | -redirect to $mpls1 (egress) | | ||
# | | | ||
# | + $mpls1 | | ||
# | | -ingress: | | ||
# | | -remove outer Ethernet header | | ||
# | | -remove MPLS header | | ||
# | | -redirect to $edge1 (egress) | | ||
# +-----------------|-----------------------------------------+ | ||
# | | ||
# | (Ethernet over MPLS traffic) | ||
# | | ||
# +-----------------|-----------------------------------------+ | ||
# | LER2 + $mpls2 | | ||
# | -ingress: | | ||
# | -remove outer Ethernet header | | ||
# | -remove MPLS header | | ||
# | -redirect to $edge2 (egress) | | ||
# | | | ||
# | + $edge2 | | ||
# | | -ingress: | | ||
# | | -encapsulate Ethernet into MPLS | | ||
# | | -add outer Ethernet header | | ||
# | | -redirect to $mpls2 (egress) | | ||
# +-----------------|-----------------------------------------| | ||
# | | ||
# | (Plain Ethernet traffic) | ||
# | | ||
# +-----------------|-----+ | ||
# | H2 (v$h2) | | | ||
# | + $h2 | | ||
# | 192.0.2.2/24 | | ||
# | 2001:db8::2/124 | | ||
# +-----------------------+ | ||
# | ||
# LER1 and LER2 logically represent two different routers. However, no VRF is | ||
# created for them, as they don't do any IP routing. | ||
|
||
ALL_TESTS="mpls_forward_eth" | ||
NUM_NETIFS=6 | ||
source lib.sh | ||
|
||
h1_create() | ||
{ | ||
simple_if_init $h1 192.0.2.1/24 2001:db8::1/124 | ||
} | ||
|
||
h1_destroy() | ||
{ | ||
simple_if_fini $h1 192.0.2.1/24 2001:db8::1/124 | ||
} | ||
|
||
h2_create() | ||
{ | ||
simple_if_init $h2 192.0.2.2/24 2001:db8::2/124 | ||
} | ||
|
||
h2_destroy() | ||
{ | ||
simple_if_fini $h2 192.0.2.2/24 2001:db8::2/124 | ||
} | ||
|
||
ler1_create() | ||
{ | ||
tc qdisc add dev $edge1 ingress | ||
tc filter add dev $edge1 ingress \ | ||
matchall \ | ||
action mpls mac_push label 102 \ | ||
action vlan push_eth dst_mac $mpls2mac src_mac $mpls1mac \ | ||
action mirred egress redirect dev $mpls1 | ||
ip link set dev $edge1 up | ||
|
||
tc qdisc add dev $mpls1 ingress | ||
tc filter add dev $mpls1 ingress \ | ||
protocol mpls_uc \ | ||
flower mpls_label 101 \ | ||
action vlan pop_eth \ | ||
action mpls pop protocol teb \ | ||
action mirred egress redirect dev $edge1 | ||
ip link set dev $mpls1 up | ||
} | ||
|
||
ler1_destroy() | ||
{ | ||
ip link set dev $mpls1 down | ||
tc qdisc del dev $mpls1 ingress | ||
|
||
ip link set dev $edge1 down | ||
tc qdisc del dev $edge1 ingress | ||
} | ||
|
||
ler2_create() | ||
{ | ||
tc qdisc add dev $edge2 ingress | ||
tc filter add dev $edge2 ingress \ | ||
matchall \ | ||
action mpls mac_push label 101 \ | ||
action vlan push_eth dst_mac $mpls1mac src_mac $mpls2mac \ | ||
action mirred egress redirect dev $mpls2 | ||
ip link set dev $edge2 up | ||
|
||
tc qdisc add dev $mpls2 ingress | ||
tc filter add dev $mpls2 ingress \ | ||
protocol mpls_uc \ | ||
flower mpls_label 102 \ | ||
action vlan pop_eth \ | ||
action mpls pop protocol teb \ | ||
action mirred egress redirect dev $edge2 | ||
ip link set dev $mpls2 up | ||
} | ||
|
||
ler2_destroy() | ||
{ | ||
ip link set dev $mpls2 down | ||
tc qdisc del dev $mpls2 ingress | ||
|
||
ip link set dev $edge2 down | ||
tc qdisc del dev $edge2 ingress | ||
} | ||
|
||
mpls_forward_eth() | ||
{ | ||
ping_test $h1 192.0.2.2 | ||
ping6_test $h1 2001:db8::2 | ||
} | ||
|
||
setup_prepare() | ||
{ | ||
h1=${NETIFS[p1]} | ||
edge1=${NETIFS[p2]} | ||
|
||
mpls1=${NETIFS[p3]} | ||
mpls2=${NETIFS[p4]} | ||
|
||
edge2=${NETIFS[p5]} | ||
h2=${NETIFS[p6]} | ||
|
||
mpls1mac=$(mac_get $mpls1) | ||
mpls2mac=$(mac_get $mpls2) | ||
|
||
vrf_prepare | ||
|
||
h1_create | ||
h2_create | ||
ler1_create | ||
ler2_create | ||
} | ||
|
||
cleanup() | ||
{ | ||
pre_cleanup | ||
|
||
ler2_destroy | ||
ler1_destroy | ||
h2_destroy | ||
h1_destroy | ||
|
||
vrf_cleanup | ||
} | ||
|
||
trap cleanup EXIT | ||
|
||
setup_prepare | ||
setup_wait | ||
|
||
tests_run | ||
|
||
tc_offload_check | ||
if [[ $? -ne 0 ]]; then | ||
log_info "Could not test offloaded functionality" | ||
else | ||
tcflags="skip_sw" | ||
tests_run | ||
fi | ||
|
||
exit $EXIT_STATUS |