|
|
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: MBUFNULL(44, m); /* for debugging */
85: if (m == NULL)
86: return ((struct host *)0);
87: *mprev = m;
88: hp0 = &mtod(m, struct hmbuf *)->hm_hosts[hash];
89: }
90: mtod(dtom(hp0), struct hmbuf *)->hm_count++;
91: hp = hp0;
92: hp->h_addr = addr;
93: hp->h_timer = 0;
94: hp->h_flags = 0;
95:
96: foundhost:
97: hp->h_flags |= HF_INUSE;
98: return (hp);
99: }
100:
101: /*
102: * Mark a host structure free and set it's
103: * timer going.
104: */
105: hostfree(hp)
106: register struct host *hp;
107: {
108:
109: hp->h_flags &= ~HF_INUSE;
110: hp->h_timer = HOSTTIMER;
111: hp->h_rfnm = 0;
112: }
113:
114: /*
115: * Reset a given network's host entries.
116: */
117: hostreset(net)
118: int net;
119: {
120: register struct mbuf *m;
121: register struct host *hp, *lp;
122: struct hmbuf *hm;
123:
124: for (m = hosts; m; m = m->m_next) {
125: hm = mtod(m, struct hmbuf *);
126: hp = hm->hm_hosts;
127: lp = hp + HPMBUF;
128: while (hm->hm_count > 0 && hp < lp) {
129: if (hp->h_addr.s_net == net) {
130: hp->h_flags &= ~HF_INUSE;
131: hostrelease(hp);
132: }
133: hp++;
134: }
135: }
136: }
137:
138: /*
139: * Remove a host structure and release
140: * any resources it's accumulated.
141: */
142: hostrelease(hp)
143: register struct host *hp;
144: {
145: register struct mbuf *m, **mprev, *mh = dtom(hp);
146:
147: /*
148: * Discard any packets left on the waiting q
149: */
150: if (m = hp->h_q) {
151: register struct mbuf *n;
152:
153: do {
154: n = m->m_act;
155: m_freem(m);
156: m = n;
157: } while (m != hp->h_q);
158: hp->h_q = 0;
159: }
160: hp->h_flags = 0;
161: if (--mtod(mh, struct hmbuf *)->hm_count)
162: return;
163: mprev = &hosts;
164: while ((m = *mprev) != mh)
165: mprev = &m->m_next;
166: *mprev = m_free(mh);
167: }
168:
169: /*
170: * Remove a packet from the holding q.
171: * The RFNM counter is also bumped.
172: */
173: struct mbuf *
174: hostdeque(hp)
175: register struct host *hp;
176: {
177: register struct mbuf *m;
178:
179: hp->h_rfnm--;
180: HOST_DEQUE(hp, m);
181: if (m)
182: return (m);
183: if (hp->h_rfnm == 0)
184: hostfree(hp);
185: return (0);
186: }
187:
188: /*
189: * Host data base timer routine.
190: * Decrement timers on structures which are
191: * waiting to be deallocated. On expiration
192: * release resources, possibly deallocating
193: * mbuf associated with structure.
194: */
195: hostslowtimo()
196: {
197: register struct mbuf *m;
198: register struct host *hp, *lp;
199: struct hmbuf *hm;
200: int s = splimp();
201:
202: for (m = hosts; m; m = m->m_next) {
203: hm = mtod(m, struct hmbuf *);
204: hp = hm->hm_hosts;
205: lp = hp + HPMBUF;
206: for (; hm->hm_count > 0 && hp < lp; hp++) {
207: if (hp->h_flags & HF_INUSE)
208: continue;
209: if (hp->h_timer && --hp->h_timer == 0)
210: hostrelease(hp);
211: }
212: }
213: splx(s);
214: }
215: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.