VirtualBox

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

最後變更 在這個檔案從27129是 26404,由 vboxsync 提交於 15 年 前

NAT: applied patch from xtracker 3993 (use BSD mbufs)

  • 屬性 svn:eol-style 設為 native
檔案大小: 7.8 KB
 
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#ifndef VBOX_WITH_SLIRP_BSD_MBUF
41/* #define M_BUF_DEBUG */
42
43#define m_freem m_free
44
45
46#define MINCSIZE 4096 /* Amount to increase mbuf if too small */
47
48/*
49 * Macros for type conversion
50 * mtod(m,t) - convert mbuf pointer to data pointer of correct type
51 * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX)
52 */
53#define mtod(m,t) ((t)(m)->m_data)
54/* #define dtom(x) ((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */
55
56/* XXX About mbufs for slirp:
57 * Only one mbuf is ever used in a chain, for each "cell" of data.
58 * m_nextpkt points to the next packet, if fragmented.
59 * If the data is too large, the M_EXT is used, and a larger block
60 * is alloced. Therefore, m_free[m] must check for M_EXT and if set
61 * free the m_ext. This is inefficient memory-wise, but who cares.
62 */
63
64/* XXX should union some of these! */
65/* header at beginning of each mbuf: */
66struct m_hdr
67{
68 struct mbuf *mh_next; /* Linked list of mbufs */
69 struct mbuf *mh_prev;
70 struct mbuf *mh_nextpkt; /* Next packet in queue/record */
71 struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */
72 int mh_flags; /* Misc flags */
73
74 int mh_size; /* Size of data */
75 struct socket *mh_so;
76
77 caddr_t mh_data; /* Location of data */
78 int mh_len; /* Amount of data in this mbuf */
79 struct libalias *mh_la; /*Real freebsd store hocksin similar way*/
80#ifdef M_BUF_DEBUG
81 int mh_id;
82 char *mh_allocation_at_file;
83 int mh_allocation_at_line;
84#endif
85};
86
87/*
88 * How much room is in the mbuf, from m_data to the end of the mbuf
89 */
90#define M_ROOM(m) ((m->m_flags & M_EXT)? \
91 (((m)->m_ext + (m)->m_size) - (m)->m_data) \
92 : \
93 (((m)->m_dat + (m)->m_size) - (m)->m_data))
94
95/*
96 * How much free room there is
97 */
98#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
99#define M_TRAILINGSPACE M_FREEROOM
100
101struct mbuf
102{
103 struct m_hdr m_hdr;
104 union M_dat
105 {
106 char m_dat_[1]; /* ANSI don't like 0 sized arrays */
107 char *m_ext_;
108 } M_dat;
109};
110
111#define m_next m_hdr.mh_next
112#define m_prev m_hdr.mh_prev
113#define m_nextpkt m_hdr.mh_nextpkt
114#define m_prevpkt m_hdr.mh_prevpkt
115#define m_flags m_hdr.mh_flags
116#define m_len m_hdr.mh_len
117#define m_data m_hdr.mh_data
118#define m_size m_hdr.mh_size
119#define m_dat M_dat.m_dat_
120#define m_ext M_dat.m_ext_
121#define m_so m_hdr.mh_so
122#define m_la m_hdr.mh_la
123
124#define ifq_prev m_prev
125#define ifq_next m_next
126#define ifs_prev m_prevpkt
127#define ifs_next m_nextpkt
128#define ifq_so m_so
129
130#define M_EXT 0x01 /* m_ext points to more (malloced) data */
131#define M_FREELIST 0x02 /* mbuf is on free list */
132#define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */
133#define M_DOFREE 0x08 /* when m_free is called on the mbuf, free()
134 * it rather than putting it on the free list */
135#define M_FRAG 0x0800 /* packet is a fragment of a larger packet */
136#define M_FIRSTFRAG 0x1000 /* paket is first fragment */
137#define M_LASTFRAG 0x2000 /* paket is last fragment */
138
139extern int mbuf_alloced;
140extern struct mbuf m_freelist, m_usedlist;
141extern int mbuf_max;
142
143void m_init (PNATState);
144void m_fini(PNATState pData);
145void msize_init (PNATState);
146struct mbuf * m_get (PNATState);
147void m_free (PNATState, struct mbuf *);
148void m_cat (PNATState, register struct mbuf *, register struct mbuf *);
149void m_inc (struct mbuf *, int);
150void m_adj (struct mbuf *, int);
151int m_copy (struct mbuf *, struct mbuf *, int, int);
152struct mbuf * dtom (PNATState, void *);
153
154/*
155 * this macro should be used for validation and copying of Ethernet header where it really requred
156 */
157#define MBUF_HEAD(m) ((caddr_t)(((m)->m_flags & M_EXT) ? (m)->m_ext : (m)->m_dat))
158
159#define MBUF_IP_HEADER(m) (caddr_t)(MBUF_HEAD(m) + if_maxlinkhdr)
160
161#else /* VBOX_WITH_SLIRP_BSD_MBUF */
162# include "bsd/sys/mbuf.h"
163#endif /* VBOX_WITH_SLIRP_BSD_MBUF */
164
165#endif /* _MBUF_H_ */
166
167#if defined(M_BUF_DEBUG) && !defined(RT_OS_WINDOWS)
168# define m_get(x) \
169({ \
170 struct mbuf *mdb = m_get((x)); \
171 if(mdb) \
172 { \
173 mdb->m_hdr.mh_allocation_at_file = __FILE__; \
174 mdb->m_hdr.mh_allocation_at_line = __LINE__; \
175 } \
176 LogRel(("NAT:m(id:%d, ptr: %p) allocated at: %s:%d\n", (mdb?mdb->m_hdr.mh_id:-1), mdb, __FILE__, __LINE__));\
177 mdb; \
178})
179
180# define m_free(x, m) \
181({ \
182 (m)->m_hdr.mh_allocation_at_file = NULL; \
183 (m)->m_hdr.mh_allocation_at_line = 0; \
184 LogRel(("NAT:m(id:%d, ptr: %p) freed at: %s:%d\n", (m)->m_hdr.mh_id, (m), __FILE__, __LINE__)); \
185 m_free((x),(m)); \
186})
187#endif
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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