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 : ${VXPORT:=4789}
0077 export VXPORT
0078
0079 : ${ALL_TESTS:="
0080 ping_ipv4
0081 "}
0082
0083 NUM_NETIFS=6
0084 source lib.sh
0085
0086 h1_create()
0087 {
0088 simple_if_init $h1
0089 tc qdisc add dev $h1 clsact
0090 vlan_create $h1 10 v$h1 192.0.2.1/28
0091 }
0092
0093 h1_destroy()
0094 {
0095 vlan_destroy $h1 10
0096 tc qdisc del dev $h1 clsact
0097 simple_if_fini $h1
0098 }
0099
0100 h2_create()
0101 {
0102 simple_if_init $h2
0103 tc qdisc add dev $h2 clsact
0104 vlan_create $h2 20 v$h2 192.0.2.2/28
0105 }
0106
0107 h2_destroy()
0108 {
0109 vlan_destroy $h2 20
0110 tc qdisc del dev $h2 clsact
0111 simple_if_fini $h2
0112 }
0113
0114 rp1_set_addr()
0115 {
0116 ip address add dev $rp1 192.0.2.17/28
0117
0118 ip route add 192.0.2.32/28 nexthop via 192.0.2.18
0119 ip route add 192.0.2.48/28 nexthop via 192.0.2.18
0120 }
0121
0122 rp1_unset_addr()
0123 {
0124 ip route del 192.0.2.48/28 nexthop via 192.0.2.18
0125 ip route del 192.0.2.32/28 nexthop via 192.0.2.18
0126
0127 ip address del dev $rp1 192.0.2.17/28
0128 }
0129
0130 switch_create()
0131 {
0132
0133 ip link add name br1 type bridge vlan_filtering 1 \
0134 vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
0135
0136
0137 ip link set dev br1 address $(mac_get $swp1)
0138 ip link set dev br1 up
0139
0140
0141 ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0
0142
0143
0144 ip link set dev br2 address $(mac_get $swp2)
0145 ip link set dev br2 up
0146
0147 ip link set dev $rp1 up
0148 rp1_set_addr
0149
0150
0151 ip link add name vx100 type vxlan id 1000 local 192.0.2.17 \
0152 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0153 ip link set dev vx100 up
0154
0155 ip link set dev vx100 master br1
0156 bridge vlan add vid 100 dev vx100 pvid untagged
0157
0158 ip link set dev $swp1 master br1
0159 ip link set dev $swp1 up
0160 bridge vlan add vid 100 dev $swp1 pvid untagged
0161
0162
0163 ip link add name vx200 type vxlan id 2000 local 192.0.2.17 \
0164 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0165 ip link set dev vx200 up
0166
0167 ip link set dev vx200 master br2
0168
0169 ip link set dev $swp2 up
0170 ip link add name $swp2.20 link $swp2 type vlan id 20
0171 ip link set dev $swp2.20 master br2
0172 ip link set dev $swp2.20 up
0173
0174 bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
0175 bridge fdb append dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self
0176 }
0177
0178 switch_destroy()
0179 {
0180 bridge fdb del dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self
0181 bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
0182
0183 ip link set dev vx200 nomaster
0184 ip link set dev vx200 down
0185 ip link del dev vx200
0186
0187 ip link del dev $swp2.20
0188 ip link set dev $swp2 down
0189 ip link set dev $swp2 nomaster
0190
0191 bridge vlan del vid 100 dev $swp1
0192 ip link set dev $swp1 down
0193 ip link set dev $swp1 nomaster
0194
0195 ip link set dev vx100 nomaster
0196 ip link set dev vx100 down
0197 ip link del dev vx100
0198
0199 rp1_unset_addr
0200 ip link set dev $rp1 down
0201
0202 ip link set dev br2 down
0203 ip link del dev br2
0204
0205 ip link set dev br1 down
0206 ip link del dev br1
0207 }
0208
0209 vrp2_create()
0210 {
0211 simple_if_init $rp2 192.0.2.18/28
0212 __simple_if_init v1 v$rp2 192.0.2.33/28
0213 __simple_if_init v3 v$rp2 192.0.2.49/28
0214 tc qdisc add dev v1 clsact
0215 }
0216
0217 vrp2_destroy()
0218 {
0219 tc qdisc del dev v1 clsact
0220 __simple_if_fini v3 192.0.2.49/28
0221 __simple_if_fini v1 192.0.2.33/28
0222 simple_if_fini $rp2 192.0.2.18/28
0223 }
0224
0225 ns_init_common()
0226 {
0227 local in_if=$1; shift
0228 local in_addr=$1; shift
0229 local other_in_addr=$1; shift
0230 local vxlan_name=$1; shift
0231 local vxlan_id=$1; shift
0232 local vlan_id=$1; shift
0233 local host_addr=$1; shift
0234 local nh_addr=$1; shift
0235
0236 ip link set dev $in_if up
0237 ip address add dev $in_if $in_addr/28
0238 tc qdisc add dev $in_if clsact
0239
0240 ip link add name br3 type bridge vlan_filtering 0
0241 ip link set dev br3 up
0242
0243 ip link add name w1 type veth peer name w2
0244
0245 ip link set dev w1 master br3
0246 ip link set dev w1 up
0247
0248 ip link add name $vxlan_name type vxlan id $vxlan_id local $in_addr \
0249 dstport "$VXPORT"
0250 ip link set dev $vxlan_name up
0251 bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst 192.0.2.17 self
0252 bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst $other_in_addr self
0253
0254 ip link set dev $vxlan_name master br3
0255 tc qdisc add dev $vxlan_name clsact
0256
0257 simple_if_init w2
0258 vlan_create w2 $vlan_id vw2 $host_addr/28
0259
0260 ip route add 192.0.2.16/28 nexthop via $nh_addr
0261 ip route add $other_in_addr/32 nexthop via $nh_addr
0262 }
0263 export -f ns_init_common
0264
0265 ns1_create()
0266 {
0267 ip netns add ns1
0268 ip link set dev v2 netns ns1
0269 in_ns ns1 \
0270 ns_init_common v2 192.0.2.34 192.0.2.50 vx100 1000 10 192.0.2.3 \
0271 192.0.2.33
0272
0273 in_ns ns1 bridge vlan add vid 100 dev vx100 pvid untagged
0274 }
0275
0276 ns1_destroy()
0277 {
0278 ip netns exec ns1 ip link set dev v2 netns 1
0279 ip netns del ns1
0280 }
0281
0282 ns2_create()
0283 {
0284 ip netns add ns2
0285 ip link set dev v4 netns ns2
0286 in_ns ns2 \
0287 ns_init_common v4 192.0.2.50 192.0.2.34 vx200 2000 20 192.0.2.4 \
0288 192.0.2.49
0289
0290 in_ns ns2 ip link add name w1.20 link w1 type vlan id 20
0291 in_ns ns2 ip link set dev w1.20 master br3
0292 in_ns ns2 ip link set dev w1.20 up
0293 }
0294
0295 ns2_destroy()
0296 {
0297 ip netns exec ns2 ip link set dev v4 netns 1
0298 ip netns del ns2
0299 }
0300
0301 setup_prepare()
0302 {
0303 h1=${NETIFS[p1]}
0304 swp1=${NETIFS[p2]}
0305
0306 swp2=${NETIFS[p3]}
0307 h2=${NETIFS[p4]}
0308
0309 rp1=${NETIFS[p5]}
0310 rp2=${NETIFS[p6]}
0311
0312 vrf_prepare
0313 forwarding_enable
0314
0315 h1_create
0316 h2_create
0317 switch_create
0318
0319 ip link add name v1 type veth peer name v2
0320 ip link add name v3 type veth peer name v4
0321 vrp2_create
0322 ns1_create
0323 ns2_create
0324
0325 r1_mac=$(in_ns ns1 mac_get w2)
0326 r2_mac=$(in_ns ns2 mac_get w2)
0327 h2_mac=$(mac_get $h2)
0328 }
0329
0330 cleanup()
0331 {
0332 pre_cleanup
0333
0334 ns2_destroy
0335 ns1_destroy
0336 vrp2_destroy
0337 ip link del dev v3
0338 ip link del dev v1
0339
0340 switch_destroy
0341 h2_destroy
0342 h1_destroy
0343
0344 forwarding_restore
0345 vrf_cleanup
0346 }
0347
0348 ping_ipv4()
0349 {
0350 ping_test $h1 192.0.2.3 ": local->remote 1 through VxLAN with an 802.1ad bridge"
0351 ping_test $h2 192.0.2.4 ": local->remote 2 through VxLAN with an 802.1d bridge"
0352 }
0353
0354 test_all()
0355 {
0356 echo "Running tests with UDP port $VXPORT"
0357 tests_run
0358 }
0359
0360 trap cleanup EXIT
0361
0362 setup_prepare
0363 setup_wait
0364 test_all
0365
0366 exit $EXIT_STATUS