Lines Matching refs:fdb

76 				  const struct net_bridge_fdb_entry *fdb)  in has_expired()  argument
78 return !fdb->is_static && !fdb->added_by_external_learn && in has_expired()
79 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
108 struct net_bridge_fdb_entry *fdb; in br_fdb_find() local
113 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_find()
116 return fdb; in br_fdb_find()
416 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
425 fdb = br_fdb_find_rcu(port->br, addr, 0); in br_fdb_test_addr()
426 ret = fdb && fdb->dst && fdb->dst->dev != dev && in br_fdb_test_addr()
427 fdb->dst->state == BR_STATE_FORWARDING; in br_fdb_test_addr()
490 struct net_bridge_fdb_entry *fdb; in fdb_create() local
492 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
493 if (fdb) { in fdb_create()
494 memcpy(fdb->key.addr.addr, addr, ETH_ALEN); in fdb_create()
495 fdb->dst = source; in fdb_create()
496 fdb->key.vlan_id = vid; in fdb_create()
497 fdb->is_local = is_local; in fdb_create()
498 fdb->is_static = is_static; in fdb_create()
499 fdb->added_by_user = 0; in fdb_create()
500 fdb->added_by_external_learn = 0; in fdb_create()
501 fdb->offloaded = 0; in fdb_create()
502 fdb->is_sticky = 0; in fdb_create()
503 fdb->updated = fdb->used = jiffies; in fdb_create()
505 &fdb->rhnode, in fdb_create()
507 kmem_cache_free(br_fdb_cache, fdb); in fdb_create()
508 fdb = NULL; in fdb_create()
510 hlist_add_head_rcu(&fdb->fdb_node, &br->fdb_list); in fdb_create()
513 return fdb; in fdb_create()
519 struct net_bridge_fdb_entry *fdb; in fdb_insert() local
524 fdb = br_fdb_find(br, addr, vid); in fdb_insert()
525 if (fdb) { in fdb_insert()
529 if (fdb->is_local) in fdb_insert()
533 fdb_delete(br, fdb, true); in fdb_insert()
536 fdb = fdb_create(br, source, addr, vid, 1, 1); in fdb_insert()
537 if (!fdb) in fdb_insert()
541 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_insert()
560 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
572 fdb = fdb_find_rcu(&br->fdb_hash_tbl, addr, vid); in br_fdb_update()
573 if (likely(fdb)) { in br_fdb_update()
575 if (unlikely(fdb->is_local)) { in br_fdb_update()
583 if (unlikely(source != fdb->dst && !fdb->is_sticky)) { in br_fdb_update()
584 fdb->dst = source; in br_fdb_update()
587 if (unlikely(fdb->added_by_external_learn)) in br_fdb_update()
588 fdb->added_by_external_learn = 0; in br_fdb_update()
590 if (now != fdb->updated) in br_fdb_update()
591 fdb->updated = now; in br_fdb_update()
593 fdb->added_by_user = 1; in br_fdb_update()
596 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
601 fdb = fdb_create(br, source, addr, vid, 0, 0); in br_fdb_update()
602 if (fdb) { in br_fdb_update()
604 fdb->added_by_user = 1; in br_fdb_update()
607 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in br_fdb_update()
617 const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
619 if (fdb->is_local) in fdb_to_nud()
621 else if (fdb->is_static) in fdb_to_nud()
623 else if (has_expired(br, fdb)) in fdb_to_nud()
630 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
648 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
649 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
651 if (fdb->offloaded) in fdb_fill_info()
653 if (fdb->added_by_external_learn) in fdb_fill_info()
655 if (fdb->is_sticky) in fdb_fill_info()
658 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->key.addr)) in fdb_fill_info()
662 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in fdb_fill_info()
664 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in fdb_fill_info()
669 if (fdb->key.vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), in fdb_fill_info()
670 &fdb->key.vlan_id)) in fdb_fill_info()
691 const struct net_bridge_fdb_entry *fdb, int type, in fdb_notify() argument
699 br_switchdev_fdb_notify(fdb, type); in fdb_notify()
705 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
803 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
821 fdb = br_fdb_find(br, addr, vid); in fdb_add_entry()
822 if (fdb == NULL) { in fdb_add_entry()
826 fdb = fdb_create(br, source, addr, vid, 0, 0); in fdb_add_entry()
827 if (!fdb) in fdb_add_entry()
835 if (fdb->dst != source) { in fdb_add_entry()
836 fdb->dst = source; in fdb_add_entry()
841 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
843 fdb->is_local = 1; in fdb_add_entry()
844 if (!fdb->is_static) { in fdb_add_entry()
845 fdb->is_static = 1; in fdb_add_entry()
849 fdb->is_local = 0; in fdb_add_entry()
850 if (!fdb->is_static) { in fdb_add_entry()
851 fdb->is_static = 1; in fdb_add_entry()
855 fdb->is_local = 0; in fdb_add_entry()
856 if (fdb->is_static) { in fdb_add_entry()
857 fdb->is_static = 0; in fdb_add_entry()
865 if (is_sticky != fdb->is_sticky) { in fdb_add_entry()
866 fdb->is_sticky = is_sticky; in fdb_add_entry()
870 fdb->added_by_user = 1; in fdb_add_entry()
872 fdb->used = jiffies; in fdb_add_entry()
874 fdb->updated = jiffies; in fdb_add_entry()
875 fdb_notify(br, fdb, RTM_NEWNEIGH, true); in fdb_add_entry()
983 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr_and_port() local
985 fdb = br_fdb_find(br, addr, vlan); in fdb_delete_by_addr_and_port()
986 if (!fdb || fdb->dst != p) in fdb_delete_by_addr_and_port()
989 fdb_delete(br, fdb, true); in fdb_delete_by_addr_and_port()
1112 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1120 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_add()
1121 if (!fdb) { in br_fdb_external_learn_add()
1122 fdb = fdb_create(br, p, addr, vid, 0, 0); in br_fdb_external_learn_add()
1123 if (!fdb) { in br_fdb_external_learn_add()
1128 fdb->added_by_user = 1; in br_fdb_external_learn_add()
1129 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1130 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1132 fdb->updated = jiffies; in br_fdb_external_learn_add()
1134 if (fdb->dst != p) { in br_fdb_external_learn_add()
1135 fdb->dst = p; in br_fdb_external_learn_add()
1139 if (fdb->added_by_external_learn) { in br_fdb_external_learn_add()
1141 fdb->used = jiffies; in br_fdb_external_learn_add()
1142 } else if (!fdb->added_by_user) { in br_fdb_external_learn_add()
1144 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1149 fdb->added_by_user = 1; in br_fdb_external_learn_add()
1152 fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify); in br_fdb_external_learn_add()
1165 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1170 fdb = br_fdb_find(br, addr, vid); in br_fdb_external_learn_del()
1171 if (fdb && fdb->added_by_external_learn) in br_fdb_external_learn_del()
1172 fdb_delete(br, fdb, swdev_notify); in br_fdb_external_learn_del()
1184 struct net_bridge_fdb_entry *fdb; in br_fdb_offloaded_set() local
1188 fdb = br_fdb_find(br, addr, vid); in br_fdb_offloaded_set()
1189 if (fdb) in br_fdb_offloaded_set()
1190 fdb->offloaded = offloaded; in br_fdb_offloaded_set()