xref: /csrg-svn/sys/netinet/in.c (revision 8694)
1 /*	in.c	4.7	82/10/20	*/
2 
3 #include "../h/param.h"
4 #include "../h/mbuf.h"
5 #include "../h/protosw.h"
6 #include "../h/socket.h"
7 #include "../h/socketvar.h"
8 #include "../netinet/in.h"
9 #include "../netinet/in_systm.h"
10 #include "../net/if.h"
11 #include "../net/route.h"
12 #include "../net/af.h"
13 
14 #ifdef INET
15 inet_hash(sin, hp)
16 	register struct sockaddr_in *sin;
17 	struct afhash *hp;
18 {
19 
20 	hp->afh_nethash = in_netof(sin->sin_addr);
21 	hp->afh_hosthash = sin->sin_addr.s_addr;
22 #if vax || pdp11 || ns16032
23 	hp->afh_hosthash = ntohl((u_long)hp->afh_hosthash);
24 #else
25 }
26 
27 inet_netmatch(sin1, sin2)
28 	struct sockaddr_in *sin1, *sin2;
29 {
30 
31 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
32 }
33 
34 /*
35  * Formulate an Internet address from network + host.  Used in
36  * building addresses stored in the ifnet structure.
37  */
38 struct in_addr
39 if_makeaddr(net, host)
40 	int net, host;
41 {
42 	u_long addr;
43 
44 	if (net < 128)
45 		addr = (net << IN_CLASSA_NSHIFT) | host;
46 	else if (net < 65536)
47 		addr = (net << IN_CLASSB_NSHIFT) | host;
48 	else
49 		addr = (net << IN_CLASSC_NSHIFT) | host;
50 #ifdef vax || pdp11 || ns16032
51 	addr = htonl(addr);
52 #endif
53 	return (*(struct in_addr *)&addr);
54 }
55 
56 /*
57  * Return the network number from an internet address.
58  */
59 in_netof(in)
60 	struct in_addr in;
61 {
62 	register u_long i = in.s_addr;
63 
64 #ifdef vax || pdp11 || ns16032
65 	i = ntohl(i);
66 #endif
67 	if (IN_CLASSA(i))
68 		return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
69 	else if (IN_CLASSB(i))
70 		return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
71 	else
72 		return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
73 }
74 
75 /*
76  * Return the host portion of an internet address.
77  */
78 in_lnaof(in)
79 	struct in_addr in;
80 {
81 	register u_long i = in.s_addr;
82 
83 #ifdef vax || pdp11 || ns16032
84 	i = ntohl(i);
85 #endif
86 	if (IN_CLASSA(i))
87 		return ((i)&IN_CLASSA_HOST);
88 	else if (IN_CLASSB(i))
89 		return ((i)&IN_CLASSB_HOST);
90 	else
91 		return ((i)&IN_CLASSC_HOST);
92 }
93 
94 /*
95  * Initialize an interface's routing
96  * table entry according to the network.
97  * INTERNET SPECIFIC.
98  */
99 if_rtinit(ifp, flags)
100 	register struct ifnet *ifp;
101 	int flags;
102 {
103 	struct sockaddr_in sin;
104 
105 	if (ifp->if_flags & IFF_ROUTE)
106 		return;
107 	bzero((caddr_t)&sin, sizeof (sin));
108 	sin.sin_family = AF_INET;
109 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
110 	rtinit((struct sockaddr *)&sin, &ifp->if_addr, flags);
111 }
112 #endif
113