00001 /* 00002 * Copyright (c) 1982, 1986, 1988, 1993 00003 * The Regents of the University of California. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 * 00029 * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 00030 * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp 00031 */ 00032 00033 #ifndef _MBUF_H_ 00034 #define _MBUF_H_ 00035 00036 #define m_freem m_free 00037 00038 00039 #define MINCSIZE 4096 /* Amount to increase mbuf if too small */ 00040 00041 /* 00042 * Macros for type conversion 00043 * mtod(m,t) - convert mbuf pointer to data pointer of correct type 00044 * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) 00045 */ 00046 #define mtod(m,t) ((t)(m)->m_data) 00047 /* #define dtom(x) ((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */ 00048 00049 /* XXX About mbufs for slirp: 00050 * Only one mbuf is ever used in a chain, for each "cell" of data. 00051 * m_nextpkt points to the next packet, if fragmented. 00052 * If the data is too large, the M_EXT is used, and a larger block 00053 * is alloced. Therefore, m_free[m] must check for M_EXT and if set 00054 * free the m_ext. This is inefficient memory-wise, but who cares. 00055 */ 00056 00057 /* XXX should union some of these! */ 00058 /* header at beginning of each mbuf: */ 00059 struct m_hdr { 00060 struct mbuf *mh_next; /* Linked list of mbufs */ 00061 struct mbuf *mh_prev; 00062 struct mbuf *mh_nextpkt; /* Next packet in queue/record */ 00063 struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */ 00064 int mh_flags; /* Misc flags */ 00065 00066 int mh_size; /* Size of data */ 00067 struct socket *mh_so; 00068 00069 caddr_t mh_data; /* Location of data */ 00070 int mh_len; /* Amount of data in this mbuf */ 00071 }; 00072 00073 /* 00074 * How much room is in the mbuf, from m_data to the end of the mbuf 00075 */ 00076 #define M_ROOM(m) ((m->m_flags & M_EXT)? \ 00077 (((m)->m_ext + (m)->m_size) - (m)->m_data) \ 00078 : \ 00079 (((m)->m_dat + (m)->m_size) - (m)->m_data)) 00080 00081 /* 00082 * How much free room there is 00083 */ 00084 #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) 00085 #define M_TRAILINGSPACE M_FREEROOM 00086 00087 struct mbuf { 00088 struct m_hdr m_hdr; 00089 union M_dat { 00090 char m_dat_[1]; /* ANSI don't like 0 sized arrays */ 00091 char *m_ext_; 00092 } M_dat; 00093 }; 00094 00095 #define m_next m_hdr.mh_next 00096 #define m_prev m_hdr.mh_prev 00097 #define m_nextpkt m_hdr.mh_nextpkt 00098 #define m_prevpkt m_hdr.mh_prevpkt 00099 #define m_flags m_hdr.mh_flags 00100 #define m_len m_hdr.mh_len 00101 #define m_data m_hdr.mh_data 00102 #define m_size m_hdr.mh_size 00103 #define m_dat M_dat.m_dat_ 00104 #define m_ext M_dat.m_ext_ 00105 #define m_so m_hdr.mh_so 00106 00107 #define ifq_prev m_prev 00108 #define ifq_next m_next 00109 #define ifs_prev m_prevpkt 00110 #define ifs_next m_nextpkt 00111 #define ifq_so m_so 00112 00113 #define M_EXT 0x01 /* m_ext points to more (malloced) data */ 00114 #define M_FREELIST 0x02 /* mbuf is on free list */ 00115 #define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */ 00116 #define M_DOFREE 0x08 /* when m_free is called on the mbuf, free() 00117 * it rather than putting it on the free list */ 00118 00119 /* 00120 * Mbuf statistics. XXX 00121 */ 00122 00123 struct mbstat { 00124 int mbs_alloced; /* Number of mbufs allocated */ 00125 00126 }; 00127 00128 extern struct mbstat mbstat; 00129 extern int mbuf_alloced; 00130 extern struct mbuf m_freelist, m_usedlist; 00131 extern int mbuf_max; 00132 00133 void m_init _P((void)); 00134 struct mbuf * m_get _P((void)); 00135 void m_free _P((struct mbuf *)); 00136 void m_cat _P((register struct mbuf *, register struct mbuf *)); 00137 void m_inc _P((struct mbuf *, int)); 00138 void m_adj _P((struct mbuf *, int)); 00139 int m_copy _P((struct mbuf *, struct mbuf *, int, int)); 00140 struct mbuf * dtom _P((void *)); 00141 00142 #endif