VirtualBox

source: vbox/trunk/src/VBox/Devices/Network/slirp/mbuf.h@ 28449

Last change on this file since 28449 was 28449, checked in by vboxsync, 15 years ago

NAT: slirp file headers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1/* $Id: mbuf.h 28449 2010-04-19 09:52:59Z vboxsync $ */
2/** @file
3 * NAT - mbuf handling (declarations/defines).
4 */
5
6/*
7 * Copyright (C) 2006-2010 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/*
23 * This code is based on:
24 *
25 * Copyright (c) 1982, 1986, 1988, 1993
26 * The Regents of the University of California. All rights reserved.
27 *
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
30 * are met:
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
43 *
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * SUCH DAMAGE.
55 *
56 * @(#)mbuf.h 8.3 (Berkeley) 1/21/94
57 * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp
58 */
59
60#ifndef _MBUF_H_
61#define _MBUF_H_
62
63#ifndef VBOX_WITH_SLIRP_BSD_MBUF
64/* #define M_BUF_DEBUG */
65
66#define m_freem m_free
67
68
69#define MINCSIZE 4096 /* Amount to increase mbuf if too small */
70
71/*
72 * Macros for type conversion
73 * mtod(m,t) - convert mbuf pointer to data pointer of correct type
74 * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX)
75 */
76#define mtod(m,t) ((t)(m)->m_data)
77/* #define dtom(x) ((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */
78
79/* XXX About mbufs for slirp:
80 * Only one mbuf is ever used in a chain, for each "cell" of data.
81 * m_nextpkt points to the next packet, if fragmented.
82 * If the data is too large, the M_EXT is used, and a larger block
83 * is alloced. Therefore, m_free[m] must check for M_EXT and if set
84 * free the m_ext. This is inefficient memory-wise, but who cares.
85 */
86
87/* XXX should union some of these! */
88/* header at beginning of each mbuf: */
89struct m_hdr
90{
91 struct mbuf *mh_next; /* Linked list of mbufs */
92 struct mbuf *mh_prev;
93 struct mbuf *mh_nextpkt; /* Next packet in queue/record */
94 struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */
95 int mh_flags; /* Misc flags */
96
97 int mh_size; /* Size of data */
98 struct socket *mh_so;
99
100 caddr_t mh_data; /* Location of data */
101 int mh_len; /* Amount of data in this mbuf */
102 struct libalias *mh_la; /*Real freebsd store hocksin similar way*/
103#ifdef M_BUF_DEBUG
104 int mh_id;
105 char *mh_allocation_at_file;
106 int mh_allocation_at_line;
107#endif
108};
109
110/*
111 * How much room is in the mbuf, from m_data to the end of the mbuf
112 */
113#define M_ROOM(m) ((m->m_flags & M_EXT)? \
114 (((m)->m_ext + (m)->m_size) - (m)->m_data) \
115 : \
116 (((m)->m_dat + (m)->m_size) - (m)->m_data))
117
118/*
119 * How much free room there is
120 */
121#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
122#define M_TRAILINGSPACE M_FREEROOM
123
124struct mbuf
125{
126 struct m_hdr m_hdr;
127 union M_dat
128 {
129 char m_dat_[1]; /* ANSI don't like 0 sized arrays */
130 char *m_ext_;
131 } M_dat;
132};
133
134#define m_next m_hdr.mh_next
135#define m_prev m_hdr.mh_prev
136#define m_nextpkt m_hdr.mh_nextpkt
137#define m_prevpkt m_hdr.mh_prevpkt
138#define m_flags m_hdr.mh_flags
139#define m_len m_hdr.mh_len
140#define m_data m_hdr.mh_data
141#define m_size m_hdr.mh_size
142#define m_dat M_dat.m_dat_
143#define m_ext M_dat.m_ext_
144#define m_so m_hdr.mh_so
145#define m_la m_hdr.mh_la
146
147#define ifq_prev m_prev
148#define ifq_next m_next
149#define ifs_prev m_prevpkt
150#define ifs_next m_nextpkt
151#define ifq_so m_so
152
153#define M_EXT 0x01 /* m_ext points to more (malloced) data */
154#define M_FREELIST 0x02 /* mbuf is on free list */
155#define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */
156#define M_DOFREE 0x08 /* when m_free is called on the mbuf, free()
157 * it rather than putting it on the free list */
158#define M_FRAG 0x0800 /* packet is a fragment of a larger packet */
159#define M_FIRSTFRAG 0x1000 /* paket is first fragment */
160#define M_LASTFRAG 0x2000 /* paket is last fragment */
161
162extern int mbuf_alloced;
163extern struct mbuf m_freelist, m_usedlist;
164extern int mbuf_max;
165
166void m_init (PNATState);
167void m_fini(PNATState pData);
168void msize_init (PNATState);
169struct mbuf * m_get (PNATState);
170void m_free (PNATState, struct mbuf *);
171void m_cat (PNATState, register struct mbuf *, register struct mbuf *);
172void m_inc (struct mbuf *, int);
173void m_adj (struct mbuf *, int);
174int m_copy (struct mbuf *, struct mbuf *, int, int);
175struct mbuf * dtom (PNATState, void *);
176
177/*
178 * this macro should be used for validation and copying of Ethernet header where it really requred
179 */
180#define MBUF_HEAD(m) ((caddr_t)(((m)->m_flags & M_EXT) ? (m)->m_ext : (m)->m_dat))
181
182#define MBUF_IP_HEADER(m) (caddr_t)(MBUF_HEAD(m) + if_maxlinkhdr)
183
184#else /* VBOX_WITH_SLIRP_BSD_MBUF */
185# include "bsd/sys/mbuf.h"
186#endif /* VBOX_WITH_SLIRP_BSD_MBUF */
187
188#endif /* _MBUF_H_ */
189
190#if defined(M_BUF_DEBUG) && !defined(RT_OS_WINDOWS)
191# define m_get(x) \
192({ \
193 struct mbuf *mdb = m_get((x)); \
194 if(mdb) \
195 { \
196 mdb->m_hdr.mh_allocation_at_file = __FILE__; \
197 mdb->m_hdr.mh_allocation_at_line = __LINE__; \
198 } \
199 LogRel(("NAT:m(id:%d, ptr: %p) allocated at: %s:%d\n", (mdb?mdb->m_hdr.mh_id:-1), mdb, __FILE__, __LINE__));\
200 mdb; \
201})
202
203# define m_free(x, m) \
204({ \
205 (m)->m_hdr.mh_allocation_at_file = NULL; \
206 (m)->m_hdr.mh_allocation_at_line = 0; \
207 LogRel(("NAT:m(id:%d, ptr: %p) freed at: %s:%d\n", (m)->m_hdr.mh_id, (m), __FILE__, __LINE__)); \
208 m_free((x),(m)); \
209})
210#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette