1 /* 2 * Copyright (c) 1985 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * This file include significant work done at Cornell University 7 * by Bill Nesheim. That work included by permission. 8 */ 9 10 #ifndef lint 11 static char sccsid[] = "@(#)af.c 5.7 (Berkeley) 12/26/87"; 12 #endif not lint 13 14 15 #include "defs.h" 16 17 /* 18 * Address family support routines 19 */ 20 int null_hash(), null_netmatch(), null_output(), 21 null_portmatch(), null_portcheck(), 22 null_checkhost(), null_ishost(), null_canon(); 23 int xnnet_hash(), xnnet_netmatch(), xnnet_output(), 24 xnnet_portmatch(), 25 xnnet_checkhost(), xnnet_ishost(), xnnet_canon(); 26 #define NIL \ 27 { null_hash, null_netmatch, null_output, \ 28 null_portmatch, null_portcheck, null_checkhost, \ 29 null_ishost, null_canon } 30 #define XNSNET \ 31 { xnnet_hash, xnnet_netmatch, xnnet_output, \ 32 xnnet_portmatch, xnnet_portmatch, xnnet_checkhost, \ 33 xnnet_ishost, xnnet_canon } 34 35 struct afswitch afswitch[AF_MAX] = 36 { NIL, NIL, NIL, NIL, NIL, NIL, XNSNET, NIL, NIL, NIL, NIL }; 37 38 struct sockaddr_ns xnnet_default = { AF_NS }; 39 40 union ns_net ns_anynet; 41 union ns_net ns_zeronet; 42 43 xnnet_hash(sns, hp) 44 register struct sockaddr_ns *sns; 45 struct afhash *hp; 46 { 47 register long hash = 0; 48 register u_short *s = sns->sns_addr.x_host.s_host; 49 union ns_net_u net; 50 51 net.net_e = sns->sns_addr.x_net; 52 hp->afh_nethash = net.long_e; 53 hash = *s++; hash <<= 8; hash += *s++; hash <<= 8; hash += *s; 54 hp->afh_hosthash = hash; 55 } 56 57 xnnet_netmatch(sxn1, sxn2) 58 struct sockaddr_ns *sxn1, *sxn2; 59 { 60 return (ns_neteq(sxn1->sns_addr, sxn2->sns_addr)); 61 } 62 63 /* 64 * Verify the message is from the right port. 65 */ 66 xnnet_portmatch(sns) 67 register struct sockaddr_ns *sns; 68 { 69 70 return (ntohs(sns->sns_addr.x_port) == IDPPORT_RIF ); 71 } 72 73 74 /* 75 * xns output routine. 76 */ 77 #ifdef DEBUG 78 int do_output = 0; 79 #endif 80 xnnet_output(flags, sns, size) 81 int flags; 82 struct sockaddr_ns *sns; 83 int size; 84 { 85 struct sockaddr_ns dst; 86 87 dst = *sns; 88 sns = &dst; 89 if (sns->sns_addr.x_port == 0) 90 sns->sns_addr.x_port = htons(IDPPORT_RIF); 91 #ifdef DEBUG 92 if(do_output || ntohs(msg->rip_cmd) == RIPCMD_REQUEST) 93 #endif 94 /* 95 * Kludge to allow us to get routes out to machines that 96 * don't know their addresses yet; send to that address on 97 * ALL connected nets 98 */ 99 if (ns_neteqnn(sns->sns_addr.x_net, ns_zeronet)) { 100 extern struct interface *ifnet; 101 register struct interface *ifp; 102 103 for (ifp = ifnet; ifp; ifp = ifp->int_next) { 104 sns->sns_addr.x_net = 105 satons_addr(ifp->int_addr).x_net; 106 (void) sendto(s, msg, size, flags, sns, sizeof (*sns)); 107 } 108 return; 109 } 110 111 (void) sendto(s, msg, size, flags, sns, sizeof (*sns)); 112 } 113 114 /* 115 * Return 1 if we want this route. 116 * We use this to disallow route net G entries for one for multiple 117 * point to point links. 118 */ 119 xnnet_checkhost(sns) 120 struct sockaddr_ns *sns; 121 { 122 register struct interface *ifp = if_ifwithnet(sns); 123 /* 124 * We want this route if there is no more than one 125 * point to point interface with this network. 126 */ 127 if (ifp == 0 || (ifp->int_flags & IFF_POINTOPOINT)==0) return (1); 128 return (ifp->int_sq.n == ifp->int_sq.p); 129 } 130 131 /* 132 * Return 1 if the address is 133 * for a host, 0 for a network. 134 */ 135 xnnet_ishost(sns) 136 struct sockaddr_ns *sns; 137 { 138 register u_short *s = sns->sns_addr.x_host.s_host; 139 140 if ((s[0]==0xffff) && (s[1]==0xffff) && (s[2]==0xffff)) 141 return (0); 142 else 143 return (1); 144 } 145 146 xnnet_canon(sns) 147 struct sockaddr_ns *sns; 148 { 149 150 sns->sns_addr.x_port = 0; 151 } 152 153 /*ARGSUSED*/ 154 null_hash(addr, hp) 155 struct sockaddr *addr; 156 struct afhash *hp; 157 { 158 159 hp->afh_nethash = hp->afh_hosthash = 0; 160 } 161 162 /*ARGSUSED*/ 163 null_netmatch(a1, a2) 164 struct sockaddr *a1, *a2; 165 { 166 167 return (0); 168 } 169 170 /*ARGSUSED*/ 171 null_output(s, f, a1, n) 172 int s, f; 173 struct sockaddr *a1; 174 int n; 175 { 176 177 ; 178 } 179 180 /*ARGSUSED*/ 181 null_portmatch(a1) 182 struct sockaddr *a1; 183 { 184 185 return (0); 186 } 187 188 /*ARGSUSED*/ 189 null_portcheck(a1) 190 struct sockaddr *a1; 191 { 192 193 return (0); 194 } 195 196 /*ARGSUSED*/ 197 null_ishost(a1) 198 struct sockaddr *a1; 199 { 200 201 return (0); 202 } 203 204 /*ARGSUSED*/ 205 null_checkhost(a1) 206 struct sockaddr *a1; 207 { 208 209 return (0); 210 } 211 212 /*ARGSUSED*/ 213 null_canon(a1) 214 struct sockaddr *a1; 215 { 216 217 ; 218 } 219