Lines Matching refs:fdb

69 				  const struct net_bridge_fdb_entry *fdb)  in has_expired()  argument
71 return !fdb->is_static && in has_expired()
72 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
136 struct switchdev_obj_port_fdb fdb = { in fdb_del_external_learn() local
144 ether_addr_copy(fdb.addr, f->addr.addr); in fdb_del_external_learn()
145 switchdev_port_obj_del(f->dst->dev, &fdb.obj); in fdb_del_external_learn()
378 struct net_bridge_fdb_entry *fdb; in __br_fdb_get() local
380 hlist_for_each_entry_rcu(fdb, in __br_fdb_get()
382 if (ether_addr_equal(fdb->addr.addr, addr) && in __br_fdb_get()
383 fdb->vlan_id == vid) { in __br_fdb_get()
384 if (unlikely(has_expired(br, fdb))) in __br_fdb_get()
386 return fdb; in __br_fdb_get()
398 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
407 fdb = __br_fdb_get(port->br, addr, 0); in br_fdb_test_addr()
408 ret = fdb && fdb->dst && fdb->dst->dev != dev && in br_fdb_test_addr()
409 fdb->dst->state == BR_STATE_FORWARDING; in br_fdb_test_addr()
473 struct net_bridge_fdb_entry *fdb; in fdb_find() local
475 hlist_for_each_entry(fdb, head, hlist) { in fdb_find()
476 if (ether_addr_equal(fdb->addr.addr, addr) && in fdb_find()
477 fdb->vlan_id == vid) in fdb_find()
478 return fdb; in fdb_find()
487 struct net_bridge_fdb_entry *fdb; in fdb_find_rcu() local
489 hlist_for_each_entry_rcu(fdb, head, hlist) { in fdb_find_rcu()
490 if (ether_addr_equal(fdb->addr.addr, addr) && in fdb_find_rcu()
491 fdb->vlan_id == vid) in fdb_find_rcu()
492 return fdb; in fdb_find_rcu()
504 struct net_bridge_fdb_entry *fdb; in fdb_create() local
506 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
507 if (fdb) { in fdb_create()
508 memcpy(fdb->addr.addr, addr, ETH_ALEN); in fdb_create()
509 fdb->dst = source; in fdb_create()
510 fdb->vlan_id = vid; in fdb_create()
511 fdb->is_local = is_local; in fdb_create()
512 fdb->is_static = is_static; in fdb_create()
513 fdb->added_by_user = 0; in fdb_create()
514 fdb->added_by_external_learn = 0; in fdb_create()
515 fdb->updated = fdb->used = jiffies; in fdb_create()
516 hlist_add_head_rcu(&fdb->hlist, head); in fdb_create()
518 return fdb; in fdb_create()
525 struct net_bridge_fdb_entry *fdb; in fdb_insert() local
530 fdb = fdb_find(head, addr, vid); in fdb_insert()
531 if (fdb) { in fdb_insert()
535 if (fdb->is_local) in fdb_insert()
540 fdb_delete(br, fdb); in fdb_insert()
543 fdb = fdb_create(head, source, addr, vid, 1, 1); in fdb_insert()
544 if (!fdb) in fdb_insert()
548 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_insert()
568 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
580 fdb = fdb_find_rcu(head, addr, vid); in br_fdb_update()
581 if (likely(fdb)) { in br_fdb_update()
583 if (unlikely(fdb->is_local)) { in br_fdb_update()
590 if (unlikely(source != fdb->dst)) { in br_fdb_update()
591 fdb->dst = source; in br_fdb_update()
594 fdb->updated = jiffies; in br_fdb_update()
596 fdb->added_by_user = 1; in br_fdb_update()
598 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
603 fdb = fdb_create(head, source, addr, vid, 0, 0); in br_fdb_update()
604 if (fdb) { in br_fdb_update()
606 fdb->added_by_user = 1; in br_fdb_update()
607 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
618 const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
620 if (fdb->is_local) in fdb_to_nud()
622 else if (fdb->is_static) in fdb_to_nud()
624 else if (has_expired(br, fdb)) in fdb_to_nud()
631 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
647 ndm->ndm_flags = fdb->added_by_external_learn ? NTF_EXT_LEARNED : 0; in fdb_fill_info()
649 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
650 ndm->ndm_state = fdb_to_nud(br, fdb); in fdb_fill_info()
652 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->addr)) in fdb_fill_info()
656 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in fdb_fill_info()
658 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in fdb_fill_info()
663 if (fdb->vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), &fdb->vlan_id)) in fdb_fill_info()
684 const struct net_bridge_fdb_entry *fdb, int type) in fdb_notify() argument
694 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
766 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
775 fdb = fdb_find(head, addr, vid); in fdb_add_entry()
776 if (fdb == NULL) { in fdb_add_entry()
780 fdb = fdb_create(head, source, addr, vid, 0, 0); in fdb_add_entry()
781 if (!fdb) in fdb_add_entry()
789 if (fdb->dst != source) { in fdb_add_entry()
790 fdb->dst = source; in fdb_add_entry()
795 if (fdb_to_nud(br, fdb) != state) { in fdb_add_entry()
797 fdb->is_local = 1; in fdb_add_entry()
798 if (!fdb->is_static) { in fdb_add_entry()
799 fdb->is_static = 1; in fdb_add_entry()
803 fdb->is_local = 0; in fdb_add_entry()
804 if (!fdb->is_static) { in fdb_add_entry()
805 fdb->is_static = 1; in fdb_add_entry()
809 fdb->is_local = 0; in fdb_add_entry()
810 if (fdb->is_static) { in fdb_add_entry()
811 fdb->is_static = 0; in fdb_add_entry()
818 fdb->added_by_user = 1; in fdb_add_entry()
820 fdb->used = jiffies; in fdb_add_entry()
822 fdb->updated = jiffies; in fdb_add_entry()
823 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_add_entry()
929 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr() local
931 fdb = fdb_find(head, addr, vid); in fdb_delete_by_addr()
932 if (!fdb) in fdb_delete_by_addr()
935 fdb_delete(br, fdb); in fdb_delete_by_addr()
956 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr_and_port() local
958 fdb = fdb_find(head, addr, vlan); in fdb_delete_by_addr_and_port()
959 if (!fdb || fdb->dst != p) in fdb_delete_by_addr_and_port()
962 fdb_delete(br, fdb); in fdb_delete_by_addr_and_port()
1038 struct net_bridge_fdb_entry *fdb, *tmp; in br_fdb_sync_static() local
1045 hlist_for_each_entry(fdb, &br->hash[i], hlist) { in br_fdb_sync_static()
1047 if (!fdb->is_static) in br_fdb_sync_static()
1050 err = dev_uc_add(p->dev, fdb->addr.addr); in br_fdb_sync_static()
1061 if (tmp == fdb) in br_fdb_sync_static()
1076 struct net_bridge_fdb_entry *fdb; in br_fdb_unsync_static() local
1082 hlist_for_each_entry_rcu(fdb, &br->hash[i], hlist) { in br_fdb_unsync_static()
1084 if (!fdb->is_static) in br_fdb_unsync_static()
1087 dev_uc_del(p->dev, fdb->addr.addr); in br_fdb_unsync_static()
1096 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1103 fdb = fdb_find(head, addr, vid); in br_fdb_external_learn_add()
1104 if (!fdb) { in br_fdb_external_learn_add()
1105 fdb = fdb_create(head, p, addr, vid, 0, 0); in br_fdb_external_learn_add()
1106 if (!fdb) { in br_fdb_external_learn_add()
1110 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1111 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1112 } else if (fdb->added_by_external_learn) { in br_fdb_external_learn_add()
1114 fdb->updated = fdb->used = jiffies; in br_fdb_external_learn_add()
1115 } else if (!fdb->added_by_user) { in br_fdb_external_learn_add()
1117 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1118 fdb->updated = jiffies; in br_fdb_external_learn_add()
1119 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1132 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1139 fdb = fdb_find(head, addr, vid); in br_fdb_external_learn_del()
1140 if (fdb && fdb->added_by_external_learn) in br_fdb_external_learn_del()
1141 fdb_delete(br, fdb); in br_fdb_external_learn_del()