|
|
1.1 root 1: /* if_imphost.h 6.1 83/07/29 */
2:
3: /*
4: * Host structure used with IMP's.
5: * Used to hold outgoing packets which
6: * would exceed allowed RFNM count.
7: *
8: * These structures are packed into
9: * mbuf's and kept as small as possible.
10: */
11: struct host {
12: struct mbuf *h_q; /* holding queue */
13: struct in_addr h_addr; /* host's address */
14: u_char h_qcnt; /* size of holding q */
15: u_char h_timer; /* used to stay off deletion */
16: u_char h_rfnm; /* # outstanding rfnm's */
17: u_char h_flags; /* see below */
18: };
19:
20: /*
21: * A host structure is kept around (even when there are no
22: * references to it) for a spell to avoid constant reallocation
23: * and also to reflect IMP status back to sites which aren't
24: * directly connected to the IMP. When structures are marked
25: * free, a timer is started; when the timer expires the structure
26: * is scavenged.
27: */
28: #define HF_INUSE 0x1
29: #define HF_DEAD (1<<IMPTYPE_HOSTDEAD)
30: #define HF_UNREACH (1<<IMPTYPE_HOSTUNREACH)
31:
32: #define HOSTTIMER 128 /* keep structure around awhile */
33:
34: /*
35: * Host structures, as seen inside an mbuf.
36: * Hashing on the host address is used to
37: * select an index into the first mbuf. Collisions
38: * are then resolved by searching successive
39: * mbuf's at the same index. Reclamation is done
40: * automatically at the time a structure is free'd.
41: */
42: #define HPMBUF ((MLEN - sizeof(int)) / sizeof(struct host))
43: #if vax
44: #define HOSTHASH(a) ((((a).s_addr>>8)+(a).s_net) % HPMBUF)
45: #endif
46:
47: /*
48: * In-line expansions for queuing operations on
49: * host message holding queue. Queue is maintained
50: * as circular list with the head pointing to the
51: * last message in the queue.
52: */
53: #define HOST_ENQUE(hp, m) { \
54: register struct mbuf *n; \
55: (hp)->h_qcnt++; \
56: if ((n = (hp)->h_q) == 0) \
57: (hp)->h_q = (m)->m_act = (m); \
58: else { \
59: (m)->m_act = n->m_act; \
60: (hp)->h_q = n->m_act = (m); \
61: } \
62: }
63: #define HOST_DEQUE(hp, m) { \
64: if ((m) = (hp)->h_q) { \
65: if ((m)->m_act == (m)) \
66: (hp)->h_q = 0; \
67: else { \
68: (m) = (m)->m_act; \
69: (hp)->h_q->m_act = (m)->m_act; \
70: } \
71: (hp)->h_qcnt--; \
72: (m)->m_act = 0; \
73: } \
74: }
75:
76: struct hmbuf {
77: int hm_count; /* # of struct's in use */
78: struct host hm_hosts[HPMBUF]; /* data structures proper */
79: };
80:
81: #ifdef KERNEL
82: struct host *hostlookup();
83: struct host *hostenter();
84: struct mbuf *hostdeque();
85: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.