1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 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 is 53 # created for them, as they don't do any IP routing. 54 55 ALL_TESTS="mpls_forward_eth" 56 NUM_NETIFS=6 57 source lib.sh 58 59 h1_create() 60 { 61 simple_if_init $h1 192.0.2.1/24 2001:db8::1/124 62 } 63 64 h1_destroy() 65 { 66 simple_if_fini $h1 192.0.2.1/24 2001:db8::1/124 67 } 68 69 h2_create() 70 { 71 simple_if_init $h2 192.0.2.2/24 2001:db8::2/124 72 } 73 74 h2_destroy() 75 { 76 simple_if_fini $h2 192.0.2.2/24 2001:db8::2/124 77 } 78 79 ler1_create() 80 { 81 tc qdisc add dev $edge1 ingress 82 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 $mpls1 87 ip link set dev $edge1 up 88 89 tc qdisc add dev $mpls1 ingress 90 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 $edge1 96 ip link set dev $mpls1 up 97 } 98 99 ler1_destroy() 100 { 101 ip link set dev $mpls1 down 102 tc qdisc del dev $mpls1 ingress 103 104 ip link set dev $edge1 down 105 tc qdisc del dev $edge1 ingress 106 } 107 108 ler2_create() 109 { 110 tc qdisc add dev $edge2 ingress 111 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 $mpls2 116 ip link set dev $edge2 up 117 118 tc qdisc add dev $mpls2 ingress 119 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 $edge2 125 ip link set dev $mpls2 up 126 } 127 128 ler2_destroy() 129 { 130 ip link set dev $mpls2 down 131 tc qdisc del dev $mpls2 ingress 132 133 ip link set dev $edge2 down 134 tc qdisc del dev $edge2 ingress 135 } 136 137 mpls_forward_eth() 138 { 139 ping_test $h1 192.0.2.2 140 ping6_test $h1 2001:db8::2 141 } 142 143 setup_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_prepare 158 159 h1_create 160 h2_create 161 ler1_create 162 ler2_create 163 } 164 165 cleanup() 166 { 167 pre_cleanup 168 169 ler2_destroy 170 ler1_destroy 171 h2_destroy 172 h1_destroy 173 174 vrf_cleanup 175 } 176 177 trap cleanup EXIT 178 179 setup_prepare 180 setup_wait 181 182 tests_run 183 184 tc_offload_check 185 if [[ $? -ne 0 ]]; then 186 log_info "Could not test offloaded functionality" 187 else 188 tcflags="skip_sw" 189 tests_run 190 fi 191 192 exit $EXIT_STATUS
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.