From owner-svn-src-all@FreeBSD.ORG Mon Apr 6 10:39:47 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 88B261065674; Mon, 6 Apr 2009 10:39:47 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 641AF8FC21; Mon, 6 Apr 2009 10:39:47 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from fledge.watson.org (fledge.watson.org [65.122.17.41]) by cyrus.watson.org (Postfix) with ESMTPS id 2026646BA0; Mon, 6 Apr 2009 06:39:47 -0400 (EDT) Date: Mon, 6 Apr 2009 11:39:47 +0100 (BST) From: Robert Watson X-X-Sender: robert@fledge.watson.org To: Randall Stewart In-Reply-To: <200904061009.n36A9K6l063517@svn.freebsd.org> Message-ID: References: <200904061009.n36A9K6l063517@svn.freebsd.org> User-Agent: Alpine 2.00 (BSF 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r190758 - head/sbin/route X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Apr 2009 10:39:48 -0000 On Mon, 6 Apr 2009, Randall Stewart wrote: > Author: rrs > Date: Mon Apr 6 10:09:20 2009 > New Revision: 190758 > URL: http://svn.freebsd.org/changeset/base/190758 > > Log: > Class based addressing went out in the early 90's. Basically > if a entry is not route add -net xxx/bits then we should use > the addr (xxx) to establish the number of bits by looking at > the first non-zero bit. So if we enter > route add -net 10.1.1.0 10.1.3.5 > this is the same as doing > route add -net 10.1.1.0/24 > Since the 8th bit (zero counting) is set to 1 we set bits > to 32-8. > > Users can of course still use the /x to change this behavior > or in cases where the network is in the trailing part > of the address, a "netmask" argument can be supplied to > override what is established from the interpretation of the > address itself. e.g: > > route add -net 10.1.1.8 -netmask 0xff00ffff > > should overide and place the proper CIDR mask in place. Does this maintain compatibility for people who may still mysteriously be specifying class-based IPs and netmasks in configuration files? If not, this should not be MFC'd... Robert N M Watson Computer Laboratory University of Cambridge > > PR: 131365 > MFC after: 1 week > > Modified: > head/sbin/route/route.c > > Modified: head/sbin/route/route.c > ============================================================================== > --- head/sbin/route/route.c Mon Apr 6 07:13:26 2009 (r190757) > +++ head/sbin/route/route.c Mon Apr 6 10:09:20 2009 (r190758) > @@ -713,7 +713,7 @@ newroute(argc, argv) > #ifdef INET6 > if (af == AF_INET6) { > rtm_addrs &= ~RTA_NETMASK; > - memset((void *)&so_mask, 0, sizeof(so_mask)); > + memset((void *)&so_mask, 0, sizeof(so_mask)); > } > #endif > } > @@ -803,21 +803,22 @@ inet_makenetandmask(net, sin, bits) > addr = net << IN_CLASSC_NSHIFT; > else > addr = net; > - > - if (bits != 0) > - mask = 0xffffffff << (32 - bits); > - else if (net == 0) > - mask = 0; > - else if (IN_CLASSA(addr)) > - mask = IN_CLASSA_NET; > - else if (IN_CLASSB(addr)) > - mask = IN_CLASSB_NET; > - else if (IN_CLASSC(addr)) > - mask = IN_CLASSC_NET; > - else if (IN_MULTICAST(addr)) > - mask = IN_CLASSD_NET; > - else > - mask = 0xffffffff; > + /* > + * If no /xx was specified we must cacluate the > + * CIDR address. > + */ > + if ((bits == 0) && (addr != 0)) { > + int i, j; > + for(i=0,j=1; i<32; i++) { > + if (addr & j) { > + break; > + } > + j <<= 1; > + } > + /* i holds the first non zero bit */ > + bits = 32 - i; > + } > + mask = 0xffffffff << (32 - bits); > > sin->sin_addr.s_addr = htonl(addr); > sin = &so_mask.sin; >