Date: Mon, 21 Nov 2011 08:23:31 -0800 From: Qing Li <qingli@freebsd.org> To: Gleb Smirnoff <glebius@freebsd.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r227791 - head/sys/netinet Message-ID: <CAGnGRdLpWwTkfjirBYe7x-1TVOMtHiRJNX4dM-iQXwQgP3mCVQ@mail.gmail.com> In-Reply-To: <201111211410.pALEAD9B046139@svn.freebsd.org> References: <201111211410.pALEAD9B046139@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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 <glebius@freebsd.org> 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 >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGnGRdLpWwTkfjirBYe7x-1TVOMtHiRJNX4dM-iQXwQgP3mCVQ>