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