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