Lines Matching refs:fdb
72 const struct net_bridge_fdb_entry *fdb) in has_expired() argument
74 return !test_bit(BR_FDB_STATIC, &fdb->flags) && in has_expired()
75 !test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags) && in has_expired()
76 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
87 const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
89 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_to_nud()
91 else if (test_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_to_nud()
93 else if (has_expired(br, fdb)) in fdb_to_nud()
100 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
103 const struct net_bridge_port *dst = READ_ONCE(fdb->dst); in fdb_fill_info()
121 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
123 if (test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in fdb_fill_info()
125 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in fdb_fill_info()
127 if (test_bit(BR_FDB_STICKY, &fdb->flags)) in fdb_fill_info()
129 if (test_bit(BR_FDB_LOCKED, &fdb->flags)) in fdb_fill_info()
132 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr)) in fdb_fill_info()
139 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in fdb_fill_info()
141 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in fdb_fill_info()
146 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), in fdb_fill_info()
147 &fdb->key.vlan_id)) in fdb_fill_info()
150 if (test_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_fill_info()
156 if (test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_fill_info()
188 const struct net_bridge_fdb_entry *fdb, int type, in fdb_notify() argument
196 br_switchdev_fdb_notify(br, fdb, type); in fdb_notify()
202 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
234 struct net_bridge_fdb_entry *fdb; in br_fdb_find() local
239 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find()
242 return fdb; in br_fdb_find()
391 struct net_bridge_fdb_entry *fdb; in fdb_create() local
394 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
395 if (!fdb) in fdb_create()
398 memcpy(fdb->key.addr.addr, addr, ETH_ALEN); in fdb_create()
399 WRITE_ONCE(fdb->dst, source); in fdb_create()
400 fdb->key.vlan_id = vid; in fdb_create()
401 fdb->flags = flags; in fdb_create()
402 fdb->updated = fdb->used = jiffies; in fdb_create()
403 err = rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, &fdb->rhnode, in fdb_create()
406 kmem_cache_free(br_fdb_cache, fdb); in fdb_create()
410 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list); in fdb_create()
412 return fdb; in fdb_create()
418 struct net_bridge_fdb_entry *fdb; in fdb_add_local() local
423 fdb = br_fdb_find(br, addr, vid); in fdb_add_local()
424 if (fdb) { in fdb_add_local()
428 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_add_local()
432 fdb_delete(br, fdb, true); in fdb_add_local()
435 fdb = fdb_create(br, source, addr, vid, in fdb_add_local()
437 if (!fdb) in fdb_add_local()
441 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_local()
762 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
773 fdb = br_fdb_find_rcu(port->br, addr, 0); in br_fdb_test_addr()
774 if (fdb) in br_fdb_test_addr()
775 dst = READ_ONCE(fdb->dst); in br_fdb_test_addr()
847 static bool __fdb_mark_active(struct net_bridge_fdb_entry *fdb) in __fdb_mark_active() argument
849 return !!(test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags) && in __fdb_mark_active()
850 test_and_clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)); in __fdb_mark_active()
856 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
862 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_update()
863 if (likely(fdb)) { in br_fdb_update()
865 if (unlikely(test_bit(BR_FDB_LOCAL, &fdb->flags))) { in br_fdb_update()
873 if (now != fdb->updated) { in br_fdb_update()
874 fdb->updated = now; in br_fdb_update()
875 fdb_modified = __fdb_mark_active(fdb); in br_fdb_update()
879 if (unlikely(source != READ_ONCE(fdb->dst) && in br_fdb_update()
880 !test_bit(BR_FDB_STICKY, &fdb->flags))) { in br_fdb_update()
881 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH); in br_fdb_update()
882 WRITE_ONCE(fdb->dst, source); in br_fdb_update()
886 &fdb->flags))) in br_fdb_update()
888 &fdb->flags); in br_fdb_update()
892 if (unlikely(test_bit(BR_FDB_LOCKED, &fdb->flags))) in br_fdb_update()
893 clear_bit(BR_FDB_LOCKED, &fdb->flags); in br_fdb_update()
897 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_update()
900 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
905 fdb = fdb_create(br, source, addr, vid, flags); in br_fdb_update()
906 if (fdb) { in br_fdb_update()
908 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
997 static bool fdb_handle_notify(struct net_bridge_fdb_entry *fdb, u8 notify) in fdb_handle_notify() argument
1003 !test_and_set_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_handle_notify()
1007 !test_and_set_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
1011 test_and_clear_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
1013 clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags); in fdb_handle_notify()
1027 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
1054 fdb = br_fdb_find(br, addr, vid); in fdb_add_entry()
1055 if (fdb == NULL) { in fdb_add_entry()
1059 fdb = fdb_create(br, source, addr, vid, 0); in fdb_add_entry()
1060 if (!fdb) in fdb_add_entry()
1068 if (READ_ONCE(fdb->dst) != source) { in fdb_add_entry()
1069 WRITE_ONCE(fdb->dst, source); in fdb_add_entry()
1074 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
1076 set_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1077 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1080 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1081 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1084 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1085 if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1092 if (is_sticky != test_bit(BR_FDB_STICKY, &fdb->flags)) { in fdb_add_entry()
1093 change_bit(BR_FDB_STICKY, &fdb->flags); in fdb_add_entry()
1097 if (test_and_clear_bit(BR_FDB_LOCKED, &fdb->flags)) in fdb_add_entry()
1100 if (fdb_handle_notify(fdb, notify)) in fdb_add_entry()
1103 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in fdb_add_entry()
1105 fdb->used = jiffies; in fdb_add_entry()
1108 fdb->updated = jiffies; in fdb_add_entry()
1109 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_entry()
1253 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr_and_port() local
1255 fdb = br_fdb_find(br, addr, vlan); in fdb_delete_by_addr_and_port()
1256 if (!fdb || READ_ONCE(fdb->dst) != p) in fdb_delete_by_addr_and_port()
1259 fdb_delete(br, fdb, true); in fdb_delete_by_addr_and_port()
1383 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1394 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_add()
1395 if (!fdb) { in br_fdb_external_learn_add()
1407 fdb = fdb_create(br, p, addr, vid, flags); in br_fdb_external_learn_add()
1408 if (!fdb) { in br_fdb_external_learn_add()
1412 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1415 (!test_bit(BR_FDB_LOCKED, &fdb->flags) || in br_fdb_external_learn_add()
1416 READ_ONCE(fdb->dst) != p)) { in br_fdb_external_learn_add()
1421 fdb->updated = jiffies; in br_fdb_external_learn_add()
1423 if (READ_ONCE(fdb->dst) != p) { in br_fdb_external_learn_add()
1424 WRITE_ONCE(fdb->dst, p); in br_fdb_external_learn_add()
1428 if (test_and_set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) { in br_fdb_external_learn_add()
1430 fdb->used = jiffies; in br_fdb_external_learn_add()
1435 if (locked != test_bit(BR_FDB_LOCKED, &fdb->flags)) { in br_fdb_external_learn_add()
1436 change_bit(BR_FDB_LOCKED, &fdb->flags); in br_fdb_external_learn_add()
1441 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_external_learn_add()
1444 set_bit(BR_FDB_LOCAL, &fdb->flags); in br_fdb_external_learn_add()
1447 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1460 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1465 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_del()
1466 if (fdb && test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in br_fdb_external_learn_del()
1467 fdb_delete(br, fdb, swdev_notify); in br_fdb_external_learn_del()
1479 struct net_bridge_fdb_entry *fdb; in br_fdb_offloaded_set() local
1483 fdb = br_fdb_find(br, addr, vid); in br_fdb_offloaded_set()
1484 if (fdb && offloaded != test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in br_fdb_offloaded_set()
1485 change_bit(BR_FDB_OFFLOADED, &fdb->flags); in br_fdb_offloaded_set()