|
|
1.1 ! root 1: /* mbuf.h 6.1 83/07/29 */ ! 2: ! 3: /* ! 4: * Constants related to memory allocator. ! 5: */ ! 6: #define MSIZE 128 /* size of an mbuf */ ! 7: #define MMINOFF 12 /* mbuf header length */ ! 8: #define MTAIL 4 ! 9: #define MMAXOFF (MSIZE-MTAIL) /* offset where data ends */ ! 10: #define MLEN (MSIZE-MMINOFF-MTAIL) /* mbuf data length */ ! 11: #define NMBCLUSTERS 256 ! 12: #define NMBPCL (CLBYTES/MSIZE) /* # mbufs per cluster */ ! 13: ! 14: /* ! 15: * Macros for type conversion ! 16: */ ! 17: ! 18: /* network cluster number to virtual address, and back */ ! 19: #define cltom(x) ((struct mbuf *)((int)mbutl + ((x) << CLSHIFT))) ! 20: #define mtocl(x) (((int)x - (int)mbutl) >> CLSHIFT) ! 21: ! 22: /* address in mbuf to mbuf head */ ! 23: #define dtom(x) ((struct mbuf *)((int)x & ~(MSIZE-1))) ! 24: ! 25: /* mbuf head, to typed data */ ! 26: #define mtod(x,t) ((t)((int)(x) + (x)->m_off)) ! 27: ! 28: struct mbuf { ! 29: struct mbuf *m_next; /* next buffer in chain */ ! 30: u_long m_off; /* offset of data */ ! 31: short m_len; /* amount of data in this mbuf */ ! 32: short m_type; /* mbuf type (0 == free) */ ! 33: u_char m_dat[MLEN]; /* data storage */ ! 34: struct mbuf *m_act; /* link in higher-level mbuf list */ ! 35: }; ! 36: ! 37: /* mbuf types */ ! 38: #define MT_FREE 0 /* should be on free list */ ! 39: #define MT_DATA 1 /* dynamic (data) allocation */ ! 40: #define MT_HEADER 2 /* packet header */ ! 41: #define MT_SOCKET 3 /* socket structure */ ! 42: #define MT_PCB 4 /* protocol control block */ ! 43: #define MT_RTABLE 5 /* routing tables */ ! 44: #define MT_HTABLE 6 /* IMP host tables */ ! 45: #define MT_ATABLE 7 /* address resolution tables */ ! 46: #define MT_SONAME 8 /* socket name */ ! 47: #define MT_ZOMBIE 9 /* zombie proc status */ ! 48: #define MT_SOOPTS 10 /* socket options */ ! 49: #define MT_FTABLE 11 /* fragment reassembly header */ ! 50: ! 51: /* flags to m_get */ ! 52: #define M_DONTWAIT 0 ! 53: #define M_WAIT 1 ! 54: ! 55: /* flags to m_pgalloc */ ! 56: #define MPG_MBUFS 0 /* put new mbufs on free list */ ! 57: #define MPG_CLUSTERS 1 /* put new clusters on free list */ ! 58: #define MPG_SPACE 2 /* don't free; caller wants space */ ! 59: ! 60: /* length to m_copy to copy all */ ! 61: #define M_COPYALL 1000000000 ! 62: ! 63: #define MGET(m, i, t) \ ! 64: { int ms = splimp(); \ ! 65: if ((m)=mfree) \ ! 66: { if ((m)->m_type != MT_FREE) panic("mget"); (m)->m_type = t; \ ! 67: mbstat.m_mbfree--; mbstat.m_mtypes[t]++; \ ! 68: mfree = (m)->m_next; (m)->m_next = 0; \ ! 69: (m)->m_off = MMINOFF; } \ ! 70: else \ ! 71: (m) = m_more(i, t); \ ! 72: splx(ms); } ! 73: #define MCLGET(m, i) \ ! 74: { int ms = splimp(); \ ! 75: if ((m)=mclfree) \ ! 76: {++mclrefcnt[mtocl(m)];mbstat.m_clfree--;mclfree = (m)->m_next;} \ ! 77: splx(ms); } ! 78: #define MFREE(m, n) \ ! 79: { int ms = splimp(); \ ! 80: if ((m)->m_type == MT_FREE) panic("mfree"); \ ! 81: mbstat.m_mtypes[(m)->m_type]--; (m)->m_type = MT_FREE; \ ! 82: if ((m)->m_off > MSIZE) { \ ! 83: (n) = (struct mbuf *)(mtod(m, int)&~CLOFSET); \ ! 84: if (--mclrefcnt[mtocl(n)] == 0) \ ! 85: { (n)->m_next = mclfree;mclfree = (n);mbstat.m_clfree++;} \ ! 86: } \ ! 87: (n) = (m)->m_next; (m)->m_next = mfree; \ ! 88: (m)->m_off = 0; (m)->m_act = 0; mfree = (m); mbstat.m_mbfree++; \ ! 89: splx(ms); } ! 90: ! 91: /* ! 92: * Mbuf statistics. ! 93: */ ! 94: struct mbstat { ! 95: short m_mbufs; /* mbufs obtained from page pool */ ! 96: short m_mbfree; /* mbufs on our free list */ ! 97: short m_clusters; /* clusters obtained from page pool */ ! 98: short m_clfree; /* free clusters */ ! 99: short m_drops; /* times failed to find space */ ! 100: short m_mtypes[256]; /* type specific mbuf allocations */ ! 101: }; ! 102: ! 103: #ifdef KERNEL ! 104: extern struct mbuf mbutl[]; /* virtual address of net free mem */ ! 105: extern struct pte Mbmap[]; /* page tables to map Netutl */ ! 106: struct mbstat mbstat; ! 107: int nmbclusters; ! 108: struct mbuf *mfree, *mclfree; ! 109: char mclrefcnt[NMBCLUSTERS]; ! 110: struct mbuf *m_get(),*m_getclr(),*m_free(),*m_more(),*m_copy(),*m_pullup(); ! 111: caddr_t m_clalloc(); ! 112: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.