#!/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