124320Ssklower /*
2*61474Sbostic * Copyright (c) 1985, 1993
3*61474Sbostic * The Regents of the University of California. All rights reserved.
424320Ssklower *
535551Sbostic * This file includes significant work done at Cornell University by
635551Sbostic * Bill Nesheim. That work included by permission.
735551Sbostic *
842698Sbostic * %sccs.include.redist.c%
924320Ssklower */
1024320Ssklower
1124305Ssklower #ifndef lint
12*61474Sbostic static char sccsid[] = "@(#)af.c 8.1 (Berkeley) 06/05/93";
1335551Sbostic #endif /* not lint */
1424305Ssklower
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(),
2433132Sbostic 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
3838687Ssklower struct sockaddr_ns xnnet_default = { sizeof(struct sockaddr_ns), AF_NS };
3924305Ssklower
4026173Ssklower union ns_net ns_anynet;
4126173Ssklower union ns_net ns_zeronet;
4226173Ssklower
xnnet_hash(sns,hp)4324317Ssklower xnnet_hash(sns, hp)
4424317Ssklower register struct sockaddr_ns *sns;
4524305Ssklower struct afhash *hp;
4624305Ssklower {
4724317Ssklower register long hash = 0;
4824317Ssklower register u_short *s = sns->sns_addr.x_host.s_host;
4926173Ssklower union ns_net_u net;
5026173Ssklower
5126173Ssklower net.net_e = sns->sns_addr.x_net;
5226173Ssklower hp->afh_nethash = net.long_e;
5324317Ssklower hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s;
5424317Ssklower hp->afh_hosthash = hash;
5524305Ssklower }
5624305Ssklower
5724305Ssklower xnnet_netmatch(sxn1, sxn2)
5824317Ssklower struct sockaddr_ns *sxn1, *sxn2;
5924305Ssklower {
6026173Ssklower return (ns_neteq(sxn1->sns_addr, sxn2->sns_addr));
6124305Ssklower }
6224305Ssklower
6324305Ssklower /*
6424305Ssklower * Verify the message is from the right port.
6524305Ssklower */
xnnet_portmatch(sns)6624317Ssklower xnnet_portmatch(sns)
6724317Ssklower register struct sockaddr_ns *sns;
6824305Ssklower {
6924305Ssklower
7024317Ssklower return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF );
7124305Ssklower }
7224305Ssklower
7324305Ssklower
7424305Ssklower /*
7524305Ssklower * xns output routine.
7624305Ssklower */
7724305Ssklower #ifdef DEBUG
7824305Ssklower int do_output = 0;
7924305Ssklower #endif
xnnet_output(flags,sns,size)8024317Ssklower xnnet_output(flags, sns, size)
8124317Ssklower int flags;
8224317Ssklower struct sockaddr_ns *sns;
8324305Ssklower int size;
8424305Ssklower {
8524317Ssklower struct sockaddr_ns dst;
8624305Ssklower
8724317Ssklower dst = *sns;
8824317Ssklower sns = &dst;
8924317Ssklower if (sns->sns_addr.x_port == 0)
9024317Ssklower sns->sns_addr.x_port = htons(IDPPORT_RIF);
9124305Ssklower #ifdef DEBUG
9224305Ssklower if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST)
9324305Ssklower #endif
9424875Ssklower /*
9524875Ssklower * Kludge to allow us to get routes out to machines that
9624875Ssklower * don't know their addresses yet; send to that address on
9724875Ssklower * ALL connected nets
9824875Ssklower */
9926173Ssklower if (ns_neteqnn(sns->sns_addr.x_net, ns_zeronet)) {
10024875Ssklower extern struct interface *ifnet;
10124875Ssklower register struct interface *ifp;
10224875Ssklower
10324875Ssklower for (ifp = ifnet; ifp; ifp = ifp->int_next) {
10426173Ssklower sns->sns_addr.x_net =
10526173Ssklower satons_addr(ifp->int_addr).x_net;
10646702Sbostic (void) sendto(s, msg, size, flags,
10746702Sbostic (struct sockaddr *)sns, sizeof (*sns));
10824875Ssklower }
10924875Ssklower return;
11024875Ssklower }
11124875Ssklower
11246702Sbostic (void) sendto(s, msg, size, flags,
11346702Sbostic (struct sockaddr *)sns, sizeof (*sns));
11424305Ssklower }
11524305Ssklower
11624305Ssklower /*
11724320Ssklower * Return 1 if we want this route.
11824320Ssklower * We use this to disallow route net G entries for one for multiple
11924320Ssklower * point to point links.
12024305Ssklower */
12124317Ssklower xnnet_checkhost(sns)
12224317Ssklower struct sockaddr_ns *sns;
12324305Ssklower {
12424320Ssklower register struct interface *ifp = if_ifwithnet(sns);
12524320Ssklower /*
12624320Ssklower * We want this route if there is no more than one
12724320Ssklower * point to point interface with this network.
12824320Ssklower */
12924320Ssklower if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1);
13024320Ssklower return (ifp->int_sq.n == ifp->int_sq.p);
13124305Ssklower }
13224305Ssklower
13324305Ssklower /*
13424305Ssklower * Return 1 if the address is
13524305Ssklower * for a host, 0 for a network.
13624305Ssklower */
13724317Ssklower xnnet_ishost(sns)
13824317Ssklower struct sockaddr_ns *sns;
13924305Ssklower {
14024317Ssklower register u_short *s = sns->sns_addr.x_host.s_host;
14124305Ssklower
14224317Ssklower if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff))
14324317Ssklower return (0);
14424317Ssklower else
14524317Ssklower return (1);
14624305Ssklower }
14724305Ssklower
14824317Ssklower xnnet_canon(sns)
14924317Ssklower struct sockaddr_ns *sns;
15024305Ssklower {
15124305Ssklower
15224317Ssklower sns->sns_addr.x_port = 0;
15324305Ssklower }
15424305Ssklower
15524305Ssklower /*ARGSUSED*/
15624305Ssklower null_hash(addr, hp)
15724305Ssklower struct sockaddr *addr;
15824305Ssklower struct afhash *hp;
15924305Ssklower {
16024305Ssklower
16124305Ssklower hp->afh_nethash = hp->afh_hosthash = 0;
16224305Ssklower }
16324305Ssklower
16424305Ssklower /*ARGSUSED*/
16524305Ssklower null_netmatch(a1, a2)
16624305Ssklower struct sockaddr *a1, *a2;
16724305Ssklower {
16824305Ssklower
16924305Ssklower return (0);
17024305Ssklower }
17124305Ssklower
17224305Ssklower /*ARGSUSED*/
null_output(s,f,a1,n)17324305Ssklower null_output(s, f, a1, n)
17424305Ssklower int s, f;
17524305Ssklower struct sockaddr *a1;
17624305Ssklower int n;
17724305Ssklower {
17824305Ssklower
17924305Ssklower ;
18024305Ssklower }
18124305Ssklower
18224305Ssklower /*ARGSUSED*/
18324305Ssklower null_portmatch(a1)
18424305Ssklower struct sockaddr *a1;
18524305Ssklower {
18624305Ssklower
18724305Ssklower return (0);
18824305Ssklower }
18924305Ssklower
19024305Ssklower /*ARGSUSED*/
19124305Ssklower null_portcheck(a1)
19224305Ssklower struct sockaddr *a1;
19324305Ssklower {
19424305Ssklower
19524305Ssklower return (0);
19624305Ssklower }
19724305Ssklower
19824305Ssklower /*ARGSUSED*/
19924305Ssklower null_ishost(a1)
20024305Ssklower struct sockaddr *a1;
20124305Ssklower {
20224305Ssklower
20324305Ssklower return (0);
20424305Ssklower }
20524305Ssklower
20624305Ssklower /*ARGSUSED*/
20724305Ssklower null_checkhost(a1)
20824305Ssklower struct sockaddr *a1;
20924305Ssklower {
21024305Ssklower
21124305Ssklower return (0);
21224305Ssklower }
21324305Ssklower
21424305Ssklower /*ARGSUSED*/
21524305Ssklower null_canon(a1)
21624305Ssklower struct sockaddr *a1;
21724305Ssklower {
21824305Ssklower
21924305Ssklower ;
22024305Ssklower }
221