Lines Matching refs:br
34 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
36 static void fdb_notify(struct net_bridge *br,
63 static inline unsigned long hold_time(const struct net_bridge *br) in hold_time() argument
65 return br->topology_change ? br->forward_delay : br->ageing_time; in hold_time()
68 static inline int has_expired(const struct net_bridge *br, in has_expired() argument
72 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
94 static void fdb_add_hw_addr(struct net_bridge *br, const unsigned char *addr) in fdb_add_hw_addr() argument
101 list_for_each_entry(p, &br->port_list, list) { in fdb_add_hw_addr()
111 list_for_each_entry_continue_reverse(p, &br->port_list, list) { in fdb_add_hw_addr()
122 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr) in fdb_del_hw_addr() argument
128 list_for_each_entry(p, &br->port_list, list) { in fdb_del_hw_addr()
148 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f) in fdb_delete() argument
151 fdb_del_hw_addr(br, f->addr.addr); in fdb_delete()
157 fdb_notify(br, f, RTM_DELNEIGH); in fdb_delete()
162 static void fdb_delete_local(struct net_bridge *br, in fdb_delete_local() argument
173 list_for_each_entry(op, &br->port_list, list) { in fdb_delete_local()
183 vg = br_vlan_group(br); in fdb_delete_local()
186 if (p && ether_addr_equal(br->dev->dev_addr, addr) && in fdb_delete_local()
193 fdb_delete(br, f); in fdb_delete_local()
196 void br_fdb_find_delete_local(struct net_bridge *br, in br_fdb_find_delete_local() argument
200 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_find_delete_local()
203 spin_lock_bh(&br->hash_lock); in br_fdb_find_delete_local()
206 fdb_delete_local(br, p, f); in br_fdb_find_delete_local()
207 spin_unlock_bh(&br->hash_lock); in br_fdb_find_delete_local()
213 struct net_bridge *br = p->br; in br_fdb_changeaddr() local
217 spin_lock_bh(&br->hash_lock); in br_fdb_changeaddr()
223 hlist_for_each(h, &br->hash[i]) { in br_fdb_changeaddr()
229 fdb_delete_local(br, p, f); in br_fdb_changeaddr()
243 fdb_insert(br, p, newaddr, 0); in br_fdb_changeaddr()
253 fdb_insert(br, p, newaddr, v->vid); in br_fdb_changeaddr()
256 spin_unlock_bh(&br->hash_lock); in br_fdb_changeaddr()
259 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr) in br_fdb_change_mac_address() argument
265 spin_lock_bh(&br->hash_lock); in br_fdb_change_mac_address()
268 f = __br_fdb_get(br, br->dev->dev_addr, 0); in br_fdb_change_mac_address()
270 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
272 fdb_insert(br, NULL, newaddr, 0); in br_fdb_change_mac_address()
273 vg = br_vlan_group(br); in br_fdb_change_mac_address()
283 f = __br_fdb_get(br, br->dev->dev_addr, v->vid); in br_fdb_change_mac_address()
285 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
286 fdb_insert(br, NULL, newaddr, v->vid); in br_fdb_change_mac_address()
289 spin_unlock_bh(&br->hash_lock); in br_fdb_change_mac_address()
294 struct net_bridge *br = (struct net_bridge *)_data; in br_fdb_cleanup() local
295 unsigned long delay = hold_time(br); in br_fdb_cleanup()
296 unsigned long next_timer = jiffies + br->ageing_time; in br_fdb_cleanup()
299 spin_lock(&br->hash_lock); in br_fdb_cleanup()
304 hlist_for_each_entry_safe(f, n, &br->hash[i], hlist) { in br_fdb_cleanup()
312 fdb_delete(br, f); in br_fdb_cleanup()
317 spin_unlock(&br->hash_lock); in br_fdb_cleanup()
319 mod_timer(&br->gc_timer, round_jiffies_up(next_timer)); in br_fdb_cleanup()
323 void br_fdb_flush(struct net_bridge *br) in br_fdb_flush() argument
327 spin_lock_bh(&br->hash_lock); in br_fdb_flush()
331 hlist_for_each_entry_safe(f, n, &br->hash[i], hlist) { in br_fdb_flush()
333 fdb_delete(br, f); in br_fdb_flush()
336 spin_unlock_bh(&br->hash_lock); in br_fdb_flush()
343 void br_fdb_delete_by_port(struct net_bridge *br, in br_fdb_delete_by_port() argument
350 spin_lock_bh(&br->hash_lock); in br_fdb_delete_by_port()
354 hlist_for_each_safe(h, g, &br->hash[i]) { in br_fdb_delete_by_port()
365 fdb_delete_local(br, p, f); in br_fdb_delete_by_port()
367 fdb_delete(br, f); in br_fdb_delete_by_port()
370 spin_unlock_bh(&br->hash_lock); in br_fdb_delete_by_port()
374 struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br, in __br_fdb_get() argument
381 &br->hash[br_mac_hash(addr, vid)], hlist) { in __br_fdb_get()
384 if (unlikely(has_expired(br, fdb))) in __br_fdb_get()
407 fdb = __br_fdb_get(port->br, addr, 0); in br_fdb_test_addr()
421 int br_fdb_fillbuf(struct net_bridge *br, void *buf, in br_fdb_fillbuf() argument
432 hlist_for_each_entry_rcu(f, &br->hash[i], hlist) { in br_fdb_fillbuf()
436 if (has_expired(br, f)) in br_fdb_fillbuf()
521 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in fdb_insert() argument
524 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_insert()
537 br_warn(br, "adding interface %s with same address " in fdb_insert()
539 source ? source->dev->name : br->dev->name); in fdb_insert()
540 fdb_delete(br, fdb); in fdb_insert()
547 fdb_add_hw_addr(br, addr); in fdb_insert()
548 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_insert()
553 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_insert() argument
558 spin_lock_bh(&br->hash_lock); in br_fdb_insert()
559 ret = fdb_insert(br, source, addr, vid); in br_fdb_insert()
560 spin_unlock_bh(&br->hash_lock); in br_fdb_insert()
564 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_update() argument
567 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_update()
572 if (hold_time(br) == 0) in br_fdb_update()
585 br_warn(br, "received packet on %s with " in br_fdb_update()
598 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
601 spin_lock(&br->hash_lock); in br_fdb_update()
607 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
613 spin_unlock(&br->hash_lock); in br_fdb_update()
617 static int fdb_to_nud(const struct net_bridge *br, in fdb_to_nud() argument
624 else if (has_expired(br, fdb)) in fdb_to_nud()
630 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br, in fdb_fill_info() argument
649 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
650 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
654 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex)) in fdb_fill_info()
683 static void fdb_notify(struct net_bridge *br, in fdb_notify() argument
686 struct net *net = dev_net(br->dev); in fdb_notify()
694 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
714 struct net_bridge *br = netdev_priv(dev); in br_fdb_dump() local
726 hlist_for_each_entry_rcu(f, &br->hash[i], hlist) { in br_fdb_dump()
745 if (fdb_fill_info(skb, br, f, in br_fdb_dump()
764 struct net_bridge *br = source->br; in fdb_add_entry() local
765 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_add_entry()
795 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
800 fdb_add_hw_addr(br, addr); in fdb_add_entry()
806 fdb_add_hw_addr(br, addr); in fdb_add_entry()
812 fdb_del_hw_addr(br, addr); in fdb_add_entry()
823 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_add_entry()
837 br_fdb_update(p->br, p, addr, vid, true); in __br_fdb_add()
841 spin_lock_bh(&p->br->hash_lock); in __br_fdb_add()
844 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_add()
858 struct net_bridge *br = NULL; in br_fdb_add() local
872 br = netdev_priv(dev); in br_fdb_add()
873 vg = br_vlan_group(br); in br_fdb_add()
893 err = br_fdb_insert(br, NULL, addr, vid); in br_fdb_add()
898 err = br_fdb_insert(br, NULL, addr, 0); in br_fdb_add()
912 err = br_fdb_insert(br, NULL, addr, v->vid); in br_fdb_add()
925 static int fdb_delete_by_addr(struct net_bridge *br, const u8 *addr, in fdb_delete_by_addr() argument
928 struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; in fdb_delete_by_addr()
935 fdb_delete(br, fdb); in fdb_delete_by_addr()
939 static int __br_fdb_delete_by_addr(struct net_bridge *br, in __br_fdb_delete_by_addr() argument
944 spin_lock_bh(&br->hash_lock); in __br_fdb_delete_by_addr()
945 err = fdb_delete_by_addr(br, addr, vid); in __br_fdb_delete_by_addr()
946 spin_unlock_bh(&br->hash_lock); in __br_fdb_delete_by_addr()
954 struct net_bridge *br = p->br; in fdb_delete_by_addr_and_port() local
955 struct hlist_head *head = &br->hash[br_mac_hash(addr, vlan)]; in fdb_delete_by_addr_and_port()
962 fdb_delete(br, fdb); in fdb_delete_by_addr_and_port()
971 spin_lock_bh(&p->br->hash_lock); in __br_fdb_delete()
973 spin_unlock_bh(&p->br->hash_lock); in __br_fdb_delete()
986 struct net_bridge *br = NULL; in br_fdb_delete() local
990 br = netdev_priv(dev); in br_fdb_delete()
991 vg = br_vlan_group(br); in br_fdb_delete()
1010 err = __br_fdb_delete_by_addr(br, addr, vid); in br_fdb_delete()
1016 err = __br_fdb_delete_by_addr(br, addr, 0); in br_fdb_delete()
1027 err = __br_fdb_delete_by_addr(br, addr, v->vid); in br_fdb_delete()
1036 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_sync_static() argument
1045 hlist_for_each_entry(fdb, &br->hash[i], hlist) { in br_fdb_sync_static()
1059 hlist_for_each_entry(tmp, &br->hash[i], hlist) { in br_fdb_sync_static()
1074 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_unsync_static() argument
1082 hlist_for_each_entry_rcu(fdb, &br->hash[i], hlist) { in br_fdb_unsync_static()
1092 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_add() argument
1100 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1102 head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_external_learn_add()
1111 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1119 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1123 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1128 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_del() argument
1136 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_del()
1138 head = &br->hash[br_mac_hash(addr, vid)]; in br_fdb_external_learn_del()
1141 fdb_delete(br, fdb); in br_fdb_external_learn_del()
1145 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_del()