xref: /csrg-svn/sbin/routed/inet.c (revision 16429)
116395Skarels #ifndef lint
2*16429Skarels static char *sccsid[] = "@(#)inet.c	4.2 (Berkeley) 05/01/84";
316395Skarels #endif
416395Skarels /*
516395Skarels  * Temporarily, copy these routines from the kernel,
616395Skarels  * as we need to know about subnets.
716395Skarels  */
816395Skarels #include "defs.h"
916395Skarels 
1016395Skarels /*
1116395Skarels  * Formulate an Internet address from network + host.  Used in
1216395Skarels  * building addresses stored in the ifnet structure.
1316395Skarels  */
1416395Skarels struct in_addr
1516395Skarels if_makeaddr(net, host)
1616395Skarels 	int net, host;
1716395Skarels {
1816395Skarels 	u_long addr;
1916395Skarels 
2016395Skarels 	if (net < IN_CLASSA_MAX)
2116395Skarels 		addr = (net << IN_CLASSA_NSHIFT) | host;
2216395Skarels 	else if (net < IN_CLASSB_MAX)
2316395Skarels 		addr = (net << IN_CLASSB_NSHIFT) | host;
2416395Skarels 	else
2516395Skarels 		addr = (net << IN_CLASSC_NSHIFT) | host;
2616395Skarels 	addr = htonl(addr);
2716395Skarels 	return (*(struct in_addr *)&addr);
2816395Skarels }
2916395Skarels 
3016395Skarels /*
3116395Skarels  * Return the network number from an internet address.
3216395Skarels  */
3316395Skarels inet_netof(in)
3416395Skarels 	struct in_addr in;
3516395Skarels {
3616395Skarels 	register u_long i = ntohl(in.s_addr);
37*16429Skarels 	register u_long net, subnet;
38*16429Skarels 	register struct interface *ifp;
39*16429Skarels 	extern struct interface *ifnet;
4016395Skarels 
4116395Skarels 	if (IN_CLASSA(i)) {
42*16429Skarels 		net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
43*16429Skarels 		if (IN_SUBNETA(i)) {
44*16429Skarels 			subnet = (i & IN_CLASSA_SUBNET) >> IN_CLASSA_SUBNSHIFT;
45*16429Skarels 			/* Fall through and check whether a subnet */
46*16429Skarels 		} else
4716395Skarels 			return (net);
4816395Skarels 	} else if (IN_CLASSB(i)) {
49*16429Skarels 		net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
50*16429Skarels 		if (IN_SUBNETB(i)) {
51*16429Skarels 			subnet = (i & IN_CLASSB_SUBNET) >> IN_CLASSB_SUBNSHIFT;
52*16429Skarels 			/* Fall through and check whether a subnet */
53*16429Skarels 		} else
5416395Skarels 			return (net);
5516395Skarels 	} else {
56*16429Skarels 		return ((i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
5716395Skarels 	}
58*16429Skarels 
59*16429Skarels 	/*
60*16429Skarels 	 * Check whether network is a subnet of a `local' network;
61*16429Skarels 	 * if so, return subnet number.
62*16429Skarels 	 */
63*16429Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next) {
64*16429Skarels 		if (ifp->int_flags & IFF_LOCAL) {
65*16429Skarels 			if (ifp->int_net == net)
66*16429Skarels 				return (subnet);
67*16429Skarels 			if ((ifp->int_net >> SUBNETSHIFT) == net)
68*16429Skarels 				return (subnet);
69*16429Skarels 		}
70*16429Skarels 	}
71*16429Skarels 	return (net);
7216395Skarels }
7316395Skarels 
7416395Skarels /*
7516395Skarels  * Return the host portion of an internet address.
7616395Skarels  */
7716395Skarels inet_lnaof(in)
7816395Skarels 	struct in_addr in;
7916395Skarels {
8016395Skarels 	register u_long i = ntohl(in.s_addr);
81*16429Skarels 	register u_long net, host, subhost;
82*16429Skarels 	register struct interface *ifp;
8316395Skarels 
8416395Skarels 	if (IN_CLASSA(i)) {
85*16429Skarels 		if (IN_SUBNETA(i)) {
86*16429Skarels 			net = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT;
87*16429Skarels 			host = i & IN_CLASSA_HOST;
88*16429Skarels 			subhost = i & IN_CLASSA_SUBHOST;
89*16429Skarels 			/* Fall through and check whether a subnet */
90*16429Skarels 		} else
91*16429Skarels 			return (i & IN_CLASSA_HOST);
9216395Skarels 	} else if (IN_CLASSB(i)) {
93*16429Skarels 		if (IN_SUBNETB(i)) {
94*16429Skarels 			net = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT;
95*16429Skarels 			host = i & IN_CLASSB_HOST;
96*16429Skarels 			subhost = i & IN_CLASSB_SUBHOST;
97*16429Skarels 			/* Fall through and check whether a subnet */
98*16429Skarels 		} else
99*16429Skarels 			return (i & IN_CLASSB_HOST);
10016395Skarels 	} else {
101*16429Skarels 		return (i & IN_CLASSC_HOST);
10216395Skarels 	}
10316395Skarels 
104*16429Skarels 	/*
105*16429Skarels 	 * Check whether network is a subnet of a `local' network;
106*16429Skarels 	 * if so, use the modified interpretation of `host'.
107*16429Skarels 	 */
10816395Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next) {
10916395Skarels 		if (ifp->int_flags & IFF_LOCAL) {
11016395Skarels 			if (ifp->int_net == net)
111*16429Skarels 				return (subhost);
11216395Skarels 			if ((ifp->int_net >> SUBNETSHIFT) == net)
113*16429Skarels 				return (subhost);
11416395Skarels 		}
11516395Skarels 	}
116*16429Skarels 	return (host);
11716395Skarels }
118