193 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-----------------------+5# | H1 (v$h1) |6# | 192.0.2.1/24 |7# | 2001:db8::1/124 |8# | + $h1 |9# +-----------------|-----+10# |11# | (Plain Ethernet traffic)12# |13# +-----------------|-----------------------------------------+14# | LER1 + $edge1 |15# | -ingress: |16# | -encapsulate Ethernet into MPLS |17# | -add outer Ethernet header |18# | -redirect to $mpls1 (egress) |19# | |20# | + $mpls1 |21# | | -ingress: |22# | | -remove outer Ethernet header |23# | | -remove MPLS header |24# | | -redirect to $edge1 (egress) |25# +-----------------|-----------------------------------------+26# |27# | (Ethernet over MPLS traffic)28# |29# +-----------------|-----------------------------------------+30# | LER2 + $mpls2 |31# | -ingress: |32# | -remove outer Ethernet header |33# | -remove MPLS header |34# | -redirect to $edge2 (egress) |35# | |36# | + $edge2 |37# | | -ingress: |38# | | -encapsulate Ethernet into MPLS |39# | | -add outer Ethernet header |40# | | -redirect to $mpls2 (egress) |41# +-----------------|-----------------------------------------|42# |43# | (Plain Ethernet traffic)44# |45# +-----------------|-----+46# | H2 (v$h2) | |47# | + $h2 |48# | 192.0.2.2/24 |49# | 2001:db8::2/124 |50# +-----------------------+51#52# LER1 and LER2 logically represent two different routers. However, no VRF is53# created for them, as they don't do any IP routing.54 55ALL_TESTS="mpls_forward_eth"56NUM_NETIFS=657source lib.sh58 59h1_create()60{61 simple_if_init $h1 192.0.2.1/24 2001:db8::1/12462}63 64h1_destroy()65{66 simple_if_fini $h1 192.0.2.1/24 2001:db8::1/12467}68 69h2_create()70{71 simple_if_init $h2 192.0.2.2/24 2001:db8::2/12472}73 74h2_destroy()75{76 simple_if_fini $h2 192.0.2.2/24 2001:db8::2/12477}78 79ler1_create()80{81 tc qdisc add dev $edge1 ingress82 tc filter add dev $edge1 ingress \83 matchall \84 action mpls mac_push label 102 \85 action vlan push_eth dst_mac $mpls2mac src_mac $mpls1mac \86 action mirred egress redirect dev $mpls187 ip link set dev $edge1 up88 89 tc qdisc add dev $mpls1 ingress90 tc filter add dev $mpls1 ingress \91 protocol mpls_uc \92 flower mpls_label 101 \93 action vlan pop_eth \94 action mpls pop protocol teb \95 action mirred egress redirect dev $edge196 ip link set dev $mpls1 up97}98 99ler1_destroy()100{101 ip link set dev $mpls1 down102 tc qdisc del dev $mpls1 ingress103 104 ip link set dev $edge1 down105 tc qdisc del dev $edge1 ingress106}107 108ler2_create()109{110 tc qdisc add dev $edge2 ingress111 tc filter add dev $edge2 ingress \112 matchall \113 action mpls mac_push label 101 \114 action vlan push_eth dst_mac $mpls1mac src_mac $mpls2mac \115 action mirred egress redirect dev $mpls2116 ip link set dev $edge2 up117 118 tc qdisc add dev $mpls2 ingress119 tc filter add dev $mpls2 ingress \120 protocol mpls_uc \121 flower mpls_label 102 \122 action vlan pop_eth \123 action mpls pop protocol teb \124 action mirred egress redirect dev $edge2125 ip link set dev $mpls2 up126}127 128ler2_destroy()129{130 ip link set dev $mpls2 down131 tc qdisc del dev $mpls2 ingress132 133 ip link set dev $edge2 down134 tc qdisc del dev $edge2 ingress135}136 137mpls_forward_eth()138{139 ping_test $h1 192.0.2.2140 ping6_test $h1 2001:db8::2141}142 143setup_prepare()144{145 h1=${NETIFS[p1]}146 edge1=${NETIFS[p2]}147 148 mpls1=${NETIFS[p3]}149 mpls2=${NETIFS[p4]}150 151 edge2=${NETIFS[p5]}152 h2=${NETIFS[p6]}153 154 mpls1mac=$(mac_get $mpls1)155 mpls2mac=$(mac_get $mpls2)156 157 vrf_prepare158 159 h1_create160 h2_create161 ler1_create162 ler2_create163}164 165cleanup()166{167 pre_cleanup168 169 ler2_destroy170 ler1_destroy171 h2_destroy172 h1_destroy173 174 vrf_cleanup175}176 177trap cleanup EXIT178 179setup_prepare180setup_wait181 182tests_run183 184tc_offload_check185if [[ $? -ne 0 ]]; then186 log_info "Could not test offloaded functionality"187else188 tcflags="skip_sw"189 tests_run190fi191 192exit $EXIT_STATUS193