193 lines
5.0 KiB
Bash
193 lines
5.0 KiB
Bash
|
#!/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
|