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_addr(struct net_bridge *br, const unsigned char *addr) in fdb_add_hw_addr() argument
100 list_for_each_entry(p, &br->port_list, list) { in fdb_add_hw_addr()
110 list_for_each_entry_continue_reverse(p, &br->port_list, list) { in fdb_add_hw_addr()
121 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr) in fdb_del_hw_addr() argument
127 list_for_each_entry(p, &br->port_list, list) { in fdb_del_hw_addr()
133 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f) in fdb_delete() argument
136 fdb_del_hw_addr(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()
491 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in fdb_insert() argument
494 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_insert()
507 br_warn(br, "adding interface %s with same address " in fdb_insert()
509 source ? source->dev->name : br->dev->name); in fdb_insert()
510 fdb_delete(br, fdb); in fdb_insert()
518 fdb_add_hw_addr(br, addr); in fdb_insert()
519 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_insert()
524 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_insert() argument
529 spin_lock_bh(&br->hash_lock); in br_fdb_insert()
530 ret = fdb_insert(br, source, addr, vid); in br_fdb_insert()
531 spin_unlock_bh(&br->hash_lock); in br_fdb_insert()
535 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_update() argument
538 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_update()
543 if (hold_time(br) == 0) in br_fdb_update()
556 br_warn(br, "received packet on %s with " in br_fdb_update()
569 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
572 spin_lock(&br->hash_lock); in br_fdb_update()
578 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
584 spin_unlock(&br->hash_lock); in br_fdb_update()
594 else if (has_expired(fdb->dst->br, fdb)) in fdb_to_nud()
600 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br, in fdb_fill_info() argument
619 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
624 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex)) in fdb_fill_info()
653 static void fdb_notify(struct net_bridge *br, in fdb_notify() argument
656 struct net *net = dev_net(br->dev); in fdb_notify()
664 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
684 struct net_bridge *br = netdev_priv(dev); in br_fdb_dump() local
696 hlist_for_each_entry_rcu(f, &br->hash[i], hlist) { in br_fdb_dump()
715 if (fdb_fill_info(skb, br, f, in br_fdb_dump()
734 struct net_bridge *br = source->br; in fdb_add_entry() local
735 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_add_entry()
764 fdb_add_hw_addr(br, addr); in fdb_add_entry()
770 fdb_add_hw_addr(br, addr); in fdb_add_entry()
776 fdb_del_hw_addr(br, addr); in fdb_add_entry()
787 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_add_entry()
801 br_fdb_update(p->br, p, addr, vid, true); in __br_fdb_add()
805 spin_lock_bh(&p->br->hash_lock); in __br_fdb_add()
808 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_add()
870 static int fdb_delete_by_addr(struct net_bridge *br, const u8 *addr, u16 vlan) in fdb_delete_by_addr() argument
872 struct hlist_head *head = &br->hash[br_mac_hash(addr, vlan)]; in fdb_delete_by_addr()
879 fdb_delete(br, fdb); in fdb_delete_by_addr()
888 spin_lock_bh(&p->br->hash_lock); in __br_fdb_delete()
889 err = fdb_delete_by_addr(p->br, addr, vid); in __br_fdb_delete()
890 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_delete()
938 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_sync_static() argument
947 hlist_for_each_entry(fdb, &br->hash[i], hlist) { in br_fdb_sync_static()
961 hlist_for_each_entry(tmp, &br->hash[i], hlist) { in br_fdb_sync_static()
976 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_unsync_static() argument
984 hlist_for_each_entry_rcu(fdb, &br->hash[i], hlist) { in br_fdb_unsync_static()
994 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_add() argument
1002 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1004 head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_external_learn_add()
1013 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1021 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1025 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1030 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_del() argument
1038 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_del()
1040 head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_external_learn_del()
1043 fdb_delete(br, fdb); in br_fdb_external_learn_del()
1047 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_del()