#ifndef NETBUF_H
#define NETBUF_H
#ifdef __cplusplus
extern "C" {
#endif
#include "sllist.h"
#include "netbuf-defs.h"
#include "netbuf-mblock.h"
typedef struct {
nb_MBLOCK *parent;
nb_SIZE offset;
nb_SIZE size;
} nb_SPAN;
#define NETBUF_INVALID_OFFSET (nb_SIZE)-1
#define CREATE_STANDALONE_SPAN(span, buf, len) \
(span)->parent = (nb_MBLOCK *) (void *)buf; \
(span)->offset = NETBUF_INVALID_OFFSET; \
(span)->size = len;
typedef struct {
sllist_node slnode;
char *base;
nb_SIZE len;
} nb_SNDQELEM;
typedef struct {
sllist_root pending;
sllist_root pdus;
nb_SNDQELEM *last_requested;
nb_SIZE last_offset;
nb_SIZE pdu_offset;
nb_MBPOOL elempool;
} nb_SENDQ;
struct netbuf_st {
nb_SENDQ sendq;
nb_MBPOOL datapool;
nb_SETTINGS settings;
};
#define SPAN_SABUFFER_NC(span) ((char *)(span)->parent)
#define SPAN_MBUFFER_NC(span) ((span)->parent->root + (span)->offset)
#define SPAN_BUFFER(span) \
(((span)->offset == NETBUF_INVALID_OFFSET) ? SPAN_SABUFFER_NC(span) : SPAN_MBUFFER_NC(span))
int
netbuf_mblock_reserve(nb_MGR *mgr, nb_SPAN *span);
void
netbuf_mblock_release(nb_MGR *mgr, nb_SPAN *span);
void
netbuf_enqueue(nb_MGR *mgr, const nb_IOV *bufinfo);
void
netbuf_enqueue_span(nb_MGR *mgr, nb_SPAN *span);
unsigned int
netbuf_get_niov(nb_MGR *mgr);
nb_SIZE
netbuf_start_flush(nb_MGR *mgr, nb_IOV *iovs, int niov, int *nused);
void
netbuf_end_flush(nb_MGR *mgr, nb_SIZE nflushed);
#define netbuf_reset_flush(mgr) do { \
(mgr)->sendq.last_requested = NULL; \
(mgr)->sendq.last_offset = 0; \
} while (0);
nb_SIZE
netbuf_get_size(const nb_MGR *mgr);
nb_SIZE
netbuf_mblock_get_next_size(const nb_MGR *mgr, int allow_wrap);
void
netbuf_init(nb_MGR *mgr, const nb_SETTINGS *settings);
void
netbuf_cleanup(nb_MGR *mgr);
void
netbuf_default_settings(nb_SETTINGS *settings);
void
netbuf_dump_status(nb_MGR *mgr, FILE *fp);
void
netbuf_pdu_enqueue(nb_MGR *mgr, void *pdu, nb_SIZE lloff);
typedef nb_SIZE (*nb_getsize_fn)(void *pdu, nb_SIZE remaining, void *arg);
void
netbuf_end_flush2(nb_MGR *mgr,
unsigned int nflushed,
nb_getsize_fn callback,
nb_SIZE lloff, void *arg);
int
netbuf_is_clean(nb_MGR *mgr);
int
netbuf_has_flushdata(nb_MGR *mgr);
#ifdef __cplusplus
}
#endif
#endif