Date: Mon, 10 Sep 2007 14:56:36 +0300 From: Giorgos Keramidas <keramida@freebsd.org> To: Nuno Antunes <nuno.antunes@gmail.com> Cc: Tom Judge <tom@tomjudge.com>, freebsd-net@freebsd.org, "Bruce M. Simpson" <bms@freebsd.org> Subject: Re: Strange behaviour of route command Message-ID: <20070910115636.GA8326@kobe.laptop> In-Reply-To: <20070910110528.GB2476@kobe.laptop> References: <46E11515.8090007@tomjudge.com> <46E174DB.8070004@FreeBSD.org> <20070907185757.GA25624@kobe.laptop> <262949390709091803s507265e6mf3929c4dd26ecc56@mail.gmail.com> <20070910110528.GB2476@kobe.laptop>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2007-09-10 14:05, Giorgos Keramidas <keramida@freebsd.org> wrote: > On 2007-09-10 02:03, Nuno Antunes <nuno.antunes@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: %%% 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); %%%
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070910115636.GA8326>