Strange behaviour of route command

Tom Judge tom at tomjudge.com
Mon Sep 17 02:45:48 PDT 2007


Giorgos Keramidas wrote:
> On 2007-09-10 14:05, Giorgos Keramidas <keramida at freebsd.org> wrote:
>> On 2007-09-10 02:03, Nuno Antunes <nuno.antunes at gmail.com> wrote:
>>>>> Tom Judge wrote:
>>>>>> Hi,
>>>>>> While making some changes to the routing table on one of our routers
>>>>>> today I noticed that "route add" was showing some strange
>>>>>> behaviour. When adding a route for 128/8 to the table rather than
>>>>>> adding 128.0.0.0/8 it would add 0.0.0.0/8, however adding 10/9 works
>>>>>> correctly.
>>>>>>
>>>>>> Is this a bug in route or the routing table?
>>> Hi,
>>> Can you take a look at this patch, please?
>>>
>>> http://leaf.dragonflybsd.org/mailarchive/submit/2007-09/msg00000.html
>> Fantastic, thanks for the pointer! :-)
>>
>> Skimming fast through the diff it seems to be ok.  It doesn't apply
>> cleanly over HEAD so some merging was required to get this version
>> instead:
>>
>> %%%
>> diff -r 3624c4072e63 sbin/route/route.c
>> --- a/sbin/route/route.c	Fri Sep 07 09:19:22 2007 +0000
>> +++ b/sbin/route/route.c	Mon Sep 10 14:02:01 2007 +0300
>> @@ -799,18 +799,19 @@ inet_makenetandmask(net, sin, bits)
>>  	rtm_addrs |= RTA_NETMASK;
>>  	if (net == 0)
>>  		mask = addr = 0;
>> [snip]
>> +	else {
>> +		if (net <= 0xff)
>> +			addr = net << IN_CLASSA_NSHIFT;
>> +		else if (net < 0xffff)
>> +			addr = net << IN_CLASSB_NSHIFT;
>> +		else if (net < 0xffffff)
>> +			addr = net << IN_CLASSC_NSHIFT;
> 
> ... which will fail for 0xffff and 0xffffff comparisons.  I apologize
> for not testing all the possible address lengths before emailing the
> first patch.
> 
> I should have used <= here, so an updated patch is:


Is there any chance of getting this commited, or should I raise a PR 
about this?

Tom
> 
> %%%
> diff -r 3624c4072e63 sbin/route/route.c
> --- a/sbin/route/route.c	Fri Sep 07 09:19:22 2007 +0000
> +++ b/sbin/route/route.c	Mon Sep 10 14:55:16 2007 +0300
> @@ -799,18 +799,19 @@ inet_makenetandmask(net, sin, bits)
>  	rtm_addrs |= RTA_NETMASK;
>  	if (net == 0)
>  		mask = addr = 0;
> -	else if (net < 128) {
> -		addr = net << IN_CLASSA_NSHIFT;
> -		mask = IN_CLASSA_NET;
> -	} else if (net < 65536) {
> -		addr = net << IN_CLASSB_NSHIFT;
> -		mask = IN_CLASSB_NET;
> -	} else if (net < 16777216L) {
> -		addr = net << IN_CLASSC_NSHIFT;
> -		mask = IN_CLASSC_NET;
> -	} else {
> -		addr = net;
> -		if ((addr & IN_CLASSA_HOST) == 0)
> +	else {
> +		if (net <= 0xff)
> +			addr = net << IN_CLASSA_NSHIFT;
> +		else if (net <= 0xffff)
> +			addr = net << IN_CLASSB_NSHIFT;
> +		else if (net <= 0xffffff)
> +			addr = net << IN_CLASSC_NSHIFT;
> +		else
> +			addr = net;
> +
> +		if (bits)
> +			mask = 0xffffffff << (32 - bits);
> +		else if ((addr & IN_CLASSA_HOST) == 0)
>  			mask =  IN_CLASSA_NET;
>  		else if ((addr & IN_CLASSB_HOST) == 0)
>  			mask =  IN_CLASSB_NET;
> @@ -819,8 +820,6 @@ inet_makenetandmask(net, sin, bits)
>  		else
>  			mask = -1;
>  	}
> -	if (bits)
> -		mask = 0xffffffff << (32 - bits);
>  	sin->sin_addr.s_addr = htonl(addr);
>  	sin = &so_mask.sin;
>  	sin->sin_addr.s_addr = htonl(mask);
> %%%
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"



More information about the freebsd-net mailing list