Lines Matching refs:br
53 int br_fdb_hash_init(struct net_bridge *br)
55 return rhashtable_init(&br->fdb_hash_tbl, &br_fdb_rht_params);
58 void br_fdb_hash_fini(struct net_bridge *br)
60 rhashtable_destroy(&br->fdb_hash_tbl);
66 static inline unsigned long hold_time(const struct net_bridge *br)
68 return br->topology_change ? br->forward_delay : br->ageing_time;
71 static inline int has_expired(const struct net_bridge *br,
76 time_before_eq(fdb->updated + hold_time(br), jiffies);
86 static int fdb_to_nud(const struct net_bridge *br,
93 else if (has_expired(br, fdb))
99 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br,
120 ndm->ndm_ifindex = dst ? dst->dev->ifindex : br->dev->ifindex;
121 ndm->ndm_state = fdb_to_nud(br, fdb);
134 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex))
187 static void fdb_notify(struct net_bridge *br,
191 struct net *net = dev_net(br->dev);
196 br_switchdev_fdb_notify(br, fdb, type);
202 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0);
230 static struct net_bridge_fdb_entry *br_fdb_find(struct net_bridge *br,
236 lockdep_assert_held_once(&br->hash_lock);
239 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
251 struct net_bridge *br;
258 br = netdev_priv(br_dev);
260 f = br_fdb_find_rcu(br, addr, vid);
269 struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br,
273 return fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
281 static void fdb_add_hw_addr(struct net_bridge *br, const unsigned char *addr)
288 list_for_each_entry(p, &br->port_list, list) {
298 list_for_each_entry_continue_reverse(p, &br->port_list, list) {
309 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr)
315 list_for_each_entry(p, &br->port_list, list) {
321 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f,
324 trace_fdb_delete(br, f);
327 fdb_del_hw_addr(br, f->key.addr.addr);
330 rhashtable_remove_fast(&br->fdb_hash_tbl, &f->rhnode,
332 fdb_notify(br, f, RTM_DELNEIGH, swdev_notify);
337 static void fdb_delete_local(struct net_bridge *br,
348 list_for_each_entry(op, &br->port_list, list) {
358 vg = br_vlan_group(br);
361 if (p && ether_addr_equal(br->dev->dev_addr, addr) &&
368 fdb_delete(br, f, true);
371 void br_fdb_find_delete_local(struct net_bridge *br,
377 spin_lock_bh(&br->hash_lock);
378 f = br_fdb_find(br, addr, vid);
381 fdb_delete_local(br, p, f);
382 spin_unlock_bh(&br->hash_lock);
385 static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br,
403 err = rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, &fdb->rhnode,
410 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list);
415 static int fdb_add_local(struct net_bridge *br, struct net_bridge_port *source,
423 fdb = br_fdb_find(br, addr, vid);
430 br_warn(br, "adding interface %s with same address as a received packet (addr:%pM, vlan:%u)\n",
431 source ? source->dev->name : br->dev->name, addr, vid);
432 fdb_delete(br, fdb, true);
435 fdb = fdb_create(br, source, addr, vid,
440 fdb_add_hw_addr(br, addr);
441 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
449 struct net_bridge *br = p->br;
452 spin_lock_bh(&br->hash_lock);
454 hlist_for_each_entry(f, &br->fdb_list, fdb_node) {
458 fdb_delete_local(br, p, f);
471 fdb_add_local(br, p, newaddr, 0);
481 fdb_add_local(br, p, newaddr, v->vid);
484 spin_unlock_bh(&br->hash_lock);
487 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr)
493 spin_lock_bh(&br->hash_lock);
496 f = br_fdb_find(br, br->dev->dev_addr, 0);
499 fdb_delete_local(br, NULL, f);
501 fdb_add_local(br, NULL, newaddr, 0);
502 vg = br_vlan_group(br);
512 f = br_fdb_find(br, br->dev->dev_addr, v->vid);
515 fdb_delete_local(br, NULL, f);
516 fdb_add_local(br, NULL, newaddr, v->vid);
519 spin_unlock_bh(&br->hash_lock);
524 struct net_bridge *br = container_of(work, struct net_bridge,
527 unsigned long delay = hold_time(br);
536 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
547 fdb_notify(br, f, RTM_NEWNEIGH, false);
555 spin_lock_bh(&br->hash_lock);
557 fdb_delete(br, f, true);
558 spin_unlock_bh(&br->hash_lock);
565 mod_delayed_work(system_long_wq, &br->gc_work, work_delay);
568 static bool __fdb_flush_matches(const struct net_bridge *br,
573 int port_ifidx = dst ? dst->dev->ifindex : br->dev->ifindex;
586 void br_fdb_flush(struct net_bridge *br,
592 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
593 if (!__fdb_flush_matches(br, f, desc))
596 spin_lock_bh(&br->hash_lock);
598 fdb_delete(br, f, true);
599 spin_unlock_bh(&br->hash_lock);
632 static int __fdb_flush_validate_ifindex(const struct net_bridge *br,
638 dev = __dev_get_by_index(dev_net(br->dev), ifindex);
647 if (netif_is_bridge_master(dev) && dev != br->dev) {
655 if (p->br != br) {
671 struct net_bridge *br;
674 br = netdev_priv(dev);
681 br = p->br;
708 err = __fdb_flush_validate_ifindex(br, ifidx, extack);
717 br_debug(br, "flushing port ifindex: %d vlan id: %u flags: 0x%lx flags mask: 0x%lx\n",
720 br_fdb_flush(br, &desc);
729 void br_fdb_delete_by_port(struct net_bridge *br,
737 spin_lock_bh(&br->hash_lock);
738 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) {
750 fdb_delete_local(br, p, f);
752 fdb_delete(br, f, true);
754 spin_unlock_bh(&br->hash_lock);
773 fdb = br_fdb_find_rcu(port->br, addr, 0);
790 int br_fdb_fillbuf(struct net_bridge *br, void *buf,
800 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
804 if (has_expired(br, f))
835 int br_fdb_add_local(struct net_bridge *br, struct net_bridge_port *source,
840 spin_lock_bh(&br->hash_lock);
841 ret = fdb_add_local(br, source, addr, vid);
842 spin_unlock_bh(&br->hash_lock);
853 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
859 if (hold_time(br) == 0)
862 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
867 br_warn(br, "received packet on %s with own address as source address (addr:%pM, vlan:%u)\n",
881 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH);
899 trace_br_fdb_update(br, source, addr, vid, flags);
900 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
904 spin_lock(&br->hash_lock);
905 fdb = fdb_create(br, source, addr, vid, flags);
907 trace_br_fdb_update(br, source, addr, vid, flags);
908 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
913 spin_unlock(&br->hash_lock);
924 struct net_bridge *br = netdev_priv(dev);
938 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
955 err = fdb_fill_info(skb, br, f,
977 struct net_bridge *br = netdev_priv(dev);
982 f = br_fdb_find_rcu(br, addr, vid);
989 err = fdb_fill_info(skb, br, f, portid, seq,
1021 static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source,
1040 br->dev->name);
1054 fdb = br_fdb_find(br, addr, vid);
1059 fdb = fdb_create(br, source, addr, vid, 0);
1074 if (fdb_to_nud(br, fdb) != state) {
1078 fdb_add_hw_addr(br, addr);
1082 fdb_add_hw_addr(br, addr);
1086 fdb_del_hw_addr(br, addr);
1109 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
1115 static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br,
1125 br->dev->name);
1133 br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER));
1142 err = br_fdb_external_learn_add(br, p, addr, vid, false, true);
1144 spin_lock_bh(&br->hash_lock);
1145 err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb);
1146 spin_unlock_bh(&br->hash_lock);
1167 struct net_bridge *br = NULL;
1184 br = netdev_priv(dev);
1185 vg = br_vlan_group(br);
1193 br = p->br;
1223 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, vid, nfea_tb,
1226 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, 0, nfea_tb,
1238 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, v->vid,
1249 static int fdb_delete_by_addr_and_port(struct net_bridge *br,
1255 fdb = br_fdb_find(br, addr, vlan);
1259 fdb_delete(br, fdb, true);
1264 static int __br_fdb_delete(struct net_bridge *br,
1270 spin_lock_bh(&br->hash_lock);
1271 err = fdb_delete_by_addr_and_port(br, p, addr, vid);
1272 spin_unlock_bh(&br->hash_lock);
1286 struct net_bridge *br;
1290 br = netdev_priv(dev);
1291 vg = br_vlan_group(br);
1300 br = p->br;
1310 err = __br_fdb_delete(br, p, addr, vid);
1313 err &= __br_fdb_delete(br, p, addr, 0);
1320 err &= __br_fdb_delete(br, p, addr, v->vid);
1327 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p)
1336 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1350 hlist_for_each_entry_rcu(tmp, &br->fdb_list, fdb_node) {
1362 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
1369 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1379 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
1387 trace_br_fdb_external_learn_add(br, p, addr, vid);
1392 spin_lock_bh(&br->hash_lock);
1394 fdb = br_fdb_find(br, addr, vid);
1407 fdb = fdb_create(br, p, addr, vid, flags);
1412 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1449 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1453 spin_unlock_bh(&br->hash_lock);
1458 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
1465 spin_lock_bh(&br->hash_lock);
1467 fdb = br_fdb_find(br, addr, vid);
1469 fdb_delete(br, fdb, swdev_notify);
1473 spin_unlock_bh(&br->hash_lock);
1478 void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p,
1483 spin_lock_bh(&br->hash_lock);
1485 fdb = br_fdb_find(br, addr, vid);
1489 spin_unlock_bh(&br->hash_lock);
1503 spin_lock_bh(&p->br->hash_lock);
1504 hlist_for_each_entry(f, &p->br->fdb_list, fdb_node) {
1508 spin_unlock_bh(&p->br->hash_lock);