• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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