mbuf: replace data pointer by an offset
[dpdk.git] / lib / librte_mbuf / rte_mbuf.c
index 6129b1a..26e36eb 100644 (file)
@@ -1,13 +1,13 @@
 /*-
  *   BSD LICENSE
- * 
+ *
  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
  *   All rights reserved.
- * 
+ *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
  *   are met:
- * 
+ *
  *     * Redistributions of source code must retain the above copyright
  *       notice, this list of conditions and the following disclaimer.
  *     * Redistributions in binary form must reproduce the above copyright
@@ -17,7 +17,7 @@
  *     * Neither the name of Intel Corporation nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
- * 
+ *
  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  */
 void
 rte_ctrlmbuf_init(struct rte_mempool *mp,
-                 __attribute__((unused)) void *opaque_arg,
-                 void *_m,
-                 __attribute__((unused)) unsigned i)
+               __attribute__((unused)) void *opaque_arg,
+               void *_m,
+               __attribute__((unused)) unsigned i)
 {
-       struct rte_mbuf *m = _m;
-
-       memset(m, 0, mp->elt_size);
-
-       /* start of buffer is just after mbuf structure */
-       m->buf_addr = (char *)m + sizeof(struct rte_mbuf);
-       m->buf_physaddr = rte_mempool_virt2phy(mp, m) +
-                       sizeof(struct rte_mbuf);
-       m->buf_len = (uint16_t) (mp->elt_size - sizeof(struct rte_mbuf));
-
-       /* init some constant fields */
-       m->type = RTE_MBUF_CTRL;
-       m->ctrl.data = (char *)m->buf_addr;
-       m->pool = (struct rte_mempool *)mp;
+       rte_pktmbuf_init(mp, opaque_arg, _m, i);
 }
 
 /*
@@ -130,27 +117,23 @@ rte_pktmbuf_init(struct rte_mempool *mp,
        m->buf_len = (uint16_t)buf_len;
 
        /* keep some headroom between start of buffer and data */
-       m->pkt.data = (char*) m->buf_addr + RTE_MIN(RTE_PKTMBUF_HEADROOM, m->buf_len);
+       m->data_off = RTE_MIN(RTE_PKTMBUF_HEADROOM, (uint16_t)m->buf_len);
 
        /* init some constant fields */
-       m->type = RTE_MBUF_PKT;
        m->pool = mp;
-       m->pkt.nb_segs = 1;
-       m->pkt.in_port = 0xff;
+       m->nb_segs = 1;
+       m->port = 0xff;
 }
 
 /* do some sanity checks on a mbuf: panic if it fails */
 void
-rte_mbuf_sanity_check(const struct rte_mbuf *m, enum rte_mbuf_type t,
-                     int is_header)
+rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
 {
        const struct rte_mbuf *m_seg;
        unsigned nb_segs;
 
        if (m == NULL)
                rte_panic("mbuf is NULL\n");
-       if (m->type != (uint8_t)t)
-               rte_panic("bad mbuf type\n");
 
        /* generic checks */
        if (m->pool == NULL)
@@ -160,65 +143,54 @@ rte_mbuf_sanity_check(const struct rte_mbuf *m, enum rte_mbuf_type t,
        if (m->buf_addr == NULL)
                rte_panic("bad virt addr\n");
 
-#ifdef RTE_MBUF_SCATTER_GATHER
+#ifdef RTE_MBUF_REFCNT
        uint16_t cnt = rte_mbuf_refcnt_read(m);
        if ((cnt == 0) || (cnt == UINT16_MAX))
                rte_panic("bad ref cnt\n");
 #endif
 
-       /* nothing to check for ctrl messages */
-       if (m->type == RTE_MBUF_CTRL)
+       /* nothing to check for sub-segments */
+       if (is_header == 0)
                return;
 
-       /* check pkt consistency */
-       else if (m->type == RTE_MBUF_PKT) {
-
-               /* nothing to check for sub-segments */
-               if (is_header == 0)
-                       return;
-
-               nb_segs = m->pkt.nb_segs;
-               m_seg = m;
-               while (m_seg && nb_segs != 0) {
-                       m_seg = m_seg->pkt.next;
-                       nb_segs --;
-               }
-               if (nb_segs != 0)
-                       rte_panic("bad nb_segs\n");
-               return;
+       nb_segs = m->nb_segs;
+       m_seg = m;
+       while (m_seg && nb_segs != 0) {
+               m_seg = m_seg->next;
+               nb_segs--;
        }
-
-       rte_panic("unknown mbuf type\n");
+       if (nb_segs != 0)
+               rte_panic("bad nb_segs\n");
 }
 
 /* dump a mbuf on console */
 void
-rte_pktmbuf_dump(const struct rte_mbuf *m, unsigned dump_len)
+rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len)
 {
        unsigned int len;
        unsigned nb_segs;
 
-       __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1);
+       __rte_mbuf_sanity_check(m, 1);
 
-       printf("dump mbuf at 0x%p, phys=%"PRIx64", buf_len=%u\n",
+       fprintf(f, "dump mbuf at 0x%p, phys=%"PRIx64", buf_len=%u\n",
               m, (uint64_t)m->buf_physaddr, (unsigned)m->buf_len);
-       printf("  pkt_len=%"PRIu32", ol_flags=%"PRIx16", nb_segs=%u, "
-              "in_port=%u\n", m->pkt.pkt_len, m->ol_flags,
-              (unsigned)m->pkt.nb_segs, (unsigned)m->pkt.in_port);
-       nb_segs = m->pkt.nb_segs;
+       fprintf(f, "  pkt_len=%"PRIu32", ol_flags=%"PRIx16", nb_segs=%u, "
+              "in_port=%u\n", m->pkt_len, m->ol_flags,
+              (unsigned)m->nb_segs, (unsigned)m->port);
+       nb_segs = m->nb_segs;
 
        while (m && nb_segs != 0) {
-               __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 0);
+               __rte_mbuf_sanity_check(m, 0);
 
-               printf("  segment at 0x%p, data=0x%p, data_len=%u\n",
-                      m, m->pkt.data, (unsigned)m->pkt.data_len);
+               fprintf(f, "  segment at 0x%p, data=0x%p, data_len=%u\n",
+                       m, rte_pktmbuf_mtod(m, void *), (unsigned)m->data_len);
                len = dump_len;
-               if (len > m->pkt.data_len)
-                       len = m->pkt.data_len;
+               if (len > m->data_len)
+                       len = m->data_len;
                if (len != 0)
-                       rte_hexdump(NULL, m->pkt.data, len);
+                       rte_hexdump(f, NULL, rte_pktmbuf_mtod(m, void *), len);
                dump_len -= len;
-               m = m->pkt.next;
+               m = m->next;
                nb_segs --;
        }
 }