Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Merge in the fixes we had queued in case there was another -rc.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+233 -39
+8
drivers/net/ethernet/amd/xgbe/xgbe-common.h
··· 1331 1331 #define MDIO_VEND2_PMA_CDR_CONTROL 0x8056 1332 1332 #endif 1333 1333 1334 + #ifndef MDIO_VEND2_PMA_MISC_CTRL0 1335 + #define MDIO_VEND2_PMA_MISC_CTRL0 0x8090 1336 + #endif 1337 + 1334 1338 #ifndef MDIO_CTRL1_SPEED1G 1335 1339 #define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) 1336 1340 #endif ··· 1392 1388 #define XGBE_PMA_RX_RST_0_MASK BIT(4) 1393 1389 #define XGBE_PMA_RX_RST_0_RESET_ON 0x10 1394 1390 #define XGBE_PMA_RX_RST_0_RESET_OFF 0x00 1391 + 1392 + #define XGBE_PMA_PLL_CTRL_MASK BIT(15) 1393 + #define XGBE_PMA_PLL_CTRL_ENABLE BIT(15) 1394 + #define XGBE_PMA_PLL_CTRL_DISABLE 0x0000 1395 1395 1396 1396 /* Bit setting and getting macros 1397 1397 * The get macro will extract the current bit field value from within
+19 -1
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
··· 1977 1977 } 1978 1978 } 1979 1979 1980 + static void xgbe_phy_pll_ctrl(struct xgbe_prv_data *pdata, bool enable) 1981 + { 1982 + XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_MISC_CTRL0, 1983 + XGBE_PMA_PLL_CTRL_MASK, 1984 + enable ? XGBE_PMA_PLL_CTRL_ENABLE 1985 + : XGBE_PMA_PLL_CTRL_DISABLE); 1986 + 1987 + /* Wait for command to complete */ 1988 + usleep_range(100, 200); 1989 + } 1990 + 1980 1991 static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, 1981 1992 unsigned int cmd, unsigned int sub_cmd) 1982 1993 { 1983 1994 unsigned int s0 = 0; 1984 1995 unsigned int wait; 1996 + 1997 + /* Disable PLL re-initialization during FW command processing */ 1998 + xgbe_phy_pll_ctrl(pdata, false); 1985 1999 1986 2000 /* Log if a previous command did not complete */ 1987 2001 if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) { ··· 2017 2003 wait = XGBE_RATECHANGE_COUNT; 2018 2004 while (wait--) { 2019 2005 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) 2020 - return; 2006 + goto reenable_pll; 2021 2007 2022 2008 usleep_range(1000, 2000); 2023 2009 } ··· 2027 2013 2028 2014 /* Reset on error */ 2029 2015 xgbe_phy_rx_reset(pdata); 2016 + 2017 + reenable_pll: 2018 + /* Enable PLL re-initialization */ 2019 + xgbe_phy_pll_ctrl(pdata, true); 2030 2020 } 2031 2021 2032 2022 static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
+12 -9
drivers/net/ethernet/ibm/ibmvnic.c
··· 1914 1914 ind_bufp = &tx_scrq->ind_buf; 1915 1915 1916 1916 if (test_bit(0, &adapter->resetting)) { 1917 - if (!netif_subqueue_stopped(netdev, skb)) 1918 - netif_stop_subqueue(netdev, queue_num); 1919 1917 dev_kfree_skb_any(skb); 1920 1918 1921 1919 tx_send_failed++; ··· 2755 2757 2756 2758 if (adapter->state == VNIC_PROBING) { 2757 2759 netdev_warn(netdev, "Adapter reset during probe\n"); 2758 - adapter->init_done_rc = EAGAIN; 2760 + adapter->init_done_rc = -EAGAIN; 2759 2761 ret = EAGAIN; 2760 2762 goto err; 2761 2763 } ··· 5257 5259 */ 5258 5260 adapter->login_pending = false; 5259 5261 5260 - if (!completion_done(&adapter->init_done)) { 5261 - complete(&adapter->init_done); 5262 - adapter->init_done_rc = -EIO; 5263 - } 5264 - 5265 5262 if (adapter->state == VNIC_DOWN) 5266 5263 rc = ibmvnic_reset(adapter, VNIC_RESET_PASSIVE_INIT); 5267 5264 else ··· 5277 5284 rc); 5278 5285 adapter->failover_pending = false; 5279 5286 } 5287 + 5288 + if (!completion_done(&adapter->init_done)) { 5289 + complete(&adapter->init_done); 5290 + if (!adapter->init_done_rc) 5291 + adapter->init_done_rc = -EAGAIN; 5292 + } 5293 + 5280 5294 break; 5281 5295 case IBMVNIC_CRQ_INIT_COMPLETE: 5282 5296 dev_info(dev, "Partner initialization complete\n"); ··· 5604 5604 crq->cur = 0; 5605 5605 spin_lock_init(&crq->lock); 5606 5606 5607 + /* process any CRQs that were queued before we enabled interrupts */ 5608 + tasklet_schedule(&adapter->tasklet); 5609 + 5607 5610 return retrc; 5608 5611 5609 5612 req_irq_failed: ··· 5756 5753 } 5757 5754 5758 5755 rc = ibmvnic_reset_init(adapter, false); 5759 - } while (rc == EAGAIN); 5756 + } while (rc == -EAGAIN); 5760 5757 5761 5758 /* We are ignoring the error from ibmvnic_reset_init() assuming that the 5762 5759 * partner is not ready. CRQ is not active. When the partner becomes
+2 -6
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
··· 2067 2067 if (napi_complete_done(napi, pkts_polled)) 2068 2068 nfp_net_irq_unmask(r_vec->nfp_net, r_vec->irq_entry); 2069 2069 2070 - if (r_vec->nfp_net->rx_coalesce_adapt_on) { 2070 + if (r_vec->nfp_net->rx_coalesce_adapt_on && r_vec->rx_ring) { 2071 2071 struct dim_sample dim_sample = {}; 2072 2072 unsigned int start; 2073 2073 u64 pkts, bytes; ··· 2082 2082 net_dim(&r_vec->rx_dim, dim_sample); 2083 2083 } 2084 2084 2085 - if (r_vec->nfp_net->tx_coalesce_adapt_on) { 2085 + if (r_vec->nfp_net->tx_coalesce_adapt_on && r_vec->tx_ring) { 2086 2086 struct dim_sample dim_sample = {}; 2087 2087 unsigned int start; 2088 2088 u64 pkts, bytes; ··· 3016 3016 3017 3017 /* copy RX interrupt coalesce parameters */ 3018 3018 value = (moder.pkts << 16) | (factor * moder.usec); 3019 - rtnl_lock(); 3020 3019 nn_writel(nn, NFP_NET_CFG_RXR_IRQ_MOD(r_vec->rx_ring->idx), value); 3021 3020 (void)nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_IRQMOD); 3022 - rtnl_unlock(); 3023 3021 3024 3022 dim->state = DIM_START_MEASURE; 3025 3023 } ··· 3045 3047 3046 3048 /* copy TX interrupt coalesce parameters */ 3047 3049 value = (moder.pkts << 16) | (factor * moder.usec); 3048 - rtnl_lock(); 3049 3050 nn_writel(nn, NFP_NET_CFG_TXR_IRQ_MOD(r_vec->tx_ring->idx), value); 3050 3051 (void)nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_IRQMOD); 3051 - rtnl_unlock(); 3052 3052 3053 3053 dim->state = DIM_START_MEASURE; 3054 3054 }
+1 -1
drivers/net/phy/phylink.c
··· 1780 1780 return -EOPNOTSUPP; 1781 1781 1782 1782 if (!phylink_test(pl->supported, Asym_Pause) && 1783 - !pause->autoneg && pause->rx_pause != pause->tx_pause) 1783 + pause->rx_pause != pause->tx_pause) 1784 1784 return -EINVAL; 1785 1785 1786 1786 pause_state = 0;
+1
include/net/flow_dissector.h
··· 287 287 #define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0) 288 288 #define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(1) 289 289 #define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(2) 290 + #define FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP BIT(3) 290 291 291 292 struct flow_dissector_key { 292 293 enum flow_dissector_key_id key_id;
+3 -4
include/net/sctp/sctp.h
··· 626 626 627 627 static inline int sctp_transport_pl_hlen(struct sctp_transport *t) 628 628 { 629 - return __sctp_mtu_payload(sctp_sk(t->asoc->base.sk), t, 0, 0); 629 + return __sctp_mtu_payload(sctp_sk(t->asoc->base.sk), t, 0, 0) - 630 + sizeof(struct sctphdr); 630 631 } 631 632 632 633 static inline void sctp_transport_pl_reset(struct sctp_transport *t) ··· 654 653 if (t->pl.state == SCTP_PL_DISABLED) 655 654 return; 656 655 657 - if (del_timer(&t->probe_timer)) 658 - sctp_transport_put(t); 659 - 660 656 t->pl.state = SCTP_PL_BASE; 661 657 t->pl.pmtu = SCTP_BASE_PLPMTU; 662 658 t->pl.probe_size = SCTP_BASE_PLPMTU; 659 + sctp_transport_reset_probe_timer(t); 663 660 } 664 661 665 662 static inline bool sctp_transport_pl_enabled(struct sctp_transport *t)
+2
net/bridge/br_private.h
··· 1893 1893 1894 1894 static inline int br_cfm_mep_count(struct net_bridge *br, u32 *count) 1895 1895 { 1896 + *count = 0; 1896 1897 return -EOPNOTSUPP; 1897 1898 } 1898 1899 1899 1900 static inline int br_cfm_peer_mep_count(struct net_bridge *br, u32 *count) 1900 1901 { 1902 + *count = 0; 1901 1903 return -EOPNOTSUPP; 1902 1904 } 1903 1905 #endif
+15
net/core/flow_dissector.c
··· 1306 1306 1307 1307 switch (ip_proto) { 1308 1308 case IPPROTO_GRE: 1309 + if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) { 1310 + fdret = FLOW_DISSECT_RET_OUT_GOOD; 1311 + break; 1312 + } 1313 + 1309 1314 fdret = __skb_flow_dissect_gre(skb, key_control, flow_dissector, 1310 1315 target_container, data, 1311 1316 &proto, &nhoff, &hlen, flags); ··· 1368 1363 break; 1369 1364 } 1370 1365 case IPPROTO_IPIP: 1366 + if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) { 1367 + fdret = FLOW_DISSECT_RET_OUT_GOOD; 1368 + break; 1369 + } 1370 + 1371 1371 proto = htons(ETH_P_IP); 1372 1372 1373 1373 key_control->flags |= FLOW_DIS_ENCAPSULATION; ··· 1385 1375 break; 1386 1376 1387 1377 case IPPROTO_IPV6: 1378 + if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) { 1379 + fdret = FLOW_DISSECT_RET_OUT_GOOD; 1380 + break; 1381 + } 1382 + 1388 1383 proto = htons(ETH_P_IPV6); 1389 1384 1390 1385 key_control->flags |= FLOW_DIS_ENCAPSULATION;
+1 -1
net/ipv6/udp.c
··· 1435 1435 if (!fl6.flowi6_oif) 1436 1436 fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex; 1437 1437 1438 - fl6.flowi6_mark = ipc6.sockc.mark; 1439 1438 fl6.flowi6_uid = sk->sk_uid; 1440 1439 1441 1440 if (msg->msg_controllen) { ··· 1470 1471 ipc6.opt = opt; 1471 1472 1472 1473 fl6.flowi6_proto = sk->sk_protocol; 1474 + fl6.flowi6_mark = ipc6.sockc.mark; 1473 1475 fl6.daddr = *daddr; 1474 1476 if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) 1475 1477 fl6.saddr = np->saddr;
+2 -1
net/sched/cls_flower.c
··· 329 329 ARRAY_SIZE(fl_ct_info_to_flower_map), 330 330 post_ct); 331 331 skb_flow_dissect_hash(skb, &mask->dissector, &skb_key); 332 - skb_flow_dissect(skb, &mask->dissector, &skb_key, 0); 332 + skb_flow_dissect(skb, &mask->dissector, &skb_key, 333 + FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP); 333 334 334 335 f = fl_mask_lookup(mask, &skb_key); 335 336 if (f && !tc_skip_sw(f->flags)) {
+8 -5
net/sctp/output.c
··· 581 581 chunk = list_entry(packet->chunk_list.next, struct sctp_chunk, list); 582 582 sk = chunk->skb->sk; 583 583 584 - /* check gso */ 585 584 if (packet->size > tp->pathmtu && !packet->ipfragok && !chunk->pmtu_probe) { 586 - if (!sk_can_gso(sk)) { 587 - pr_err_once("Trying to GSO but underlying device doesn't support it."); 588 - goto out; 585 + if (tp->pl.state == SCTP_PL_ERROR) { /* do IP fragmentation if in Error state */ 586 + packet->ipfragok = 1; 587 + } else { 588 + if (!sk_can_gso(sk)) { /* check gso */ 589 + pr_err_once("Trying to GSO but underlying device doesn't support it."); 590 + goto out; 591 + } 592 + gso = 1; 589 593 } 590 - gso = 1; 591 594 } 592 595 593 596 /* alloc head skb */
+6 -5
net/sctp/transport.c
··· 269 269 if (t->pl.probe_size == SCTP_BASE_PLPMTU) { /* BASE_PLPMTU Confirmation Failed */ 270 270 t->pl.state = SCTP_PL_ERROR; /* Base -> Error */ 271 271 272 - t->pl.pmtu = SCTP_MIN_PLPMTU; 272 + t->pl.pmtu = SCTP_BASE_PLPMTU; 273 273 t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t); 274 274 sctp_assoc_sync_pmtu(t->asoc); 275 275 } ··· 366 366 if (pmtu >= SCTP_MIN_PLPMTU && pmtu < SCTP_BASE_PLPMTU) { 367 367 t->pl.state = SCTP_PL_ERROR; /* Base -> Error */ 368 368 369 - t->pl.pmtu = SCTP_MIN_PLPMTU; 369 + t->pl.pmtu = SCTP_BASE_PLPMTU; 370 370 t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t); 371 + return true; 371 372 } 372 373 } else if (t->pl.state == SCTP_PL_SEARCH) { 373 374 if (pmtu >= SCTP_BASE_PLPMTU && pmtu < t->pl.pmtu) { ··· 379 378 t->pl.probe_high = 0; 380 379 t->pl.pmtu = SCTP_BASE_PLPMTU; 381 380 t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t); 381 + return true; 382 382 } else if (pmtu > t->pl.pmtu && pmtu < t->pl.probe_size) { 383 383 t->pl.probe_size = pmtu; 384 384 t->pl.probe_count = 0; 385 - 386 - return false; 387 385 } 388 386 } else if (t->pl.state == SCTP_PL_COMPLETE) { 389 387 if (pmtu >= SCTP_BASE_PLPMTU && pmtu < t->pl.pmtu) { ··· 393 393 t->pl.probe_high = 0; 394 394 t->pl.pmtu = SCTP_BASE_PLPMTU; 395 395 t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t); 396 + return true; 396 397 } 397 398 } 398 399 399 - return true; 400 + return false; 400 401 } 401 402 402 403 bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
+5
tools/testing/selftests/net/.gitignore
··· 31 31 timestamping 32 32 txtimestamp 33 33 so_netns_cookie 34 + test_unix_oob 35 + gro 36 + ioam6_parser 37 + toeplitz 38 + cmsg_so_mark
+2
tools/testing/selftests/net/Makefile
··· 29 29 TEST_PROGS += ioam6.sh 30 30 TEST_PROGS += gro.sh 31 31 TEST_PROGS += gre_gso.sh 32 + TEST_PROGS += cmsg_so_mark.sh 32 33 TEST_PROGS_EXTENDED := in_netns.sh 33 34 TEST_GEN_FILES = socket nettest 34 35 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any ··· 46 45 TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa 47 46 TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls 48 47 TEST_GEN_FILES += toeplitz 48 + TEST_GEN_FILES += cmsg_so_mark 49 49 50 50 TEST_FILES := settings 51 51
+67
tools/testing/selftests/net/cmsg_so_mark.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + #include <errno.h> 3 + #include <netdb.h> 4 + #include <stdio.h> 5 + #include <stdlib.h> 6 + #include <string.h> 7 + #include <unistd.h> 8 + #include <linux/types.h> 9 + #include <sys/socket.h> 10 + 11 + int main(int argc, const char **argv) 12 + { 13 + char cbuf[CMSG_SPACE(sizeof(__u32))]; 14 + struct addrinfo hints, *ai; 15 + struct cmsghdr *cmsg; 16 + struct iovec iov[1]; 17 + struct msghdr msg; 18 + int mark; 19 + int err; 20 + int fd; 21 + 22 + if (argc != 4) { 23 + fprintf(stderr, "Usage: %s <dst_ip> <port> <mark>\n", argv[0]); 24 + return 1; 25 + } 26 + mark = atoi(argv[3]); 27 + 28 + memset(&hints, 0, sizeof(hints)); 29 + hints.ai_family = AF_UNSPEC; 30 + hints.ai_socktype = SOCK_DGRAM; 31 + 32 + ai = NULL; 33 + err = getaddrinfo(argv[1], argv[2], &hints, &ai); 34 + if (err) { 35 + fprintf(stderr, "Can't resolve address: %s\n", strerror(errno)); 36 + return 1; 37 + } 38 + 39 + fd = socket(ai->ai_family, SOCK_DGRAM, IPPROTO_UDP); 40 + if (fd < 0) { 41 + fprintf(stderr, "Can't open socket: %s\n", strerror(errno)); 42 + freeaddrinfo(ai); 43 + return 1; 44 + } 45 + 46 + iov[0].iov_base = "bla"; 47 + iov[0].iov_len = 4; 48 + 49 + msg.msg_name = ai->ai_addr; 50 + msg.msg_namelen = ai->ai_addrlen; 51 + msg.msg_iov = iov; 52 + msg.msg_iovlen = 1; 53 + msg.msg_control = cbuf; 54 + msg.msg_controllen = sizeof(cbuf); 55 + 56 + cmsg = CMSG_FIRSTHDR(&msg); 57 + cmsg->cmsg_level = SOL_SOCKET; 58 + cmsg->cmsg_type = SO_MARK; 59 + cmsg->cmsg_len = CMSG_LEN(sizeof(__u32)); 60 + *(__u32 *)CMSG_DATA(cmsg) = mark; 61 + 62 + err = sendmsg(fd, &msg, 0); 63 + 64 + close(fd); 65 + freeaddrinfo(ai); 66 + return err != 4; 67 + }
+61
tools/testing/selftests/net/cmsg_so_mark.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + NS=ns 5 + IP4=172.16.0.1/24 6 + TGT4=172.16.0.2 7 + IP6=2001:db8:1::1/64 8 + TGT6=2001:db8:1::2 9 + MARK=1000 10 + 11 + cleanup() 12 + { 13 + ip netns del $NS 14 + } 15 + 16 + trap cleanup EXIT 17 + 18 + # Namespaces 19 + ip netns add $NS 20 + 21 + # Connectivity 22 + ip -netns $NS link add type dummy 23 + ip -netns $NS link set dev dummy0 up 24 + ip -netns $NS addr add $IP4 dev dummy0 25 + ip -netns $NS addr add $IP6 dev dummy0 26 + 27 + ip -netns $NS rule add fwmark $MARK lookup 300 28 + ip -6 -netns $NS rule add fwmark $MARK lookup 300 29 + ip -netns $NS route add prohibit any table 300 30 + ip -6 -netns $NS route add prohibit any table 300 31 + 32 + # Test 33 + BAD=0 34 + TOTAL=0 35 + 36 + check_result() { 37 + ((TOTAL++)) 38 + if [ $1 -ne $2 ]; then 39 + echo " Case $3 returned $1, expected $2" 40 + ((BAD++)) 41 + fi 42 + } 43 + 44 + ip netns exec $NS ./cmsg_so_mark $TGT4 1234 $((MARK + 1)) 45 + check_result $? 0 "IPv4 pass" 46 + ip netns exec $NS ./cmsg_so_mark $TGT6 1234 $((MARK + 1)) 47 + check_result $? 0 "IPv6 pass" 48 + 49 + ip netns exec $NS ./cmsg_so_mark $TGT4 1234 $MARK 50 + check_result $? 1 "IPv4 rejection" 51 + ip netns exec $NS ./cmsg_so_mark $TGT6 1234 $MARK 52 + check_result $? 1 "IPv6 rejection" 53 + 54 + # Summary 55 + if [ $BAD -ne 0 ]; then 56 + echo "FAIL - $BAD/$TOTAL cases failed" 57 + exit 1 58 + else 59 + echo "OK" 60 + exit 0 61 + fi
+9 -3
tools/testing/selftests/net/forwarding/bridge_igmp.sh
··· 482 482 local X=("192.0.2.20" "192.0.2.30") 483 483 484 484 # GMI should be 3 seconds 485 - ip link set dev br0 type bridge mcast_query_interval 100 mcast_query_response_interval 100 485 + ip link set dev br0 type bridge mcast_query_interval 100 \ 486 + mcast_query_response_interval 100 \ 487 + mcast_membership_interval 300 486 488 487 489 v3exclude_prepare $h1 $ALL_MAC $ALL_GROUP 488 - ip link set dev br0 type bridge mcast_query_interval 500 mcast_query_response_interval 500 490 + ip link set dev br0 type bridge mcast_query_interval 500 \ 491 + mcast_query_response_interval 500 \ 492 + mcast_membership_interval 1500 493 + 489 494 $MZ $h1 -c 1 -b $ALL_MAC -B $ALL_GROUP -t ip "proto=2,p=$MZPKT_ALLOW2" -q 490 495 sleep 3 491 496 bridge -j -d -s mdb show dev br0 \ ··· 522 517 log_test "IGMPv3 group $TEST_GROUP exclude timeout" 523 518 524 519 ip link set dev br0 type bridge mcast_query_interval 12500 \ 525 - mcast_query_response_interval 1000 520 + mcast_query_response_interval 1000 \ 521 + mcast_membership_interval 26000 526 522 527 523 v3cleanup $swp1 $TEST_GROUP 528 524 }
+9 -3
tools/testing/selftests/net/forwarding/bridge_mld.sh
··· 479 479 local X=("2001:db8:1::20" "2001:db8:1::30") 480 480 481 481 # GMI should be 3 seconds 482 - ip link set dev br0 type bridge mcast_query_interval 100 mcast_query_response_interval 100 482 + ip link set dev br0 type bridge mcast_query_interval 100 \ 483 + mcast_query_response_interval 100 \ 484 + mcast_membership_interval 300 483 485 484 486 mldv2exclude_prepare $h1 485 - ip link set dev br0 type bridge mcast_query_interval 500 mcast_query_response_interval 500 487 + ip link set dev br0 type bridge mcast_query_interval 500 \ 488 + mcast_query_response_interval 500 \ 489 + mcast_membership_interval 1500 490 + 486 491 $MZ $h1 -c 1 $MZPKT_ALLOW2 -q 487 492 sleep 3 488 493 bridge -j -d -s mdb show dev br0 \ ··· 519 514 log_test "MLDv2 group $TEST_GROUP exclude timeout" 520 515 521 516 ip link set dev br0 type bridge mcast_query_interval 12500 \ 522 - mcast_query_response_interval 1000 517 + mcast_query_response_interval 1000 \ 518 + mcast_membership_interval 26000 523 519 524 520 mldv2cleanup $swp1 525 521 }