[dpdk-dev] [PATCH v4 1/6] kni: add API to set link status on kernel interface

Ferruh Yigit ferruh.yigit at intel.com
Thu Oct 18 15:44:25 CEST 2018


On 10/17/2018 2:04 AM, Dan Gora wrote:
> Add a new API function to KNI, rte_kni_update_link() to allow DPDK
> applications to update the link status for KNI network interfaces in
> the linux kernel.
> 
> Signed-off-by: Dan Gora <dg at adax.com>
> ---
>  lib/librte_kni/rte_kni.c           | 41 ++++++++++++++++++++++++++++++
>  lib/librte_kni/rte_kni.h           | 20 +++++++++++++++
>  lib/librte_kni/rte_kni_version.map |  6 +++++
>  3 files changed, 67 insertions(+)
> 
> diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c
> index b8edd40f4..c9726d4f8 100644
> --- a/lib/librte_kni/rte_kni.c
> +++ b/lib/librte_kni/rte_kni.c
> @@ -717,6 +717,47 @@ rte_kni_unregister_handlers(struct rte_kni *kni)
>  
>  	return 0;
>  }
> +
> +int __rte_experimental
> +rte_kni_update_link(struct rte_kni *kni, unsigned int linkup)
> +{
> +	char path[64];
> +	char old_carrier[2];
> +	const char *new_carrier;
> +	int old_linkup;
> +	int fd, ret;
> +
> +	if (kni == NULL)
> +		return -1;
> +
> +	snprintf(path, sizeof(path), "/sys/devices/virtual/net/%s/carrier",
> +		kni->name);
> +
> +	fd = open(path, O_RDWR);
> +	if (fd == -1) {
> +		RTE_LOG(ERR, KNI, "Failed to open file: %s.\n", path);
> +		return -1;
> +	}
> +
> +	ret = read(fd, old_carrier, 2);
> +	if (ret < 1) {
> +		close(fd);
> +		return -1;
> +	}
> +	old_linkup = (old_carrier[0] == '1');
> +
> +	new_carrier = linkup ? "1" : "0";
> +	ret = write(fd, new_carrier, 1);

KNI sample application calls this API each 100ms, so this keeps writing
"carrier" file.

What do you think writing to "carrier" file only if status changed?

And it is possible to register to RTE_ETH_EVENT_INTR_LSC event in sample
application instead of polling but not sure if all drivers supports it.

Or what do you think storing the link status in sample application and call this
function only if link status changed?


More information about the dev mailing list