xref: /csrg-svn/sbin/routed/inet.c (revision 16395)
1*16395Skarels #ifndef lint
2*16395Skarels static char *sccsid[] = "@(#)inet.c	4.1 (Berkeley) 04/16/84";
3*16395Skarels #endif
4*16395Skarels /*
5*16395Skarels  * Temporarily, copy these routines from the kernel,
6*16395Skarels  * as we need to know about subnets.
7*16395Skarels  */
8*16395Skarels #include "defs.h"
9*16395Skarels 
10*16395Skarels /*
11*16395Skarels  * Formulate an Internet address from network + host.  Used in
12*16395Skarels  * building addresses stored in the ifnet structure.
13*16395Skarels  */
14*16395Skarels struct in_addr
15*16395Skarels if_makeaddr(net, host)
16*16395Skarels 	int net, host;
17*16395Skarels {
18*16395Skarels 	u_long addr;
19*16395Skarels 
20*16395Skarels 	if (net < IN_CLASSA_MAX)
21*16395Skarels 		addr = (net << IN_CLASSA_NSHIFT) | host;
22*16395Skarels 	else if (net < IN_CLASSB_MAX)
23*16395Skarels 		addr = (net << IN_CLASSB_NSHIFT) | host;
24*16395Skarels 	else
25*16395Skarels 		addr = (net << IN_CLASSC_NSHIFT) | host;
26*16395Skarels 	addr = htonl(addr);
27*16395Skarels 	return (*(struct in_addr *)&addr);
28*16395Skarels }
29*16395Skarels 
30*16395Skarels /*
31*16395Skarels  * Return the network number from an internet address.
32*16395Skarels  */
33*16395Skarels inet_netof(in)
34*16395Skarels 	struct in_addr in;
35*16395Skarels {
36*16395Skarels 	register u_long i = ntohl(in.s_addr);
37*16395Skarels 	register net;
38*16395Skarels 
39*16395Skarels 	if (IN_CLASSA(i)) {
40*16395Skarels 		net = ((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
41*16395Skarels 		if (IN_SUBNETA(i) && inet_localnet(net))
42*16395Skarels 			return (((i)&IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT);
43*16395Skarels 		else
44*16395Skarels 			return (net);
45*16395Skarels 	} else if (IN_CLASSB(i)) {
46*16395Skarels 		net = ((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
47*16395Skarels 		if (IN_SUBNETB(i) && inet_localnet(net))
48*16395Skarels 			return (((i)&IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT);
49*16395Skarels 		else
50*16395Skarels 			return (net);
51*16395Skarels 	} else {
52*16395Skarels 		return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
53*16395Skarels 	}
54*16395Skarels }
55*16395Skarels 
56*16395Skarels /*
57*16395Skarels  * Return the host portion of an internet address.
58*16395Skarels  */
59*16395Skarels inet_lnaof(in)
60*16395Skarels 	struct in_addr in;
61*16395Skarels {
62*16395Skarels 	register u_long i = ntohl(in.s_addr);
63*16395Skarels 
64*16395Skarels 	if (IN_CLASSA(i)) {
65*16395Skarels 		if (IN_SUBNETA(i) &&
66*16395Skarels 		    inet_localnet(((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT))
67*16395Skarels 			return ((i)&IN_CLASSA_SUBHOST);
68*16395Skarels 		else
69*16395Skarels 			return ((i)&IN_CLASSA_HOST);
70*16395Skarels 	} else if (IN_CLASSB(i)) {
71*16395Skarels 		if (IN_SUBNETB(i) &&
72*16395Skarels 		    inet_localnet(((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT))
73*16395Skarels 			return ((i)&IN_CLASSB_SUBHOST);
74*16395Skarels 		else
75*16395Skarels 			return ((i)&IN_CLASSB_HOST);
76*16395Skarels 	} else {
77*16395Skarels 		return ((i)&IN_CLASSC_HOST);
78*16395Skarels 	}
79*16395Skarels }
80*16395Skarels 
81*16395Skarels /*
82*16395Skarels  * Return true if the network is a ``local'' net
83*16395Skarels  * (one for which we can interpret the host part).
84*16395Skarels  */
85*16395Skarels inet_localnet(net)
86*16395Skarels 	register int net;
87*16395Skarels {
88*16395Skarels 	register struct interface *ifp;
89*16395Skarels 	extern struct interface *ifnet;
90*16395Skarels 
91*16395Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next) {
92*16395Skarels 		if (ifp->int_flags & IFF_LOCAL) {
93*16395Skarels 			if (ifp->int_net == net)
94*16395Skarels 				return (1);
95*16395Skarels 			if ((ifp->int_net >> SUBNETSHIFT) == net)
96*16395Skarels 				return (1);
97*16395Skarels 		}
98*16395Skarels 	}
99*16395Skarels 	return (0);
100*16395Skarels }
101