14
14
* by m_ext (and the data pointers) and M_EXT is set in
19
#define MBUF_ZONE_SIZE 100
20
static int mbuf_zone_init(PNATState pData)
23
struct mbuf_zone *mzone;
26
uint8_t *zone = RTMemAlloc(msize * MBUF_ZONE_SIZE);
29
LogRel(("NAT: can't allocate new zone\n"));
32
mzone = RTMemAllocZ(sizeof (struct mbuf_zone));
36
LogRel(("NAT: can't allocate zone descriptor\n"));
40
for(i = 0; i < MBUF_ZONE_SIZE; ++i)
42
m = (struct mbuf *)((char *)zone + i*msize);
43
memset(m, 0, sizeof(struct mbuf));
45
m->m_hdr.mh_id = pData->mbuf_zone_count * MBUF_ZONE_SIZE + i;
47
insque(pData, m, &m_freelist);
49
mzone->mbuf_zone_base_addr = zone;
50
LIST_INSERT_HEAD(&pData->mbuf_zone_head, mzone, list);
51
pData->mbuf_zone_count++;
52
pData->mbuf_water_line_limit = pData->mbuf_zone_count * MBUF_ZONE_SIZE;
56
void m_fini(PNATState pData)
62
while(!LIST_EMPTY(&pData->mbuf_zone_head))
64
mz = LIST_FIRST(&pData->mbuf_zone_head);
65
zone = mz->mbuf_zone_base_addr;
66
for(i = 0; i < MBUF_ZONE_SIZE; ++i)
68
m = (struct mbuf *)((char *)zone + i*msize);
69
if ( (m->m_flags & M_EXT)
74
LIST_REMOVE(mz, list);
22
80
m_init(PNATState pData)
24
85
m_freelist.m_next = m_freelist.m_prev = &m_freelist;
25
86
m_usedlist.m_next = m_usedlist.m_prev = &m_usedlist;
90
rc = RTCritSectInit(&pData->cs_mbuf_zone);
92
rc = mbuf_zone_init(pData);
34
101
* Find a nice value for msize
35
* XXX if_maxlinkhdr already in mtu
37
103
msize = (if_mtu>if_mru ? if_mtu : if_mru)
38
104
+ sizeof(struct m_hdr) + sizeof(void *) /*pointer to the backstore*/
43
115
* Get an mbuf from the free list, if there are none
53
125
register struct mbuf *m;
56
129
DEBUG_CALL("m_get");
131
rc = RTCritSectEnter(&pData->cs_mbuf_zone);
58
135
if (m_freelist.m_next == &m_freelist)
138
int rc = mbuf_zone_init(pData);
141
AssertMsgFailed(("No mbufs on free list\n"));
60
144
m = (struct mbuf *)RTMemAlloc(msize);
160
STAM_COUNTER_INC(&pData->StatMBufAllocation);
75
161
/* Insert it in the used list */
164
if (mbuf_alloced >= MBUF_ZONE_SIZE/2)
166
pData->fmbuf_water_line = 1;
76
169
insque(pData, m, &m_usedlist);
77
170
m->m_flags = (flags | M_USEDLIST);
85
#ifdef VBOX_WITH_SLIRP_ALIAS
88
179
memset(m->m_data, 0, if_maxlinkhdr); /*initialization of ether area */
91
182
DEBUG_ARG("m = %lx", (long )m);
183
rc = RTCritSectLeave(&pData->cs_mbuf_zone);
96
189
m_free(PNATState pData, struct mbuf *m)
99
192
DEBUG_CALL("m_free");
100
193
DEBUG_ARG("m = %lx", (long )m);
195
rc = RTCritSectEnter(&pData->cs_mbuf_zone);
104
200
/* Remove from m_usedlist */
105
201
if (m->m_flags & M_USEDLIST)
115
211
if (m->m_flags & M_DOFREE)
214
if ((m->m_flags & M_EXT) == 0)
215
memset(m->m_dat, 0, if_mtu);
216
insque(pData, m, &m_freelist);
217
m->m_flags = M_FREELIST; /* Clobber other flags */
120
223
else if ((m->m_flags & M_FREELIST) == 0)
122
225
insque(pData, m,&m_freelist);
123
226
m->m_flags = M_FREELIST; /* Clobber other flags */
228
STAM_COUNTER_INC(&pData->StatMBufAllocation);
230
rc = RTCritSectLeave(&pData->cs_mbuf_zone);
234
/* update macros for m_get/m_free*/
129
240
* Copy data from one mbuf to the end of
130
241
* the other.. if result is too big for one mbuf, malloc()
257
368
return (struct mbuf *)0;
370
#ifndef VBOX_WITH_SLIRP_BSD_MBUF
371
void *slirp_ext_m_get(PNATState pData)
373
return (void *)m_get(pData);
376
void slirp_ext_m_free(PNATState pData, void *arg)
378
struct mbuf *m = (struct mbuf *)arg;
381
void slirp_ext_m_append(PNATState pData, void *arg, uint8_t *pu8Buf, size_t cbBuf)
384
struct mbuf *m = (struct mbuf *)arg;
385
if (cbBuf > M_FREEROOM(m))
390
memcpy(c, pu8Buf, cbBuf);