odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool, odp_pktio_params_t *params) { odp_pktio_t id; pktio_entry_t *pktio_entry; char name[ODP_QUEUE_NAME_LEN]; queue_entry_t *queue_entry; odp_queue_t qid = ODP_QUEUE_INVALID; if (params == NULL) { ODP_ERR("Invalid pktio params\n"); return ODP_PKTIO_INVALID; } ODP_DBG("Allocating HW pktio\n"); id = alloc_lock_pktio_entry(params); if (id == ODP_PKTIO_INVALID) { ODP_ERR("No resources available.\n"); return ODP_PKTIO_INVALID; } /* if successful, alloc_pktio_entry() returns with the entry locked */ pktio_entry = get_entry(id); /* Create a default output queue for each pktio resource */ snprintf(name, sizeof(name), "%i-pktio_outq_default", (int)id); name[ODP_QUEUE_NAME_LEN-1] = '\0'; pktio_entry->s.dev = _odp_pktio_dev_lookup(dev); if (!pktio_entry->s.dev) { free_pktio_entry(id); id = ODP_PKTIO_INVALID; goto unlock; } qid = _odp_queue_create(name, ODP_QUEUE_TYPE_PKTOUT, NULL, pktio_entry->s.dev->tx_hw_queue); ODP_DBG("Created queue %u for hw queue %d\n", (uint32_t)qid, pktio_entry->s.dev->tx_hw_queue); if (qid == ODP_QUEUE_INVALID) { free_pktio_entry(id); id = ODP_PKTIO_INVALID; goto unlock; } pktio_entry->s.in_pool = pool; pktio_entry->s.outq_default = qid; queue_entry = queue_to_qentry(qid); queue_entry->s.pktout = id; queue_entry->s.out_port_id = pktio_entry->s.dev->port_id; unlock: unlock_entry(pktio_entry); return id; }
static odp_pktio_t setup_pktio_entry(const char *dev, odp_pool_t pool) { odp_pktio_t id; pktio_entry_t *pktio_entry; int ret = -1; int pktio_if; if (strlen(dev) >= IF_NAMESIZE) { /* ioctl names limitation */ ODP_ERR("pktio name %s is too big, limit is %d bytes\n", dev, IF_NAMESIZE); return ODP_PKTIO_INVALID; } id = alloc_lock_pktio_entry(); if (id == ODP_PKTIO_INVALID) { ODP_ERR("No resources available.\n"); return ODP_PKTIO_INVALID; } /* if successful, alloc_pktio_entry() returns with the entry locked */ pktio_entry = get_pktio_entry(id); if (!pktio_entry) { PRINT("get_pktio_entry is fail.\n"); return ODP_PKTIO_INVALID; } for (pktio_if = 0; pktio_if_ops[pktio_if]; ++pktio_if) { ret = pktio_if_ops[pktio_if]->open(id, pktio_entry, dev, pool); if (!ret) { pktio_entry->s.ops = pktio_if_ops[pktio_if]; break; } } if (ret != 0) { unlock_entry_classifier(pktio_entry); free_pktio_entry(id); id = ODP_PKTIO_INVALID; ODP_ERR("Unable to init any I/O type.\n"); } else { snprintf(pktio_entry->s.name, IF_NAMESIZE, "%s", dev); unlock_entry_classifier(pktio_entry); } pktio_entry->s.handle = id; return id; }
int odp_pktio_close(odp_pktio_t id) { pktio_entry_t *entry; int res = -1; entry = get_pktio_entry(id); if (entry == NULL) return -1; lock_entry(entry); if (!is_free(entry)) { res = entry->s.ops->close(entry); res |= free_pktio_entry(id); } unlock_entry(entry); if (res != 0) return -1; return 0; }
int odp_pktio_close(odp_pktio_t id) { pktio_entry_t *entry; int res = -1; entry = get_entry(id); if (entry == NULL) return -1; lock_entry(entry); if (!is_free(entry)) { /* FIXME: Here rx/tx channels should be closed */ res |= free_pktio_entry(id); } unlock_entry(entry); if (res != 0) return -1; return 0; }
int odp_pktio_close(odp_pktio_t id) { pktio_entry_t *entry; int res = -1; entry = get_entry(id); if (entry == NULL) return -1; lock_entry(entry); if (!is_free(entry)) { switch (entry->s.params.type) { case ODP_PKTIO_TYPE_SOCKET_BASIC: case ODP_PKTIO_TYPE_SOCKET_MMSG: res = close_pkt_sock(&entry->s.pkt_sock); break; case ODP_PKTIO_TYPE_SOCKET_MMAP: res = close_pkt_sock_mmap(&entry->s.pkt_sock_mmap); break; #ifdef ODP_HAVE_NETMAP case ODP_PKTIO_TYPE_NETMAP: res = close_pkt_netmap(&entry->s.pkt_nm); break; #endif default: break; res |= free_pktio_entry(id); } } unlock_entry(entry); if (res != 0) return -1; return 0; }
odp_pktio_t odp_pktio_open(const char *dev, odp_buffer_pool_t pool, odp_pktio_params_t *params) { odp_pktio_t id; pktio_entry_t *pktio_entry; int res; if (params == NULL) { ODP_ERR("Invalid pktio params\n"); return ODP_PKTIO_INVALID; } switch (params->type) { case ODP_PKTIO_TYPE_SOCKET_BASIC: case ODP_PKTIO_TYPE_SOCKET_MMSG: case ODP_PKTIO_TYPE_SOCKET_MMAP: ODP_DBG("Allocating socket pktio\n"); break; #ifdef ODP_HAVE_NETMAP case ODP_PKTIO_TYPE_NETMAP: ODP_DBG("Allocating netmap pktio\n"); break; #endif default: ODP_ERR("Invalid pktio type: %02x\n", params->type); return ODP_PKTIO_INVALID; } id = alloc_lock_pktio_entry(params); if (id == ODP_PKTIO_INVALID) { ODP_ERR("No resources available.\n"); return ODP_PKTIO_INVALID; } /* if successful, alloc_pktio_entry() returns with the entry locked */ pktio_entry = get_entry(id); switch (params->type) { case ODP_PKTIO_TYPE_SOCKET_BASIC: case ODP_PKTIO_TYPE_SOCKET_MMSG: res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool); if (res == -1) { close_pkt_sock(&pktio_entry->s.pkt_sock); free_pktio_entry(id); id = ODP_PKTIO_INVALID; } break; case ODP_PKTIO_TYPE_SOCKET_MMAP: res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev, pool, params->sock_params.fanout); if (res == -1) { close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap); free_pktio_entry(id); id = ODP_PKTIO_INVALID; } break; #ifdef ODP_HAVE_NETMAP case ODP_PKTIO_TYPE_NETMAP: res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev, pool, ¶ms->nm_params); if (res == -1) { close_pkt_netmap(&pktio_entry->s.pkt_nm); free_pktio_entry(id); id = ODP_PKTIO_INVALID; } break; #endif default: free_pktio_entry(id); id = ODP_PKTIO_INVALID; ODP_ERR("This type of I/O is not supported. Please recompile.\n"); break; } unlock_entry(pktio_entry); return id; }