xref: /csrg-svn/sbin/XNSrouted/af.c (revision 38687)
124320Ssklower /*
235551Sbostic  * Copyright (c) 1985 The Regents of the University of California.
335551Sbostic  * All rights reserved.
424320Ssklower  *
535551Sbostic  * This file includes significant work done at Cornell University by
635551Sbostic  * Bill Nesheim.  That work included by permission.
735551Sbostic  *
835551Sbostic  * Redistribution and use in source and binary forms are permitted
935551Sbostic  * provided that the above copyright notice and this paragraph are
1035551Sbostic  * duplicated in all such forms and that any documentation,
1135551Sbostic  * advertising materials, and other materials related to such
1235551Sbostic  * distribution and use acknowledge that the software was developed
1335551Sbostic  * by the University of California, Berkeley.  The name of the
1435551Sbostic  * University may not be used to endorse or promote products derived
1535551Sbostic  * from this software without specific prior written permission.
1635551Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1735551Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1835551Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1924320Ssklower  */
2024320Ssklower 
2124305Ssklower #ifndef lint
22*38687Ssklower static char sccsid[] = "@(#)af.c	5.9 (Berkeley) 08/21/89";
2335551Sbostic #endif /* not lint */
2424305Ssklower 
2524305Ssklower #include "defs.h"
2624305Ssklower 
2724305Ssklower /*
2824305Ssklower  * Address family support routines
2924305Ssklower  */
3024305Ssklower int	null_hash(), null_netmatch(), null_output(),
3124305Ssklower 	null_portmatch(), null_portcheck(),
3224305Ssklower 	null_checkhost(), null_ishost(), null_canon();
3324305Ssklower int	xnnet_hash(), xnnet_netmatch(), xnnet_output(),
3433132Sbostic 	xnnet_portmatch(),
3524305Ssklower 	xnnet_checkhost(), xnnet_ishost(), xnnet_canon();
3624305Ssklower #define NIL \
3724305Ssklower 	{ null_hash,		null_netmatch,		null_output, \
3824305Ssklower 	  null_portmatch,	null_portcheck,		null_checkhost, \
3924305Ssklower 	  null_ishost,		null_canon }
4024305Ssklower #define	XNSNET \
4124305Ssklower 	{ xnnet_hash,		xnnet_netmatch,		xnnet_output, \
4224305Ssklower 	  xnnet_portmatch,	xnnet_portmatch,	xnnet_checkhost, \
4324305Ssklower 	  xnnet_ishost,		xnnet_canon }
4424305Ssklower 
4524305Ssklower struct afswitch afswitch[AF_MAX] =
4624305Ssklower 	{ NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL };
4724305Ssklower 
48*38687Ssklower struct sockaddr_ns xnnet_default = { sizeof(struct sockaddr_ns), AF_NS };
4924305Ssklower 
5026173Ssklower union ns_net ns_anynet;
5126173Ssklower union ns_net ns_zeronet;
5226173Ssklower 
5324317Ssklower xnnet_hash(sns, hp)
5424317Ssklower 	register struct sockaddr_ns *sns;
5524305Ssklower 	struct afhash *hp;
5624305Ssklower {
5724317Ssklower 	register long hash = 0;
5824317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
5926173Ssklower 	union ns_net_u net;
6026173Ssklower 
6126173Ssklower 	net.net_e = sns->sns_addr.x_net;
6226173Ssklower 	hp->afh_nethash = net.long_e;
6324317Ssklower 	hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s;
6424317Ssklower 	hp->afh_hosthash = hash;
6524305Ssklower }
6624305Ssklower 
6724305Ssklower xnnet_netmatch(sxn1, sxn2)
6824317Ssklower 	struct sockaddr_ns *sxn1, *sxn2;
6924305Ssklower {
7026173Ssklower 	return (ns_neteq(sxn1->sns_addr, sxn2->sns_addr));
7124305Ssklower }
7224305Ssklower 
7324305Ssklower /*
7424305Ssklower  * Verify the message is from the right port.
7524305Ssklower  */
7624317Ssklower xnnet_portmatch(sns)
7724317Ssklower 	register struct sockaddr_ns *sns;
7824305Ssklower {
7924305Ssklower 
8024317Ssklower 	return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF );
8124305Ssklower }
8224305Ssklower 
8324305Ssklower 
8424305Ssklower /*
8524305Ssklower  * xns output routine.
8624305Ssklower  */
8724305Ssklower #ifdef DEBUG
8824305Ssklower int do_output = 0;
8924305Ssklower #endif
9024317Ssklower xnnet_output(flags, sns, size)
9124317Ssklower 	int flags;
9224317Ssklower 	struct sockaddr_ns *sns;
9324305Ssklower 	int size;
9424305Ssklower {
9524317Ssklower 	struct sockaddr_ns dst;
9624305Ssklower 
9724317Ssklower 	dst = *sns;
9824317Ssklower 	sns = &dst;
9924317Ssklower 	if (sns->sns_addr.x_port == 0)
10024317Ssklower 		sns->sns_addr.x_port = htons(IDPPORT_RIF);
10124305Ssklower #ifdef DEBUG
10224305Ssklower 	if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST)
10324305Ssklower #endif
10424875Ssklower 	/*
10524875Ssklower 	 * Kludge to allow us to get routes out to machines that
10624875Ssklower 	 * don't know their addresses yet; send to that address on
10724875Ssklower 	 * ALL connected nets
10824875Ssklower 	 */
10926173Ssklower 	 if (ns_neteqnn(sns->sns_addr.x_net, ns_zeronet)) {
11024875Ssklower 	 	extern  struct interface *ifnet;
11124875Ssklower 	 	register struct interface *ifp;
11224875Ssklower 
11324875Ssklower 		for (ifp = ifnet; ifp; ifp = ifp->int_next) {
11426173Ssklower 			sns->sns_addr.x_net =
11526173Ssklower 				satons_addr(ifp->int_addr).x_net;
11629377Skarels 			(void) sendto(s, msg, size, flags, sns, sizeof (*sns));
11724875Ssklower 		}
11824875Ssklower 		return;
11924875Ssklower 	}
12024875Ssklower 
12129377Skarels 	(void) sendto(s, msg, size, flags, sns, sizeof (*sns));
12224305Ssklower }
12324305Ssklower 
12424305Ssklower /*
12524320Ssklower  * Return 1 if we want this route.
12624320Ssklower  * We use this to disallow route net G entries for one for multiple
12724320Ssklower  * point to point links.
12824305Ssklower  */
12924317Ssklower xnnet_checkhost(sns)
13024317Ssklower 	struct sockaddr_ns *sns;
13124305Ssklower {
13224320Ssklower 	register struct interface *ifp = if_ifwithnet(sns);
13324320Ssklower 	/*
13424320Ssklower 	 * We want this route if there is no more than one
13524320Ssklower 	 * point to point interface with this network.
13624320Ssklower 	 */
13724320Ssklower 	if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1);
13824320Ssklower 	return (ifp->int_sq.n == ifp->int_sq.p);
13924305Ssklower }
14024305Ssklower 
14124305Ssklower /*
14224305Ssklower  * Return 1 if the address is
14324305Ssklower  * for a host, 0 for a network.
14424305Ssklower  */
14524317Ssklower xnnet_ishost(sns)
14624317Ssklower struct sockaddr_ns *sns;
14724305Ssklower {
14824317Ssklower 	register u_short *s = sns->sns_addr.x_host.s_host;
14924305Ssklower 
15024317Ssklower 	if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff))
15124317Ssklower 		return (0);
15224317Ssklower 	else
15324317Ssklower 		return (1);
15424305Ssklower }
15524305Ssklower 
15624317Ssklower xnnet_canon(sns)
15724317Ssklower 	struct sockaddr_ns *sns;
15824305Ssklower {
15924305Ssklower 
16024317Ssklower 	sns->sns_addr.x_port = 0;
16124305Ssklower }
16224305Ssklower 
16324305Ssklower /*ARGSUSED*/
16424305Ssklower null_hash(addr, hp)
16524305Ssklower 	struct sockaddr *addr;
16624305Ssklower 	struct afhash *hp;
16724305Ssklower {
16824305Ssklower 
16924305Ssklower 	hp->afh_nethash = hp->afh_hosthash = 0;
17024305Ssklower }
17124305Ssklower 
17224305Ssklower /*ARGSUSED*/
17324305Ssklower null_netmatch(a1, a2)
17424305Ssklower 	struct sockaddr *a1, *a2;
17524305Ssklower {
17624305Ssklower 
17724305Ssklower 	return (0);
17824305Ssklower }
17924305Ssklower 
18024305Ssklower /*ARGSUSED*/
18124305Ssklower null_output(s, f, a1, n)
18224305Ssklower 	int s, f;
18324305Ssklower 	struct sockaddr *a1;
18424305Ssklower 	int n;
18524305Ssklower {
18624305Ssklower 
18724305Ssklower 	;
18824305Ssklower }
18924305Ssklower 
19024305Ssklower /*ARGSUSED*/
19124305Ssklower null_portmatch(a1)
19224305Ssklower 	struct sockaddr *a1;
19324305Ssklower {
19424305Ssklower 
19524305Ssklower 	return (0);
19624305Ssklower }
19724305Ssklower 
19824305Ssklower /*ARGSUSED*/
19924305Ssklower null_portcheck(a1)
20024305Ssklower 	struct sockaddr *a1;
20124305Ssklower {
20224305Ssklower 
20324305Ssklower 	return (0);
20424305Ssklower }
20524305Ssklower 
20624305Ssklower /*ARGSUSED*/
20724305Ssklower null_ishost(a1)
20824305Ssklower 	struct sockaddr *a1;
20924305Ssklower {
21024305Ssklower 
21124305Ssklower 	return (0);
21224305Ssklower }
21324305Ssklower 
21424305Ssklower /*ARGSUSED*/
21524305Ssklower null_checkhost(a1)
21624305Ssklower 	struct sockaddr *a1;
21724305Ssklower {
21824305Ssklower 
21924305Ssklower 	return (0);
22024305Ssklower }
22124305Ssklower 
22224305Ssklower /*ARGSUSED*/
22324305Ssklower null_canon(a1)
22424305Ssklower 	struct sockaddr *a1;
22524305Ssklower {
22624305Ssklower 
22724305Ssklower 	;
22824305Ssklower }
229