xref: /csrg-svn/sys/netinet/in.c (revision 8775)
1*8775Sroot /*	in.c	4.9	82/10/21	*/
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);
218694Sroot 	hp->afh_hosthash = sin->sin_addr.s_addr;
228694Sroot #if vax || pdp11 || ns16032
238694Sroot 	hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash);
24*8775Sroot #endif
257159Ssam }
267159Ssam 
277159Ssam inet_netmatch(sin1, sin2)
287159Ssam 	struct sockaddr_in *sin1, *sin2;
297159Ssam {
308595Sroot 
317159Ssam 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
327159Ssam }
337159Ssam 
347159Ssam /*
357159Ssam  * Formulate an Internet address from network + host.  Used in
367159Ssam  * building addresses stored in the ifnet structure.
377159Ssam  */
387159Ssam struct in_addr
397159Ssam if_makeaddr(net, host)
407159Ssam 	int net, host;
417159Ssam {
427159Ssam 	u_long addr;
437159Ssam 
447159Ssam 	if (net < 128)
458694Sroot 		addr = (net << IN_CLASSA_NSHIFT) | host;
467159Ssam 	else if (net < 65536)
478694Sroot 		addr = (net << IN_CLASSB_NSHIFT) | host;
487159Ssam 	else
498694Sroot 		addr = (net << IN_CLASSC_NSHIFT) | host;
508595Sroot #ifdef vax || pdp11 || ns16032
517159Ssam 	addr = htonl(addr);
527159Ssam #endif
537159Ssam 	return (*(struct in_addr *)&addr);
547159Ssam }
557159Ssam 
567159Ssam /*
578595Sroot  * Return the network number from an internet address.
587159Ssam  */
597159Ssam in_netof(in)
607159Ssam 	struct in_addr in;
617159Ssam {
628694Sroot 	register u_long i = in.s_addr;
637159Ssam 
648595Sroot #ifdef vax || pdp11 || ns16032
658595Sroot 	i = ntohl(i);
668595Sroot #endif
678595Sroot 	if (IN_CLASSA(i))
688694Sroot 		return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
698595Sroot 	else if (IN_CLASSB(i))
708694Sroot 		return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
718595Sroot 	else
728694Sroot 		return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
737159Ssam }
747159Ssam 
75*8775Sroot #ifdef notdef
767159Ssam /*
778595Sroot  * Return the host portion of an internet address.
787159Ssam  */
797159Ssam in_lnaof(in)
807159Ssam 	struct in_addr in;
817159Ssam {
828694Sroot 	register u_long i = in.s_addr;
837159Ssam 
848595Sroot #ifdef vax || pdp11 || ns16032
858595Sroot 	i = ntohl(i);
868595Sroot #endif
878595Sroot 	if (IN_CLASSA(i))
888694Sroot 		return ((i)&IN_CLASSA_HOST);
898595Sroot 	else if (IN_CLASSB(i))
908694Sroot 		return ((i)&IN_CLASSB_HOST);
918595Sroot 	else
928694Sroot 		return ((i)&IN_CLASSC_HOST);
937159Ssam }
948724Sroot #endif
957159Ssam 
967159Ssam /*
977159Ssam  * Initialize an interface's routing
987159Ssam  * table entry according to the network.
997159Ssam  * INTERNET SPECIFIC.
1007159Ssam  */
1017159Ssam if_rtinit(ifp, flags)
1027159Ssam 	register struct ifnet *ifp;
1037159Ssam 	int flags;
1047159Ssam {
1057159Ssam 	struct sockaddr_in sin;
1067159Ssam 
1077159Ssam 	if (ifp->if_flags & IFF_ROUTE)
1087159Ssam 		return;
1097159Ssam 	bzero((caddr_t)&sin, sizeof (sin));
1107159Ssam 	sin.sin_family = AF_INET;
1117159Ssam 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
1128637Sroot 	rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags);
1137159Ssam }
1147159Ssam #endif
115