• Home
  • Raw
  • Download

Lines Matching refs:br

35 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
37 static void fdb_notify(struct net_bridge *br,
57 int br_fdb_hash_init(struct net_bridge *br) in br_fdb_hash_init() argument
59 return rhashtable_init(&br->fdb_hash_tbl, &br_fdb_rht_params); in br_fdb_hash_init()
62 void br_fdb_hash_fini(struct net_bridge *br) in br_fdb_hash_fini() argument
64 rhashtable_destroy(&br->fdb_hash_tbl); in br_fdb_hash_fini()
70 static inline unsigned long hold_time(const struct net_bridge *br) in hold_time() argument
72 return br->topology_change ? br->forward_delay : br->ageing_time; in hold_time()
75 static inline int has_expired(const struct net_bridge *br, in has_expired() argument
80 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
105 static struct net_bridge_fdb_entry *br_fdb_find(struct net_bridge *br, in br_fdb_find() argument
111 lockdep_assert_held_once(&br->hash_lock); in br_fdb_find()
114 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find()
126 struct net_bridge *br; in br_fdb_find_port() local
133 br = netdev_priv(br_dev); in br_fdb_find_port()
135 f = br_fdb_find_rcu(br, addr, vid); in br_fdb_find_port()
144 struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br, in br_fdb_find_rcu() argument
148 return fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find_rcu()
156 static void fdb_add_hw_addr(struct net_bridge *br, const unsigned char *addr) in fdb_add_hw_addr() argument
163 list_for_each_entry(p, &br->port_list, list) { in fdb_add_hw_addr()
173 list_for_each_entry_continue_reverse(p, &br->port_list, list) { in fdb_add_hw_addr()
184 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr) in fdb_del_hw_addr() argument
190 list_for_each_entry(p, &br->port_list, list) { in fdb_del_hw_addr()
196 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f, in fdb_delete() argument
199 trace_fdb_delete(br, f); in fdb_delete()
202 fdb_del_hw_addr(br, f->key.addr.addr); in fdb_delete()
205 rhashtable_remove_fast(&br->fdb_hash_tbl, &f->rhnode, in fdb_delete()
207 fdb_notify(br, f, RTM_DELNEIGH, swdev_notify); in fdb_delete()
212 static void fdb_delete_local(struct net_bridge *br, in fdb_delete_local() argument
223 list_for_each_entry(op, &br->port_list, list) { in fdb_delete_local()
233 vg = br_vlan_group(br); in fdb_delete_local()
236 if (p && ether_addr_equal(br->dev->dev_addr, addr) && in fdb_delete_local()
243 fdb_delete(br, f, true); in fdb_delete_local()
246 void br_fdb_find_delete_local(struct net_bridge *br, in br_fdb_find_delete_local() argument
252 spin_lock_bh(&br->hash_lock); in br_fdb_find_delete_local()
253 f = br_fdb_find(br, addr, vid); in br_fdb_find_delete_local()
256 fdb_delete_local(br, p, f); in br_fdb_find_delete_local()
257 spin_unlock_bh(&br->hash_lock); in br_fdb_find_delete_local()
264 struct net_bridge *br = p->br; in br_fdb_changeaddr() local
267 spin_lock_bh(&br->hash_lock); in br_fdb_changeaddr()
269 hlist_for_each_entry(f, &br->fdb_list, fdb_node) { in br_fdb_changeaddr()
273 fdb_delete_local(br, p, f); in br_fdb_changeaddr()
286 fdb_insert(br, p, newaddr, 0); in br_fdb_changeaddr()
296 fdb_insert(br, p, newaddr, v->vid); in br_fdb_changeaddr()
299 spin_unlock_bh(&br->hash_lock); in br_fdb_changeaddr()
302 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr) in br_fdb_change_mac_address() argument
308 spin_lock_bh(&br->hash_lock); in br_fdb_change_mac_address()
311 f = br_fdb_find(br, br->dev->dev_addr, 0); in br_fdb_change_mac_address()
314 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
316 fdb_insert(br, NULL, newaddr, 0); in br_fdb_change_mac_address()
317 vg = br_vlan_group(br); in br_fdb_change_mac_address()
327 f = br_fdb_find(br, br->dev->dev_addr, v->vid); in br_fdb_change_mac_address()
330 fdb_delete_local(br, NULL, f); in br_fdb_change_mac_address()
331 fdb_insert(br, NULL, newaddr, v->vid); in br_fdb_change_mac_address()
334 spin_unlock_bh(&br->hash_lock); in br_fdb_change_mac_address()
339 struct net_bridge *br = container_of(work, struct net_bridge, in br_fdb_cleanup() local
342 unsigned long delay = hold_time(br); in br_fdb_cleanup()
351 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) { in br_fdb_cleanup()
362 fdb_notify(br, f, RTM_NEWNEIGH, false); in br_fdb_cleanup()
370 spin_lock_bh(&br->hash_lock); in br_fdb_cleanup()
372 fdb_delete(br, f, true); in br_fdb_cleanup()
373 spin_unlock_bh(&br->hash_lock); in br_fdb_cleanup()
380 mod_delayed_work(system_long_wq, &br->gc_work, work_delay); in br_fdb_cleanup()
384 void br_fdb_flush(struct net_bridge *br) in br_fdb_flush() argument
389 spin_lock_bh(&br->hash_lock); in br_fdb_flush()
390 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) { in br_fdb_flush()
392 fdb_delete(br, f, true); in br_fdb_flush()
394 spin_unlock_bh(&br->hash_lock); in br_fdb_flush()
401 void br_fdb_delete_by_port(struct net_bridge *br, in br_fdb_delete_by_port() argument
409 spin_lock_bh(&br->hash_lock); in br_fdb_delete_by_port()
410 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) { in br_fdb_delete_by_port()
422 fdb_delete_local(br, p, f); in br_fdb_delete_by_port()
424 fdb_delete(br, f, true); in br_fdb_delete_by_port()
426 spin_unlock_bh(&br->hash_lock); in br_fdb_delete_by_port()
445 fdb = br_fdb_find_rcu(port->br, addr, 0); in br_fdb_test_addr()
462 int br_fdb_fillbuf(struct net_bridge *br, void *buf, in br_fdb_fillbuf() argument
472 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) { in br_fdb_fillbuf()
476 if (has_expired(br, f)) in br_fdb_fillbuf()
506 static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br, in fdb_create() argument
521 if (rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, in fdb_create()
527 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list); in fdb_create()
533 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in fdb_insert() argument
541 fdb = br_fdb_find(br, addr, vid); in fdb_insert()
548 br_warn(br, "adding interface %s with same address as a received packet (addr:%pM, vlan:%u)\n", in fdb_insert()
549 source ? source->dev->name : br->dev->name, addr, vid); in fdb_insert()
550 fdb_delete(br, fdb, true); in fdb_insert()
553 fdb = fdb_create(br, source, addr, vid, in fdb_insert()
558 fdb_add_hw_addr(br, addr); in fdb_insert()
559 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_insert()
564 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_insert() argument
569 spin_lock_bh(&br->hash_lock); in br_fdb_insert()
570 ret = fdb_insert(br, source, addr, vid); in br_fdb_insert()
571 spin_unlock_bh(&br->hash_lock); in br_fdb_insert()
582 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, in br_fdb_update() argument
588 if (hold_time(br) == 0) in br_fdb_update()
591 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_update()
596 br_warn(br, "received packet on %s with own address as source address (addr:%pM, vlan:%u)\n", in br_fdb_update()
610 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH); in br_fdb_update()
623 trace_br_fdb_update(br, source, addr, vid, flags); in br_fdb_update()
624 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
628 spin_lock(&br->hash_lock); in br_fdb_update()
629 fdb = fdb_create(br, source, addr, vid, flags); in br_fdb_update()
631 trace_br_fdb_update(br, source, addr, vid, flags); in br_fdb_update()
632 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
637 spin_unlock(&br->hash_lock); in br_fdb_update()
641 static int fdb_to_nud(const struct net_bridge *br, in fdb_to_nud() argument
648 else if (has_expired(br, fdb)) in fdb_to_nud()
654 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br, in fdb_fill_info() argument
674 ndm->ndm_ifindex = dst ? dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
675 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
686 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex)) in fdb_fill_info()
735 static int br_fdb_replay_one(struct net_bridge *br, struct notifier_block *nb, in br_fdb_replay_one() argument
748 item.info.dev = (!p || item.is_local) ? br->dev : p->dev; in br_fdb_replay_one()
759 struct net_bridge *br; in br_fdb_replay() local
769 br = netdev_priv(br_dev); in br_fdb_replay()
778 hlist_for_each_entry_rcu(fdb, &br->fdb_list, fdb_node) { in br_fdb_replay()
779 err = br_fdb_replay_one(br, nb, fdb, action, ctx); in br_fdb_replay()
789 static void fdb_notify(struct net_bridge *br, in fdb_notify() argument
793 struct net *net = dev_net(br->dev); in fdb_notify()
798 br_switchdev_fdb_notify(br, fdb, type); in fdb_notify()
804 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
824 struct net_bridge *br = netdev_priv(dev); in br_fdb_dump() local
838 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) { in br_fdb_dump()
855 err = fdb_fill_info(skb, br, f, in br_fdb_dump()
877 struct net_bridge *br = netdev_priv(dev); in br_fdb_get() local
882 f = br_fdb_find_rcu(br, addr, vid); in br_fdb_get()
889 err = fdb_fill_info(skb, br, f, portid, seq, in br_fdb_get()
921 static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source, in fdb_add_entry() argument
940 br->dev->name); in fdb_add_entry()
954 fdb = br_fdb_find(br, addr, vid); in fdb_add_entry()
959 fdb = fdb_create(br, source, addr, vid, 0); in fdb_add_entry()
974 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
978 fdb_add_hw_addr(br, addr); in fdb_add_entry()
982 fdb_add_hw_addr(br, addr); in fdb_add_entry()
986 fdb_del_hw_addr(br, addr); in fdb_add_entry()
1006 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_entry()
1012 static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br, in __br_fdb_add() argument
1022 br->dev->name); in __br_fdb_add()
1030 br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER)); in __br_fdb_add()
1039 err = br_fdb_external_learn_add(br, p, addr, vid, true); in __br_fdb_add()
1041 spin_lock_bh(&br->hash_lock); in __br_fdb_add()
1042 err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb); in __br_fdb_add()
1043 spin_unlock_bh(&br->hash_lock); in __br_fdb_add()
1064 struct net_bridge *br = NULL; in br_fdb_add() local
1080 br = netdev_priv(dev); in br_fdb_add()
1081 vg = br_vlan_group(br); in br_fdb_add()
1089 br = p->br; in br_fdb_add()
1111 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, vid, nfea_tb, in br_fdb_add()
1114 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, 0, nfea_tb, in br_fdb_add()
1126 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, v->vid, in br_fdb_add()
1137 static int fdb_delete_by_addr_and_port(struct net_bridge *br, in fdb_delete_by_addr_and_port() argument
1143 fdb = br_fdb_find(br, addr, vlan); in fdb_delete_by_addr_and_port()
1147 fdb_delete(br, fdb, true); in fdb_delete_by_addr_and_port()
1152 static int __br_fdb_delete(struct net_bridge *br, in __br_fdb_delete() argument
1158 spin_lock_bh(&br->hash_lock); in __br_fdb_delete()
1159 err = fdb_delete_by_addr_and_port(br, p, addr, vid); in __br_fdb_delete()
1160 spin_unlock_bh(&br->hash_lock); in __br_fdb_delete()
1173 struct net_bridge *br; in br_fdb_delete() local
1177 br = netdev_priv(dev); in br_fdb_delete()
1178 vg = br_vlan_group(br); in br_fdb_delete()
1187 br = p->br; in br_fdb_delete()
1197 err = __br_fdb_delete(br, p, addr, vid); in br_fdb_delete()
1200 err &= __br_fdb_delete(br, p, addr, 0); in br_fdb_delete()
1207 err &= __br_fdb_delete(br, p, addr, v->vid); in br_fdb_delete()
1214 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_sync_static() argument
1223 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) { in br_fdb_sync_static()
1237 hlist_for_each_entry_rcu(tmp, &br->fdb_list, fdb_node) { in br_fdb_sync_static()
1249 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) in br_fdb_unsync_static() argument
1256 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) { in br_fdb_unsync_static()
1266 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_add() argument
1274 trace_br_fdb_external_learn_add(br, p, addr, vid); in br_fdb_external_learn_add()
1276 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1278 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_add()
1288 fdb = fdb_create(br, p, addr, vid, flags); in br_fdb_external_learn_add()
1293 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1318 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1322 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_add()
1327 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_external_learn_del() argument
1334 spin_lock_bh(&br->hash_lock); in br_fdb_external_learn_del()
1336 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_del()
1338 fdb_delete(br, fdb, swdev_notify); in br_fdb_external_learn_del()
1342 spin_unlock_bh(&br->hash_lock); in br_fdb_external_learn_del()
1347 void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p, in br_fdb_offloaded_set() argument
1352 spin_lock_bh(&br->hash_lock); in br_fdb_offloaded_set()
1354 fdb = br_fdb_find(br, addr, vid); in br_fdb_offloaded_set()
1358 spin_unlock_bh(&br->hash_lock); in br_fdb_offloaded_set()
1372 spin_lock_bh(&p->br->hash_lock); in br_fdb_clear_offload()
1373 hlist_for_each_entry(f, &p->br->fdb_list, fdb_node) { in br_fdb_clear_offload()
1377 spin_unlock_bh(&p->br->hash_lock); in br_fdb_clear_offload()