1 /* if_imphost.h 4.5 82/03/09 */ 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 short h_qcnt; /* size of holding q */ 15 u_char h_rfnm; /* # outstanding rfnm's */ 16 u_char h_refcnt; /* reference count */ 17 }; 18 19 /* 20 * Host structures, as seen inside an mbuf. 21 * Hashing on the host address is used to 22 * select an index into the first mbuf. Collisions 23 * are then resolved by searching successive 24 * mbuf's at the same index. Reclamation is done 25 * automatically at the time a structure is free'd. 26 */ 27 #define HPMBUF ((MLEN - sizeof(int)) / sizeof(struct host)) 28 #if vax 29 #define HOSTHASH(a) ((((a).s_addr>>8)+(a).s_net) % HPMBUF) 30 #endif 31 32 /* 33 * In-line expansions for queuing operations on 34 * host message holding queue. Queue is maintained 35 * as circular list with the head pointing to the 36 * last message in the queue. 37 */ 38 #define HOST_ENQUE(hp, m) { \ 39 register struct mbuf *n; \ 40 (hp)->h_qcnt++; \ 41 if ((n = (hp)->h_q) == 0) \ 42 (hp)->h_q = (m)->m_act = (m); \ 43 else { \ 44 (m)->m_act = n->m_act; \ 45 (hp)->h_q = n->m_act = (m); \ 46 } \ 47 } 48 #define HOST_DEQUE(hp, m) { \ 49 if ((m) = (hp)->h_q) { \ 50 if ((m)->m_act == (m)) \ 51 (hp)->h_q = 0; \ 52 else { \ 53 (m) = (m)->m_act; \ 54 (hp)->h_q->m_act = (m)->m_act; \ 55 } \ 56 (hp)->h_qcnt--; \ 57 (m)->m_act = 0; \ 58 } \ 59 } 60 61 struct hmbuf { 62 int hm_count; /* # of struct's in use */ 63 struct host hm_hosts[HPMBUF]; /* data structures proper */ 64 }; 65 66 #ifdef KERNEL 67 struct host *hostlookup(); 68 struct host *hostenter(); 69 struct mbuf *hostdeque(); 70 #endif 71