bridge_igmp.sh 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ALL_TESTS="
  4. v2reportleave_test
  5. v3include_test
  6. v3inc_allow_test
  7. v3inc_is_include_test
  8. v3inc_is_exclude_test
  9. v3inc_to_exclude_test
  10. v3exc_allow_test
  11. v3exc_is_include_test
  12. v3exc_is_exclude_test
  13. v3exc_to_exclude_test
  14. v3inc_block_test
  15. v3exc_block_test
  16. v3exc_timeout_test
  17. v3star_ex_auto_add_test
  18. v2per_vlan_snooping_port_stp_test
  19. v2per_vlan_snooping_vlan_stp_test
  20. "
  21. NUM_NETIFS=4
  22. CHECK_TC="yes"
  23. TEST_GROUP="239.10.10.10"
  24. TEST_GROUP_MAC="01:00:5e:0a:0a:0a"
  25. ALL_GROUP="224.0.0.1"
  26. ALL_MAC="01:00:5e:00:00:01"
  27. # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.1,192.0.2.2,192.0.2.3
  28. MZPKT_IS_INC="22:00:9d:de:00:00:00:01:01:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:02:c0:00:02:03"
  29. # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.10,192.0.2.11,192.0.2.12
  30. MZPKT_IS_INC2="22:00:9d:c3:00:00:00:01:01:00:00:03:ef:0a:0a:0a:c0:00:02:0a:c0:00:02:0b:c0:00:02:0c"
  31. # IGMPv3 is_in report: grp 239.10.10.10 is_include 192.0.2.20,192.0.2.30
  32. MZPKT_IS_INC3="22:00:5f:b4:00:00:00:01:01:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e"
  33. # IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.10,192.0.2.11,192.0.2.12
  34. MZPKT_ALLOW="22:00:99:c3:00:00:00:01:05:00:00:03:ef:0a:0a:0a:c0:00:02:0a:c0:00:02:0b:c0:00:02:0c"
  35. # IGMPv3 allow report: grp 239.10.10.10 allow 192.0.2.20,192.0.2.30
  36. MZPKT_ALLOW2="22:00:5b:b4:00:00:00:01:05:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e"
  37. # IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.1,192.0.2.2,192.0.2.20,192.0.2.21
  38. MZPKT_IS_EXC="22:00:da:b6:00:00:00:01:02:00:00:04:ef:0a:0a:0a:c0:00:02:01:c0:00:02:02:c0:00:02:14:c0:00:02:15"
  39. # IGMPv3 is_ex report: grp 239.10.10.10 is_exclude 192.0.2.20,192.0.2.30
  40. MZPKT_IS_EXC2="22:00:5e:b4:00:00:00:01:02:00:00:02:ef:0a:0a:0a:c0:00:02:14:c0:00:02:1e"
  41. # IGMPv3 to_ex report: grp 239.10.10.10 to_exclude 192.0.2.1,192.0.2.20,192.0.2.30
  42. MZPKT_TO_EXC="22:00:9a:b1:00:00:00:01:04:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:14:c0:00:02:1e"
  43. # IGMPv3 block report: grp 239.10.10.10 block 192.0.2.1,192.0.2.20,192.0.2.30
  44. MZPKT_BLOCK="22:00:98:b1:00:00:00:01:06:00:00:03:ef:0a:0a:0a:c0:00:02:01:c0:00:02:14:c0:00:02:1e"
  45. source lib.sh
  46. h1_create()
  47. {
  48. simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
  49. }
  50. h1_destroy()
  51. {
  52. simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
  53. }
  54. h2_create()
  55. {
  56. simple_if_init $h2 192.0.2.2/24 2001:db8:1::2/64
  57. }
  58. h2_destroy()
  59. {
  60. simple_if_fini $h2 192.0.2.2/24 2001:db8:1::2/64
  61. }
  62. switch_create()
  63. {
  64. ip link add dev br0 type bridge mcast_snooping 1 mcast_querier 1
  65. ip link set dev $swp1 master br0
  66. ip link set dev $swp2 master br0
  67. ip link set dev br0 up
  68. ip link set dev $swp1 up
  69. ip link set dev $swp2 up
  70. }
  71. switch_destroy()
  72. {
  73. ip link set dev $swp2 down
  74. ip link set dev $swp1 down
  75. ip link del dev br0
  76. }
  77. setup_prepare()
  78. {
  79. h1=${NETIFS[p1]}
  80. swp1=${NETIFS[p2]}
  81. swp2=${NETIFS[p3]}
  82. h2=${NETIFS[p4]}
  83. vrf_prepare
  84. h1_create
  85. h2_create
  86. switch_create
  87. }
  88. cleanup()
  89. {
  90. pre_cleanup
  91. switch_destroy
  92. h2_destroy
  93. h1_destroy
  94. vrf_cleanup
  95. }
  96. v2reportleave_test()
  97. {
  98. RET=0
  99. ip address add dev $h2 $TEST_GROUP/32 autojoin
  100. check_err $? "Could not join $TEST_GROUP"
  101. sleep 5
  102. bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null
  103. check_err $? "IGMPv2 report didn't create mdb entry for $TEST_GROUP"
  104. mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2
  105. check_fail $? "Traffic to $TEST_GROUP wasn't forwarded"
  106. log_test "IGMPv2 report $TEST_GROUP"
  107. RET=0
  108. bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null
  109. check_err $? "mdb entry for $TEST_GROUP is missing"
  110. ip address del dev $h2 $TEST_GROUP/32
  111. check_err $? "Could not leave $TEST_GROUP"
  112. sleep 5
  113. bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null
  114. check_fail $? "Leave didn't delete mdb entry for $TEST_GROUP"
  115. mcast_packet_test $TEST_GROUP_MAC 192.0.2.1 $TEST_GROUP $h1 $h2
  116. check_err $? "Traffic to $TEST_GROUP was forwarded without mdb entry"
  117. log_test "IGMPv2 leave $TEST_GROUP"
  118. }
  119. v3include_prepare()
  120. {
  121. local host1_if=$1
  122. local mac=$2
  123. local group=$3
  124. local X=("192.0.2.1" "192.0.2.2" "192.0.2.3")
  125. ip link set dev br0 type bridge mcast_igmp_version 3
  126. check_err $? "Could not change bridge IGMP version to 3"
  127. $MZ $host1_if -b $mac -c 1 -B $group -t ip "proto=2,p=$MZPKT_IS_INC" -q
  128. sleep 1
  129. bridge -j -d -s mdb show dev br0 \
  130. | jq -e ".[].mdb[] | \
  131. select(.grp == \"$TEST_GROUP\" and .source_list != null)" &>/dev/null
  132. check_err $? "Missing *,G entry with source list"
  133. bridge -j -d -s mdb show dev br0 \
  134. | jq -e ".[].mdb[] | \
  135. select(.grp == \"$TEST_GROUP\" and \
  136. .source_list != null and .filter_mode == \"include\")" &>/dev/null
  137. check_err $? "Wrong *,G entry filter mode"
  138. brmcast_check_sg_entries "is_include" "${X[@]}"
  139. }
  140. v3exclude_prepare()
  141. {
  142. local host1_if=$1
  143. local mac=$2
  144. local group=$3
  145. local pkt=$4
  146. local X=("192.0.2.1" "192.0.2.2")
  147. local Y=("192.0.2.20" "192.0.2.21")
  148. v3include_prepare $host1_if $mac $group
  149. $MZ $host1_if -c 1 -b $mac -B $group -t ip "proto=2,p=$MZPKT_IS_EXC" -q
  150. sleep 1
  151. bridge -j -d -s mdb show dev br0 \
  152. | jq -e ".[].mdb[] | \
  153. select(.grp == \"$TEST_GROUP\" and \
  154. .source_list != null and .filter_mode == \"exclude\")" &>/dev/null
  155. check_err $? "Wrong *,G entry filter mode"
  156. brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}"
  157. brmcast_check_sg_state 0 "${X[@]}"
  158. brmcast_check_sg_state 1 "${Y[@]}"
  159. bridge -j -d -s mdb show dev br0 \
  160. | jq -e ".[].mdb[] | \
  161. select(.grp == \"$TEST_GROUP\" and \
  162. .source_list != null and
  163. .source_list[].address == \"192.0.2.3\")" &>/dev/null
  164. check_fail $? "Wrong *,G entry source list, 192.0.2.3 entry still exists"
  165. }
  166. v3cleanup()
  167. {
  168. local port=$1
  169. local group=$2
  170. bridge mdb del dev br0 port $port grp $group
  171. ip link set dev br0 type bridge mcast_igmp_version 2
  172. }
  173. v3include_test()
  174. {
  175. RET=0
  176. local X=("192.0.2.1" "192.0.2.2" "192.0.2.3")
  177. v3include_prepare $h1 $ALL_MAC $ALL_GROUP
  178. brmcast_check_sg_state 0 "${X[@]}"
  179. brmcast_check_sg_fwding 1 "${X[@]}"
  180. brmcast_check_sg_fwding 0 "192.0.2.100"
  181. log_test "IGMPv3 report $TEST_GROUP is_include"
  182. v3cleanup $swp1 $TEST_GROUP
  183. }
  184. v3inc_allow_test()
  185. {
  186. RET=0
  187. local X=("192.0.2.10" "192.0.2.11" "192.0.2.12")
  188. v3include_prepare $h1 $ALL_MAC $ALL_GROUP
  189. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW" -q
  190. sleep 1
  191. brmcast_check_sg_entries "allow" "${X[@]}"
  192. brmcast_check_sg_state 0 "${X[@]}"
  193. brmcast_check_sg_fwding 1 "${X[@]}"
  194. brmcast_check_sg_fwding 0 "192.0.2.100"
  195. log_test "IGMPv3 report $TEST_GROUP include -> allow"
  196. v3cleanup $swp1 $TEST_GROUP
  197. }
  198. v3inc_is_include_test()
  199. {
  200. RET=0
  201. local X=("192.0.2.10" "192.0.2.11" "192.0.2.12")
  202. v3include_prepare $h1 $ALL_MAC $ALL_GROUP
  203. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC2" -q
  204. sleep 1
  205. brmcast_check_sg_entries "is_include" "${X[@]}"
  206. brmcast_check_sg_state 0 "${X[@]}"
  207. brmcast_check_sg_fwding 1 "${X[@]}"
  208. brmcast_check_sg_fwding 0 "192.0.2.100"
  209. log_test "IGMPv3 report $TEST_GROUP include -> is_include"
  210. v3cleanup $swp1 $TEST_GROUP
  211. }
  212. v3inc_is_exclude_test()
  213. {
  214. RET=0
  215. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  216. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  217. brmcast_check_sg_fwding 0 "${Y[@]}"
  218. log_test "IGMPv3 report $TEST_GROUP include -> is_exclude"
  219. v3cleanup $swp1 $TEST_GROUP
  220. }
  221. v3inc_to_exclude_test()
  222. {
  223. RET=0
  224. local X=("192.0.2.1")
  225. local Y=("192.0.2.20" "192.0.2.30")
  226. v3include_prepare $h1 $ALL_MAC $ALL_GROUP
  227. ip link set dev br0 type bridge mcast_last_member_interval 500
  228. check_err $? "Could not change mcast_last_member_interval to 5s"
  229. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q
  230. sleep 1
  231. bridge -j -d -s mdb show dev br0 \
  232. | jq -e ".[].mdb[] | \
  233. select(.grp == \"$TEST_GROUP\" and \
  234. .source_list != null and .filter_mode == \"exclude\")" &>/dev/null
  235. check_err $? "Wrong *,G entry filter mode"
  236. brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}"
  237. brmcast_check_sg_state 0 "${X[@]}"
  238. brmcast_check_sg_state 1 "${Y[@]}"
  239. bridge -j -d -s mdb show dev br0 \
  240. | jq -e ".[].mdb[] | \
  241. select(.grp == \"$TEST_GROUP\" and \
  242. .source_list != null and
  243. .source_list[].address == \"192.0.2.2\")" &>/dev/null
  244. check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists"
  245. bridge -j -d -s mdb show dev br0 \
  246. | jq -e ".[].mdb[] | \
  247. select(.grp == \"$TEST_GROUP\" and \
  248. .source_list != null and
  249. .source_list[].address == \"192.0.2.21\")" &>/dev/null
  250. check_fail $? "Wrong *,G entry source list, 192.0.2.21 entry still exists"
  251. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  252. brmcast_check_sg_fwding 0 "${Y[@]}"
  253. log_test "IGMPv3 report $TEST_GROUP include -> to_exclude"
  254. ip link set dev br0 type bridge mcast_last_member_interval 100
  255. v3cleanup $swp1 $TEST_GROUP
  256. }
  257. v3exc_allow_test()
  258. {
  259. RET=0
  260. local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30")
  261. local Y=("192.0.2.21")
  262. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  263. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q
  264. sleep 1
  265. brmcast_check_sg_entries "allow" "${X[@]}" "${Y[@]}"
  266. brmcast_check_sg_state 0 "${X[@]}"
  267. brmcast_check_sg_state 1 "${Y[@]}"
  268. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  269. brmcast_check_sg_fwding 0 "${Y[@]}"
  270. log_test "IGMPv3 report $TEST_GROUP exclude -> allow"
  271. v3cleanup $swp1 $TEST_GROUP
  272. }
  273. v3exc_is_include_test()
  274. {
  275. RET=0
  276. local X=("192.0.2.1" "192.0.2.2" "192.0.2.20" "192.0.2.30")
  277. local Y=("192.0.2.21")
  278. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  279. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC3" -q
  280. sleep 1
  281. brmcast_check_sg_entries "is_include" "${X[@]}" "${Y[@]}"
  282. brmcast_check_sg_state 0 "${X[@]}"
  283. brmcast_check_sg_state 1 "${Y[@]}"
  284. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  285. brmcast_check_sg_fwding 0 "${Y[@]}"
  286. log_test "IGMPv3 report $TEST_GROUP exclude -> is_include"
  287. v3cleanup $swp1 $TEST_GROUP
  288. }
  289. v3exc_is_exclude_test()
  290. {
  291. RET=0
  292. local X=("192.0.2.30")
  293. local Y=("192.0.2.20")
  294. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  295. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_EXC2" -q
  296. sleep 1
  297. brmcast_check_sg_entries "is_exclude" "${X[@]}" "${Y[@]}"
  298. brmcast_check_sg_state 0 "${X[@]}"
  299. brmcast_check_sg_state 1 "${Y[@]}"
  300. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  301. brmcast_check_sg_fwding 0 "${Y[@]}"
  302. log_test "IGMPv3 report $TEST_GROUP exclude -> is_exclude"
  303. v3cleanup $swp1 $TEST_GROUP
  304. }
  305. v3exc_to_exclude_test()
  306. {
  307. RET=0
  308. local X=("192.0.2.1" "192.0.2.30")
  309. local Y=("192.0.2.20")
  310. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  311. ip link set dev br0 type bridge mcast_last_member_interval 500
  312. check_err $? "Could not change mcast_last_member_interval to 5s"
  313. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_TO_EXC" -q
  314. sleep 1
  315. brmcast_check_sg_entries "to_exclude" "${X[@]}" "${Y[@]}"
  316. brmcast_check_sg_state 0 "${X[@]}"
  317. brmcast_check_sg_state 1 "${Y[@]}"
  318. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  319. brmcast_check_sg_fwding 0 "${Y[@]}"
  320. log_test "IGMPv3 report $TEST_GROUP exclude -> to_exclude"
  321. ip link set dev br0 type bridge mcast_last_member_interval 100
  322. v3cleanup $swp1 $TEST_GROUP
  323. }
  324. v3inc_block_test()
  325. {
  326. RET=0
  327. local X=("192.0.2.2" "192.0.2.3")
  328. v3include_prepare $h1 $ALL_MAC $ALL_GROUP
  329. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q
  330. # make sure the lowered timers have expired (by default 2 seconds)
  331. sleep 3
  332. brmcast_check_sg_entries "block" "${X[@]}"
  333. brmcast_check_sg_state 0 "${X[@]}"
  334. bridge -j -d -s mdb show dev br0 \
  335. | jq -e ".[].mdb[] | \
  336. select(.grp == \"$TEST_GROUP\" and \
  337. .source_list != null and
  338. .source_list[].address == \"192.0.2.1\")" &>/dev/null
  339. check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists"
  340. brmcast_check_sg_fwding 1 "${X[@]}"
  341. brmcast_check_sg_fwding 0 "192.0.2.100"
  342. log_test "IGMPv3 report $TEST_GROUP include -> block"
  343. v3cleanup $swp1 $TEST_GROUP
  344. }
  345. v3exc_block_test()
  346. {
  347. RET=0
  348. local X=("192.0.2.1" "192.0.2.2" "192.0.2.30")
  349. local Y=("192.0.2.20" "192.0.2.21")
  350. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  351. ip link set dev br0 type bridge mcast_last_member_interval 500
  352. check_err $? "Could not change mcast_last_member_interval to 5s"
  353. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_BLOCK" -q
  354. sleep 1
  355. brmcast_check_sg_entries "block" "${X[@]}" "${Y[@]}"
  356. brmcast_check_sg_state 0 "${X[@]}"
  357. brmcast_check_sg_state 1 "${Y[@]}"
  358. brmcast_check_sg_fwding 1 "${X[@]}" 192.0.2.100
  359. brmcast_check_sg_fwding 0 "${Y[@]}"
  360. log_test "IGMPv3 report $TEST_GROUP exclude -> block"
  361. ip link set dev br0 type bridge mcast_last_member_interval 100
  362. v3cleanup $swp1 $TEST_GROUP
  363. }
  364. v3exc_timeout_test()
  365. {
  366. RET=0
  367. local X=("192.0.2.20" "192.0.2.30")
  368. # GMI should be 5 seconds
  369. ip link set dev br0 type bridge mcast_query_interval 100 \
  370. mcast_query_response_interval 100 \
  371. mcast_membership_interval 500
  372. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  373. ip link set dev br0 type bridge mcast_query_interval 500 \
  374. mcast_query_response_interval 500 \
  375. mcast_membership_interval 1500
  376. $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q
  377. sleep 5
  378. bridge -j -d -s mdb show dev br0 \
  379. | jq -e ".[].mdb[] | \
  380. select(.grp == \"$TEST_GROUP\" and \
  381. .source_list != null and .filter_mode == \"include\")" &>/dev/null
  382. check_err $? "Wrong *,G entry filter mode"
  383. bridge -j -d -s mdb show dev br0 \
  384. | jq -e ".[].mdb[] | \
  385. select(.grp == \"$TEST_GROUP\" and \
  386. .source_list != null and
  387. .source_list[].address == \"192.0.2.1\")" &>/dev/null
  388. check_fail $? "Wrong *,G entry source list, 192.0.2.1 entry still exists"
  389. bridge -j -d -s mdb show dev br0 \
  390. | jq -e ".[].mdb[] | \
  391. select(.grp == \"$TEST_GROUP\" and \
  392. .source_list != null and
  393. .source_list[].address == \"192.0.2.2\")" &>/dev/null
  394. check_fail $? "Wrong *,G entry source list, 192.0.2.2 entry still exists"
  395. brmcast_check_sg_entries "allow" "${X[@]}"
  396. brmcast_check_sg_state 0 "${X[@]}"
  397. brmcast_check_sg_fwding 1 "${X[@]}"
  398. brmcast_check_sg_fwding 0 192.0.2.100
  399. log_test "IGMPv3 group $TEST_GROUP exclude timeout"
  400. ip link set dev br0 type bridge mcast_query_interval 12500 \
  401. mcast_query_response_interval 1000 \
  402. mcast_membership_interval 26000
  403. v3cleanup $swp1 $TEST_GROUP
  404. }
  405. v3star_ex_auto_add_test()
  406. {
  407. RET=0
  408. v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP
  409. $MZ $h2 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_IS_INC" -q
  410. sleep 1
  411. bridge -j -d -s mdb show dev br0 \
  412. | jq -e ".[].mdb[] | \
  413. select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \
  414. .port == \"$swp1\")" &>/dev/null
  415. check_err $? "S,G entry for *,G port doesn't exist"
  416. bridge -j -d -s mdb show dev br0 \
  417. | jq -e ".[].mdb[] | \
  418. select(.grp == \"$TEST_GROUP\" and .src == \"192.0.2.3\" and \
  419. .port == \"$swp1\" and \
  420. .flags[] == \"added_by_star_ex\")" &>/dev/null
  421. check_err $? "Auto-added S,G entry doesn't have added_by_star_ex flag"
  422. brmcast_check_sg_fwding 1 192.0.2.3
  423. log_test "IGMPv3 S,G port entry automatic add to a *,G port"
  424. v3cleanup $swp1 $TEST_GROUP
  425. v3cleanup $swp2 $TEST_GROUP
  426. }
  427. v2per_vlan_snooping_stp_test()
  428. {
  429. local is_port=$1
  430. local msg="port"
  431. [[ $is_port -ne 1 ]] && msg="vlan"
  432. ip link set br0 up type bridge vlan_filtering 1 \
  433. mcast_igmp_version 2 \
  434. mcast_snooping 1 \
  435. mcast_vlan_snooping 1 \
  436. mcast_querier 1 \
  437. mcast_stats_enabled 1
  438. bridge vlan global set vid 1 dev br0 \
  439. mcast_snooping 1 \
  440. mcast_querier 1 \
  441. mcast_query_interval 100 \
  442. mcast_startup_query_count 0
  443. [[ $is_port -eq 1 ]] && bridge link set dev $swp1 state 0
  444. [[ $is_port -ne 1 ]] && bridge vlan set vid 1 dev $swp1 state 4
  445. sleep 5
  446. local tx_s=$(ip -j -p stats show dev $swp1 \
  447. group xstats_slave subgroup bridge suite mcast \
  448. | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]')
  449. [[ $is_port -eq 1 ]] && bridge link set dev $swp1 state 3
  450. [[ $is_port -ne 1 ]] && bridge vlan set vid 1 dev $swp1 state 3
  451. sleep 5
  452. local tx_e=$(ip -j -p stats show dev $swp1 \
  453. group xstats_slave subgroup bridge suite mcast \
  454. | jq '.[]["multicast"]["igmp_queries"]["tx_v2"]')
  455. RET=0
  456. local tx=$(expr $tx_e - $tx_s)
  457. test $tx -gt 0
  458. check_err $? "No IGMP queries after STP state becomes forwarding"
  459. log_test "per vlan snooping with $msg stp state change"
  460. # restore settings
  461. bridge vlan global set vid 1 dev br0 \
  462. mcast_querier 0 \
  463. mcast_query_interval 12500 \
  464. mcast_startup_query_count 2
  465. ip link set br0 up type bridge vlan_filtering 0 \
  466. mcast_vlan_snooping 0 \
  467. mcast_stats_enabled 0
  468. }
  469. v2per_vlan_snooping_port_stp_test()
  470. {
  471. v2per_vlan_snooping_stp_test 1
  472. }
  473. v2per_vlan_snooping_vlan_stp_test()
  474. {
  475. v2per_vlan_snooping_stp_test 0
  476. }
  477. trap cleanup EXIT
  478. setup_prepare
  479. setup_wait
  480. tests_run
  481. exit $EXIT_STATUS