subnet routing
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 13 Apr 1984 02:32:07 +0000 (18:32 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 13 Apr 1984 02:32:07 +0000 (18:32 -0800)
SCCS-vsn: sys/netinet/in.c 6.2
SCCS-vsn: sys/netinet/in.h 6.2

usr/src/sys/netinet/in.c
usr/src/sys/netinet/in.h

index 3316cf8..837f551 100644 (file)
@@ -1,4 +1,4 @@
-/*     in.c    6.1     83/07/29        */
+/*     in.c    6.2     84/04/12        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
@@ -38,9 +38,9 @@ if_makeaddr(net, host)
 {
        u_long addr;
 
 {
        u_long addr;
 
-       if (net < 128)
+       if (net < IN_CLASSA_MAX)
                addr = (net << IN_CLASSA_NSHIFT) | host;
                addr = (net << IN_CLASSA_NSHIFT) | host;
-       else if (net < 65536)
+       else if (net < IN_CLASSB_MAX)
                addr = (net << IN_CLASSB_NSHIFT) | host;
        else
                addr = (net << IN_CLASSC_NSHIFT) | host;
                addr = (net << IN_CLASSB_NSHIFT) | host;
        else
                addr = (net << IN_CLASSC_NSHIFT) | host;
@@ -55,13 +55,23 @@ in_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;
 
 
-       if (IN_CLASSA(i))
-               return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
-       else if (IN_CLASSB(i))
-               return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
-       else
+       if (IN_CLASSA(i)) {
+               net = ((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
+               if (in_localnet(net) && IN_SUBNETA(i))
+                       return (((i)&IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT);
+               else
+                       return (net);
+       } else if (IN_CLASSB(i)) {
+               net = ((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
+               if (in_localnet(net) && IN_SUBNETB(i))
+                       return (((i)&IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT);
+               else
+                       return (net);
+       } else {
                return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
                return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+       }
 }
 
 /*
 }
 
 /*
@@ -72,12 +82,43 @@ in_lnaof(in)
 {
        register u_long i = ntohl(in.s_addr);
 
 {
        register u_long i = ntohl(in.s_addr);
 
-       if (IN_CLASSA(i))
-               return ((i)&IN_CLASSA_HOST);
-       else if (IN_CLASSB(i))
-               return ((i)&IN_CLASSB_HOST);
-       else
+       if (IN_CLASSA(i)) {
+               if (IN_SUBNETA(i) &&
+                   in_localnet(((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT))
+                       return ((i)&IN_CLASSA_SUBHOST);
+               else
+                       return ((i)&IN_CLASSA_HOST);
+       } else if (IN_CLASSB(i)) {
+               if (IN_SUBNETB(i) &&
+                   in_localnet(((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT) )
+                       return ((i)&IN_CLASSB_SUBHOST);
+               else
+                       return ((i)&IN_CLASSB_HOST);
+       } 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).
+ */
+in_localnet(net)
+       register int net;
+{
+       register struct ifnet *ifp;
+
+       for (ifp = ifnet; ifp; ifp = ifp->if_next) {
+               if (ifp->if_addr.sa_family != AF_INET)
+                       continue;
+               if (ifp->if_flags & IFF_LOCAL) {
+                       if (ifp->if_net == net)
+                               return (1);
+                       if ((ifp->if_net >> SUBNETSHIFT) == net)
+                               return (1);
+               }
+       }
+       return (0);
 }
 
 /*
 }
 
 /*
index 825a9d3..3e36206 100644 (file)
@@ -1,4 +1,4 @@
-/*     in.h    6.1     83/07/29        */
+/*     in.h    6.2     84/04/12        */
 
 /*
  * Constants and structures defined by the internet system,
 
 /*
  * Constants and structures defined by the internet system,
@@ -95,11 +95,13 @@ struct in_addr {
 #define        IN_CLASSA_NET           0xff000000
 #define        IN_CLASSA_NSHIFT        24
 #define        IN_CLASSA_HOST          0x00ffffff
 #define        IN_CLASSA_NET           0xff000000
 #define        IN_CLASSA_NSHIFT        24
 #define        IN_CLASSA_HOST          0x00ffffff
+#define        IN_CLASSA_MAX           128
 
 #define        IN_CLASSB(i)            ((((long)(i))&0xc0000000)==0x80000000)
 #define        IN_CLASSB_NET           0xffff0000
 #define        IN_CLASSB_NSHIFT        16
 #define        IN_CLASSB_HOST          0x0000ffff
 
 #define        IN_CLASSB(i)            ((((long)(i))&0xc0000000)==0x80000000)
 #define        IN_CLASSB_NET           0xffff0000
 #define        IN_CLASSB_NSHIFT        16
 #define        IN_CLASSB_HOST          0x0000ffff
+#define        IN_CLASSB_MAX           65536
 
 #define        IN_CLASSC(i)            ((((long)(i))&0xc0000000)==0xc0000000)
 #define        IN_CLASSC_NET           0xffffff00
 
 #define        IN_CLASSC(i)            ((((long)(i))&0xc0000000)==0xc0000000)
 #define        IN_CLASSC_NET           0xffffff00
@@ -108,6 +110,29 @@ struct in_addr {
 
 #define        INADDR_ANY      0x00000000
 
 
 #define        INADDR_ANY      0x00000000
 
+/*
+ * Macros for subnetworks.  A subnet is distinguished by
+ *     (1) the network number is a `local' network number, and
+ *     (2) the most significant bit of the host part is set.
+ * Such addresses include one additional byte in the network number,
+ * and use one less byte in the host part (i.e., a subnet of a Class A
+ * network uses the rules for Class B net/host number extraction,
+ * a Class B subnet is dealt with as if it were a Class C net).
+ * Subnets of Class C nets are not supported.
+ */
+#define        SUBNETSHIFT             8  /* used to get main net number from subnet */
+
+#define        IN_SUBNETA(i)           ((((long)(i))&0x80800000)==0x00800000)
+#define        IN_CLASSA_SUBNET        0xffff0000
+#define        IN_CLASSA_SUBNSHIFT     (IN_CLASSA_NSHIFT - SUBNETSHIFT)
+#define        IN_CLASSA_SUBHOST       0x0000ffff
+
+#define        IN_SUBNETB(i)           ((((long)(i))&0xc0008000)==0x80008000)
+#define        IN_CLASSB_SUBNET        0xffffff00
+#define        IN_CLASSB_SUBNSHIFT     (IN_CLASSB_NSHIFT - SUBNETSHIFT)
+#define        IN_CLASSA_SUBHOST       0x0000ffff
+#define        IN_CLASSB_SUBHOST       0x000000ff
+
 /*
  * Socket address, internet style.
  */
 /*
  * Socket address, internet style.
  */