Bug #803 » sbin.route.patch
| sbin/route/route.c | ||
|---|---|---|
|
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)
|
||
|
mask = IN_CLASSA_NET;
|
||
|
else if ((addr & IN_CLASSB_HOST) == 0)
|
||
|
mask = IN_CLASSB_NET;
|
||
|
else if ((addr & IN_CLASSC_HOST) == 0)
|
||
|
mask = IN_CLASSC_NET;
|
||
|
else {
|
||
|
if (net <= 0xff)
|
||
|
addr = net << 24;
|
||
|
else if (net <= 0xffff)
|
||
|
addr = net << 16;
|
||
|
else if (net <= 0xffffff)
|
||
|
addr = net << 8;
|
||
|
else
|
||
|
mask = -1;
|
||
|
addr = net;
|
||
|
if (bits)
|
||
|
mask = 0xffffffff << (32 - bits);
|
||
|
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
|
||
|
mask = 0xffffffff;
|
||
|
}
|
||
|
addr &= mask;
|
||
|
}
|
||
|
if (bits != 0)
|
||
|
mask = 0xffffffff << (32 - bits);
|
||
|
in->sin_addr.s_addr = htonl(addr);
|
||
|
in = &so_mask.sin;
|
||
|
in->sin_addr.s_addr = htonl(mask);
|
||