xref: /csrg-svn/sys/netinet/in.c (revision 8637)
1*8637Sroot /*	in.c	4.6	82/10/17	*/
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);
217159Ssam 	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)
428595Sroot 		addr = (net << IN_CLASSANSHIFT) | host;
437159Ssam 	else if (net < 65536)
448595Sroot 		addr = (net << IN_CLASSBNSHIFT) | host;
457159Ssam 	else
468595Sroot 		addr = (net << IN_CLASSCNSHIFT) | host;
478595Sroot #ifdef vax || pdp11 || ns16032
487159Ssam 	addr = htonl(addr);
497159Ssam #endif
507159Ssam 	return (*(struct in_addr *)&addr);
517159Ssam }
527159Ssam 
537159Ssam /*
548595Sroot  * Return the network number from an internet address.
557159Ssam  */
567159Ssam in_netof(in)
577159Ssam 	struct in_addr in;
587159Ssam {
598595Sroot 	register u_int i = in.s_addr;
607159Ssam 
618595Sroot #ifdef vax || pdp11 || ns16032
628595Sroot 	i = ntohl(i);
638595Sroot #endif
648595Sroot 	if (IN_CLASSA(i))
658595Sroot 		return (((i)&IN_CLASSANET) >> IN_CLASSANSHIFT);
668595Sroot 	else if (IN_CLASSB(i))
678595Sroot 		return (((i)&IN_CLASSBNET) >> IN_CLASSBNSHIFT);
688595Sroot 	else
698595Sroot 		return (((i)&IN_CLASSCNET) >> IN_CLASSCNSHIFT);
707159Ssam }
717159Ssam 
727159Ssam /*
738595Sroot  * Return the host portion of an internet address.
747159Ssam  */
757159Ssam in_lnaof(in)
767159Ssam 	struct in_addr in;
777159Ssam {
788595Sroot 	register u_int i = in.s_addr;
797159Ssam 
808595Sroot #ifdef vax || pdp11 || ns16032
818595Sroot 	i = ntohl(i);
828595Sroot #endif
838595Sroot 	if (IN_CLASSA(i))
848595Sroot 		return ((i)&IN_CLASSAHOST);
858595Sroot 	else if (IN_CLASSB(i))
868595Sroot 		return ((i)&IN_CLASSBHOST);
878595Sroot 	else
888595Sroot 		return ((i)&IN_CLASSCHOST);
897159Ssam }
907159Ssam 
917159Ssam /*
927159Ssam  * Initialize an interface's routing
937159Ssam  * table entry according to the network.
947159Ssam  * INTERNET SPECIFIC.
957159Ssam  */
967159Ssam if_rtinit(ifp, flags)
977159Ssam 	register struct ifnet *ifp;
987159Ssam 	int flags;
997159Ssam {
1007159Ssam 	struct sockaddr_in sin;
1017159Ssam 
1027159Ssam 	if (ifp->if_flags & IFF_ROUTE)
1037159Ssam 		return;
1047159Ssam 	bzero((caddr_t)&sin, sizeof (sin));
1057159Ssam 	sin.sin_family = AF_INET;
1067159Ssam 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
107*8637Sroot 	rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags);
1087159Ssam }
1097159Ssam #endif
110