vxlan_asymmetric.sh 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. # +---------------------------+ +------------------------------+
  4. # | vrf-h1 | | vrf-h2 |
  5. # | + $h1 | | + $h2 |
  6. # | | 10.1.1.101/24 | | | 10.1.2.101/24 |
  7. # | | default via 10.1.1.1 | | | default via 10.1.2.1 |
  8. # +----|----------------------+ +----|-------------------------+
  9. # | |
  10. # +----|--------------------------------------------|-------------------------+
  11. # | SW | | |
  12. # | +--|--------------------------------------------|-----------------------+ |
  13. # | | + $swp1 br1 + $swp2 | |
  14. # | | vid 10 pvid untagged vid 20 pvid untagged | |
  15. # | | | |
  16. # | | + vx10 + vx20 | |
  17. # | | local 10.0.0.1 local 10.0.0.1 | |
  18. # | | remote 10.0.0.2 remote 10.0.0.2 | |
  19. # | | id 1000 id 2000 | |
  20. # | | dstport 4789 dstport 4789 | |
  21. # | | vid 10 pvid untagged vid 20 pvid untagged | |
  22. # | | | |
  23. # | +-----------------------------------+-----------------------------------+ |
  24. # | | |
  25. # | +-----------------------------------|-----------------------------------+ |
  26. # | | | | |
  27. # | | +--------------------------------+--------------------------------+ | |
  28. # | | | | | |
  29. # | | + vlan10 vlan20 + | |
  30. # | | | 10.1.1.11/24 10.1.2.11/24 | | |
  31. # | | | | | |
  32. # | | + vlan10-v (macvlan) vlan20-v (macvlan) + | |
  33. # | | 10.1.1.1/24 10.1.2.1/24 | |
  34. # | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | |
  35. # | | vrf-green | |
  36. # | +-----------------------------------------------------------------------+ |
  37. # | |
  38. # | + $rp1 +lo |
  39. # | | 192.0.2.1/24 10.0.0.1/32 |
  40. # +----|----------------------------------------------------------------------+
  41. # |
  42. # +----|--------------------------------------------------------+
  43. # | | vrf-spine |
  44. # | + $rp2 |
  45. # | 192.0.2.2/24 |
  46. # | | (maybe) HW
  47. # =============================================================================
  48. # | | (likely) SW
  49. # | |
  50. # | + v1 (veth) |
  51. # | | 192.0.3.2/24 |
  52. # +----|--------------------------------------------------------+
  53. # |
  54. # +----|----------------------------------------------------------------------+
  55. # | + v2 (veth) +lo NS1 (netns) |
  56. # | 192.0.3.1/24 10.0.0.2/32 |
  57. # | |
  58. # | +-----------------------------------------------------------------------+ |
  59. # | | vrf-green | |
  60. # | | + vlan10-v (macvlan) vlan20-v (macvlan) + | |
  61. # | | | 10.1.1.1/24 10.1.2.1/24 | | |
  62. # | | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | |
  63. # | | | | | |
  64. # | | + vlan10 vlan20 + | |
  65. # | | | 10.1.1.12/24 10.1.2.12/24 | | |
  66. # | | | | | |
  67. # | | +--------------------------------+--------------------------------+ | |
  68. # | | | | |
  69. # | +-----------------------------------|-----------------------------------+ |
  70. # | | |
  71. # | +-----------------------------------+-----------------------------------+ |
  72. # | | | |
  73. # | | + vx10 + vx20 | |
  74. # | | local 10.0.0.2 local 10.0.0.2 | |
  75. # | | remote 10.0.0.1 remote 10.0.0.1 | |
  76. # | | id 1000 id 2000 | |
  77. # | | dstport 4789 dstport 4789 | |
  78. # | | vid 10 pvid untagged vid 20 pvid untagged | |
  79. # | | | |
  80. # | | + w1 (veth) + w3 (veth) | |
  81. # | | | vid 10 pvid untagged br1 | vid 20 pvid untagged | |
  82. # | +--|------------------------------------------|-------------------------+ |
  83. # | | | |
  84. # | | | |
  85. # | +--|----------------------+ +--|-------------------------+ |
  86. # | | | vrf-h1 | | | vrf-h2 | |
  87. # | | + w2 (veth) | | + w4 (veth) | |
  88. # | | 10.1.1.102/24 | | 10.1.2.102/24 | |
  89. # | | default via 10.1.1.1 | | default via 10.1.2.1 | |
  90. # | +-------------------------+ +----------------------------+ |
  91. # +---------------------------------------------------------------------------+
  92. ALL_TESTS="
  93. ping_ipv4
  94. arp_decap
  95. arp_suppression
  96. "
  97. NUM_NETIFS=6
  98. source lib.sh
  99. require_command $ARPING
  100. hx_create()
  101. {
  102. local vrf_name=$1; shift
  103. local if_name=$1; shift
  104. local ip_addr=$1; shift
  105. local gw_ip=$1; shift
  106. vrf_create $vrf_name
  107. ip link set dev $if_name master $vrf_name
  108. ip link set dev $vrf_name up
  109. ip link set dev $if_name up
  110. ip address add $ip_addr/24 dev $if_name
  111. ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \
  112. dev $if_name
  113. ip route add default vrf $vrf_name nexthop via $gw_ip
  114. }
  115. export -f hx_create
  116. hx_destroy()
  117. {
  118. local vrf_name=$1; shift
  119. local if_name=$1; shift
  120. local ip_addr=$1; shift
  121. local gw_ip=$1; shift
  122. ip route del default vrf $vrf_name nexthop via $gw_ip
  123. ip neigh del $gw_ip dev $if_name
  124. ip address del $ip_addr/24 dev $if_name
  125. ip link set dev $if_name down
  126. vrf_destroy $vrf_name
  127. }
  128. h1_create()
  129. {
  130. hx_create "vrf-h1" $h1 10.1.1.101 10.1.1.1
  131. }
  132. h1_destroy()
  133. {
  134. hx_destroy "vrf-h1" $h1 10.1.1.101 10.1.1.1
  135. }
  136. h2_create()
  137. {
  138. hx_create "vrf-h2" $h2 10.1.2.101 10.1.2.1
  139. }
  140. h2_destroy()
  141. {
  142. hx_destroy "vrf-h2" $h2 10.1.2.101 10.1.2.1
  143. }
  144. switch_create()
  145. {
  146. ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
  147. mcast_snooping 0
  148. # Make sure the bridge uses the MAC address of the local port and not
  149. # that of the VxLAN's device.
  150. ip link set dev br1 address $(mac_get $swp1)
  151. ip link set dev br1 up
  152. ip link set dev $rp1 up
  153. ip address add dev $rp1 192.0.2.1/24
  154. ip route add 10.0.0.2/32 nexthop via 192.0.2.2
  155. ip link add name vx10 type vxlan id 1000 \
  156. local 10.0.0.1 remote 10.0.0.2 dstport 4789 \
  157. nolearning noudpcsum tos inherit ttl 100
  158. ip link set dev vx10 up
  159. ip link set dev vx10 master br1
  160. bridge vlan add vid 10 dev vx10 pvid untagged
  161. ip link add name vx20 type vxlan id 2000 \
  162. local 10.0.0.1 remote 10.0.0.2 dstport 4789 \
  163. nolearning noudpcsum tos inherit ttl 100
  164. ip link set dev vx20 up
  165. ip link set dev vx20 master br1
  166. bridge vlan add vid 20 dev vx20 pvid untagged
  167. ip link set dev $swp1 master br1
  168. ip link set dev $swp1 up
  169. bridge vlan add vid 10 dev $swp1 pvid untagged
  170. ip link set dev $swp2 master br1
  171. ip link set dev $swp2 up
  172. bridge vlan add vid 20 dev $swp2 pvid untagged
  173. ip address add 10.0.0.1/32 dev lo
  174. # Create SVIs
  175. vrf_create "vrf-green"
  176. ip link set dev vrf-green up
  177. ip link add link br1 name vlan10 up master vrf-green type vlan id 10
  178. ip address add 10.1.1.11/24 dev vlan10
  179. ip link add link vlan10 name vlan10-v up master vrf-green \
  180. address 00:00:5e:00:01:01 type macvlan mode private
  181. ip address add 10.1.1.1/24 dev vlan10-v
  182. ip link add link br1 name vlan20 up master vrf-green type vlan id 20
  183. ip address add 10.1.2.11/24 dev vlan20
  184. ip link add link vlan20 name vlan20-v up master vrf-green \
  185. address 00:00:5e:00:01:01 type macvlan mode private
  186. ip address add 10.1.2.1/24 dev vlan20-v
  187. bridge vlan add vid 10 dev br1 self
  188. bridge vlan add vid 20 dev br1 self
  189. bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
  190. bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
  191. sysctl_set net.ipv4.conf.all.rp_filter 0
  192. sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0
  193. sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0
  194. }
  195. switch_destroy()
  196. {
  197. sysctl_restore net.ipv4.conf.all.rp_filter
  198. bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20
  199. bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10
  200. bridge vlan del vid 20 dev br1 self
  201. bridge vlan del vid 10 dev br1 self
  202. ip link del dev vlan20
  203. ip link del dev vlan10
  204. vrf_destroy "vrf-green"
  205. ip address del 10.0.0.1/32 dev lo
  206. bridge vlan del vid 20 dev $swp2
  207. ip link set dev $swp2 down
  208. ip link set dev $swp2 nomaster
  209. bridge vlan del vid 10 dev $swp1
  210. ip link set dev $swp1 down
  211. ip link set dev $swp1 nomaster
  212. bridge vlan del vid 20 dev vx20
  213. ip link set dev vx20 nomaster
  214. ip link set dev vx20 down
  215. ip link del dev vx20
  216. bridge vlan del vid 10 dev vx10
  217. ip link set dev vx10 nomaster
  218. ip link set dev vx10 down
  219. ip link del dev vx10
  220. ip route del 10.0.0.2/32 nexthop via 192.0.2.2
  221. ip address del dev $rp1 192.0.2.1/24
  222. ip link set dev $rp1 down
  223. ip link set dev br1 down
  224. ip link del dev br1
  225. }
  226. spine_create()
  227. {
  228. vrf_create "vrf-spine"
  229. ip link set dev $rp2 master vrf-spine
  230. ip link set dev v1 master vrf-spine
  231. ip link set dev vrf-spine up
  232. ip link set dev $rp2 up
  233. ip link set dev v1 up
  234. ip address add 192.0.2.2/24 dev $rp2
  235. ip address add 192.0.3.2/24 dev v1
  236. ip route add 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1
  237. ip route add 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1
  238. }
  239. spine_destroy()
  240. {
  241. ip route del 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1
  242. ip route del 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1
  243. ip address del 192.0.3.2/24 dev v1
  244. ip address del 192.0.2.2/24 dev $rp2
  245. ip link set dev v1 down
  246. ip link set dev $rp2 down
  247. vrf_destroy "vrf-spine"
  248. }
  249. ns_h1_create()
  250. {
  251. hx_create "vrf-h1" w2 10.1.1.102 10.1.1.1
  252. }
  253. export -f ns_h1_create
  254. ns_h2_create()
  255. {
  256. hx_create "vrf-h2" w4 10.1.2.102 10.1.2.1
  257. }
  258. export -f ns_h2_create
  259. ns_switch_create()
  260. {
  261. ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
  262. mcast_snooping 0
  263. ip link set dev br1 up
  264. ip link set dev v2 up
  265. ip address add dev v2 192.0.3.1/24
  266. ip route add 10.0.0.1/32 nexthop via 192.0.3.2
  267. ip link add name vx10 type vxlan id 1000 \
  268. local 10.0.0.2 remote 10.0.0.1 dstport 4789 \
  269. nolearning noudpcsum tos inherit ttl 100
  270. ip link set dev vx10 up
  271. ip link set dev vx10 master br1
  272. bridge vlan add vid 10 dev vx10 pvid untagged
  273. ip link add name vx20 type vxlan id 2000 \
  274. local 10.0.0.2 remote 10.0.0.1 dstport 4789 \
  275. nolearning noudpcsum tos inherit ttl 100
  276. ip link set dev vx20 up
  277. ip link set dev vx20 master br1
  278. bridge vlan add vid 20 dev vx20 pvid untagged
  279. ip link set dev w1 master br1
  280. ip link set dev w1 up
  281. bridge vlan add vid 10 dev w1 pvid untagged
  282. ip link set dev w3 master br1
  283. ip link set dev w3 up
  284. bridge vlan add vid 20 dev w3 pvid untagged
  285. ip address add 10.0.0.2/32 dev lo
  286. # Create SVIs
  287. vrf_create "vrf-green"
  288. ip link set dev vrf-green up
  289. ip link add link br1 name vlan10 up master vrf-green type vlan id 10
  290. ip address add 10.1.1.12/24 dev vlan10
  291. ip link add link vlan10 name vlan10-v up master vrf-green \
  292. address 00:00:5e:00:01:01 type macvlan mode private
  293. ip address add 10.1.1.1/24 dev vlan10-v
  294. ip link add link br1 name vlan20 up master vrf-green type vlan id 20
  295. ip address add 10.1.2.12/24 dev vlan20
  296. ip link add link vlan20 name vlan20-v up master vrf-green \
  297. address 00:00:5e:00:01:01 type macvlan mode private
  298. ip address add 10.1.2.1/24 dev vlan20-v
  299. bridge vlan add vid 10 dev br1 self
  300. bridge vlan add vid 20 dev br1 self
  301. bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
  302. bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
  303. sysctl_set net.ipv4.conf.all.rp_filter 0
  304. sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0
  305. sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0
  306. }
  307. export -f ns_switch_create
  308. ns_init()
  309. {
  310. ip link add name w1 type veth peer name w2
  311. ip link add name w3 type veth peer name w4
  312. ip link set dev lo up
  313. ns_h1_create
  314. ns_h2_create
  315. ns_switch_create
  316. }
  317. export -f ns_init
  318. ns1_create()
  319. {
  320. ip netns add ns1
  321. ip link set dev v2 netns ns1
  322. in_ns ns1 ns_init
  323. }
  324. ns1_destroy()
  325. {
  326. ip netns exec ns1 ip link set dev v2 netns 1
  327. ip netns del ns1
  328. }
  329. macs_populate()
  330. {
  331. local mac1=$1; shift
  332. local mac2=$1; shift
  333. local ip1=$1; shift
  334. local ip2=$1; shift
  335. local dst=$1; shift
  336. bridge fdb add $mac1 dev vx10 self master extern_learn static \
  337. dst $dst vlan 10
  338. bridge fdb add $mac2 dev vx20 self master extern_learn static \
  339. dst $dst vlan 20
  340. ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \
  341. extern_learn
  342. ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \
  343. extern_learn
  344. }
  345. export -f macs_populate
  346. macs_initialize()
  347. {
  348. local h1_ns_mac=$(in_ns ns1 mac_get w2)
  349. local h2_ns_mac=$(in_ns ns1 mac_get w4)
  350. local h1_mac=$(mac_get $h1)
  351. local h2_mac=$(mac_get $h2)
  352. macs_populate $h1_ns_mac $h2_ns_mac 10.1.1.102 10.1.2.102 10.0.0.2
  353. in_ns ns1 macs_populate $h1_mac $h2_mac 10.1.1.101 10.1.2.101 10.0.0.1
  354. }
  355. setup_prepare()
  356. {
  357. h1=${NETIFS[p1]}
  358. swp1=${NETIFS[p2]}
  359. swp2=${NETIFS[p3]}
  360. h2=${NETIFS[p4]}
  361. rp1=${NETIFS[p5]}
  362. rp2=${NETIFS[p6]}
  363. vrf_prepare
  364. forwarding_enable
  365. h1_create
  366. h2_create
  367. switch_create
  368. ip link add name v1 type veth peer name v2
  369. spine_create
  370. ns1_create
  371. macs_initialize
  372. }
  373. cleanup()
  374. {
  375. pre_cleanup
  376. ns1_destroy
  377. spine_destroy
  378. ip link del dev v1
  379. switch_destroy
  380. h2_destroy
  381. h1_destroy
  382. forwarding_restore
  383. vrf_cleanup
  384. }
  385. ping_ipv4()
  386. {
  387. ping_test $h1 10.1.2.101 ": local->local vid 10->vid 20"
  388. ping_test $h1 10.1.1.102 ": local->remote vid 10->vid 10"
  389. ping_test $h2 10.1.2.102 ": local->remote vid 20->vid 20"
  390. ping_test $h1 10.1.2.102 ": local->remote vid 10->vid 20"
  391. ping_test $h2 10.1.1.102 ": local->remote vid 20->vid 10"
  392. }
  393. arp_decap()
  394. {
  395. # Repeat the ping tests, but without populating the neighbours. This
  396. # makes sure we correctly decapsulate ARP packets
  397. log_info "deleting neighbours from vlan interfaces"
  398. ip neigh del 10.1.1.102 dev vlan10
  399. ip neigh del 10.1.2.102 dev vlan20
  400. ping_ipv4
  401. ip neigh replace 10.1.1.102 lladdr $(in_ns ns1 mac_get w2) nud noarp \
  402. dev vlan10 extern_learn
  403. ip neigh replace 10.1.2.102 lladdr $(in_ns ns1 mac_get w4) nud noarp \
  404. dev vlan20 extern_learn
  405. }
  406. arp_suppression_compare()
  407. {
  408. local expect=$1; shift
  409. local actual=$(in_ns ns1 tc_rule_stats_get vx10 1 ingress)
  410. (( expect == actual ))
  411. check_err $? "expected $expect arps got $actual"
  412. }
  413. arp_suppression()
  414. {
  415. ip link set dev vx10 type bridge_slave neigh_suppress on
  416. in_ns ns1 tc qdisc add dev vx10 clsact
  417. in_ns ns1 tc filter add dev vx10 ingress proto arp pref 1 handle 101 \
  418. flower dst_mac ff:ff:ff:ff:ff:ff arp_tip 10.1.1.102 arp_op \
  419. request action pass
  420. # The neighbour is configured on the SVI and ARP suppression is on, so
  421. # the ARP request should be suppressed
  422. RET=0
  423. $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
  424. check_err $? "arping failed"
  425. arp_suppression_compare 0
  426. log_test "neigh_suppress: on / neigh exists: yes"
  427. # Delete the neighbour from the SVI. A single ARP request should be
  428. # received by the remote VTEP
  429. RET=0
  430. ip neigh del 10.1.1.102 dev vlan10
  431. $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
  432. check_err $? "arping failed"
  433. arp_suppression_compare 1
  434. log_test "neigh_suppress: on / neigh exists: no"
  435. # Turn off ARP suppression and make sure ARP is not suppressed,
  436. # regardless of neighbour existence on the SVI
  437. RET=0
  438. ip neigh del 10.1.1.102 dev vlan10 &> /dev/null
  439. ip link set dev vx10 type bridge_slave neigh_suppress off
  440. $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
  441. check_err $? "arping failed"
  442. arp_suppression_compare 2
  443. log_test "neigh_suppress: off / neigh exists: no"
  444. RET=0
  445. ip neigh add 10.1.1.102 lladdr $(in_ns ns1 mac_get w2) nud noarp \
  446. dev vlan10 extern_learn
  447. $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
  448. check_err $? "arping failed"
  449. arp_suppression_compare 3
  450. log_test "neigh_suppress: off / neigh exists: yes"
  451. in_ns ns1 tc qdisc del dev vx10 clsact
  452. }
  453. trap cleanup EXIT
  454. setup_prepare
  455. setup_wait
  456. tests_run
  457. exit $EXIT_STATUS