Lines Matching refs:fdb

69 				  const struct net_bridge_fdb_entry *fdb)  in has_expired()  argument
71 return !test_bit(BR_FDB_STATIC, &fdb->flags) && in has_expired()
72 !test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags) && in has_expired()
73 time_before_eq(READ_ONCE(fdb->updated) + hold_time(br), jiffies); in has_expired()
77 const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
79 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_to_nud()
81 else if (test_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_to_nud()
83 else if (has_expired(br, fdb)) in fdb_to_nud()
90 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
93 const struct net_bridge_port *dst = READ_ONCE(fdb->dst); in fdb_fill_info()
111 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
113 if (test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in fdb_fill_info()
115 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in fdb_fill_info()
117 if (test_bit(BR_FDB_STICKY, &fdb->flags)) in fdb_fill_info()
119 if (test_bit(BR_FDB_LOCKED, &fdb->flags)) in fdb_fill_info()
122 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr)) in fdb_fill_info()
129 ci.ndm_used = jiffies_to_clock_t(now - READ_ONCE(fdb->used)); in fdb_fill_info()
131 ci.ndm_updated = jiffies_to_clock_t(now - READ_ONCE(fdb->updated)); in fdb_fill_info()
136 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), in fdb_fill_info()
137 &fdb->key.vlan_id)) in fdb_fill_info()
140 if (test_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_fill_info()
146 if (test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_fill_info()
178 const struct net_bridge_fdb_entry *fdb, int type, in fdb_notify() argument
186 br_switchdev_fdb_notify(br, fdb, type); in fdb_notify()
192 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
224 struct net_bridge_fdb_entry *fdb; in br_fdb_find() local
229 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find()
232 return fdb; in br_fdb_find()
391 struct net_bridge_fdb_entry *fdb; in fdb_create() local
402 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
403 if (!fdb) in fdb_create()
406 memcpy(fdb->key.addr.addr, addr, ETH_ALEN); in fdb_create()
407 WRITE_ONCE(fdb->dst, source); in fdb_create()
408 fdb->key.vlan_id = vid; in fdb_create()
409 fdb->flags = flags; in fdb_create()
410 fdb->updated = fdb->used = jiffies; in fdb_create()
411 err = rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, &fdb->rhnode, in fdb_create()
414 kmem_cache_free(br_fdb_cache, fdb); in fdb_create()
421 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list); in fdb_create()
423 return fdb; in fdb_create()
429 struct net_bridge_fdb_entry *fdb; in fdb_add_local() local
434 fdb = br_fdb_find(br, addr, vid); in fdb_add_local()
435 if (fdb) { in fdb_add_local()
439 if (test_bit(BR_FDB_LOCAL, &fdb->flags)) in fdb_add_local()
443 fdb_delete(br, fdb, true); in fdb_add_local()
446 fdb = fdb_create(br, source, addr, vid, in fdb_add_local()
448 if (!fdb) in fdb_add_local()
452 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_local()
900 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
911 fdb = br_fdb_find_rcu(port->br, addr, 0); in br_fdb_test_addr()
912 if (fdb) in br_fdb_test_addr()
913 dst = READ_ONCE(fdb->dst); in br_fdb_test_addr()
989 static bool __fdb_mark_active(struct net_bridge_fdb_entry *fdb) in __fdb_mark_active() argument
991 return !!(test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags) && in __fdb_mark_active()
992 test_and_clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)); in __fdb_mark_active()
998 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
1004 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_update()
1005 if (likely(fdb)) { in br_fdb_update()
1007 if (unlikely(test_bit(BR_FDB_LOCAL, &fdb->flags))) { in br_fdb_update()
1015 if (now != READ_ONCE(fdb->updated)) { in br_fdb_update()
1016 WRITE_ONCE(fdb->updated, now); in br_fdb_update()
1017 fdb_modified = __fdb_mark_active(fdb); in br_fdb_update()
1021 if (unlikely(source != READ_ONCE(fdb->dst) && in br_fdb_update()
1022 !test_bit(BR_FDB_STICKY, &fdb->flags))) { in br_fdb_update()
1023 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH); in br_fdb_update()
1024 WRITE_ONCE(fdb->dst, source); in br_fdb_update()
1028 &fdb->flags))) in br_fdb_update()
1030 &fdb->flags); in br_fdb_update()
1034 if (unlikely(test_bit(BR_FDB_LOCKED, &fdb->flags))) in br_fdb_update()
1035 clear_bit(BR_FDB_LOCKED, &fdb->flags); in br_fdb_update()
1039 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_update()
1041 &fdb->flags)) in br_fdb_update()
1046 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
1051 fdb = fdb_create(br, source, addr, vid, flags); in br_fdb_update()
1052 if (fdb) { in br_fdb_update()
1054 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
1144 static bool fdb_handle_notify(struct net_bridge_fdb_entry *fdb, u8 notify) in fdb_handle_notify() argument
1150 !test_and_set_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags)) in fdb_handle_notify()
1154 !test_and_set_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
1158 test_and_clear_bit(BR_FDB_NOTIFY, &fdb->flags)) { in fdb_handle_notify()
1160 clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags); in fdb_handle_notify()
1174 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
1201 fdb = br_fdb_find(br, addr, vid); in fdb_add_entry()
1202 if (fdb == NULL) { in fdb_add_entry()
1206 fdb = fdb_create(br, source, addr, vid, in fdb_add_entry()
1208 if (!fdb) in fdb_add_entry()
1216 if (READ_ONCE(fdb->dst) != source) { in fdb_add_entry()
1217 WRITE_ONCE(fdb->dst, source); in fdb_add_entry()
1221 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in fdb_add_entry()
1222 if (test_and_clear_bit(BR_FDB_DYNAMIC_LEARNED, &fdb->flags)) in fdb_add_entry()
1226 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
1228 set_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1229 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1232 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1233 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1236 clear_bit(BR_FDB_LOCAL, &fdb->flags); in fdb_add_entry()
1237 if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags)) in fdb_add_entry()
1244 if (is_sticky != test_bit(BR_FDB_STICKY, &fdb->flags)) { in fdb_add_entry()
1245 change_bit(BR_FDB_STICKY, &fdb->flags); in fdb_add_entry()
1249 if (test_and_clear_bit(BR_FDB_LOCKED, &fdb->flags)) in fdb_add_entry()
1252 if (fdb_handle_notify(fdb, notify)) in fdb_add_entry()
1255 WRITE_ONCE(fdb->used, jiffies); in fdb_add_entry()
1258 WRITE_ONCE(fdb->updated, jiffies); in fdb_add_entry()
1259 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_entry()
1405 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr_and_port() local
1407 fdb = br_fdb_find(br, addr, vlan); in fdb_delete_by_addr_and_port()
1408 if (!fdb || READ_ONCE(fdb->dst) != p) in fdb_delete_by_addr_and_port()
1411 fdb_delete(br, fdb, true); in fdb_delete_by_addr_and_port()
1531 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1542 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_add()
1543 if (!fdb) { in br_fdb_external_learn_add()
1555 fdb = fdb_create(br, p, addr, vid, flags); in br_fdb_external_learn_add()
1556 if (!fdb) { in br_fdb_external_learn_add()
1560 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1563 (!test_bit(BR_FDB_LOCKED, &fdb->flags) || in br_fdb_external_learn_add()
1564 READ_ONCE(fdb->dst) != p)) { in br_fdb_external_learn_add()
1569 WRITE_ONCE(fdb->updated, jiffies); in br_fdb_external_learn_add()
1571 if (READ_ONCE(fdb->dst) != p) { in br_fdb_external_learn_add()
1572 WRITE_ONCE(fdb->dst, p); in br_fdb_external_learn_add()
1576 if (test_and_set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) { in br_fdb_external_learn_add()
1578 WRITE_ONCE(fdb->used, jiffies); in br_fdb_external_learn_add()
1583 if (locked != test_bit(BR_FDB_LOCKED, &fdb->flags)) { in br_fdb_external_learn_add()
1584 change_bit(BR_FDB_LOCKED, &fdb->flags); in br_fdb_external_learn_add()
1589 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); in br_fdb_external_learn_add()
1592 set_bit(BR_FDB_LOCAL, &fdb->flags); in br_fdb_external_learn_add()
1595 test_and_clear_bit(BR_FDB_DYNAMIC_LEARNED, &fdb->flags)) in br_fdb_external_learn_add()
1599 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1612 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1617 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_del()
1618 if (fdb && test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) in br_fdb_external_learn_del()
1619 fdb_delete(br, fdb, swdev_notify); in br_fdb_external_learn_del()
1631 struct net_bridge_fdb_entry *fdb; in br_fdb_offloaded_set() local
1635 fdb = br_fdb_find(br, addr, vid); in br_fdb_offloaded_set()
1636 if (fdb && offloaded != test_bit(BR_FDB_OFFLOADED, &fdb->flags)) in br_fdb_offloaded_set()
1637 change_bit(BR_FDB_OFFLOADED, &fdb->flags); in br_fdb_offloaded_set()