xref: /csrg-svn/sbin/routed/af.c (revision 6916)
1*6916Ssam #ifndef lint
2*6916Ssam static char sccsid[] = "@(#)af.c	4.1 05/22/82";
3*6916Ssam #endif
4*6916Ssam 
5*6916Ssam #include <sys/types.h>
6*6916Ssam #include <sys/socket.h>
7*6916Ssam #include <net/in.h>
8*6916Ssam 
9*6916Ssam #include "router.h"
10*6916Ssam #include "rip.h"
11*6916Ssam 
12*6916Ssam /*
13*6916Ssam  * Address family support routines
14*6916Ssam  */
15*6916Ssam int	null_hash(), null_netmatch(), null_output(),
16*6916Ssam 	null_portmatch(), null_checkhost(), null_canon();
17*6916Ssam int	inet_hash(), inet_netmatch(), inet_output(),
18*6916Ssam 	inet_portmatch(), inet_checkhost(), inet_canon();
19*6916Ssam #define NIL \
20*6916Ssam 	{ null_hash,		null_netmatch,		null_output, \
21*6916Ssam 	  null_portmatch,	null_checkhost,		null_canon }
22*6916Ssam #define	INET \
23*6916Ssam 	{ inet_hash,		inet_netmatch,		inet_output, \
24*6916Ssam 	  inet_portmatch,	inet_checkhost,		inet_canon }
25*6916Ssam 
26*6916Ssam struct afswitch afswitch[AF_MAX] =
27*6916Ssam 	{ NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
28*6916Ssam 
29*6916Ssam inet_hash(sin, hp)
30*6916Ssam 	register struct sockaddr_in *sin;
31*6916Ssam 	struct afhash *hp;
32*6916Ssam {
33*6916Ssam 
34*6916Ssam 	hp->afh_nethash = sin->sin_addr.s_net;
35*6916Ssam 	hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
36*6916Ssam }
37*6916Ssam 
38*6916Ssam inet_netmatch(sin1, sin2)
39*6916Ssam 	struct sockaddr_in *sin1, *sin2;
40*6916Ssam {
41*6916Ssam 
42*6916Ssam 	return (sin1->sin_addr.s_net == sin2->sin_addr.s_net);
43*6916Ssam }
44*6916Ssam 
45*6916Ssam /*
46*6916Ssam  * Verify the message is from the right port.
47*6916Ssam  */
48*6916Ssam inet_portmatch(sin)
49*6916Ssam 	struct sockaddr_in *sin;
50*6916Ssam {
51*6916Ssam 	int port = ntohs(sin->sin_port);
52*6916Ssam 
53*6916Ssam 	return (port == IPPORT_ROUTESERVER);
54*6916Ssam }
55*6916Ssam 
56*6916Ssam /*
57*6916Ssam  * Internet output routine.
58*6916Ssam  */
59*6916Ssam inet_output(sin, size)
60*6916Ssam 	struct sockaddr_in *sin;
61*6916Ssam 	int size;
62*6916Ssam {
63*6916Ssam 	extern int s;
64*6916Ssam 	extern char packet[MAXPACKETSIZE];
65*6916Ssam 	struct sockaddr_in dst;
66*6916Ssam 
67*6916Ssam 	dst = *sin;
68*6916Ssam 	sin = &dst;
69*6916Ssam 	if (sin->sin_port == 0)
70*6916Ssam 		sin->sin_port = htons(IPPORT_ROUTESERVER);
71*6916Ssam 	if (send(s, sin, packet, size) < 0)
72*6916Ssam 		perror("send");
73*6916Ssam }
74*6916Ssam 
75*6916Ssam /*
76*6916Ssam  * Return 1 if the address is for an Internet host,
77*6916Ssam  * otherwise assume it's a network address (broadcast).
78*6916Ssam  */
79*6916Ssam inet_checkhost(sin)
80*6916Ssam 	struct sockaddr_in *sin;
81*6916Ssam {
82*6916Ssam 	extern struct in_addr if_makeaddr();
83*6916Ssam 	struct in_addr netaddr;
84*6916Ssam 
85*6916Ssam 	netaddr = if_makeaddr((int)sin->sin_addr.s_net, INADDR_ANY);
86*6916Ssam 	return (netaddr.s_addr != sin->sin_addr.s_addr);
87*6916Ssam }
88*6916Ssam 
89*6916Ssam inet_canon(sin)
90*6916Ssam 	struct sockaddr_in *sin;
91*6916Ssam {
92*6916Ssam 	sin->sin_port = 0;
93*6916Ssam }
94*6916Ssam 
95*6916Ssam /*ARGSUSED*/
96*6916Ssam null_hash(addr, hp)
97*6916Ssam 	struct sockaddr *addr;
98*6916Ssam 	struct afhash *hp;
99*6916Ssam {
100*6916Ssam 
101*6916Ssam 	hp->afh_nethash = hp->afh_hosthash = 0;
102*6916Ssam }
103*6916Ssam 
104*6916Ssam /*ARGSUSED*/
105*6916Ssam null_netmatch(a1, a2)
106*6916Ssam 	struct sockaddr *a1, *a2;
107*6916Ssam {
108*6916Ssam 
109*6916Ssam 	return (0);
110*6916Ssam }
111*6916Ssam 
112*6916Ssam /*ARGSUSED*/
113*6916Ssam null_output(a1, n)
114*6916Ssam 	struct sockaddr *a1;
115*6916Ssam 	int n;
116*6916Ssam {
117*6916Ssam 	;
118*6916Ssam }
119*6916Ssam 
120*6916Ssam /*ARGSUSED*/
121*6916Ssam null_portmatch(a1)
122*6916Ssam 	struct sockaddr *a1;
123*6916Ssam {
124*6916Ssam 	return (0);
125*6916Ssam }
126*6916Ssam 
127*6916Ssam /*ARGSUSED*/
128*6916Ssam null_checkhost(a1)
129*6916Ssam 	struct sockaddr *a1;
130*6916Ssam {
131*6916Ssam 	return (0);
132*6916Ssam }
133*6916Ssam 
134*6916Ssam /*ARGSUSED*/
135*6916Ssam null_canon(a1)
136*6916Ssam 	struct sockaddr *a1;
137*6916Ssam {
138*6916Ssam 	;
139*6916Ssam }
140