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

net: bridge: multicast: factor out bridge multicast context

Factor out the bridge's global multicast context into a separate
structure which will later be used for per-vlan global context.
No functional changes intended.

Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Nikolay Aleksandrov and committed by
David S. Miller
d3d065c0 9632233e

+333 -273
+12 -11
net/bridge/br_mdb.c
··· 16 16 17 17 #include "br_private.h" 18 18 19 - static bool br_rports_have_mc_router(struct net_bridge *br) 19 + static bool br_rports_have_mc_router(struct net_bridge_mcast *brmctx) 20 20 { 21 21 #if IS_ENABLED(CONFIG_IPV6) 22 - return !hlist_empty(&br->ip4_mc_router_list) || 23 - !hlist_empty(&br->ip6_mc_router_list); 22 + return !hlist_empty(&brmctx->ip4_mc_router_list) || 23 + !hlist_empty(&brmctx->ip6_mc_router_list); 24 24 #else 25 - return !hlist_empty(&br->ip4_mc_router_list); 25 + return !hlist_empty(&brmctx->ip4_mc_router_list); 26 26 #endif 27 27 } 28 28 ··· 54 54 struct nlattr *nest, *port_nest; 55 55 struct net_bridge_port *p; 56 56 57 - if (!br->multicast_router) 57 + if (!br->multicast_ctx.multicast_router) 58 58 return 0; 59 59 60 - if (!br_rports_have_mc_router(br)) 60 + if (!br_rports_have_mc_router(&br->multicast_ctx)) 61 61 return 0; 62 62 63 63 nest = nla_nest_start_noflag(skb, MDBA_ROUTER); ··· 240 240 241 241 switch (mp->addr.proto) { 242 242 case htons(ETH_P_IP): 243 - dump_srcs_mode = !!(mp->br->multicast_igmp_version == 3); 243 + dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_igmp_version == 3); 244 244 if (mp->addr.src.ip4) { 245 245 if (nla_put_in_addr(skb, MDBA_MDB_EATTR_SOURCE, 246 246 mp->addr.src.ip4)) ··· 250 250 break; 251 251 #if IS_ENABLED(CONFIG_IPV6) 252 252 case htons(ETH_P_IPV6): 253 - dump_srcs_mode = !!(mp->br->multicast_mld_version == 2); 253 + dump_srcs_mode = !!(mp->br->multicast_ctx.multicast_mld_version == 2); 254 254 if (!ipv6_addr_any(&mp->addr.src.ip6)) { 255 255 if (nla_put_in6_addr(skb, MDBA_MDB_EATTR_SOURCE, 256 256 &mp->addr.src.ip6)) ··· 483 483 /* MDBA_MDB_EATTR_SOURCE */ 484 484 if (pg->key.addr.src.ip4) 485 485 nlmsg_size += nla_total_size(sizeof(__be32)); 486 - if (pg->key.port->br->multicast_igmp_version == 2) 486 + if (pg->key.port->br->multicast_ctx.multicast_igmp_version == 2) 487 487 goto out; 488 488 addr_size = sizeof(__be32); 489 489 break; ··· 492 492 /* MDBA_MDB_EATTR_SOURCE */ 493 493 if (!ipv6_addr_any(&pg->key.addr.src.ip6)) 494 494 nlmsg_size += nla_total_size(sizeof(struct in6_addr)); 495 - if (pg->key.port->br->multicast_mld_version == 1) 495 + if (pg->key.port->br->multicast_ctx.multicast_mld_version == 1) 496 496 goto out; 497 497 addr_size = sizeof(struct in6_addr); 498 498 break; ··· 1084 1084 } 1085 1085 rcu_assign_pointer(*pp, p); 1086 1086 if (entry->state == MDB_TEMPORARY) 1087 - mod_timer(&p->timer, now + br->multicast_membership_interval); 1087 + mod_timer(&p->timer, 1088 + now + br->multicast_ctx.multicast_membership_interval); 1088 1089 br_mdb_notify(br->dev, mp, p, RTM_NEWMDB); 1089 1090 /* if we are adding a new EXCLUDE port group (*,G) it needs to be also 1090 1091 * added to all S,G entries for proper replication, if we are adding
+218 -176
net/bridge/br_multicast.c
··· 158 158 switch (skb->protocol) { 159 159 case htons(ETH_P_IP): 160 160 ip.dst.ip4 = ip_hdr(skb)->daddr; 161 - if (br->multicast_igmp_version == 3) { 161 + if (br->multicast_ctx.multicast_igmp_version == 3) { 162 162 struct net_bridge_mdb_entry *mdb; 163 163 164 164 ip.src.ip4 = ip_hdr(skb)->saddr; ··· 171 171 #if IS_ENABLED(CONFIG_IPV6) 172 172 case htons(ETH_P_IPV6): 173 173 ip.dst.ip6 = ipv6_hdr(skb)->daddr; 174 - if (br->multicast_mld_version == 2) { 174 + if (br->multicast_ctx.multicast_mld_version == 2) { 175 175 struct net_bridge_mdb_entry *mdb; 176 176 177 177 ip.src.ip6 = ipv6_hdr(skb)->saddr; ··· 699 699 u8 sflag, u8 *igmp_type, 700 700 bool *need_rexmit) 701 701 { 702 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 702 703 struct net_bridge_port *p = pg ? pg->key.port : NULL; 703 704 struct net_bridge_group_src *ent; 704 705 size_t pkt_size, igmp_hdr_size; ··· 715 714 u16 lmqt_srcs = 0; 716 715 717 716 igmp_hdr_size = sizeof(*ih); 718 - if (br->multicast_igmp_version == 3) { 717 + if (brmctx->multicast_igmp_version == 3) { 719 718 igmp_hdr_size = sizeof(*ihv3); 720 719 if (pg && with_srcs) { 721 - lmqt = now + (br->multicast_last_member_interval * 722 - br->multicast_last_member_count); 720 + lmqt = now + (brmctx->multicast_last_member_interval * 721 + brmctx->multicast_last_member_count); 723 722 hlist_for_each_entry(ent, &pg->src_list, node) { 724 723 if (over_lmqt == time_after(ent->timer.expires, 725 724 lmqt) && ··· 776 775 skb_set_transport_header(skb, skb->len); 777 776 *igmp_type = IGMP_HOST_MEMBERSHIP_QUERY; 778 777 779 - switch (br->multicast_igmp_version) { 778 + switch (brmctx->multicast_igmp_version) { 780 779 case 2: 781 780 ih = igmp_hdr(skb); 782 781 ih->type = IGMP_HOST_MEMBERSHIP_QUERY; 783 - ih->code = (group ? br->multicast_last_member_interval : 784 - br->multicast_query_response_interval) / 782 + ih->code = (group ? brmctx->multicast_last_member_interval : 783 + brmctx->multicast_query_response_interval) / 785 784 (HZ / IGMP_TIMER_SCALE); 786 785 ih->group = group; 787 786 ih->csum = 0; ··· 791 790 case 3: 792 791 ihv3 = igmpv3_query_hdr(skb); 793 792 ihv3->type = IGMP_HOST_MEMBERSHIP_QUERY; 794 - ihv3->code = (group ? br->multicast_last_member_interval : 795 - br->multicast_query_response_interval) / 793 + ihv3->code = (group ? brmctx->multicast_last_member_interval : 794 + brmctx->multicast_query_response_interval) / 796 795 (HZ / IGMP_TIMER_SCALE); 797 796 ihv3->group = group; 798 - ihv3->qqic = br->multicast_query_interval / HZ; 797 + ihv3->qqic = brmctx->multicast_query_interval / HZ; 799 798 ihv3->nsrcs = htons(lmqt_srcs); 800 799 ihv3->resv = 0; 801 800 ihv3->suppress = sflag; ··· 846 845 u8 sflag, u8 *igmp_type, 847 846 bool *need_rexmit) 848 847 { 848 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 849 849 struct net_bridge_port *p = pg ? pg->key.port : NULL; 850 850 struct net_bridge_group_src *ent; 851 851 size_t pkt_size, mld_hdr_size; ··· 864 862 u8 *hopopt; 865 863 866 864 mld_hdr_size = sizeof(*mldq); 867 - if (br->multicast_mld_version == 2) { 865 + if (brmctx->multicast_mld_version == 2) { 868 866 mld_hdr_size = sizeof(*mld2q); 869 867 if (pg && with_srcs) { 870 - llqt = now + (br->multicast_last_member_interval * 871 - br->multicast_last_member_count); 868 + llqt = now + (brmctx->multicast_last_member_interval * 869 + brmctx->multicast_last_member_count); 872 870 hlist_for_each_entry(ent, &pg->src_list, node) { 873 871 if (over_llqt == time_after(ent->timer.expires, 874 872 llqt) && ··· 935 933 /* ICMPv6 */ 936 934 skb_set_transport_header(skb, skb->len); 937 935 interval = ipv6_addr_any(group) ? 938 - br->multicast_query_response_interval : 939 - br->multicast_last_member_interval; 936 + brmctx->multicast_query_response_interval : 937 + brmctx->multicast_last_member_interval; 940 938 *igmp_type = ICMPV6_MGM_QUERY; 941 - switch (br->multicast_mld_version) { 939 + switch (brmctx->multicast_mld_version) { 942 940 case 1: 943 941 mldq = (struct mld_msg *)icmp6_hdr(skb); 944 942 mldq->mld_type = ICMPV6_MGM_QUERY; ··· 961 959 mld2q->mld2q_suppress = sflag; 962 960 mld2q->mld2q_qrv = 2; 963 961 mld2q->mld2q_nsrcs = htons(llqt_srcs); 964 - mld2q->mld2q_qqic = br->multicast_query_interval / HZ; 962 + mld2q->mld2q_qqic = brmctx->multicast_query_interval / HZ; 965 963 mld2q->mld2q_mca = *group; 966 964 csum = &mld2q->mld2q_cksum; 967 965 csum_start = (void *)mld2q; ··· 1221 1219 if (br_group_is_l2(&mp->addr)) 1222 1220 return; 1223 1221 1224 - mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval); 1222 + mod_timer(&mp->timer, 1223 + jiffies + mp->br->multicast_ctx.multicast_membership_interval); 1225 1224 } 1226 1225 1227 1226 void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify) ··· 1286 1283 1287 1284 found: 1288 1285 if (igmpv2_mldv1) 1289 - mod_timer(&p->timer, now + br->multicast_membership_interval); 1286 + mod_timer(&p->timer, 1287 + now + br->multicast_ctx.multicast_membership_interval); 1290 1288 1291 1289 out: 1292 1290 return p; ··· 1434 1430 switchdev_port_attr_set(p->dev, &attr, NULL); 1435 1431 } 1436 1432 1437 - static void br_multicast_local_router_expired(struct net_bridge *br, 1433 + static void br_multicast_local_router_expired(struct net_bridge_mcast *brmctx, 1438 1434 struct timer_list *timer) 1439 1435 { 1440 - spin_lock(&br->multicast_lock); 1441 - if (br->multicast_router == MDB_RTR_TYPE_DISABLED || 1442 - br->multicast_router == MDB_RTR_TYPE_PERM || 1443 - br_ip4_multicast_is_router(br) || 1444 - br_ip6_multicast_is_router(br)) 1436 + spin_lock(&brmctx->br->multicast_lock); 1437 + if (brmctx->multicast_router == MDB_RTR_TYPE_DISABLED || 1438 + brmctx->multicast_router == MDB_RTR_TYPE_PERM || 1439 + br_ip4_multicast_is_router(brmctx) || 1440 + br_ip6_multicast_is_router(brmctx)) 1445 1441 goto out; 1446 1442 1447 - br_mc_router_state_change(br, false); 1443 + br_mc_router_state_change(brmctx->br, false); 1448 1444 out: 1449 - spin_unlock(&br->multicast_lock); 1445 + spin_unlock(&brmctx->br->multicast_lock); 1450 1446 } 1451 1447 1452 1448 static void br_ip4_multicast_local_router_expired(struct timer_list *t) 1453 1449 { 1454 - struct net_bridge *br = from_timer(br, t, ip4_mc_router_timer); 1450 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 1451 + ip4_mc_router_timer); 1455 1452 1456 - br_multicast_local_router_expired(br, t); 1453 + br_multicast_local_router_expired(brmctx, t); 1457 1454 } 1458 1455 1459 1456 #if IS_ENABLED(CONFIG_IPV6) 1460 1457 static void br_ip6_multicast_local_router_expired(struct timer_list *t) 1461 1458 { 1462 - struct net_bridge *br = from_timer(br, t, ip6_mc_router_timer); 1459 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 1460 + ip6_mc_router_timer); 1463 1461 1464 - br_multicast_local_router_expired(br, t); 1462 + br_multicast_local_router_expired(brmctx, t); 1465 1463 } 1466 1464 #endif 1467 1465 1468 - static void br_multicast_querier_expired(struct net_bridge *br, 1466 + static void br_multicast_querier_expired(struct net_bridge_mcast *brmctx, 1469 1467 struct bridge_mcast_own_query *query) 1470 1468 { 1471 - spin_lock(&br->multicast_lock); 1472 - if (!netif_running(br->dev) || !br_opt_get(br, BROPT_MULTICAST_ENABLED)) 1469 + spin_lock(&brmctx->br->multicast_lock); 1470 + if (!netif_running(brmctx->br->dev) || 1471 + !br_opt_get(brmctx->br, BROPT_MULTICAST_ENABLED)) 1473 1472 goto out; 1474 1473 1475 - br_multicast_start_querier(br, query); 1474 + br_multicast_start_querier(brmctx->br, query); 1476 1475 1477 1476 out: 1478 - spin_unlock(&br->multicast_lock); 1477 + spin_unlock(&brmctx->br->multicast_lock); 1479 1478 } 1480 1479 1481 1480 static void br_ip4_multicast_querier_expired(struct timer_list *t) 1482 1481 { 1483 - struct net_bridge *br = from_timer(br, t, ip4_other_query.timer); 1482 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 1483 + ip4_other_query.timer); 1484 1484 1485 - br_multicast_querier_expired(br, &br->ip4_own_query); 1485 + br_multicast_querier_expired(brmctx, &brmctx->ip4_own_query); 1486 1486 } 1487 1487 1488 1488 #if IS_ENABLED(CONFIG_IPV6) 1489 1489 static void br_ip6_multicast_querier_expired(struct timer_list *t) 1490 1490 { 1491 - struct net_bridge *br = from_timer(br, t, ip6_other_query.timer); 1491 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 1492 + ip6_other_query.timer); 1492 1493 1493 - br_multicast_querier_expired(br, &br->ip6_own_query); 1494 + br_multicast_querier_expired(brmctx, &brmctx->ip6_own_query); 1494 1495 } 1495 1496 #endif 1496 1497 ··· 1503 1494 struct br_ip *ip, 1504 1495 struct sk_buff *skb) 1505 1496 { 1497 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1498 + 1506 1499 if (ip->proto == htons(ETH_P_IP)) 1507 - br->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr; 1500 + brmctx->ip4_querier.addr.src.ip4 = ip_hdr(skb)->saddr; 1508 1501 #if IS_ENABLED(CONFIG_IPV6) 1509 1502 else 1510 - br->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr; 1503 + brmctx->ip6_querier.addr.src.ip6 = ipv6_hdr(skb)->saddr; 1511 1504 #endif 1512 1505 } 1513 1506 ··· 1557 1546 struct net_bridge_port *port, 1558 1547 struct bridge_mcast_own_query *own_query) 1559 1548 { 1549 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1560 1550 struct bridge_mcast_other_query *other_query = NULL; 1561 1551 struct br_ip br_group; 1562 1552 unsigned long time; ··· 1570 1558 memset(&br_group.dst, 0, sizeof(br_group.dst)); 1571 1559 1572 1560 if (port ? (own_query == &port->multicast_ctx.ip4_own_query) : 1573 - (own_query == &br->ip4_own_query)) { 1574 - other_query = &br->ip4_other_query; 1561 + (own_query == &brmctx->ip4_own_query)) { 1562 + other_query = &brmctx->ip4_other_query; 1575 1563 br_group.proto = htons(ETH_P_IP); 1576 1564 #if IS_ENABLED(CONFIG_IPV6) 1577 1565 } else { 1578 - other_query = &br->ip6_other_query; 1566 + other_query = &brmctx->ip6_other_query; 1579 1567 br_group.proto = htons(ETH_P_IPV6); 1580 1568 #endif 1581 1569 } ··· 1587 1575 NULL); 1588 1576 1589 1577 time = jiffies; 1590 - time += own_query->startup_sent < br->multicast_startup_query_count ? 1591 - br->multicast_startup_query_interval : 1592 - br->multicast_query_interval; 1578 + time += own_query->startup_sent < brmctx->multicast_startup_query_count ? 1579 + brmctx->multicast_startup_query_interval : 1580 + brmctx->multicast_query_interval; 1593 1581 mod_timer(&own_query->timer, time); 1594 1582 } 1595 1583 ··· 1604 1592 pmctx->port->state == BR_STATE_BLOCKING) 1605 1593 goto out; 1606 1594 1607 - if (query->startup_sent < br->multicast_startup_query_count) 1595 + if (query->startup_sent < br->multicast_ctx.multicast_startup_query_count) 1608 1596 query->startup_sent++; 1609 1597 1610 1598 br_multicast_send_query(pmctx->port->br, pmctx->port, query); ··· 1636 1624 struct net_bridge_port_group *pg = from_timer(pg, t, rexmit_timer); 1637 1625 struct bridge_mcast_other_query *other_query = NULL; 1638 1626 struct net_bridge *br = pg->key.port->br; 1627 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1639 1628 bool need_rexmit = false; 1640 1629 1641 1630 spin_lock(&br->multicast_lock); ··· 1646 1633 goto out; 1647 1634 1648 1635 if (pg->key.addr.proto == htons(ETH_P_IP)) 1649 - other_query = &br->ip4_other_query; 1636 + other_query = &brmctx->ip4_other_query; 1650 1637 #if IS_ENABLED(CONFIG_IPV6) 1651 1638 else 1652 - other_query = &br->ip6_other_query; 1639 + other_query = &brmctx->ip6_other_query; 1653 1640 #endif 1654 1641 1655 1642 if (!other_query || timer_pending(&other_query->timer)) ··· 1665 1652 1666 1653 if (pg->grp_query_rexmit_cnt || need_rexmit) 1667 1654 mod_timer(&pg->rexmit_timer, jiffies + 1668 - br->multicast_last_member_interval); 1655 + brmctx->multicast_last_member_interval); 1669 1656 out: 1670 1657 spin_unlock(&br->multicast_lock); 1671 1658 } ··· 1832 1819 { 1833 1820 struct bridge_mcast_other_query *other_query = NULL; 1834 1821 struct net_bridge *br = pg->key.port->br; 1835 - u32 lmqc = br->multicast_last_member_count; 1822 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1823 + u32 lmqc = brmctx->multicast_last_member_count; 1836 1824 unsigned long lmqt, lmi, now = jiffies; 1837 1825 struct net_bridge_group_src *ent; 1838 1826 ··· 1842 1828 return; 1843 1829 1844 1830 if (pg->key.addr.proto == htons(ETH_P_IP)) 1845 - other_query = &br->ip4_other_query; 1831 + other_query = &brmctx->ip4_other_query; 1846 1832 #if IS_ENABLED(CONFIG_IPV6) 1847 1833 else 1848 - other_query = &br->ip6_other_query; 1834 + other_query = &brmctx->ip6_other_query; 1849 1835 #endif 1850 1836 1851 1837 lmqt = now + br_multicast_lmqt(br); ··· 1869 1855 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1870 1856 &pg->key.addr, true, 1, NULL); 1871 1857 1872 - lmi = now + br->multicast_last_member_interval; 1858 + lmi = now + brmctx->multicast_last_member_interval; 1873 1859 if (!timer_pending(&pg->rexmit_timer) || 1874 1860 time_after(pg->rexmit_timer.expires, lmi)) 1875 1861 mod_timer(&pg->rexmit_timer, lmi); ··· 1879 1865 { 1880 1866 struct bridge_mcast_other_query *other_query = NULL; 1881 1867 struct net_bridge *br = pg->key.port->br; 1868 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 1882 1869 unsigned long now = jiffies, lmi; 1883 1870 1884 1871 if (!netif_running(br->dev) || ··· 1887 1872 return; 1888 1873 1889 1874 if (pg->key.addr.proto == htons(ETH_P_IP)) 1890 - other_query = &br->ip4_other_query; 1875 + other_query = &brmctx->ip4_other_query; 1891 1876 #if IS_ENABLED(CONFIG_IPV6) 1892 1877 else 1893 - other_query = &br->ip6_other_query; 1878 + other_query = &brmctx->ip6_other_query; 1894 1879 #endif 1895 1880 1896 1881 if (br_opt_get(br, BROPT_MULTICAST_QUERIER) && 1897 1882 other_query && !timer_pending(&other_query->timer)) { 1898 - lmi = now + br->multicast_last_member_interval; 1899 - pg->grp_query_rexmit_cnt = br->multicast_last_member_count - 1; 1883 + lmi = now + brmctx->multicast_last_member_interval; 1884 + pg->grp_query_rexmit_cnt = brmctx->multicast_last_member_count - 1; 1900 1885 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr, 1901 1886 &pg->key.addr, false, 0, NULL); 1902 1887 if (!timer_pending(&pg->rexmit_timer) || ··· 2420 2405 struct sk_buff *skb, 2421 2406 u16 vid) 2422 2407 { 2423 - bool igmpv2 = br->multicast_igmp_version == 2; 2408 + bool igmpv2 = br->multicast_ctx.multicast_igmp_version == 2; 2424 2409 struct net_bridge_mdb_entry *mdst; 2425 2410 struct net_bridge_port_group *pg; 2426 2411 const unsigned char *src; ··· 2532 2517 struct sk_buff *skb, 2533 2518 u16 vid) 2534 2519 { 2535 - bool mldv1 = br->multicast_mld_version == 1; 2520 + bool mldv1 = br->multicast_ctx.multicast_mld_version == 1; 2536 2521 struct net_bridge_mdb_entry *mdst; 2537 2522 struct net_bridge_port_group *pg; 2538 2523 unsigned int nsrcs_offset; ··· 2670 2655 struct net_bridge_port *port, 2671 2656 __be32 saddr) 2672 2657 { 2673 - if (!timer_pending(&br->ip4_own_query.timer) && 2674 - !timer_pending(&br->ip4_other_query.timer)) 2658 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2659 + 2660 + if (!timer_pending(&brmctx->ip4_own_query.timer) && 2661 + !timer_pending(&brmctx->ip4_other_query.timer)) 2675 2662 goto update; 2676 2663 2677 - if (!br->ip4_querier.addr.src.ip4) 2664 + if (!brmctx->ip4_querier.addr.src.ip4) 2678 2665 goto update; 2679 2666 2680 - if (ntohl(saddr) <= ntohl(br->ip4_querier.addr.src.ip4)) 2667 + if (ntohl(saddr) <= ntohl(brmctx->ip4_querier.addr.src.ip4)) 2681 2668 goto update; 2682 2669 2683 2670 return false; 2684 2671 2685 2672 update: 2686 - br->ip4_querier.addr.src.ip4 = saddr; 2673 + brmctx->ip4_querier.addr.src.ip4 = saddr; 2687 2674 2688 2675 /* update protected by general multicast_lock by caller */ 2689 - rcu_assign_pointer(br->ip4_querier.port, port); 2676 + rcu_assign_pointer(brmctx->ip4_querier.port, port); 2690 2677 2691 2678 return true; 2692 2679 } ··· 2698 2681 struct net_bridge_port *port, 2699 2682 struct in6_addr *saddr) 2700 2683 { 2701 - if (!timer_pending(&br->ip6_own_query.timer) && 2702 - !timer_pending(&br->ip6_other_query.timer)) 2684 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2685 + 2686 + if (!timer_pending(&brmctx->ip6_own_query.timer) && 2687 + !timer_pending(&brmctx->ip6_other_query.timer)) 2703 2688 goto update; 2704 2689 2705 - if (ipv6_addr_cmp(saddr, &br->ip6_querier.addr.src.ip6) <= 0) 2690 + if (ipv6_addr_cmp(saddr, &brmctx->ip6_querier.addr.src.ip6) <= 0) 2706 2691 goto update; 2707 2692 2708 2693 return false; 2709 2694 2710 2695 update: 2711 - br->ip6_querier.addr.src.ip6 = *saddr; 2696 + brmctx->ip6_querier.addr.src.ip6 = *saddr; 2712 2697 2713 2698 /* update protected by general multicast_lock by caller */ 2714 - rcu_assign_pointer(br->ip6_querier.port, port); 2699 + rcu_assign_pointer(brmctx->ip6_querier.port, port); 2715 2700 2716 2701 return true; 2717 2702 } ··· 2727 2708 if (!timer_pending(&query->timer)) 2728 2709 query->delay_time = jiffies + max_delay; 2729 2710 2730 - mod_timer(&query->timer, jiffies + br->multicast_querier_interval); 2711 + mod_timer(&query->timer, jiffies + 2712 + br->multicast_ctx.multicast_querier_interval); 2731 2713 } 2732 2714 2733 2715 static void br_port_mc_router_state_change(struct net_bridge_port *p, ··· 2745 2725 } 2746 2726 2747 2727 static struct net_bridge_port * 2748 - br_multicast_rport_from_node(struct net_bridge *br, 2728 + br_multicast_rport_from_node(struct net_bridge_mcast *brmctx, 2749 2729 struct hlist_head *mc_router_list, 2750 2730 struct hlist_node *rlist) 2751 2731 { 2752 2732 struct net_bridge_mcast_port *pmctx; 2753 2733 2754 2734 #if IS_ENABLED(CONFIG_IPV6) 2755 - if (mc_router_list == &br->ip6_mc_router_list) 2735 + if (mc_router_list == &brmctx->ip6_mc_router_list) 2756 2736 pmctx = hlist_entry(rlist, struct net_bridge_mcast_port, 2757 2737 ip6_rlist); 2758 2738 else ··· 2764 2744 } 2765 2745 2766 2746 static struct hlist_node * 2767 - br_multicast_get_rport_slot(struct net_bridge *br, 2747 + br_multicast_get_rport_slot(struct net_bridge_mcast *brmctx, 2768 2748 struct net_bridge_port *port, 2769 2749 struct hlist_head *mc_router_list) 2770 2750 ··· 2774 2754 struct hlist_node *rlist; 2775 2755 2776 2756 hlist_for_each(rlist, mc_router_list) { 2777 - p = br_multicast_rport_from_node(br, mc_router_list, rlist); 2757 + p = br_multicast_rport_from_node(brmctx, mc_router_list, rlist); 2778 2758 2779 2759 if ((unsigned long)port >= (unsigned long)p) 2780 2760 break; ··· 2802 2782 * list is maintained ordered by pointer value 2803 2783 * and locked by br->multicast_lock and RCU 2804 2784 */ 2805 - static void br_multicast_add_router(struct net_bridge *br, 2785 + static void br_multicast_add_router(struct net_bridge_mcast *brmctx, 2806 2786 struct net_bridge_port *port, 2807 2787 struct hlist_node *rlist, 2808 2788 struct hlist_head *mc_router_list) ··· 2812 2792 if (!hlist_unhashed(rlist)) 2813 2793 return; 2814 2794 2815 - slot = br_multicast_get_rport_slot(br, port, mc_router_list); 2795 + slot = br_multicast_get_rport_slot(brmctx, port, mc_router_list); 2816 2796 2817 2797 if (slot) 2818 2798 hlist_add_behind_rcu(rlist, slot); ··· 2824 2804 * IPv4 or IPv6 multicast router. 2825 2805 */ 2826 2806 if (br_multicast_no_router_otherpf(port, rlist)) { 2827 - br_rtr_notify(br->dev, port, RTM_NEWMDB); 2807 + br_rtr_notify(port->br->dev, port, RTM_NEWMDB); 2828 2808 br_port_mc_router_state_change(port, true); 2829 2809 } 2830 2810 } ··· 2836 2816 static void br_ip4_multicast_add_router(struct net_bridge *br, 2837 2817 struct net_bridge_port *port) 2838 2818 { 2839 - br_multicast_add_router(br, port, &port->multicast_ctx.ip4_rlist, 2840 - &br->ip4_mc_router_list); 2819 + br_multicast_add_router(&br->multicast_ctx, port, 2820 + &port->multicast_ctx.ip4_rlist, 2821 + &br->multicast_ctx.ip4_mc_router_list); 2841 2822 } 2842 2823 2843 2824 /* Add port to router_list ··· 2849 2828 struct net_bridge_port *port) 2850 2829 { 2851 2830 #if IS_ENABLED(CONFIG_IPV6) 2852 - br_multicast_add_router(br, port, &port->multicast_ctx.ip6_rlist, 2853 - &br->ip6_mc_router_list); 2831 + br_multicast_add_router(&br->multicast_ctx, port, 2832 + &port->multicast_ctx.ip6_rlist, 2833 + &br->multicast_ctx.ip6_mc_router_list); 2854 2834 #endif 2855 2835 } 2856 2836 ··· 2861 2839 struct hlist_node *rlist, 2862 2840 struct hlist_head *mc_router_list) 2863 2841 { 2842 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2864 2843 unsigned long now = jiffies; 2865 2844 2866 2845 if (!port) { 2867 - if (br->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { 2868 - if (!br_ip4_multicast_is_router(br) && 2869 - !br_ip6_multicast_is_router(br)) 2846 + if (brmctx->multicast_router == MDB_RTR_TYPE_TEMP_QUERY) { 2847 + if (!br_ip4_multicast_is_router(brmctx) && 2848 + !br_ip6_multicast_is_router(brmctx)) 2870 2849 br_mc_router_state_change(br, true); 2871 - mod_timer(timer, now + br->multicast_querier_interval); 2850 + mod_timer(timer, now + brmctx->multicast_querier_interval); 2872 2851 } 2873 2852 return; 2874 2853 } ··· 2878 2855 port->multicast_ctx.multicast_router == MDB_RTR_TYPE_PERM) 2879 2856 return; 2880 2857 2881 - br_multicast_add_router(br, port, rlist, mc_router_list); 2882 - mod_timer(timer, now + br->multicast_querier_interval); 2858 + br_multicast_add_router(brmctx, port, rlist, mc_router_list); 2859 + mod_timer(timer, now + brmctx->multicast_querier_interval); 2883 2860 } 2884 2861 2885 2862 static void br_ip4_multicast_mark_router(struct net_bridge *br, 2886 2863 struct net_bridge_port *port) 2887 2864 { 2888 - struct timer_list *timer = &br->ip4_mc_router_timer; 2865 + struct timer_list *timer = &br->multicast_ctx.ip4_mc_router_timer; 2889 2866 struct hlist_node *rlist = NULL; 2890 2867 2891 2868 if (port) { ··· 2894 2871 } 2895 2872 2896 2873 br_multicast_mark_router(br, port, timer, rlist, 2897 - &br->ip4_mc_router_list); 2874 + &br->multicast_ctx.ip4_mc_router_list); 2898 2875 } 2899 2876 2900 2877 static void br_ip6_multicast_mark_router(struct net_bridge *br, 2901 2878 struct net_bridge_port *port) 2902 2879 { 2903 2880 #if IS_ENABLED(CONFIG_IPV6) 2904 - struct timer_list *timer = &br->ip6_mc_router_timer; 2881 + struct timer_list *timer = &br->multicast_ctx.ip6_mc_router_timer; 2905 2882 struct hlist_node *rlist = NULL; 2906 2883 2907 2884 if (port) { ··· 2910 2887 } 2911 2888 2912 2889 br_multicast_mark_router(br, port, timer, rlist, 2913 - &br->ip6_mc_router_list); 2890 + &br->multicast_ctx.ip6_mc_router_list); 2914 2891 #endif 2915 2892 } 2916 2893 ··· 2949 2926 struct sk_buff *skb, 2950 2927 u16 vid) 2951 2928 { 2929 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 2952 2930 unsigned int transport_len = ip_transport_len(skb); 2953 2931 const struct iphdr *iph = ip_hdr(skb); 2954 2932 struct igmphdr *ih = igmp_hdr(skb); ··· 2979 2955 } else if (transport_len >= sizeof(*ih3)) { 2980 2956 ih3 = igmpv3_query_hdr(skb); 2981 2957 if (ih3->nsrcs || 2982 - (br->multicast_igmp_version == 3 && group && ih3->suppress)) 2958 + (brmctx->multicast_igmp_version == 3 && group && 2959 + ih3->suppress)) 2983 2960 goto out; 2984 2961 2985 2962 max_delay = ih3->code ? ··· 2993 2968 saddr.proto = htons(ETH_P_IP); 2994 2969 saddr.src.ip4 = iph->saddr; 2995 2970 2996 - br_ip4_multicast_query_received(br, port, &br->ip4_other_query, 2971 + br_ip4_multicast_query_received(br, port, 2972 + &brmctx->ip4_other_query, 2997 2973 &saddr, max_delay); 2998 2974 goto out; 2999 2975 } ··· 3003 2977 if (!mp) 3004 2978 goto out; 3005 2979 3006 - max_delay *= br->multicast_last_member_count; 2980 + max_delay *= brmctx->multicast_last_member_count; 3007 2981 3008 2982 if (mp->host_joined && 3009 2983 (timer_pending(&mp->timer) ? ··· 3017 2991 if (timer_pending(&p->timer) ? 3018 2992 time_after(p->timer.expires, now + max_delay) : 3019 2993 try_to_del_timer_sync(&p->timer) >= 0 && 3020 - (br->multicast_igmp_version == 2 || 2994 + (brmctx->multicast_igmp_version == 2 || 3021 2995 p->filter_mode == MCAST_EXCLUDE)) 3022 2996 mod_timer(&p->timer, now + max_delay); 3023 2997 } ··· 3032 3006 struct sk_buff *skb, 3033 3007 u16 vid) 3034 3008 { 3009 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3035 3010 unsigned int transport_len = ipv6_transport_len(skb); 3036 3011 struct mld_msg *mld; 3037 3012 struct net_bridge_mdb_entry *mp; ··· 3069 3042 mld2q = (struct mld2_query *)icmp6_hdr(skb); 3070 3043 if (!mld2q->mld2q_nsrcs) 3071 3044 group = &mld2q->mld2q_mca; 3072 - if (br->multicast_mld_version == 2 && 3045 + if (brmctx->multicast_mld_version == 2 && 3073 3046 !ipv6_addr_any(&mld2q->mld2q_mca) && 3074 3047 mld2q->mld2q_suppress) 3075 3048 goto out; ··· 3083 3056 saddr.proto = htons(ETH_P_IPV6); 3084 3057 saddr.src.ip6 = ipv6_hdr(skb)->saddr; 3085 3058 3086 - br_ip6_multicast_query_received(br, port, &br->ip6_other_query, 3059 + br_ip6_multicast_query_received(br, port, 3060 + &brmctx->ip6_other_query, 3087 3061 &saddr, max_delay); 3088 3062 goto out; 3089 3063 } else if (!group) { ··· 3095 3067 if (!mp) 3096 3068 goto out; 3097 3069 3098 - max_delay *= br->multicast_last_member_count; 3070 + max_delay *= brmctx->multicast_last_member_count; 3099 3071 if (mp->host_joined && 3100 3072 (timer_pending(&mp->timer) ? 3101 3073 time_after(mp->timer.expires, now + max_delay) : ··· 3108 3080 if (timer_pending(&p->timer) ? 3109 3081 time_after(p->timer.expires, now + max_delay) : 3110 3082 try_to_del_timer_sync(&p->timer) >= 0 && 3111 - (br->multicast_mld_version == 1 || 3083 + (brmctx->multicast_mld_version == 1 || 3112 3084 p->filter_mode == MCAST_EXCLUDE)) 3113 3085 mod_timer(&p->timer, now + max_delay); 3114 3086 } ··· 3127 3099 struct bridge_mcast_own_query *own_query, 3128 3100 const unsigned char *src) 3129 3101 { 3102 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3130 3103 struct net_bridge_mdb_entry *mp; 3131 3104 struct net_bridge_port_group *p; 3132 3105 unsigned long now; ··· 3167 3138 __br_multicast_send_query(br, port, NULL, NULL, &mp->addr, 3168 3139 false, 0, NULL); 3169 3140 3170 - time = jiffies + br->multicast_last_member_count * 3171 - br->multicast_last_member_interval; 3141 + time = jiffies + brmctx->multicast_last_member_count * 3142 + brmctx->multicast_last_member_interval; 3172 3143 3173 3144 mod_timer(&own_query->timer, time); 3174 3145 ··· 3190 3161 } 3191 3162 3192 3163 now = jiffies; 3193 - time = now + br->multicast_last_member_count * 3194 - br->multicast_last_member_interval; 3164 + time = now + brmctx->multicast_last_member_count * 3165 + brmctx->multicast_last_member_interval; 3195 3166 3196 3167 if (!port) { 3197 3168 if (mp->host_joined && ··· 3236 3207 return; 3237 3208 3238 3209 own_query = port ? &port->multicast_ctx.ip4_own_query : 3239 - &br->ip4_own_query; 3210 + &br->multicast_ctx.ip4_own_query; 3240 3211 3241 3212 memset(&br_group, 0, sizeof(br_group)); 3242 3213 br_group.dst.ip4 = group; 3243 3214 br_group.proto = htons(ETH_P_IP); 3244 3215 br_group.vid = vid; 3245 3216 3246 - br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query, 3217 + br_multicast_leave_group(br, port, &br_group, 3218 + &br->multicast_ctx.ip4_other_query, 3247 3219 own_query, src); 3248 3220 } 3249 3221 ··· 3262 3232 return; 3263 3233 3264 3234 own_query = port ? &port->multicast_ctx.ip6_own_query : 3265 - &br->ip6_own_query; 3235 + &br->multicast_ctx.ip6_own_query; 3266 3236 3267 3237 memset(&br_group, 0, sizeof(br_group)); 3268 3238 br_group.dst.ip6 = *group; 3269 3239 br_group.proto = htons(ETH_P_IPV6); 3270 3240 br_group.vid = vid; 3271 3241 3272 - br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query, 3242 + br_multicast_leave_group(br, port, &br_group, 3243 + &br->multicast_ctx.ip6_other_query, 3273 3244 own_query, src); 3274 3245 } 3275 3246 #endif ··· 3491 3460 struct bridge_mcast_querier *querier) 3492 3461 { 3493 3462 spin_lock(&br->multicast_lock); 3494 - if (query->startup_sent < br->multicast_startup_query_count) 3463 + if (query->startup_sent < br->multicast_ctx.multicast_startup_query_count) 3495 3464 query->startup_sent++; 3496 3465 3497 3466 RCU_INIT_POINTER(querier->port, NULL); ··· 3501 3470 3502 3471 static void br_ip4_multicast_query_expired(struct timer_list *t) 3503 3472 { 3504 - struct net_bridge *br = from_timer(br, t, ip4_own_query.timer); 3473 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 3474 + ip4_own_query.timer); 3505 3475 3506 - br_multicast_query_expired(br, &br->ip4_own_query, &br->ip4_querier); 3476 + br_multicast_query_expired(brmctx->br, &brmctx->ip4_own_query, 3477 + &brmctx->ip4_querier); 3507 3478 } 3508 3479 3509 3480 #if IS_ENABLED(CONFIG_IPV6) 3510 3481 static void br_ip6_multicast_query_expired(struct timer_list *t) 3511 3482 { 3512 - struct net_bridge *br = from_timer(br, t, ip6_own_query.timer); 3483 + struct net_bridge_mcast *brmctx = from_timer(brmctx, t, 3484 + ip6_own_query.timer); 3513 3485 3514 - br_multicast_query_expired(br, &br->ip6_own_query, &br->ip6_querier); 3486 + br_multicast_query_expired(brmctx->br, &brmctx->ip6_own_query, 3487 + &brmctx->ip6_querier); 3515 3488 } 3516 3489 #endif 3517 3490 ··· 3536 3501 { 3537 3502 br->hash_max = BR_MULTICAST_DEFAULT_HASH_MAX; 3538 3503 3539 - br->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3540 - br->multicast_last_member_count = 2; 3541 - br->multicast_startup_query_count = 2; 3504 + br->multicast_ctx.br = br; 3505 + br->multicast_ctx.multicast_router = MDB_RTR_TYPE_TEMP_QUERY; 3506 + br->multicast_ctx.multicast_last_member_count = 2; 3507 + br->multicast_ctx.multicast_startup_query_count = 2; 3542 3508 3543 - br->multicast_last_member_interval = HZ; 3544 - br->multicast_query_response_interval = 10 * HZ; 3545 - br->multicast_startup_query_interval = 125 * HZ / 4; 3546 - br->multicast_query_interval = 125 * HZ; 3547 - br->multicast_querier_interval = 255 * HZ; 3548 - br->multicast_membership_interval = 260 * HZ; 3509 + br->multicast_ctx.multicast_last_member_interval = HZ; 3510 + br->multicast_ctx.multicast_query_response_interval = 10 * HZ; 3511 + br->multicast_ctx.multicast_startup_query_interval = 125 * HZ / 4; 3512 + br->multicast_ctx.multicast_query_interval = 125 * HZ; 3513 + br->multicast_ctx.multicast_querier_interval = 255 * HZ; 3514 + br->multicast_ctx.multicast_membership_interval = 260 * HZ; 3549 3515 3550 - br->ip4_other_query.delay_time = 0; 3551 - br->ip4_querier.port = NULL; 3552 - br->multicast_igmp_version = 2; 3516 + br->multicast_ctx.ip4_other_query.delay_time = 0; 3517 + br->multicast_ctx.ip4_querier.port = NULL; 3518 + br->multicast_ctx.multicast_igmp_version = 2; 3553 3519 #if IS_ENABLED(CONFIG_IPV6) 3554 - br->multicast_mld_version = 1; 3555 - br->ip6_other_query.delay_time = 0; 3556 - br->ip6_querier.port = NULL; 3520 + br->multicast_ctx.multicast_mld_version = 1; 3521 + br->multicast_ctx.ip6_other_query.delay_time = 0; 3522 + br->multicast_ctx.ip6_querier.port = NULL; 3557 3523 #endif 3558 3524 br_opt_toggle(br, BROPT_MULTICAST_ENABLED, true); 3559 3525 br_opt_toggle(br, BROPT_HAS_IPV6_ADDR, true); 3560 3526 3561 3527 spin_lock_init(&br->multicast_lock); 3562 - timer_setup(&br->ip4_mc_router_timer, 3528 + timer_setup(&br->multicast_ctx.ip4_mc_router_timer, 3563 3529 br_ip4_multicast_local_router_expired, 0); 3564 - timer_setup(&br->ip4_other_query.timer, 3530 + timer_setup(&br->multicast_ctx.ip4_other_query.timer, 3565 3531 br_ip4_multicast_querier_expired, 0); 3566 - timer_setup(&br->ip4_own_query.timer, 3532 + timer_setup(&br->multicast_ctx.ip4_own_query.timer, 3567 3533 br_ip4_multicast_query_expired, 0); 3568 3534 #if IS_ENABLED(CONFIG_IPV6) 3569 - timer_setup(&br->ip6_mc_router_timer, 3535 + timer_setup(&br->multicast_ctx.ip6_mc_router_timer, 3570 3536 br_ip6_multicast_local_router_expired, 0); 3571 - timer_setup(&br->ip6_other_query.timer, 3537 + timer_setup(&br->multicast_ctx.ip6_other_query.timer, 3572 3538 br_ip6_multicast_querier_expired, 0); 3573 - timer_setup(&br->ip6_own_query.timer, 3539 + timer_setup(&br->multicast_ctx.ip6_own_query.timer, 3574 3540 br_ip6_multicast_query_expired, 0); 3575 3541 #endif 3576 3542 INIT_HLIST_HEAD(&br->mdb_list); ··· 3654 3618 3655 3619 void br_multicast_open(struct net_bridge *br) 3656 3620 { 3657 - __br_multicast_open(br, &br->ip4_own_query); 3621 + __br_multicast_open(br, &br->multicast_ctx.ip4_own_query); 3658 3622 #if IS_ENABLED(CONFIG_IPV6) 3659 - __br_multicast_open(br, &br->ip6_own_query); 3623 + __br_multicast_open(br, &br->multicast_ctx.ip6_own_query); 3660 3624 #endif 3661 3625 } 3662 3626 3663 3627 void br_multicast_stop(struct net_bridge *br) 3664 3628 { 3665 - del_timer_sync(&br->ip4_mc_router_timer); 3666 - del_timer_sync(&br->ip4_other_query.timer); 3667 - del_timer_sync(&br->ip4_own_query.timer); 3629 + del_timer_sync(&br->multicast_ctx.ip4_mc_router_timer); 3630 + del_timer_sync(&br->multicast_ctx.ip4_other_query.timer); 3631 + del_timer_sync(&br->multicast_ctx.ip4_own_query.timer); 3668 3632 #if IS_ENABLED(CONFIG_IPV6) 3669 - del_timer_sync(&br->ip6_mc_router_timer); 3670 - del_timer_sync(&br->ip6_other_query.timer); 3671 - del_timer_sync(&br->ip6_own_query.timer); 3633 + del_timer_sync(&br->multicast_ctx.ip6_mc_router_timer); 3634 + del_timer_sync(&br->multicast_ctx.ip6_other_query.timer); 3635 + del_timer_sync(&br->multicast_ctx.ip6_own_query.timer); 3672 3636 #endif 3673 3637 } 3674 3638 ··· 3692 3656 3693 3657 int br_multicast_set_router(struct net_bridge *br, unsigned long val) 3694 3658 { 3659 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3695 3660 int err = -EINVAL; 3696 3661 3697 3662 spin_lock_bh(&br->multicast_lock); ··· 3701 3664 case MDB_RTR_TYPE_DISABLED: 3702 3665 case MDB_RTR_TYPE_PERM: 3703 3666 br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM); 3704 - del_timer(&br->ip4_mc_router_timer); 3667 + del_timer(&brmctx->ip4_mc_router_timer); 3705 3668 #if IS_ENABLED(CONFIG_IPV6) 3706 - del_timer(&br->ip6_mc_router_timer); 3669 + del_timer(&brmctx->ip6_mc_router_timer); 3707 3670 #endif 3708 - br->multicast_router = val; 3671 + brmctx->multicast_router = val; 3709 3672 err = 0; 3710 3673 break; 3711 3674 case MDB_RTR_TYPE_TEMP_QUERY: 3712 - if (br->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) 3675 + if (brmctx->multicast_router != MDB_RTR_TYPE_TEMP_QUERY) 3713 3676 br_mc_router_state_change(br, false); 3714 - br->multicast_router = val; 3677 + brmctx->multicast_router = val; 3715 3678 err = 0; 3716 3679 break; 3717 3680 } ··· 3747 3710 3748 3711 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val) 3749 3712 { 3750 - struct net_bridge *br = p->br; 3713 + struct net_bridge_mcast *brmctx = &p->br->multicast_ctx; 3751 3714 unsigned long now = jiffies; 3752 3715 int err = -EINVAL; 3753 3716 bool del = false; 3754 3717 3755 - spin_lock(&br->multicast_lock); 3718 + spin_lock(&p->br->multicast_lock); 3756 3719 if (p->multicast_ctx.multicast_router == val) { 3757 3720 /* Refresh the temp router port timer */ 3758 3721 if (p->multicast_ctx.multicast_router == MDB_RTR_TYPE_TEMP) { 3759 3722 mod_timer(&p->multicast_ctx.ip4_mc_router_timer, 3760 - now + br->multicast_querier_interval); 3723 + now + brmctx->multicast_querier_interval); 3761 3724 #if IS_ENABLED(CONFIG_IPV6) 3762 3725 mod_timer(&p->multicast_ctx.ip6_mc_router_timer, 3763 - now + br->multicast_querier_interval); 3726 + now + brmctx->multicast_querier_interval); 3764 3727 #endif 3765 3728 } 3766 3729 err = 0; ··· 3786 3749 case MDB_RTR_TYPE_PERM: 3787 3750 p->multicast_ctx.multicast_router = MDB_RTR_TYPE_PERM; 3788 3751 del_timer(&p->multicast_ctx.ip4_mc_router_timer); 3789 - br_ip4_multicast_add_router(br, p); 3752 + br_ip4_multicast_add_router(p->br, p); 3790 3753 #if IS_ENABLED(CONFIG_IPV6) 3791 3754 del_timer(&p->multicast_ctx.ip6_mc_router_timer); 3792 3755 #endif 3793 - br_ip6_multicast_add_router(br, p); 3756 + br_ip6_multicast_add_router(p->br, p); 3794 3757 break; 3795 3758 case MDB_RTR_TYPE_TEMP: 3796 3759 p->multicast_ctx.multicast_router = MDB_RTR_TYPE_TEMP; 3797 - br_ip4_multicast_mark_router(br, p); 3798 - br_ip6_multicast_mark_router(br, p); 3760 + br_ip4_multicast_mark_router(p->br, p); 3761 + br_ip6_multicast_mark_router(p->br, p); 3799 3762 break; 3800 3763 default: 3801 3764 goto unlock; 3802 3765 } 3803 3766 err = 0; 3804 3767 unlock: 3805 - spin_unlock(&br->multicast_lock); 3768 + spin_unlock(&p->br->multicast_lock); 3806 3769 3807 3770 return err; 3808 3771 } ··· 3820 3783 port->state == BR_STATE_BLOCKING) 3821 3784 continue; 3822 3785 3823 - if (query == &br->ip4_own_query) 3786 + if (query == &br->multicast_ctx.ip4_own_query) 3824 3787 br_multicast_enable(&port->multicast_ctx.ip4_own_query); 3825 3788 #if IS_ENABLED(CONFIG_IPV6) 3826 3789 else ··· 3909 3872 3910 3873 int br_multicast_set_querier(struct net_bridge *br, unsigned long val) 3911 3874 { 3875 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 3912 3876 unsigned long max_delay; 3913 3877 3914 3878 val = !!val; ··· 3922 3884 if (!val) 3923 3885 goto unlock; 3924 3886 3925 - max_delay = br->multicast_query_response_interval; 3887 + max_delay = brmctx->multicast_query_response_interval; 3926 3888 3927 - if (!timer_pending(&br->ip4_other_query.timer)) 3928 - br->ip4_other_query.delay_time = jiffies + max_delay; 3889 + if (!timer_pending(&brmctx->ip4_other_query.timer)) 3890 + brmctx->ip4_other_query.delay_time = jiffies + max_delay; 3929 3891 3930 - br_multicast_start_querier(br, &br->ip4_own_query); 3892 + br_multicast_start_querier(br, &brmctx->ip4_own_query); 3931 3893 3932 3894 #if IS_ENABLED(CONFIG_IPV6) 3933 - if (!timer_pending(&br->ip6_other_query.timer)) 3934 - br->ip6_other_query.delay_time = jiffies + max_delay; 3895 + if (!timer_pending(&brmctx->ip6_other_query.timer)) 3896 + brmctx->ip6_other_query.delay_time = jiffies + max_delay; 3935 3897 3936 - br_multicast_start_querier(br, &br->ip6_own_query); 3898 + br_multicast_start_querier(br, &brmctx->ip6_own_query); 3937 3899 #endif 3938 3900 3939 3901 unlock: ··· 3954 3916 } 3955 3917 3956 3918 spin_lock_bh(&br->multicast_lock); 3957 - br->multicast_igmp_version = val; 3919 + br->multicast_ctx.multicast_igmp_version = val; 3958 3920 spin_unlock_bh(&br->multicast_lock); 3959 3921 3960 3922 return 0; ··· 3973 3935 } 3974 3936 3975 3937 spin_lock_bh(&br->multicast_lock); 3976 - br->multicast_mld_version = val; 3938 + br->multicast_ctx.multicast_mld_version = val; 3977 3939 spin_unlock_bh(&br->multicast_lock); 3978 3940 3979 3941 return 0; ··· 4085 4047 */ 4086 4048 bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto) 4087 4049 { 4050 + struct net_bridge_mcast *brmctx; 4088 4051 struct net_bridge *br; 4089 4052 struct net_bridge_port *port; 4090 4053 bool ret = false; ··· 4099 4060 goto unlock; 4100 4061 4101 4062 br = port->br; 4063 + brmctx = &br->multicast_ctx; 4102 4064 4103 4065 switch (proto) { 4104 4066 case ETH_P_IP: 4105 - if (!timer_pending(&br->ip4_other_query.timer) || 4106 - rcu_dereference(br->ip4_querier.port) == port) 4067 + if (!timer_pending(&brmctx->ip4_other_query.timer) || 4068 + rcu_dereference(brmctx->ip4_querier.port) == port) 4107 4069 goto unlock; 4108 4070 break; 4109 4071 #if IS_ENABLED(CONFIG_IPV6) 4110 4072 case ETH_P_IPV6: 4111 - if (!timer_pending(&br->ip6_other_query.timer) || 4112 - rcu_dereference(br->ip6_querier.port) == port) 4073 + if (!timer_pending(&brmctx->ip6_other_query.timer) || 4074 + rcu_dereference(brmctx->ip6_querier.port) == port) 4113 4075 goto unlock; 4114 4076 break; 4115 4077 #endif ··· 4137 4097 bool br_multicast_has_router_adjacent(struct net_device *dev, int proto) 4138 4098 { 4139 4099 struct net_bridge_mcast_port *pmctx; 4100 + struct net_bridge_mcast *brmctx; 4140 4101 struct net_bridge_port *port; 4141 4102 bool ret = false; 4142 4103 ··· 4146 4105 if (!port) 4147 4106 goto unlock; 4148 4107 4108 + brmctx = &port->br->multicast_ctx; 4149 4109 switch (proto) { 4150 4110 case ETH_P_IP: 4151 - hlist_for_each_entry_rcu(pmctx, &port->br->ip4_mc_router_list, 4111 + hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list, 4152 4112 ip4_rlist) { 4153 4113 if (pmctx->port == port) 4154 4114 continue; ··· 4160 4118 break; 4161 4119 #if IS_ENABLED(CONFIG_IPV6) 4162 4120 case ETH_P_IPV6: 4163 - hlist_for_each_entry_rcu(pmctx, &port->br->ip6_mc_router_list, 4121 + hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list, 4164 4122 ip6_rlist) { 4165 4123 if (pmctx->port == port) 4166 4124 continue;
+20 -19
net/bridge/br_netlink.c
··· 1324 1324 if (data[IFLA_BR_MCAST_LAST_MEMBER_CNT]) { 1325 1325 u32 val = nla_get_u32(data[IFLA_BR_MCAST_LAST_MEMBER_CNT]); 1326 1326 1327 - br->multicast_last_member_count = val; 1327 + br->multicast_ctx.multicast_last_member_count = val; 1328 1328 } 1329 1329 1330 1330 if (data[IFLA_BR_MCAST_STARTUP_QUERY_CNT]) { 1331 1331 u32 val = nla_get_u32(data[IFLA_BR_MCAST_STARTUP_QUERY_CNT]); 1332 1332 1333 - br->multicast_startup_query_count = val; 1333 + br->multicast_ctx.multicast_startup_query_count = val; 1334 1334 } 1335 1335 1336 1336 if (data[IFLA_BR_MCAST_LAST_MEMBER_INTVL]) { 1337 1337 u64 val = nla_get_u64(data[IFLA_BR_MCAST_LAST_MEMBER_INTVL]); 1338 1338 1339 - br->multicast_last_member_interval = clock_t_to_jiffies(val); 1339 + br->multicast_ctx.multicast_last_member_interval = clock_t_to_jiffies(val); 1340 1340 } 1341 1341 1342 1342 if (data[IFLA_BR_MCAST_MEMBERSHIP_INTVL]) { 1343 1343 u64 val = nla_get_u64(data[IFLA_BR_MCAST_MEMBERSHIP_INTVL]); 1344 1344 1345 - br->multicast_membership_interval = clock_t_to_jiffies(val); 1345 + br->multicast_ctx.multicast_membership_interval = clock_t_to_jiffies(val); 1346 1346 } 1347 1347 1348 1348 if (data[IFLA_BR_MCAST_QUERIER_INTVL]) { 1349 1349 u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERIER_INTVL]); 1350 1350 1351 - br->multicast_querier_interval = clock_t_to_jiffies(val); 1351 + br->multicast_ctx.multicast_querier_interval = clock_t_to_jiffies(val); 1352 1352 } 1353 1353 1354 1354 if (data[IFLA_BR_MCAST_QUERY_INTVL]) { 1355 1355 u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERY_INTVL]); 1356 1356 1357 - br->multicast_query_interval = clock_t_to_jiffies(val); 1357 + br->multicast_ctx.multicast_query_interval = clock_t_to_jiffies(val); 1358 1358 } 1359 1359 1360 1360 if (data[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]) { 1361 1361 u64 val = nla_get_u64(data[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]); 1362 1362 1363 - br->multicast_query_response_interval = clock_t_to_jiffies(val); 1363 + br->multicast_ctx.multicast_query_response_interval = clock_t_to_jiffies(val); 1364 1364 } 1365 1365 1366 1366 if (data[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]) { 1367 1367 u64 val = nla_get_u64(data[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]); 1368 1368 1369 - br->multicast_startup_query_interval = clock_t_to_jiffies(val); 1369 + br->multicast_ctx.multicast_startup_query_interval = clock_t_to_jiffies(val); 1370 1370 } 1371 1371 1372 1372 if (data[IFLA_BR_MCAST_STATS_ENABLED]) { ··· 1566 1566 return -EMSGSIZE; 1567 1567 #endif 1568 1568 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 1569 - if (nla_put_u8(skb, IFLA_BR_MCAST_ROUTER, br->multicast_router) || 1569 + if (nla_put_u8(skb, IFLA_BR_MCAST_ROUTER, 1570 + br->multicast_ctx.multicast_router) || 1570 1571 nla_put_u8(skb, IFLA_BR_MCAST_SNOOPING, 1571 1572 br_opt_get(br, BROPT_MULTICAST_ENABLED)) || 1572 1573 nla_put_u8(skb, IFLA_BR_MCAST_QUERY_USE_IFADDR, ··· 1579 1578 nla_put_u32(skb, IFLA_BR_MCAST_HASH_ELASTICITY, RHT_ELASTICITY) || 1580 1579 nla_put_u32(skb, IFLA_BR_MCAST_HASH_MAX, br->hash_max) || 1581 1580 nla_put_u32(skb, IFLA_BR_MCAST_LAST_MEMBER_CNT, 1582 - br->multicast_last_member_count) || 1581 + br->multicast_ctx.multicast_last_member_count) || 1583 1582 nla_put_u32(skb, IFLA_BR_MCAST_STARTUP_QUERY_CNT, 1584 - br->multicast_startup_query_count) || 1583 + br->multicast_ctx.multicast_startup_query_count) || 1585 1584 nla_put_u8(skb, IFLA_BR_MCAST_IGMP_VERSION, 1586 - br->multicast_igmp_version)) 1585 + br->multicast_ctx.multicast_igmp_version)) 1587 1586 return -EMSGSIZE; 1588 1587 #if IS_ENABLED(CONFIG_IPV6) 1589 1588 if (nla_put_u8(skb, IFLA_BR_MCAST_MLD_VERSION, 1590 - br->multicast_mld_version)) 1589 + br->multicast_ctx.multicast_mld_version)) 1591 1590 return -EMSGSIZE; 1592 1591 #endif 1593 - clockval = jiffies_to_clock_t(br->multicast_last_member_interval); 1592 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_last_member_interval); 1594 1593 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_LAST_MEMBER_INTVL, clockval, 1595 1594 IFLA_BR_PAD)) 1596 1595 return -EMSGSIZE; 1597 - clockval = jiffies_to_clock_t(br->multicast_membership_interval); 1596 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_membership_interval); 1598 1597 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_MEMBERSHIP_INTVL, clockval, 1599 1598 IFLA_BR_PAD)) 1600 1599 return -EMSGSIZE; 1601 - clockval = jiffies_to_clock_t(br->multicast_querier_interval); 1600 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_querier_interval); 1602 1601 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_QUERIER_INTVL, clockval, 1603 1602 IFLA_BR_PAD)) 1604 1603 return -EMSGSIZE; 1605 - clockval = jiffies_to_clock_t(br->multicast_query_interval); 1604 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_query_interval); 1606 1605 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_QUERY_INTVL, clockval, 1607 1606 IFLA_BR_PAD)) 1608 1607 return -EMSGSIZE; 1609 - clockval = jiffies_to_clock_t(br->multicast_query_response_interval); 1608 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_query_response_interval); 1610 1609 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, clockval, 1611 1610 IFLA_BR_PAD)) 1612 1611 return -EMSGSIZE; 1613 - clockval = jiffies_to_clock_t(br->multicast_startup_query_interval); 1612 + clockval = jiffies_to_clock_t(br->multicast_ctx.multicast_startup_query_interval); 1614 1613 if (nla_put_u64_64bit(skb, IFLA_BR_MCAST_STARTUP_QUERY_INTVL, clockval, 1615 1614 IFLA_BR_PAD)) 1616 1615 return -EMSGSIZE;
+64 -48
net/bridge/br_private.h
··· 106 106 #endif /* CONFIG_BRIDGE_IGMP_SNOOPING */ 107 107 }; 108 108 109 + /* net_bridge_mcast must be always defined due to forwarding stubs */ 110 + struct net_bridge_mcast { 111 + #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 112 + struct net_bridge *br; 113 + 114 + u32 multicast_last_member_count; 115 + u32 multicast_startup_query_count; 116 + 117 + u8 multicast_igmp_version; 118 + u8 multicast_router; 119 + #if IS_ENABLED(CONFIG_IPV6) 120 + u8 multicast_mld_version; 121 + #endif 122 + unsigned long multicast_last_member_interval; 123 + unsigned long multicast_membership_interval; 124 + unsigned long multicast_querier_interval; 125 + unsigned long multicast_query_interval; 126 + unsigned long multicast_query_response_interval; 127 + unsigned long multicast_startup_query_interval; 128 + struct hlist_head ip4_mc_router_list; 129 + struct timer_list ip4_mc_router_timer; 130 + struct bridge_mcast_other_query ip4_other_query; 131 + struct bridge_mcast_own_query ip4_own_query; 132 + struct bridge_mcast_querier ip4_querier; 133 + #if IS_ENABLED(CONFIG_IPV6) 134 + struct hlist_head ip6_mc_router_list; 135 + struct timer_list ip6_mc_router_timer; 136 + struct bridge_mcast_other_query ip6_other_query; 137 + struct bridge_mcast_own_query ip6_own_query; 138 + struct bridge_mcast_querier ip6_querier; 139 + #endif /* IS_ENABLED(CONFIG_IPV6) */ 140 + #endif /* CONFIG_BRIDGE_IGMP_SNOOPING */ 141 + }; 142 + 109 143 struct br_tunnel_info { 110 144 __be64 tunnel_id; 111 145 struct metadata_dst __rcu *tunnel_dst; ··· 471 437 BR_USER_STP, /* new RSTP in userspace */ 472 438 } stp_enabled; 473 439 440 + struct net_bridge_mcast multicast_ctx; 441 + 474 442 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 443 + struct bridge_mcast_stats __percpu *mcast_stats; 475 444 476 445 u32 hash_max; 477 446 478 - u32 multicast_last_member_count; 479 - u32 multicast_startup_query_count; 480 - 481 - u8 multicast_igmp_version; 482 - u8 multicast_router; 483 - #if IS_ENABLED(CONFIG_IPV6) 484 - u8 multicast_mld_version; 485 - #endif 486 447 spinlock_t multicast_lock; 487 - unsigned long multicast_last_member_interval; 488 - unsigned long multicast_membership_interval; 489 - unsigned long multicast_querier_interval; 490 - unsigned long multicast_query_interval; 491 - unsigned long multicast_query_response_interval; 492 - unsigned long multicast_startup_query_interval; 493 448 494 449 struct rhashtable mdb_hash_tbl; 495 450 struct rhashtable sg_port_tbl; ··· 486 463 struct hlist_head mcast_gc_list; 487 464 struct hlist_head mdb_list; 488 465 489 - struct hlist_head ip4_mc_router_list; 490 - struct timer_list ip4_mc_router_timer; 491 - struct bridge_mcast_other_query ip4_other_query; 492 - struct bridge_mcast_own_query ip4_own_query; 493 - struct bridge_mcast_querier ip4_querier; 494 - struct bridge_mcast_stats __percpu *mcast_stats; 495 - #if IS_ENABLED(CONFIG_IPV6) 496 - struct hlist_head ip6_mc_router_list; 497 - struct timer_list ip6_mc_router_timer; 498 - struct bridge_mcast_other_query ip6_other_query; 499 - struct bridge_mcast_own_query ip6_own_query; 500 - struct bridge_mcast_querier ip6_querier; 501 - #endif /* IS_ENABLED(CONFIG_IPV6) */ 502 466 struct work_struct mcast_gc_work; 503 467 #endif 504 468 ··· 890 880 rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock)) 891 881 892 882 static inline struct hlist_node * 893 - br_multicast_get_first_rport_node(struct net_bridge *b, struct sk_buff *skb) { 883 + br_multicast_get_first_rport_node(struct net_bridge *br, struct sk_buff *skb) 884 + { 885 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 886 + 894 887 #if IS_ENABLED(CONFIG_IPV6) 895 888 if (skb->protocol == htons(ETH_P_IPV6)) 896 - return rcu_dereference(hlist_first_rcu(&b->ip6_mc_router_list)); 889 + return rcu_dereference(hlist_first_rcu(&brmctx->ip6_mc_router_list)); 897 890 #endif 898 - return rcu_dereference(hlist_first_rcu(&b->ip4_mc_router_list)); 891 + return rcu_dereference(hlist_first_rcu(&brmctx->ip4_mc_router_list)); 899 892 } 900 893 901 894 static inline struct net_bridge_port * 902 - br_multicast_rport_from_node_skb(struct hlist_node *rp, struct sk_buff *skb) { 895 + br_multicast_rport_from_node_skb(struct hlist_node *rp, struct sk_buff *skb) 896 + { 903 897 struct net_bridge_mcast_port *mctx; 904 898 905 899 #if IS_ENABLED(CONFIG_IPV6) ··· 921 907 return NULL; 922 908 } 923 909 924 - static inline bool br_ip4_multicast_is_router(struct net_bridge *br) 910 + static inline bool br_ip4_multicast_is_router(struct net_bridge_mcast *brmctx) 925 911 { 926 - return timer_pending(&br->ip4_mc_router_timer); 912 + return timer_pending(&brmctx->ip4_mc_router_timer); 927 913 } 928 914 929 - static inline bool br_ip6_multicast_is_router(struct net_bridge *br) 915 + static inline bool br_ip6_multicast_is_router(struct net_bridge_mcast *brmctx) 930 916 { 931 917 #if IS_ENABLED(CONFIG_IPV6) 932 - return timer_pending(&br->ip6_mc_router_timer); 918 + return timer_pending(&brmctx->ip6_mc_router_timer); 933 919 #else 934 920 return false; 935 921 #endif ··· 938 924 static inline bool 939 925 br_multicast_is_router(struct net_bridge *br, struct sk_buff *skb) 940 926 { 941 - switch (br->multicast_router) { 927 + struct net_bridge_mcast *brmctx = &br->multicast_ctx; 928 + 929 + switch (brmctx->multicast_router) { 942 930 case MDB_RTR_TYPE_PERM: 943 931 return true; 944 932 case MDB_RTR_TYPE_TEMP_QUERY: 945 933 if (skb) { 946 934 if (skb->protocol == htons(ETH_P_IP)) 947 - return br_ip4_multicast_is_router(br); 935 + return br_ip4_multicast_is_router(brmctx); 948 936 else if (skb->protocol == htons(ETH_P_IPV6)) 949 - return br_ip6_multicast_is_router(br); 937 + return br_ip6_multicast_is_router(brmctx); 950 938 } else { 951 - return br_ip4_multicast_is_router(br) || 952 - br_ip6_multicast_is_router(br); 939 + return br_ip4_multicast_is_router(brmctx) || 940 + br_ip6_multicast_is_router(brmctx); 953 941 } 954 942 fallthrough; 955 943 default: ··· 986 970 switch (eth->h_proto) { 987 971 case (htons(ETH_P_IP)): 988 972 return __br_multicast_querier_exists(br, 989 - &br->ip4_other_query, false); 973 + &br->multicast_ctx.ip4_other_query, false); 990 974 #if IS_ENABLED(CONFIG_IPV6) 991 975 case (htons(ETH_P_IPV6)): 992 976 return __br_multicast_querier_exists(br, 993 - &br->ip6_other_query, true); 977 + &br->multicast_ctx.ip6_other_query, true); 994 978 #endif 995 979 default: 996 980 return !!mdb && br_group_is_l2(&mdb->addr); ··· 1016 1000 { 1017 1001 switch (proto) { 1018 1002 case htons(ETH_P_IP): 1019 - return !!(br->multicast_igmp_version == 3); 1003 + return !!(br->multicast_ctx.multicast_igmp_version == 3); 1020 1004 #if IS_ENABLED(CONFIG_IPV6) 1021 1005 case htons(ETH_P_IPV6): 1022 - return !!(br->multicast_mld_version == 2); 1006 + return !!(br->multicast_ctx.multicast_mld_version == 2); 1023 1007 #endif 1024 1008 default: 1025 1009 return false; ··· 1033 1017 1034 1018 static inline unsigned long br_multicast_lmqt(const struct net_bridge *br) 1035 1019 { 1036 - return br->multicast_last_member_interval * 1037 - br->multicast_last_member_count; 1020 + return br->multicast_ctx.multicast_last_member_interval * 1021 + br->multicast_ctx.multicast_last_member_count; 1038 1022 } 1039 1023 1040 1024 static inline unsigned long br_multicast_gmi(const struct net_bridge *br) 1041 1025 { 1042 1026 /* use the RFC default of 2 for QRV */ 1043 - return 2 * br->multicast_query_interval + 1044 - br->multicast_query_response_interval; 1027 + return 2 * br->multicast_ctx.multicast_query_interval + 1028 + br->multicast_ctx.multicast_query_response_interval; 1045 1029 } 1046 1030 #else 1047 1031 static inline int br_multicast_rcv(struct net_bridge *br,
+19 -19
net/bridge/br_sysfs_br.c
··· 384 384 struct device_attribute *attr, char *buf) 385 385 { 386 386 struct net_bridge *br = to_bridge(d); 387 - return sprintf(buf, "%d\n", br->multicast_router); 387 + return sprintf(buf, "%d\n", br->multicast_ctx.multicast_router); 388 388 } 389 389 390 390 static int set_multicast_router(struct net_bridge *br, unsigned long val, ··· 514 514 { 515 515 struct net_bridge *br = to_bridge(d); 516 516 517 - return sprintf(buf, "%u\n", br->multicast_igmp_version); 517 + return sprintf(buf, "%u\n", br->multicast_ctx.multicast_igmp_version); 518 518 } 519 519 520 520 static int set_multicast_igmp_version(struct net_bridge *br, unsigned long val, ··· 536 536 char *buf) 537 537 { 538 538 struct net_bridge *br = to_bridge(d); 539 - return sprintf(buf, "%u\n", br->multicast_last_member_count); 539 + return sprintf(buf, "%u\n", br->multicast_ctx.multicast_last_member_count); 540 540 } 541 541 542 542 static int set_last_member_count(struct net_bridge *br, unsigned long val, 543 543 struct netlink_ext_ack *extack) 544 544 { 545 - br->multicast_last_member_count = val; 545 + br->multicast_ctx.multicast_last_member_count = val; 546 546 return 0; 547 547 } 548 548 ··· 558 558 struct device *d, struct device_attribute *attr, char *buf) 559 559 { 560 560 struct net_bridge *br = to_bridge(d); 561 - return sprintf(buf, "%u\n", br->multicast_startup_query_count); 561 + return sprintf(buf, "%u\n", br->multicast_ctx.multicast_startup_query_count); 562 562 } 563 563 564 564 static int set_startup_query_count(struct net_bridge *br, unsigned long val, 565 565 struct netlink_ext_ack *extack) 566 566 { 567 - br->multicast_startup_query_count = val; 567 + br->multicast_ctx.multicast_startup_query_count = val; 568 568 return 0; 569 569 } 570 570 ··· 581 581 { 582 582 struct net_bridge *br = to_bridge(d); 583 583 return sprintf(buf, "%lu\n", 584 - jiffies_to_clock_t(br->multicast_last_member_interval)); 584 + jiffies_to_clock_t(br->multicast_ctx.multicast_last_member_interval)); 585 585 } 586 586 587 587 static int set_last_member_interval(struct net_bridge *br, unsigned long val, 588 588 struct netlink_ext_ack *extack) 589 589 { 590 - br->multicast_last_member_interval = clock_t_to_jiffies(val); 590 + br->multicast_ctx.multicast_last_member_interval = clock_t_to_jiffies(val); 591 591 return 0; 592 592 } 593 593 ··· 604 604 { 605 605 struct net_bridge *br = to_bridge(d); 606 606 return sprintf(buf, "%lu\n", 607 - jiffies_to_clock_t(br->multicast_membership_interval)); 607 + jiffies_to_clock_t(br->multicast_ctx.multicast_membership_interval)); 608 608 } 609 609 610 610 static int set_membership_interval(struct net_bridge *br, unsigned long val, 611 611 struct netlink_ext_ack *extack) 612 612 { 613 - br->multicast_membership_interval = clock_t_to_jiffies(val); 613 + br->multicast_ctx.multicast_membership_interval = clock_t_to_jiffies(val); 614 614 return 0; 615 615 } 616 616 ··· 628 628 { 629 629 struct net_bridge *br = to_bridge(d); 630 630 return sprintf(buf, "%lu\n", 631 - jiffies_to_clock_t(br->multicast_querier_interval)); 631 + jiffies_to_clock_t(br->multicast_ctx.multicast_querier_interval)); 632 632 } 633 633 634 634 static int set_querier_interval(struct net_bridge *br, unsigned long val, 635 635 struct netlink_ext_ack *extack) 636 636 { 637 - br->multicast_querier_interval = clock_t_to_jiffies(val); 637 + br->multicast_ctx.multicast_querier_interval = clock_t_to_jiffies(val); 638 638 return 0; 639 639 } 640 640 ··· 652 652 { 653 653 struct net_bridge *br = to_bridge(d); 654 654 return sprintf(buf, "%lu\n", 655 - jiffies_to_clock_t(br->multicast_query_interval)); 655 + jiffies_to_clock_t(br->multicast_ctx.multicast_query_interval)); 656 656 } 657 657 658 658 static int set_query_interval(struct net_bridge *br, unsigned long val, 659 659 struct netlink_ext_ack *extack) 660 660 { 661 - br->multicast_query_interval = clock_t_to_jiffies(val); 661 + br->multicast_ctx.multicast_query_interval = clock_t_to_jiffies(val); 662 662 return 0; 663 663 } 664 664 ··· 676 676 struct net_bridge *br = to_bridge(d); 677 677 return sprintf( 678 678 buf, "%lu\n", 679 - jiffies_to_clock_t(br->multicast_query_response_interval)); 679 + jiffies_to_clock_t(br->multicast_ctx.multicast_query_response_interval)); 680 680 } 681 681 682 682 static int set_query_response_interval(struct net_bridge *br, unsigned long val, 683 683 struct netlink_ext_ack *extack) 684 684 { 685 - br->multicast_query_response_interval = clock_t_to_jiffies(val); 685 + br->multicast_ctx.multicast_query_response_interval = clock_t_to_jiffies(val); 686 686 return 0; 687 687 } 688 688 ··· 700 700 struct net_bridge *br = to_bridge(d); 701 701 return sprintf( 702 702 buf, "%lu\n", 703 - jiffies_to_clock_t(br->multicast_startup_query_interval)); 703 + jiffies_to_clock_t(br->multicast_ctx.multicast_startup_query_interval)); 704 704 } 705 705 706 706 static int set_startup_query_interval(struct net_bridge *br, unsigned long val, 707 707 struct netlink_ext_ack *extack) 708 708 { 709 - br->multicast_startup_query_interval = clock_t_to_jiffies(val); 709 + br->multicast_ctx.multicast_startup_query_interval = clock_t_to_jiffies(val); 710 710 return 0; 711 711 } 712 712 ··· 751 751 { 752 752 struct net_bridge *br = to_bridge(d); 753 753 754 - return sprintf(buf, "%u\n", br->multicast_mld_version); 754 + return sprintf(buf, "%u\n", br->multicast_ctx.multicast_mld_version); 755 755 } 756 756 757 757 static int set_multicast_mld_version(struct net_bridge *br, unsigned long val,