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
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 ALL_TESTS="
0111 ping_ipv6
0112 "
0113 NUM_NETIFS=6
0114 source lib.sh
0115
0116 hx_create()
0117 {
0118 local vrf_name=$1; shift
0119 local if_name=$1; shift
0120 local ip_addr=$1; shift
0121 local gw_ip=$1; shift
0122
0123 vrf_create $vrf_name
0124 ip link set dev $if_name master $vrf_name
0125 ip link set dev $vrf_name up
0126 ip link set dev $if_name up
0127
0128 ip address add $ip_addr/64 dev $if_name
0129 ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \
0130 dev $if_name
0131 ip route add default vrf $vrf_name nexthop via $gw_ip
0132 }
0133 export -f hx_create
0134
0135 hx_destroy()
0136 {
0137 local vrf_name=$1; shift
0138 local if_name=$1; shift
0139 local ip_addr=$1; shift
0140 local gw_ip=$1; shift
0141
0142 ip route del default vrf $vrf_name nexthop via $gw_ip
0143 ip neigh del $gw_ip dev $if_name
0144 ip address del $ip_addr/64 dev $if_name
0145
0146 ip link set dev $if_name down
0147 vrf_destroy $vrf_name
0148 }
0149
0150 h1_create()
0151 {
0152 hx_create "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3
0153 }
0154
0155 h1_destroy()
0156 {
0157 hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3
0158 }
0159
0160 h2_create()
0161 {
0162 hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
0163 }
0164
0165 h2_destroy()
0166 {
0167 hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
0168 }
0169
0170 switch_create()
0171 {
0172 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
0173 mcast_snooping 0
0174
0175
0176 ip link set dev br1 address $(mac_get $swp1)
0177 ip link set dev br1 up
0178
0179 ip link set dev $rp1 up
0180 ip address add dev $rp1 2001:db8:4::1/64
0181 ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2
0182
0183 ip link add name vx10 type vxlan id 1010 \
0184 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \
0185 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0186 ip link set dev vx10 up
0187
0188 ip link set dev vx10 master br1
0189 bridge vlan add vid 10 dev vx10 pvid untagged
0190
0191 ip link add name vx20 type vxlan id 1020 \
0192 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \
0193 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0194 ip link set dev vx20 up
0195
0196 ip link set dev vx20 master br1
0197 bridge vlan add vid 20 dev vx20 pvid untagged
0198
0199 ip link set dev $swp1 master br1
0200 ip link set dev $swp1 up
0201
0202 ip link set dev $swp2 master br1
0203 ip link set dev $swp2 up
0204
0205 ip link add name vx4001 type vxlan id 104001 \
0206 local 2001:db8:3::1 dstport 4789 \
0207 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0208 ip link set dev vx4001 up
0209
0210 ip link set dev vx4001 master br1
0211 bridge vlan add vid 4001 dev vx4001 pvid untagged
0212
0213 ip address add 2001:db8:3::1/128 dev lo
0214
0215
0216 vrf_create "vrf-green"
0217 ip link set dev vrf-green up
0218
0219 ip link add link br1 name vlan10 up master vrf-green type vlan id 10
0220 ip address add 2001:db8:1::2/64 dev vlan10
0221 ip link add link vlan10 name vlan10-v up master vrf-green \
0222 address 00:00:5e:00:01:01 type macvlan mode private
0223 ip address add 2001:db8:1::3/64 dev vlan10-v
0224
0225 ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0226 ip address add 2001:db8:2::2/64 dev vlan20
0227 ip link add link vlan20 name vlan20-v up master vrf-green \
0228 address 00:00:5e:00:01:01 type macvlan mode private
0229 ip address add 2001:db8:2::3/64 dev vlan20-v
0230
0231 ip link add link br1 name vlan4001 up master vrf-green \
0232 type vlan id 4001
0233
0234 bridge vlan add vid 10 dev br1 self
0235 bridge vlan add vid 20 dev br1 self
0236 bridge vlan add vid 4001 dev br1 self
0237
0238 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
0239 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
0240
0241 bridge vlan add vid 10 dev $swp1 pvid untagged
0242 bridge vlan add vid 20 dev $swp2 pvid untagged
0243 }
0244
0245 switch_destroy()
0246 {
0247 bridge vlan del vid 20 dev br1 self
0248 bridge vlan del vid 10 dev br1 self
0249
0250 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20
0251 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10
0252
0253 bridge vlan del vid 4001 dev br1 self
0254 ip link del dev vlan4001
0255
0256 ip link del dev vlan20
0257
0258 ip link del dev vlan10
0259
0260 vrf_destroy "vrf-green"
0261
0262 ip address del 2001:db8:3::1/128 dev lo
0263
0264 bridge vlan del vid 20 dev $swp2
0265 ip link set dev $swp2 down
0266 ip link set dev $swp2 nomaster
0267
0268 bridge vlan del vid 10 dev $swp1
0269 ip link set dev $swp1 down
0270 ip link set dev $swp1 nomaster
0271
0272 bridge vlan del vid 4001 dev vx4001
0273 ip link set dev vx4001 nomaster
0274
0275 ip link set dev vx4001 down
0276 ip link del dev vx4001
0277
0278 bridge vlan del vid 20 dev vx20
0279 ip link set dev vx20 nomaster
0280
0281 ip link set dev vx20 down
0282 ip link del dev vx20
0283
0284 bridge vlan del vid 10 dev vx10
0285 ip link set dev vx10 nomaster
0286
0287 ip link set dev vx10 down
0288 ip link del dev vx10
0289
0290 ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2
0291 ip address del dev $rp1 2001:db8:4::1/64
0292 ip link set dev $rp1 down
0293
0294 ip link set dev br1 down
0295 ip link del dev br1
0296 }
0297
0298 spine_create()
0299 {
0300 vrf_create "vrf-spine"
0301 ip link set dev $rp2 master vrf-spine
0302 ip link set dev v1 master vrf-spine
0303 ip link set dev vrf-spine up
0304 ip link set dev $rp2 up
0305 ip link set dev v1 up
0306
0307 ip address add 2001:db8:4::2/64 dev $rp2
0308 ip address add 2001:db8:5::2/64 dev v1
0309
0310 ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \
0311 2001:db8:4::1
0312 ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \
0313 2001:db8:5::1
0314 }
0315
0316 spine_destroy()
0317 {
0318 ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \
0319 2001:db8:5::1
0320 ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \
0321 2001:db8:4::1
0322
0323 ip address del 2001:db8:5::2/64 dev v1
0324 ip address del 2001:db8:4::2/64 dev $rp2
0325
0326 ip link set dev v1 down
0327 ip link set dev $rp2 down
0328 vrf_destroy "vrf-spine"
0329 }
0330
0331 ns_h1_create()
0332 {
0333 hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3
0334 }
0335 export -f ns_h1_create
0336
0337 ns_h2_create()
0338 {
0339 hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3
0340 }
0341 export -f ns_h2_create
0342
0343 ns_switch_create()
0344 {
0345 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
0346 mcast_snooping 0
0347 ip link set dev br1 up
0348
0349 ip link set dev v2 up
0350 ip address add dev v2 2001:db8:5::1/64
0351 ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2
0352
0353 ip link add name vx10 type vxlan id 1010 \
0354 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \
0355 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0356 ip link set dev vx10 up
0357
0358 ip link set dev vx10 master br1
0359 bridge vlan add vid 10 dev vx10 pvid untagged
0360
0361 ip link add name vx20 type vxlan id 1020 \
0362 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \
0363 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0364 ip link set dev vx20 up
0365
0366 ip link set dev vx20 master br1
0367 bridge vlan add vid 20 dev vx20 pvid untagged
0368
0369 ip link add name vx4001 type vxlan id 104001 \
0370 local 2001:db8:3::2 dstport 4789 \
0371 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0372 ip link set dev vx4001 up
0373
0374 ip link set dev vx4001 master br1
0375 bridge vlan add vid 4001 dev vx4001 pvid untagged
0376
0377 ip link set dev w1 master br1
0378 ip link set dev w1 up
0379 bridge vlan add vid 10 dev w1 pvid untagged
0380
0381 ip link set dev w3 master br1
0382 ip link set dev w3 up
0383 bridge vlan add vid 20 dev w3 pvid untagged
0384
0385 ip address add 2001:db8:3::2/128 dev lo
0386
0387
0388 vrf_create "vrf-green"
0389 ip link set dev vrf-green up
0390
0391 ip link add link br1 name vlan10 up master vrf-green type vlan id 10
0392 ip address add 2001:db8:1::3/64 dev vlan10
0393 ip link add link vlan10 name vlan10-v up master vrf-green \
0394 address 00:00:5e:00:01:01 type macvlan mode private
0395 ip address add 2001:db8:1::3/64 dev vlan10-v
0396
0397 ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0398 ip address add 2001:db8:2::3/64 dev vlan20
0399 ip link add link vlan20 name vlan20-v up master vrf-green \
0400 address 00:00:5e:00:01:01 type macvlan mode private
0401 ip address add 2001:db8:2::3/64 dev vlan20-v
0402
0403 ip link add link br1 name vlan4001 up master vrf-green \
0404 type vlan id 4001
0405
0406 bridge vlan add vid 10 dev br1 self
0407 bridge vlan add vid 20 dev br1 self
0408 bridge vlan add vid 4001 dev br1 self
0409
0410 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
0411 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
0412 }
0413 export -f ns_switch_create
0414
0415 ns_init()
0416 {
0417 ip link add name w1 type veth peer name w2
0418 ip link add name w3 type veth peer name w4
0419
0420 ip link set dev lo up
0421
0422 ns_h1_create
0423 ns_h2_create
0424 ns_switch_create
0425 }
0426 export -f ns_init
0427
0428 ns1_create()
0429 {
0430 ip netns add ns1
0431 ip link set dev v2 netns ns1
0432 in_ns ns1 ns_init
0433 }
0434
0435 ns1_destroy()
0436 {
0437 ip netns exec ns1 ip link set dev v2 netns 1
0438 ip netns del ns1
0439 }
0440
0441 __l2_vni_init()
0442 {
0443 local mac1=$1; shift
0444 local mac2=$1; shift
0445 local ip1=$1; shift
0446 local ip2=$1; shift
0447 local dst=$1; shift
0448
0449 bridge fdb add $mac1 dev vx10 self master extern_learn static \
0450 dst $dst vlan 10
0451 bridge fdb add $mac2 dev vx20 self master extern_learn static \
0452 dst $dst vlan 20
0453
0454 ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \
0455 extern_learn
0456 ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \
0457 extern_learn
0458 }
0459 export -f __l2_vni_init
0460
0461 l2_vni_init()
0462 {
0463 local h1_ns_mac=$(in_ns ns1 mac_get w2)
0464 local h2_ns_mac=$(in_ns ns1 mac_get w4)
0465 local h1_mac=$(mac_get $h1)
0466 local h2_mac=$(mac_get $h2)
0467
0468 __l2_vni_init $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \
0469 2001:db8:3::2
0470 in_ns ns1 __l2_vni_init $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \
0471 2001:db8:3::1
0472 }
0473
0474 __l3_vni_init()
0475 {
0476 local mac=$1; shift
0477 local vtep_ip=$1; shift
0478 local host1_ip=$1; shift
0479 local host2_ip=$1; shift
0480
0481 bridge fdb add $mac dev vx4001 self master extern_learn static \
0482 dst $vtep_ip vlan 4001
0483
0484 ip neigh add $vtep_ip lladdr $mac nud noarp dev vlan4001 extern_learn
0485
0486 ip route add $host1_ip/128 vrf vrf-green nexthop via $vtep_ip \
0487 dev vlan4001 onlink
0488 ip route add $host2_ip/128 vrf vrf-green nexthop via $vtep_ip \
0489 dev vlan4001 onlink
0490 }
0491 export -f __l3_vni_init
0492
0493 l3_vni_init()
0494 {
0495 local vlan4001_ns_mac=$(in_ns ns1 mac_get vlan4001)
0496 local vlan4001_mac=$(mac_get vlan4001)
0497
0498 __l3_vni_init $vlan4001_ns_mac 2001:db8:3::2 2001:db8:1::4 \
0499 2001:db8:2::4
0500 in_ns ns1 __l3_vni_init $vlan4001_mac 2001:db8:3::1 2001:db8:1::1 \
0501 2001:db8:2::1
0502 }
0503
0504 setup_prepare()
0505 {
0506 h1=${NETIFS[p1]}
0507 swp1=${NETIFS[p2]}
0508
0509 swp2=${NETIFS[p3]}
0510 h2=${NETIFS[p4]}
0511
0512 rp1=${NETIFS[p5]}
0513 rp2=${NETIFS[p6]}
0514
0515 vrf_prepare
0516 forwarding_enable
0517
0518 h1_create
0519 h2_create
0520 switch_create
0521
0522 ip link add name v1 type veth peer name v2
0523 spine_create
0524 ns1_create
0525 in_ns ns1 forwarding_enable
0526
0527 l2_vni_init
0528 l3_vni_init
0529 }
0530
0531 cleanup()
0532 {
0533 pre_cleanup
0534
0535 ns1_destroy
0536 spine_destroy
0537 ip link del dev v1
0538
0539 switch_destroy
0540 h2_destroy
0541 h1_destroy
0542
0543 forwarding_restore
0544 vrf_cleanup
0545 }
0546
0547 ping_ipv6()
0548 {
0549 ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20"
0550 ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10"
0551 ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20"
0552 ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20"
0553 ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10"
0554 }
0555
0556 trap cleanup EXIT
0557
0558 setup_prepare
0559 setup_wait
0560
0561 tests_run
0562
0563 exit $EXIT_STATUS