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