Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/if_ether.c
Show First 20 Lines • Show All 995 Lines • ▼ Show 20 Lines | else if (itaddr.s_addr == myaddr.s_addr) { | ||||
*/ | */ | ||||
if (la_tmp == NULL) | if (la_tmp == NULL) | ||||
lltable_link_entry(LLTABLE(ifp), la); | lltable_link_entry(LLTABLE(ifp), la); | ||||
IF_AFDATA_WUNLOCK(ifp); | IF_AFDATA_WUNLOCK(ifp); | ||||
if (la_tmp == NULL) { | if (la_tmp == NULL) { | ||||
arp_mark_lle_reachable(la); | arp_mark_lle_reachable(la); | ||||
LLE_WUNLOCK(la); | LLE_WUNLOCK(la); | ||||
nhops_update_neigh(ifp, AF_INET, la); | |||||
} else { | } else { | ||||
/* Free newly-create entry and handle packet */ | /* Free newly-create entry and handle packet */ | ||||
lltable_free_entry(LLTABLE(ifp), la); | lltable_free_entry(LLTABLE(ifp), la); | ||||
la = la_tmp; | la = la_tmp; | ||||
la_tmp = NULL; | la_tmp = NULL; | ||||
arp_check_update_lle(ah, isaddr, ifp, bridged, la); | arp_check_update_lle(ah, isaddr, ifp, bridged, la); | ||||
/* arp_check_update_lle() returns @la unlocked */ | /* arp_check_update_lle() returns @la unlocked */ | ||||
} | } | ||||
▲ Show 20 Lines • Show All 222 Lines • ▼ Show 20 Lines | arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp, | ||||
/* Check if something has changed */ | /* Check if something has changed */ | ||||
if (memcmp(la->r_linkdata, linkhdr, linkhdrsize) != 0 || | if (memcmp(la->r_linkdata, linkhdr, linkhdrsize) != 0 || | ||||
(la->la_flags & LLE_VALID) == 0) { | (la->la_flags & LLE_VALID) == 0) { | ||||
/* Try to perform LLE update */ | /* Try to perform LLE update */ | ||||
if (lltable_try_set_entry_addr(ifp, la, linkhdr, linkhdrsize, | if (lltable_try_set_entry_addr(ifp, la, linkhdr, linkhdrsize, | ||||
lladdr_off) == 0) | lladdr_off) == 0) | ||||
return; | return; | ||||
nhops_update_neigh(ifp, AF_INET, la); | |||||
/* Clear fast path feedback request if set */ | /* Clear fast path feedback request if set */ | ||||
llentry_mark_used(la); | llentry_mark_used(la); | ||||
nhops_stop_feedback(ifp, AF_INET, la); | |||||
} | } | ||||
arp_mark_lle_reachable(la); | arp_mark_lle_reachable(la); | ||||
/* | /* | ||||
* The packets are all freed within the call to the output | * The packets are all freed within the call to the output | ||||
* routine. | * routine. | ||||
* | * | ||||
▲ Show 20 Lines • Show All 280 Lines • Show Last 20 Lines |