diff options
author | rrs <rrs@FreeBSD.org> | 2009-04-06 10:09:20 +0000 |
---|---|---|
committer | rrs <rrs@FreeBSD.org> | 2009-04-06 10:09:20 +0000 |
commit | 75afcd06774489bf41511a140c131797f60eef87 (patch) | |
tree | 303d220f6f167872ccaa266f398aaf5b320c2f3b /sbin/route | |
parent | d5854485ac15ebf50516e5e04f54c0fa6c9cd281 (diff) | |
download | FreeBSD-src-75afcd06774489bf41511a140c131797f60eef87.zip FreeBSD-src-75afcd06774489bf41511a140c131797f60eef87.tar.gz |
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.
PR: 131365
MFC after: 1 week
Diffstat (limited to 'sbin/route')
-rw-r--r-- | sbin/route/route.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/sbin/route/route.c b/sbin/route/route.c index 90ea509..f06e205 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -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; |