aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorSUZUKI Shinsuke <suz@FreeBSD.org>2002-10-22 22:50:38 +0000
committerSUZUKI Shinsuke <suz@FreeBSD.org>2002-10-22 22:50:38 +0000
commit2754d95d856c8f79fb97130dfe96ec8ba506ce2a (patch)
treece3ebd0496320d91c183f9adbf51b238ac94ecb8 /sys/netinet
parent3c2486a77c6c090584f77391159c98410ef89c84 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/in.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 5f4179ddb6a0..d66abc2ab64a 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -664,7 +664,12 @@ in_ifinit(ifp, ia, sin, scrub)
int s = splimp(), flags = RTF_UP, error = 0;
oldaddr = ia->ia_addr;
+ if (oldaddr.sin_family == AF_INET)
+ LIST_REMOVE(ia, ia_hash);
ia->ia_addr = *sin;
+ if (ia->ia_addr.sin_family == AF_INET)
+ LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
+ ia, ia_hash);
/*
* Give the interface a chance to initialize
* if this is its first address,
@@ -673,14 +678,13 @@ in_ifinit(ifp, ia, sin, scrub)
if (ifp->if_ioctl &&
(error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia))) {
splx(s);
+ /* LIST_REMOVE(ia, ia_hash) is done in in_control */
ia->ia_addr = oldaddr;
+ if (ia->ia_addr.sin_family == AF_INET)
+ LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
+ ia, ia_hash);
return (error);
}
- if (oldaddr.sin_family == AF_INET)
- LIST_REMOVE(ia, ia_hash);
- if (ia->ia_addr.sin_family == AF_INET)
- LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
- ia, ia_hash);
splx(s);
if (scrub) {
ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;