1: /*
   2:  * Copyright (c) 1983 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)inet.c	5.4 (Berkeley) 6/3/86";
   9: #endif not lint
  10: 
  11: /*
  12:  * Temporarily, copy these routines from the kernel,
  13:  * as we need to know about subnets.
  14:  */
  15: #include "defs.h"
  16: 
  17: extern struct interface *ifnet;
  18: 
  19: /*
  20:  * Formulate an Internet address from network + host.
  21:  */
  22: struct in_addr
  23: inet_makeaddr(net, host)
  24:     u_long net, host;
  25: {
  26:     register struct interface *ifp;
  27:     register u_long mask;
  28:     u_long addr;
  29: 
  30:     if (IN_CLASSA(net))
  31:         mask = IN_CLASSA_HOST;
  32:     else if (IN_CLASSB(net))
  33:         mask = IN_CLASSB_HOST;
  34:     else
  35:         mask = IN_CLASSC_HOST;
  36:     for (ifp = ifnet; ifp; ifp = ifp->int_next)
  37:         if ((ifp->int_netmask & net) == ifp->int_net) {
  38:             mask = ~ifp->int_subnetmask;
  39:             break;
  40:         }
  41:     addr = net | (host & mask);
  42:     addr = htonl(addr);
  43:     return (*(struct in_addr *)&addr);
  44: }
  45: 
  46: /*
  47:  * Return the network number from an internet address.
  48:  */
  49: inet_netof(in)
  50:     struct in_addr in;
  51: {
  52:     register u_long i = ntohl(in.s_addr);
  53:     register u_long net;
  54:     register struct interface *ifp;
  55: 
  56:     if (IN_CLASSA(i))
  57:         net = i & IN_CLASSA_NET;
  58:     else if (IN_CLASSB(i))
  59:         net = i & IN_CLASSB_NET;
  60:     else
  61:         net = i & IN_CLASSC_NET;
  62: 
  63:     /*
  64: 	 * Check whether network is a subnet;
  65: 	 * if so, return subnet number.
  66: 	 */
  67:     for (ifp = ifnet; ifp; ifp = ifp->int_next)
  68:         if ((ifp->int_netmask & net) == ifp->int_net)
  69:             return (i & ifp->int_subnetmask);
  70:     return (net);
  71: }
  72: 
  73: /*
  74:  * Return the host portion of an internet address.
  75:  */
  76: inet_lnaof(in)
  77:     struct in_addr in;
  78: {
  79:     register u_long i = ntohl(in.s_addr);
  80:     register u_long net, host;
  81:     register struct interface *ifp;
  82: 
  83:     if (IN_CLASSA(i)) {
  84:         net = i & IN_CLASSA_NET;
  85:         host = i & IN_CLASSA_HOST;
  86:     } else if (IN_CLASSB(i)) {
  87:         net = i & IN_CLASSB_NET;
  88:         host = i & IN_CLASSB_HOST;
  89:     } else {
  90:         net = i & IN_CLASSC_NET;
  91:         host = i & IN_CLASSC_HOST;
  92:     }
  93: 
  94:     /*
  95: 	 * Check whether network is a subnet;
  96: 	 * if so, use the modified interpretation of `host'.
  97: 	 */
  98:     for (ifp = ifnet; ifp; ifp = ifp->int_next)
  99:         if ((ifp->int_netmask & net) == ifp->int_net)
 100:             return (host &~ ifp->int_subnetmask);
 101:     return (host);
 102: }
 103: 
 104: /*
 105:  * Return RTF_HOST if the address is
 106:  * for an Internet host, RTF_SUBNET for a subnet,
 107:  * 0 for a network.
 108:  */
 109: inet_rtflags(sin)
 110:     struct sockaddr_in *sin;
 111: {
 112:     register u_long i = ntohl(sin->sin_addr.s_addr);
 113:     register u_long net, host;
 114:     register struct interface *ifp;
 115: 
 116:     if (IN_CLASSA(i)) {
 117:         net = i & IN_CLASSA_NET;
 118:         host = i & IN_CLASSA_HOST;
 119:     } else if (IN_CLASSB(i)) {
 120:         net = i & IN_CLASSB_NET;
 121:         host = i & IN_CLASSB_HOST;
 122:     } else {
 123:         net = i & IN_CLASSC_NET;
 124:         host = i & IN_CLASSC_HOST;
 125:     }
 126: 
 127:     /*
 128: 	 * Check whether this network is subnetted;
 129: 	 * if so, check whether this is a subnet or a host.
 130: 	 */
 131:     for (ifp = ifnet; ifp; ifp = ifp->int_next)
 132:         if (net == ifp->int_net) {
 133:             if (host &~ ifp->int_subnetmask)
 134:                 return (RTF_HOST);
 135:             else if (ifp->int_subnetmask != ifp->int_netmask)
 136:                 return (RTF_SUBNET);
 137:             else
 138:                 return (0);     /* network */
 139:         }
 140:     if (host == 0)
 141:         return (0); /* network */
 142:     else
 143:         return (RTF_HOST);
 144: }
 145: 
 146: /*
 147:  * Return true if a route to subnet of route rt should be sent to dst.
 148:  * Send it only if dst is on the same logical network,
 149:  * or the route is the "internal" route for the net.
 150:  */
 151: inet_sendsubnet(rt, dst)
 152:     struct rt_entry *rt;
 153:     struct sockaddr_in *dst;
 154: {
 155:     register u_long r =
 156:         ntohl(((struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr);
 157:     register u_long d = ntohl(dst->sin_addr.s_addr);
 158: 
 159:     if (IN_CLASSA(r)) {
 160:         if ((r & IN_CLASSA_NET) == (d & IN_CLASSA_NET)) {
 161:             if ((r & IN_CLASSA_HOST) == 0)
 162:                 return ((rt->rt_state & RTS_INTERNAL) == 0);
 163:             return (1);
 164:         }
 165:         if (r & IN_CLASSA_HOST)
 166:             return (0);
 167:         return ((rt->rt_state & RTS_INTERNAL) != 0);
 168:     } else if (IN_CLASSB(r)) {
 169:         if ((r & IN_CLASSB_NET) == (d & IN_CLASSB_NET)) {
 170:             if ((r & IN_CLASSB_HOST) == 0)
 171:                 return ((rt->rt_state & RTS_INTERNAL) == 0);
 172:             return (1);
 173:         }
 174:         if (r & IN_CLASSB_HOST)
 175:             return (0);
 176:         return ((rt->rt_state & RTS_INTERNAL) != 0);
 177:     } else {
 178:         if ((r & IN_CLASSC_NET) == (d & IN_CLASSC_NET)) {
 179:             if ((r & IN_CLASSC_HOST) == 0)
 180:                 return ((rt->rt_state & RTS_INTERNAL) == 0);
 181:             return (1);
 182:         }
 183:         if (r & IN_CLASSC_HOST)
 184:             return (0);
 185:         return ((rt->rt_state & RTS_INTERNAL) != 0);
 186:     }
 187: }

Defined functions

inet_lnaof defined in line 76; never used
inet_makeaddr defined in line 22; used 5 times
inet_netof defined in line 49; used 4 times
inet_rtflags defined in line 109; used 2 times
inet_sendsubnet defined in line 151; used 2 times

Defined variables

sccsid defined in line 8; never used
Last modified: 1986-06-04
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1183
Valid CSS Valid XHTML 1.0 Strict