0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 : ${VXPORT:=4789}
0079 export VXPORT
0080
0081 : ${ALL_TESTS:="
0082 ping_ipv6
0083 "}
0084
0085 NUM_NETIFS=6
0086 source lib.sh
0087
0088 h1_create()
0089 {
0090 simple_if_init $h1
0091 tc qdisc add dev $h1 clsact
0092 vlan_create $h1 10 v$h1 2001:db8:1::1/64
0093 vlan_create $h1 20 v$h1 2001:db8:2::1/64
0094 }
0095
0096 h1_destroy()
0097 {
0098 vlan_destroy $h1 20
0099 vlan_destroy $h1 10
0100 tc qdisc del dev $h1 clsact
0101 simple_if_fini $h1
0102 }
0103
0104 h2_create()
0105 {
0106 simple_if_init $h2
0107 tc qdisc add dev $h2 clsact
0108 vlan_create $h2 10 v$h2 2001:db8:1::2/64
0109 vlan_create $h2 20 v$h2 2001:db8:2::2/64
0110 }
0111
0112 h2_destroy()
0113 {
0114 vlan_destroy $h2 20
0115 vlan_destroy $h2 10
0116 tc qdisc del dev $h2 clsact
0117 simple_if_fini $h2
0118 }
0119
0120 rp1_set_addr()
0121 {
0122 ip address add dev $rp1 2001:db8:3::1/64
0123
0124 ip route add 2001:db8:4::0/64 nexthop via 2001:db8:3::2
0125 ip route add 2001:db8:5::0/64 nexthop via 2001:db8:3::2
0126 }
0127
0128 rp1_unset_addr()
0129 {
0130 ip route del 2001:db8:5::0/64 nexthop via 2001:db8:3::2
0131 ip route del 2001:db8:4::0/64 nexthop via 2001:db8:3::2
0132
0133 ip address del dev $rp1 2001:db8:3::1/64
0134 }
0135
0136 switch_create()
0137 {
0138 ip link add name br1 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
0139 vlan_default_pvid 0 mcast_snooping 0
0140
0141
0142 ip link set dev br1 address $(mac_get $swp1)
0143 ip link set dev br1 up
0144
0145 ip link set dev $rp1 up
0146 rp1_set_addr
0147
0148 ip link add name vx100 type vxlan id 1000 \
0149 local 2001:db8:3::1 dstport "$VXPORT" \
0150 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0151 ip link set dev vx100 up
0152
0153 ip link set dev vx100 master br1
0154 bridge vlan add vid 100 dev vx100 pvid untagged
0155
0156 ip link set dev $swp1 master br1
0157 ip link set dev $swp1 up
0158 bridge vlan add vid 100 dev $swp1 pvid untagged
0159
0160 ip link set dev $swp2 master br1
0161 ip link set dev $swp2 up
0162 bridge vlan add vid 100 dev $swp2 pvid untagged
0163
0164 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:4::1 self
0165 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:5::1 self
0166 }
0167
0168 switch_destroy()
0169 {
0170 bridge fdb del dev vx100 00:00:00:00:00:00 dst 2001:db8:5::1 self
0171 bridge fdb del dev vx100 00:00:00:00:00:00 dst 2001:db8:4::1 self
0172
0173 bridge vlan del vid 100 dev $swp2
0174 ip link set dev $swp2 down
0175 ip link set dev $swp2 nomaster
0176
0177 bridge vlan del vid 100 dev $swp1
0178 ip link set dev $swp1 down
0179 ip link set dev $swp1 nomaster
0180
0181 ip link set dev vx100 nomaster
0182 ip link set dev vx100 down
0183 ip link del dev vx100
0184
0185 rp1_unset_addr
0186 ip link set dev $rp1 down
0187
0188 ip link set dev br1 down
0189 ip link del dev br1
0190 }
0191
0192 vrp2_create()
0193 {
0194 simple_if_init $rp2 2001:db8:3::2/64
0195 __simple_if_init v1 v$rp2 2001:db8:4::2/64
0196 __simple_if_init v3 v$rp2 2001:db8:5::2/64
0197 tc qdisc add dev v1 clsact
0198 }
0199
0200 vrp2_destroy()
0201 {
0202 tc qdisc del dev v1 clsact
0203 __simple_if_fini v3 2001:db8:5::2/64
0204 __simple_if_fini v1 2001:db8:4::2/64
0205 simple_if_fini $rp2 2001:db8:3::2/64
0206 }
0207
0208 ns_init_common()
0209 {
0210 local in_if=$1; shift
0211 local in_addr=$1; shift
0212 local other_in_addr=$1; shift
0213 local nh_addr=$1; shift
0214 local host_addr1=$1; shift
0215 local host_addr2=$1; shift
0216
0217 ip link set dev $in_if up
0218 ip address add dev $in_if $in_addr/64
0219 tc qdisc add dev $in_if clsact
0220
0221 ip link add name br2 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
0222 vlan_default_pvid 0
0223 ip link set dev br2 up
0224
0225 ip link add name w1 type veth peer name w2
0226
0227 ip link set dev w1 master br2
0228 ip link set dev w1 up
0229 bridge vlan add vid 100 dev w1 pvid untagged
0230
0231 ip link add name vx100 type vxlan id 1000 local $in_addr \
0232 dstport "$VXPORT" udp6zerocsumrx
0233 ip link set dev vx100 up
0234 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:3::1 self
0235 bridge fdb append dev vx100 00:00:00:00:00:00 dst $other_in_addr self
0236
0237 ip link set dev vx100 master br2
0238 tc qdisc add dev vx100 clsact
0239
0240 bridge vlan add vid 100 dev vx100 pvid untagged
0241
0242 simple_if_init w2
0243 vlan_create w2 10 vw2 $host_addr1/64
0244 vlan_create w2 20 vw2 $host_addr2/64
0245
0246 ip route add 2001:db8:3::0/64 nexthop via $nh_addr
0247 ip route add $other_in_addr/128 nexthop via $nh_addr
0248 }
0249 export -f ns_init_common
0250
0251 ns1_create()
0252 {
0253 ip netns add ns1
0254 ip link set dev v2 netns ns1
0255 in_ns ns1 \
0256 ns_init_common v2 2001:db8:4::1 2001:db8:5::1 2001:db8:4::2 \
0257 2001:db8:1::3 2001:db8:2::3
0258 }
0259
0260 ns1_destroy()
0261 {
0262 ip netns exec ns1 ip link set dev v2 netns 1
0263 ip netns del ns1
0264 }
0265
0266 ns2_create()
0267 {
0268 ip netns add ns2
0269 ip link set dev v4 netns ns2
0270 in_ns ns2 \
0271 ns_init_common v4 2001:db8:5::1 2001:db8:4::1 2001:db8:5::2 \
0272 2001:db8:1::4 2001:db8:2::4
0273 }
0274
0275 ns2_destroy()
0276 {
0277 ip netns exec ns2 ip link set dev v4 netns 1
0278 ip netns del ns2
0279 }
0280
0281 setup_prepare()
0282 {
0283 h1=${NETIFS[p1]}
0284 swp1=${NETIFS[p2]}
0285
0286 swp2=${NETIFS[p3]}
0287 h2=${NETIFS[p4]}
0288
0289 rp1=${NETIFS[p5]}
0290 rp2=${NETIFS[p6]}
0291
0292 vrf_prepare
0293 forwarding_enable
0294
0295 h1_create
0296 h2_create
0297 switch_create
0298
0299 ip link add name v1 type veth peer name v2
0300 ip link add name v3 type veth peer name v4
0301 vrp2_create
0302 ns1_create
0303 ns2_create
0304
0305 r1_mac=$(in_ns ns1 mac_get w2)
0306 r2_mac=$(in_ns ns2 mac_get w2)
0307 h2_mac=$(mac_get $h2)
0308 }
0309
0310 cleanup()
0311 {
0312 pre_cleanup
0313
0314 ns2_destroy
0315 ns1_destroy
0316 vrp2_destroy
0317 ip link del dev v3
0318 ip link del dev v1
0319
0320 switch_destroy
0321 h2_destroy
0322 h1_destroy
0323
0324 forwarding_restore
0325 vrf_cleanup
0326 }
0327
0328 ping_ipv6()
0329 {
0330 ping6_test $h1 2001:db8:1::2 ": local->local"
0331 ping6_test $h1 2001:db8:1::3 ": local->remote 1"
0332 ping6_test $h1 2001:db8:1::4 ": local->remote 2"
0333 }
0334
0335 test_all()
0336 {
0337 echo "Running tests with UDP port $VXPORT"
0338 tests_run
0339 }
0340
0341 trap cleanup EXIT
0342
0343 setup_prepare
0344 setup_wait
0345 test_all
0346
0347 exit $EXIT_STATUS