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