xref: /csrg-svn/sbin/routed/inet.c (revision 21846)
116395Skarels #ifndef lint
2*21846Skarels static char *sccsid[] = "@(#)inet.c	4.3 (Berkeley) 06/03/85";
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 
10*21846Skarels extern struct interface *ifnet;
11*21846Skarels 
1216395Skarels /*
13*21846Skarels  * Formulate an Internet address from network + host.
1416395Skarels  */
1516395Skarels struct in_addr
16*21846Skarels inet_makeaddr(net, host)
17*21846Skarels 	u_long net, host;
1816395Skarels {
19*21846Skarels 	register struct interface *ifp;
20*21846Skarels 	register u_long mask;
2116395Skarels 	u_long addr;
2216395Skarels 
23*21846Skarels 	if (IN_CLASSA(net))
24*21846Skarels 		mask = IN_CLASSA_HOST;
25*21846Skarels 	else if (IN_CLASSB(net))
26*21846Skarels 		mask = IN_CLASSB_HOST;
2716395Skarels 	else
28*21846Skarels 		mask = IN_CLASSC_HOST;
29*21846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
30*21846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net) {
31*21846Skarels 			mask = ~ifp->int_subnetmask;
32*21846Skarels 			break;
33*21846Skarels 		}
34*21846Skarels 	addr = net | (host & mask);
3516395Skarels 	addr = htonl(addr);
3616395Skarels 	return (*(struct in_addr *)&addr);
3716395Skarels }
3816395Skarels 
3916395Skarels /*
4016395Skarels  * Return the network number from an internet address.
4116395Skarels  */
4216395Skarels inet_netof(in)
4316395Skarels 	struct in_addr in;
4416395Skarels {
4516395Skarels 	register u_long i = ntohl(in.s_addr);
46*21846Skarels 	register u_long net;
4716429Skarels 	register struct interface *ifp;
4816395Skarels 
49*21846Skarels 	if (IN_CLASSA(i))
50*21846Skarels 		net = i & IN_CLASSA_NET;
51*21846Skarels 	else if (IN_CLASSB(i))
52*21846Skarels 		net = i & IN_CLASSB_NET;
53*21846Skarels 	else
54*21846Skarels 		net = i & IN_CLASSC_NET;
5516429Skarels 
5616429Skarels 	/*
57*21846Skarels 	 * Check whether network is a subnet;
5816429Skarels 	 * if so, return subnet number.
5916429Skarels 	 */
60*21846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
61*21846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net)
62*21846Skarels 			return (i & ifp->int_subnetmask);
6316429Skarels 	return (net);
6416395Skarels }
6516395Skarels 
6616395Skarels /*
6716395Skarels  * Return the host portion of an internet address.
6816395Skarels  */
6916395Skarels inet_lnaof(in)
7016395Skarels 	struct in_addr in;
7116395Skarels {
7216395Skarels 	register u_long i = ntohl(in.s_addr);
73*21846Skarels 	register u_long net, host;
7416429Skarels 	register struct interface *ifp;
7516395Skarels 
7616395Skarels 	if (IN_CLASSA(i)) {
77*21846Skarels 		net = i & IN_CLASSA_NET;
78*21846Skarels 		host = i & IN_CLASSA_HOST;
7916395Skarels 	} else if (IN_CLASSB(i)) {
80*21846Skarels 		net = i & IN_CLASSB_NET;
81*21846Skarels 		host = i & IN_CLASSB_HOST;
8216395Skarels 	} else {
83*21846Skarels 		net = i & IN_CLASSC_NET;
84*21846Skarels 		host = i & IN_CLASSC_HOST;
8516395Skarels 	}
8616395Skarels 
8716429Skarels 	/*
88*21846Skarels 	 * Check whether network is a subnet;
8916429Skarels 	 * if so, use the modified interpretation of `host'.
9016429Skarels 	 */
91*21846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
92*21846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net)
93*21846Skarels 			return (host &~ ifp->int_subnetmask);
9416429Skarels 	return (host);
9516395Skarels }
96