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