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)
59 return rhashtable_init(&br->fdb_hash_tbl, &br_fdb_rht_params);
62 void br_fdb_hash_fini(struct net_bridge *br)
64 rhashtable_destroy(&br->fdb_hash_tbl);
70 static inline unsigned long hold_time(const struct net_bridge *br)
72 return br->topology_change ? br->forward_delay : br->ageing_time;
75 static inline int has_expired(const struct net_bridge *br,
80 time_before_eq(fdb->updated + hold_time(br), jiffies);
105 static struct net_bridge_fdb_entry *br_fdb_find(struct net_bridge *br,
111 lockdep_assert_held_once(&br->hash_lock);
114 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
126 struct net_bridge *br;
133 br = netdev_priv(br_dev);
135 f = br_fdb_find_rcu(br, addr, vid);
144 struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br,
148 return fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
156 static void fdb_add_hw_addr(struct net_bridge *br, const unsigned char *addr)
163 list_for_each_entry(p, &br->port_list, list) {
173 list_for_each_entry_continue_reverse(p, &br->port_list, list) {
184 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr)
190 list_for_each_entry(p, &br->port_list, list) {
196 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f,
199 trace_fdb_delete(br, f);
202 fdb_del_hw_addr(br, f->key.addr.addr);
205 rhashtable_remove_fast(&br->fdb_hash_tbl, &f->rhnode,
207 fdb_notify(br, f, RTM_DELNEIGH, swdev_notify);
212 static void fdb_delete_local(struct net_bridge *br,
223 list_for_each_entry(op, &br->port_list, list) {
233 vg = br_vlan_group(br);
236 if (p && ether_addr_equal(br->dev->dev_addr, addr) &&
243 fdb_delete(br, f, true);
246 void br_fdb_find_delete_local(struct net_bridge *br,
252 spin_lock_bh(&br->hash_lock);
253 f = br_fdb_find(br, addr, vid);
256 fdb_delete_local(br, p, f);
257 spin_unlock_bh(&br->hash_lock);
264 struct net_bridge *br = p->br;
267 spin_lock_bh(&br->hash_lock);
269 hlist_for_each_entry(f, &br->fdb_list, fdb_node) {
273 fdb_delete_local(br, p, f);
286 fdb_insert(br, p, newaddr, 0);
296 fdb_insert(br, p, newaddr, v->vid);
299 spin_unlock_bh(&br->hash_lock);
302 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr)
308 spin_lock_bh(&br->hash_lock);
311 f = br_fdb_find(br, br->dev->dev_addr, 0);
314 fdb_delete_local(br, NULL, f);
316 fdb_insert(br, NULL, newaddr, 0);
317 vg = br_vlan_group(br);
327 f = br_fdb_find(br, br->dev->dev_addr, v->vid);
330 fdb_delete_local(br, NULL, f);
331 fdb_insert(br, NULL, newaddr, v->vid);
334 spin_unlock_bh(&br->hash_lock);
339 struct net_bridge *br = container_of(work, struct net_bridge,
342 unsigned long delay = hold_time(br);
351 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
362 fdb_notify(br, f, RTM_NEWNEIGH, false);
370 spin_lock_bh(&br->hash_lock);
372 fdb_delete(br, f, true);
373 spin_unlock_bh(&br->hash_lock);
380 mod_delayed_work(system_long_wq, &br->gc_work, work_delay);
384 void br_fdb_flush(struct net_bridge *br)
389 spin_lock_bh(&br->hash_lock);
390 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) {
392 fdb_delete(br, f, true);
394 spin_unlock_bh(&br->hash_lock);
401 void br_fdb_delete_by_port(struct net_bridge *br,
409 spin_lock_bh(&br->hash_lock);
410 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) {
422 fdb_delete_local(br, p, f);
424 fdb_delete(br, f, true);
426 spin_unlock_bh(&br->hash_lock);
443 fdb = br_fdb_find_rcu(port->br, addr, 0);
457 int br_fdb_fillbuf(struct net_bridge *br, void *buf,
467 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
471 if (has_expired(br, f))
501 static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br,
516 if (rhashtable_lookup_insert_fast(&br->fdb_hash_tbl,
522 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list);
528 static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
536 fdb = br_fdb_find(br, addr, vid);
543 br_warn(br, "adding interface %s with same address as a received packet (addr:%pM, vlan:%u)\n",
544 source ? source->dev->name : br->dev->name, addr, vid);
545 fdb_delete(br, fdb, true);
548 fdb = fdb_create(br, source, addr, vid,
553 fdb_add_hw_addr(br, addr);
554 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
559 int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
564 spin_lock_bh(&br->hash_lock);
565 ret = fdb_insert(br, source, addr, vid);
566 spin_unlock_bh(&br->hash_lock);
577 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
583 if (hold_time(br) == 0)
586 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
591 br_warn(br, "received packet on %s with own address as source address (addr:%pM, vlan:%u)\n",
617 trace_br_fdb_update(br, source, addr, vid, flags);
618 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
622 spin_lock(&br->hash_lock);
623 fdb = fdb_create(br, source, addr, vid, flags);
625 trace_br_fdb_update(br, source, addr, vid, flags);
626 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
631 spin_unlock(&br->hash_lock);
635 static int fdb_to_nud(const struct net_bridge *br,
642 else if (has_expired(br, fdb))
648 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br,
667 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex;
668 ndm->ndm_state = fdb_to_nud(br, fdb);
679 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex))
728 static void fdb_notify(struct net_bridge *br,
732 struct net *net = dev_net(br->dev);
743 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0);
763 struct net_bridge *br = netdev_priv(dev);
777 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
794 err = fdb_fill_info(skb, br, f,
816 struct net_bridge *br = netdev_priv(dev);
821 f = br_fdb_find_rcu(br, addr, vid);
828 err = fdb_fill_info(skb, br, f, portid, seq,
860 static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source,
879 br->dev->name);
893 fdb = br_fdb_find(br, addr, vid);
898 fdb = fdb_create(br, source, addr, vid, 0);
913 if (fdb_to_nud(br, fdb) != state) {
917 fdb_add_hw_addr(br, addr);
921 fdb_add_hw_addr(br, addr);
925 fdb_del_hw_addr(br, addr);
945 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
951 static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br,
961 br->dev->name);
969 br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER));
978 err = br_fdb_external_learn_add(br, p, addr, vid, true);
980 spin_lock_bh(&br->hash_lock);
981 err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb);
982 spin_unlock_bh(&br->hash_lock);
1003 struct net_bridge *br = NULL;
1019 br = netdev_priv(dev);
1020 vg = br_vlan_group(br);
1028 br = p->br;
1050 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, vid, nfea_tb,
1053 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, 0, nfea_tb,
1065 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, v->vid,
1076 static int fdb_delete_by_addr_and_port(struct net_bridge *br,
1082 fdb = br_fdb_find(br, addr, vlan);
1086 fdb_delete(br, fdb, true);
1091 static int __br_fdb_delete(struct net_bridge *br,
1097 spin_lock_bh(&br->hash_lock);
1098 err = fdb_delete_by_addr_and_port(br, p, addr, vid);
1099 spin_unlock_bh(&br->hash_lock);
1112 struct net_bridge *br;
1116 br = netdev_priv(dev);
1117 vg = br_vlan_group(br);
1126 br = p->br;
1136 err = __br_fdb_delete(br, p, addr, vid);
1139 err &= __br_fdb_delete(br, p, addr, 0);
1146 err &= __br_fdb_delete(br, p, addr, v->vid);
1153 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p)
1162 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1176 hlist_for_each_entry_rcu(tmp, &br->fdb_list, fdb_node) {
1188 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
1195 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1205 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
1213 trace_br_fdb_external_learn_add(br, p, addr, vid);
1215 spin_lock_bh(&br->hash_lock);
1217 fdb = br_fdb_find(br, addr, vid);
1227 fdb = fdb_create(br, p, addr, vid, flags);
1232 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1257 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1261 spin_unlock_bh(&br->hash_lock);
1266 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
1273 spin_lock_bh(&br->hash_lock);
1275 fdb = br_fdb_find(br, addr, vid);
1277 fdb_delete(br, fdb, swdev_notify);
1281 spin_unlock_bh(&br->hash_lock);
1286 void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p,
1291 spin_lock_bh(&br->hash_lock);
1293 fdb = br_fdb_find(br, addr, vid);
1297 spin_unlock_bh(&br->hash_lock);
1311 spin_lock_bh(&p->br->hash_lock);
1312 hlist_for_each_entry(f, &p->br->fdb_list, fdb_node) {
1316 spin_unlock_bh(&p->br->hash_lock);