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