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