|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
33: * @(#)if_imphost.c 7.10 (Berkeley) 6/28/90
34: */
35:
36: #include "imp.h"
37: #if NIMP > 0
38: /*
39: * Host table manipulation routines.
40: * Only needed when shipping stuff through an IMP.
41: *
42: * Everything in here is called at splimp from
43: * from the IMP protocol code (if_imp.c), or
44: * interlocks with the code at splimp.
45: */
46: #include "param.h"
47: #include "mbuf.h"
48: #include "socket.h"
49: #include "syslog.h"
50:
51: #include "../net/if.h"
52:
53: #include "../netinet/in.h"
54: #include "../netinet/in_systm.h"
55:
56: #include "if_imp.h"
57: #include "if_imphost.h"
58:
59: extern struct imp_softc imp_softc[];
60:
61: /*
62: * Given an internet address
63: * return a host structure (if it exists).
64: */
65: struct host *
66: hostlookup(imp, host, unit)
67: int imp, host, unit;
68: {
69: register struct host *hp;
70: register struct mbuf *m;
71: register int hash = HOSTHASH(imp, host);
72:
73: for (m = imp_softc[unit].imp_hosts; m; m = m->m_next) {
74: hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
75: if (hp->h_imp == imp && hp->h_host == host) {
76: if ((hp->h_flags & HF_INUSE) == 0)
77: mtod(dtom(hp), struct hmbuf *)->hm_count++;
78: hp->h_flags |= HF_INUSE;
79: return (hp);
80: }
81: }
82: return ((struct host *)0);
83: }
84:
85: /*
86: * Enter a reference to this host's internet
87: * address. If no host structure exists, create
88: * one and hook it into the host database.
89: */
90: struct host *
91: hostenter(imp, host, unit)
92: int imp, host, unit;
93: {
94: register struct mbuf *m, **mprev;
95: register struct host *hp, *hp0 = 0;
96: register int hash = HOSTHASH(imp, host);
97:
98: mprev = &imp_softc[unit].imp_hosts;
99: while (m = *mprev) {
100: mprev = &m->m_next;
101: hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
102: if (hp->h_imp == imp && hp->h_host == host) {
103: if ((hp->h_flags & HF_INUSE) == 0)
104: mtod(dtom(hp), struct hmbuf *)->hm_count++;
105: goto foundhost;
106: }
107: if ((hp->h_flags & HF_INUSE) == 0) {
108: if (hp0 == 0)
109: hp0 = hp;
110: continue;
111: }
112: }
113:
114: /*
115: * No current host structure, make one.
116: * If our search ran off the end of the
117: * chain of mbuf's, allocate another.
118: */
119: if (hp0 == 0) {
120: m = m_getclr(M_DONTWAIT, MT_HTABLE);
121: if (m == NULL)
122: return ((struct host *)0);
123: *mprev = m;
124: hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
125: }
126: hp = hp0;
127: mtod(dtom(hp), struct hmbuf *)->hm_count++;
128: hp->h_imp = imp;
129: hp->h_host = host;
130: hp->h_timer = 0;
131: hp->h_flags = 0;
132:
133: foundhost:
134: hp->h_flags |= HF_INUSE;
135: return (hp);
136: }
137:
138: /*
139: * Reset a given imp unit's host entries.
140: * Must be called at splimp.
141: */
142: hostreset(unit)
143: int unit;
144: {
145: register struct mbuf *m;
146: register struct host *hp, *lp;
147: struct hmbuf *hm;
148:
149: for (m = imp_softc[unit].imp_hosts; m; m = m->m_next) {
150: hm = mtod(m, struct hmbuf *);
151: hp = hm->hm_hosts;
152: lp = hp + HPMBUF;
153: while (hm->hm_count > 0 && hp < lp) {
154: hostrelease(hp);
155: hp++;
156: }
157: }
158: hostcompress(unit);
159: }
160:
161: /*
162: * Remove a host structure and release
163: * any resources it's accumulated.
164: */
165: hostrelease(hp)
166: register struct host *hp;
167: {
168:
169: if (hp->h_q)
170: hostflush(hp);
171: hp->h_rfnm = 0;
172: if (hp->h_flags & HF_INUSE)
173: --mtod(dtom(hp), struct hmbuf *)->hm_count;
174: hp->h_flags = 0;
175: }
176:
177: /*
178: * Flush the message queue for a host.
179: */
180: hostflush(hp)
181: register struct host *hp;
182: {
183: register struct mbuf *m;
184:
185: /*
186: * Discard any packets left on the waiting q
187: */
188: if (m = hp->h_q) {
189: register struct mbuf *n;
190:
191: do {
192: n = m->m_act;
193: m_freem(m);
194: m = n;
195: } while (m != hp->h_q);
196: hp->h_q = 0;
197: hp->h_qcnt = 0;
198: }
199: }
200:
201: /*
202: * Release mbufs in host table that contain no entries
203: * currently in use. Must be called at splimp.
204: */
205: hostcompress(unit)
206: int unit;
207: {
208: register struct mbuf *m, **mprev;
209: struct imp_softc *sc = &imp_softc[unit];
210:
211: mprev = &sc->imp_hosts;
212: sc->imp_hostq = 0;
213: while (m = *mprev) {
214: if (mtod(m, struct hmbuf *)->hm_count == 0)
215: *mprev = m_free(m);
216: else
217: mprev = &m->m_next;
218: }
219: }
220:
221: /*
222: * Host data base timer routine.
223: * Decrement timers on structures which are
224: * waiting to be deallocated. On expiration
225: * release resources, possibly deallocating
226: * mbuf associated with structure.
227: */
228: hostslowtimo()
229: {
230: register struct mbuf *m;
231: register struct host *hp, *lp;
232: struct imp_softc *sc;
233: struct hmbuf *hm;
234: int s = splimp(), unit, any;
235:
236: for (unit = 0; unit < NIMP; unit++) {
237: any = 0;
238: sc = &imp_softc[unit];
239: for (m = sc->imp_hosts; m; m = m->m_next) {
240: hm = mtod(m, struct hmbuf *);
241: hp = hm->hm_hosts;
242: lp = hp + HPMBUF;
243: for (; hm->hm_count > 0 && hp < lp; hp++) {
244: if (hp->h_timer && --hp->h_timer == 0) {
245: if (hp->h_rfnm) {
246: log(LOG_INFO, /* XXX */
247: "imp%d: host %d/imp %d, lost rfnm\n",
248: unit, hp->h_host, ntohs(hp->h_imp));
249: sc->imp_lostrfnm++;
250: imprestarthost(sc, hp);
251: } else {
252: any = 1;
253: hostrelease(hp);
254: if (sc->imp_hostq == m)
255: sc->imp_hostq = 0;
256: }
257: }
258: }
259: }
260: if (any)
261: hostcompress(unit);
262: }
263: splx(s);
264: }
265: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.