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 MINCSIZE 4096 /* Amount to increase mbuf if too small */ 41 42 /* flags for the mh_flags field */ 43 #define M_EXT 0x01 /* m_ext points to more (malloced) data */ 44 #define M_FREELIST 0x02 /* mbuf is on free list */ 45 #define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */ 46 #define M_DOFREE 0x08 /* when mbuf_free is called on the mbuf, free() 47 * it rather than putting it on the free list */ 48 49 50 /* XXX About mbufs for slirp: 51 * Only one mbuf is ever used in a chain, for each "cell" of data. 52 * m_nextpkt points to the next packet, if fragmented. 53 * If the data is too large, the M_EXT is used, and a larger block 54 * is alloced. Therefore, mbuf_free[m] must check for M_EXT and if set 55 * free the m_ext. This is inefficient memory-wise, but who cares. 56 */ 57 58 /* XXX should union some of these! */ 59 /* header at beginning of each mbuf: */ 60 61 /** 62 * m_next, m_prev :: used to place the MBuf in free/used linked lists 63 * m_next2, m_prev2 :: used to place the same MBuf in other linked lists 64 * m_flags :: bit flags describing this MBuf 65 * m_size :: total size of MBuf buffer 66 * m_so :: socket this MBuf is attached to 67 * m_data :: pointer to current cursor in MBuf buffer 68 * m_len :: amount of data recorded in this MBuf 69 */ 70 #define MBUF_HEADER \ 71 struct mbuf* m_next; \ 72 struct mbuf* m_prev; \ 73 struct mbuf* m_next2; \ 74 struct mbuf* m_prev2; \ 75 int m_flags; \ 76 int m_size; \ 77 struct socket* m_so; \ 78 caddr_t m_data; \ 79 int m_len; 80 81 struct m_hdr { 82 MBUF_HEADER 83 }; 84 85 typedef struct mbuf { 86 MBUF_HEADER 87 union M_dat { 88 char m_dat_[1]; /* ANSI doesn't like 0 sized arrays */ 89 char* m_ext_; 90 } M_dat; 91 } MBufRec, *MBuf; 92 93 #define m_nextpkt m_next2 94 #define m_prevpkt m_prev2 95 #define m_dat M_dat.m_dat_ 96 #define m_ext M_dat.m_ext_ 97 98 #define ifq_prev m_prev 99 #define ifq_next m_next 100 101 #define ifs_prev m_prev2 102 #define ifs_next m_next2 103 104 #define ifq_so m_so 105 106 void mbuf_init (void); 107 void msize_init (void); 108 MBuf mbuf_alloc (void); 109 void mbuf_free (MBuf m); 110 void mbuf_append(MBuf m1, MBuf m2); 111 void mbuf_ensure(MBuf m, int size); 112 void mbuf_trim (MBuf m, int len); 113 int mbuf_copy (MBuf m, MBuf n, int n_offset, int n_length); 114 115 #define MBUF_TO(m,t) ((t)(m)->m_data) 116 #define MBUF_FROM(d) mbuf_from(d) 117 MBuf mbuf_from (void *); 118 119 int mbuf_freeroom( MBuf m ); 120 121 #endif 122