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