for (i = 0; i < num_bufs; i++) {
bufs[i] = rte_pktmbuf_alloc(p);
TEST_ASSERT_NOT_NULL(bufs[i], "Packet allocation failed\n");
- bufs[i]->seqn = i;
+ *rte_reorder_seqn(bufs[i]) = i;
}
/* This should fill up order buffer:
bufs[4] = NULL;
/* early packet from current sequence window - full ready buffer */
- bufs[5]->seqn = 2 * size;
+ *rte_reorder_seqn(bufs[5]) = 2 * size;
ret = rte_reorder_insert(b, bufs[5]);
if (!((ret == -1) && (rte_errno == ENOSPC))) {
printf("%s:%d: No error inserting early packet with full ready buffer\n",
bufs[5] = NULL;
/* late packet */
- bufs[6]->seqn = 3 * size;
+ *rte_reorder_seqn(bufs[6]) = 3 * size;
ret = rte_reorder_insert(b, bufs[6]);
if (!((ret == -1) && (rte_errno == ERANGE))) {
printf("%s:%d: No error inserting late packet with seqn:"
for (i = 0; i < num_bufs; i++) {
bufs[i] = rte_pktmbuf_alloc(p);
TEST_ASSERT_NOT_NULL(bufs[i], "Packet allocation failed\n");
- bufs[i]->seqn = i;
+ *rte_reorder_seqn(bufs[i]) = i;
}
/* Insert packet with seqn 1:
/* mark sequence number */
for (i = 0; i < nb_rx_pkts; )
- pkts[i++]->seqn = seqn++;
+ *rte_reorder_seqn(pkts[i++]) = seqn++;
/* enqueue to rx_to_workers ring */
ret = rte_ring_enqueue_burst(ring_out,
#include <rte_string_fns.h>
#include <rte_log.h>
#include <rte_mbuf.h>
+#include <rte_mbuf_dyn.h>
#include <rte_eal_memconfig.h>
#include <rte_errno.h>
#include <rte_malloc.h>
/* Macros for printing using RTE_LOG */
#define RTE_LOGTYPE_REORDER RTE_LOGTYPE_USER1
+#define RTE_REORDER_SEQN_DYNFIELD_NAME "rte_reorder_seqn_dynfield"
+int rte_reorder_seqn_dynfield_offset = -1;
+
/* A generic circular buffer */
struct cir_buffer {
unsigned int size; /**< Number of entries that can be stored */
struct rte_reorder_list *reorder_list;
const unsigned int bufsize = sizeof(struct rte_reorder_buffer) +
(2 * size * sizeof(struct rte_mbuf *));
+ static const struct rte_mbuf_dynfield reorder_seqn_dynfield_desc = {
+ .name = RTE_REORDER_SEQN_DYNFIELD_NAME,
+ .size = sizeof(rte_reorder_seqn_t),
+ .align = __alignof__(rte_reorder_seqn_t),
+ };
reorder_list = RTE_TAILQ_CAST(rte_reorder_tailq.head, rte_reorder_list);
return NULL;
}
+ rte_reorder_seqn_dynfield_offset =
+ rte_mbuf_dynfield_register(&reorder_seqn_dynfield_desc);
+ if (rte_reorder_seqn_dynfield_offset < 0) {
+ RTE_LOG(ERR, REORDER, "Failed to register mbuf field for reorder sequence number\n");
+ rte_errno = ENOMEM;
+ return NULL;
+ }
+
rte_mcfg_tailq_write_lock();
/* guarantee there's no existing */
order_buf = &b->order_buf;
if (!b->is_initialized) {
- b->min_seqn = mbuf->seqn;
+ b->min_seqn = *rte_reorder_seqn(mbuf);
b->is_initialized = 1;
}
* mbuf_seqn = 0x0010
* offset = 0x0010 - 0xFFFD = 0x13
*/
- offset = mbuf->seqn - b->min_seqn;
+ offset = *rte_reorder_seqn(mbuf) - b->min_seqn;
/*
* action to take depends on offset.
rte_errno = ENOSPC;
return -1;
}
- offset = mbuf->seqn - b->min_seqn;
+ offset = *rte_reorder_seqn(mbuf) - b->min_seqn;
position = (order_buf->head + offset) & order_buf->mask;
order_buf->entries[position] = mbuf;
} else {
*/
#include <rte_mbuf.h>
+#include <rte_mbuf_dyn.h>
#ifdef __cplusplus
extern "C" {
struct rte_reorder_buffer;
+typedef uint32_t rte_reorder_seqn_t;
+extern int rte_reorder_seqn_dynfield_offset;
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Read reorder sequence number from mbuf.
+ *
+ * @param mbuf Structure to read from.
+ * @return pointer to reorder sequence number.
+ */
+__rte_experimental
+static inline rte_reorder_seqn_t *
+rte_reorder_seqn(struct rte_mbuf *mbuf)
+{
+ return RTE_MBUF_DYNFIELD(mbuf, rte_reorder_seqn_dynfield_offset,
+ rte_reorder_seqn_t *);
+}
+
/**
* Create a new reorder buffer instance
*
local: *;
};
+
+EXPERIMENTAL {
+ global:
+
+ rte_reorder_seqn_dynfield_offset;
+};