[dpdk-dev] [PATCH v5] drivers/net:new PMD using tun/tap host interface

Wiles, Keith keith.wiles at intel.com
Wed Oct 12 20:19:48 CEST 2016


Regards,
Keith

> On Oct 12, 2016, at 9:56 AM, Yigit, Ferruh <ferruh.yigit at intel.com> wrote:
> 
> On 10/11/2016 10:51 PM, Keith Wiles wrote:
>> The rte_eth_tap.c PMD creates a device using TUN/TAP interfaces
>> on the local host. The PMD allows for DPDK and the host to
>> communicate using a raw device interface on the host and in
>> the DPDK application. The device created is a Tap device with
>> a L2 packet header.
>> 
>> v5 - merge in changes from list review see related emails.
>>     fixed checkpatch issues and many minor edits
>> v4 - merge with latest driver changes
>> v3 - fix includes by removing ifdef for other type besides Linux.
>>     Fix the copyright notice in the Makefile
>> v2 - merge all of the patches into one patch.
>>     Fix a typo on naming the tap device.
>>     Update the maintainers list
>> 
>> Signed-off-by: Keith Wiles <keith.wiles at intel.com>
>> ---
> 
> <..>
> 
>> diff --git a/config/common_base b/config/common_base
>> index f5d2eff..356c631 100644
>> --- a/config/common_base
>> +++ b/config/common_base
>> @@ -592,3 +592,8 @@ CONFIG_RTE_APP_TEST_RESOURCE_TAR=n
>> CONFIG_RTE_TEST_PMD=y
>> CONFIG_RTE_TEST_PMD_RECORD_CORE_CYCLES=n
>> CONFIG_RTE_TEST_PMD_RECORD_BURST_STATS=n
>> +
>> +#
>> +# Set TAP PMD to 'n' as it is only supported in Linux for now.
> 
> This comments moved to final .config and creates confusion, can we
> remove it if you don't have a strong option to keep it?

What do you mean, the statement is confusing or causes problems?

> 
> <..>
> 
>> diff --git a/doc/guides/nics/tap.rst b/doc/guides/nics/tap.rst
>> new file mode 100644
>> index 0000000..eed81ec
>> --- /dev/null
>> +++ b/doc/guides/nics/tap.rst
> 
> <..>
> 
>> +.. code-block:: console
>> +
>> +   The interfaced name can be changed by adding the iface=foo0
>> +   e.g. --vdev=eth_tap,iface=foo0 --vdev=eth_tap,iface=foo1, ...
> 
> For all file:
> %s/eth_tap/net_tap/g, there are multiple lines with this usage

Missed that one.

> 
> 
> <..>
> 
>> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
>> new file mode 100644
>> index 0000000..c13aa1b
>> --- /dev/null
>> +++ b/drivers/net/tap/rte_eth_tap.c
> 
> <..>
> 
>> +
>> +struct tap_info {
>> +	char name[RTE_ETH_NAME_MAX_LEN]; /* Interface name supplied/given */
>> +	int speed;			 /* Speed of interface */
>> +};
> 
> This struct can go away, it is not used, since with the updated code
> rte_pmd_tap_probe() used tap_name and speed as seperate variables
> instead of struct.
> 

OK.

