|
|
1.1 ! root 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.6 (Berkeley) 6/5/86"; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.