xref: /csrg-svn/sbin/XNSrouted/af.c (revision 24875)
124320Ssklower /*
224320Ssklower  * Copyright (c) 1985 Regents of the University of California.
324320Ssklower  * All rights reserved.  The Berkeley software License Agreement
424320Ssklower  * specifies the terms and conditions for redistribution.
524320Ssklower  *
624320Ssklower  * This file include significant work done at Cornell University
724320Ssklower  * by Bill Nesheim.  That work included by permission.
824320Ssklower  */
924320Ssklower 
1024305Ssklower #ifndef lint
11*24875Ssklower static char sccsid[] = "@(#)af.c	5.4 (Berkeley) 09/17/85";
1224320Ssklower #endif not lint
1324305Ssklower 
1424320Ssklower 
1524305Ssklower #include "defs.h"
1624305Ssklower 
1724305Ssklower /*
1824305Ssklower  * Address family support routines
1924305Ssklower  */
2024305Ssklower int	null_hash(), null_netmatch(), null_output(),
2124305Ssklower 	null_portmatch(), null_portcheck(),
2224305Ssklower 	null_checkhost(), null_ishost(), null_canon();
2324305Ssklower int	xnnet_hash(), xnnet_netmatch(), xnnet_output(),
2424305Ssklower 	xnnet_portmatch();
2524305Ssklower 	xnnet_checkhost(), xnnet_ishost(), xnnet_canon();
2624305Ssklower #define NIL \
2724305Ssklower 	{ null_hash,		null_netmatch,		null_output, \
2824305Ssklower 	  null_portmatch,	null_portcheck,		null_checkhost, \
2924305Ssklower 	  null_ishost,		null_canon }
3024305Ssklower #define	XNSNET \
3124305Ssklower 	{ xnnet_hash,		xnnet_netmatch,		xnnet_output, \
3224305Ssklower 	  xnnet_portmatch,	xnnet_portmatch,	xnnet_checkhost, \
3324305Ssklower 	  xnnet_ishost,		xnnet_canon }
3424305Ssklower 
3524305Ssklower struct afswitch afswitch[AF_MAX] =
3624305Ssklower 	{ NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL };
3724305Ssklower 
3824317Ssklower struct sockaddr_ns xnnet_default = { AF_NS };
3924305Ssklower 
4024317Ssklower xnnet_hash(sns, hp)
4124317Ssklower 	register struct sockaddr_ns *sns;
4224305Ssklower 	struct afhash *hp;
4324305Ssklower {
4424317Ssklower 	register long hash = 0;
4524317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
4624317Ssklower 	hp->afh_nethash = xnnet(sns->sns_addr.x_net);
4724317Ssklower 	hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s;
4824317Ssklower 	hp->afh_hosthash = hash;
4924305Ssklower }
5024305Ssklower 
5124305Ssklower xnnet_netmatch(sxn1, sxn2)
5224317Ssklower 	struct sockaddr_ns *sxn1, *sxn2;
5324305Ssklower {
5424305Ssklower 
5524317Ssklower 	return (xnnet(sxn1->sns_addr.x_net) == xnnet(sxn2->sns_addr.x_net));
5624305Ssklower }
5724305Ssklower 
5824305Ssklower /*
5924305Ssklower  * Verify the message is from the right port.
6024305Ssklower  */
6124317Ssklower xnnet_portmatch(sns)
6224317Ssklower 	register struct sockaddr_ns *sns;
6324305Ssklower {
6424305Ssklower 
6524317Ssklower 	return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF );
6624305Ssklower }
6724305Ssklower 
6824305Ssklower 
6924305Ssklower /*
7024305Ssklower  * xns output routine.
7124305Ssklower  */
7224305Ssklower #ifdef DEBUG
7324305Ssklower int do_output = 0;
7424305Ssklower #endif
7524317Ssklower xnnet_output(flags, sns, size)
7624317Ssklower 	int flags;
7724317Ssklower 	struct sockaddr_ns *sns;
7824305Ssklower 	int size;
7924305Ssklower {
8024317Ssklower 	struct sockaddr_ns dst;
8124305Ssklower 
8224317Ssklower 	dst = *sns;
8324317Ssklower 	sns = &dst;
8424317Ssklower 	if (sns->sns_addr.x_port == 0)
8524317Ssklower 		sns->sns_addr.x_port = htons(IDPPORT_RIF);
8624305Ssklower #ifdef DEBUG
8724305Ssklower 	if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST)
8824305Ssklower #endif
89*24875Ssklower 	/*
90*24875Ssklower 	 * Kludge to allow us to get routes out to machines that
91*24875Ssklower 	 * don't know their addresses yet; send to that address on
92*24875Ssklower 	 * ALL connected nets
93*24875Ssklower 	 */
94*24875Ssklower 	 if (ns_netof(sns->sns_addr) == 0L) {
95*24875Ssklower 	 	extern  struct interface *ifnet;
96*24875Ssklower 	 	register struct interface *ifp;
97*24875Ssklower 
98*24875Ssklower 		for (ifp = ifnet; ifp; ifp = ifp->int_next) {
99*24875Ssklower 			ns_netof(sns->sns_addr) =
100*24875Ssklower 				ns_netof(((struct sockaddr_ns *)&ifp->int_addr)->sns_addr);
101*24875Ssklower 			if (sendto(s, msg, size, flags, sns, sizeof (*sns)) < 0)
102*24875Ssklower 				syslog(LOG_ERR,"sendto: %m");
103*24875Ssklower 		}
104*24875Ssklower 		return;
105*24875Ssklower 	}
106*24875Ssklower 
10724317Ssklower 	if (sendto(s, msg, size, flags, sns, sizeof (*sns)) < 0)
108*24875Ssklower 		syslog(LOG_ERR,"sendto: %m");
10924305Ssklower }
11024305Ssklower 
11124305Ssklower /*
11224320Ssklower  * Return 1 if we want this route.
11324320Ssklower  * We use this to disallow route net G entries for one for multiple
11424320Ssklower  * point to point links.
11524305Ssklower  */
11624317Ssklower xnnet_checkhost(sns)
11724317Ssklower 	struct sockaddr_ns *sns;
11824305Ssklower {
11924320Ssklower 	register struct interface *ifp = if_ifwithnet(sns);
12024320Ssklower 	/*
12124320Ssklower 	 * We want this route if there is no more than one
12224320Ssklower 	 * point to point interface with this network.
12324320Ssklower 	 */
12424320Ssklower 	if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1);
12524320Ssklower 	return (ifp->int_sq.n == ifp->int_sq.p);
12624305Ssklower }
12724305Ssklower 
12824305Ssklower /*
12924305Ssklower  * Return 1 if the address is
13024305Ssklower  * for a host, 0 for a network.
13124305Ssklower  */
13224317Ssklower xnnet_ishost(sns)
13324317Ssklower struct sockaddr_ns *sns;
13424305Ssklower {
13524317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
13624305Ssklower 
13724317Ssklower 	if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff))
13824317Ssklower 		return (0);
13924317Ssklower 	else
14024317Ssklower 		return (1);
14124305Ssklower }
14224305Ssklower 
14324317Ssklower xnnet_canon(sns)
14424317Ssklower 	struct sockaddr_ns *sns;
14524305Ssklower {
14624305Ssklower 
14724317Ssklower 	sns->sns_addr.x_port = 0;
14824305Ssklower }
14924305Ssklower 
15024305Ssklower /*ARGSUSED*/
15124305Ssklower null_hash(addr, hp)
15224305Ssklower 	struct sockaddr *addr;
15324305Ssklower 	struct afhash *hp;
15424305Ssklower {
15524305Ssklower 
15624305Ssklower 	hp->afh_nethash = hp->afh_hosthash = 0;
15724305Ssklower }
15824305Ssklower 
15924305Ssklower /*ARGSUSED*/
16024305Ssklower null_netmatch(a1, a2)
16124305Ssklower 	struct sockaddr *a1, *a2;
16224305Ssklower {
16324305Ssklower 
16424305Ssklower 	return (0);
16524305Ssklower }
16624305Ssklower 
16724305Ssklower /*ARGSUSED*/
16824305Ssklower null_output(s, f, a1, n)
16924305Ssklower 	int s, f;
17024305Ssklower 	struct sockaddr *a1;
17124305Ssklower 	int n;
17224305Ssklower {
17324305Ssklower 
17424305Ssklower 	;
17524305Ssklower }
17624305Ssklower 
17724305Ssklower /*ARGSUSED*/
17824305Ssklower null_portmatch(a1)
17924305Ssklower 	struct sockaddr *a1;
18024305Ssklower {
18124305Ssklower 
18224305Ssklower 	return (0);
18324305Ssklower }
18424305Ssklower 
18524305Ssklower /*ARGSUSED*/
18624305Ssklower null_portcheck(a1)
18724305Ssklower 	struct sockaddr *a1;
18824305Ssklower {
18924305Ssklower 
19024305Ssklower 	return (0);
19124305Ssklower }
19224305Ssklower 
19324305Ssklower /*ARGSUSED*/
19424305Ssklower null_ishost(a1)
19524305Ssklower 	struct sockaddr *a1;
19624305Ssklower {
19724305Ssklower 
19824305Ssklower 	return (0);
19924305Ssklower }
20024305Ssklower 
20124305Ssklower /*ARGSUSED*/
20224305Ssklower null_checkhost(a1)
20324305Ssklower 	struct sockaddr *a1;
20424305Ssklower {
20524305Ssklower 
20624305Ssklower 	return (0);
20724305Ssklower }
20824305Ssklower 
20924305Ssklower /*ARGSUSED*/
21024305Ssklower null_canon(a1)
21124305Ssklower 	struct sockaddr *a1;
21224305Ssklower {
21324305Ssklower 
21424305Ssklower 	;
21524305Ssklower }
216