mbuf: replace data pointer by an offset
[dpdk.git] / lib / librte_mbuf / rte_mbuf.c
index de85659..26e36eb 100644 (file)
@@ -1,35 +1,34 @@
 /*-
  *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
+ *
+ *   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 
+ *
+ *   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 
+ *
+ *     * 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 
- *       notice, this list of conditions and the following disclaimer in 
- *       the documentation and/or other materials provided with the 
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
  *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its 
- *       contributors may be used to endorse or promote products derived 
+ *     * 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 
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *
+ *   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
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
  */
 
 #include <string.h>
@@ -58,6 +57,7 @@
 #include <rte_mempool.h>
 #include <rte_mbuf.h>
 #include <rte_string_fns.h>
+#include <rte_hexdump.h>
 
 /*
  * ctrlmbuf constructor, given as a callback function to
  */
 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,54 +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;
-}
-
-static void
-rte_pktmbuf_hexdump(const void *buf, unsigned int len)
-{
-       unsigned int i, out, ofs;
-       const unsigned char *data = buf;
-#define LINE_LEN 80
-       char line[LINE_LEN];
-
-       printf("  dump data at 0x%p, len=%u\n", data, len);
-       ofs = 0;
-       while (ofs < len) {
-               out = rte_snprintf(line, LINE_LEN, "  %08X", ofs);
-               for (i = 0; ofs+i < len && i < 16; i++)
-                       out += rte_snprintf(line+out, LINE_LEN - out, " %02X",
-                                       data[ofs+i]&0xff);
-               for (; i <= 16; i++)
-                       out += rte_snprintf(line+out, LINE_LEN - out, "   ");
-               for (i = 0; ofs < len && i < 16; i++, ofs++) {
-                       unsigned char c = data[ofs];
-                       if (!isascii(c) || !isprint(c))
-                               c = '.';
-                       out += rte_snprintf(line+out, LINE_LEN - out, "%c", c);
-               }
-               printf("%s\n", line);
-       }
+       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)
@@ -187,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=%"PRIx32", 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_pktmbuf_hexdump(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 --;
        }
 }