|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1988, 1993 ! 3: * The Regents of the University of California. All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. Neither the name of the University nor the names of its contributors ! 14: * may be used to endorse or promote products derived from this software ! 15: * without specific prior written permission. ! 16: * ! 17: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 27: * SUCH DAMAGE. ! 28: * ! 29: * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 ! 30: * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp ! 31: */ ! 32: ! 33: #ifndef _MBUF_H_ ! 34: #define _MBUF_H_ ! 35: ! 36: #define m_freem m_free ! 37: ! 38: ! 39: #define MINCSIZE 4096 /* Amount to increase mbuf if too small */ ! 40: ! 41: /* ! 42: * Macros for type conversion ! 43: * mtod(m,t) - convert mbuf pointer to data pointer of correct type ! 44: * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) ! 45: */ ! 46: #define mtod(m,t) ((t)(m)->m_data) ! 47: /* #define dtom(x) ((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */ ! 48: ! 49: /* XXX About mbufs for slirp: ! 50: * Only one mbuf is ever used in a chain, for each "cell" of data. ! 51: * m_nextpkt points to the next packet, if fragmented. ! 52: * If the data is too large, the M_EXT is used, and a larger block ! 53: * is alloced. Therefore, m_free[m] must check for M_EXT and if set ! 54: * free the m_ext. This is inefficient memory-wise, but who cares. ! 55: */ ! 56: ! 57: /* XXX should union some of these! */ ! 58: /* header at beginning of each mbuf: */ ! 59: struct m_hdr { ! 60: struct mbuf *mh_next; /* Linked list of mbufs */ ! 61: struct mbuf *mh_prev; ! 62: struct mbuf *mh_nextpkt; /* Next packet in queue/record */ ! 63: struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */ ! 64: int mh_flags; /* Misc flags */ ! 65: ! 66: size_t mh_size; /* Size of data */ ! 67: struct socket *mh_so; ! 68: ! 69: caddr_t mh_data; /* Location of data */ ! 70: size_t mh_len; /* Amount of data in this mbuf */ ! 71: }; ! 72: ! 73: /* ! 74: * How much room is in the mbuf, from m_data to the end of the mbuf ! 75: */ ! 76: #define M_ROOM(m) ((m->m_flags & M_EXT)? \ ! 77: (((m)->m_ext + (m)->m_size) - (m)->m_data) \ ! 78: : \ ! 79: (((m)->m_dat + (m)->m_size) - (m)->m_data)) ! 80: ! 81: /* ! 82: * How much free room there is ! 83: */ ! 84: #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) ! 85: #define M_TRAILINGSPACE M_FREEROOM ! 86: ! 87: struct mbuf { ! 88: struct m_hdr m_hdr; ! 89: union M_dat { ! 90: char m_dat_[1]; /* ANSI don't like 0 sized arrays */ ! 91: char *m_ext_; ! 92: } M_dat; ! 93: }; ! 94: ! 95: #define m_next m_hdr.mh_next ! 96: #define m_prev m_hdr.mh_prev ! 97: #define m_nextpkt m_hdr.mh_nextpkt ! 98: #define m_prevpkt m_hdr.mh_prevpkt ! 99: #define m_flags m_hdr.mh_flags ! 100: #define m_len m_hdr.mh_len ! 101: #define m_data m_hdr.mh_data ! 102: #define m_size m_hdr.mh_size ! 103: #define m_dat M_dat.m_dat_ ! 104: #define m_ext M_dat.m_ext_ ! 105: #define m_so m_hdr.mh_so ! 106: ! 107: #define ifq_prev m_prev ! 108: #define ifq_next m_next ! 109: #define ifs_prev m_prevpkt ! 110: #define ifs_next m_nextpkt ! 111: #define ifq_so m_so ! 112: ! 113: #define M_EXT 0x01 /* m_ext points to more (malloced) data */ ! 114: #define M_FREELIST 0x02 /* mbuf is on free list */ ! 115: #define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */ ! 116: #define M_DOFREE 0x08 /* when m_free is called on the mbuf, free() ! 117: * it rather than putting it on the free list */ ! 118: ! 119: /* ! 120: * Mbuf statistics. XXX ! 121: */ ! 122: ! 123: struct mbstat { ! 124: int mbs_alloced; /* Number of mbufs allocated */ ! 125: ! 126: }; ! 127: ! 128: extern struct mbstat mbstat; ! 129: extern int mbuf_alloced; ! 130: extern struct mbuf m_freelist, m_usedlist; ! 131: extern int mbuf_max; ! 132: ! 133: void m_init(void); ! 134: void msize_init(void); ! 135: struct mbuf * m_get(void); ! 136: void m_free(struct mbuf *); ! 137: void m_cat(register struct mbuf *, register struct mbuf *); ! 138: void m_inc(struct mbuf *, u_int); ! 139: void m_adj(struct mbuf *, int); ! 140: int m_copy(struct mbuf *, struct mbuf *, u_int, u_int); ! 141: struct mbuf * dtom(void *); ! 142: ! 143: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.