@@ -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;
}
@@ -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);
@@ -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);
}
/*
@@ -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;
}
@@ -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", ¶ms, NULL);
if (pool == ODP_BUFFER_POOL_INVALID) {
ODP_ERR("Schedule init: Pool create failed.\n");
Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> --- 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(-)