Lines Matching refs:mdb
59 static inline int __br_ip4_hash(struct net_bridge_mdb_htable *mdb, __be32 ip, in __br_ip4_hash() argument
62 return jhash_2words((__force u32)ip, vid, mdb->secret) & (mdb->max - 1); in __br_ip4_hash()
66 static inline int __br_ip6_hash(struct net_bridge_mdb_htable *mdb, in __br_ip6_hash() argument
71 mdb->secret) & (mdb->max - 1); in __br_ip6_hash()
75 static inline int br_ip_hash(struct net_bridge_mdb_htable *mdb, in br_ip_hash() argument
80 return __br_ip4_hash(mdb, ip->u.ip4, ip->vid); in br_ip_hash()
83 return __br_ip6_hash(mdb, &ip->u.ip6, ip->vid); in br_ip_hash()
90 struct net_bridge_mdb_htable *mdb, struct br_ip *dst, int hash) in __br_mdb_ip_get() argument
94 hlist_for_each_entry_rcu(mp, &mdb->mhash[hash], hlist[mdb->ver]) { in __br_mdb_ip_get()
102 struct net_bridge_mdb_entry *br_mdb_ip_get(struct net_bridge_mdb_htable *mdb, in br_mdb_ip_get() argument
105 if (!mdb) in br_mdb_ip_get()
108 return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst)); in br_mdb_ip_get()
112 struct net_bridge_mdb_htable *mdb, __be32 dst, __u16 vid) in br_mdb_ip4_get() argument
120 return br_mdb_ip_get(mdb, &br_dst); in br_mdb_ip4_get()
125 struct net_bridge_mdb_htable *mdb, const struct in6_addr *dst, in br_mdb_ip6_get() argument
134 return br_mdb_ip_get(mdb, &br_dst); in br_mdb_ip6_get()
141 struct net_bridge_mdb_htable *mdb = rcu_dereference(br->mdb); in br_mdb_get() local
166 return br_mdb_ip_get(mdb, &ip); in br_mdb_get()
171 struct net_bridge_mdb_htable *mdb = in br_mdb_free() local
173 struct net_bridge_mdb_htable *old = mdb->old; in br_mdb_free()
175 mdb->old = NULL; in br_mdb_free()
229 struct net_bridge_mdb_htable *mdb; in br_multicast_group_expired() local
240 mdb = mlock_dereference(br->mdb, br); in br_multicast_group_expired()
242 hlist_del_rcu(&mp->hlist[mdb->ver]); in br_multicast_group_expired()
243 mdb->size--; in br_multicast_group_expired()
254 struct net_bridge_mdb_htable *mdb; in br_multicast_del_pg() local
259 mdb = mlock_dereference(br->mdb, br); in br_multicast_del_pg()
261 mp = br_mdb_ip_get(mdb, &pg->addr); in br_multicast_del_pg()
306 struct net_bridge_mdb_htable *mdb; in br_mdb_rehash() local
309 mdb = kmalloc(sizeof(*mdb), GFP_ATOMIC); in br_mdb_rehash()
310 if (!mdb) in br_mdb_rehash()
313 mdb->max = max; in br_mdb_rehash()
314 mdb->old = old; in br_mdb_rehash()
316 mdb->mhash = kzalloc(max * sizeof(*mdb->mhash), GFP_ATOMIC); in br_mdb_rehash()
317 if (!mdb->mhash) { in br_mdb_rehash()
318 kfree(mdb); in br_mdb_rehash()
322 mdb->size = old ? old->size : 0; in br_mdb_rehash()
323 mdb->ver = old ? old->ver ^ 1 : 0; in br_mdb_rehash()
326 get_random_bytes(&mdb->secret, sizeof(mdb->secret)); in br_mdb_rehash()
328 mdb->secret = old->secret; in br_mdb_rehash()
333 err = br_mdb_copy(mdb, old, elasticity); in br_mdb_rehash()
335 kfree(mdb->mhash); in br_mdb_rehash()
336 kfree(mdb); in br_mdb_rehash()
341 call_rcu_bh(&mdb->rcu, br_mdb_free); in br_mdb_rehash()
344 rcu_assign_pointer(*mdbp, mdb); in br_mdb_rehash()
516 struct net_bridge_mdb_htable *mdb; in br_multicast_get_group() local
523 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_get_group()
524 hlist_for_each_entry(mp, &mdb->mhash[hash], hlist[mdb->ver]) { in br_multicast_get_group()
531 max = mdb->max; in br_multicast_get_group()
542 if (mdb->size >= max) { in br_multicast_get_group()
556 if (max > mdb->max || elasticity) { in br_multicast_get_group()
557 if (mdb->old) { in br_multicast_get_group()
566 err = br_mdb_rehash(&br->mdb, max, elasticity); in br_multicast_get_group()
571 mdb->size, err); in br_multicast_get_group()
589 struct net_bridge_mdb_htable *mdb; in br_multicast_new_group() local
594 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
595 if (!mdb) { in br_multicast_new_group()
596 err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0); in br_multicast_new_group()
602 hash = br_ip_hash(mdb, group); in br_multicast_new_group()
610 mdb = rcu_dereference_protected(br->mdb, 1); in br_multicast_new_group()
611 hash = br_ip_hash(mdb, group); in br_multicast_new_group()
627 hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]); in br_multicast_new_group()
628 mdb->size++; in br_multicast_new_group()
1281 mp = br_mdb_ip4_get(mlock_dereference(br->mdb, br), group, vid); in br_ip4_multicast_query()
1379 mp = br_mdb_ip6_get(mlock_dereference(br->mdb, br), group, vid); in br_ip6_multicast_query()
1412 struct net_bridge_mdb_htable *mdb; in br_multicast_leave_group() local
1424 mdb = mlock_dereference(br->mdb, br); in br_multicast_leave_group()
1425 mp = br_mdb_ip_get(mdb, group); in br_multicast_leave_group()
1906 struct net_bridge_mdb_htable *mdb; in br_multicast_stop() local
1921 mdb = mlock_dereference(br->mdb, br); in br_multicast_stop()
1922 if (!mdb) in br_multicast_stop()
1925 br->mdb = NULL; in br_multicast_stop()
1927 ver = mdb->ver; in br_multicast_stop()
1928 for (i = 0; i < mdb->max; i++) { in br_multicast_stop()
1929 hlist_for_each_entry_safe(mp, n, &mdb->mhash[i], in br_multicast_stop()
1936 if (mdb->old) { in br_multicast_stop()
1940 WARN_ON(mdb->old); in br_multicast_stop()
1943 mdb->old = mdb; in br_multicast_stop()
1944 call_rcu_bh(&mdb->rcu, br_mdb_free); in br_multicast_stop()
2044 struct net_bridge_mdb_htable *mdb; in br_multicast_toggle() local
2057 mdb = mlock_dereference(br->mdb, br); in br_multicast_toggle()
2058 if (mdb) { in br_multicast_toggle()
2059 if (mdb->old) { in br_multicast_toggle()
2066 err = br_mdb_rehash(&br->mdb, mdb->max, in br_multicast_toggle()
2121 struct net_bridge_mdb_htable *mdb; in br_multicast_set_hash_max() local
2131 mdb = mlock_dereference(br->mdb, br); in br_multicast_set_hash_max()
2132 if (mdb && val < mdb->size) in br_multicast_set_hash_max()
2140 if (mdb) { in br_multicast_set_hash_max()
2141 if (mdb->old) { in br_multicast_set_hash_max()
2148 err = br_mdb_rehash(&br->mdb, br->hash_max, in br_multicast_set_hash_max()