Lines Matching refs:fdb
72 const struct net_bridge_fdb_entry *fdb)
74 return !test_bit(BR_FDB_STATIC, &fdb->flags) &&
75 !test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags) &&
76 time_before_eq(fdb->updated + hold_time(br), jiffies);
87 const struct net_bridge_fdb_entry *fdb)
89 if (test_bit(BR_FDB_LOCAL, &fdb->flags))
91 else if (test_bit(BR_FDB_STATIC, &fdb->flags))
93 else if (has_expired(br, fdb))
100 const struct net_bridge_fdb_entry *fdb,
103 const struct net_bridge_port *dst = READ_ONCE(fdb->dst);
121 ndm->ndm_state = fdb_to_nud(br, fdb);
123 if (test_bit(BR_FDB_OFFLOADED, &fdb->flags))
125 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags))
127 if (test_bit(BR_FDB_STICKY, &fdb->flags))
129 if (test_bit(BR_FDB_LOCKED, &fdb->flags))
132 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr))
139 ci.ndm_used = jiffies_to_clock_t(now - fdb->used);
141 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated);
146 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16),
147 &fdb->key.vlan_id))
150 if (test_bit(BR_FDB_NOTIFY, &fdb->flags)) {
156 if (test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags))
188 const struct net_bridge_fdb_entry *fdb, int type,
196 br_switchdev_fdb_notify(br, fdb, type);
202 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0);
234 struct net_bridge_fdb_entry *fdb;
239 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
242 return fdb;
391 struct net_bridge_fdb_entry *fdb;
394 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC);
395 if (!fdb)
398 memcpy(fdb->key.addr.addr, addr, ETH_ALEN);
399 WRITE_ONCE(fdb->dst, source);
400 fdb->key.vlan_id = vid;
401 fdb->flags = flags;
402 fdb->updated = fdb->used = jiffies;
403 err = rhashtable_lookup_insert_fast(&br->fdb_hash_tbl, &fdb->rhnode,
406 kmem_cache_free(br_fdb_cache, fdb);
410 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list);
412 return fdb;
418 struct net_bridge_fdb_entry *fdb;
423 fdb = br_fdb_find(br, addr, vid);
424 if (fdb) {
428 if (test_bit(BR_FDB_LOCAL, &fdb->flags))
432 fdb_delete(br, fdb, true);
435 fdb = fdb_create(br, source, addr, vid,
437 if (!fdb)
441 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
685 NL_SET_ERR_MSG(extack, "Unsupported fdb flush ndm flag bits set");
689 NL_SET_ERR_MSG(extack, "Unsupported fdb flush ndm state bits set");
762 struct net_bridge_fdb_entry *fdb;
773 fdb = br_fdb_find_rcu(port->br, addr, 0);
774 if (fdb)
775 dst = READ_ONCE(fdb->dst);
846 /* returns true if the fdb was modified */
847 static bool __fdb_mark_active(struct net_bridge_fdb_entry *fdb)
849 return !!(test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags) &&
850 test_and_clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags));
856 struct net_bridge_fdb_entry *fdb;
862 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
863 if (likely(fdb)) {
865 if (unlikely(test_bit(BR_FDB_LOCAL, &fdb->flags))) {
873 if (now != fdb->updated) {
874 fdb->updated = now;
875 fdb_modified = __fdb_mark_active(fdb);
879 if (unlikely(source != READ_ONCE(fdb->dst) &&
880 !test_bit(BR_FDB_STICKY, &fdb->flags))) {
881 br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH);
882 WRITE_ONCE(fdb->dst, source);
886 &fdb->flags)))
888 &fdb->flags);
892 if (unlikely(test_bit(BR_FDB_LOCKED, &fdb->flags)))
893 clear_bit(BR_FDB_LOCKED, &fdb->flags);
897 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
900 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
905 fdb = fdb_create(br, source, addr, vid, flags);
906 if (fdb) {
908 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
996 /* returns true if the fdb is modified */
997 static bool fdb_handle_notify(struct net_bridge_fdb_entry *fdb, u8 notify)
1003 !test_and_set_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags))
1007 !test_and_set_bit(BR_FDB_NOTIFY, &fdb->flags)) {
1011 test_and_clear_bit(BR_FDB_NOTIFY, &fdb->flags)) {
1013 clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags);
1027 struct net_bridge_fdb_entry *fdb;
1054 fdb = br_fdb_find(br, addr, vid);
1055 if (fdb == NULL) {
1059 fdb = fdb_create(br, source, addr, vid, 0);
1060 if (!fdb)
1068 if (READ_ONCE(fdb->dst) != source) {
1069 WRITE_ONCE(fdb->dst, source);
1074 if (fdb_to_nud(br, fdb) != state) {
1076 set_bit(BR_FDB_LOCAL, &fdb->flags);
1077 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
1080 clear_bit(BR_FDB_LOCAL, &fdb->flags);
1081 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
1084 clear_bit(BR_FDB_LOCAL, &fdb->flags);
1085 if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags))
1092 if (is_sticky != test_bit(BR_FDB_STICKY, &fdb->flags)) {
1093 change_bit(BR_FDB_STICKY, &fdb->flags);
1097 if (test_and_clear_bit(BR_FDB_LOCKED, &fdb->flags))
1100 if (fdb_handle_notify(fdb, notify))
1103 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
1105 fdb->used = jiffies;
1108 fdb->updated = jiffies;
1109 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
1157 /* Add new permanent fdb entry with RTM_NEWNEIGH */
1253 struct net_bridge_fdb_entry *fdb;
1255 fdb = br_fdb_find(br, addr, vlan);
1256 if (!fdb || READ_ONCE(fdb->dst) != p)
1259 fdb_delete(br, fdb, true);
1383 struct net_bridge_fdb_entry *fdb;
1394 fdb = br_fdb_find(br, addr, vid);
1395 if (!fdb) {
1407 fdb = fdb_create(br, p, addr, vid, flags);
1408 if (!fdb) {
1412 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1415 (!test_bit(BR_FDB_LOCKED, &fdb->flags) ||
1416 READ_ONCE(fdb->dst) != p)) {
1421 fdb->updated = jiffies;
1423 if (READ_ONCE(fdb->dst) != p) {
1424 WRITE_ONCE(fdb->dst, p);
1428 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) {
1430 fdb->used = jiffies;
1431 } else if (!test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags)) {
1433 set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags);
1437 if (locked != test_bit(BR_FDB_LOCKED, &fdb->flags)) {
1438 change_bit(BR_FDB_LOCKED, &fdb->flags);
1443 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
1446 set_bit(BR_FDB_LOCAL, &fdb->flags);
1449 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1462 struct net_bridge_fdb_entry *fdb;
1467 fdb = br_fdb_find(br, addr, vid);
1468 if (fdb && test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags))
1469 fdb_delete(br, fdb, swdev_notify);
1481 struct net_bridge_fdb_entry *fdb;
1485 fdb = br_fdb_find(br, addr, vid);
1486 if (fdb && offloaded != test_bit(BR_FDB_OFFLOADED, &fdb->flags))
1487 change_bit(BR_FDB_OFFLOADED, &fdb->flags);