124305Ssklower #ifndef lint 224305Ssklower static char rcsid[] = "$Header$"; 324305Ssklower #endif 424305Ssklower 524305Ssklower #include "defs.h" 624305Ssklower 724305Ssklower /* 824305Ssklower * Address family support routines 924305Ssklower */ 1024305Ssklower int null_hash(), null_netmatch(), null_output(), 1124305Ssklower null_portmatch(), null_portcheck(), 1224305Ssklower null_checkhost(), null_ishost(), null_canon(); 1324305Ssklower int xnnet_hash(), xnnet_netmatch(), xnnet_output(), 1424305Ssklower xnnet_portmatch(); 1524305Ssklower xnnet_checkhost(), xnnet_ishost(), xnnet_canon(); 1624305Ssklower #define NIL \ 1724305Ssklower { null_hash, null_netmatch, null_output, \ 1824305Ssklower null_portmatch, null_portcheck, null_checkhost, \ 1924305Ssklower null_ishost, null_canon } 2024305Ssklower #define XNSNET \ 2124305Ssklower { xnnet_hash, xnnet_netmatch, xnnet_output, \ 2224305Ssklower xnnet_portmatch, xnnet_portmatch, xnnet_checkhost, \ 2324305Ssklower xnnet_ishost, xnnet_canon } 2424305Ssklower 2524305Ssklower struct afswitch afswitch[AF_MAX] = 2624305Ssklower { NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL }; 2724305Ssklower 28*24317Ssklower struct sockaddr_ns xnnet_default = { AF_NS }; 2924305Ssklower 30*24317Ssklower xnnet_hash(sns, hp) 31*24317Ssklower register struct sockaddr_ns *sns; 3224305Ssklower struct afhash *hp; 3324305Ssklower { 34*24317Ssklower register long hash = 0; 35*24317Ssklower register u_short *s = sns->sns_addr.x_host.s_host; 36*24317Ssklower hp->afh_nethash = xnnet(sns->sns_addr.x_net); 37*24317Ssklower hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s; 38*24317Ssklower hp->afh_hosthash = hash; 3924305Ssklower } 4024305Ssklower 4124305Ssklower xnnet_netmatch(sxn1, sxn2) 42*24317Ssklower struct sockaddr_ns *sxn1, *sxn2; 4324305Ssklower { 4424305Ssklower 45*24317Ssklower return (xnnet(sxn1->sns_addr.x_net) == xnnet(sxn2->sns_addr.x_net)); 4624305Ssklower } 4724305Ssklower 4824305Ssklower /* 4924305Ssklower * Verify the message is from the right port. 5024305Ssklower */ 51*24317Ssklower xnnet_portmatch(sns) 52*24317Ssklower register struct sockaddr_ns *sns; 5324305Ssklower { 5424305Ssklower 55*24317Ssklower return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF ); 5624305Ssklower } 5724305Ssklower 5824305Ssklower 5924305Ssklower /* 6024305Ssklower * xns output routine. 6124305Ssklower */ 6224305Ssklower #ifdef DEBUG 6324305Ssklower int do_output = 0; 6424305Ssklower #endif 65*24317Ssklower xnnet_output(flags, sns, size) 66*24317Ssklower int flags; 67*24317Ssklower struct sockaddr_ns *sns; 6824305Ssklower int size; 6924305Ssklower { 70*24317Ssklower struct sockaddr_ns dst; 7124305Ssklower 72*24317Ssklower dst = *sns; 73*24317Ssklower sns = &dst; 74*24317Ssklower if (sns->sns_addr.x_port == 0) 75*24317Ssklower sns->sns_addr.x_port = htons(IDPPORT_RIF); 7624305Ssklower #ifdef DEBUG 7724305Ssklower if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST) 7824305Ssklower #endif 79*24317Ssklower if (sendto(s, msg, size, flags, sns, sizeof (*sns)) < 0) 8024305Ssklower perror("sendto"); 8124305Ssklower } 8224305Ssklower 8324305Ssklower /* 8424305Ssklower * Return 1 if the address is believed 8524305Ssklower * -- THIS IS A KLUDGE. 8624305Ssklower */ 87*24317Ssklower xnnet_checkhost(sns) 88*24317Ssklower struct sockaddr_ns *sns; 8924305Ssklower { 9024305Ssklower return (1); 9124305Ssklower } 9224305Ssklower 9324305Ssklower /* 9424305Ssklower * Return 1 if the address is 9524305Ssklower * for a host, 0 for a network. 9624305Ssklower */ 97*24317Ssklower xnnet_ishost(sns) 98*24317Ssklower struct sockaddr_ns *sns; 9924305Ssklower { 100*24317Ssklower register u_short *s = sns->sns_addr.x_host.s_host; 10124305Ssklower 102*24317Ssklower if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff)) 103*24317Ssklower return (0); 104*24317Ssklower else 105*24317Ssklower return (1); 10624305Ssklower } 10724305Ssklower 108*24317Ssklower xnnet_canon(sns) 109*24317Ssklower struct sockaddr_ns *sns; 11024305Ssklower { 11124305Ssklower 112*24317Ssklower sns->sns_addr.x_port = 0; 11324305Ssklower } 11424305Ssklower 11524305Ssklower /*ARGSUSED*/ 11624305Ssklower null_hash(addr, hp) 11724305Ssklower struct sockaddr *addr; 11824305Ssklower struct afhash *hp; 11924305Ssklower { 12024305Ssklower 12124305Ssklower hp->afh_nethash = hp->afh_hosthash = 0; 12224305Ssklower } 12324305Ssklower 12424305Ssklower /*ARGSUSED*/ 12524305Ssklower null_netmatch(a1, a2) 12624305Ssklower struct sockaddr *a1, *a2; 12724305Ssklower { 12824305Ssklower 12924305Ssklower return (0); 13024305Ssklower } 13124305Ssklower 13224305Ssklower /*ARGSUSED*/ 13324305Ssklower null_output(s, f, a1, n) 13424305Ssklower int s, f; 13524305Ssklower struct sockaddr *a1; 13624305Ssklower int n; 13724305Ssklower { 13824305Ssklower 13924305Ssklower ; 14024305Ssklower } 14124305Ssklower 14224305Ssklower /*ARGSUSED*/ 14324305Ssklower null_portmatch(a1) 14424305Ssklower struct sockaddr *a1; 14524305Ssklower { 14624305Ssklower 14724305Ssklower return (0); 14824305Ssklower } 14924305Ssklower 15024305Ssklower /*ARGSUSED*/ 15124305Ssklower null_portcheck(a1) 15224305Ssklower struct sockaddr *a1; 15324305Ssklower { 15424305Ssklower 15524305Ssklower return (0); 15624305Ssklower } 15724305Ssklower 15824305Ssklower /*ARGSUSED*/ 15924305Ssklower null_ishost(a1) 16024305Ssklower struct sockaddr *a1; 16124305Ssklower { 16224305Ssklower 16324305Ssklower return (0); 16424305Ssklower } 16524305Ssklower 16624305Ssklower /*ARGSUSED*/ 16724305Ssklower null_checkhost(a1) 16824305Ssklower struct sockaddr *a1; 16924305Ssklower { 17024305Ssklower 17124305Ssklower return (0); 17224305Ssklower } 17324305Ssklower 17424305Ssklower /*ARGSUSED*/ 17524305Ssklower null_canon(a1) 17624305Ssklower struct sockaddr *a1; 17724305Ssklower { 17824305Ssklower 17924305Ssklower ; 18024305Ssklower } 181