diff options
author | melifaro <melifaro@FreeBSD.org> | 2015-08-08 17:48:54 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2015-08-08 17:48:54 +0000 |
commit | 20bb5966e2075bde042b8b62c236e29d6e8934da (patch) | |
tree | 731dce9358d789a8c3034ce0eea54d4f64dad724 /sys/netinet/if_ether.c | |
parent | 2039dd9ad41e9d94f6bf6471ffcf42c381368b69 (diff) | |
download | FreeBSD-src-20bb5966e2075bde042b8b62c236e29d6e8934da.zip FreeBSD-src-20bb5966e2075bde042b8b62c236e29d6e8934da.tar.gz |
MFP r274553:
* Move lle creation/deletion from lla_lookup to separate functions:
lla_lookup(LLE_CREATE) -> lla_create
lla_lookup(LLE_DELETE) -> lla_delete
lla_create now returns with LLE_EXCLUSIVE lock for lle.
* Provide typedefs for new/existing lltable callbacks.
Reviewed by: ae
Diffstat (limited to 'sys/netinet/if_ether.c')
-rw-r--r-- | sys/netinet/if_ether.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 1012e93..8006226 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -152,8 +152,7 @@ arp_ifscrub(struct ifnet *ifp, uint32_t addr) addr4.sin_family = AF_INET; addr4.sin_addr.s_addr = addr; IF_AFDATA_WLOCK(ifp); - lla_lookup(LLTABLE(ifp), (LLE_DELETE | LLE_IFADDR), - (struct sockaddr *)&addr4); + lla_delete(LLTABLE(ifp), LLE_IFADDR, (struct sockaddr *)&addr4); IF_AFDATA_WUNLOCK(ifp); } #endif @@ -325,11 +324,12 @@ arpresolve(struct ifnet *ifp, int is_gw, struct mbuf *m, u_int flags = 0; struct mbuf *curr = NULL; struct mbuf *next = NULL; - int error, renew; + int create, error, renew; if (pflags != NULL) *pflags = 0; + create = 0; if (m != NULL) { if (m->m_flags & M_BCAST) { /* broadcast */ @@ -349,13 +349,14 @@ retry: IF_AFDATA_RUNLOCK(ifp); if ((la == NULL) && ((flags & LLE_EXCLUSIVE) == 0) && ((ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) == 0)) { - flags |= (LLE_CREATE | LLE_EXCLUSIVE); + create = 1; + flags |= LLE_EXCLUSIVE; IF_AFDATA_WLOCK(ifp); - la = lla_lookup(LLTABLE(ifp), flags, dst); + la = lla_create(LLTABLE(ifp), flags, dst); IF_AFDATA_WUNLOCK(ifp); } if (la == NULL) { - if (flags & LLE_CREATE) + if (create != 0) log(LOG_DEBUG, "arpresolve: can't allocate llinfo for %s on %s\n", inet_ntoa(SIN(dst)->sin_addr), ifp->if_xname); @@ -578,7 +579,7 @@ in_arpinput(struct mbuf *m) int op, flags; int req_len; int bridged = 0, is_bridge = 0; - int carped; + int carped, create; struct sockaddr_in sin; sin.sin_len = sizeof(struct sockaddr_in); sin.sin_family = AF_INET; @@ -729,10 +730,13 @@ match: sin.sin_len = sizeof(struct sockaddr_in); sin.sin_family = AF_INET; sin.sin_addr = isaddr; - flags = (itaddr.s_addr == myaddr.s_addr) ? LLE_CREATE : 0; - flags |= LLE_EXCLUSIVE; + create = (itaddr.s_addr == myaddr.s_addr) ? 1 : 0; + flags = LLE_EXCLUSIVE; IF_AFDATA_LOCK(ifp); - la = lla_lookup(LLTABLE(ifp), flags, (struct sockaddr *)&sin); + if (create != 0) + la = lla_create(LLTABLE(ifp), 0, (struct sockaddr *)&sin); + else + la = lla_lookup(LLTABLE(ifp), flags, (struct sockaddr *)&sin); IF_AFDATA_UNLOCK(ifp); if (la != NULL) { /* the following is not an error when doing bridging */ @@ -947,14 +951,14 @@ arp_ifinit(struct ifnet *ifp, struct ifaddr *ifa) * that L2 entry as permanent */ IF_AFDATA_LOCK(ifp); - lle = lla_lookup(LLTABLE(ifp), (LLE_CREATE | LLE_IFADDR | LLE_STATIC), + lle = lla_create(LLTABLE(ifp), LLE_IFADDR | LLE_STATIC, (struct sockaddr *)IA_SIN(ifa)); IF_AFDATA_UNLOCK(ifp); if (lle == NULL) log(LOG_INFO, "arp_ifinit: cannot create arp " "entry for interface address\n"); else - LLE_RUNLOCK(lle); + LLE_WUNLOCK(lle); } ifa->ifa_rtrequest = NULL; } |