void mbuf_add_item(struct mbuf_set *ms, const struct mbuf_item *item) { ASSERT(ms); if (ms->len == ms->capacity) { struct mbuf_item rm; ASSERT(mbuf_extract_item(ms, &rm)); mbuf_free_buf(rm.buffer); msg(D_MULTI_DROPPED, "MBUF: mbuf packet dropped"); } ASSERT(ms->len < ms->capacity); ms->array[MBUF_INDEX(ms->head, ms->len, ms->capacity)] = *item; if (++ms->len > ms->max_queued) { ms->max_queued = ms->len; } ++item->buffer->refcount; }
static bool multi_tcp_process_outgoing_link_ready(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags) { struct mbuf_item item; bool ret = true; ASSERT(mi); /* extract from queue */ if (mbuf_extract_item(mi->tcp_link_out_deferred, &item)) /* ciphertext IP packet */ { dmsg(D_MULTI_TCP, "MULTI TCP: transmitting previously deferred packet"); ASSERT(mi == item.instance); mi->context.c2.to_link = item.buffer->buf; ret = multi_process_outgoing_link_dowork(m, mi, mpp_flags); if (!ret) { mi = NULL; } mbuf_free_buf(item.buffer); } return ret; }