|
|
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.h 7.6 (Berkeley) 6/29/88
18: */
19:
20: /*
21: * Host structure used with IMP's.
22: * Used to hold outgoing packets which
23: * would exceed allowed RFNM count.
24: *
25: * These structures are packed into
26: * mbuf's and kept as small as possible.
27: */
28: struct host {
29: struct mbuf *h_q; /* holding queue */
30: u_short h_timer; /* used to stay off deletion */
31: u_short h_imp; /* host's imp number */
32: u_char h_host; /* host's number on imp */
33: u_char h_qcnt; /* size of holding q */
34: u_char h_rfnm; /* # outstanding rfnm's */
35: u_char h_flags; /* see below */
36: };
37:
38: /*
39: * A host structure is kept around (even when there are no
40: * references to it) for a spell to avoid constant reallocation
41: * and also to reflect IMP status back to sites which aren't
42: * directly connected to the IMP. When structures are marked
43: * idle, a timer is started; when the timer expires the structure
44: * is deallocated. A structure may be reused before the timer expires.
45: * A structure holds a reference on the containing mbuf when it is marked
46: * HF_INUSE.
47: */
48: #define HF_INUSE 0x1
49: #define HF_DEAD (1<<IMPTYPE_HOSTDEAD)
50: #define HF_UNREACH (1<<IMPTYPE_HOSTUNREACH)
51:
52: #define HOSTTIMER 128 /* keep structure around awhile */
53:
54: /*
55: * Mark a host structure free; used if host entry returned by hostlookup
56: * isn't needed. h_rfnm must be zero.
57: */
58: #define hostfree(hp) { \
59: if ((hp)->h_timer == 0 && (hp)->h_qcnt == 0 && \
60: (hp)->h_flags & HF_INUSE) \
61: hostrelease(hp); \
62: }
63:
64: /*
65: * Release a host entry when last rfnm is received.
66: */
67: #define hostidle(hp) { (hp)->h_timer = HOSTTIMER; }
68:
69: /*
70: * Host structures, as seen inside an mbuf.
71: * Hashing on the host and imp is used to
72: * select an index into the first mbuf. Collisions
73: * are then resolved by searching successive
74: * mbuf's at the same index. Reclamation is done
75: * automatically at the time a structure is freed.
76: */
77: #define HPMBUF ((MLEN - sizeof(int)) / sizeof(struct host))
78: /* don't need to swab as long as HPMBUF is odd */
79: #if defined(notdef) && BYTE_ORDER == BIG_ENDIAN
80: #define HOSTHASH(imp, host) ((unsigned)(ntohs(imp)+(host)) % HPMBUF)
81: #else
82: #define HOSTHASH(imp, host) ((unsigned)((imp)+(host)) % HPMBUF)
83: #endif
84:
85: /*
86: * In-line expansions for queuing operations on
87: * host message holding queue. Queue is maintained
88: * as circular list with the head pointing to the
89: * last message in the queue.
90: */
91: #define HOST_ENQUE(hp, m) { \
92: register struct mbuf *n; \
93: (hp)->h_qcnt++; \
94: if ((n = (hp)->h_q) == 0) \
95: (hp)->h_q = (m)->m_act = (m); \
96: else { \
97: (m)->m_act = n->m_act; \
98: (hp)->h_q = n->m_act = (m); \
99: } \
100: }
101: #define HOST_DEQUE(hp, m) { \
102: if ((m) = (hp)->h_q) { \
103: if ((m)->m_act == (m)) \
104: (hp)->h_q = 0; \
105: else { \
106: (m) = (m)->m_act; \
107: (hp)->h_q->m_act = (m)->m_act; \
108: } \
109: (hp)->h_qcnt--; \
110: (m)->m_act = 0; \
111: } \
112: }
113:
114: struct hmbuf {
115: int hm_count; /* # of struct's in use */
116: struct host hm_hosts[HPMBUF]; /* data structures proper */
117: };
118:
119: #ifdef KERNEL
120: struct host *hostlookup();
121: struct host *hostenter();
122: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.