summaryrefslogtreecommitdiffstats
path: root/sys/netinet/if_ether.c
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2015-08-08 17:48:54 +0000
committermelifaro <melifaro@FreeBSD.org>2015-08-08 17:48:54 +0000
commit20bb5966e2075bde042b8b62c236e29d6e8934da (patch)
tree731dce9358d789a8c3034ce0eea54d4f64dad724 /sys/netinet/if_ether.c
parent2039dd9ad41e9d94f6bf6471ffcf42c381368b69 (diff)
downloadFreeBSD-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.c28
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;
}
OpenPOWER on IntegriCloud