Signed-off-by: Bill Fischofer <[email protected]>
---
 platform/linux-generic/odp_crypto.c        |  3 +-
 platform/linux-generic/odp_packet_io.c     |  7 ++-
 platform/linux-generic/odp_packet_socket.c | 90 ++++++++++++------------------
 platform/linux-generic/odp_queue.c         |  7 ++-
 platform/linux-generic/odp_schedule.c      | 20 ++-----
 5 files changed, 51 insertions(+), 76 deletions(-)

diff --git a/platform/linux-generic/odp_crypto.c 
b/platform/linux-generic/odp_crypto.c
index 1475437..1e8d448 100644
--- a/platform/linux-generic/odp_crypto.c
+++ b/platform/linux-generic/odp_crypto.c
@@ -14,7 +14,6 @@
 #include <odp_shared_memory.h>
 #include <odp_crypto_internal.h>
 #include <odp_hints.h>
-#include <odph_packet.h>
 
 #include <string.h>
 
@@ -370,7 +369,7 @@ odp_crypto_operation(odp_crypto_op_params_t *params,
                if (completion_event == odp_packet_to_buffer(params->pkt))
                        completion_event =
                                odp_packet_to_buffer(params->out_pkt);
-               odph_packet_free(params->pkt);
+               odp_packet_free(params->pkt);
                params->pkt = ODP_PACKET_INVALID;
        }
 
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index f35193f..5c6f628 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -369,7 +369,8 @@ odp_queue_t odp_pktio_outq_getdef(odp_pktio_t id)
 
 int pktout_enqueue(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr)
 {
-       odp_packet_t pkt = odp_packet_from_buffer(buf_hdr->handle.handle);
+       odp_packet_t pkt =
+               odp_packet_from_buf_internal(odp_hdr_to_buf(buf_hdr));
        int len = 1;
        int nbr;
 
@@ -391,7 +392,9 @@ int pktout_enq_multi(queue_entry_t *qentry, 
odp_buffer_hdr_t *buf_hdr[],
        int i;
 
        for (i = 0; i < num; ++i)
-               pkt_tbl[i] = odp_packet_from_buffer(buf_hdr[i]->handle.handle);
+               pkt_tbl[i] =
+                       odp_packet_from_buf_internal(
+                               odp_hdr_to_buf(buf_hdr[i]));
 
        nbr = odp_pktio_send(qentry->s.pktout, pkt_tbl, num);
        return (nbr == num ? 0 : -1);
diff --git a/platform/linux-generic/odp_packet_socket.c 
b/platform/linux-generic/odp_packet_socket.c
index 0492d1e..da66cf0 100644
--- a/platform/linux-generic/odp_packet_socket.c
+++ b/platform/linux-generic/odp_packet_socket.c
@@ -34,13 +34,13 @@
 #include <errno.h>
 #include <sys/syscall.h>
 
+#include <odp_spinlock.h>
 #include <odp_packet_socket.h>
 #include <odp_packet_internal.h>
 #include <odp_hints.h>
 
 #include <odph_eth.h>
 #include <odph_ip.h>
-#include <odph_packet.h>
 
 /** Provide a sendmmsg wrapper for systems with no libc or kernel support.
  *  As it is implemented as a weak symbol, it has zero effect on systems
@@ -178,28 +178,19 @@ int setup_pkt_sock(pkt_sock_t *const pkt_sock, const char 
*netdev,
        unsigned int if_idx;
        struct ifreq ethreq;
        struct sockaddr_ll sa_ll;
-       odp_packet_t pkt;
-       uint8_t *pkt_buf;
-       uint8_t *l2_hdr;
 
        if (pool == ODP_BUFFER_POOL_INVALID)
                return -1;
        pkt_sock->pool = pool;
 
-       pkt = odph_packet_alloc(pool);
-       if (!odph_packet_is_valid(pkt))
-               return -1;
-
-       pkt_buf = odp_packet_addr(pkt);
-       l2_hdr = ETHBUF_ALIGN(pkt_buf);
        /* Store eth buffer offset for pkt buffers from this pool */
-       pkt_sock->frame_offset = (uintptr_t)l2_hdr - (uintptr_t)pkt_buf;
+       pkt_sock->frame_offset = 0;
        /* pkt buffer size */
-       pkt_sock->buf_size = odph_packet_buf_size(pkt);
+       pkt_sock->buf_size = odp_buffer_pool_segment_size(pool);
        /* max frame len taking into account the l2-offset */
-       pkt_sock->max_frame_len = pkt_sock->buf_size - pkt_sock->frame_offset;
-
-       odph_packet_free(pkt);
+       pkt_sock->max_frame_len = pkt_sock->buf_size -
+               odp_buffer_pool_headroom(pool) -
+               odp_buffer_pool_tailroom(pool);
 
        odp_spinlock_lock(&raw_sockets_lock);
 
@@ -284,7 +275,6 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
        int const sockfd = pkt_sock->sockfd;
        odp_packet_t pkt = ODP_PACKET_INVALID;
        uint8_t *pkt_buf;
-       uint8_t *l2_hdr;
        int nb_rx = 0;
 
        /*  recvfrom:
@@ -297,15 +287,14 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
 
        for (i = 0; i < len; i++) {
                if (odp_likely(pkt == ODP_PACKET_INVALID)) {
-                       pkt = odph_packet_alloc(pkt_sock->pool);
+                       pkt = odp_packet_alloc(pkt_sock->pool);
                        if (odp_unlikely(pkt == ODP_PACKET_INVALID))
                                break;
                }
 
                pkt_buf = odp_packet_addr(pkt);
-               l2_hdr = pkt_buf + pkt_sock->frame_offset;
 
-               recv_bytes = recvfrom(sockfd, l2_hdr,
+               recv_bytes = recvfrom(sockfd, pkt_buf,
                                      pkt_sock->max_frame_len, MSG_DONTWAIT,
                                      (struct sockaddr *)&sll, &addrlen);
                /* no data or error: free recv buf and break out of loop */
@@ -316,7 +305,8 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
                        continue;
 
                /* Parse and set packet header data */
-               odp_packet_parse(pkt, recv_bytes, pkt_sock->frame_offset);
+               odp_packet_set_len(pkt, recv_bytes);
+               odp_packet_parse(pkt);
 
                pkt_table[nb_rx] = pkt;
                pkt = ODP_PACKET_INVALID;
@@ -324,7 +314,7 @@ int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
        } /* end for() */
 
        if (odp_unlikely(pkt != ODP_PACKET_INVALID))
-               odph_packet_free(pkt);
+               odp_packet_free(pkt);
 
        return nb_rx;
 }
