ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/slirp/mbuf.h
Revision: 1.1
Committed: 2005-05-13T09:00:59Z (19 years, 6 months ago) by gbeauche
Content type: text/plain
Branch: MAIN
CVS Tags: nigel-build-19, nigel-build-17
Log Message:
slirp user mode network emulation code from qemu

File Contents

# User Rev Content
1 gbeauche 1.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 m_freem m_free
41    
42    
43     #define MINCSIZE 4096 /* Amount to increase mbuf if too small */
44    
45     /*
46     * Macros for type conversion
47     * mtod(m,t) - convert mbuf pointer to data pointer of correct type
48     * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX)
49     */
50     #define mtod(m,t) ((t)(m)->m_data)
51     /* #define dtom(x) ((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */
52    
53     /* XXX About mbufs for slirp:
54     * Only one mbuf is ever used in a chain, for each "cell" of data.
55     * m_nextpkt points to the next packet, if fragmented.
56     * If the data is too large, the M_EXT is used, and a larger block
57     * is alloced. Therefore, m_free[m] must check for M_EXT and if set
58     * free the m_ext. This is inefficient memory-wise, but who cares.
59     */
60    
61     /* XXX should union some of these! */
62     /* header at beginning of each mbuf: */
63     struct m_hdr {
64     struct mbuf *mh_next; /* Linked list of mbufs */
65     struct mbuf *mh_prev;
66     struct mbuf *mh_nextpkt; /* Next packet in queue/record */
67     struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */
68     int mh_flags; /* Misc flags */
69    
70     int mh_size; /* Size of data */
71     struct socket *mh_so;
72    
73     caddr_t mh_data; /* Location of data */
74     int mh_len; /* Amount of data in this mbuf */
75     };
76    
77     /*
78     * How much room is in the mbuf, from m_data to the end of the mbuf
79     */
80     #define M_ROOM(m) ((m->m_flags & M_EXT)? \
81     (((m)->m_ext + (m)->m_size) - (m)->m_data) \
82     : \
83     (((m)->m_dat + (m)->m_size) - (m)->m_data))
84    
85     /*
86     * How much free room there is
87     */
88     #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
89     #define M_TRAILINGSPACE M_FREEROOM
90    
91     struct mbuf {
92     struct m_hdr m_hdr;
93     union M_dat {
94     char m_dat_[1]; /* ANSI don't like 0 sized arrays */
95     char *m_ext_;
96     } M_dat;
97     };
98    
99     #define m_next m_hdr.mh_next
100     #define m_prev m_hdr.mh_prev
101     #define m_nextpkt m_hdr.mh_nextpkt
102     #define m_prevpkt m_hdr.mh_prevpkt
103     #define m_flags m_hdr.mh_flags
104     #define m_len m_hdr.mh_len
105     #define m_data m_hdr.mh_data
106     #define m_size m_hdr.mh_size
107     #define m_dat M_dat.m_dat_
108     #define m_ext M_dat.m_ext_
109     #define m_so m_hdr.mh_so
110    
111     #define ifq_prev m_prev
112     #define ifq_next m_next
113     #define ifs_prev m_prevpkt
114     #define ifs_next m_nextpkt
115     #define ifq_so m_so
116    
117     #define M_EXT 0x01 /* m_ext points to more (malloced) data */
118     #define M_FREELIST 0x02 /* mbuf is on free list */
119     #define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */
120     #define M_DOFREE 0x08 /* when m_free is called on the mbuf, free()
121     * it rather than putting it on the free list */
122    
123     /*
124     * Mbuf statistics. XXX
125     */
126    
127     struct mbstat {
128     int mbs_alloced; /* Number of mbufs allocated */
129    
130     };
131    
132     extern struct mbstat mbstat;
133     extern int mbuf_alloced;
134     extern struct mbuf m_freelist, m_usedlist;
135     extern int mbuf_max;
136    
137     void m_init _P((void));
138     void msize_init _P((void));
139     struct mbuf * m_get _P((void));
140     void m_free _P((struct mbuf *));
141     void m_cat _P((register struct mbuf *, register struct mbuf *));
142     void m_inc _P((struct mbuf *, int));
143     void m_adj _P((struct mbuf *, int));
144     int m_copy _P((struct mbuf *, struct mbuf *, int, int));
145     struct mbuf * dtom _P((void *));
146    
147     #endif