Lines Matching refs:br
33 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
35 static void fdb_notify(struct net_bridge *br,
62 static inline unsigned long hold_time(const struct net_bridge *br) in hold_time() argument
64 return br->topology_change ? br->forward_delay : br->ageing_time; in hold_time()
67 static inline int has_expired(const struct net_bridge *br, in has_expired() argument
71 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
93 static void fdb_add_hw(struct net_bridge *br, const unsigned char *addr) in fdb_add_hw() argument
100 list_for_each_entry(p, &br->port_list, list) { in fdb_add_hw()
110 list_for_each_entry_continue_reverse(p, &br->port_list, list) { in fdb_add_hw()
121 static void fdb_del_hw(struct net_bridge *br, const unsigned char *addr) in fdb_del_hw() argument
127 list_for_each_entry(p, &br->port_list, list) { in fdb_del_hw()
133 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f) in fdb_delete() argument
136 fdb_del_hw(br, f->addr.addr); in fdb_delete()
139 fdb_notify(br, f, RTM_DELNEIGH); in fdb_delete()
144 static void fdb_delete_local(struct net_bridge *br, in fdb_delete_local() argument
153 list_for_each_entry(op, &br->port_list, list) { in fdb_delete_local()
163 if (p && ether_addr_equal(br->dev->dev_addr, addr) && in fdb_delete_local()
164 (!vid || br_vlan_find(br, vid))) { in fdb_delete_local()
170 fdb_delete(br, f); in fdb_delete_local()
173 void br_fdb_find_delete_local(struct net_bridge *br, in br_fdb_find_delete_local() argument
177 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_find_delete_local()
180 spin_lock_bh(&br->hash_lock); in br_fdb_find_delete_local()
183 fdb_delete_local(br, p, f); in br_fdb_find_delete_local()
184 spin_unlock_bh(&br->hash_lock); in br_fdb_find_delete_local()
189 struct net_bridge *br = p->br; in br_fdb_changeaddr() local
195 spin_lock_bh(&br->hash_lock); in br_fdb_changeaddr()
200 hlist_for_each(h, &br->hash[i]) { in br_fdb_changeaddr()
206 fdb_delete_local(br, p, f); in br_fdb_changeaddr()
220 fdb_insert(br, p, newaddr, 0); in br_fdb_changeaddr()
230 fdb_insert(br, p, newaddr, vid); in br_fdb_changeaddr()
233 spin_unlock_bh(&br->hash_lock); in br_fdb_changeaddr()
236 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr) in br_fdb_change_mac_address() argument
242 spin_lock_bh(&br->hash_lock); in br_fdb_change_mac_address()
245 f = __br_fdb_get(br, br->dev->dev_addr, 0); in br_fdb_change_mac_address()
247 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
249 fdb_insert(br, NULL, newaddr, 0); in br_fdb_change_mac_address()
255 pv = br_get_vlan_info(br); in br_fdb_change_mac_address()
260 f = __br_fdb_get(br, br->dev->dev_addr, vid); in br_fdb_change_mac_address()
262 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
263 fdb_insert(br, NULL, newaddr, vid); in br_fdb_change_mac_address()
266 spin_unlock_bh(&br->hash_lock); in br_fdb_change_mac_address()
271 struct net_bridge *br = (struct net_bridge *)_data; in br_fdb_cleanup() local
272 unsigned long delay = hold_time(br); in br_fdb_cleanup()
273 unsigned long next_timer = jiffies + br->ageing_time; in br_fdb_cleanup()
276 spin_lock(&br->hash_lock); in br_fdb_cleanup()
281 hlist_for_each_entry_safe(f, n, &br->hash[i], hlist) { in br_fdb_cleanup()
287 fdb_delete(br, f); in br_fdb_cleanup()
292 spin_unlock(&br->hash_lock); in br_fdb_cleanup()
294 mod_timer(&br->gc_timer, round_jiffies_up(next_timer)); in br_fdb_cleanup()
298 void br_fdb_flush(struct net_bridge *br) in br_fdb_flush() argument
302 spin_lock_bh(&br->hash_lock); in br_fdb_flush()
306 hlist_for_each_entry_safe(f, n, &br->hash[i], hlist) { in br_fdb_flush()
308 fdb_delete(br, f); in br_fdb_flush()
311 spin_unlock_bh(&br->hash_lock); in br_fdb_flush()
317 void br_fdb_delete_by_port(struct net_bridge *br, in br_fdb_delete_by_port() argument
323 spin_lock_bh(&br->hash_lock); in br_fdb_delete_by_port()
327 hlist_for_each_safe(h, g, &br->hash[i]) { in br_fdb_delete_by_port()
337 fdb_delete_local(br, p, f); in br_fdb_delete_by_port()
339 fdb_delete(br, f); in br_fdb_delete_by_port()
342 spin_unlock_bh(&br->hash_lock); in br_fdb_delete_by_port()
346 struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br, in __br_fdb_get() argument
353 &br->hash[br_mac_hash(addr, vid)], hlist) { in __br_fdb_get()
356 if (unlikely(has_expired(br, fdb))) in __br_fdb_get()
379 fdb = __br_fdb_get(port->br, addr, 0); in br_fdb_test_addr()
393 int br_fdb_fillbuf(struct net_bridge *br, void *buf, in br_fdb_fillbuf() argument
404 hlist_for_each_entry_rcu(f, &br->hash[i], hlist) { in br_fdb_fillbuf()
408 if (has_expired(br, f)) in br_fdb_fillbuf()
490 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in fdb_insert() argument
493 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_insert()
506 br_warn(br, "adding interface %s with same address " in fdb_insert()
508 source ? source->dev->name : br->dev->name); in fdb_insert()
509 fdb_delete(br, fdb); in fdb_insert()
517 fdb_add_hw(br, addr); in fdb_insert()
518 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_insert()
523 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_insert() argument
528 spin_lock_bh(&br->hash_lock); in br_fdb_insert()
529 ret = fdb_insert(br, source, addr, vid); in br_fdb_insert()
530 spin_unlock_bh(&br->hash_lock); in br_fdb_insert()
534 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_update() argument
537 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_update()
542 if (hold_time(br) == 0) in br_fdb_update()
555 br_warn(br, "received packet on %s with " in br_fdb_update()
568 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
571 spin_lock(&br->hash_lock); in br_fdb_update()
577 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
583 spin_unlock(&br->hash_lock); in br_fdb_update()
593 else if (has_expired(fdb->dst->br, fdb)) in fdb_to_nud()
599 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br, in fdb_fill_info() argument
618 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
623 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex)) in fdb_fill_info()
651 static void fdb_notify(struct net_bridge *br, in fdb_notify() argument
654 struct net *net = dev_net(br->dev); in fdb_notify()
662 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
682 struct net_bridge *br = netdev_priv(dev); in br_fdb_dump() local
691 hlist_for_each_entry_rcu(f, &br->hash[i], hlist) { in br_fdb_dump()
708 if (fdb_fill_info(skb, br, f, in br_fdb_dump()
727 struct net_bridge *br = source->br; in fdb_add_entry() local
728 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_add_entry()
757 fdb_add_hw(br, addr); in fdb_add_entry()
763 fdb_add_hw(br, addr); in fdb_add_entry()
769 fdb_del_hw(br, addr); in fdb_add_entry()
780 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_add_entry()
794 br_fdb_update(p->br, p, addr, vid, true); in __br_fdb_add()
798 spin_lock_bh(&p->br->hash_lock); in __br_fdb_add()
801 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_add()
880 static int fdb_delete_by_addr(struct net_bridge *br, const u8 *addr, u16 vlan) in fdb_delete_by_addr() argument
882 struct hlist_head *head = &br->hash[br_mac_hash(addr, vlan)]; in fdb_delete_by_addr()
889 fdb_delete(br, fdb); in fdb_delete_by_addr()
898 spin_lock_bh(&p->br->hash_lock); in __br_fdb_delete()
899 err = fdb_delete_by_addr(p->br, addr, vid); in __br_fdb_delete()
900 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_delete()
964 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_sync_static() argument
973 hlist_for_each_entry(fdb, &br->hash[i], hlist) { in br_fdb_sync_static()
987 hlist_for_each_entry(tmp, &br->hash[i], hlist) { in br_fdb_sync_static()
1002 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_unsync_static() argument
1010 hlist_for_each_entry_rcu(fdb, &br->hash[i], hlist) { in br_fdb_unsync_static()