Date: Mon, 6 Apr 2009 11:39:47 +0100 (BST) From: Robert Watson <rwatson@FreeBSD.org> To: Randall Stewart <rrs@FreeBSD.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r190758 - head/sbin/route Message-ID: <alpine.BSF.2.00.0904061139110.34905@fledge.watson.org> In-Reply-To: <200904061009.n36A9K6l063517@svn.freebsd.org> References: <200904061009.n36A9K6l063517@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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; >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.0904061139110.34905>