xref: /csrg-svn/sys/netinet/in.c (revision 8937)
1*8937Sroot /*	in.c	4.10	82/10/30	*/
27159Ssam 
37159Ssam #include "../h/param.h"
47159Ssam #include "../h/mbuf.h"
57159Ssam #include "../h/protosw.h"
67159Ssam #include "../h/socket.h"
77159Ssam #include "../h/socketvar.h"
88397Swnj #include "../netinet/in.h"
98397Swnj #include "../netinet/in_systm.h"
107166Ssam #include "../net/if.h"
117166Ssam #include "../net/route.h"
127159Ssam #include "../net/af.h"
137159Ssam 
147159Ssam #ifdef INET
157159Ssam inet_hash(sin, hp)
167159Ssam 	register struct sockaddr_in *sin;
177159Ssam 	struct afhash *hp;
187159Ssam {
198595Sroot 
207159Ssam 	hp->afh_nethash = in_netof(sin->sin_addr);
21*8937Sroot 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
227159Ssam }
237159Ssam 
247159Ssam inet_netmatch(sin1, sin2)
257159Ssam 	struct sockaddr_in *sin1, *sin2;
267159Ssam {
278595Sroot 
287159Ssam 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
297159Ssam }
307159Ssam 
317159Ssam /*
327159Ssam  * Formulate an Internet address from network + host.  Used in
337159Ssam  * building addresses stored in the ifnet structure.
347159Ssam  */
357159Ssam struct in_addr
367159Ssam if_makeaddr(net, host)
377159Ssam 	int net, host;
387159Ssam {
397159Ssam 	u_long addr;
407159Ssam 
417159Ssam 	if (net < 128)
428694Sroot 		addr = (net << IN_CLASSA_NSHIFT) | host;
437159Ssam 	else if (net < 65536)
448694Sroot 		addr = (net << IN_CLASSB_NSHIFT) | host;
457159Ssam 	else
468694Sroot 		addr = (net << IN_CLASSC_NSHIFT) | host;
477159Ssam 	addr = htonl(addr);
487159Ssam 	return (*(struct in_addr *)&addr);
497159Ssam }
507159Ssam 
517159Ssam /*
528595Sroot  * Return the network number from an internet address.
537159Ssam  */
547159Ssam in_netof(in)
557159Ssam 	struct in_addr in;
567159Ssam {
57*8937Sroot 	register u_long i = ntohl(in.s_addr);
587159Ssam 
598595Sroot 	if (IN_CLASSA(i))
608694Sroot 		return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
618595Sroot 	else if (IN_CLASSB(i))
628694Sroot 		return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
638595Sroot 	else
648694Sroot 		return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
657159Ssam }
667159Ssam 
678775Sroot #ifdef notdef
687159Ssam /*
698595Sroot  * Return the host portion of an internet address.
707159Ssam  */
717159Ssam in_lnaof(in)
727159Ssam 	struct in_addr in;
737159Ssam {
74*8937Sroot 	register u_long i = ntohl(in.s_addr);
757159Ssam 
768595Sroot 	if (IN_CLASSA(i))
778694Sroot 		return ((i)&IN_CLASSA_HOST);
788595Sroot 	else if (IN_CLASSB(i))
798694Sroot 		return ((i)&IN_CLASSB_HOST);
808595Sroot 	else
818694Sroot 		return ((i)&IN_CLASSC_HOST);
827159Ssam }
838724Sroot #endif
847159Ssam 
857159Ssam /*
867159Ssam  * Initialize an interface's routing
877159Ssam  * table entry according to the network.
887159Ssam  * INTERNET SPECIFIC.
897159Ssam  */
907159Ssam if_rtinit(ifp, flags)
917159Ssam 	register struct ifnet *ifp;
927159Ssam 	int flags;
937159Ssam {
947159Ssam 	struct sockaddr_in sin;
957159Ssam 
967159Ssam 	if (ifp->if_flags & IFF_ROUTE)
977159Ssam 		return;
987159Ssam 	bzero((caddr_t)&sin, sizeof (sin));
997159Ssam 	sin.sin_family = AF_INET;
1007159Ssam 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
1018637Sroot 	rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags);
1027159Ssam }
1037159Ssam #endif
104