xref: /csrg-svn/sbin/XNSrouted/af.c (revision 24317)
124305Ssklower #ifndef lint
224305Ssklower static char rcsid[] = "$Header$";
324305Ssklower #endif
424305Ssklower 
524305Ssklower #include "defs.h"
624305Ssklower 
724305Ssklower /*
824305Ssklower  * Address family support routines
924305Ssklower  */
1024305Ssklower int	null_hash(), null_netmatch(), null_output(),
1124305Ssklower 	null_portmatch(), null_portcheck(),
1224305Ssklower 	null_checkhost(), null_ishost(), null_canon();
1324305Ssklower int	xnnet_hash(), xnnet_netmatch(), xnnet_output(),
1424305Ssklower 	xnnet_portmatch();
1524305Ssklower 	xnnet_checkhost(), xnnet_ishost(), xnnet_canon();
1624305Ssklower #define NIL \
1724305Ssklower 	{ null_hash,		null_netmatch,		null_output, \
1824305Ssklower 	  null_portmatch,	null_portcheck,		null_checkhost, \
1924305Ssklower 	  null_ishost,		null_canon }
2024305Ssklower #define	XNSNET \
2124305Ssklower 	{ xnnet_hash,		xnnet_netmatch,		xnnet_output, \
2224305Ssklower 	  xnnet_portmatch,	xnnet_portmatch,	xnnet_checkhost, \
2324305Ssklower 	  xnnet_ishost,		xnnet_canon }
2424305Ssklower 
2524305Ssklower struct afswitch afswitch[AF_MAX] =
2624305Ssklower 	{ NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL };
2724305Ssklower 
28*24317Ssklower struct sockaddr_ns xnnet_default = { AF_NS };
2924305Ssklower 
30*24317Ssklower xnnet_hash(sns, hp)
31*24317Ssklower 	register struct sockaddr_ns *sns;
3224305Ssklower 	struct afhash *hp;
3324305Ssklower {
34*24317Ssklower 	register long hash = 0;
35*24317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
36*24317Ssklower 	hp->afh_nethash = xnnet(sns->sns_addr.x_net);
37*24317Ssklower 	hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s;
38*24317Ssklower 	hp->afh_hosthash = hash;
3924305Ssklower }
4024305Ssklower 
4124305Ssklower xnnet_netmatch(sxn1, sxn2)
42*24317Ssklower 	struct sockaddr_ns *sxn1, *sxn2;
4324305Ssklower {
4424305Ssklower 
45*24317Ssklower 	return (xnnet(sxn1->sns_addr.x_net) == xnnet(sxn2->sns_addr.x_net));
4624305Ssklower }
4724305Ssklower 
4824305Ssklower /*
4924305Ssklower  * Verify the message is from the right port.
5024305Ssklower  */
51*24317Ssklower xnnet_portmatch(sns)
52*24317Ssklower 	register struct sockaddr_ns *sns;
5324305Ssklower {
5424305Ssklower 
55*24317Ssklower 	return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF );
5624305Ssklower }
5724305Ssklower 
5824305Ssklower 
5924305Ssklower /*
6024305Ssklower  * xns output routine.
6124305Ssklower  */
6224305Ssklower #ifdef DEBUG
6324305Ssklower int do_output = 0;
6424305Ssklower #endif
65*24317Ssklower xnnet_output(flags, sns, size)
66*24317Ssklower 	int flags;
67*24317Ssklower 	struct sockaddr_ns *sns;
6824305Ssklower 	int size;
6924305Ssklower {
70*24317Ssklower 	struct sockaddr_ns dst;
7124305Ssklower 
72*24317Ssklower 	dst = *sns;
73*24317Ssklower 	sns = &dst;
74*24317Ssklower 	if (sns->sns_addr.x_port == 0)
75*24317Ssklower 		sns->sns_addr.x_port = htons(IDPPORT_RIF);
7624305Ssklower #ifdef DEBUG
7724305Ssklower 	if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST)
7824305Ssklower #endif
79*24317Ssklower 	if (sendto(s, msg, size, flags, sns, sizeof (*sns)) < 0)
8024305Ssklower 		perror("sendto");
8124305Ssklower }
8224305Ssklower 
8324305Ssklower /*
8424305Ssklower  * Return 1 if the address is believed
8524305Ssklower  *  -- THIS IS A KLUDGE.
8624305Ssklower  */
87*24317Ssklower xnnet_checkhost(sns)
88*24317Ssklower 	struct sockaddr_ns *sns;
8924305Ssklower {
9024305Ssklower 	return (1);
9124305Ssklower }
9224305Ssklower 
9324305Ssklower /*
9424305Ssklower  * Return 1 if the address is
9524305Ssklower  * for a host, 0 for a network.
9624305Ssklower  */
97*24317Ssklower xnnet_ishost(sns)
98*24317Ssklower struct sockaddr_ns *sns;
9924305Ssklower {
100*24317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
10124305Ssklower 
102*24317Ssklower 	if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff))
103*24317Ssklower 		return (0);
104*24317Ssklower 	else
105*24317Ssklower 		return (1);
10624305Ssklower }
10724305Ssklower 
108*24317Ssklower xnnet_canon(sns)
109*24317Ssklower 	struct sockaddr_ns *sns;
11024305Ssklower {
11124305Ssklower 
112*24317Ssklower 	sns->sns_addr.x_port = 0;
11324305Ssklower }
11424305Ssklower 
11524305Ssklower /*ARGSUSED*/
11624305Ssklower null_hash(addr, hp)
11724305Ssklower 	struct sockaddr *addr;
11824305Ssklower 	struct afhash *hp;
11924305Ssklower {
12024305Ssklower 
12124305Ssklower 	hp->afh_nethash = hp->afh_hosthash = 0;
12224305Ssklower }
12324305Ssklower 
12424305Ssklower /*ARGSUSED*/
12524305Ssklower null_netmatch(a1, a2)
12624305Ssklower 	struct sockaddr *a1, *a2;
12724305Ssklower {
12824305Ssklower 
12924305Ssklower 	return (0);
13024305Ssklower }
13124305Ssklower 
13224305Ssklower /*ARGSUSED*/
13324305Ssklower null_output(s, f, a1, n)
13424305Ssklower 	int s, f;
13524305Ssklower 	struct sockaddr *a1;
13624305Ssklower 	int n;
13724305Ssklower {
13824305Ssklower 
13924305Ssklower 	;
14024305Ssklower }
14124305Ssklower 
14224305Ssklower /*ARGSUSED*/
14324305Ssklower null_portmatch(a1)
14424305Ssklower 	struct sockaddr *a1;
14524305Ssklower {
14624305Ssklower 
14724305Ssklower 	return (0);
14824305Ssklower }
14924305Ssklower 
15024305Ssklower /*ARGSUSED*/
15124305Ssklower null_portcheck(a1)
15224305Ssklower 	struct sockaddr *a1;
15324305Ssklower {
15424305Ssklower 
15524305Ssklower 	return (0);
15624305Ssklower }
15724305Ssklower 
15824305Ssklower /*ARGSUSED*/
15924305Ssklower null_ishost(a1)
16024305Ssklower 	struct sockaddr *a1;
16124305Ssklower {
16224305Ssklower 
16324305Ssklower 	return (0);
16424305Ssklower }
16524305Ssklower 
16624305Ssklower /*ARGSUSED*/
16724305Ssklower null_checkhost(a1)
16824305Ssklower 	struct sockaddr *a1;
16924305Ssklower {
17024305Ssklower 
17124305Ssklower 	return (0);
17224305Ssklower }
17324305Ssklower 
17424305Ssklower /*ARGSUSED*/
17524305Ssklower null_canon(a1)
17624305Ssklower 	struct sockaddr *a1;
17724305Ssklower {
17824305Ssklower 
17924305Ssklower 	;
18024305Ssklower }
181