Beispiel #1
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;
	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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
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;
}
Beispiel #5
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;
}
Beispiel #6
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, &params->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;
}