Lines Matching refs:pg

78 				     struct net_bridge_port_group *pg);
201 static void __fwd_add_star_excl(struct net_bridge_port_group *pg,
205 struct net_bridge *br = pg->key.port->br;
209 sg_key.port = pg->key.port;
214 src_pg = __br_multicast_add_group(br, pg->key.port, sg_ip, pg->eth_addr,
223 static void __fwd_del_star_excl(struct net_bridge_port_group *pg,
227 struct net_bridge *br = pg->key.port->br;
231 sg_key.port = pg->key.port;
249 void br_multicast_star_g_handle_mode(struct net_bridge_port_group *pg,
252 struct net_bridge *br = pg->key.port->br;
257 if (WARN_ON(!br_multicast_is_star_g(&pg->key.addr)))
260 mp = br_mdb_ip_get(br, &pg->key.addr);
265 sg_ip = pg->key.addr;
271 if (pg_lst == pg)
279 __fwd_del_star_excl(pg, &sg_ip);
282 __fwd_add_star_excl(pg, &sg_ip);
311 struct net_bridge_port_group *pg;
319 for (pg = mlock_dereference(star_mp->ports, br);
320 pg;
321 pg = mlock_dereference(pg->next, br)) {
324 hlist_for_each_entry(src_ent, &pg->src_list, node) {
375 struct net_bridge_port_group *pg;
386 for (pg = mlock_dereference(star_mp->ports, br);
387 pg;
388 pg = mlock_dereference(pg->next, br)) {
391 if (pg == sg || pg->filter_mode == MCAST_INCLUDE)
394 sg_key.port = pg->key.port;
398 src_pg = __br_multicast_add_group(br, pg->key.port,
419 sg_ip = src->pg->key.addr;
421 sg = __br_multicast_add_group(src->br, src->pg->key.port, &sg_ip,
422 src->pg->eth_addr, MCAST_INCLUDE, false,
436 star_mp = br_mdb_ip_get(src->br, &src->pg->key.addr);
445 struct net_bridge_port_group *p, *pg = src->pg;
451 sg_ip = pg->key.addr;
461 if (!br_port_group_equal(p, pg->key.port, pg->eth_addr))
484 sg_key.addr = src->pg->key.addr;
486 sg_key.port = src->pg->key.port;
563 struct net_bridge *br = src->pg->key.port->br;
567 src->pg->src_ents--;
574 struct net_bridge_port_group *pg;
576 pg = container_of(gc, struct net_bridge_port_group, mcast_gc);
577 WARN_ON(!hlist_unhashed(&pg->mglist));
578 WARN_ON(!hlist_empty(&pg->src_list));
580 del_timer_sync(&pg->rexmit_timer);
581 del_timer_sync(&pg->timer);
582 kfree_rcu(pg, rcu);
586 struct net_bridge_port_group *pg,
589 struct net_bridge *br = pg->key.port->br;
593 rcu_assign_pointer(*pp, pg->next);
594 hlist_del_init(&pg->mglist);
595 hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
597 br_mdb_notify(br->dev, mp, pg, RTM_DELMDB);
599 rhashtable_remove_fast(&br->sg_port_tbl, &pg->rhnode,
603 br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
605 hlist_add_head(&pg->mcast_gc.gc_node, &br->mcast_gc_list);
613 struct net_bridge_port_group *pg)
619 mp = br_mdb_ip_get(br, &pg->key.addr);
626 if (p != pg)
629 br_multicast_del_pg(mp, pg, pp);
638 struct net_bridge_port_group *pg = from_timer(pg, t, timer);
640 struct net_bridge *br = pg->key.port->br;
645 if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
646 hlist_unhashed(&pg->mglist) || pg->flags & MDB_PG_FLAGS_PERMANENT)
649 changed = !!(pg->filter_mode == MCAST_EXCLUDE);
650 pg->filter_mode = MCAST_INCLUDE;
651 hlist_for_each_entry_safe(src_ent, tmp, &pg->src_list, node) {
658 if (hlist_empty(&pg->src_list)) {
659 br_multicast_find_del_pg(br, pg);
661 struct net_bridge_mdb_entry *mp = br_mdb_ip_get(br, &pg->key.addr);
663 if (changed && br_multicast_is_star_g(&pg->key.addr))
664 br_multicast_star_g_handle_mode(pg, MCAST_INCLUDE);
668 br_mdb_notify(br->dev, mp, pg, RTM_NEWMDB);
686 struct net_bridge_port_group *pg,
692 struct net_bridge_port *p = pg ? pg->key.port : NULL;
709 if (pg && with_srcs) {
712 hlist_for_each_entry(ent, &pg->src_list, node) {
795 if (!pg || !with_srcs)
799 hlist_for_each_entry(ent, &pg->src_list, node) {
831 struct net_bridge_port_group *pg,
838 struct net_bridge_port *p = pg ? pg->key.port : NULL;
857 if (pg && with_srcs) {
860 hlist_for_each_entry(ent, &pg->src_list, node) {
956 if (!pg || !with_srcs)
960 hlist_for_each_entry(ent, &pg->src_list, node) {
994 struct net_bridge_port_group *pg,
1006 return br_ip4_multicast_alloc_query(br, pg,
1021 return br_ip6_multicast_alloc_query(br, pg,
1070 struct net_bridge_port_group *pg;
1078 pg = src->pg;
1079 if (pg->filter_mode == MCAST_INCLUDE) {
1081 if (!hlist_empty(&pg->src_list))
1083 br_multicast_find_del_pg(br, pg);
1093 br_multicast_find_group_src(struct net_bridge_port_group *pg, struct br_ip *ip)
1099 hlist_for_each_entry(ent, &pg->src_list, node)
1105 hlist_for_each_entry(ent, &pg->src_list, node)
1116 br_multicast_new_group_src(struct net_bridge_port_group *pg, struct br_ip *src_ip)
1120 if (unlikely(pg->src_ents >= PG_SRC_ENT_LIMIT))
1142 grp_src->pg = pg;
1143 grp_src->br = pg->key.port->br;
1148 hlist_add_head_rcu(&grp_src->node, &pg->src_list);
1149 pg->src_ents++;
1283 struct net_bridge_port_group *pg;
1287 pg = __br_multicast_add_group(br, port, group, src, filter_mode,
1290 err = IS_ERR(pg) ? PTR_ERR(pg) : 0;
1432 struct net_bridge_port_group *pg,
1444 skb = br_multicast_alloc_query(br, pg, ip_dst, group, with_srcs,
1547 struct net_bridge_port_group *pg = from_timer(pg, t, rexmit_timer);
1549 struct net_bridge *br = pg->key.port->br;
1553 if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
1558 if (pg->key.addr.proto == htons(ETH_P_IP))
1568 if (pg->grp_query_rexmit_cnt) {
1569 pg->grp_query_rexmit_cnt--;
1570 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1571 &pg->key.addr, false, 1, NULL);
1573 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1574 &pg->key.addr, true, 0, &need_rexmit);
1576 if (pg->grp_query_rexmit_cnt || need_rexmit)
1577 mod_timer(&pg->rexmit_timer, jiffies +
1620 struct net_bridge_port_group *pg;
1626 hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
1627 br_multicast_find_del_pg(br, pg);
1672 struct net_bridge_port_group *pg;
1676 hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
1677 if (!(pg->flags & MDB_PG_FLAGS_PERMANENT))
1678 br_multicast_find_del_pg(br, pg);
1690 static int __grp_src_delete_marked(struct net_bridge_port_group *pg)
1696 hlist_for_each_entry_safe(ent, tmp, &pg->src_list, node)
1712 static void __grp_src_query_marked_and_rexmit(struct net_bridge_port_group *pg)
1715 struct net_bridge *br = pg->key.port->br;
1724 if (pg->key.addr.proto == htons(ETH_P_IP))
1732 hlist_for_each_entry(ent, &pg->src_list, node) {
1749 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1750 &pg->key.addr, true, 1, NULL);
1753 if (!timer_pending(&pg->rexmit_timer) ||
1754 time_after(pg->rexmit_timer.expires, lmi))
1755 mod_timer(&pg->rexmit_timer, lmi);
1758 static void __grp_send_query_and_rexmit(struct net_bridge_port_group *pg)
1761 struct net_bridge *br = pg->key.port->br;
1768 if (pg->key.addr.proto == htons(ETH_P_IP))
1778 pg->grp_query_rexmit_cnt = br->multicast_last_member_count - 1;
1779 __br_multicast_send_query(br, pg->key.port, pg, &pg->key.addr,
1780 &pg->key.addr, false, 0, NULL);
1781 if (!timer_pending(&pg->rexmit_timer) ||
1782 time_after(pg->rexmit_timer.expires, lmi))
1783 mod_timer(&pg->rexmit_timer, lmi);
1786 if (pg->filter_mode == MCAST_EXCLUDE &&
1787 (!timer_pending(&pg->timer) ||
1788 time_after(pg->timer.expires, now + br_multicast_lmqt(br))))
1789 mod_timer(&pg->timer, now + br_multicast_lmqt(br));
1797 static bool br_multicast_isinc_allow(struct net_bridge_port_group *pg,
1800 struct net_bridge *br = pg->key.port->br;
1808 src_ip.proto = pg->key.addr.proto;
1811 ent = br_multicast_find_group_src(pg, &src_ip);
1813 ent = br_multicast_new_group_src(pg, &src_ip);
1831 static void __grp_src_isexc_incl(struct net_bridge_port_group *pg,
1838 hlist_for_each_entry(ent, &pg->src_list, node)
1842 src_ip.proto = pg->key.addr.proto;
1845 ent = br_multicast_find_group_src(pg, &src_ip);
1849 ent = br_multicast_new_group_src(pg, &src_ip);
1855 __grp_src_delete_marked(pg);
1864 static bool __grp_src_isexc_excl(struct net_bridge_port_group *pg,
1867 struct net_bridge *br = pg->key.port->br;
1874 hlist_for_each_entry(ent, &pg->src_list, node)
1878 src_ip.proto = pg->key.addr.proto;
1881 ent = br_multicast_find_group_src(pg, &src_ip);
1885 ent = br_multicast_new_group_src(pg, &src_ip);
1895 if (__grp_src_delete_marked(pg))
1901 static bool br_multicast_isexc(struct net_bridge_port_group *pg,
1904 struct net_bridge *br = pg->key.port->br;
1907 switch (pg->filter_mode) {
1909 __grp_src_isexc_incl(pg, srcs, nsrcs, src_size);
1910 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
1914 changed = __grp_src_isexc_excl(pg, srcs, nsrcs, src_size);
1918 pg->filter_mode = MCAST_EXCLUDE;
1919 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
1928 static bool __grp_src_toin_incl(struct net_bridge_port_group *pg,
1931 struct net_bridge *br = pg->key.port->br;
1932 u32 src_idx, to_send = pg->src_ents;
1938 hlist_for_each_entry(ent, &pg->src_list, node)
1942 src_ip.proto = pg->key.addr.proto;
1945 ent = br_multicast_find_group_src(pg, &src_ip);
1950 ent = br_multicast_new_group_src(pg, &src_ip);
1960 __grp_src_query_marked_and_rexmit(pg);
1970 static bool __grp_src_toin_excl(struct net_bridge_port_group *pg,
1973 struct net_bridge *br = pg->key.port->br;
1974 u32 src_idx, to_send = pg->src_ents;
1980 hlist_for_each_entry(ent, &pg->src_list, node)
1985 src_ip.proto = pg->key.addr.proto;
1988 ent = br_multicast_find_group_src(pg, &src_ip);
1995 ent = br_multicast_new_group_src(pg, &src_ip);
2005 __grp_src_query_marked_and_rexmit(pg);
2007 __grp_send_query_and_rexmit(pg);
2012 static bool br_multicast_toin(struct net_bridge_port_group *pg,
2017 switch (pg->filter_mode) {
2019 changed = __grp_src_toin_incl(pg, srcs, nsrcs, src_size);
2022 changed = __grp_src_toin_excl(pg, srcs, nsrcs, src_size);
2035 static void __grp_src_toex_incl(struct net_bridge_port_group *pg,
2042 hlist_for_each_entry(ent, &pg->src_list, node)
2046 src_ip.proto = pg->key.addr.proto;
2049 ent = br_multicast_find_group_src(pg, &src_ip);
2055 ent = br_multicast_new_group_src(pg, &src_ip);
2062 __grp_src_delete_marked(pg);
2064 __grp_src_query_marked_and_rexmit(pg);
2074 static bool __grp_src_toex_excl(struct net_bridge_port_group *pg,
2082 hlist_for_each_entry(ent, &pg->src_list, node)
2086 src_ip.proto = pg->key.addr.proto;
2089 ent = br_multicast_find_group_src(pg, &src_ip);
2093 ent = br_multicast_new_group_src(pg, &src_ip);
2095 __grp_src_mod_timer(ent, pg->timer.expires);
2106 if (__grp_src_delete_marked(pg))
2109 __grp_src_query_marked_and_rexmit(pg);
2114 static bool br_multicast_toex(struct net_bridge_port_group *pg,
2117 struct net_bridge *br = pg->key.port->br;
2120 switch (pg->filter_mode) {
2122 __grp_src_toex_incl(pg, srcs, nsrcs, src_size);
2123 br_multicast_star_g_handle_mode(pg, MCAST_EXCLUDE);
2127 changed = __grp_src_toex_excl(pg, srcs, nsrcs, src_size);
2131 pg->filter_mode = MCAST_EXCLUDE;
2132 mod_timer(&pg->timer, jiffies + br_multicast_gmi(br));
2140 static void __grp_src_block_incl(struct net_bridge_port_group *pg,
2147 hlist_for_each_entry(ent, &pg->src_list, node)
2151 src_ip.proto = pg->key.addr.proto;
2154 ent = br_multicast_find_group_src(pg, &src_ip);
2163 __grp_src_query_marked_and_rexmit(pg);
2165 if (pg->filter_mode == MCAST_INCLUDE && hlist_empty(&pg->src_list))
2166 br_multicast_find_del_pg(pg->key.port->br, pg);
2173 static bool __grp_src_block_excl(struct net_bridge_port_group *pg,
2181 hlist_for_each_entry(ent, &pg->src_list, node)
2185 src_ip.proto = pg->key.addr.proto;
2188 ent = br_multicast_find_group_src(pg, &src_ip);
2190 ent = br_multicast_new_group_src(pg, &src_ip);
2192 __grp_src_mod_timer(ent, pg->timer.expires);
2204 __grp_src_query_marked_and_rexmit(pg);
2209 static bool br_multicast_block(struct net_bridge_port_group *pg,
2214 switch (pg->filter_mode) {
2216 __grp_src_block_incl(pg, srcs, nsrcs, src_size);
2219 changed = __grp_src_block_excl(pg, srcs, nsrcs, src_size);
2232 struct net_bridge_port_group *pg;
2234 for (pg = mlock_dereference(mp->ports, br);
2235 pg;
2236 pg = mlock_dereference(pg->next, br))
2237 if (br_port_group_equal(pg, p, src))
2238 return pg;
2250 struct net_bridge_port_group *pg;
2313 pg = br_multicast_find_port(mdst, port, src);
2314 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
2320 changed = br_multicast_isinc_allow(pg, grec->grec_src,
2324 changed = br_multicast_isinc_allow(pg, grec->grec_src, nsrcs,
2328 changed = br_multicast_isexc(pg, grec->grec_src, nsrcs,
2332 changed = br_multicast_toin(pg, grec->grec_src, nsrcs,
2336 changed = br_multicast_toex(pg, grec->grec_src, nsrcs,
2340 changed = br_multicast_block(pg, grec->grec_src, nsrcs,
2345 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);
2361 struct net_bridge_port_group *pg;
2440 pg = br_multicast_find_port(mdst, port, src);
2441 if (!pg || (pg->flags & MDB_PG_FLAGS_PERMANENT))
2445 changed = br_multicast_isinc_allow(pg, grec->grec_src,
2450 changed = br_multicast_isinc_allow(pg, grec->grec_src, nsrcs,
2454 changed = br_multicast_isexc(pg, grec->grec_src, nsrcs,
2458 changed = br_multicast_toin(pg, grec->grec_src, nsrcs,
2462 changed = br_multicast_toex(pg, grec->grec_src, nsrcs,
2466 changed = br_multicast_block(pg, grec->grec_src, nsrcs,
2471 br_mdb_notify(br->dev, mdst, pg, RTM_NEWMDB);