Lines Matching refs:fdb

68 				  const struct net_bridge_fdb_entry *fdb)  in has_expired()  argument
70 return !fdb->is_static && in has_expired()
71 time_before_eq(fdb->updated + hold_time(br), jiffies); in has_expired()
350 struct net_bridge_fdb_entry *fdb; in __br_fdb_get() local
352 hlist_for_each_entry_rcu(fdb, in __br_fdb_get()
354 if (ether_addr_equal(fdb->addr.addr, addr) && in __br_fdb_get()
355 fdb->vlan_id == vid) { in __br_fdb_get()
356 if (unlikely(has_expired(br, fdb))) in __br_fdb_get()
358 return fdb; in __br_fdb_get()
370 struct net_bridge_fdb_entry *fdb; in br_fdb_test_addr() local
379 fdb = __br_fdb_get(port->br, addr, 0); in br_fdb_test_addr()
380 ret = fdb && fdb->dst && fdb->dst->dev != dev && in br_fdb_test_addr()
381 fdb->dst->state == BR_STATE_FORWARDING; in br_fdb_test_addr()
445 struct net_bridge_fdb_entry *fdb; in fdb_find() local
447 hlist_for_each_entry(fdb, head, hlist) { in fdb_find()
448 if (ether_addr_equal(fdb->addr.addr, addr) && in fdb_find()
449 fdb->vlan_id == vid) in fdb_find()
450 return fdb; in fdb_find()
459 struct net_bridge_fdb_entry *fdb; in fdb_find_rcu() local
461 hlist_for_each_entry_rcu(fdb, head, hlist) { in fdb_find_rcu()
462 if (ether_addr_equal(fdb->addr.addr, addr) && in fdb_find_rcu()
463 fdb->vlan_id == vid) in fdb_find_rcu()
464 return fdb; in fdb_find_rcu()
474 struct net_bridge_fdb_entry *fdb; in fdb_create() local
476 fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); in fdb_create()
477 if (fdb) { in fdb_create()
478 memcpy(fdb->addr.addr, addr, ETH_ALEN); in fdb_create()
479 fdb->dst = source; in fdb_create()
480 fdb->vlan_id = vid; in fdb_create()
481 fdb->is_local = 0; in fdb_create()
482 fdb->is_static = 0; in fdb_create()
483 fdb->added_by_user = 0; in fdb_create()
484 fdb->added_by_external_learn = 0; in fdb_create()
485 fdb->updated = fdb->used = jiffies; in fdb_create()
486 hlist_add_head_rcu(&fdb->hlist, head); in fdb_create()
488 return fdb; in fdb_create()
495 struct net_bridge_fdb_entry *fdb; in fdb_insert() local
500 fdb = fdb_find(head, addr, vid); in fdb_insert()
501 if (fdb) { in fdb_insert()
505 if (fdb->is_local) in fdb_insert()
510 fdb_delete(br, fdb); in fdb_insert()
513 fdb = fdb_create(head, source, addr, vid); in fdb_insert()
514 if (!fdb) in fdb_insert()
517 fdb->is_local = fdb->is_static = 1; in fdb_insert()
519 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_insert()
539 struct net_bridge_fdb_entry *fdb; in br_fdb_update() local
551 fdb = fdb_find_rcu(head, addr, vid); in br_fdb_update()
552 if (likely(fdb)) { in br_fdb_update()
554 if (unlikely(fdb->is_local)) { in br_fdb_update()
561 if (unlikely(source != fdb->dst)) { in br_fdb_update()
562 fdb->dst = source; in br_fdb_update()
565 fdb->updated = jiffies; in br_fdb_update()
567 fdb->added_by_user = 1; in br_fdb_update()
569 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
574 fdb = fdb_create(head, source, addr, vid); in br_fdb_update()
575 if (fdb) { in br_fdb_update()
577 fdb->added_by_user = 1; in br_fdb_update()
578 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_update()
588 static int fdb_to_nud(const struct net_bridge_fdb_entry *fdb) in fdb_to_nud() argument
590 if (fdb->is_local) in fdb_to_nud()
592 else if (fdb->is_static) in fdb_to_nud()
594 else if (has_expired(fdb->dst->br, fdb)) in fdb_to_nud()
601 const struct net_bridge_fdb_entry *fdb, in fdb_fill_info() argument
617 ndm->ndm_flags = fdb->added_by_external_learn ? NTF_EXT_LEARNED : 0; in fdb_fill_info()
619 ndm->ndm_ifindex = fdb->dst ? fdb->dst->dev->ifindex : br->dev->ifindex; in fdb_fill_info()
620 ndm->ndm_state = fdb_to_nud(fdb); in fdb_fill_info()
622 if (nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->addr)) in fdb_fill_info()
626 ci.ndm_used = jiffies_to_clock_t(now - fdb->used); in fdb_fill_info()
628 ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated); in fdb_fill_info()
633 if (fdb->vlan_id && nla_put(skb, NDA_VLAN, sizeof(u16), &fdb->vlan_id)) in fdb_fill_info()
654 const struct net_bridge_fdb_entry *fdb, int type) in fdb_notify() argument
664 err = fdb_fill_info(skb, br, fdb, 0, 0, type, 0); in fdb_notify()
736 struct net_bridge_fdb_entry *fdb; in fdb_add_entry() local
739 fdb = fdb_find(head, addr, vid); in fdb_add_entry()
740 if (fdb == NULL) { in fdb_add_entry()
744 fdb = fdb_create(head, source, addr, vid); in fdb_add_entry()
745 if (!fdb) in fdb_add_entry()
753 if (fdb->dst != source) { in fdb_add_entry()
754 fdb->dst = source; in fdb_add_entry()
759 if (fdb_to_nud(fdb) != state) { in fdb_add_entry()
761 fdb->is_local = 1; in fdb_add_entry()
762 if (!fdb->is_static) { in fdb_add_entry()
763 fdb->is_static = 1; in fdb_add_entry()
767 fdb->is_local = 0; in fdb_add_entry()
768 if (!fdb->is_static) { in fdb_add_entry()
769 fdb->is_static = 1; in fdb_add_entry()
773 fdb->is_local = 0; in fdb_add_entry()
774 if (fdb->is_static) { in fdb_add_entry()
775 fdb->is_static = 0; in fdb_add_entry()
782 fdb->added_by_user = 1; in fdb_add_entry()
784 fdb->used = jiffies; in fdb_add_entry()
786 fdb->updated = jiffies; in fdb_add_entry()
787 fdb_notify(br, fdb, RTM_NEWNEIGH); in fdb_add_entry()
873 struct net_bridge_fdb_entry *fdb; in fdb_delete_by_addr() local
875 fdb = fdb_find(head, addr, vlan); in fdb_delete_by_addr()
876 if (!fdb) in fdb_delete_by_addr()
879 fdb_delete(br, fdb); in fdb_delete_by_addr()
940 struct net_bridge_fdb_entry *fdb, *tmp; in br_fdb_sync_static() local
947 hlist_for_each_entry(fdb, &br->hash[i], hlist) { in br_fdb_sync_static()
949 if (!fdb->is_static) in br_fdb_sync_static()
952 err = dev_uc_add(p->dev, fdb->addr.addr); in br_fdb_sync_static()
963 if (tmp == fdb) in br_fdb_sync_static()
978 struct net_bridge_fdb_entry *fdb; in br_fdb_unsync_static() local
984 hlist_for_each_entry_rcu(fdb, &br->hash[i], hlist) { in br_fdb_unsync_static()
986 if (!fdb->is_static) in br_fdb_unsync_static()
989 dev_uc_del(p->dev, fdb->addr.addr); in br_fdb_unsync_static()
998 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_add() local
1005 fdb = fdb_find(head, addr, vid); in br_fdb_external_learn_add()
1006 if (!fdb) { in br_fdb_external_learn_add()
1007 fdb = fdb_create(head, p, addr, vid); in br_fdb_external_learn_add()
1008 if (!fdb) { in br_fdb_external_learn_add()
1012 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1013 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1014 } else if (fdb->added_by_external_learn) { in br_fdb_external_learn_add()
1016 fdb->updated = fdb->used = jiffies; in br_fdb_external_learn_add()
1017 } else if (!fdb->added_by_user) { in br_fdb_external_learn_add()
1019 fdb->added_by_external_learn = 1; in br_fdb_external_learn_add()
1020 fdb->updated = jiffies; in br_fdb_external_learn_add()
1021 fdb_notify(br, fdb, RTM_NEWNEIGH); in br_fdb_external_learn_add()
1034 struct net_bridge_fdb_entry *fdb; in br_fdb_external_learn_del() local
1041 fdb = fdb_find(head, addr, vid); in br_fdb_external_learn_del()
1042 if (fdb && fdb->added_by_external_learn) in br_fdb_external_learn_del()
1043 fdb_delete(br, fdb); in br_fdb_external_learn_del()