xref: /csrg-svn/sbin/routed/inet.c (revision 21994)
1*21994Sdist /*
2*21994Sdist  * Copyright (c) 1983 Regents of the University of California.
3*21994Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21994Sdist  * specifies the terms and conditions for redistribution.
5*21994Sdist  */
6*21994Sdist 
716395Skarels #ifndef lint
8*21994Sdist static char sccsid[] = "@(#)inet.c	5.1 (Berkeley) 06/04/85";
9*21994Sdist #endif not lint
10*21994Sdist 
1116395Skarels /*
1216395Skarels  * Temporarily, copy these routines from the kernel,
1316395Skarels  * as we need to know about subnets.
1416395Skarels  */
1516395Skarels #include "defs.h"
1616395Skarels 
1721846Skarels extern struct interface *ifnet;
1821846Skarels 
1916395Skarels /*
2021846Skarels  * Formulate an Internet address from network + host.
2116395Skarels  */
2216395Skarels struct in_addr
2321846Skarels inet_makeaddr(net, host)
2421846Skarels 	u_long net, host;
2516395Skarels {
2621846Skarels 	register struct interface *ifp;
2721846Skarels 	register u_long mask;
2816395Skarels 	u_long addr;
2916395Skarels 
3021846Skarels 	if (IN_CLASSA(net))
3121846Skarels 		mask = IN_CLASSA_HOST;
3221846Skarels 	else if (IN_CLASSB(net))
3321846Skarels 		mask = IN_CLASSB_HOST;
3416395Skarels 	else
3521846Skarels 		mask = IN_CLASSC_HOST;
3621846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
3721846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net) {
3821846Skarels 			mask = ~ifp->int_subnetmask;
3921846Skarels 			break;
4021846Skarels 		}
4121846Skarels 	addr = net | (host & mask);
4216395Skarels 	addr = htonl(addr);
4316395Skarels 	return (*(struct in_addr *)&addr);
4416395Skarels }
4516395Skarels 
4616395Skarels /*
4716395Skarels  * Return the network number from an internet address.
4816395Skarels  */
4916395Skarels inet_netof(in)
5016395Skarels 	struct in_addr in;
5116395Skarels {
5216395Skarels 	register u_long i = ntohl(in.s_addr);
5321846Skarels 	register u_long net;
5416429Skarels 	register struct interface *ifp;
5516395Skarels 
5621846Skarels 	if (IN_CLASSA(i))
5721846Skarels 		net = i & IN_CLASSA_NET;
5821846Skarels 	else if (IN_CLASSB(i))
5921846Skarels 		net = i & IN_CLASSB_NET;
6021846Skarels 	else
6121846Skarels 		net = i & IN_CLASSC_NET;
6216429Skarels 
6316429Skarels 	/*
6421846Skarels 	 * Check whether network is a subnet;
6516429Skarels 	 * if so, return subnet number.
6616429Skarels 	 */
6721846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
6821846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net)
6921846Skarels 			return (i & ifp->int_subnetmask);
7016429Skarels 	return (net);
7116395Skarels }
7216395Skarels 
7316395Skarels /*
7416395Skarels  * Return the host portion of an internet address.
7516395Skarels  */
7616395Skarels inet_lnaof(in)
7716395Skarels 	struct in_addr in;
7816395Skarels {
7916395Skarels 	register u_long i = ntohl(in.s_addr);
8021846Skarels 	register u_long net, host;
8116429Skarels 	register struct interface *ifp;
8216395Skarels 
8316395Skarels 	if (IN_CLASSA(i)) {
8421846Skarels 		net = i & IN_CLASSA_NET;
8521846Skarels 		host = i & IN_CLASSA_HOST;
8616395Skarels 	} else if (IN_CLASSB(i)) {
8721846Skarels 		net = i & IN_CLASSB_NET;
8821846Skarels 		host = i & IN_CLASSB_HOST;
8916395Skarels 	} else {
9021846Skarels 		net = i & IN_CLASSC_NET;
9121846Skarels 		host = i & IN_CLASSC_HOST;
9216395Skarels 	}
9316395Skarels 
9416429Skarels 	/*
9521846Skarels 	 * Check whether network is a subnet;
9616429Skarels 	 * if so, use the modified interpretation of `host'.
9716429Skarels 	 */
9821846Skarels 	for (ifp = ifnet; ifp; ifp = ifp->int_next)
9921846Skarels 		if ((ifp->int_netmask & net) == ifp->int_net)
10021846Skarels 			return (host &~ ifp->int_subnetmask);
10116429Skarels 	return (host);
10216395Skarels }
103