aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-12-03 16:00:41 +0000
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-12-07 18:05:53 +0000
commit92936b6a85e89407073bd2d3dc86cb3c52d692fe (patch)
treeef82dd9d34feb3013e235490dd131873ae9d3467 /platform/linux-dpdk
parenta2d9f584381cb0053f9b7796c4a7b6783d7ed6b3 (diff)
linux-dpdk: packet: implement odp_packet_alloc/free_multi() functions
Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
Diffstat (limited to 'platform/linux-dpdk')
-rw-r--r--platform/linux-dpdk/odp_packet.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index 78a284b10..30aa62407 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -71,10 +71,9 @@ odp_buffer_t _odp_packet_to_buffer(odp_packet_t pkt)
return (odp_buffer_t)pkt;
}
-odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
+static odp_packet_t packet_alloc(pool_entry_t* pool, uint32_t len)
{
odp_packet_t pkt;
- pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
uintmax_t totsize = RTE_PKTMBUF_HEADROOM + len;
odp_packet_hdr_t *pkt_hdr;
struct rte_mbuf *mbuf;
@@ -83,8 +82,10 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
return ODP_PACKET_INVALID;
mbuf = rte_pktmbuf_alloc(pool->s.rte_mempool);
- if (mbuf == NULL)
+ if (mbuf == NULL) {
+ rte_errno = ENOMEM;
return ODP_PACKET_INVALID;
+ }
pkt_hdr = (odp_packet_hdr_t *)mbuf;
pkt_hdr->buf_hdr.totsize = mbuf->buf_len;
@@ -117,12 +118,44 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
return pkt;
}
+odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len)
+{
+ pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
+
+ return packet_alloc(pool, len);
+}
+
+int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
+ odp_packet_t pkt[], int num)
+{
+ int i;
+ pool_entry_t *pool = odp_pool_to_entry(pool_hdl);
+
+ for (i = 0; i < num; i++) {
+ pkt[i] = packet_alloc(pool, len);
+ if (pkt[i] == ODP_PACKET_INVALID)
+ return rte_errno == ENOMEM ? i : -EINVAL;
+ }
+ return i;
+}
+
void odp_packet_free(odp_packet_t pkt)
{
struct rte_mbuf *mbuf = (struct rte_mbuf *)pkt;
rte_pktmbuf_free(mbuf);
}
+void odp_packet_free_multi(const odp_packet_t pkt[], int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++) {
+ struct rte_mbuf *mbuf = (struct rte_mbuf *)pkt[i];
+
+ rte_pktmbuf_free(mbuf);
+ }
+}
+
int odp_packet_reset(odp_packet_t pkt, uint32_t len)
{
odp_packet_hdr_t *const pkt_hdr = odp_packet_hdr(pkt);