efficiency, corresponds with kernel again
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Wed, 2 May 1984 04:30:59 +0000 (20:30 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Wed, 2 May 1984 04:30:59 +0000 (20:30 -0800)
SCCS-vsn: sbin/routed/inet.c 4.2

usr/src/sbin/routed/inet.c

index 8c4bbb4..211fde7 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid[] = "@(#)inet.c    4.1 (Berkeley) %G%";
+static char *sccsid[] = "@(#)inet.c    4.2 (Berkeley) %G%";
 #endif
 /*
  * Temporarily, copy these routines from the kernel,
 #endif
 /*
  * Temporarily, copy these routines from the kernel,
@@ -34,23 +34,41 @@ inet_netof(in)
        struct in_addr in;
 {
        register u_long i = ntohl(in.s_addr);
        struct in_addr in;
 {
        register u_long i = ntohl(in.s_addr);
-       register net;
+       register u_long net, subnet;
+       register struct interface *ifp;
+       extern struct interface *ifnet;
 
        if (IN_CLASSA(i)) {
 
        if (IN_CLASSA(i)) {
-               net = ((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
-               if (IN_SUBNETA(i) && inet_localnet(net))
-                       return (((i)&IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT);
-               else
+               net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+               if (IN_SUBNETA(i)) {
+                       subnet = (i & IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT;
+                       /* Fall through and check whether a subnet */
+               } else
                        return (net);
        } else if (IN_CLASSB(i)) {
                        return (net);
        } else if (IN_CLASSB(i)) {
-               net = ((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
-               if (IN_SUBNETB(i) && inet_localnet(net))
-                       return (((i)&IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT);
-               else
+               net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+               if (IN_SUBNETB(i)) {
+                       subnet = (i & IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT;
+                       /* Fall through and check whether a subnet */
+               } else
                        return (net);
        } else {
                        return (net);
        } else {
-               return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+               return ((i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+       }
+
+       /*
+        * Check whether network is a subnet of a `local' network;
+        * if so, return subnet number.
+        */
+       for (ifp = ifnet; ifp; ifp = ifp->int_next) {
+               if (ifp->int_flags & IFF_LOCAL) {
+                       if (ifp->int_net == net)
+                               return (subnet);
+                       if ((ifp->int_net >> SUBNETSHIFT) == net)
+                               return (subnet);
+               }
        }
        }
+       return (net);
 }
 
 /*
 }
 
 /*
@@ -60,41 +78,40 @@ inet_lnaof(in)
        struct in_addr in;
 {
        register u_long i = ntohl(in.s_addr);
        struct in_addr in;
 {
        register u_long i = ntohl(in.s_addr);
+       register u_long net, host, subhost;
+       register struct interface *ifp;
 
        if (IN_CLASSA(i)) {
 
        if (IN_CLASSA(i)) {
-               if (IN_SUBNETA(i) &&
-                   inet_localnet(((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT))
-                       return ((i)&IN_CLASSA_SUBHOST);
-               else
-                       return ((i)&IN_CLASSA_HOST);
+               if (IN_SUBNETA(i)) {
+                       net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+                       host = i & IN_CLASSA_HOST;
+                       subhost = i & IN_CLASSA_SUBHOST;
+                       /* Fall through and check whether a subnet */
+               } else
+                       return (i & IN_CLASSA_HOST);
        } else if (IN_CLASSB(i)) {
        } else if (IN_CLASSB(i)) {
-               if (IN_SUBNETB(i) &&
-                   inet_localnet(((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT))
-                       return ((i)&IN_CLASSB_SUBHOST);
-               else
-                       return ((i)&IN_CLASSB_HOST);
+               if (IN_SUBNETB(i)) {
+                       net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+                       host = i & IN_CLASSB_HOST;
+                       subhost = i & IN_CLASSB_SUBHOST;
+                       /* Fall through and check whether a subnet */
+               } else
+                       return (i & IN_CLASSB_HOST);
        } else {
        } else {
-               return ((i)&IN_CLASSC_HOST);
+               return (i & IN_CLASSC_HOST);
        }
        }
-}
-
-/*
- * Return true if the network is a ``local'' net
- * (one for which we can interpret the host part).
- */
-inet_localnet(net)
-       register int net;
-{
-       register struct interface *ifp;
-       extern struct interface *ifnet;
 
 
+       /*
+        * Check whether network is a subnet of a `local' network;
+        * if so, use the modified interpretation of `host'.
+        */
        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                if (ifp->int_flags & IFF_LOCAL) {
                        if (ifp->int_net == net)
        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                if (ifp->int_flags & IFF_LOCAL) {
                        if (ifp->int_net == net)
-                               return (1);
+                               return (subhost);
                        if ((ifp->int_net >> SUBNETSHIFT) == net)
                        if ((ifp->int_net >> SUBNETSHIFT) == net)
-                               return (1);
+                               return (subhost);
                }
        }
                }
        }
-       return (0);
+       return (host);
 }
 }