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);
