@@ -79,7 +79,6 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
} pktio_ops_module_t;
/* All implementations of this subsystem */
-#include <odp_pktio_ops_ipc.h>
#include <odp_pktio_ops_netmap.h>
#include <odp_pktio_ops_pcap.h>
@@ -88,7 +87,6 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
*/
typedef union {
void *dpdk;
- pktio_ops_ipc_data_t ipc;
pktio_ops_netmap_data_t netmap;
pktio_ops_pcap_data_t pcap;
} pktio_ops_data_t;
@@ -8,10 +8,12 @@
#include <odp/api/system_info.h>
#include <odp_shm_internal.h>
#include <_ishm_internal.h>
+#include <odp_pktio_ops_ipc.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <linux/if_ether.h>
#define IPC_ODP_DEBUG_PRINT 0
@@ -42,7 +44,8 @@ static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl)
static int _ipc_master_start(pktio_entry_t *pktio_entry)
{
- struct pktio_info *pinfo = pktio_entry->ops_data(ipc).pinfo;
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
+ struct pktio_info *pinfo = pkt_ipc->pinfo;
odp_shm_t shm;
if (pinfo->slave.init_done == 0)
@@ -56,11 +59,11 @@ static int _ipc_master_start(pktio_entry_t *pktio_entry)
return -1;
}
- pktio_entry->ops_data(ipc).remote_pool_shm = shm;
- pktio_entry->ops_data(ipc).pool_base = odp_shm_addr(shm);
- pktio_entry->ops_data(ipc).pool_mdata_base = (char *)odp_shm_addr(shm);
+ pkt_ipc->remote_pool_shm = shm;
+ pkt_ipc->pool_base = odp_shm_addr(shm);
+ pkt_ipc->pool_mdata_base = (char *)odp_shm_addr(shm);
- odp_atomic_store_u32(&pktio_entry->ops_data(ipc).ready, 1);
+ odp_atomic_store_u32(&pkt_ipc->ready, 1);
IPC_ODP_DBG("%s started.\n", pktio_entry->s.name);
return 0;
@@ -70,6 +73,7 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry,
const char *dev,
odp_pool_t pool_hdl)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")];
pool_t *pool;
struct pktio_info *pinfo;
@@ -87,62 +91,62 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry,
* to be processed packets ring.
*/
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev);
- pktio_entry->ops_data(ipc).tx.send = _ring_create(ipc_shm_name,
+ pkt_ipc->tx.send = _ring_create(ipc_shm_name,
PKTIO_IPC_ENTRIES,
_RING_SHM_PROC | _RING_NO_LIST);
- if (!pktio_entry->ops_data(ipc).tx.send) {
+ if (!pkt_ipc->tx.send) {
ODP_ERR("pid %d unable to create ipc ring %s name\n",
getpid(), ipc_shm_name);
return -1;
}
ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).tx.send),
- _ring_free_count(pktio_entry->ops_data(ipc).tx.send));
+ ipc_shm_name, _ring_count(pkt_ipc->tx.send),
+ _ring_free_count(pkt_ipc->tx.send));
/* generate name in shm like ipc_pktio_p for
* already processed packets
*/
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev);
- pktio_entry->ops_data(ipc).tx.free = _ring_create(ipc_shm_name,
+ pkt_ipc->tx.free = _ring_create(ipc_shm_name,
PKTIO_IPC_ENTRIES,
_RING_SHM_PROC | _RING_NO_LIST);
- if (!pktio_entry->ops_data(ipc).tx.free) {
+ if (!pkt_ipc->tx.free) {
ODP_ERR("pid %d unable to create ipc ring %s name\n",
getpid(), ipc_shm_name);
goto free_m_prod;
}
ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).tx.free),
- _ring_free_count(pktio_entry->ops_data(ipc).tx.free));
+ ipc_shm_name, _ring_count(pkt_ipc->tx.free),
+ _ring_free_count(pkt_ipc->tx.free));
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev);
- pktio_entry->ops_data(ipc).rx.recv = _ring_create(ipc_shm_name,
+ pkt_ipc->rx.recv = _ring_create(ipc_shm_name,
PKTIO_IPC_ENTRIES,
_RING_SHM_PROC | _RING_NO_LIST);
- if (!pktio_entry->ops_data(ipc).rx.recv) {
+ if (!pkt_ipc->rx.recv) {
ODP_ERR("pid %d unable to create ipc ring %s name\n",
getpid(), ipc_shm_name);
goto free_m_cons;
}
ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).rx.recv),
- _ring_free_count(pktio_entry->ops_data(ipc).rx.recv));
+ ipc_shm_name, _ring_count(pkt_ipc->rx.recv),
+ _ring_free_count(pkt_ipc->rx.recv));
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev);
- pktio_entry->ops_data(ipc).rx.free = _ring_create(ipc_shm_name,
+ pkt_ipc->rx.free = _ring_create(ipc_shm_name,
PKTIO_IPC_ENTRIES,
_RING_SHM_PROC | _RING_NO_LIST);
- if (!pktio_entry->ops_data(ipc).rx.free) {
+ if (!pkt_ipc->rx.free) {
ODP_ERR("pid %d unable to create ipc ring %s name\n",
getpid(), ipc_shm_name);
goto free_s_prod;
}
ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).rx.free),
- _ring_free_count(pktio_entry->ops_data(ipc).rx.free));
+ ipc_shm_name, _ring_count(pkt_ipc->rx.free),
+ _ring_free_count(pkt_ipc->rx.free));
/* Set up pool name for remote info */
- pinfo = pktio_entry->ops_data(ipc).pinfo;
+ pinfo = pkt_ipc->pinfo;
pool_name = _ipc_odp_buffer_pool_shm_name(pool_hdl);
if (strlen(pool_name) > ODP_POOL_NAME_LEN) {
ODP_ERR("pid %d ipc pool name %s is too big %d\n",
@@ -155,7 +159,7 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry,
pinfo->slave.pid = 0;
pinfo->slave.init_done = 0;
- pktio_entry->ops_data(ipc).pool = pool_hdl;
+ pkt_ipc->pool = pool_hdl;
ODP_DBG("Pre init... DONE.\n");
pinfo->master.init_done = 1;
@@ -221,15 +225,18 @@ static int _ipc_init_slave(const char *dev,
pktio_entry_t *pktio_entry,
odp_pool_t pool)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
+
if (strlen(dev) > (ODP_POOL_NAME_LEN - sizeof("_slave_r")))
ODP_ABORT("too big ipc name\n");
- pktio_entry->ops_data(ipc).pool = pool;
+ pkt_ipc->pool = pool;
return 0;
}
static int _ipc_slave_start(pktio_entry_t *pktio_entry)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_slave_r")];
struct pktio_info *pinfo;
odp_shm_t shm;
@@ -245,61 +252,61 @@ static int _ipc_slave_start(pktio_entry_t *pktio_entry)
sprintf(dev, "ipc:%s", tail);
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev);
- pktio_entry->ops_data(ipc).rx.recv = _ipc_shm_map(ipc_shm_name, pid);
- if (!pktio_entry->ops_data(ipc).rx.recv) {
+ pkt_ipc->rx.recv = _ipc_shm_map(ipc_shm_name, pid);
+ if (!pkt_ipc->rx.recv) {
ODP_DBG("pid %d unable to find ipc ring %s name\n",
getpid(), dev);
sleep(1);
return -1;
}
ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).rx.recv),
- _ring_free_count(pktio_entry->ops_data(ipc).rx.recv));
+ ipc_shm_name, _ring_count(pkt_ipc->rx.recv),
+ _ring_free_count(pkt_ipc->rx.recv));
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev);
- pktio_entry->ops_data(ipc).rx.free = _ipc_shm_map(ipc_shm_name, pid);
- if (!pktio_entry->ops_data(ipc).rx.free) {
+ pkt_ipc->rx.free = _ipc_shm_map(ipc_shm_name, pid);
+ if (!pkt_ipc->rx.free) {
ODP_ERR("pid %d unable to find ipc ring %s name\n",
getpid(), dev);
goto free_m_prod;
}
ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).rx.free),
- _ring_free_count(pktio_entry->ops_data(ipc).rx.free));
+ ipc_shm_name, _ring_count(pkt_ipc->rx.free),
+ _ring_free_count(pkt_ipc->rx.free));
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev);
- pktio_entry->ops_data(ipc).tx.send = _ipc_shm_map(ipc_shm_name, pid);
- if (!pktio_entry->ops_data(ipc).tx.send) {
+ pkt_ipc->tx.send = _ipc_shm_map(ipc_shm_name, pid);
+ if (!pkt_ipc->tx.send) {
ODP_ERR("pid %d unable to find ipc ring %s name\n",
getpid(), dev);
goto free_m_cons;
}
ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).tx.send),
- _ring_free_count(pktio_entry->ops_data(ipc).tx.send));
+ ipc_shm_name, _ring_count(pkt_ipc->tx.send),
+ _ring_free_count(pkt_ipc->tx.send));
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev);
- pktio_entry->ops_data(ipc).tx.free = _ipc_shm_map(ipc_shm_name, pid);
- if (!pktio_entry->ops_data(ipc).tx.free) {
+ pkt_ipc->tx.free = _ipc_shm_map(ipc_shm_name, pid);
+ if (!pkt_ipc->tx.free) {
ODP_ERR("pid %d unable to find ipc ring %s name\n",
getpid(), dev);
goto free_s_prod;
}
ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
- ipc_shm_name, _ring_count(pktio_entry->ops_data(ipc).tx.free),
- _ring_free_count(pktio_entry->ops_data(ipc).tx.free));
+ ipc_shm_name, _ring_count(pkt_ipc->tx.free),
+ _ring_free_count(pkt_ipc->tx.free));
/* Get info about remote pool */
- pinfo = pktio_entry->ops_data(ipc).pinfo;
+ pinfo = pkt_ipc->pinfo;
shm = _ipc_map_remote_pool(pinfo->master.pool_name,
pid);
- pktio_entry->ops_data(ipc).remote_pool_shm = shm;
- pktio_entry->ops_data(ipc).pool_mdata_base = (char *)odp_shm_addr(shm);
- pktio_entry->ops_data(ipc).pkt_size = pinfo->master.block_size;
+ pkt_ipc->remote_pool_shm = shm;
+ pkt_ipc->pool_mdata_base = (char *)odp_shm_addr(shm);
+ pkt_ipc->pkt_size = pinfo->master.block_size;
- _ipc_export_pool(pinfo, pktio_entry->ops_data(ipc).pool);
+ _ipc_export_pool(pinfo, pkt_ipc->pool);
- odp_atomic_store_u32(&pktio_entry->ops_data(ipc).ready, 1);
+ odp_atomic_store_u32(&pkt_ipc->ready, 1);
pinfo->slave.init_done = 1;
ODP_DBG("%s started.\n", pktio_entry->s.name);
@@ -331,6 +338,7 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED,
char name[ODP_POOL_NAME_LEN + sizeof("_info")];
char tail[ODP_POOL_NAME_LEN];
odp_shm_t shm;
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
ODP_STATIC_ASSERT(ODP_POOL_NAME_LEN == _RING_NAMESIZE,
"mismatch pool and ring name arrays");
@@ -338,15 +346,15 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED,
if (strncmp(dev, "ipc", 3))
return -1;
- odp_atomic_init_u32(&pktio_entry->ops_data(ipc).ready, 0);
+ odp_atomic_init_u32(&pkt_ipc->ready, 0);
- pktio_entry->ops_data(ipc).rx.cache = _ring_create("ipc_rx_cache",
+ pkt_ipc->rx.cache = _ring_create("ipc_rx_cache",
PKTIO_IPC_ENTRIES,
_RING_NO_LIST);
/* Shared info about remote pktio */
if (sscanf(dev, "ipc:%d:%s", &pid, tail) == 2) {
- pktio_entry->ops_data(ipc).type = PKTIO_TYPE_IPC_SLAVE;
+ pkt_ipc->type = PKTIO_TYPE_IPC_SLAVE;
snprintf(name, sizeof(name), "ipc:%s_info", tail);
IPC_ODP_DBG("lookup for name %s for pid %d\n", name, pid);
@@ -359,12 +367,12 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED,
odp_shm_free(shm);
return -1;
}
- pktio_entry->ops_data(ipc).pinfo = pinfo;
- pktio_entry->ops_data(ipc).pinfo_shm = shm;
+ pkt_ipc->pinfo = pinfo;
+ pkt_ipc->pinfo_shm = shm;
ODP_DBG("process %d is slave\n", getpid());
ret = _ipc_init_slave(name, pktio_entry, pool);
} else {
- pktio_entry->ops_data(ipc).type = PKTIO_TYPE_IPC_MASTER;
+ pkt_ipc->type = PKTIO_TYPE_IPC_MASTER;
snprintf(name, sizeof(name), "%s_info", dev);
shm = odp_shm_reserve(name, sizeof(struct pktio_info),
ODP_CACHE_LINE_SIZE,
@@ -377,8 +385,8 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED,
pinfo = odp_shm_addr(shm);
pinfo->master.init_done = 0;
pinfo->master.pool_name[0] = 0;
- pktio_entry->ops_data(ipc).pinfo = pinfo;
- pktio_entry->ops_data(ipc).pinfo_shm = shm;
+ pkt_ipc->pinfo = pinfo;
+ pkt_ipc->pinfo_shm = shm;
ODP_DBG("process %d is master\n", getpid());
ret = _ipc_init_master(pktio_entry, dev, pool);
}
@@ -388,6 +396,7 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED,
static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
uintptr_t offsets[PKTIO_IPC_ENTRIES];
int ret;
void **rbuf_p;
@@ -398,7 +407,7 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
if (!r)
return;
- pool = pool_entry_from_hdl(pktio_entry->ops_data(ipc).pool);
+ pool = pool_entry_from_hdl(pkt_ipc->pool);
addr = odp_shm_addr(pool->shm);
rbuf_p = (void *)&offsets;
@@ -423,6 +432,7 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
odp_packet_t pkt_table[], int len)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
int pkts = 0;
int i;
_ring_t *r;
@@ -432,16 +442,16 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
uint32_t ready;
int pkts_ring;
- ready = odp_atomic_load_u32(&pktio_entry->ops_data(ipc).ready);
+ ready = odp_atomic_load_u32(&pkt_ipc->ready);
if (odp_unlikely(!ready)) {
IPC_ODP_DBG("start pktio is missing before usage?\n");
return 0;
}
- _ipc_free_ring_packets(pktio_entry, pktio_entry->ops_data(ipc).tx.free);
+ _ipc_free_ring_packets(pktio_entry, pkt_ipc->tx.free);
/* rx from cache */
- r = pktio_entry->ops_data(ipc).rx.cache;
+ r = pkt_ipc->rx.cache;
pkts = _ring_mc_dequeue_burst(r, ipcbufs_p, len);
if (odp_unlikely(pkts < 0))
ODP_ABORT("internal error dequeue\n");
@@ -449,7 +459,7 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
/* rx from other app */
if (pkts == 0) {
ipcbufs_p = (void *)&offsets[0];
- r = pktio_entry->ops_data(ipc).rx.recv;
+ r = pkt_ipc->rx.recv;
pkts = _ring_mc_dequeue_burst(r, ipcbufs_p, len);
if (odp_unlikely(pkts < 0))
ODP_ABORT("internal error dequeue\n");
@@ -467,10 +477,10 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
uint64_t data_pool_off;
void *rmt_data_ptr;
- phdr = (void *)((uint8_t *)pktio_entry->
- ops_data(ipc).pool_mdata_base + offsets[i]);
+ phdr = (void *)((uint8_t *)pkt_ipc->pool_mdata_base +
+ offsets[i]);
- pool = pktio_entry->ops_data(ipc).pool;
+ pool = pkt_ipc->pool;
if (odp_unlikely(pool == ODP_POOL_INVALID))
ODP_ABORT("invalid pool");
@@ -494,12 +504,11 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
pkt_data = odp_packet_data(pkt);
if (odp_unlikely(!pkt_data))
ODP_ABORT("unable to map pkt_data ipc_slave %d\n",
- (PKTIO_TYPE_IPC_SLAVE ==
- pktio_entry->ops_data(ipc).type));
+ (PKTIO_TYPE_IPC_SLAVE == pkt_ipc->type));
/* Copy packet data from shared pool to local pool. */
- rmt_data_ptr = (uint8_t *)pktio_entry->
- ops_data(ipc).pool_mdata_base + data_pool_off;
+ rmt_data_ptr = (uint8_t *)pkt_ipc->pool_mdata_base +
+ data_pool_off;
memcpy(pkt_data, rmt_data_ptr, phdr->frame_len);
/* Copy packets L2, L3 parsed offsets and size */
@@ -518,7 +527,7 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
/* put back to rx ring dequed but not processed packets*/
if (pkts != i) {
ipcbufs_p = (void *)&offsets[i];
- r_p = pktio_entry->ops_data(ipc).rx.cache;
+ r_p = pkt_ipc->rx.cache;
pkts_ring = _ring_mp_enqueue_burst(r_p, ipcbufs_p, pkts - i);
if (pkts_ring != (pkts - i))
@@ -526,14 +535,13 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
if (i == 0)
return 0;
-
}
/*num of actually received packets*/
pkts = i;
/* Now tell other process that we no longer need that buffers.*/
- r_p = pktio_entry->ops_data(ipc).rx.free;
+ r_p = pkt_ipc->rx.free;
repeat:
@@ -577,11 +585,12 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
const odp_packet_t pkt_table[], int len)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
_ring_t *r;
void **rbuf_p;
int ret;
int i;
- uint32_t ready = odp_atomic_load_u32(&pktio_entry->ops_data(ipc).ready);
+ uint32_t ready = odp_atomic_load_u32(&pkt_ipc->ready);
odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be
* in memory mapped pool. */
uintptr_t offsets[len];
@@ -589,7 +598,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
if (odp_unlikely(!ready))
return 0;
- _ipc_free_ring_packets(pktio_entry, pktio_entry->ops_data(ipc).tx.free);
+ _ipc_free_ring_packets(pktio_entry, pkt_ipc->tx.free);
/* Copy packets to shm shared pool if they are in different
* pool, or if they are references (we can't share across IPC).
@@ -597,7 +606,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
for (i = 0; i < len; i++) {
odp_packet_t pkt = pkt_table[i];
pool_t *ipc_pool = pool_entry_from_hdl(
- pktio_entry->ops_data(ipc).pool);
+ pkt_ipc->pool);
odp_packet_hdr_t *pkt_hdr;
pool_t *pool;
@@ -608,8 +617,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
odp_packet_has_ref(pkt)) {
odp_packet_t newpkt;
- newpkt = odp_packet_copy(
- pkt, pktio_entry->ops_data(ipc).pool);
+ newpkt = odp_packet_copy(pkt, pkt_ipc->pool);
if (newpkt == ODP_PACKET_INVALID)
ODP_ABORT("Unable to copy packet\n");
@@ -641,20 +649,17 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
odp_packet_to_u64(pkt), odp_pool_to_u64(pool_hdl),
pkt_hdr, pkt_hdr->buf_hdr.ipc_data_offset,
offsets[i], odp_shm_addr(pool->shm),
- odp_shm_addr(pool_entry_from_hdl(pktio_entry->
- ops_data(ipc).pool)->shm));
+ odp_shm_addr(pool_entry_from_hdl(
+ pkt_ipc->pool)->shm));
}
/* Put packets to ring to be processed by other process. */
rbuf_p = (void *)&offsets[0];
- r = pktio_entry->ops_data(ipc).tx.send;
+ r = pkt_ipc->tx.send;
ret = _ring_mp_enqueue_burst(r, rbuf_p, len);
if (odp_unlikely(ret < 0)) {
ODP_ERR("pid %d odp_ring_mp_enqueue_bulk fail, ipc_slave %d, ret %d\n",
- getpid(),
- (PKTIO_TYPE_IPC_SLAVE ==
- pktio_entry->ops_data(ipc).type),
- ret);
+ getpid(), (PKTIO_TYPE_IPC_SLAVE == pkt_ipc->type), ret);
ODP_ERR("odp_ring_full: %d, odp_ring_count %d, _ring_free_count %d\n",
_ring_full(r), _ring_count(r),
_ring_free_count(r));
@@ -693,15 +698,15 @@ static int ipc_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED,
static int ipc_start(pktio_entry_t *pktio_entry)
{
- uint32_t ready = odp_atomic_load_u32(
- &pktio_entry->ops_data(ipc).ready);
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
+ uint32_t ready = odp_atomic_load_u32(&pkt_ipc->ready);
if (ready) {
ODP_ABORT("%s Already started\n", pktio_entry->s.name);
return -1;
}
- if (pktio_entry->ops_data(ipc).type == PKTIO_TYPE_IPC_MASTER)
+ if (pkt_ipc->type == PKTIO_TYPE_IPC_MASTER)
return _ipc_master_start(pktio_entry);
else
return _ipc_slave_start(pktio_entry);
@@ -709,24 +714,23 @@ static int ipc_start(pktio_entry_t *pktio_entry)
static int ipc_stop(pktio_entry_t *pktio_entry)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
unsigned tx_send = 0, tx_free = 0;
- odp_atomic_store_u32(&pktio_entry->ops_data(ipc).ready, 0);
+ odp_atomic_store_u32(&pkt_ipc->ready, 0);
- if (pktio_entry->ops_data(ipc).tx.send)
- _ipc_free_ring_packets(pktio_entry,
- pktio_entry->ops_data(ipc).tx.send);
+ if (pkt_ipc->tx.send)
+ _ipc_free_ring_packets(pktio_entry, pkt_ipc->tx.send);
/* other process can transfer packets from one ring to
* other, use delay here to free that packets. */
sleep(1);
- if (pktio_entry->ops_data(ipc).tx.free)
- _ipc_free_ring_packets(pktio_entry,
- pktio_entry->ops_data(ipc).tx.free);
-
- if (pktio_entry->ops_data(ipc).tx.send)
- tx_send = _ring_count(pktio_entry->ops_data(ipc).tx.send);
- if (pktio_entry->ops_data(ipc).tx.free)
- tx_free = _ring_count(pktio_entry->ops_data(ipc).tx.free);
+ if (pkt_ipc->tx.free)
+ _ipc_free_ring_packets(pktio_entry, pkt_ipc->tx.free);
+
+ if (pkt_ipc->tx.send)
+ tx_send = _ring_count(pkt_ipc->tx.send);
+ if (pkt_ipc->tx.free)
+ tx_free = _ring_count(pkt_ipc->tx.free);
if (tx_send | tx_free) {
ODP_DBG("IPC rings: tx send %d tx free %d\n",
tx_send, tx_free);
@@ -737,6 +741,7 @@ static int ipc_stop(pktio_entry_t *pktio_entry)
static int ipc_close(pktio_entry_t *pktio_entry)
{
+ pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc);
char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")];
char *dev = pktio_entry->s.name;
char name[ODP_POOL_NAME_LEN];
@@ -745,7 +750,7 @@ static int ipc_close(pktio_entry_t *pktio_entry)
ipc_stop(pktio_entry);
- odp_shm_free(pktio_entry->ops_data(ipc).remote_pool_shm);
+ odp_shm_free(pkt_ipc->remote_pool_shm);
if (sscanf(dev, "ipc:%d:%s", &pid, tail) == 2)
snprintf(name, sizeof(name), "ipc:%s", tail);
@@ -753,7 +758,7 @@ static int ipc_close(pktio_entry_t *pktio_entry)
snprintf(name, sizeof(name), "%s", dev);
/* unlink this pktio info for both master and slave */
- odp_shm_free(pktio_entry->ops_data(ipc).pinfo_shm);
+ odp_shm_free(pkt_ipc->pinfo_shm);
/* destroy rings */
snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", name);