mbuf.c revision 1f6c235b60b29f6c4fec4aad7aebfd0bc5fc6b3d
/*
* Copyright (c) 1995 Danny Gasparovski
*
* Please read the file COPYRIGHT for the
* terms and conditions of the copyright.
*/
/*
* mbuf's in SLiRP are much simpler than the real mbufs in
* FreeBSD. They are fixed size, determined by the MTU,
* so that one whole packet can fit. Mbuf's cannot be
* chained together. If there's more data than the mbuf
* could hold, an external malloced buffer is pointed to
* by m_ext (and the data pointers) and M_EXT is set in
* the flags
*/
#include <slirp.h>
void
{
mbuf_alloced = 0;
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
}
void
{
/*
* Find a nice value for msize
* XXX if_maxlinkhdr already in mtu
*/
}
/*
* Get an mbuf from the free list, if there are none
* malloc one
*
* Because fragmentation can occur if we alloc new mbufs and
* free old mbufs, we mark all mbufs above mbuf_thresh as M_DOFREE,
* which tells m_free to actually free() it
*/
struct mbuf *
{
register struct mbuf *m;
int flags = 0;
#ifdef VBOX_WITH_SYNC_SLIRP
int on_free_list = 0;
#endif
DEBUG_CALL("m_get");
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
if (m == NULL) {
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
goto end_error;
}
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexCreate(&m->m_mutex);
#endif
mbuf_alloced++;
if (mbuf_alloced > mbuf_thresh)
if (mbuf_alloced > mbuf_max)
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
} else {
m = m_freelist.m_next;
}
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
/* Insert it in the used list */
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
/* Initialise it */
m->m_len = 0;
m->m_nextpkt = 0;
m->m_prevpkt = 0;
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
DEBUG_ARG("m = %lx", (long )m);
return m;
}
void
{
DEBUG_CALL("m_free");
DEBUG_ARG("m = %lx", (long )m);
if(m) {
/* Remove from m_usedlist */
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
if (m->m_flags & M_USEDLIST) {
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
}
/* If it's M_EXT, free() it */
/*
* Either free() it or put it on the free list
*/
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
RTSemMutexDestroy(m->m_mutex);
#endif
free(m);
#ifdef VBOX_WITH_SYNC_SLIRP
m = NULL;
mbuf_alloced--;
#else
mbuf_alloced--;
#endif
} else if ((m->m_flags & M_FREELIST) == 0) {
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
}
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
} /* if(m) */
}
/*
* Copy data from one mbuf to the end of
* the other.. if result is too big for one mbuf, malloc()
* an M_EXT data segment
*/
void
{
/*
* If there's no room, realloc
*/
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
if (M_FREEROOM(m) < n->m_len)
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
}
/* make m size bytes large */
void
struct mbuf *m;
int size;
{
int datasize;
/* some compiles throw up on gotos. This one we can fake. */
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
return;
}
/* if (m->m_ext == NULL)
* return (struct mbuf *)NULL;
*/
} else {
char *dat;
/* if (dat == NULL)
* return (struct mbuf *)NULL;
*/
}
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
}
void
struct mbuf *m;
int len;
{
if (m == NULL)
return;
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
if (len >= 0) {
/* Trim from head */
} else {
/* Trim from tail */
}
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
}
/*
* Copy len bytes from m, starting off bytes into n
*/
int
struct mbuf *n, *m;
{
#ifdef VBOX_WITH_SYNC_SLIRP
#endif
if (len > M_FREEROOM(n)) {
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(n->m_mutex);
RTSemMutexRelease(m->m_mutex);
#endif
return -1;
}
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(n->m_mutex);
RTSemMutexRelease(m->m_mutex);
#endif
return 0;
}
/*
* Given a pointer into an mbuf, return the mbuf
* XXX This is a kludge, I should eliminate the need for it
* Fortunately, it's not used often
*/
struct mbuf *
{
struct mbuf *m;
DEBUG_CALL("dtom");
/* bug corrected for M_EXT buffers */
#ifndef VBOX_WITH_SYNC_SLIRP
#else
m = m_usedlist.m_next;
while(1) {
#endif
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
return m;
}
} else {
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
#endif
return m;
}
}
#ifdef VBOX_WITH_SYNC_SLIRP
RTSemMutexRelease(m->m_mutex);
m = mnext;
#endif
}
return (struct mbuf *)0;
}