Lines Matching defs:br

50 int br_fdb_hash_init(struct net_bridge *br)
52 return rhashtable_init(&br->fdb_hash_tbl, &br_fdb_rht_params);
55 void br_fdb_hash_fini(struct net_bridge *br)
57 rhashtable_destroy(&br->fdb_hash_tbl);
63 static inline unsigned long hold_time(const struct net_bridge *br)
65 return br->topology_change ? br->forward_delay : br->ageing_time;
68 static inline int has_expired(const struct net_bridge *br,
73 time_before_eq(fdb->updated + hold_time(br), jiffies);
76 static int fdb_to_nud(const struct net_bridge *br,
83 else if (has_expired(br, fdb))
89 static int fdb_fill_info(struct sk_buff *skb, const struct net_bridge *br,
110 ndm->ndm_ifindex = dst ? dst->dev->ifindex : br->dev->ifindex;
111 ndm->ndm_state = fdb_to_nud(br, fdb);
124 if (nla_put_u32(skb, NDA_MASTER, br->dev->ifindex))
177 static void fdb_notify(struct net_bridge *br,
181 struct net *net = dev_net(br->dev);
186 br_switchdev_fdb_notify(br, fdb, type);
192 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0);
220 static struct net_bridge_fdb_entry *br_fdb_find(struct net_bridge *br,
226 lockdep_assert_held_once(&br->hash_lock);
229 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
241 struct net_bridge *br;
248 br = netdev_priv(br_dev);
250 f = br_fdb_find_rcu(br, addr, vid);
259 struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br,
263 return fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
271 static void fdb_add_hw_addr(struct net_bridge *br, const unsigned char *addr)
278 list_for_each_entry(p, &br->port_list, list) {
288 list_for_each_entry_continue_reverse(p, &br->port_list, list) {
299 static void fdb_del_hw_addr(struct net_bridge *br, const unsigned char *addr)
305 list_for_each_entry(p, &br->port_list, list) {
311 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f,
314 trace_fdb_delete(br, f);
317 fdb_del_hw_addr(br, f->key.addr.addr);
320 rhashtable_remove_fast(&br->fdb_hash_tbl, &f->rhnode,
323 atomic_dec(&br->fdb_n_learned);
324 fdb_notify(br, f, RTM_DELNEIGH, swdev_notify);
334 static void fdb_delete_local(struct net_bridge *br,
345 list_for_each_entry(op, &br->port_list, list) {
355 vg = br_vlan_group(br);
358 if (p && ether_addr_equal(br->dev->dev_addr, addr) &&
365 fdb_delete(br, f, true);
368 void br_fdb_find_delete_local(struct net_bridge *br,
374 spin_lock_bh(&br->hash_lock);
375 f = br_fdb_find(br, addr, vid);
378 fdb_delete_local(br, p, f);
379 spin_unlock_bh(&br->hash_lock);
382 static struct net_bridge_fdb_entry *fdb_create(struct net_bridge *br,
390 u32 max_learned = READ_ONCE(br->fdb_max_learned);
395 int n_learned = atomic_read(&br->fdb_n_learned);
411 err = rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, &fdb->rhnode,
419 atomic_inc(&br->fdb_n_learned);
421 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list);
426 static int fdb_add_local(struct net_bridge *br, struct net_bridge_port *source,
434 fdb = br_fdb_find(br, addr, vid);
441 br_warn(br, "adding interface %s with same address as a received packet (addr:%pM, vlan:%u)\n",
442 source ? source->dev->name : br->dev->name, addr, vid);
443 fdb_delete(br, fdb, true);
446 fdb = fdb_create(br, source, addr, vid,
451 fdb_add_hw_addr(br, addr);
452 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
460 struct net_bridge *br = p->br;
463 spin_lock_bh(&br->hash_lock);
465 hlist_for_each_entry(f, &br->fdb_list, fdb_node) {
469 fdb_delete_local(br, p, f);
482 fdb_add_local(br, p, newaddr, 0);
492 fdb_add_local(br, p, newaddr, v->vid);
495 spin_unlock_bh(&br->hash_lock);
498 void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr)
504 spin_lock_bh(&br->hash_lock);
507 f = br_fdb_find(br, br->dev->dev_addr, 0);
510 fdb_delete_local(br, NULL, f);
512 fdb_add_local(br, NULL, newaddr, 0);
513 vg = br_vlan_group(br);
523 f = br_fdb_find(br, br->dev->dev_addr, v->vid);
526 fdb_delete_local(br, NULL, f);
527 fdb_add_local(br, NULL, newaddr, v->vid);
530 spin_unlock_bh(&br->hash_lock);
535 struct net_bridge *br = container_of(work, struct net_bridge,
538 unsigned long delay = hold_time(br);
547 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
558 fdb_notify(br, f, RTM_NEWNEIGH, false);
566 spin_lock_bh(&br->hash_lock);
568 fdb_delete(br, f, true);
569 spin_unlock_bh(&br->hash_lock);
576 mod_delayed_work(system_long_wq, &br->gc_work, work_delay);
579 static bool __fdb_flush_matches(const struct net_bridge *br,
584 int port_ifidx = dst ? dst->dev->ifindex : br->dev->ifindex;
597 void br_fdb_flush(struct net_bridge *br,
603 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
604 if (!__fdb_flush_matches(br, f, desc))
607 spin_lock_bh(&br->hash_lock);
609 fdb_delete(br, f, true);
610 spin_unlock_bh(&br->hash_lock);
643 static int __fdb_flush_validate_ifindex(const struct net_bridge *br,
649 dev = __dev_get_by_index(dev_net(br->dev), ifindex);
658 if (netif_is_bridge_master(dev) && dev != br->dev) {
666 if (p->br != br) {
689 struct net_bridge *br;
701 br = netdev_priv(dev);
708 br = p->br;
738 err = __fdb_flush_validate_ifindex(br, ifidx, extack);
747 br_debug(br, "flushing port ifindex: %d vlan id: %u flags: 0x%lx flags mask: 0x%lx\n",
750 br_fdb_flush(br, &desc);
759 void br_fdb_delete_by_port(struct net_bridge *br,
767 spin_lock_bh(&br->hash_lock);
768 hlist_for_each_entry_safe(f, tmp, &br->fdb_list, fdb_node) {
780 fdb_delete_local(br, p, f);
782 fdb_delete(br, f, true);
784 spin_unlock_bh(&br->hash_lock);
803 fdb = br_fdb_find_rcu(port->br, addr, 0);
820 int br_fdb_fillbuf(struct net_bridge *br, void *buf,
830 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
834 if (has_expired(br, f))
865 int br_fdb_add_local(struct net_bridge *br, struct net_bridge_port *source,
870 spin_lock_bh(&br->hash_lock);
871 ret = fdb_add_local(br, source, addr, vid);
872 spin_unlock_bh(&br->hash_lock);
883 void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
889 if (hold_time(br) == 0)
892 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
897 br_warn(br, "received packet on %s with own address as source address (addr:%pM, vlan:%u)\n",
911 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH);
930 atomic_dec(&br->fdb_n_learned);
933 trace_br_fdb_update(br, source, addr, vid, flags);
934 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
938 spin_lock(&br->hash_lock);
939 fdb = fdb_create(br, source, addr, vid, flags);
941 trace_br_fdb_update(br, source, addr, vid, flags);
942 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
947 spin_unlock(&br->hash_lock);
959 struct net_bridge *br = netdev_priv(dev);
973 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
990 err = fdb_fill_info(skb, br, f,
1012 struct net_bridge *br = netdev_priv(dev);
1017 f = br_fdb_find_rcu(br, addr, vid);
1024 err = fdb_fill_info(skb, br, f, portid, seq,
1056 static int fdb_add_entry(struct net_bridge *br, struct net_bridge_port *source,
1075 br->dev->name);
1089 fdb = br_fdb_find(br, addr, vid);
1094 fdb = fdb_create(br, source, addr, vid,
1111 atomic_dec(&br->fdb_n_learned);
1114 if (fdb_to_nud(br, fdb) != state) {
1118 fdb_add_hw_addr(br, addr);
1122 fdb_add_hw_addr(br, addr);
1126 fdb_del_hw_addr(br, addr);
1147 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
1153 static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br,
1163 br->dev->name);
1171 br_fdb_update(br, p, addr, vid, BIT(BR_FDB_ADDED_BY_USER));
1180 err = br_fdb_external_learn_add(br, p, addr, vid, false, true);
1182 spin_lock_bh(&br->hash_lock);
1183 err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb);
1184 spin_unlock_bh(&br->hash_lock);
1207 struct net_bridge *br = NULL;
1224 br = netdev_priv(dev);
1225 vg = br_vlan_group(br);
1233 br = p->br;
1263 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, vid, nfea_tb,
1266 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, 0, nfea_tb,
1278 err = __br_fdb_add(ndm, br, p, addr, nlh_flags, v->vid,
1289 static int fdb_delete_by_addr_and_port(struct net_bridge *br,
1295 fdb = br_fdb_find(br, addr, vlan);
1299 fdb_delete(br, fdb, true);
1305 static int __br_fdb_delete(struct net_bridge *br,
1311 spin_lock_bh(&br->hash_lock);
1312 err = fdb_delete_by_addr_and_port(br, p, addr, vid, notified);
1313 spin_unlock_bh(&br->hash_lock);
1326 struct net_bridge *br;
1330 br = netdev_priv(dev);
1331 vg = br_vlan_group(br);
1340 br = p->br;
1344 err = __br_fdb_delete(br, p, addr, vid, notified);
1349 err &= __br_fdb_delete(br, p, addr, 0, notified);
1356 err &= __br_fdb_delete(br, p, addr, v->vid, notified);
1363 int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p)
1372 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1386 hlist_for_each_entry_rcu(tmp, &br->fdb_list, fdb_node) {
1398 void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
1405 hlist_for_each_entry_rcu(f, &br->fdb_list, fdb_node) {
1415 int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
1423 trace_br_fdb_external_learn_add(br, p, addr, vid);
1428 spin_lock_bh(&br->hash_lock);
1430 fdb = br_fdb_find(br, addr, vid);
1443 fdb = fdb_create(br, p, addr, vid, flags);
1448 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1484 atomic_dec(&br->fdb_n_learned);
1487 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1491 spin_unlock_bh(&br->hash_lock);
1496 int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
1503 spin_lock_bh(&br->hash_lock);
1505 fdb = br_fdb_find(br, addr, vid);
1507 fdb_delete(br, fdb, swdev_notify);
1511 spin_unlock_bh(&br->hash_lock);
1516 void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p,
1521 spin_lock_bh(&br->hash_lock);
1523 fdb = br_fdb_find(br, addr, vid);
1527 spin_unlock_bh(&br->hash_lock);
1541 spin_lock_bh(&p->br->hash_lock);
1542 hlist_for_each_entry(f, &p->br->fdb_list, fdb_node) {
1546 spin_unlock_bh(&p->br->hash_lock);