|
|
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.