On 04/29/2015 06:15 PM, Cyril Chemparathy wrote: > There are a number of instances in the code where rte_pktmbuf_mtod() is used > to get the mbuf data pointer, only to add an offset before casting the result > to some other header type. This patch adds a new rte_pktmbuf_mtod_offset() > macro to eliminate these awful double cast situations. > > Signed-off-by: Cyril Chemparathy <cchemparathy at ezchip.com> > --- > lib/librte_mbuf/rte_mbuf.h | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > index 5ddd8dd..e8f1bf4 100644 > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -54,6 +54,7 @@ > */ > > #include <stdint.h> > +#include <rte_common.h> > #include <rte_mempool.h> > #include <rte_memory.h> > #include <rte_atomic.h> > @@ -1071,6 +1072,23 @@ static inline struct rte_mbuf > *rte_pktmbuf_lastseg(struct rte_mbuf *m) > } > > /** > + * A macro that points to an offset into the data in the mbuf. > + * > + * The returned pointer is cast to type t. Before using this > + * function, the user must ensure that m_headlen(m) is large enough to > + * read its data.
Small comment here: m_headlen(m) should be replaced by "the length of the first segment". Indeed, there is no m_headlen() function (I see that it is coming from a copy/paste of the mtod() comment). Could you also fix it by the way? > + * > + * @param m > + * The packet mbuf. > + * @param o > + * The offset into the mbuf data. > + * @param t > + * The type to cast the result into. > + */ > +#define rte_pktmbuf_mtod_offset(m, t, o) \ > + ((t)((char *)(m)->buf_addr + (m)->data_off + (o))) > + > +/** > * A macro that points to the start of the data in the mbuf. > * > * The returned pointer is cast to type t. Before using this > @@ -1082,7 +1100,7 @@ static inline struct rte_mbuf > *rte_pktmbuf_lastseg(struct rte_mbuf *m) > * @param t > * The type to cast the result into. > */ > -#define rte_pktmbuf_mtod(m, t) ((t)((char *)(m)->buf_addr + (m)->data_off)) > +#define rte_pktmbuf_mtod(m, t) rte_pktmbuf_mtod_offset(m, t, 0) > > /** > * A macro that returns the length of the packet. >