Lines Matching refs:fdb
76 const struct net_bridge_fdb_entry *fdb) in has_expired() argument
78 return !test_bit(BR_FDB_STATIC, &fdb->flags) && in has_expired()
79 !test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags) && in has_expired()
80 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
109 struct net_bridge_fdb_entry *fdb; in br_fdb_find() local
114 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find()
117 return fdb; in br_fdb_find()
434 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
445 fdb = br_fdb_find_rcu(port->br, addr, 0); in br_fdb_test_addr()
446 if (fdb) in br_fdb_test_addr()
447 dst = READ_ONCE(fdb->dst); in br_fdb_test_addr()
512 struct net_bridge_fdb_entry *fdb; in fdb_create() local
514 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
515 if (fdb) { in fdb_create()
516 memcpy(fdb->key.addr.addr, addr, ETH_ALEN); in fdb_create()
517 WRITE_ONCE(fdb->dst, source); in fdb_create()
518 fdb->key.vlan_id = vid; in fdb_create()
519 fdb->flags = flags; in fdb_create()
520 fdb->updated = fdb->used = jiffies; in fdb_create()
522 &fdb->rhnode, in fdb_create()
524 kmem_cache_free(br_fdb_cache, fdb); in fdb_create()
525 fdb = NULL; in fdb_create()
527 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list); in fdb_create()
530 return fdb; in fdb_create()
536 struct net_bridge_fdb_entry *fdb; in fdb_insert() local
541 fdb = br_fdb_find(br, addr, vid); in fdb_insert()
542 if (fdb) { in fdb_insert()
546 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_insert()
550 fdb_delete(br, fdb, true); in fdb_insert()
553 fdb = fdb_create(br, source, addr, vid, in fdb_insert()
555 if (!fdb) in fdb_insert()
559 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_insert()
576 static bool __fdb_mark_active(struct net_bridge_fdb_entry *fdb) in __fdb_mark_active() argument
578 return !!(test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags) && in __fdb_mark_active()
579 test_and_clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)); in __fdb_mark_active()
585 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
591 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_update()
592 if (likely(fdb)) { in br_fdb_update()
594 if (unlikely(test_bit(BR_FDB_LOCAL, &fdb->flags))) { in br_fdb_update()
602 if (now != fdb->updated) { in br_fdb_update()
603 fdb->updated = now; in br_fdb_update()
604 fdb_modified = __fdb_mark_active(fdb); in br_fdb_update()
608 if (unlikely(source != READ_ONCE(fdb->dst) && in br_fdb_update()
609 !test_bit(BR_FDB_STICKY, &fdb->flags))) { in br_fdb_update()
610 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH); in br_fdb_update()
611 WRITE_ONCE(fdb->dst, source); in br_fdb_update()
615 &fdb->flags))) in br_fdb_update()
617 &fdb->flags); in br_fdb_update()
621 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_update()
624 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
629 fdb = fdb_create(br, source, addr, vid, flags); in br_fdb_update()
630 if (fdb) { in br_fdb_update()
632 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
642 const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
644 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_to_nud()
646 else if (test_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_to_nud()
648 else if (has_expired(br, fdb)) in fdb_to_nud()
655 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
658 const struct net_bridge_port *dst = READ_ONCE(fdb->dst); in fdb_fill_info()
675 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
677 if (test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in fdb_fill_info()
679 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in fdb_fill_info()
681 if (test_bit(BR_FDB_STICKY, &fdb->flags)) in fdb_fill_info()
684 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr)) in fdb_fill_info()
688 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in fdb_fill_info()
690 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in fdb_fill_info()
695 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), in fdb_fill_info()
696 &fdb->key.vlan_id)) in fdb_fill_info()
699 if (test_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_fill_info()
705 if (test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_fill_info()
736 const struct net_bridge_fdb_entry *fdb, in br_fdb_replay_one() argument
739 const struct net_bridge_port *p = READ_ONCE(fdb->dst); in br_fdb_replay_one()
743 item.addr = fdb->key.addr.addr; in br_fdb_replay_one()
744 item.vid = fdb->key.vlan_id; in br_fdb_replay_one()
745 item.added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_replay_one()
746 item.offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags); in br_fdb_replay_one()
747 item.is_local = test_bit(BR_FDB_LOCAL, &fdb->flags); in br_fdb_replay_one()
758 struct net_bridge_fdb_entry *fdb; in br_fdb_replay() local
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()
790 const struct net_bridge_fdb_entry *fdb, int type, in fdb_notify() argument
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()
897 static bool fdb_handle_notify(struct net_bridge_fdb_entry *fdb, u8 notify) in fdb_handle_notify() argument
903 !test_and_set_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_handle_notify()
907 !test_and_set_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
911 test_and_clear_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
913 clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags); in fdb_handle_notify()
927 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
954 fdb = br_fdb_find(br, addr, vid); in fdb_add_entry()
955 if (fdb == NULL) { in fdb_add_entry()
959 fdb = fdb_create(br, source, addr, vid, 0); in fdb_add_entry()
960 if (!fdb) in fdb_add_entry()
968 if (READ_ONCE(fdb->dst) != source) { in fdb_add_entry()
969 WRITE_ONCE(fdb->dst, source); in fdb_add_entry()
974 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
976 set_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
977 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
980 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
981 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
984 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
985 if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
992 if (is_sticky != test_bit(BR_FDB_STICKY, &fdb->flags)) { in fdb_add_entry()
993 change_bit(BR_FDB_STICKY, &fdb->flags); in fdb_add_entry()
997 if (fdb_handle_notify(fdb, notify)) in fdb_add_entry()
1000 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in fdb_add_entry()
1002 fdb->used = jiffies; in fdb_add_entry()
1005 fdb->updated = jiffies; in fdb_add_entry()
1006 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_entry()
1141 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr_and_port() local
1143 fdb = br_fdb_find(br, addr, vlan); in fdb_delete_by_addr_and_port()
1144 if (!fdb || READ_ONCE(fdb->dst) != p) in fdb_delete_by_addr_and_port()
1147 fdb_delete(br, fdb, true); in fdb_delete_by_addr_and_port()
1270 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1278 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_add()
1279 if (!fdb) { in br_fdb_external_learn_add()
1288 fdb = fdb_create(br, p, addr, vid, flags); in br_fdb_external_learn_add()
1289 if (!fdb) { in br_fdb_external_learn_add()
1293 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1295 fdb->updated = jiffies; in br_fdb_external_learn_add()
1297 if (READ_ONCE(fdb->dst) != p) { in br_fdb_external_learn_add()
1298 WRITE_ONCE(fdb->dst, p); in br_fdb_external_learn_add()
1302 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) { in br_fdb_external_learn_add()
1304 fdb->used = jiffies; in br_fdb_external_learn_add()
1305 } else if (!test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags)) { in br_fdb_external_learn_add()
1307 set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags); in br_fdb_external_learn_add()
1312 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_external_learn_add()
1315 set_bit(BR_FDB_LOCAL, &fdb->flags); in br_fdb_external_learn_add()
1318 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1331 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1336 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_del()
1337 if (fdb && test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in br_fdb_external_learn_del()
1338 fdb_delete(br, fdb, swdev_notify); in br_fdb_external_learn_del()
1350 struct net_bridge_fdb_entry *fdb; in br_fdb_offloaded_set() local
1354 fdb = br_fdb_find(br, addr, vid); in br_fdb_offloaded_set()
1355 if (fdb && offloaded != test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in br_fdb_offloaded_set()
1356 change_bit(BR_FDB_OFFLOADED, &fdb->flags); in br_fdb_offloaded_set()