#include <rte_errno.h>
#include <rte_malloc.h>
#include <rte_string_fns.h>
+#include <rte_bitops.h>
#include <rte_mbuf.h>
#include <rte_mbuf_dyn.h>
break;
}
- if (te == NULL) {
+ if (te == NULL || mbuf_dynfield == NULL) {
rte_errno = ENOENT;
return NULL;
}
{
struct mbuf_dynfield_elt *mbuf_dynfield;
- if (shm == NULL) {
- rte_errno = ENOENT;
- return -1;
- }
-
rte_mcfg_tailq_read_lock();
- mbuf_dynfield = __mbuf_dynfield_lookup(name);
+ if (shm == NULL && init_shared_mem() < 0)
+ mbuf_dynfield = NULL;
+ else
+ mbuf_dynfield = __mbuf_dynfield_lookup(name);
rte_mcfg_tailq_read_unlock();
- if (mbuf_dynfield == NULL) {
- rte_errno = ENOENT;
+ if (mbuf_dynfield == NULL)
return -1;
- }
if (params != NULL)
memcpy(params, &mbuf_dynfield->params, sizeof(*params));
{
struct mbuf_dynflag_elt *mbuf_dynflag;
- if (shm == NULL) {
- rte_errno = ENOENT;
- return -1;
- }
-
rte_mcfg_tailq_read_lock();
- mbuf_dynflag = __mbuf_dynflag_lookup(name);
+ if (shm == NULL && init_shared_mem() < 0)
+ mbuf_dynflag = NULL;
+ else
+ mbuf_dynflag = __mbuf_dynflag_lookup(name);
rte_mcfg_tailq_read_unlock();
- if (mbuf_dynflag == NULL) {
- rte_errno = ENOENT;
+ if (mbuf_dynflag == NULL)
return -1;
- }
if (params != NULL)
memcpy(params, &mbuf_dynflag->params, sizeof(*params));
dynflag->params.name, dynflag->bitnum,
dynflag->params.flags);
}
- fprintf(out, "Free space in mbuf (0 = free, value = zone alignment):\n");
+ fprintf(out, "Free space in mbuf (0 = occupied, value = free zone alignment):\n");
for (i = 0; i < sizeof(struct rte_mbuf); i++) {
if ((i % 8) == 0)
fprintf(out, " %4.4zx: ", i);
fprintf(out, "%2.2x%s", shm->free_space[i],
(i % 8 != 7) ? " " : "\n");
}
+ fprintf(out, "Free bit in mbuf->ol_flags (0 = occupied, 1 = free):\n");
+ for (i = 0; i < sizeof(uint64_t) * CHAR_BIT; i++) {
+ if ((i % 8) == 0)
+ fprintf(out, " %4.4zx: ", i);
+ fprintf(out, "%1.1x%s", (shm->free_flags & (1ULL << i)) ? 1 : 0,
+ (i % 8 != 7) ? " " : "\n");
+ }
+
rte_mcfg_tailq_write_unlock();
}
+
+static int
+rte_mbuf_dyn_timestamp_register(int *field_offset, uint64_t *flag,
+ const char *direction, const char *flag_name)
+{
+ static const struct rte_mbuf_dynfield field_desc = {
+ .name = RTE_MBUF_DYNFIELD_TIMESTAMP_NAME,
+ .size = sizeof(rte_mbuf_timestamp_t),
+ .align = __alignof__(rte_mbuf_timestamp_t),
+ };
+ struct rte_mbuf_dynflag flag_desc = {};
+ int offset;
+
+ offset = rte_mbuf_dynfield_register(&field_desc);
+ if (offset < 0) {
+ RTE_LOG(ERR, MBUF,
+ "Failed to register mbuf field for timestamp\n");
+ return -1;
+ }
+ if (field_offset != NULL)
+ *field_offset = offset;
+
+ strlcpy(flag_desc.name, flag_name, sizeof(flag_desc.name));
+ offset = rte_mbuf_dynflag_register(&flag_desc);
+ if (offset < 0) {
+ RTE_LOG(ERR, MBUF,
+ "Failed to register mbuf flag for %s timestamp\n",
+ direction);
+ return -1;
+ }
+ if (flag != NULL)
+ *flag = RTE_BIT64(offset);
+
+ return 0;
+}
+
+int
+rte_mbuf_dyn_rx_timestamp_register(int *field_offset, uint64_t *rx_flag)
+{
+ return rte_mbuf_dyn_timestamp_register(field_offset, rx_flag,
+ "Rx", RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME);
+}
+
+int
+rte_mbuf_dyn_tx_timestamp_register(int *field_offset, uint64_t *tx_flag)
+{
+ return rte_mbuf_dyn_timestamp_register(field_offset, tx_flag,
+ "Tx", RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME);
+}