|
|
1.1 root 1: /* if_imphost.c 6.1 83/07/29 */
2:
3: #include "imp.h"
4: #if NIMP > 0
5: /*
6: * Host table manipulation routines.
7: * Only needed when shipping stuff through an IMP.
8: *
9: * Everything in here is called at splimp from
10: * from the IMP protocol code (if_imp.c), or
11: * interlocks with the code at splimp.
12: */
13: #include "../h/param.h"
14: #include "../h/mbuf.h"
15:
16: #include "../netinet/in.h"
17: #include "../netinet/in_systm.h"
18:
19: #include "../netimp/if_imp.h"
20: #include "../netimp/if_imphost.h"
21:
22: /*
23: * Head of host table hash chains.
24: */
25: struct mbuf *hosts;
26:
27: /*
28: * Given an internet address
29: * return a host structure (if it exists).
30: */
31: struct host *
32: hostlookup(addr)
33: struct in_addr addr;
34: {
35: register struct host *hp;
36: register struct mbuf *m;
37: register int hash = HOSTHASH(addr);
38:
39: for (m = hosts; m; m = m->m_next) {
40: hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
41: if (hp->h_addr.s_addr == addr.s_addr) {
42: hp->h_flags |= HF_INUSE;
43: return (hp);
44: }
45: }
46: return ((struct host *)0);
47: }
48:
49: /*
50: * Enter a reference to this host's internet
51: * address. If no host structure exists, create
52: * one and hook it into the host database.
53: */
54: struct host *
55: hostenter(addr)
56: struct in_addr addr;
57: {
58: register struct mbuf *m, **mprev;
59: register struct host *hp, *hp0 = 0;
60: register int hash = HOSTHASH(addr);
61:
62: mprev = &hosts;
63: while (m = *mprev) {
64: mprev = &m->m_next;
65: hp = &mtod(m, struct hmbuf *)->hm_hosts[hash];
66: if ((hp->h_flags & HF_INUSE) == 0) {
67: if (hp->h_addr.s_addr == addr.s_addr)
68: goto foundhost;
69: if (hp0 == 0)
70: hp0 = hp;
71: continue;
72: }
73: if (hp->h_addr.s_addr == addr.s_addr)
74: goto foundhost;
75: }
76:
77: /*
78: * No current host structure, make one.
79: * If our search ran off the end of the
80: * chain of mbuf's, allocate another.
81: */
82: if (hp0 == 0) {
83: m = m_getclr(M_DONTWAIT, MT_HTABLE);
84: if (m == NULL)
85: return ((struct host *)0);
86: *mprev = m;
87: hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
88: }
89: mtod(dtom(hp0), struct hmbuf *)->hm_count++;
90: hp = hp0;
91: hp->h_addr = addr;
92: hp->h_timer = 0;
93: hp->h_flags = 0;
94:
95: foundhost:
96: hp->h_flags |= HF_INUSE;
97: return (hp);
98: }
99:
100: /*
101: * Mark a host structure free and set it's
102: * timer going.
103: */
104: hostfree(hp)
105: register struct host *hp;
106: {
107:
108: hp->h_flags &= ~HF_INUSE;
109: hp->h_timer = HOSTTIMER;
110: hp->h_rfnm = 0;
111: }
112:
113: /*
114: * Reset a given network's host entries.
115: */
116: hostreset(net)
117: int net;
118: {
119: register struct mbuf *m;
120: register struct host *hp, *lp;
121: struct hmbuf *hm;
122:
123: for (m = hosts; m; m = m->m_next) {
124: hm = mtod(m, struct hmbuf *);
125: hp = hm->hm_hosts;
126: lp = hp + HPMBUF;
127: while (hm->hm_count > 0 && hp < lp) {
128: if (hp->h_addr.s_net == net) {
129: hp->h_flags &= ~HF_INUSE;
130: hostrelease(hp);
131: }
132: hp++;
133: }
134: }
135: }
136:
137: /*
138: * Remove a host structure and release
139: * any resources it's accumulated.
140: */
141: hostrelease(hp)
142: register struct host *hp;
143: {
144: register struct mbuf *m, **mprev, *mh = dtom(hp);
145:
146: /*
147: * Discard any packets left on the waiting q
148: */
149: if (m = hp->h_q) {
150: register struct mbuf *n;
151:
152: do {
153: n = m->m_act;
154: m_freem(m);
155: m = n;
156: } while (m != hp->h_q);
157: hp->h_q = 0;
158: }
159: hp->h_flags = 0;
160: if (--mtod(mh, struct hmbuf *)->hm_count)
161: return;
162: mprev = &hosts;
163: while ((m = *mprev) != mh)
164: mprev = &m->m_next;
165: *mprev = m_free(mh);
166: }
167:
168: /*
169: * Remove a packet from the holding q.
170: * The RFNM counter is also bumped.
171: */
172: struct mbuf *
173: hostdeque(hp)
174: register struct host *hp;
175: {
176: register struct mbuf *m;
177:
178: hp->h_rfnm--;
179: HOST_DEQUE(hp, m);
180: if (m)
181: return (m);
182: if (hp->h_rfnm == 0)
183: hostfree(hp);
184: return (0);
185: }
186:
187: /*
188: * Host data base timer routine.
189: * Decrement timers on structures which are
190: * waiting to be deallocated. On expiration
191: * release resources, possibly deallocating
192: * mbuf associated with structure.
193: */
194: hostslowtimo()
195: {
196: register struct mbuf *m;
197: register struct host *hp, *lp;
198: struct hmbuf *hm;
199: int s = splimp();
200:
201: for (m = hosts; m; m = m->m_next) {
202: hm = mtod(m, struct hmbuf *);
203: hp = hm->hm_hosts;
204: lp = hp + HPMBUF;
205: for (; hm->hm_count > 0 && hp < lp; hp++) {
206: if (hp->h_flags & HF_INUSE)
207: continue;
208: if (hp->h_timer && --hp->h_timer == 0)
209: hostrelease(hp);
210: }
211: }
212: splx(s);
213: }
214: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.