vxlan.sh 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Test various aspects of VxLAN offloading which are specific to mlxsw, such
  5. # as sanitization of invalid configurations and offload indication.
  6. : ${ADDR_FAMILY:=ipv4}
  7. export ADDR_FAMILY
  8. : ${LOCAL_IP_1:=198.51.100.1}
  9. export LOCAL_IP_1
  10. : ${LOCAL_IP_2:=198.51.100.2}
  11. export LOCAL_IP_2
  12. : ${PREFIX_LEN:=32}
  13. export PREFIX_LEN
  14. : ${UDPCSUM_FLAFS:=noudpcsum}
  15. export UDPCSUM_FLAFS
  16. : ${MC_IP:=239.0.0.1}
  17. export MC_IP
  18. : ${IP_FLAG:=""}
  19. export IP_FLAG
  20. : ${ALL_TESTS:="
  21. sanitization_test
  22. offload_indication_test
  23. sanitization_vlan_aware_test
  24. offload_indication_vlan_aware_test
  25. "}
  26. lib_dir=$(dirname $0)/../../../net/forwarding
  27. NUM_NETIFS=2
  28. : ${TIMEOUT:=20000} # ms
  29. source $lib_dir/lib.sh
  30. setup_prepare()
  31. {
  32. swp1=${NETIFS[p1]}
  33. swp2=${NETIFS[p2]}
  34. ip link set dev $swp1 up
  35. ip link set dev $swp2 up
  36. }
  37. cleanup()
  38. {
  39. pre_cleanup
  40. ip link set dev $swp2 down
  41. ip link set dev $swp1 down
  42. }
  43. sanitization_single_dev_test_pass()
  44. {
  45. ip link set dev $swp1 master br0
  46. check_err $?
  47. ip link set dev vxlan0 master br0
  48. check_err $?
  49. ip link set dev $swp1 nomaster
  50. ip link set dev $swp1 master br0
  51. check_err $?
  52. }
  53. sanitization_single_dev_test_fail()
  54. {
  55. ip link set dev $swp1 master br0
  56. check_err $?
  57. ip link set dev vxlan0 master br0 &> /dev/null
  58. check_fail $?
  59. ip link set dev $swp1 nomaster
  60. ip link set dev vxlan0 master br0
  61. check_err $?
  62. ip link set dev $swp1 master br0 &> /dev/null
  63. check_fail $?
  64. }
  65. sanitization_single_dev_valid_test()
  66. {
  67. RET=0
  68. ip link add dev br0 type bridge mcast_snooping 0
  69. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  70. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  71. sanitization_single_dev_test_pass
  72. ip link del dev vxlan0
  73. ip link del dev br0
  74. log_test "vxlan device - valid configuration"
  75. }
  76. sanitization_single_dev_vlan_aware_test()
  77. {
  78. RET=0
  79. ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
  80. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  81. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  82. sanitization_single_dev_test_pass
  83. ip link del dev vxlan0
  84. ip link del dev br0
  85. log_test "vxlan device with a vlan-aware bridge"
  86. }
  87. sanitization_single_dev_mcast_enabled_test()
  88. {
  89. RET=0
  90. ip link add dev br0 type bridge
  91. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  92. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  93. sanitization_single_dev_test_fail
  94. ip link del dev vxlan0
  95. ip link del dev br0
  96. log_test "vxlan device with a multicast enabled bridge"
  97. }
  98. sanitization_single_dev_mcast_group_test()
  99. {
  100. RET=0
  101. ip link add dev br0 type bridge mcast_snooping 0
  102. ip link add name dummy1 up type dummy
  103. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  104. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
  105. dev dummy1 group $MC_IP
  106. sanitization_single_dev_test_fail
  107. ip link del dev vxlan0
  108. ip link del dev dummy1
  109. ip link del dev br0
  110. log_test "vxlan device with a multicast group"
  111. }
  112. sanitization_single_dev_no_local_ip_test()
  113. {
  114. RET=0
  115. ip link add dev br0 type bridge mcast_snooping 0
  116. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  117. ttl 20 tos inherit dstport 4789
  118. sanitization_single_dev_test_fail
  119. ip link del dev vxlan0
  120. ip link del dev br0
  121. log_test "vxlan device with no local ip"
  122. }
  123. sanitization_single_dev_learning_enabled_ipv4_test()
  124. {
  125. RET=0
  126. ip link add dev br0 type bridge mcast_snooping 0
  127. ip link add name vxlan0 up type vxlan id 10 learning $UDPCSUM_FLAFS \
  128. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  129. sanitization_single_dev_test_pass
  130. ip link del dev vxlan0
  131. ip link del dev br0
  132. log_test "vxlan device with learning enabled"
  133. }
  134. sanitization_single_dev_local_interface_test()
  135. {
  136. RET=0
  137. ip link add dev br0 type bridge mcast_snooping 0
  138. ip link add name dummy1 up type dummy
  139. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  140. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 dev dummy1
  141. sanitization_single_dev_test_fail
  142. ip link del dev vxlan0
  143. ip link del dev dummy1
  144. ip link del dev br0
  145. log_test "vxlan device with local interface"
  146. }
  147. sanitization_single_dev_port_range_test()
  148. {
  149. RET=0
  150. ip link add dev br0 type bridge mcast_snooping 0
  151. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  152. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
  153. srcport 4000 5000
  154. sanitization_single_dev_test_fail
  155. ip link del dev vxlan0
  156. ip link del dev br0
  157. log_test "vxlan device with udp source port range"
  158. }
  159. sanitization_single_dev_tos_static_test()
  160. {
  161. RET=0
  162. ip link add dev br0 type bridge mcast_snooping 0
  163. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  164. ttl 20 tos 20 local $LOCAL_IP_1 dstport 4789
  165. sanitization_single_dev_test_fail
  166. ip link del dev vxlan0
  167. ip link del dev br0
  168. log_test "vxlan device with static tos"
  169. }
  170. sanitization_single_dev_ttl_inherit_test()
  171. {
  172. RET=0
  173. ip link add dev br0 type bridge mcast_snooping 0
  174. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  175. ttl inherit tos inherit local $LOCAL_IP_1 dstport 4789
  176. sanitization_single_dev_test_fail
  177. ip link del dev vxlan0
  178. ip link del dev br0
  179. log_test "vxlan device with inherit ttl"
  180. }
  181. sanitization_single_dev_udp_checksum_ipv4_test()
  182. {
  183. RET=0
  184. ip link add dev br0 type bridge mcast_snooping 0
  185. ip link add name vxlan0 up type vxlan id 10 nolearning udpcsum \
  186. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  187. sanitization_single_dev_test_fail
  188. ip link del dev vxlan0
  189. ip link del dev br0
  190. log_test "vxlan device with udp checksum"
  191. }
  192. sanitization_single_dev_test()
  193. {
  194. # These tests make sure that we correctly sanitize VxLAN device
  195. # configurations we do not support
  196. sanitization_single_dev_valid_test
  197. sanitization_single_dev_vlan_aware_test
  198. sanitization_single_dev_mcast_enabled_test
  199. sanitization_single_dev_mcast_group_test
  200. sanitization_single_dev_no_local_ip_test
  201. sanitization_single_dev_learning_enabled_"$ADDR_FAMILY"_test
  202. sanitization_single_dev_local_interface_test
  203. sanitization_single_dev_port_range_test
  204. sanitization_single_dev_tos_static_test
  205. sanitization_single_dev_ttl_inherit_test
  206. sanitization_single_dev_udp_checksum_"$ADDR_FAMILY"_test
  207. }
  208. sanitization_multi_devs_test_pass()
  209. {
  210. ip link set dev $swp1 master br0
  211. check_err $?
  212. ip link set dev vxlan0 master br0
  213. check_err $?
  214. ip link set dev $swp2 master br1
  215. check_err $?
  216. ip link set dev vxlan1 master br1
  217. check_err $?
  218. ip link set dev $swp2 nomaster
  219. ip link set dev $swp1 nomaster
  220. ip link set dev $swp1 master br0
  221. check_err $?
  222. ip link set dev $swp2 master br1
  223. check_err $?
  224. }
  225. sanitization_multi_devs_test_fail()
  226. {
  227. ip link set dev $swp1 master br0
  228. check_err $?
  229. ip link set dev vxlan0 master br0
  230. check_err $?
  231. ip link set dev $swp2 master br1
  232. check_err $?
  233. ip link set dev vxlan1 master br1 &> /dev/null
  234. check_fail $?
  235. ip link set dev $swp2 nomaster
  236. ip link set dev $swp1 nomaster
  237. ip link set dev vxlan1 master br1
  238. check_err $?
  239. ip link set dev $swp1 master br0
  240. check_err $?
  241. ip link set dev $swp2 master br1 &> /dev/null
  242. check_fail $?
  243. }
  244. sanitization_multi_devs_valid_test()
  245. {
  246. RET=0
  247. ip link add dev br0 type bridge mcast_snooping 0
  248. ip link add dev br1 type bridge mcast_snooping 0
  249. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  250. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  251. ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
  252. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  253. sanitization_multi_devs_test_pass
  254. ip link del dev vxlan1
  255. ip link del dev vxlan0
  256. ip link del dev br1
  257. ip link del dev br0
  258. log_test "multiple vxlan devices - valid configuration"
  259. }
  260. sanitization_multi_devs_ttl_test()
  261. {
  262. RET=0
  263. ip link add dev br0 type bridge mcast_snooping 0
  264. ip link add dev br1 type bridge mcast_snooping 0
  265. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  266. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  267. ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
  268. ttl 40 tos inherit local $LOCAL_IP_1 dstport 4789
  269. sanitization_multi_devs_test_fail
  270. ip link del dev vxlan1
  271. ip link del dev vxlan0
  272. ip link del dev br1
  273. ip link del dev br0
  274. log_test "multiple vxlan devices with different ttl"
  275. }
  276. sanitization_multi_devs_udp_dstport_test()
  277. {
  278. RET=0
  279. ip link add dev br0 type bridge mcast_snooping 0
  280. ip link add dev br1 type bridge mcast_snooping 0
  281. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  282. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  283. ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
  284. ttl 20 tos inherit local $LOCAL_IP_1 dstport 5789
  285. sanitization_multi_devs_test_fail
  286. ip link del dev vxlan1
  287. ip link del dev vxlan0
  288. ip link del dev br1
  289. ip link del dev br0
  290. log_test "multiple vxlan devices with different udp destination port"
  291. }
  292. sanitization_multi_devs_local_ip_test()
  293. {
  294. RET=0
  295. ip link add dev br0 type bridge mcast_snooping 0
  296. ip link add dev br1 type bridge mcast_snooping 0
  297. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  298. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  299. ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
  300. ttl 20 tos inherit local $LOCAL_IP_2 dstport 4789
  301. sanitization_multi_devs_test_fail
  302. ip link del dev vxlan1
  303. ip link del dev vxlan0
  304. ip link del dev br1
  305. ip link del dev br0
  306. log_test "multiple vxlan devices with different local ip"
  307. }
  308. sanitization_multi_devs_test()
  309. {
  310. # The device has a single VTEP, which means all the VxLAN devices
  311. # we offload must share certain properties such as source IP and
  312. # UDP destination port. These tests make sure that we forbid
  313. # configurations that violate this limitation
  314. sanitization_multi_devs_valid_test
  315. sanitization_multi_devs_ttl_test
  316. sanitization_multi_devs_udp_dstport_test
  317. sanitization_multi_devs_local_ip_test
  318. }
  319. sanitization_test()
  320. {
  321. sanitization_single_dev_test
  322. sanitization_multi_devs_test
  323. }
  324. offload_indication_setup_create()
  325. {
  326. # Create a simple setup with two bridges, each with a VxLAN device
  327. # and one local port
  328. ip link add name br0 type bridge mcast_snooping 0
  329. ip link set dev br0 addrgenmode none
  330. ip link set dev br0 up
  331. ip link add name br1 type bridge mcast_snooping 0
  332. ip link set dev br1 addrgenmode none
  333. ip link set dev br1 up
  334. ip link set dev $swp1 master br0
  335. ip link set dev $swp2 master br1
  336. ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
  337. ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
  338. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  339. ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
  340. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  341. }
  342. offload_indication_setup_destroy()
  343. {
  344. ip link del dev vxlan1
  345. ip link del dev vxlan0
  346. ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
  347. ip link set dev $swp2 nomaster
  348. ip link set dev $swp1 nomaster
  349. ip link del dev br1
  350. ip link del dev br0
  351. }
  352. offload_indication_fdb_flood_test()
  353. {
  354. RET=0
  355. bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2
  356. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \
  357. bridge fdb show brport vxlan0
  358. check_err $?
  359. bridge fdb del 00:00:00:00:00:00 dev vxlan0 self
  360. log_test "vxlan flood entry offload indication"
  361. }
  362. offload_indication_fdb_bridge_test()
  363. {
  364. RET=0
  365. bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
  366. dst $LOCAL_IP_2
  367. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  368. de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
  369. check_err $?
  370. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  371. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
  372. check_err $?
  373. log_test "vxlan entry offload indication - initial state"
  374. # Remove FDB entry from the bridge driver and check that corresponding
  375. # entry in the VxLAN driver is not marked as offloaded
  376. RET=0
  377. bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master
  378. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
  379. de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
  380. check_err $?
  381. log_test "vxlan entry offload indication - after removal from bridge"
  382. # Add the FDB entry back to the bridge driver and make sure it is
  383. # marked as offloaded in both drivers
  384. RET=0
  385. bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static
  386. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  387. de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
  388. check_err $?
  389. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  390. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
  391. check_err $?
  392. log_test "vxlan entry offload indication - after re-add to bridge"
  393. # Remove FDB entry from the VxLAN driver and check that corresponding
  394. # entry in the bridge driver is not marked as offloaded
  395. RET=0
  396. bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self
  397. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
  398. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
  399. check_err $?
  400. log_test "vxlan entry offload indication - after removal from vxlan"
  401. # Add the FDB entry back to the VxLAN driver and make sure it is
  402. # marked as offloaded in both drivers
  403. RET=0
  404. bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2
  405. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  406. de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
  407. check_err $?
  408. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  409. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
  410. check_err $?
  411. log_test "vxlan entry offload indication - after re-add to vxlan"
  412. bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master
  413. }
  414. offload_indication_fdb_test()
  415. {
  416. offload_indication_fdb_flood_test
  417. offload_indication_fdb_bridge_test
  418. }
  419. offload_indication_decap_route_test()
  420. {
  421. RET=0
  422. busywait "$TIMEOUT" wait_for_offload \
  423. ip $IP_FLAG route show table local $LOCAL_IP_1
  424. check_err $?
  425. ip link set dev vxlan0 down
  426. busywait "$TIMEOUT" wait_for_offload \
  427. ip $IP_FLAG route show table local $LOCAL_IP_1
  428. check_err $?
  429. ip link set dev vxlan1 down
  430. busywait "$TIMEOUT" not wait_for_offload \
  431. ip $IP_FLAG route show table local $LOCAL_IP_1
  432. check_err $?
  433. log_test "vxlan decap route - vxlan device down"
  434. RET=0
  435. ip link set dev vxlan1 up
  436. busywait "$TIMEOUT" wait_for_offload \
  437. ip $IP_FLAG route show table local $LOCAL_IP_1
  438. check_err $?
  439. ip link set dev vxlan0 up
  440. busywait "$TIMEOUT" wait_for_offload \
  441. ip $IP_FLAG route show table local $LOCAL_IP_1
  442. check_err $?
  443. log_test "vxlan decap route - vxlan device up"
  444. RET=0
  445. ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo
  446. busywait "$TIMEOUT" not wait_for_offload \
  447. ip $IP_FLAG route show table local $LOCAL_IP_1
  448. check_err $?
  449. ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
  450. busywait "$TIMEOUT" wait_for_offload \
  451. ip $IP_FLAG route show table local $LOCAL_IP_1
  452. check_err $?
  453. log_test "vxlan decap route - add local route"
  454. RET=0
  455. ip link set dev $swp1 nomaster
  456. busywait "$TIMEOUT" wait_for_offload \
  457. ip $IP_FLAG route show table local $LOCAL_IP_1
  458. check_err $?
  459. ip link set dev $swp2 nomaster
  460. busywait "$TIMEOUT" not wait_for_offload \
  461. ip $IP_FLAG route show table local $LOCAL_IP_1
  462. check_err $?
  463. ip link set dev $swp1 master br0
  464. ip link set dev $swp2 master br1
  465. busywait "$TIMEOUT" wait_for_offload \
  466. ip $IP_FLAG route show table local $LOCAL_IP_1
  467. check_err $?
  468. log_test "vxlan decap route - local ports enslavement"
  469. RET=0
  470. ip link del dev br0
  471. busywait "$TIMEOUT" wait_for_offload \
  472. ip $IP_FLAG route show table local $LOCAL_IP_1
  473. check_err $?
  474. ip link del dev br1
  475. busywait "$TIMEOUT" not wait_for_offload \
  476. ip $IP_FLAG route show table local $LOCAL_IP_1
  477. check_err $?
  478. log_test "vxlan decap route - bridge device deletion"
  479. RET=0
  480. ip link add name br0 type bridge mcast_snooping 0
  481. ip link set dev br0 addrgenmode none
  482. ip link set dev br0 up
  483. ip link add name br1 type bridge mcast_snooping 0
  484. ip link set dev br1 addrgenmode none
  485. ip link set dev br1 up
  486. ip link set dev $swp1 master br0
  487. ip link set dev $swp2 master br1
  488. ip link set dev vxlan0 master br0
  489. ip link set dev vxlan1 master br1
  490. busywait "$TIMEOUT" wait_for_offload \
  491. ip $IP_FLAG route show table local $LOCAL_IP_1
  492. check_err $?
  493. ip link del dev vxlan0
  494. busywait "$TIMEOUT" wait_for_offload \
  495. ip $IP_FLAG route show table local $LOCAL_IP_1
  496. check_err $?
  497. ip link del dev vxlan1
  498. busywait "$TIMEOUT" not wait_for_offload \
  499. ip $IP_FLAG route show table local $LOCAL_IP_1
  500. check_err $?
  501. log_test "vxlan decap route - vxlan device deletion"
  502. ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
  503. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  504. ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
  505. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  506. }
  507. check_fdb_offloaded()
  508. {
  509. local mac=00:11:22:33:44:55
  510. local zmac=00:00:00:00:00:00
  511. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \
  512. bridge fdb show dev vxlan0
  513. check_err $?
  514. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \
  515. bridge fdb show dev vxlan0
  516. check_err $?
  517. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
  518. bridge fdb show dev vxlan0
  519. check_err $?
  520. }
  521. check_vxlan_fdb_not_offloaded()
  522. {
  523. local mac=00:11:22:33:44:55
  524. local zmac=00:00:00:00:00:00
  525. bridge fdb show dev vxlan0 | grep $mac | grep -q self
  526. check_err $?
  527. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \
  528. bridge fdb show dev vxlan0
  529. check_err $?
  530. bridge fdb show dev vxlan0 | grep $zmac | grep -q self
  531. check_err $?
  532. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
  533. bridge fdb show dev vxlan0
  534. check_err $?
  535. }
  536. check_bridge_fdb_not_offloaded()
  537. {
  538. local mac=00:11:22:33:44:55
  539. local zmac=00:00:00:00:00:00
  540. bridge fdb show dev vxlan0 | grep $mac | grep -q master
  541. check_err $?
  542. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \
  543. bridge fdb show dev vxlan0
  544. check_err $?
  545. }
  546. __offload_indication_join_vxlan_first()
  547. {
  548. local vid=$1; shift
  549. local mac=00:11:22:33:44:55
  550. local zmac=00:00:00:00:00:00
  551. bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
  552. ip link set dev vxlan0 master br0
  553. bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2
  554. RET=0
  555. check_vxlan_fdb_not_offloaded
  556. ip link set dev $swp1 master br0
  557. sleep .1
  558. check_fdb_offloaded
  559. log_test "offload indication - attach vxlan first"
  560. RET=0
  561. ip link set dev vxlan0 down
  562. check_vxlan_fdb_not_offloaded
  563. check_bridge_fdb_not_offloaded
  564. log_test "offload indication - set vxlan down"
  565. RET=0
  566. ip link set dev vxlan0 up
  567. sleep .1
  568. check_fdb_offloaded
  569. log_test "offload indication - set vxlan up"
  570. if [[ ! -z $vid ]]; then
  571. RET=0
  572. bridge vlan del dev vxlan0 vid $vid
  573. check_vxlan_fdb_not_offloaded
  574. check_bridge_fdb_not_offloaded
  575. log_test "offload indication - delete VLAN"
  576. RET=0
  577. bridge vlan add dev vxlan0 vid $vid
  578. check_vxlan_fdb_not_offloaded
  579. check_bridge_fdb_not_offloaded
  580. log_test "offload indication - add tagged VLAN"
  581. RET=0
  582. bridge vlan add dev vxlan0 vid $vid pvid untagged
  583. sleep .1
  584. check_fdb_offloaded
  585. log_test "offload indication - add pvid/untagged VLAN"
  586. fi
  587. RET=0
  588. ip link set dev $swp1 nomaster
  589. check_vxlan_fdb_not_offloaded
  590. log_test "offload indication - detach port"
  591. }
  592. offload_indication_join_vxlan_first()
  593. {
  594. ip link add dev br0 type bridge mcast_snooping 0
  595. ip link set dev br0 addrgenmode none
  596. ip link set dev br0 up
  597. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  598. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  599. __offload_indication_join_vxlan_first
  600. ip link del dev vxlan0
  601. ip link del dev br0
  602. }
  603. __offload_indication_join_vxlan_last()
  604. {
  605. local zmac=00:00:00:00:00:00
  606. RET=0
  607. bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
  608. ip link set dev $swp1 master br0
  609. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
  610. bridge fdb show dev vxlan0
  611. check_err $?
  612. ip link set dev vxlan0 master br0
  613. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
  614. bridge fdb show dev vxlan0
  615. check_err $?
  616. log_test "offload indication - attach vxlan last"
  617. }
  618. offload_indication_join_vxlan_last()
  619. {
  620. ip link add dev br0 type bridge mcast_snooping 0
  621. ip link set dev br0 addrgenmode none
  622. ip link set dev br0 up
  623. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  624. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  625. __offload_indication_join_vxlan_last
  626. ip link del dev vxlan0
  627. ip link del dev br0
  628. }
  629. offload_indication_test()
  630. {
  631. offload_indication_setup_create
  632. offload_indication_fdb_test
  633. offload_indication_decap_route_test
  634. offload_indication_setup_destroy
  635. log_info "offload indication - replay & cleanup"
  636. offload_indication_join_vxlan_first
  637. offload_indication_join_vxlan_last
  638. }
  639. sanitization_vlan_aware_test()
  640. {
  641. RET=0
  642. ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
  643. ip link set dev br0 addrgenmode none
  644. ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
  645. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  646. ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
  647. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  648. # Test that when each VNI is mapped to a different VLAN we can enslave
  649. # a port to the bridge
  650. bridge vlan add vid 10 dev vxlan10 pvid untagged
  651. bridge vlan add vid 20 dev vxlan20 pvid untagged
  652. ip link set dev $swp1 master br0
  653. check_err $?
  654. log_test "vlan-aware - enslavement to vlan-aware bridge"
  655. # Try to map both VNIs to the same VLAN and make sure configuration
  656. # fails
  657. RET=0
  658. bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null
  659. check_fail $?
  660. log_test "vlan-aware - two vnis mapped to the same vlan"
  661. # Test that enslavement of a port to a bridge fails when two VNIs
  662. # are mapped to the same VLAN
  663. RET=0
  664. ip link set dev $swp1 nomaster
  665. bridge vlan del vid 20 dev vxlan20 pvid untagged
  666. bridge vlan add vid 10 dev vxlan20 pvid untagged
  667. ip link set dev $swp1 master br0 &> /dev/null
  668. check_fail $?
  669. log_test "vlan-aware - failed enslavement to vlan-aware bridge"
  670. bridge vlan del vid 10 dev vxlan20
  671. bridge vlan add vid 20 dev vxlan20 pvid untagged
  672. # Test that when two VXLAN tunnels with conflicting configurations
  673. # (i.e., different TTL) are enslaved to the same VLAN-aware bridge,
  674. # then the enslavement of a port to the bridge is denied.
  675. # Use the offload indication of the local route to ensure the VXLAN
  676. # configuration was correctly rollbacked.
  677. ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
  678. ip link set dev vxlan10 type vxlan ttl 10
  679. ip link set dev $swp1 master br0 &> /dev/null
  680. check_fail $?
  681. busywait "$TIMEOUT" not wait_for_offload \
  682. ip $IP_FLAG route show table local $LOCAL_IP_1
  683. check_err $?
  684. log_test "vlan-aware - failed enslavement to bridge due to conflict"
  685. ip link set dev vxlan10 type vxlan ttl 20
  686. ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
  687. ip link del dev vxlan20
  688. ip link del dev vxlan10
  689. ip link del dev br0
  690. }
  691. offload_indication_vlan_aware_setup_create()
  692. {
  693. # Create a simple setup with two VxLAN devices and a single VLAN-aware
  694. # bridge
  695. ip link add name br0 type bridge mcast_snooping 0 vlan_filtering 1 \
  696. vlan_default_pvid 0
  697. ip link set dev br0 addrgenmode none
  698. ip link set dev br0 up
  699. ip link set dev $swp1 master br0
  700. bridge vlan add vid 10 dev $swp1
  701. bridge vlan add vid 20 dev $swp1
  702. ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
  703. ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
  704. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  705. ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
  706. $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  707. bridge vlan add vid 10 dev vxlan10 pvid untagged
  708. bridge vlan add vid 20 dev vxlan20 pvid untagged
  709. }
  710. offload_indication_vlan_aware_setup_destroy()
  711. {
  712. bridge vlan del vid 20 dev vxlan20
  713. bridge vlan del vid 10 dev vxlan10
  714. ip link del dev vxlan20
  715. ip link del dev vxlan10
  716. ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
  717. bridge vlan del vid 20 dev $swp1
  718. bridge vlan del vid 10 dev $swp1
  719. ip link set dev $swp1 nomaster
  720. ip link del dev br0
  721. }
  722. offload_indication_vlan_aware_fdb_test()
  723. {
  724. RET=0
  725. log_info "vxlan entry offload indication - vlan-aware"
  726. bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
  727. dst $LOCAL_IP_2 vlan 10
  728. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  729. de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
  730. check_err $?
  731. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  732. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
  733. check_err $?
  734. log_test "vxlan entry offload indication - initial state"
  735. # Remove FDB entry from the bridge driver and check that corresponding
  736. # entry in the VxLAN driver is not marked as offloaded
  737. RET=0
  738. bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10
  739. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
  740. de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
  741. check_err $?
  742. log_test "vxlan entry offload indication - after removal from bridge"
  743. # Add the FDB entry back to the bridge driver and make sure it is
  744. # marked as offloaded in both drivers
  745. RET=0
  746. bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10
  747. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  748. de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
  749. check_err $?
  750. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  751. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
  752. check_err $?
  753. log_test "vxlan entry offload indication - after re-add to bridge"
  754. # Remove FDB entry from the VxLAN driver and check that corresponding
  755. # entry in the bridge driver is not marked as offloaded
  756. RET=0
  757. bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self
  758. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
  759. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
  760. check_err $?
  761. log_test "vxlan entry offload indication - after removal from vxlan"
  762. # Add the FDB entry back to the VxLAN driver and make sure it is
  763. # marked as offloaded in both drivers
  764. RET=0
  765. bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst $LOCAL_IP_2
  766. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  767. de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
  768. check_err $?
  769. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
  770. de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
  771. check_err $?
  772. log_test "vxlan entry offload indication - after re-add to vxlan"
  773. bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10
  774. }
  775. offload_indication_vlan_aware_decap_route_test()
  776. {
  777. RET=0
  778. busywait "$TIMEOUT" wait_for_offload \
  779. ip $IP_FLAG route show table local $LOCAL_IP_1
  780. check_err $?
  781. # Toggle PVID flag on one VxLAN device and make sure route is still
  782. # marked as offloaded
  783. bridge vlan add vid 10 dev vxlan10 untagged
  784. busywait "$TIMEOUT" wait_for_offload \
  785. ip $IP_FLAG route show table local $LOCAL_IP_1
  786. check_err $?
  787. # Toggle PVID flag on second VxLAN device and make sure route is no
  788. # longer marked as offloaded
  789. bridge vlan add vid 20 dev vxlan20 untagged
  790. busywait "$TIMEOUT" not wait_for_offload \
  791. ip $IP_FLAG route show table local $LOCAL_IP_1
  792. check_err $?
  793. # Toggle PVID flag back and make sure route is marked as offloaded
  794. bridge vlan add vid 10 dev vxlan10 pvid untagged
  795. bridge vlan add vid 20 dev vxlan20 pvid untagged
  796. busywait "$TIMEOUT" wait_for_offload ip $IP_FLAG route show table local \
  797. $LOCAL_IP_1
  798. check_err $?
  799. log_test "vxlan decap route - vni map/unmap"
  800. }
  801. offload_indication_vlan_aware_join_vxlan_first()
  802. {
  803. ip link add dev br0 type bridge mcast_snooping 0 \
  804. vlan_filtering 1 vlan_default_pvid 1
  805. ip link set dev br0 addrgenmode none
  806. ip link set dev br0 up
  807. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  808. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  809. __offload_indication_join_vxlan_first 1
  810. ip link del dev vxlan0
  811. ip link del dev br0
  812. }
  813. offload_indication_vlan_aware_join_vxlan_last()
  814. {
  815. ip link add dev br0 type bridge mcast_snooping 0 \
  816. vlan_filtering 1 vlan_default_pvid 1
  817. ip link set dev br0 addrgenmode none
  818. ip link set dev br0 up
  819. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  820. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  821. __offload_indication_join_vxlan_last
  822. ip link del dev vxlan0
  823. ip link del dev br0
  824. }
  825. offload_indication_vlan_aware_l3vni_test()
  826. {
  827. local zmac=00:00:00:00:00:00
  828. RET=0
  829. sysctl_set net.ipv6.conf.default.disable_ipv6 1
  830. ip link add dev br0 type bridge mcast_snooping 0 \
  831. vlan_filtering 1 vlan_default_pvid 0
  832. ip link set dev br0 addrgenmode none
  833. ip link set dev br0 up
  834. ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
  835. ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
  836. ip link set dev $swp1 master br0
  837. # The test will use the offload indication on the FDB entry to
  838. # understand if the tunnel is offloaded or not
  839. bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
  840. ip link set dev vxlan0 master br0
  841. bridge vlan add dev vxlan0 vid 10 pvid untagged
  842. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
  843. bridge fdb show brport vxlan0
  844. check_err $? "vxlan tunnel not offloaded when should"
  845. # Configure a VLAN interface and make sure tunnel is offloaded
  846. ip link add link br0 name br10 up type vlan id 10
  847. sysctl_set net.ipv6.conf.br10.disable_ipv6 0
  848. ip -6 address add 2001:db8:1::1/64 dev br10
  849. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
  850. bridge fdb show brport vxlan0
  851. check_err $? "vxlan tunnel not offloaded when should"
  852. # Unlink the VXLAN device, make sure tunnel is no longer offloaded,
  853. # then add it back to the bridge and make sure it is offloaded
  854. ip link set dev vxlan0 nomaster
  855. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
  856. bridge fdb show brport vxlan0
  857. check_err $? "vxlan tunnel offloaded after unlinked from bridge"
  858. ip link set dev vxlan0 master br0
  859. busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
  860. bridge fdb show brport vxlan0
  861. check_err $? "vxlan tunnel offloaded despite no matching vid"
  862. bridge vlan add dev vxlan0 vid 10 pvid untagged
  863. busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
  864. bridge fdb show brport vxlan0
  865. check_err $? "vxlan tunnel not offloaded after adding vid"
  866. log_test "vxlan - l3 vni"
  867. ip link del dev vxlan0
  868. ip link del dev br0
  869. sysctl_restore net.ipv6.conf.default.disable_ipv6
  870. }
  871. offload_indication_vlan_aware_test()
  872. {
  873. offload_indication_vlan_aware_setup_create
  874. offload_indication_vlan_aware_fdb_test
  875. offload_indication_vlan_aware_decap_route_test
  876. offload_indication_vlan_aware_setup_destroy
  877. log_info "offload indication - replay & cleanup - vlan aware"
  878. offload_indication_vlan_aware_join_vxlan_first
  879. offload_indication_vlan_aware_join_vxlan_last
  880. offload_indication_vlan_aware_l3vni_test
  881. }
  882. trap cleanup EXIT
  883. setup_prepare
  884. setup_wait
  885. tests_run
  886. exit $EXIT_STATUS