Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: forwarding: Add MPLS L2VPN test

Connect hosts H1 and H2 using two intermediate encapsulation routers
(LER1 and LER2). These routers encapsulate traffic from the hosts,
including the original Ethernet header, into MPLS.

Use ping to test reachability between H1 and H2.

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Link: https://lore.kernel.org/r/625f5c1aafa3a8085f8d3e082d680a82e16ffbaa.1606918980.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Guillaume Nault and committed by
Jakub Kicinski
41fdfffd 0911d463

+196
+1
tools/testing/selftests/net/forwarding/Makefile
··· 48 48 tc_chains.sh \ 49 49 tc_flower_router.sh \ 50 50 tc_flower.sh \ 51 + tc_mpls_l2vpn.sh \ 51 52 tc_shblocks.sh \ 52 53 tc_vlan_modify.sh \ 53 54 vxlan_asymmetric.sh \
+3
tools/testing/selftests/net/forwarding/config
··· 6 6 CONFIG_NET_VRF=m 7 7 CONFIG_BPF_SYSCALL=y 8 8 CONFIG_CGROUP_BPF=y 9 + CONFIG_NET_ACT_MIRRED=m 10 + CONFIG_NET_ACT_MPLS=m 11 + CONFIG_NET_ACT_VLAN=m 9 12 CONFIG_NET_CLS_FLOWER=m 10 13 CONFIG_NET_SCH_INGRESS=m 11 14 CONFIG_NET_ACT_GACT=m
+192
tools/testing/selftests/net/forwarding/tc_mpls_l2vpn.sh
··· 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