Lines Matching refs:fdb
76 const struct net_bridge_fdb_entry *fdb)
78 return !test_bit(BR_FDB_STATIC, &fdb->flags) &&
79 !test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags) &&
80 time_before_eq(fdb->updated + hold_time(br), jiffies);
109 struct net_bridge_fdb_entry *fdb;
114 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
117 return fdb;
434 struct net_bridge_fdb_entry *fdb;
443 fdb = br_fdb_find_rcu(port->br, addr, 0);
444 ret = fdb && fdb->dst && fdb->dst->dev != dev &&
445 fdb->dst->state == BR_STATE_FORWARDING;
507 struct net_bridge_fdb_entry *fdb;
509 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC);
510 if (fdb) {
511 memcpy(fdb->key.addr.addr, addr, ETH_ALEN);
512 fdb->dst = source;
513 fdb->key.vlan_id = vid;
514 fdb->flags = flags;
515 fdb->updated = fdb->used = jiffies;
517 &fdb->rhnode,
519 kmem_cache_free(br_fdb_cache, fdb);
520 fdb = NULL;
522 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list);
525 return fdb;
531 struct net_bridge_fdb_entry *fdb;
536 fdb = br_fdb_find(br, addr, vid);
537 if (fdb) {
541 if (test_bit(BR_FDB_LOCAL, &fdb->flags))
545 fdb_delete(br, fdb, true);
548 fdb = fdb_create(br, source, addr, vid,
550 if (!fdb)
554 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
570 /* returns true if the fdb was modified */
571 static bool __fdb_mark_active(struct net_bridge_fdb_entry *fdb)
573 return !!(test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags) &&
574 test_and_clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags));
580 struct net_bridge_fdb_entry *fdb;
586 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid);
587 if (likely(fdb)) {
589 if (unlikely(test_bit(BR_FDB_LOCAL, &fdb->flags))) {
597 if (now != fdb->updated) {
598 fdb->updated = now;
599 fdb_modified = __fdb_mark_active(fdb);
603 if (unlikely(source != fdb->dst &&
604 !test_bit(BR_FDB_STICKY, &fdb->flags))) {
605 fdb->dst = source;
609 &fdb->flags)))
611 &fdb->flags);
615 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
618 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
623 fdb = fdb_create(br, source, addr, vid, flags);
624 if (fdb) {
626 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
636 const struct net_bridge_fdb_entry *fdb)
638 if (test_bit(BR_FDB_LOCAL, &fdb->flags))
640 else if (test_bit(BR_FDB_STATIC, &fdb->flags))
642 else if (has_expired(br, fdb))
649 const struct net_bridge_fdb_entry *fdb,
667 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex;
668 ndm->ndm_state = fdb_to_nud(br, fdb);
670 if (test_bit(BR_FDB_OFFLOADED, &fdb->flags))
672 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags))
674 if (test_bit(BR_FDB_STICKY, &fdb->flags))
677 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr))
681 ci.ndm_used = jiffies_to_clock_t(now - fdb->used);
683 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated);
688 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16),
689 &fdb->key.vlan_id))
692 if (test_bit(BR_FDB_NOTIFY, &fdb->flags)) {
698 if (test_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags))
729 const struct net_bridge_fdb_entry *fdb, int type,
737 br_switchdev_fdb_notify(fdb, type);
743 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0);
835 /* returns true if the fdb is modified */
836 static bool fdb_handle_notify(struct net_bridge_fdb_entry *fdb, u8 notify)
842 !test_and_set_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags))
846 !test_and_set_bit(BR_FDB_NOTIFY, &fdb->flags)) {
850 test_and_clear_bit(BR_FDB_NOTIFY, &fdb->flags)) {
852 clear_bit(BR_FDB_NOTIFY_INACTIVE, &fdb->flags);
866 struct net_bridge_fdb_entry *fdb;
893 fdb = br_fdb_find(br, addr, vid);
894 if (fdb == NULL) {
898 fdb = fdb_create(br, source, addr, vid, 0);
899 if (!fdb)
907 if (fdb->dst != source) {
908 fdb->dst = source;
913 if (fdb_to_nud(br, fdb) != state) {
915 set_bit(BR_FDB_LOCAL, &fdb->flags);
916 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
919 clear_bit(BR_FDB_LOCAL, &fdb->flags);
920 if (!test_and_set_bit(BR_FDB_STATIC, &fdb->flags))
923 clear_bit(BR_FDB_LOCAL, &fdb->flags);
924 if (test_and_clear_bit(BR_FDB_STATIC, &fdb->flags))
931 if (is_sticky != test_bit(BR_FDB_STICKY, &fdb->flags)) {
932 change_bit(BR_FDB_STICKY, &fdb->flags);
936 if (fdb_handle_notify(fdb, notify))
939 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
941 fdb->used = jiffies;
944 fdb->updated = jiffies;
945 fdb_notify(br, fdb, RTM_NEWNEIGH, true);
993 /* Add new permanent fdb entry with RTM_NEWNEIGH */
1080 struct net_bridge_fdb_entry *fdb;
1082 fdb = br_fdb_find(br, addr, vlan);
1083 if (!fdb || fdb->dst != p)
1086 fdb_delete(br, fdb, true);
1209 struct net_bridge_fdb_entry *fdb;
1217 fdb = br_fdb_find(br, addr, vid);
1218 if (!fdb) {
1227 fdb = fdb_create(br, p, addr, vid, flags);
1228 if (!fdb) {
1232 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1234 fdb->updated = jiffies;
1236 if (fdb->dst != p) {
1237 fdb->dst = p;
1241 if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) {
1243 fdb->used = jiffies;
1244 } else if (!test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags)) {
1246 set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags);
1251 set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
1254 set_bit(BR_FDB_LOCAL, &fdb->flags);
1257 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
1270 struct net_bridge_fdb_entry *fdb;
1275 fdb = br_fdb_find(br, addr, vid);
1276 if (fdb && test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags))
1277 fdb_delete(br, fdb, swdev_notify);
1289 struct net_bridge_fdb_entry *fdb;
1293 fdb = br_fdb_find(br, addr, vid);
1294 if (fdb && offloaded != test_bit(BR_FDB_OFFLOADED, &fdb->flags))
1295 change_bit(BR_FDB_OFFLOADED, &fdb->flags);