[dpdk-dev] [PATCH v5 4/4] examples/ethtool: add control interface support to the application

Ananyev, Konstantin konstantin.ananyev at intel.com
Wed Mar 9 13:23:09 CET 2016



> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Ferruh Yigit
> Sent: Wednesday, March 09, 2016 11:41 AM
> To: dev at dpdk.org
> Subject: [dpdk-dev] [PATCH v5 4/4] examples/ethtool: add control interface support to the application
> 
> Control interface APIs added into the sample application.
> 
> To have the support corresponding kernel module (KCP) needs to be inserted.
> If kernel module is not there, application will run as it is without
> kernel control path support.
> 
> When KCP module inserted, running application creates a virtual Linux
> network interface (dpdk$) per DPDK port. This interface can be used by
> traditional Linux tools.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit at intel.com>
> Acked-by: Remy Horton <remy.horton at intel.com>
> ---
> 
> v4, v5:
> * No update
> 
> v3:
> * Use blocking mode control interface processing, instead of poll mode
> 
> v2:
> * No update on sample app
> ---
>  doc/guides/sample_app_ug/ethtool.rst | 41 ++++++++++++++++++++++++++++++++++++
>  examples/ethtool/main.c              | 31 +++++++++++++++++++++++++--
>  2 files changed, 70 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst
> index 65240ae..af591c2 100644
> --- a/doc/guides/sample_app_ug/ethtool.rst
> +++ b/doc/guides/sample_app_ug/ethtool.rst
> @@ -130,3 +130,44 @@ interface that accepts commands as described in `using the
>  application`_. Individual call-back functions handle the detail
>  associated with each command, which make use of librte_ethtool
>  library.
> +
> +Control Interface
> +~~~~~~~~~~~~~~~~~
> +
> +If Kernel Control Path (KCP) kernel module (rte_kcp.ko) inserted,
> +virtual interfaces created for each DPDK port for control purposes.
> +
> +Created interfaces are named as dpdk#, like:
> +
> +.. code-block:: console
> +
> +        # ifconfig dpdk0; ifconfig dpdk1
> +        dpdk0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
> +                ether 90:e2:ba:0e:49:b9  txqueuelen 1000  (Ethernet)
> +                RX packets 0  bytes 0 (0.0 B)
> +                RX errors 0  dropped 0  overruns 0  frame 0
> +                TX packets 0  bytes 0 (0.0 B)
> +                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
> +
> +        dpdk1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
> +                ether 00:1b:21:76:fa:21  txqueuelen 1000  (Ethernet)
> +                RX packets 0  bytes 0 (0.0 B)
> +                RX errors 0  dropped 0  overruns 0  frame 0
> +                TX packets 0  bytes 0 (0.0 B)
> +                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
> +
> +Regular Linux commands can be issued on interfaces:
> +
> +.. code-block:: console
> +
> +        # ethtool -i dpdk0
> +        driver: rte_ixgbe_pmd
> +        version: RTE 2.3.0-rc0
> +        firmware-version:
> +        expansion-rom-version:
> +        bus-info: 0000:08:00.1
> +        supports-statistics: yes
> +        supports-test: no
> +        supports-eeprom-access: yes
> +        supports-register-dump: yes
> +        supports-priv-flags: no
> diff --git a/examples/ethtool/main.c b/examples/ethtool/main.c
> index 2c655d8..72fbe4c 100644
> --- a/examples/ethtool/main.c
> +++ b/examples/ethtool/main.c
> @@ -1,7 +1,7 @@
>  /*-
>   *   BSD LICENSE
>   *
> - *   Copyright(c) 2015 Intel Corporation. All rights reserved.
> + *   Copyright(c) 2015-2016 Intel Corporation. All rights reserved.
>   *   All rights reserved.
>   *
>   *   Redistribution and use in source and binary forms, with or without
> @@ -44,6 +44,7 @@
>  #include <rte_memory.h>
>  #include <rte_mempool.h>
>  #include <rte_mbuf.h>
> +#include <rte_ctrl_if.h>
> 
>  #include "ethapp.h"
> 
> @@ -54,7 +55,6 @@
>  #define PKTPOOL_EXTRA_SIZE 512
>  #define PKTPOOL_CACHE 32
> 
> -
>  struct txq_port {
>  	uint16_t cnt_unsent;
>  	struct rte_mbuf *buf_frames[MAX_BURST_LENGTH];
> @@ -259,11 +259,32 @@ static int slave_main(__attribute__((unused)) void *ptr_data)
>  	return 0;
>  }
> 
> +static void *
> +control_function(__attribute__((unused)) void *arg)
> +{
> +	int port_id;
> +
> +	while (1) {
> +		/* blocking call with 1 sec timeout */
> +		port_id = rte_eth_control_interface_msg_exist(1);
> +		if (port_id < 0)
> +			continue;
> +
> +		lock_port(port_id);
> +		rte_eth_control_interface_msg_process(
> +			RTE_ETHTOOL_CTRL_IF_PROCESS_MSG);
> +		unlock_port(port_id);


As I stated in offline code review, I think that just lock/unlock here is not enough.
You either have to  update port_active flag here based on dev->data->dev_started,
or check  dev->data->dev_started directly in your data-path or somehow else
inform IO thread that the port is stopped and RX/TX is not possible over it.
Otherwise sending stop command over your control interface while RX/TX is active
would cause your app to crash. 
Konstantin

> +	}
> +
> +	return 0;
> +}
> +
>  int main(int argc, char **argv)
>  {
>  	int cnt_args_parsed;
>  	uint32_t id_core;
>  	uint32_t cnt_ports;
> +	pthread_t control_thread;
> 
>  	/* Init runtime enviornment */
>  	cnt_args_parsed = rte_eal_init(argc, argv);
> @@ -293,6 +314,9 @@ int main(int argc, char **argv)
>  	id_core = rte_get_next_lcore(id_core, 1, 1);
>  	rte_eal_remote_launch(slave_main, NULL, id_core);
> 
> +	pthread_create(&control_thread, NULL, control_function, NULL);
> +	rte_eth_control_interface_create();
> +
>  	ethapp_main();
> 
>  	app_cfg.exit_now = 1;
> @@ -301,5 +325,8 @@ int main(int argc, char **argv)
>  			return -1;
>  	}
> 
> +	rte_eth_control_interface_destroy();
> +	pthread_cancel(control_thread);
> +
>  	return 0;
>  }
> --
> 2.5.0



More information about the dev mailing list