#ifndef _IOMBUFQUEUE_H
#define _IOMBUFQUEUE_H
extern "C" {
#include <sys/param.h>
#include <sys/mbuf.h>
}
struct IOMbufQueue {
mbuf_t head;
mbuf_t tail;
UInt32 size;
UInt32 capacity;
};
static __inline__
UInt32 IOMbufFree(mbuf_t m)
{
return mbuf_freem_list(m);
}
static __inline__
void IOMbufQueueInit(IOMbufQueue * q, UInt32 capacity)
{
q->head = q->tail = 0;
q->size = 0;
q->capacity = capacity;
}
static __inline__
bool IOMbufQueueEnqueue(IOMbufQueue * q, mbuf_t m)
{
if (q->size >= q->capacity) return false;
if (q->size++ > 0)
mbuf_setnextpkt(q->tail , m );
else
q->head = m;
for (q->tail = m;
mbuf_nextpkt(q->tail);
q->tail = mbuf_nextpkt(q->tail), q->size++)
;
return true;
}
static __inline__
bool IOMbufQueueEnqueue(IOMbufQueue * q, IOMbufQueue * qe)
{
if (qe->size)
{
if (q->size == 0)
q->head = qe->head;
else
mbuf_setnextpkt(q->tail , qe->head);
q->tail = qe->tail;
q->size += qe->size;
qe->head = qe->tail = 0;
qe->size = 0;
}
return true;
}
static __inline__
void IOMbufQueuePrepend(IOMbufQueue * q, mbuf_t m)
{
mbuf_t tail;
for (tail = m, q->size++;
mbuf_nextpkt(tail);
tail = mbuf_nextpkt(tail), q->size++)
;
mbuf_setnextpkt(tail , q->head);
if (q->tail == 0)
q->tail = tail;
q->head = m;
}
static __inline__
void IOMbufQueuePrepend(IOMbufQueue * q, IOMbufQueue * qp)
{
if (qp->size)
{
mbuf_setnextpkt(qp->tail , q->head);
if (q->tail == 0)
q->tail = qp->tail;
q->head = qp->head;
q->size += qp->size;
qp->head = qp->tail = 0;
qp->size = 0;
}
}
static __inline__
mbuf_t IOMbufQueueDequeue(IOMbufQueue * q)
{
mbuf_t m = q->head;
if (m)
{
if ((q->head = mbuf_nextpkt(m)) == 0)
q->tail = 0;
mbuf_setnextpkt(m , 0);
q->size--;
}
return m;
}
static __inline__
mbuf_t IOMbufQueueDequeueAll(IOMbufQueue * q)
{
mbuf_t m = q->head;
q->head = q->tail = 0;
q->size = 0;
return m;
}
static __inline__
mbuf_t IOMbufQueuePeek(IOMbufQueue * q)
{
return q->head;
}
static __inline__
UInt32 IOMbufQueueGetSize(IOMbufQueue * q)
{
return q->size;
}
static __inline__
UInt32 IOMbufQueueGetCapacity(IOMbufQueue * q)
{
return q->capacity;
}
static __inline__
void IOMbufQueueSetCapacity(IOMbufQueue * q, UInt32 capacity)
{
q->capacity = capacity;
}
#endif