pkt_stream
pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &pkts_sent);
pkt_stream->nb_rx_pkts++;
pkt_stream_cancel(pkt_stream);
struct pkt_stream *pkt_stream = xsk->pkt_stream;
if (!pkt_stream) {
if (pkt_stream->nb_rx_pkts == pkt_stream->nb_valid_entries) {
struct pkt_stream *pkt_stream = xsk->pkt_stream;
buffer_len = pkt_get_buffer_len(umem, pkt_stream->max_pkt_len);
struct pkt *pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
nb_frags = pkt_nb_frags(umem->frame_size, pkt_stream, pkt);
pkt_stream_cancel(pkt_stream);
if (pkt_stream->verbatim) {
if (pkt_stream->verbatim)
pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
struct pkt_stream *pkt_stream;
pkt_stream = ifobject->xsk_arr[i].pkt_stream;
if (!pkt_stream || pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts) {
if (stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 ||
stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 - 1)
if (stats.tx_invalid_descs != ifobject->xsk->pkt_stream->nb_pkts / 2) {
ifobject->xsk->pkt_stream->nb_pkts);
static int xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream *pkt_stream,
struct pkt *pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &nb_pkts);
for (i = 0; i < pkt_nb_frags(rx_frame_size, pkt_stream, pkt); i++) {
pkt_stream_reset(pkt_stream);
ret = xsk_populate_fill_ring(ifobject->umem, ifobject->xsk->pkt_stream,
pkt_stream_reset(ifobj2->xsk->pkt_stream);
pkt_stream_reset(ifobj1->xsk->pkt_stream);
test->ifobj_tx->xsk_arr[0].pkt_stream = NULL;
test->ifobj_rx->xsk_arr[0].pkt_stream = NULL;
test->ifobj_tx->xsk_arr[1].pkt_stream = test->tx_pkt_stream_default;
test->ifobj_rx->xsk_arr[1].pkt_stream = test->rx_pkt_stream_default;
struct pkt_stream *tmp;
test->ifobj_tx->xsk->pkt_stream = tmp;
test->ifobj_rx->xsk->pkt_stream = tmp;
struct pkt_stream *tmp;
test->ifobj_tx->xsk->pkt_stream = tmp;
test->ifobj_rx->xsk->pkt_stream = tmp;
ifobj->xsk_arr[j].pkt_stream = test->tx_pkt_stream_default;
ifobj->xsk_arr[j].pkt_stream = test->rx_pkt_stream_default;
struct pkt_stream *tx_pkt_stream;
struct pkt_stream *rx_pkt_stream;
void pkt_stream_reset(struct pkt_stream *pkt_stream)
if (pkt_stream) {
pkt_stream->current_pkt_nb = 0;
pkt_stream->nb_rx_pkts = 0;
static struct pkt *pkt_stream_get_next_tx_pkt(struct pkt_stream *pkt_stream)
if (pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts)
return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
static struct pkt *pkt_stream_get_next_rx_pkt(struct pkt_stream *pkt_stream, u32 *pkts_sent)
while (pkt_stream->current_pkt_nb < pkt_stream->nb_pkts) {
if (pkt_stream->pkts[pkt_stream->current_pkt_nb].valid)
return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
pkt_stream->current_pkt_nb++;
void pkt_stream_delete(struct pkt_stream *pkt_stream)
free(pkt_stream->pkts);
free(pkt_stream);
struct pkt_stream *tx_pkt_stream = test->ifobj_tx->xsk->pkt_stream;
struct pkt_stream *rx_pkt_stream = test->ifobj_rx->xsk->pkt_stream;
pkt_stream_delete(test->ifobj_tx->xsk->pkt_stream);
test->ifobj_tx->xsk->pkt_stream = test->tx_pkt_stream_default;
pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
test->ifobj_rx->xsk->pkt_stream = test->rx_pkt_stream_default;
static struct pkt_stream *__pkt_stream_alloc(u32 nb_pkts)
struct pkt_stream *pkt_stream;
pkt_stream = calloc(1, sizeof(*pkt_stream));
if (!pkt_stream)
pkt_stream->pkts = calloc(nb_pkts, sizeof(*pkt_stream->pkts));
if (!pkt_stream->pkts) {
free(pkt_stream);
pkt_stream->nb_pkts = nb_pkts;
return pkt_stream;
static u32 pkt_nb_frags(u32 frame_size, struct pkt_stream *pkt_stream, struct pkt *pkt)
if (!pkt_stream->verbatim) {
next_frag = pkt_stream->current_pkt_nb;
while (next_frag++ < pkt_stream->nb_pkts) {
static void pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
static void pkt_stream_pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
pkt_set(pkt_stream, pkt, offset, len);
pkt_stream->nb_valid_entries += pkt->valid - prev_pkt_valid;
static struct pkt_stream *__pkt_stream_generate(u32 nb_pkts, u32 pkt_len, u32 nb_start, u32 nb_off)
struct pkt_stream *pkt_stream;
pkt_stream = __pkt_stream_alloc(nb_pkts);
if (!pkt_stream)
pkt_stream->nb_pkts = nb_pkts;
pkt_stream->max_pkt_len = pkt_len;
struct pkt *pkt = &pkt_stream->pkts[i];
pkt_stream_pkt_set(pkt_stream, pkt, 0, pkt_len);
return pkt_stream;
struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len)
static struct pkt_stream *pkt_stream_clone(struct pkt_stream *pkt_stream)
return pkt_stream_generate(pkt_stream->nb_pkts, pkt_stream->pkts[0].len);
ifobj->xsk->pkt_stream = pkt_stream_generate(nb_pkts, pkt_len);
if (!ifobj->xsk->pkt_stream)
struct pkt_stream *pkt_stream;
pkt_stream = pkt_stream_clone(ifobj->xsk->pkt_stream);
if (!pkt_stream)
for (i = 1; i < ifobj->xsk->pkt_stream->nb_pkts; i += 2)
pkt_stream_pkt_set(pkt_stream, &pkt_stream->pkts[i], offset, pkt_len);
ifobj->xsk->pkt_stream = pkt_stream;
struct pkt_stream *pkt_stream = test->ifobj_tx->xsk->pkt_stream;
if (test->ifobj_rx->xsk->pkt_stream != test->rx_pkt_stream_default)
pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(pkt_stream->nb_pkts,
pkt_stream->pkts[0].len);
if (!test->ifobj_rx->xsk->pkt_stream)
pkt_stream = test->ifobj_rx->xsk->pkt_stream;
for (i = 1; i < pkt_stream->nb_pkts; i += 2)
pkt_stream->pkts[i].valid = false;
pkt_stream->nb_valid_entries /= 2;
struct pkt_stream *pkt_stream;
pkt_stream = test->ifobj_tx->xsk_arr[i].pkt_stream;
pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
pkt_stream->pkts[0].len, i, 2);
if (!pkt_stream)
test->ifobj_tx->xsk_arr[i].pkt_stream = pkt_stream;
pkt_stream = test->ifobj_rx->xsk_arr[i].pkt_stream;
pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
pkt_stream->pkts[0].len, i, 2);
if (!pkt_stream)
test->ifobj_rx->xsk_arr[i].pkt_stream = pkt_stream;
struct pkt_stream *later_free_tx = test->ifobj_tx->xsk->pkt_stream;
struct pkt_stream *later_free_rx = test->ifobj_rx->xsk->pkt_stream;
if (test->ifobj_tx->xsk_arr[i].pkt_stream != later_free_tx)
pkt_stream_delete(test->ifobj_tx->xsk_arr[i].pkt_stream);
if (test->ifobj_rx->xsk_arr[i].pkt_stream != later_free_rx)
pkt_stream_delete(test->ifobj_rx->xsk_arr[i].pkt_stream);
static void pkt_stream_cancel(struct pkt_stream *pkt_stream)
pkt_stream->current_pkt_nb--;
static struct pkt_stream *__pkt_stream_generate_custom(struct ifobject *ifobj, struct pkt *frames,
struct pkt_stream *pkt_stream;
pkt_stream = __pkt_stream_alloc(nb_frames);
if (!pkt_stream)
struct pkt *pkt = &pkt_stream->pkts[pkt_nb];
if (pkt->valid && pkt->len > pkt_stream->max_pkt_len)
pkt_stream->max_pkt_len = pkt->len;
pkt_stream->nb_valid_entries++;
pkt_stream->nb_pkts = pkt_nb;
pkt_stream->verbatim = verbatim;
return pkt_stream;
struct pkt_stream *pkt_stream;
pkt_stream = __pkt_stream_generate_custom(test->ifobj_tx, pkts, nb_pkts, true);
if (!pkt_stream)
test->ifobj_tx->xsk->pkt_stream = pkt_stream;
pkt_stream = __pkt_stream_generate_custom(test->ifobj_rx, pkts, nb_pkts, false);
if (!pkt_stream)
test->ifobj_rx->xsk->pkt_stream = pkt_stream;
struct pkt_stream *pkt_stream = xsk->pkt_stream;
struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len);
void pkt_stream_delete(struct pkt_stream *pkt_stream);
void pkt_stream_reset(struct pkt_stream *pkt_stream);
struct pkt_stream *tx_pkt_stream_default;
struct pkt_stream *rx_pkt_stream_default;
struct pkt_stream *pkt_stream;
struct pkt_stream *rx_pkt_stream_default;
struct pkt_stream *tx_pkt_stream_default;