xref: /csrg-svn/sys/netinet/in.c (revision 8694)
1*8694Sroot /*	in.c	4.7	82/10/20	*/
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*8694Sroot 	hp->afh_hosthash = sin->sin_addr.s_addr;
22*8694Sroot #if vax || pdp11 || ns16032
23*8694Sroot 	hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash);
24*8694Sroot #else
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)
45*8694Sroot 		addr = (net << IN_CLASSA_NSHIFT) | host;
467159Ssam 	else if (net < 65536)
47*8694Sroot 		addr = (net << IN_CLASSB_NSHIFT) | host;
487159Ssam 	else
49*8694Sroot 		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 {
62*8694Sroot 	register u_long i = in.s_addr;
637159Ssam 
648595Sroot #ifdef vax || pdp11 || ns16032
658595Sroot 	i = ntohl(i);
668595Sroot #endif
678595Sroot 	if (IN_CLASSA(i))
68*8694Sroot 		return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
698595Sroot 	else if (IN_CLASSB(i))
70*8694Sroot 		return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
718595Sroot 	else
72*8694Sroot 		return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
737159Ssam }
747159Ssam 
757159Ssam /*
768595Sroot  * Return the host portion of an internet address.
777159Ssam  */
787159Ssam in_lnaof(in)
797159Ssam 	struct in_addr in;
807159Ssam {
81*8694Sroot 	register u_long i = in.s_addr;
827159Ssam 
838595Sroot #ifdef vax || pdp11 || ns16032
848595Sroot 	i = ntohl(i);
858595Sroot #endif
868595Sroot 	if (IN_CLASSA(i))
87*8694Sroot 		return ((i)&IN_CLASSA_HOST);
888595Sroot 	else if (IN_CLASSB(i))
89*8694Sroot 		return ((i)&IN_CLASSB_HOST);
908595Sroot 	else
91*8694Sroot 		return ((i)&IN_CLASSC_HOST);
927159Ssam }
937159Ssam 
947159Ssam /*
957159Ssam  * Initialize an interface's routing
967159Ssam  * table entry according to the network.
977159Ssam  * INTERNET SPECIFIC.
987159Ssam  */
997159Ssam if_rtinit(ifp, flags)
1007159Ssam 	register struct ifnet *ifp;
1017159Ssam 	int flags;
1027159Ssam {
1037159Ssam 	struct sockaddr_in sin;
1047159Ssam 
1057159Ssam 	if (ifp->if_flags & IFF_ROUTE)
1067159Ssam 		return;
1077159Ssam 	bzero((caddr_t)&sin, sizeof (sin));
1087159Ssam 	sin.sin_family = AF_INET;
1097159Ssam 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
1108637Sroot 	rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags);
1117159Ssam }
1127159Ssam #endif
113