@@ -350,8 +340,7 @@ int send_pkt_sock_basic(pkt_sock_t *const pkt_sock,
        while (i < len) {
                pkt = pkt_table[i];
 
-               frame = odp_packet_l2(pkt);
-               frame_len = odp_packet_get_len(pkt);
+               frame = odp_packet_map(pkt, &frame_len);
 
                ret = send(sockfd, frame, frame_len, flags);
                if (odp_unlikely(ret == -1)) {
@@ -367,8 +356,10 @@ int send_pkt_sock_basic(pkt_sock_t *const pkt_sock,
        }                       /* end while */
        nb_tx = i;
 
-       for (i = 0; i < len; i++)
-               odph_packet_free(pkt_table[i]);
+       for (i = 0; i < len; i++) {
+               if (odp_packet_decr_refcount(pkt_table[i], 1) == 0)
+                       odp_packet_free(pkt_table[i]);
+       }
 
        return nb_tx;
 }
@@ -395,7 +386,7 @@ int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
        memset(msgvec, 0, sizeof(msgvec));
 
        for (i = 0; i < (int)len; i++) {
-               pkt_table[i] = odph_packet_alloc(pkt_sock->pool);
+               pkt_table[i] = odp_packet_alloc(pkt_sock->pool);
                if (odp_unlikely(pkt_table[i] == ODP_PACKET_INVALID))
                        break;
 
@@ -417,13 +408,12 @@ int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
                /* Don't receive packets sent by ourselves */
                if (odp_unlikely(ethaddrs_equal(pkt_sock->if_mac,
                                                eth_hdr->h_source))) {
-                       odph_packet_free(pkt_table[i]);
+                       odp_packet_free(pkt_table[i]);
                        continue;
                }
 
                /* Parse and set packet header data */
-               odp_packet_parse(pkt_table[i], msgvec[i].msg_len,
-                                pkt_sock->frame_offset);
+               odp_packet_parse(pkt_table[i]);
 
                pkt_table[nb_rx] = pkt_table[i];
                nb_rx++;
@@ -431,7 +421,7 @@ int recv_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
 
        /* Free unused pkt buffers */
        for (; i < msgvec_len; i++)
-               odph_packet_free(pkt_table[i]);
+               odp_packet_free(pkt_table[i]);
 
        return nb_rx;
 }
@@ -457,8 +447,8 @@ int send_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
        memset(msgvec, 0, sizeof(msgvec));
 
        for (i = 0; i < len; i++) {
-               uint8_t *const frame = odp_packet_l2(pkt_table[i]);
-               const size_t frame_len = odp_packet_get_len(pkt_table[i]);
+               size_t frame_len;
+               uint8_t *const frame = odp_packet_map(pkt_table[i], &frame_len);
                iovecs[i].iov_base = frame;
                iovecs[i].iov_len = frame_len;
                msgvec[i].msg_hdr.msg_iov = &iovecs[i];
@@ -472,8 +462,10 @@ int send_pkt_sock_mmsg(pkt_sock_t *const pkt_sock,
                flags = 0;      /* blocking for next rounds */
        }
 
-       for (i = 0; i < len; i++)
-               odph_packet_free(pkt_table[i]);
+       for (i = 0; i < len; i++) {
+               if (odp_packet_decr_refcount(pkt_table[i], 1) == 0)
+                       odp_packet_free(pkt_table[i]);
+       }
 
        return len;
 }
@@ -537,7 +529,6 @@ static inline void mmap_tx_user_ready(struct tpacket2_hdr 
*hdr)
 static inline unsigned pkt_mmap_v2_rx(int sock, struct ring *ring,
                                      odp_packet_t pkt_table[], unsigned len,
                                      odp_buffer_pool_t pool,
-                                     size_t frame_offset,
                                      unsigned char if_mac[])
 {
        union frame_map ppd;
@@ -570,18 +561,18 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct 
ring *ring,
                                continue;
                        }
 
-                       pkt_table[i] = odph_packet_alloc(pool);
+                       pkt_table[i] = odp_packet_alloc(pool);
                        if (odp_unlikely(pkt_table[i] == ODP_PACKET_INVALID))
                                break;
 
-                       l2_hdr = odp_packet_addr(pkt_table[i])
-                                + frame_offset;
+                       l2_hdr = odp_packet_addr(pkt_table[i]);
+                       odp_packet_set_len(pkt_table[i], pkt_len);
                        memcpy(l2_hdr, pkt_buf, pkt_len);
 
                        mmap_rx_user_ready(ppd.raw);
 
                        /* Parse and set packet header data */
-                       odp_packet_parse(pkt_table[i], pkt_len, frame_offset);
+                       odp_packet_parse(pkt_table[i]);
 
                        frame_num = next_frame_num;
                        i++;
@@ -613,8 +604,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring 
*ring,
 
                        next_frame_num = (frame_num + 1) % ring->rd_num;
 
-                       pkt_buf = odp_packet_l2(pkt_table[i]);
-                       pkt_len = odp_packet_get_len(pkt_table[i]);
+                       pkt_buf = odp_packet_map(pkt_table[i], &pkt_len);
 
                        ppd.v2->tp_h.tp_snaplen = pkt_len;
                        ppd.v2->tp_h.tp_len = pkt_len;
@@ -624,7 +614,8 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring 
*ring,
 
                        mmap_tx_user_ready(ppd.raw);
 
-                       odph_packet_free(pkt_table[i]);
+                       if (odp_packet_decr_refcount(pkt_table[i], 1) == 0)
+                               odp_packet_free(pkt_table[i]);
                        frame_num = next_frame_num;
                        i++;
                } else {
@@ -805,9 +796,6 @@ static int mmap_store_hw_addr(pkt_sock_mmap_t *const 
pkt_sock,
 int setup_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock, const char *netdev,
                        odp_buffer_pool_t pool, int fanout)
 {
-       odp_packet_t pkt;
-       uint8_t *pkt_buf;
-       uint8_t *l2_hdr;
        int if_idx;
        int ret = 0;
 
@@ -816,16 +804,8 @@ int setup_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock, 
const char *netdev,
        if (pool == ODP_BUFFER_POOL_INVALID)
                return -1;
 
-       pkt = odph_packet_alloc(pool);
-       if (!odph_packet_is_valid(pkt))
-               return -1;
-
-       pkt_buf = odp_packet_addr(pkt);
-       l2_hdr = ETHBUF_ALIGN(pkt_buf);
        /* Store eth buffer offset for pkt buffers from this pool */
-       pkt_sock->frame_offset = (uintptr_t)l2_hdr - (uintptr_t)pkt_buf;
-
-       odph_packet_free(pkt);
+       pkt_sock->frame_offset = 0;
 
        pkt_sock->pool = pool;
        pkt_sock->sockfd = mmap_pkt_socket();
@@ -892,7 +872,7 @@ int recv_pkt_sock_mmap(pkt_sock_mmap_t *const pkt_sock,
 {
        return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
                              pkt_table, len, pkt_sock->pool,
-                             pkt_sock->frame_offset, pkt_sock->if_mac);
+                             pkt_sock->if_mac);
 }
 
 /*
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index 1318bcd..af3a330 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -9,8 +9,9 @@
 #include <odp_std_types.h>
 #include <odp_align.h>
 #include <odp_buffer.h>
-#include <odp_buffer_internal.h>
 #include <odp_buffer_pool_internal.h>
+#include <odp_buffer_internal.h>
+#include <odp_buffer_inlines.h>
 #include <odp_internal.h>
 #include <odp_shared_memory.h>
 #include <odp_schedule_internal.h>
@@ -422,7 +423,7 @@ int odp_queue_deq_multi(odp_queue_t handle, odp_buffer_t 
buf[], int num)
        ret = queue->s.dequeue_multi(queue, buf_hdr, num);
 
        for (i = 0; i < ret; i++)
-               buf[i] = buf_hdr[i]->handle.handle;
+               buf[i] = odp_hdr_to_buf(buf_hdr[i]);
 
        return ret;
 }
@@ -437,7 +438,7 @@ odp_buffer_t odp_queue_deq(odp_queue_t handle)
        buf_hdr = queue->s.dequeue(queue);
 
        if (buf_hdr)
-               return buf_hdr->handle.handle;
+               return odp_hdr_to_buf(buf_hdr);
 
        return ODP_BUFFER_INVALID;
 }
diff --git a/platform/linux-generic/odp_schedule.c 
b/platform/linux-generic/odp_schedule.c
index 1bf819b..f30b877 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -83,8 +83,8 @@ int odp_schedule_init_global(void)
 {
        odp_shm_t shm;
        odp_buffer_pool_t pool;
-       void *pool_base;
        int i, j;
+       odp_buffer_pool_param_t params;
 
        ODP_DBG("Schedule init ... ");
 
@@ -99,20 +99,12 @@ int odp_schedule_init_global(void)
                return -1;
        }
 
-       shm = odp_shm_reserve("odp_sched_pool",
-                             SCHED_POOL_SIZE, ODP_CACHE_LINE_SIZE, 0);
+       params.buf_num  = SCHED_POOL_SIZE/sizeof(queue_desc_t);
+       params.buf_size = sizeof(queue_desc_t);
+       params.buf_type = ODP_BUFFER_TYPE_RAW;
+       params.buf_opts = ODP_BUFFER_OPTS_UNSEGMENTED;
 
-       pool_base = odp_shm_addr(shm);
-
-       if (pool_base == NULL) {
-               ODP_ERR("Schedule init: Shm reserve failed.\n");
-               return -1;
-       }
-
-       pool = odp_buffer_pool_create("odp_sched_pool", pool_base,
-                                     SCHED_POOL_SIZE, sizeof(queue_desc_t),
-                                     ODP_CACHE_LINE_SIZE,
-                                     ODP_BUFFER_TYPE_RAW);
+       pool = odp_buffer_pool_create("odp_sched_pool", &params, NULL);
 
        if (pool == ODP_BUFFER_POOL_INVALID) {
                ODP_ERR("Schedule init: Pool create failed.\n");
-- 
1.8.3.2


_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to