Revision 460fec67 slirp/mbuf.c
b/slirp/mbuf.c | ||
---|---|---|
17 | 17 |
|
18 | 18 |
#include <slirp.h> |
19 | 19 |
|
20 |
static int mbuf_alloced; |
|
21 |
struct mbuf m_freelist, m_usedlist; |
|
22 | 20 |
#define MBUF_THRESH 30 |
23 | 21 |
|
24 | 22 |
/* |
... | ... | |
28 | 26 |
#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + sizeof(struct m_hdr ) + 6) |
29 | 27 |
|
30 | 28 |
void |
31 |
m_init(void)
|
|
29 |
m_init(Slirp *slirp)
|
|
32 | 30 |
{ |
33 |
m_freelist.m_next = m_freelist.m_prev = &m_freelist;
|
|
34 |
m_usedlist.m_next = m_usedlist.m_prev = &m_usedlist;
|
|
31 |
slirp->m_freelist.m_next = slirp->m_freelist.m_prev = &slirp->m_freelist;
|
|
32 |
slirp->m_usedlist.m_next = slirp->m_usedlist.m_prev = &slirp->m_usedlist;
|
|
35 | 33 |
} |
36 | 34 |
|
37 | 35 |
/* |
... | ... | |
43 | 41 |
* which tells m_free to actually free() it |
44 | 42 |
*/ |
45 | 43 |
struct mbuf * |
46 |
m_get(void)
|
|
44 |
m_get(Slirp *slirp)
|
|
47 | 45 |
{ |
48 | 46 |
register struct mbuf *m; |
49 | 47 |
int flags = 0; |
50 | 48 |
|
51 | 49 |
DEBUG_CALL("m_get"); |
52 | 50 |
|
53 |
if (m_freelist.m_next == &m_freelist) {
|
|
51 |
if (slirp->m_freelist.m_next == &slirp->m_freelist) {
|
|
54 | 52 |
m = (struct mbuf *)malloc(SLIRP_MSIZE); |
55 | 53 |
if (m == NULL) goto end_error; |
56 |
mbuf_alloced++; |
|
57 |
if (mbuf_alloced > MBUF_THRESH) |
|
54 |
slirp->mbuf_alloced++;
|
|
55 |
if (slirp->mbuf_alloced > MBUF_THRESH)
|
|
58 | 56 |
flags = M_DOFREE; |
57 |
m->slirp = slirp; |
|
59 | 58 |
} else { |
60 |
m = m_freelist.m_next; |
|
59 |
m = slirp->m_freelist.m_next;
|
|
61 | 60 |
remque(m); |
62 | 61 |
} |
63 | 62 |
|
64 | 63 |
/* Insert it in the used list */ |
65 |
insque(m,&m_usedlist); |
|
64 |
insque(m,&slirp->m_usedlist);
|
|
66 | 65 |
m->m_flags = (flags | M_USEDLIST); |
67 | 66 |
|
68 | 67 |
/* Initialise it */ |
... | ... | |
97 | 96 |
*/ |
98 | 97 |
if (m->m_flags & M_DOFREE) { |
99 | 98 |
free(m); |
100 |
mbuf_alloced--; |
|
99 |
m->slirp->mbuf_alloced--;
|
|
101 | 100 |
} else if ((m->m_flags & M_FREELIST) == 0) { |
102 |
insque(m,&m_freelist); |
|
101 |
insque(m,&m->slirp->m_freelist);
|
|
103 | 102 |
m->m_flags = M_FREELIST; /* Clobber other flags */ |
104 | 103 |
} |
105 | 104 |
} /* if(m) */ |
... | ... | |
194 | 193 |
* Fortunately, it's not used often |
195 | 194 |
*/ |
196 | 195 |
struct mbuf * |
197 |
dtom(void *dat) |
|
196 |
dtom(Slirp *slirp, void *dat)
|
|
198 | 197 |
{ |
199 | 198 |
struct mbuf *m; |
200 | 199 |
|
... | ... | |
202 | 201 |
DEBUG_ARG("dat = %lx", (long )dat); |
203 | 202 |
|
204 | 203 |
/* bug corrected for M_EXT buffers */ |
205 |
for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next) { |
|
204 |
for (m = slirp->m_usedlist.m_next; m != &slirp->m_usedlist; |
|
205 |
m = m->m_next) { |
|
206 | 206 |
if (m->m_flags & M_EXT) { |
207 | 207 |
if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) ) |
208 | 208 |
return m; |
Also available in: Unified diff