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
This commit is contained in:
parent
d5854485ac
commit
75afcd0677
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user