Remove ifa_init() and provide ifa_alloc() that will allocate and setup
struct ifaddr internally. Sponsored by: Netflix Sponsored by: Nginx, Inc.
This commit is contained in:
parent
6ed910fabe
commit
4675896098
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=256519
17
sys/net/if.c
17
sys/net/if.c
@ -633,8 +633,7 @@ if_attach_internal(struct ifnet *ifp, int vmove)
|
||||
socksize = sizeof(*sdl);
|
||||
socksize = roundup2(socksize, sizeof(long));
|
||||
ifasize = sizeof(*ifa) + 2 * socksize;
|
||||
ifa = malloc(ifasize, M_IFADDR, M_WAITOK | M_ZERO);
|
||||
ifa_init(ifa);
|
||||
ifa = ifa_alloc(ifasize, M_WAITOK);
|
||||
sdl = (struct sockaddr_dl *)(ifa + 1);
|
||||
sdl->sdl_len = socksize;
|
||||
sdl->sdl_family = AF_LINK;
|
||||
@ -1417,13 +1416,23 @@ if_maddr_runlock(struct ifnet *ifp)
|
||||
/*
|
||||
* Initialization, destruction and refcounting functions for ifaddrs.
|
||||
*/
|
||||
void
|
||||
ifa_init(struct ifaddr *ifa)
|
||||
struct ifaddr *
|
||||
ifa_alloc(size_t size, int flags)
|
||||
{
|
||||
struct ifaddr *ifa;
|
||||
|
||||
KASSERT(size >= sizeof(struct ifaddr),
|
||||
("%s: invalid size %zu", __func__, size));
|
||||
|
||||
ifa = malloc(size, M_IFADDR, M_ZERO | flags);
|
||||
if (ifa == NULL)
|
||||
return (NULL);
|
||||
|
||||
mtx_init(&ifa->ifa_mtx, "ifaddr", NULL, MTX_DEF);
|
||||
refcount_init(&ifa->ifa_refcnt, 1);
|
||||
ifa->if_data.ifi_datalen = sizeof(ifa->if_data);
|
||||
|
||||
return (ifa);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -819,8 +819,8 @@ struct ifaddr {
|
||||
#define IFA_LOCK(ifa) mtx_lock(&(ifa)->ifa_mtx)
|
||||
#define IFA_UNLOCK(ifa) mtx_unlock(&(ifa)->ifa_mtx)
|
||||
|
||||
struct ifaddr * ifa_alloc(size_t size, int flags);
|
||||
void ifa_free(struct ifaddr *ifa);
|
||||
void ifa_init(struct ifaddr *ifa);
|
||||
void ifa_ref(struct ifaddr *ifa);
|
||||
#endif
|
||||
|
||||
|
@ -199,16 +199,10 @@ at_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
|
||||
* allocate a fresh one.
|
||||
*/
|
||||
if (aa == NULL) {
|
||||
aa = malloc(sizeof(struct at_ifaddr), M_IFADDR,
|
||||
M_NOWAIT | M_ZERO);
|
||||
if (aa == NULL) {
|
||||
error = ENOBUFS;
|
||||
goto out;
|
||||
}
|
||||
callout_init(&aa->aa_callout, CALLOUT_MPSAFE);
|
||||
ifa = ifa_alloc(sizeof(struct at_ifaddr), M_WAITOK);
|
||||
aa = (struct at_ifaddr *)ifa;
|
||||
|
||||
ifa = (struct ifaddr *)aa;
|
||||
ifa_init(ifa);
|
||||
callout_init(&aa->aa_callout, CALLOUT_MPSAFE);
|
||||
|
||||
/*
|
||||
* As the at_ifaddr contains the actual sockaddrs,
|
||||
|
@ -404,16 +404,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
|
||||
goto out;
|
||||
}
|
||||
if (ia == NULL) {
|
||||
ia = (struct in_ifaddr *)
|
||||
malloc(sizeof *ia, M_IFADDR, M_NOWAIT |
|
||||
M_ZERO);
|
||||
if (ia == NULL) {
|
||||
error = ENOBUFS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ifa = &ia->ia_ifa;
|
||||
ifa_init(ifa);
|
||||
ifa = ifa_alloc(sizeof(struct in_ifaddr), M_WAITOK);
|
||||
ia = (struct in_ifaddr *)ifa;
|
||||
ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
|
||||
ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
|
||||
ifa->ifa_netmask = (struct sockaddr *)&ia->ia_sockmask;
|
||||
|
@ -1141,12 +1141,9 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra,
|
||||
* RA, it is called under an interrupt context. So, we should
|
||||
* call malloc with M_NOWAIT.
|
||||
*/
|
||||
ia = (struct in6_ifaddr *) malloc(sizeof(*ia), M_IFADDR,
|
||||
M_NOWAIT);
|
||||
ia = (struct in6_ifaddr *)ifa_alloc(sizeof(*ia), M_NOWAIT);
|
||||
if (ia == NULL)
|
||||
return (ENOBUFS);
|
||||
bzero((caddr_t)ia, sizeof(*ia));
|
||||
ifa_init(&ia->ia_ifa);
|
||||
LIST_INIT(&ia->ia6_memberships);
|
||||
/* Initialize the address and masks, and put time stamp */
|
||||
ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
|
||||
|
@ -190,13 +190,8 @@ ipx_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
|
||||
if (td && (error = priv_check(td, PRIV_NET_SETLLADDR)) != 0)
|
||||
goto out;
|
||||
if (ia == NULL) {
|
||||
ia = malloc(sizeof(*ia), M_IFADDR, M_NOWAIT | M_ZERO);
|
||||
if (ia == NULL) {
|
||||
error = ENOBUFS;
|
||||
goto out;
|
||||
}
|
||||
ifa = (struct ifaddr *)ia;
|
||||
ifa_init(ifa);
|
||||
ifa = ifa_alloc(sizeof(struct ipx_ifaddr), M_WAITOK);
|
||||
ia = (struct ipx_ifaddr *)ifa;
|
||||
ia->ia_ifp = ifp;
|
||||
ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
|
||||
ifa->ifa_netmask = (struct sockaddr *)&ipx_netmask;
|
||||
|
Loading…
Reference in New Issue
Block a user