The llentry_update() is used only by flowtable and the latter

always passes NULL pointer to it. Thus, code can be simplified
and function renamed to llentry_alloc() to match rtalloc().
This commit is contained in:
glebius 2012-08-02 13:20:44 +00:00
parent 55897c521e
commit 34fe3f296a
3 changed files with 15 additions and 24 deletions

View File

@ -1258,7 +1258,7 @@ flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
else
l3addr = (struct sockaddr_storage *)&ro->ro_dst;
llentry_update(&lle, LLTABLE6(ifp), l3addr, ifp);
lle = llentry_alloc(ifp, LLTABLE6(ifp), l3addr);
}
#endif
#ifdef INET
@ -1267,7 +1267,7 @@ flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
l3addr = (struct sockaddr_storage *)rt->rt_gateway;
else
l3addr = (struct sockaddr_storage *)&ro->ro_dst;
llentry_update(&lle, LLTABLE(ifp), l3addr, ifp);
lle = llentry_alloc(ifp, LLTABLE(ifp), l3addr);
}
#endif

View File

@ -129,42 +129,33 @@ llentry_free(struct llentry *lle)
}
/*
* Update an llentry for address dst (equivalent to rtalloc for new-arp)
* Caller must pass in a valid struct llentry * (or NULL)
* (al)locate an llentry for address dst (equivalent to rtalloc for new-arp).
*
* if found the llentry * is returned referenced and unlocked
* If found the llentry * is returned referenced and unlocked.
*/
int
llentry_update(struct llentry **llep, struct lltable *lt,
struct sockaddr_storage *dst, struct ifnet *ifp)
struct llentry *
llentry_alloc(struct ifnet *ifp, struct lltable *lt,
struct sockaddr_storage *dst)
{
struct llentry *la;
IF_AFDATA_RLOCK(ifp);
la = lla_lookup(lt, LLE_EXCLUSIVE,
(struct sockaddr *)dst);
la = lla_lookup(lt, LLE_EXCLUSIVE, (struct sockaddr *)dst);
IF_AFDATA_RUNLOCK(ifp);
if ((la == NULL) &&
(ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) == 0) {
IF_AFDATA_WLOCK(ifp);
la = lla_lookup(lt,
(LLE_CREATE | LLE_EXCLUSIVE),
la = lla_lookup(lt, (LLE_CREATE | LLE_EXCLUSIVE),
(struct sockaddr *)dst);
IF_AFDATA_WUNLOCK(ifp);
}
if (la != NULL && (*llep != la)) {
if (*llep != NULL)
LLE_FREE(*llep);
if (la != NULL) {
LLE_ADDREF(la);
LLE_WUNLOCK(la);
*llep = la;
} else if (la != NULL)
LLE_WUNLOCK(la);
}
if (la == NULL)
return (ENOENT);
return (0);
return (la);
}
/*

View File

@ -189,8 +189,8 @@ void lltable_drain(int);
int lltable_sysctl_dumparp(int, struct sysctl_req *);
size_t llentry_free(struct llentry *);
int llentry_update(struct llentry **, struct lltable *,
struct sockaddr_storage *, struct ifnet *);
struct llentry *llentry_alloc(struct ifnet *, struct lltable *,
struct sockaddr_storage *);
/*
* Generic link layer address lookup function.