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