summaryrefslogtreecommitdiffstats
path: root/sys/net/if.c
diff options
context:
space:
mode:
authorhsu <hsu@FreeBSD.org>2002-12-18 11:46:59 +0000
committerhsu <hsu@FreeBSD.org>2002-12-18 11:46:59 +0000
commitc3153934cb24d911042c92eedf9e5dd6d7be07e1 (patch)
tree079e82ffd683b796c6432b8bcf3ff23f996d4e04 /sys/net/if.c
parent2d0e93bb2eab2533104a92a432361a0d75aae7da (diff)
downloadFreeBSD-src-c3153934cb24d911042c92eedf9e5dd6d7be07e1.zip
FreeBSD-src-c3153934cb24d911042c92eedf9e5dd6d7be07e1.tar.gz
Lock up ifaddr reference counts.
Diffstat (limited to 'sys/net/if.c')
-rw-r--r--sys/net/if.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 699278b..10c6c10 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -425,6 +425,7 @@ if_attach(ifp)
ifasize = sizeof(*ifa) + 2 * socksize;
ifa = (struct ifaddr *)malloc(ifasize, M_IFADDR, M_WAITOK | M_ZERO);
if (ifa) {
+ IFA_LOCK_INIT(ifa);
sdl = (struct sockaddr_dl *)(ifa + 1);
sdl->sdl_len = socksize;
sdl->sdl_family = AF_LINK;
@@ -441,6 +442,7 @@ if_attach(ifp)
sdl->sdl_len = masklen;
while (namelen != 0)
sdl->sdl_data[--namelen] = 0xff;
+ ifa->ifa_refcnt = 1;
TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
}
ifp->if_broadcastaddr = 0; /* reliably crash if used uninitialized */
@@ -830,6 +832,9 @@ if_clone_list(ifcr)
return (error);
}
+#define equal(a1, a2) \
+ (bcmp((caddr_t)(a1), (caddr_t)(a2), ((struct sockaddr *)(a1))->sa_len) == 0)
+
/*
* Locate an interface based on a complete address.
*/
@@ -841,8 +846,6 @@ ifa_ifwithaddr(addr)
struct ifnet *ifp;
struct ifaddr *ifa;
-#define equal(a1, a2) \
- (bcmp((caddr_t)(a1), (caddr_t)(a2), ((struct sockaddr *)(a1))->sa_len) == 0)
TAILQ_FOREACH(ifp, &ifnet, if_link)
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
if (ifa->ifa_addr->sa_family != addr->sa_family)
@@ -1051,8 +1054,8 @@ link_rtrequest(cmd, rt, info)
ifa = ifaof_ifpforaddr(dst, ifp);
if (ifa) {
IFAFREE(rt->rt_ifa);
+ IFAREF(ifa); /* XXX */
rt->rt_ifa = ifa;
- ifa->ifa_refcnt++;
if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
ifa->ifa_rtrequest(cmd, rt, info);
}
OpenPOWER on IntegriCloud