From: Olivier Matz Date: Wed, 18 Sep 2019 16:28:12 +0000 (+0200) Subject: mbuf: add timestamp dynamic field and flag (example) X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=refs%2Fheads%2Fdyn-mbuf1;p=dpdk.git mbuf: add timestamp dynamic field and flag (example) Signed-off-by: Olivier Matz --- diff --git a/lib/librte_mbuf/rte_mbuf_dyn.c b/lib/librte_mbuf/rte_mbuf_dyn.c index 13b8742d03..6398ceb584 100644 --- a/lib/librte_mbuf/rte_mbuf_dyn.c +++ b/lib/librte_mbuf/rte_mbuf_dyn.c @@ -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; +} diff --git a/lib/librte_mbuf/rte_mbuf_dyn.h b/lib/librte_mbuf/rte_mbuf_dyn.h index 6e2c81654a..35b03a6bdf 100644 --- a/lib/librte_mbuf/rte_mbuf_dyn.h +++ b/lib/librte_mbuf/rte_mbuf_dyn.h @@ -54,6 +54,9 @@ */ #include +#include +#include + /** * 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 diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map index a98310570f..8e70842452 100644 --- a/lib/librte_mbuf/rte_mbuf_version.map +++ b/lib/librte_mbuf/rte_mbuf_version.map @@ -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;