xref: /original-bsd/sbin/routed/af.c (revision 23a40993)
1 #ifndef lint
2 static char sccsid[] = "@(#)af.c	4.11 (Berkeley) 05/25/83";
3 #endif
4 
5 #include "defs.h"
6 
7 /*
8  * Address family support routines
9  */
10 int	null_hash(), null_netmatch(), null_output(),
11 	null_portmatch(), null_portcheck(),
12 	null_checkhost(), null_canon();
13 int	inet_hash(), inet_netmatch(), inet_output(),
14 	inet_portmatch(), inet_portcheck(),
15 	inet_checkhost(), inet_canon();
16 #define NIL \
17 	{ null_hash,		null_netmatch,		null_output, \
18 	  null_portmatch,	null_portcheck,		null_checkhost, \
19 	  null_canon }
20 #define	INET \
21 	{ inet_hash,		inet_netmatch,		inet_output, \
22 	  inet_portmatch,	inet_portcheck,		inet_checkhost, \
23 	  inet_canon }
24 
25 struct afswitch afswitch[AF_MAX] =
26 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
27 
28 inet_hash(sin, hp)
29 	register struct sockaddr_in *sin;
30 	struct afhash *hp;
31 {
32 
33 	hp->afh_nethash = inet_netof(sin->sin_addr);
34 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
35 	hp->afh_hosthash &= 0x7fffffff;
36 }
37 
38 inet_netmatch(sin1, sin2)
39 	struct sockaddr_in *sin1, *sin2;
40 {
41 
42 	return (inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr));
43 }
44 
45 /*
46  * Verify the message is from the right port.
47  */
48 inet_portmatch(sin)
49 	register struct sockaddr_in *sin;
50 {
51 
52 #ifdef COMPAT
53 	if (ntohs(sin->sin_port) == ntohs(sp->s_port) + 1)
54 		return (1);
55 #endif
56 	return (sin->sin_port == sp->s_port);
57 }
58 
59 /*
60  * Verify the message is from a "trusted" port.
61  */
62 inet_portcheck(sin)
63 	struct sockaddr_in *sin;
64 {
65 
66 	return (ntohs(sin->sin_port) <= IPPORT_RESERVED);
67 }
68 
69 /*
70  * Internet output routine.
71  */
72 inet_output(s, flags, sin, size)
73 	int s, flags;
74 	struct sockaddr_in *sin;
75 	int size;
76 {
77 	struct sockaddr_in dst;
78 
79 	dst = *sin;
80 	sin = &dst;
81 	if (sin->sin_port == 0)
82 		sin->sin_port = sp->s_port;
83 	if (sendto(s, packet, size, flags, sin, sizeof (*sin)) < 0)
84 		perror("sendto");
85 }
86 
87 /*
88  * Return 1 if the address is believed
89  * for an Internet host -- THIS IS A KLUDGE.
90  */
91 inet_checkhost(sin)
92 	struct sockaddr_in *sin;
93 {
94 
95 	return (inet_lnaof(sin->sin_addr) != 0);
96 }
97 
98 inet_canon(sin)
99 	struct sockaddr_in *sin;
100 {
101 
102 	sin->sin_port = 0;
103 }
104 
105 /*ARGSUSED*/
106 null_hash(addr, hp)
107 	struct sockaddr *addr;
108 	struct afhash *hp;
109 {
110 
111 	hp->afh_nethash = hp->afh_hosthash = 0;
112 }
113 
114 /*ARGSUSED*/
115 null_netmatch(a1, a2)
116 	struct sockaddr *a1, *a2;
117 {
118 
119 	return (0);
120 }
121 
122 /*ARGSUSED*/
123 null_output(s, f, a1, n)
124 	int s, f;
125 	struct sockaddr *a1;
126 	int n;
127 {
128 
129 	;
130 }
131 
132 /*ARGSUSED*/
133 null_portmatch(a1)
134 	struct sockaddr *a1;
135 {
136 
137 	return (0);
138 }
139 
140 /*ARGSUSED*/
141 null_portcheck(a1)
142 	struct sockaddr *a1;
143 {
144 
145 	return (0);
146 }
147 
148 /*ARGSUSED*/
149 null_checkhost(a1)
150 	struct sockaddr *a1;
151 {
152 
153 	return (0);
154 }
155 
156 /*ARGSUSED*/
157 null_canon(a1)
158 	struct sockaddr *a1;
159 {
160 
161 	;
162 }
163