> 
> <..>
> 
>> +
>> +	/* If the name is different that new name as default */
>> +	if (name && strcmp(name, ifr.ifr_name))
>> +		snprintf(name, RTE_ETH_NAME_MAX_LEN-1, "%s", ifr.ifr_name);
> 
> syntax, space around "-"
> 
> <..>
> 
>> +
>> +static void
>> +tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats)
>> +{
>> +	unsigned i, imax;
> 
> checkpatch complain about not using "unsigned int”

I ran checkpatch on the patch and saw no errors reported via the scripts/checkpatch.sh. Which checkpatch are you using here?
> 
> 
> <..>
> 
>> +static int
>> +tap_setup_queue(struct rte_eth_dev *dev,
>> +		struct pmd_internals *internals,
>> +		uint16_t qid)
>> +{
>> +	struct rx_queue *rx = &internals->rxq[qid];
>> +	struct tx_queue *tx = &internals->txq[qid];
>> +	int fd;
>> +
>> +	if ((fd = rx->fd) < 0)
>> +		if ((fd = tx->fd) < 0) {
>> +			RTE_LOG(INFO, PMD, "Add queue to TAP %s for qid %d\n",
>> +				dev->data->name, qid);
>> +			if ((fd = tun_alloc(dev->data->name)) < 0) {
> 
> checkpatch complain about assignment in the if condition
> 
> 
> <..>
> 
>> +	/* Now get the space available for data in the mbuf */
>> +	buf_size = (uint16_t) (rte_pktmbuf_data_room_size(mp) -
> 
> syntax, no space after cast
> 
> 
> <..>
> 
>> +	/* Create the first Tap device */
>> +	if ((fd = tun_alloc(tap_name)) < 0) {
> 
> checkpatch complains about assignment in if condition
> 
>> +		RTE_LOG(ERR, PMD, "tun_alloc(%s) failed\n", dev->data->name);
>> +		rte_free(pmd);
> 
> rte_free(data) or goto error_exit; ?
> 
>> +		rte_eth_dev_release_port(dev);
>> +		return -EINVAL;
>> +	}
>> +
>> +	/* Presetup the fds to -1 as being not working */
>> +	for(i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
>> +		pmd->fds[i] = -1;
>> +		pmd->rxq[i].fd = -1;
>> +		pmd->txq[i].fd = -1;
>> +	}
>> +
>> +	/* Take the TUN/TAP fd and place in the first location */
>> +	pmd->rxq[0].fd = fd;
>> +	pmd->txq[0].fd = fd;
>> +	pmd->fds[0] = fd;
>> +
>> +	if (pmd_mac_address(fd, dev, &pmd->eth_addr) < 0) {
>> +		rte_free(pmd);
> 
> rte_free(data) or goto error_exit; ?
> 
> 
> <..>
> 
>> +static int
>> +set_interface_name(const char *key __rte_unused,
>> +		   const char *value,
>> +		   void *extra_args)
>> +{
>> +	char *name = (char *)extra_args;
>> +
>> +	if (value)
>> +		snprintf(name, RTE_ETH_NAME_MAX_LEN-1, "%s", value);
> 
> syntax, space around "-"
> 
>> +	else
>> +		snprintf(name, RTE_ETH_NAME_MAX_LEN-1, "%s%d",
> 
> syntax, space around "-"
> 
>> +			 DEFAULT_TAP_NAME, (tap_unit-1));
> 
> syntax, space around "-"
> 
>> +
>> +	return 0;
>> +}
>> +
>> +static int
>> +set_interface_speed(const char *key __rte_unused,
>> +		    const char *value,
>> +		    void *extra_args)
>> +{
>> +	*(int *)extra_args = (value)? atoi(value) : ETH_SPEED_NUM_10G;
> 
> syntax, space around "?"
> 
> <..>
> 
>> +		kvlist = rte_kvargs_parse(params, valid_arguments);
>> +		if (kvlist) {
>> +			if (rte_kvargs_count(kvlist, ETH_TAP_SPEED_ARG) == 1) {
>> +				ret = rte_kvargs_process(kvlist,
>> +							 ETH_TAP_SPEED_ARG,
>> +							 &set_interface_speed,
>> +						         &speed);
> 
> whitespace, space and tab mixed
> 
>> +				if (ret == -1)
>> +					goto leave;
>> +			}
>> +
>> +			if (rte_kvargs_count(kvlist, ETH_TAP_IFACE_ARG) == 1) {
>> +				ret = rte_kvargs_process(kvlist,
>> +							 ETH_TAP_IFACE_ARG,
>> +							 &set_interface_name,
>> +						         tap_name);
> 
> whitespace, space and tab mixed
> 
> <..>
> 
>> +static int
>> +rte_pmd_tap_remove(const char *name)
>> +{
>> +	struct rte_eth_dev *eth_dev = NULL;
>> +	struct pmd_internals *internals;
>> +	int i;
>> +
>> +	RTE_LOG(INFO, PMD, "Closing TUN/TAP Ethernet device on numa %u\n",
>> +		rte_socket_id());
>> +
>> +	/* find the ethdev entry */
>> +	eth_dev = rte_eth_dev_allocated(name);
> 
> This may cause a problem. Device created by tap_name, but searching with
> name. I suspenct this will always return NULL.
> 
> <..>
> 
> Thanks,
> ferru



More information about the dev mailing list