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 * 8*42698Sbostic * %sccs.include.redist.c% 924320Ssklower */ 1024320Ssklower 1124305Ssklower #ifndef lint 12*42698Sbostic static char sccsid[] = "@(#)af.c 5.10 (Berkeley) 06/01/90"; 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 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 */ 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 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; 10629377Skarels (void) sendto(s, msg, size, flags, sns, sizeof (*sns)); 10724875Ssklower } 10824875Ssklower return; 10924875Ssklower } 11024875Ssklower 11129377Skarels (void) sendto(s, msg, size, flags, sns, sizeof (*sns)); 11224305Ssklower } 11324305Ssklower 11424305Ssklower /* 11524320Ssklower * Return 1 if we want this route. 11624320Ssklower * We use this to disallow route net G entries for one for multiple 11724320Ssklower * point to point links. 11824305Ssklower */ 11924317Ssklower xnnet_checkhost(sns) 12024317Ssklower struct sockaddr_ns *sns; 12124305Ssklower { 12224320Ssklower register struct interface *ifp = if_ifwithnet(sns); 12324320Ssklower /* 12424320Ssklower * We want this route if there is no more than one 12524320Ssklower * point to point interface with this network. 12624320Ssklower */ 12724320Ssklower if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1); 12824320Ssklower return (ifp->int_sq.n == ifp->int_sq.p); 12924305Ssklower } 13024305Ssklower 13124305Ssklower /* 13224305Ssklower * Return 1 if the address is 13324305Ssklower * for a host, 0 for a network. 13424305Ssklower */ 13524317Ssklower xnnet_ishost(sns) 13624317Ssklower struct sockaddr_ns *sns; 13724305Ssklower { 13824317Ssklower register u_short *s = sns->sns_addr.x_host.s_host; 13924305Ssklower 14024317Ssklower if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff)) 14124317Ssklower return (0); 14224317Ssklower else 14324317Ssklower return (1); 14424305Ssklower } 14524305Ssklower 14624317Ssklower xnnet_canon(sns) 14724317Ssklower struct sockaddr_ns *sns; 14824305Ssklower { 14924305Ssklower 15024317Ssklower sns->sns_addr.x_port = 0; 15124305Ssklower } 15224305Ssklower 15324305Ssklower /*ARGSUSED*/ 15424305Ssklower null_hash(addr, hp) 15524305Ssklower struct sockaddr *addr; 15624305Ssklower struct afhash *hp; 15724305Ssklower { 15824305Ssklower 15924305Ssklower hp->afh_nethash = hp->afh_hosthash = 0; 16024305Ssklower } 16124305Ssklower 16224305Ssklower /*ARGSUSED*/ 16324305Ssklower null_netmatch(a1, a2) 16424305Ssklower struct sockaddr *a1, *a2; 16524305Ssklower { 16624305Ssklower 16724305Ssklower return (0); 16824305Ssklower } 16924305Ssklower 17024305Ssklower /*ARGSUSED*/ 17124305Ssklower null_output(s, f, a1, n) 17224305Ssklower int s, f; 17324305Ssklower struct sockaddr *a1; 17424305Ssklower int n; 17524305Ssklower { 17624305Ssklower 17724305Ssklower ; 17824305Ssklower } 17924305Ssklower 18024305Ssklower /*ARGSUSED*/ 18124305Ssklower null_portmatch(a1) 18224305Ssklower struct sockaddr *a1; 18324305Ssklower { 18424305Ssklower 18524305Ssklower return (0); 18624305Ssklower } 18724305Ssklower 18824305Ssklower /*ARGSUSED*/ 18924305Ssklower null_portcheck(a1) 19024305Ssklower struct sockaddr *a1; 19124305Ssklower { 19224305Ssklower 19324305Ssklower return (0); 19424305Ssklower } 19524305Ssklower 19624305Ssklower /*ARGSUSED*/ 19724305Ssklower null_ishost(a1) 19824305Ssklower struct sockaddr *a1; 19924305Ssklower { 20024305Ssklower 20124305Ssklower return (0); 20224305Ssklower } 20324305Ssklower 20424305Ssklower /*ARGSUSED*/ 20524305Ssklower null_checkhost(a1) 20624305Ssklower struct sockaddr *a1; 20724305Ssklower { 20824305Ssklower 20924305Ssklower return (0); 21024305Ssklower } 21124305Ssklower 21224305Ssklower /*ARGSUSED*/ 21324305Ssklower null_canon(a1) 21424305Ssklower struct sockaddr *a1; 21524305Ssklower { 21624305Ssklower 21724305Ssklower ; 21824305Ssklower } 219