|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)inet.c 5.8 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: /*
25: * Temporarily, copy these routines from the kernel,
26: * as we need to know about subnets.
27: */
28: #include "defs.h"
29:
30: extern struct interface *ifnet;
31:
32: /*
33: * Formulate an Internet address from network + host.
34: */
35: struct in_addr
36: inet_makeaddr(net, host)
37: u_long net, host;
38: {
39: register struct interface *ifp;
40: register u_long mask;
41: u_long addr;
42:
43: if (IN_CLASSA(net))
44: mask = IN_CLASSA_HOST;
45: else if (IN_CLASSB(net))
46: mask = IN_CLASSB_HOST;
47: else
48: mask = IN_CLASSC_HOST;
49: for (ifp = ifnet; ifp; ifp = ifp->int_next)
50: if ((ifp->int_netmask & net) == ifp->int_net) {
51: mask = ~ifp->int_subnetmask;
52: break;
53: }
54: addr = net | (host & mask);
55: addr = htonl(addr);
56: return (*(struct in_addr *)&addr);
57: }
58:
59: /*
60: * Return the network number from an internet address.
61: */
62: inet_netof(in)
63: struct in_addr in;
64: {
65: register u_long i = ntohl(in.s_addr);
66: register u_long net;
67: register struct interface *ifp;
68:
69: if (IN_CLASSA(i))
70: net = i & IN_CLASSA_NET;
71: else if (IN_CLASSB(i))
72: net = i & IN_CLASSB_NET;
73: else
74: net = i & IN_CLASSC_NET;
75:
76: /*
77: * Check whether network is a subnet;
78: * if so, return subnet number.
79: */
80: for (ifp = ifnet; ifp; ifp = ifp->int_next)
81: if ((ifp->int_netmask & net) == ifp->int_net)
82: return (i & ifp->int_subnetmask);
83: return (net);
84: }
85:
86: /*
87: * Return the host portion of an internet address.
88: */
89: inet_lnaof(in)
90: struct in_addr in;
91: {
92: register u_long i = ntohl(in.s_addr);
93: register u_long net, host;
94: register struct interface *ifp;
95:
96: if (IN_CLASSA(i)) {
97: net = i & IN_CLASSA_NET;
98: host = i & IN_CLASSA_HOST;
99: } else if (IN_CLASSB(i)) {
100: net = i & IN_CLASSB_NET;
101: host = i & IN_CLASSB_HOST;
102: } else {
103: net = i & IN_CLASSC_NET;
104: host = i & IN_CLASSC_HOST;
105: }
106:
107: /*
108: * Check whether network is a subnet;
109: * if so, use the modified interpretation of `host'.
110: */
111: for (ifp = ifnet; ifp; ifp = ifp->int_next)
112: if ((ifp->int_netmask & net) == ifp->int_net)
113: return (host &~ ifp->int_subnetmask);
114: return (host);
115: }
116:
117: /*
118: * Return RTF_HOST if the address is
119: * for an Internet host, RTF_SUBNET for a subnet,
120: * 0 for a network.
121: */
122: inet_rtflags(sin)
123: struct sockaddr_in *sin;
124: {
125: register u_long i = ntohl(sin->sin_addr.s_addr);
126: register u_long net, host;
127: register struct interface *ifp;
128:
129: if (IN_CLASSA(i)) {
130: net = i & IN_CLASSA_NET;
131: host = i & IN_CLASSA_HOST;
132: } else if (IN_CLASSB(i)) {
133: net = i & IN_CLASSB_NET;
134: host = i & IN_CLASSB_HOST;
135: } else {
136: net = i & IN_CLASSC_NET;
137: host = i & IN_CLASSC_HOST;
138: }
139:
140: /*
141: * Check whether this network is subnetted;
142: * if so, check whether this is a subnet or a host.
143: */
144: for (ifp = ifnet; ifp; ifp = ifp->int_next)
145: if (net == ifp->int_net) {
146: if (host &~ ifp->int_subnetmask)
147: return (RTF_HOST);
148: else if (ifp->int_subnetmask != ifp->int_netmask)
149: return (RTF_SUBNET);
150: else
151: return (0); /* network */
152: }
153: if (host == 0)
154: return (0); /* network */
155: else
156: return (RTF_HOST);
157: }
158:
159: /*
160: * Return true if a route to subnet/host of route rt should be sent to dst.
161: * Send it only if dst is on the same logical network if not "internal",
162: * otherwise only if the route is the "internal" route for the logical net.
163: */
164: inet_sendroute(rt, dst)
165: struct rt_entry *rt;
166: struct sockaddr_in *dst;
167: {
168: register u_long r =
169: ntohl(((struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr);
170: register u_long d = ntohl(dst->sin_addr.s_addr);
171:
172: if (IN_CLASSA(r)) {
173: if ((r & IN_CLASSA_NET) == (d & IN_CLASSA_NET)) {
174: if ((r & IN_CLASSA_HOST) == 0)
175: return ((rt->rt_state & RTS_INTERNAL) == 0);
176: return (1);
177: }
178: if (r & IN_CLASSA_HOST)
179: return (0);
180: return ((rt->rt_state & RTS_INTERNAL) != 0);
181: } else if (IN_CLASSB(r)) {
182: if ((r & IN_CLASSB_NET) == (d & IN_CLASSB_NET)) {
183: if ((r & IN_CLASSB_HOST) == 0)
184: return ((rt->rt_state & RTS_INTERNAL) == 0);
185: return (1);
186: }
187: if (r & IN_CLASSB_HOST)
188: return (0);
189: return ((rt->rt_state & RTS_INTERNAL) != 0);
190: } else {
191: if ((r & IN_CLASSC_NET) == (d & IN_CLASSC_NET)) {
192: if ((r & IN_CLASSC_HOST) == 0)
193: return ((rt->rt_state & RTS_INTERNAL) == 0);
194: return (1);
195: }
196: if (r & IN_CLASSC_HOST)
197: return (0);
198: return ((rt->rt_state & RTS_INTERNAL) != 0);
199: }
200: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.