From owner-svn-src-head@FreeBSD.ORG Mon Nov 21 16:48:33 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7303B1065672; Mon, 21 Nov 2011 16:48:33 +0000 (UTC) (envelope-from tomelite82@gmail.com) Received: from mail-dy0-f54.google.com (mail-dy0-f54.google.com [209.85.220.54]) by mx1.freebsd.org (Postfix) with ESMTP id A148E8FC0C; Mon, 21 Nov 2011 16:48:32 +0000 (UTC) Received: by dyk29 with SMTP id 29so474082dyk.13 for ; Mon, 21 Nov 2011 08:48:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=ijDg6CLYNRq5SkNk7g9nn+t1LirMKepLl7AmeJnZpk4=; b=NRAUcki5h55LFl/JYfX/41zgiC4fbwSKBoLnoS5h4K72wSjsgNYXqC4iui3KxrcLpW H6kWpSvmxfHxp3k2xjIpzH4jz55L4kGOJ9Q+PgUREwpkA5QuRSk++VkQBpDp2OTaJnr3 sQQHQ7oef29Ic6ua5/VM7XFVwAZRI/QDAVM4o= MIME-Version: 1.0 Received: by 10.204.155.141 with SMTP id s13mr15338832bkw.40.1321892611898; Mon, 21 Nov 2011 08:23:31 -0800 (PST) Sender: tomelite82@gmail.com Received: by 10.223.93.132 with HTTP; Mon, 21 Nov 2011 08:23:31 -0800 (PST) In-Reply-To: <201111211410.pALEAD9B046139@svn.freebsd.org> References: <201111211410.pALEAD9B046139@svn.freebsd.org> Date: Mon, 21 Nov 2011 08:23:31 -0800 X-Google-Sender-Auth: TPSLmk_kyHypOWHVPZX4bHFqS2A Message-ID: From: Qing Li To: Gleb Smirnoff Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r227791 - head/sys/netinet X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Nov 2011 16:48:33 -0000 Logically speaking the prefix route should not be removed until all of the address related housing keeping tasks have been completed successfully. Putting "in_scrubprefix()" at the top does not gain you anything at all, but can potentially be problematic if additional tasks are in fact performed in "if_ioctl()" that may in fact affect the logic in "in_ifinit()". Case in point, I had to perform additional routing related tasks so I re-introduced "nd6_rtrequest()" in r227460. You are not simplifying much logic by removing the error recovery code from the return of "if_ioctl()". So why removing the flexibility of what "if_ioctl()" is intended for as part of the address configuration logic ? --Qing On Mon, Nov 21, 2011 at 6:10 AM, Gleb Smirnoff wrote: > Author: glebius > Date: Mon Nov 21 14:10:13 2011 > New Revision: 227791 > URL: http://svn.freebsd.org/changeset/base/227791 > > Log: > =A0Historically in_control() did not check sockaddrs supplied with > =A0structs ifreq/in_aliasreq and there've been several panics due > =A0to that problem. All these panics were fixed just a couple of > =A0lines above the panicing code. > > =A0Take a more general approach: sanity check sockaddrs supplied > =A0with SIOCAIFADDR and SIOCSIF*ADDR at the beggining of the > =A0function and drop all checks below. > > =A0One check is now disabled due to strange code in ifconfig(8) > =A0that I've removed recently. I'm going to enable it with next > =A0__FreeBSD_version bump. > > =A0Historically in_ifinit() was able to recover from an error > =A0and restore old address. Nowadays this feature isn't working > =A0for all error cases, but for some of them. I suppose no software > =A0relies on this behavior, so I'd like to remove it, since this > =A0simplifies code a lot. > > =A0Also, move if_scrub() earlier in the in_ifinit(). It is more > =A0correct to wipe routes before removing address from local > =A0address list, and interface address list. > > =A0Silence from: bz, brooks, andre, rwatson, 3 weeks > > Modified: > =A0head/sys/netinet/in.c > > Modified: head/sys/netinet/in.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/sys/netinet/in.c =A0 =A0 =A0 Mon Nov 21 13:40:35 2011 =A0 =A0 = =A0 =A0(r227790) > +++ head/sys/netinet/in.c =A0 =A0 =A0 Mon Nov 21 14:10:13 2011 =A0 =A0 = =A0 =A0(r227791) > @@ -234,16 +234,42 @@ in_control(struct socket *so, u_long cmd > =A0 =A0 =A0 =A0 * in_lifaddr_ioctl() and ifp->if_ioctl(). > =A0 =A0 =A0 =A0 */ > =A0 =A0 =A0 =A0switch (cmd) { > - =A0 =A0 =A0 case SIOCAIFADDR: > - =A0 =A0 =A0 case SIOCDIFADDR: > =A0 =A0 =A0 =A0case SIOCGIFADDR: > =A0 =A0 =A0 =A0case SIOCGIFBRDADDR: > =A0 =A0 =A0 =A0case SIOCGIFDSTADDR: > =A0 =A0 =A0 =A0case SIOCGIFNETMASK: > + =A0 =A0 =A0 case SIOCDIFADDR: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > + =A0 =A0 =A0 case SIOCAIFADDR: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* ifra_addr must be present and be of IN= ET family. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* ifra_broadaddr and ifra_mask are optio= nal. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_addr.sin_len !=3D sizeof(str= uct sockaddr_in) || > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_addr.sin_family !=3D AF_= INET) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_broadaddr.sin_len !=3D 0 && > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (ifra->ifra_broadaddr.sin_len !=3D = sizeof(struct sockaddr_in) || > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_broadaddr.sin_family != =3D AF_INET)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL); > +#if 0 > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* ifconfig(8) historically doesn't set a= f_family for mask > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* for unknown reason. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_mask.sin_len !=3D 0 && > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (ifra->ifra_mask.sin_len !=3D sizeo= f(struct sockaddr_in) || > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_mask.sin_family !=3D AF_= INET)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL); > +#endif > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0case SIOCSIFADDR: > =A0 =A0 =A0 =A0case SIOCSIFBRDADDR: > =A0 =A0 =A0 =A0case SIOCSIFDSTADDR: > =A0 =A0 =A0 =A0case SIOCSIFNETMASK: > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifr->ifr_addr.sa_family !=3D AF_INET || > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifr->ifr_addr.sa_len !=3D sizeof(st= ruct sockaddr_in)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (EINVAL); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; > > =A0 =A0 =A0 =A0case SIOCALIFADDR: > @@ -349,7 +375,7 @@ in_control(struct socket *so, u_long cmd > =A0 =A0 =A0 =A0switch (cmd) { > =A0 =A0 =A0 =A0case SIOCAIFADDR: > =A0 =A0 =A0 =A0case SIOCDIFADDR: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_addr.sin_family =3D=3D AF_IN= ET) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct in_ifaddr *oia; > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0IN_IFADDR_RLOCK(); > @@ -506,7 +532,7 @@ in_control(struct socket *so, u_long cmd > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > > =A0 =A0 =A0 =A0case SIOCSIFNETMASK: > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_sockmask.sin_addr =3D ifra->ifra_add= r.sin_addr; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_sockmask =3D *(struct sockaddr_in *)= &ifr->ifr_addr; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ia->ia_subnetmask =3D ntohl(ia->ia_sockmas= k.sin_addr.s_addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > > @@ -514,14 +540,12 @@ in_control(struct socket *so, u_long cmd > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0maskIsNew =3D 0; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0hostIsNew =3D 1; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0error =3D 0; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ia->ia_addr.sin_family =3D=3D AF_INET) = { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_addr.sin_len= =3D=3D 0) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_= addr =3D ia->ia_addr; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hostIsNew = =3D 0; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (ifra->ifra_addr.= sin_addr.s_addr =3D=3D > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0ia->ia_addr.sin_addr.s_addr) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hostIsNew = =3D 0; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ifra->ifra_addr.sin_len =3D=3D 0) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_addr =3D ia->ia_= addr; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hostIsNew =3D 0; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (ifra->ifra_addr.sin_addr.s_addr = =3D=3D > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_addr.sin_add= r.s_addr) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 hostIsNew =3D 0; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (ifra->ifra_mask.sin_len) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * QL: XXX > @@ -552,7 +576,7 @@ in_control(struct socket *so, u_long cmd > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break; > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ((ifp->if_flags & IFF_BROADCAST) && > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (ifra->ifra_broadaddr.sin_family = =3D=3D AF_INET)) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifra->ifra_broadaddr.sin_len) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ia->ia_broadaddr =3D ifra-= >ifra_broadaddr; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (error =3D=3D 0) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ii =3D ((struct in_ifinfo = *)ifp->if_afdata[AF_INET]); > @@ -608,31 +632,26 @@ in_control(struct socket *so, u_long cmd > > =A0 =A0 =A0 =A0IN_IFADDR_WLOCK(); > =A0 =A0 =A0 =A0TAILQ_REMOVE(&V_in_ifaddrhead, ia, ia_link); > - =A0 =A0 =A0 if (ia->ia_addr.sin_family =3D=3D AF_INET) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct in_ifaddr *if_ia; > > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_REMOVE(ia, ia_hash); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* If this is the last IPv4 address confi= gured on this > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* interface, leave the all-hosts group. > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* No state-change report need be transmi= tted. > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if_ia =3D NULL; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 IFP_TO_IA(ifp, if_ia); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (if_ia =3D=3D NULL) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ii =3D ((struct in_ifinfo *= )ifp->if_afdata[AF_INET]); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_MULTI_LOCK(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ii->ii_allhosts) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (void)in_le= avegroup_locked(ii->ii_allhosts, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 NUL= L); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ii->ii_allh= osts =3D NULL; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_MULTI_UNLOCK(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifa_free(&if_ia->ia_ifa); > + =A0 =A0 =A0 LIST_REMOVE(ia, ia_hash); > + =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > + =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0* If this is the last IPv4 address configured on this > + =A0 =A0 =A0 =A0* interface, leave the all-hosts group. > + =A0 =A0 =A0 =A0* No state-change report need be transmitted. > + =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 IFP_TO_IA(ifp, iap); > + =A0 =A0 =A0 if (iap =3D=3D NULL) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ii =3D ((struct in_ifinfo *)ifp->if_afdata[= AF_INET]); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_MULTI_LOCK(); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ii->ii_allhosts) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (void)in_leavegroup_locked(= ii->ii_allhosts, NULL); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ii->ii_allhosts =3D NULL; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_MULTI_UNLOCK(); > =A0 =A0 =A0 =A0} else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ifa_free(&iap->ia_ifa); > + > =A0 =A0 =A0 =A0ifa_free(&ia->ia_ifa); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0/* in_ifaddrhead */ > =A0out: > =A0 =A0 =A0 =A0if (ia !=3D NULL) > @@ -828,50 +847,29 @@ in_ifinit(struct ifnet *ifp, struct in_i > =A0 =A0 int scrub) > =A0{ > =A0 =A0 =A0 =A0register u_long i =3D ntohl(sin->sin_addr.s_addr); > - =A0 =A0 =A0 struct sockaddr_in oldaddr; > =A0 =A0 =A0 =A0int flags =3D RTF_UP, error =3D 0; > > - =A0 =A0 =A0 oldaddr =3D ia->ia_addr; > - =A0 =A0 =A0 if (oldaddr.sin_family =3D=3D AF_INET) > + =A0 =A0 =A0 if (scrub) > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_scrubprefix(ia, LLE_STATIC); > + > + =A0 =A0 =A0 IN_IFADDR_WLOCK(); > + =A0 =A0 =A0 if (ia->ia_addr.sin_family =3D=3D AF_INET) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0LIST_REMOVE(ia, ia_hash); > =A0 =A0 =A0 =A0ia->ia_addr =3D *sin; > - =A0 =A0 =A0 if (ia->ia_addr.sin_family =3D=3D AF_INET) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WLOCK(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.si= n_addr.s_addr), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia, ia_hash); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > - =A0 =A0 =A0 } > + =A0 =A0 =A0 LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), > + =A0 =A0 =A0 =A0 =A0 ia, ia_hash); > + =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > + > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * Give the interface a chance to initialize > =A0 =A0 =A0 =A0 * if this is its first address, > =A0 =A0 =A0 =A0 * and to validate the address if necessary. > =A0 =A0 =A0 =A0 */ > - =A0 =A0 =A0 if (ifp->if_ioctl !=3D NULL) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D (*ifp->if_ioctl)(ifp, SIOCSIFADDR= , (caddr_t)ia); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (error) { > + =A0 =A0 =A0 if (ifp->if_ioctl !=3D NULL && > + =A0 =A0 =A0 =A0 =A0 (error =3D (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (cadd= r_t)ia)) !=3D 0) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* LIST_REMOVE(ia, ia_hash= ) is done in in_control */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_addr =3D oldaddr; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WLOCK(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ia->ia_addr.sin_family = =3D=3D AF_INET) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_INSERT= _HEAD(INADDR_HASH( > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia-= >ia_addr.sin_addr.s_addr), ia, ia_hash); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* If old= addr family is not AF_INET (e.g. > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* interf= ace has been just created) in_control > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* does n= ot call LIST_REMOVE, and we end up > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* with b= ogus ia entries in hash > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 LIST_REMOVE= (ia, ia_hash); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IN_IFADDR_WUNLOCK(); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (error); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > - =A0 =A0 =A0 } > - =A0 =A0 =A0 if (scrub) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_ifa.ifa_addr =3D (struct sockaddr *)= &oldaddr; > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 in_ifscrub(ifp, ia, LLE_STATIC); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 ia->ia_ifa.ifa_addr =3D (struct sockaddr *)= &ia->ia_addr; > - =A0 =A0 =A0 } > + > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * Be compatible with network classes, if netmask isn't su= pplied, > =A0 =A0 =A0 =A0 * guess it based on classes. > @@ -916,11 +914,9 @@ in_ifinit(struct ifnet *ifp, struct in_i > =A0 =A0 =A0 =A0if (ia->ia_addr.sin_addr.s_addr =3D=3D INADDR_ANY) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0); > > - =A0 =A0 =A0 if (ifp->if_flags & IFF_POINTOPOINT) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ia->ia_dstaddr.sin_addr.s_addr =3D=3D i= a->ia_addr.sin_addr.s_addr) > + =A0 =A0 =A0 if (ifp->if_flags & IFF_POINTOPOINT && > + =A0 =A0 =A0 =A0 =A0 ia->ia_dstaddr.sin_addr.s_addr =3D=3D ia->ia_addr.s= in_addr.s_addr) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0); > - =A0 =A0 =A0 } > - > > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * add a loopback route to self >