Skip site navigation (1)Skip section navigation (2)
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>