xref: /csrg-svn/sys/netinet/in.c (revision 8595)
1 /*	in.c	4.5	82/10/17	*/
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 = ntohl(sin->sin_addr.s_addr);
22 }
23 
24 inet_netmatch(sin1, sin2)
25 	struct sockaddr_in *sin1, *sin2;
26 {
27 
28 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
29 }
30 
31 /*
32  * Formulate an Internet address from network + host.  Used in
33  * building addresses stored in the ifnet structure.
34  */
35 struct in_addr
36 if_makeaddr(net, host)
37 	int net, host;
38 {
39 	u_long addr;
40 
41 	if (net < 128)
42 		addr = (net << IN_CLASSANSHIFT) | host;
43 	else if (net < 65536)
44 		addr = (net << IN_CLASSBNSHIFT) | host;
45 	else
46 		addr = (net << IN_CLASSCNSHIFT) | host;
47 #ifdef vax || pdp11 || ns16032
48 	addr = htonl(addr);
49 #endif
50 	return (*(struct in_addr *)&addr);
51 }
52 
53 /*
54  * Return the network number from an internet address.
55  */
56 in_netof(in)
57 	struct in_addr in;
58 {
59 	register u_int i = in.s_addr;
60 
61 #ifdef vax || pdp11 || ns16032
62 	i = ntohl(i);
63 #endif
64 	if (IN_CLASSA(i))
65 		return (((i)&IN_CLASSANET) >> IN_CLASSANSHIFT);
66 	else if (IN_CLASSB(i))
67 		return (((i)&IN_CLASSBNET) >> IN_CLASSBNSHIFT);
68 	else
69 		return (((i)&IN_CLASSCNET) >> IN_CLASSCNSHIFT);
70 }
71 
72 /*
73  * Return the host portion of an internet address.
74  */
75 in_lnaof(in)
76 	struct in_addr in;
77 {
78 	register u_int i = in.s_addr;
79 
80 #ifdef vax || pdp11 || ns16032
81 	i = ntohl(i);
82 #endif
83 	if (IN_CLASSA(i))
84 		return ((i)&IN_CLASSAHOST);
85 	else if (IN_CLASSB(i))
86 		return ((i)&IN_CLASSBHOST);
87 	else
88 		return ((i)&IN_CLASSCHOST);
89 }
90 
91 /*
92  * Initialize an interface's routing
93  * table entry according to the network.
94  * INTERNET SPECIFIC.
95  */
96 if_rtinit(ifp, flags)
97 	register struct ifnet *ifp;
98 	int flags;
99 {
100 	struct sockaddr_in sin;
101 
102 	if (ifp->if_flags & IFF_ROUTE)
103 		return;
104 	bzero((caddr_t)&sin, sizeof (sin));
105 	sin.sin_family = AF_INET;
106 	sin.sin_addr = if_makeaddr(ifp->if_net, 0);
107 	rtinit(&sin, &ifp->if_addr, flags);
108 }
109 #endif
110