mbuf: add timestamp dynamic field and flag (example) dyn-mbuf1
authorOlivier Matz <olivier.matz@6wind.com>
Wed, 18 Sep 2019 16:28:12 +0000 (18:28 +0200)
committerOlivier Matz <olivier.matz@6wind.com>
Wed, 18 Sep 2019 16:42:36 +0000 (18:42 +0200)
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_mbuf/rte_mbuf_dyn.c
lib/librte_mbuf/rte_mbuf_dyn.h
lib/librte_mbuf/rte_mbuf_version.map

index 13b8742..6398ceb 100644 (file)
@@ -406,3 +406,33 @@ fail:
        rte_free(te);
        return -1;
 }
+
+const struct rte_mbuf_dynfield rte_mbuf_dynfield_timestamp = {
+       .name = "rte_mbuf_dynfield_timestamp",
+       .size = sizeof(uint64_t),
+       .align = __alignof__(uint64_t),
+       .flags = 0,
+};
+int rte_mbuf_dynfield_timestamp_offset = -1;
+
+const struct rte_mbuf_dynflag rte_mbuf_dynflag_timestamp = {
+       .name = "rte_mbuf_dynflag_timestamp",
+       .flags = 0,
+};
+int rte_mbuf_dynflag_timestamp_bitnum = -1;
+
+__rte_experimental
+int rte_mbuf_dyn_timestamp_register(void)
+{
+       rte_mbuf_dynfield_timestamp_offset = rte_mbuf_dynfield_register(
+               &rte_mbuf_dynfield_timestamp);
+       if (rte_mbuf_dynfield_timestamp_offset < 0)
+               return -1;
+
+       rte_mbuf_dynflag_timestamp_bitnum = rte_mbuf_dynflag_register(
+               &rte_mbuf_dynflag_timestamp);
+       if (rte_mbuf_dynflag_timestamp_bitnum < 0)
+               return -1;
+
+       return 0;
+}
index 6e2c816..35b03a6 100644 (file)
@@ -54,6 +54,9 @@
  */
 
 #include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+
 /**
  * Maximum length of the dynamic field or flag string.
  */
@@ -160,4 +163,70 @@ int rte_mbuf_dynflag_lookup(const char *name,
  */
 #define RTE_MBUF_DYNFIELD(m, offset, type) ((type)((uintptr_t)(m) + (offset)))
 
+/* Placeholder for dynamic fields and flags declarations. */
+extern const struct rte_mbuf_dynfield rte_mbuf_dynfield_timestamp;
+extern int rte_mbuf_dynfield_timestamp_offset;
+extern const struct rte_mbuf_dynflag rte_mbuf_dynflag_timestamp;
+extern int rte_mbuf_dynflag_timestamp_bitnum;
+
+/**
+ * Register timestamp dynamic field and flag.
+ *
+ * @return
+ *   0 on success, or -1 on error (rte_errno is set, see
+ *   rte_mbuf_dynfield_register() and rte_mbuf_dynflag_register()
+ *   for details).
+ */
+__rte_experimental
+int rte_mbuf_dyn_timestamp_register(void);
+
+/**
+ * Set timestamp dynamic field and flag in mbuf.
+ *
+ * rte_mbuf_dyn_timestamp_register() must have been called first.
+ */
+__rte_experimental
+static inline void rte_mbuf_dyn_timestamp_set(struct rte_mbuf *m,
+                                       uint64_t timestamp)
+{
+       *RTE_MBUF_DYNFIELD(m, rte_mbuf_dynfield_timestamp_offset,
+                       uint64_t *) = timestamp;
+       m->ol_flags |= (1UL << rte_mbuf_dynflag_timestamp_bitnum);
+}
+
+/**
+ * Get timestamp dynamic field value in mbuf.
+ *
+ * rte_mbuf_dyn_timestamp_register() must have been called first.
+ */
+__rte_experimental
+static inline uint64_t rte_mbuf_dyn_timestamp_get(const struct rte_mbuf *m)
+{
+       return *RTE_MBUF_DYNFIELD(m, rte_mbuf_dynfield_timestamp_offset,
+                               uint64_t *);
+}
+
+/**
+ * Delete the timestamp dynamic flag in mbuf.
+ *
+ * rte_mbuf_dyn_timestamp_register() must have been called first.
+ */
+__rte_experimental
+static inline void rte_mbuf_dyn_timestamp_del(struct rte_mbuf *m)
+{
+       m->ol_flags &= ~(1UL << rte_mbuf_dynflag_timestamp_bitnum);
+}
+
+/**
+ * Check timestamp dynamic flag value in mbuf.
+ *
+ * rte_mbuf_dyn_timestamp_register() must have been called first.
+ */
+__rte_experimental
+static inline bool rte_mbuf_dyn_timestamp_avail(const struct rte_mbuf *m)
+{
+       return m->ol_flags & (1UL << rte_mbuf_dynflag_timestamp_bitnum);
+}
+
+
 #endif
index a983105..8e70842 100644 (file)
@@ -54,4 +54,5 @@ EXPERIMENTAL {
        rte_mbuf_dynfield_register;
        rte_mbuf_dynflag_lookup;
        rte_mbuf_dynflag_register;
+       rte_mbuf_dyn_timestamp_register;
 } DPDK_18.08;