|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.