diff --git a/sbin/route/route.c b/sbin/route/route.c index ce2d347..508e301 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -851,28 +851,30 @@ inet_makenetandmask(u_long net, struct sockaddr_in *in, u_long 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) - 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);