From owner-svn-src-head@FreeBSD.ORG Tue Dec 6 20:55:20 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 813C8106564A; Tue, 6 Dec 2011 20:55:20 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 579158FC13; Tue, 6 Dec 2011 20:55:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pB6KtKiK007949; Tue, 6 Dec 2011 20:55:20 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pB6KtKlX007947; Tue, 6 Dec 2011 20:55:20 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201112062055.pB6KtKlX007947@svn.freebsd.org> From: Gleb Smirnoff Date: Tue, 6 Dec 2011 20:55:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228313 - 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: Tue, 06 Dec 2011 20:55:20 -0000 Author: glebius Date: Tue Dec 6 20:55:20 2011 New Revision: 228313 URL: http://svn.freebsd.org/changeset/base/228313 Log: Fix a very special case when SIOCAIFADDR supplies mask of 0.0.0.0, don't overwrite the mask with autoguessing based on classes. Modified: head/sys/netinet/in.c Modified: head/sys/netinet/in.c ============================================================================== --- head/sys/netinet/in.c Tue Dec 6 19:04:45 2011 (r228312) +++ head/sys/netinet/in.c Tue Dec 6 20:55:20 2011 (r228313) @@ -73,7 +73,7 @@ static int in_addprefix(struct in_ifaddr static int in_scrubprefix(struct in_ifaddr *, u_int); static void in_socktrim(struct sockaddr_in *); static int in_ifinit(struct ifnet *, - struct in_ifaddr *, struct sockaddr_in *, int); + struct in_ifaddr *, struct sockaddr_in *, int, int); static void in_purgemaddrs(struct ifnet *); static VNET_DEFINE(int, sameprefixcarponly); @@ -517,7 +517,7 @@ in_control(struct socket *so, u_long cmd case SIOCSIFADDR: error = in_ifinit(ifp, ia, - (struct sockaddr_in *) &ifr->ifr_addr, 1); + (struct sockaddr_in *) &ifr->ifr_addr, 1, 0); if (error != 0 && iaIsNew) break; if (error == 0) { @@ -569,7 +569,8 @@ in_control(struct socket *so, u_long cmd maskIsNew = 1; /* We lie; but the effect's the same */ } if (hostIsNew || maskIsNew) - error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0); + error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0, + maskIsNew); if (error != 0 && iaIsNew) break; @@ -842,7 +843,7 @@ in_ifscrub(struct ifnet *ifp, struct in_ */ static int in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin, - int scrub) + int scrub, int masksupplied) { register u_long i = ntohl(sin->sin_addr.s_addr); int flags = RTF_UP, error = 0; @@ -872,7 +873,7 @@ in_ifinit(struct ifnet *ifp, struct in_i * Be compatible with network classes, if netmask isn't supplied, * guess it based on classes. */ - if (ia->ia_subnetmask == 0) { + if (!masksupplied) { if (IN_CLASSA(i)) ia->ia_subnetmask = IN_CLASSA_NET; else if (IN_CLASSB(i))