DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] kni: Add link status update
@ 2015-05-18 23:33 Vijayakumar Muthuvel Manickam
  2015-05-19  0:54 ` Zhang, Helin
  2015-05-19  3:11 ` [dpdk-dev] [PATCH] " Stephen Hemminger
  0 siblings, 2 replies; 11+ messages in thread
From: Vijayakumar Muthuvel Manickam @ 2015-05-18 23:33 UTC (permalink / raw)
  To: dev

Add an ioctl command in rte_kni module to enable
DPDK applications to propagate link state changes to
kni virtual interfaces.

Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
---
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |  2 ++
 lib/librte_eal/linuxapp/kni/kni_misc.c             | 39 ++++++++++++++++++++++
 lib/librte_kni/rte_kni.c                           | 18 ++++++++++
 lib/librte_kni/rte_kni.h                           | 17 ++++++++++
 4 files changed, 76 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
index 1e55c2d..b68001d 100644
--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
@@ -163,6 +163,7 @@ struct rte_kni_device_info {
 
 	/* mbuf size */
 	unsigned mbuf_size;
+	uint8_t link_state;
 };
 
 #define KNI_DEVICE "kni"
@@ -170,5 +171,6 @@ struct rte_kni_device_info {
 #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
 #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct rte_kni_device_info)
 #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info)
+#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct rte_kni_device_info)
 
 #endif /* _RTE_KNI_COMMON_H_ */
diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c b/lib/librte_eal/linuxapp/kni/kni_misc.c
index 1935d32..b1015cd 100644
--- a/lib/librte_eal/linuxapp/kni/kni_misc.c
+++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
@@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num, unsigned long ioctl_param)
 }
 
 static int
+kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long ioctl_param)
+{
+	int ret = -EINVAL;
+	struct kni_dev *dev, *n;
+	struct rte_kni_device_info dev_info;
+
+	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
+			return -EINVAL;
+
+	ret = copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info));
+	if (ret) {
+		KNI_ERR("copy_from_user in kni_ioctl_update_link_status");
+		return -EIO;
+	}
+
+	if (strlen(dev_info.name) == 0)
+		return ret;
+
+	down_write(&kni_list_lock);
+	list_for_each_entry_safe(dev, n, &kni_list_head, list) {
+		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0)
+			continue;
+
+		if (dev_info.link_state == 0)
+			netif_carrier_off(dev->net_dev);
+		else
+			netif_carrier_on(dev->net_dev);
+		ret = 0;
+		break;
+	}
+	up_write(&kni_list_lock);
+
+	return ret;
+}
+
+static int
 kni_ioctl(struct inode *inode,
 	unsigned int ioctl_num,
 	unsigned long ioctl_param)
@@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode,
 	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
 		ret = kni_ioctl_release(ioctl_num, ioctl_param);
 		break;
+	case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE):
+		ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param);
+		break;
 	default:
 		KNI_DBG("IOCTL default \n");
 		break;
diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c
index 4e70fa0..b6eda8a 100644
--- a/lib/librte_kni/rte_kni.c
+++ b/lib/librte_kni/rte_kni.c
@@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni)
 }
 
 int
+rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up)
+{
+	struct rte_kni_device_info dev_info;
+
+	if (!kni || !kni->in_use)
+		return -1;
+
+	snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name);
+	dev_info.link_state = if_up;
+	if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) {
+		RTE_LOG(ERR, KNI, "Fail to update link state\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+int
 rte_kni_handle_request(struct rte_kni *kni)
 {
 	unsigned ret;
diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h
index 98edd72..a1bafd9 100644
--- a/lib/librte_kni/rte_kni.h
+++ b/lib/librte_kni/rte_kni.h
@@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t port_id,
 extern int rte_kni_release(struct rte_kni *kni);
 
 /**
+ * Send link state changes to KNI interface in kernel space
+ *
+ * rte_kni_update_link_state is thread safe.
+ *
+ * @param kni
+ *  The pointer to the context of an existent KNI interface.
+ * @param if_up
+ *  interface link status
+ *
+ * @return
+ *  - 0 indicates success.
+ *  - negative value indicates failure.
+ */
+
+extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up);
+
+/**
  * It is used to handle the request mbufs sent from kernel space.
  * Then analyzes it and calls the specific actions for the specific requests.
  * Finally constructs the response mbuf and puts it back to the resp_q.
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH] kni: Add link status update
  2015-05-18 23:33 [dpdk-dev] [PATCH] kni: Add link status update Vijayakumar Muthuvel Manickam
@ 2015-05-19  0:54 ` Zhang, Helin
  2015-06-15  0:57   ` Zhang, Helin
  2015-05-19  3:11 ` [dpdk-dev] [PATCH] " Stephen Hemminger
  1 sibling, 1 reply; 11+ messages in thread
From: Zhang, Helin @ 2015-05-19  0:54 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam, dev

Hello

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Vijayakumar
> Muthuvel Manickam
> Sent: Tuesday, May 19, 2015 7:33 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] kni: Add link status update
> 
> Add an ioctl command in rte_kni module to enable DPDK applications to
> propagate link state changes to kni virtual interfaces.
> 
> Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
> ---
>  .../linuxapp/eal/include/exec-env/rte_kni_common.h |  2 ++
>  lib/librte_eal/linuxapp/kni/kni_misc.c             | 39
> ++++++++++++++++++++++
>  lib/librte_kni/rte_kni.c                           | 18 ++++++++++
>  lib/librte_kni/rte_kni.h                           | 17 ++++++++++
>  4 files changed, 76 insertions(+)
> 
> diff --git
> a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> index 1e55c2d..b68001d 100644
> --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> @@ -163,6 +163,7 @@ struct rte_kni_device_info {
> 
>  	/* mbuf size */
>  	unsigned mbuf_size;
> +	uint8_t link_state;
How about transfer more states from user space to kernel space, such as link speed, duplex, etc?

>  };
> 
>  #define KNI_DEVICE "kni"
> @@ -170,5 +171,6 @@ struct rte_kni_device_info {
>  #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
>  #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct
> rte_kni_device_info)  #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3,
> struct rte_kni_device_info)
> +#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct
> +rte_kni_device_info)
> 
>  #endif /* _RTE_KNI_COMMON_H_ */
> diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c
> b/lib/librte_eal/linuxapp/kni/kni_misc.c
> index 1935d32..b1015cd 100644
> --- a/lib/librte_eal/linuxapp/kni/kni_misc.c
> +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
> @@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num,
> unsigned long ioctl_param)  }
> 
>  static int
> +kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long
> +ioctl_param) {
> +	int ret = -EINVAL;
> +	struct kni_dev *dev, *n;
> +	struct rte_kni_device_info dev_info;
> +
> +	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
> +			return -EINVAL;
> +
> +	ret = copy_from_user(&dev_info, (void *)ioctl_param,
> sizeof(dev_info));
> +	if (ret) {
> +		KNI_ERR("copy_from_user in kni_ioctl_update_link_status");
> +		return -EIO;
> +	}
> +
> +	if (strlen(dev_info.name) == 0)
> +		return ret;
> +
> +	down_write(&kni_list_lock);
> +	list_for_each_entry_safe(dev, n, &kni_list_head, list) {
> +		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) !=
> 0)
> +			continue;
> +
> +		if (dev_info.link_state == 0)
> +			netif_carrier_off(dev->net_dev);
> +		else
> +			netif_carrier_on(dev->net_dev);
> +		ret = 0;
> +		break;
> +	}
> +	up_write(&kni_list_lock);
> +
> +	return ret;
> +}
> +
> +static int
>  kni_ioctl(struct inode *inode,
>  	unsigned int ioctl_num,
>  	unsigned long ioctl_param)
> @@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode,
>  	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
>  		ret = kni_ioctl_release(ioctl_num, ioctl_param);
>  		break;
> +	case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE):
> +		ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param);
> +		break;
>  	default:
>  		KNI_DBG("IOCTL default \n");
>  		break;
> diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index
> 4e70fa0..b6eda8a 100644
> --- a/lib/librte_kni/rte_kni.c
> +++ b/lib/librte_kni/rte_kni.c
> @@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni)  }
> 
>  int
> +rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up) {
> +	struct rte_kni_device_info dev_info;
> +
> +	if (!kni || !kni->in_use)
> +		return -1;
> +
> +	snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name);
> +	dev_info.link_state = if_up;
> +	if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) {
> +		RTE_LOG(ERR, KNI, "Fail to update link state\n");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
This new interface should be called at the end of rte_kni_alloc() to notify
the link status after a KNI interface is created.

Thanks,
Helin

> +int
>  rte_kni_handle_request(struct rte_kni *kni)  {
>  	unsigned ret;
> diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index
> 98edd72..a1bafd9 100644
> --- a/lib/librte_kni/rte_kni.h
> +++ b/lib/librte_kni/rte_kni.h
> @@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t
> port_id,  extern int rte_kni_release(struct rte_kni *kni);
> 
>  /**
> + * Send link state changes to KNI interface in kernel space
> + *
> + * rte_kni_update_link_state is thread safe.
> + *
> + * @param kni
> + *  The pointer to the context of an existent KNI interface.
> + * @param if_up
> + *  interface link status
> + *
> + * @return
> + *  - 0 indicates success.
> + *  - negative value indicates failure.
> + */
> +
> +extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t
> +if_up);
> +
> +/**
>   * It is used to handle the request mbufs sent from kernel space.
>   * Then analyzes it and calls the specific actions for the specific requests.
>   * Finally constructs the response mbuf and puts it back to the resp_q.
> --
> 1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH] kni: Add link status update
  2015-05-18 23:33 [dpdk-dev] [PATCH] kni: Add link status update Vijayakumar Muthuvel Manickam
  2015-05-19  0:54 ` Zhang, Helin
@ 2015-05-19  3:11 ` Stephen Hemminger
  1 sibling, 0 replies; 11+ messages in thread
From: Stephen Hemminger @ 2015-05-19  3:11 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam; +Cc: dev

I agree that this looks like a good facility to have but this is not
the right way to do it.

There are already several facilities to accomplish the same thing.

1. You can use the operstate functionality in kernel to manipulate carrier
   from another application (read Documentation/operstate.txt)

2. It is possible with sysfs to change carrier state. The KNI driver just
   has to provide an .ndo_change_carrier callback.

Introducing more ioctl's is not a good thing. KNI needs to get rid of
the quick and dirty ioctl approach and follow current best practices
for Linux network drivers. It should really be using netlink instead of ioctl().
Ioctl's have several compatibility issues that make them unacceptable upstream.
There is a standard API for create/destroy with netlink and the custom
ioctl's could be banished into the attic of dead API's.

PS: Has anybody even attempted to get KNI upstream? I can see lots
     of style (and security) issues that would need to be fixed.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH] kni: Add link status update
  2015-05-19  0:54 ` Zhang, Helin
@ 2015-06-15  0:57   ` Zhang, Helin
  2015-06-15  1:11     ` Vijayakumar Muthuvel Manickam
  0 siblings, 1 reply; 11+ messages in thread
From: Zhang, Helin @ 2015-06-15  0:57 UTC (permalink / raw)
  To: 'Vijayakumar Muthuvel Manickam', thomas.monjalon
  Cc: 'dev@dpdk.org'

Any response for my comments? Did I miss anything?

- Helin

> -----Original Message-----
> From: Zhang, Helin
> Sent: Tuesday, May 19, 2015 8:54 AM
> To: Vijayakumar Muthuvel Manickam; dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH] kni: Add link status update
> 
> Hello
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Vijayakumar
> > Muthuvel Manickam
> > Sent: Tuesday, May 19, 2015 7:33 AM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH] kni: Add link status update
> >
> > Add an ioctl command in rte_kni module to enable DPDK applications to
> > propagate link state changes to kni virtual interfaces.
> >
> > Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
> > ---
> >  .../linuxapp/eal/include/exec-env/rte_kni_common.h |  2 ++
> >  lib/librte_eal/linuxapp/kni/kni_misc.c             | 39
> > ++++++++++++++++++++++
> >  lib/librte_kni/rte_kni.c                           | 18 ++++++++++
> >  lib/librte_kni/rte_kni.h                           | 17 ++++++++++
> >  4 files changed, 76 insertions(+)
> >
> > diff --git
> > a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > index 1e55c2d..b68001d 100644
> > --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > @@ -163,6 +163,7 @@ struct rte_kni_device_info {
> >
> >  	/* mbuf size */
> >  	unsigned mbuf_size;
> > +	uint8_t link_state;
> How about transfer more states from user space to kernel space, such as link
> speed, duplex, etc?
> 
> >  };
> >
> >  #define KNI_DEVICE "kni"
> > @@ -170,5 +171,6 @@ struct rte_kni_device_info {
> >  #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
> >  #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct
> > rte_kni_device_info)  #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct
> > rte_kni_device_info)
> > +#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct
> > +rte_kni_device_info)
> >
> >  #endif /* _RTE_KNI_COMMON_H_ */
> > diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > index 1935d32..b1015cd 100644
> > --- a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > @@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num,
> > unsigned long ioctl_param)  }
> >
> >  static int
> > +kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long
> > +ioctl_param) {
> > +	int ret = -EINVAL;
> > +	struct kni_dev *dev, *n;
> > +	struct rte_kni_device_info dev_info;
> > +
> > +	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
> > +			return -EINVAL;
> > +
> > +	ret = copy_from_user(&dev_info, (void *)ioctl_param,
> > sizeof(dev_info));
> > +	if (ret) {
> > +		KNI_ERR("copy_from_user in kni_ioctl_update_link_status");
> > +		return -EIO;
> > +	}
> > +
> > +	if (strlen(dev_info.name) == 0)
> > +		return ret;
> > +
> > +	down_write(&kni_list_lock);
> > +	list_for_each_entry_safe(dev, n, &kni_list_head, list) {
> > +		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) !=
> > 0)
> > +			continue;
> > +
> > +		if (dev_info.link_state == 0)
> > +			netif_carrier_off(dev->net_dev);
> > +		else
> > +			netif_carrier_on(dev->net_dev);
> > +		ret = 0;
> > +		break;
> > +	}
> > +	up_write(&kni_list_lock);
> > +
> > +	return ret;
> > +}
> > +
> > +static int
> >  kni_ioctl(struct inode *inode,
> >  	unsigned int ioctl_num,
> >  	unsigned long ioctl_param)
> > @@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode,
> >  	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
> >  		ret = kni_ioctl_release(ioctl_num, ioctl_param);
> >  		break;
> > +	case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE):
> > +		ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param);
> > +		break;
> >  	default:
> >  		KNI_DBG("IOCTL default \n");
> >  		break;
> > diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index
> > 4e70fa0..b6eda8a 100644
> > --- a/lib/librte_kni/rte_kni.c
> > +++ b/lib/librte_kni/rte_kni.c
> > @@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni)  }
> >
> >  int
> > +rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up) {
> > +	struct rte_kni_device_info dev_info;
> > +
> > +	if (!kni || !kni->in_use)
> > +		return -1;
> > +
> > +	snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name);
> > +	dev_info.link_state = if_up;
> > +	if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) {
> > +		RTE_LOG(ERR, KNI, "Fail to update link state\n");
> > +		return -1;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> This new interface should be called at the end of rte_kni_alloc() to notify the link
> status after a KNI interface is created.
> 
> Thanks,
> Helin
> 
> > +int
> >  rte_kni_handle_request(struct rte_kni *kni)  {
> >  	unsigned ret;
> > diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index
> > 98edd72..a1bafd9 100644
> > --- a/lib/librte_kni/rte_kni.h
> > +++ b/lib/librte_kni/rte_kni.h
> > @@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t
> > port_id,  extern int rte_kni_release(struct rte_kni *kni);
> >
> >  /**
> > + * Send link state changes to KNI interface in kernel space
> > + *
> > + * rte_kni_update_link_state is thread safe.
> > + *
> > + * @param kni
> > + *  The pointer to the context of an existent KNI interface.
> > + * @param if_up
> > + *  interface link status
> > + *
> > + * @return
> > + *  - 0 indicates success.
> > + *  - negative value indicates failure.
> > + */
> > +
> > +extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t
> > +if_up);
> > +
> > +/**
> >   * It is used to handle the request mbufs sent from kernel space.
> >   * Then analyzes it and calls the specific actions for the specific requests.
> >   * Finally constructs the response mbuf and puts it back to the resp_q.
> > --
> > 1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH] kni: Add link status update
  2015-06-15  0:57   ` Zhang, Helin
@ 2015-06-15  1:11     ` Vijayakumar Muthuvel Manickam
  2015-06-15  1:12       ` Zhang, Helin
  0 siblings, 1 reply; 11+ messages in thread
From: Vijayakumar Muthuvel Manickam @ 2015-06-15  1:11 UTC (permalink / raw)
  To: Zhang, Helin; +Cc: dev

Hi Helin,

Since Stepthen pointed out ioctl is not the best way to add this facility,
I have a patch that will enable link status update through sysfs by
implementing .ndo_change_carrier. I will submit it today.
I will submit a separate patch for transferring link speed,duplex etc.,
this week.

Thanks,
Vijay

On Sun, Jun 14, 2015 at 5:57 PM, Zhang, Helin <helin.zhang@intel.com> wrote:

> Any response for my comments? Did I miss anything?
>
> - Helin
>
> > -----Original Message-----
> > From: Zhang, Helin
> > Sent: Tuesday, May 19, 2015 8:54 AM
> > To: Vijayakumar Muthuvel Manickam; dev@dpdk.org
> > Subject: RE: [dpdk-dev] [PATCH] kni: Add link status update
> >
> > Hello
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Vijayakumar
> > > Muthuvel Manickam
> > > Sent: Tuesday, May 19, 2015 7:33 AM
> > > To: dev@dpdk.org
> > > Subject: [dpdk-dev] [PATCH] kni: Add link status update
> > >
> > > Add an ioctl command in rte_kni module to enable DPDK applications to
> > > propagate link state changes to kni virtual interfaces.
> > >
> > > Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
> > > ---
> > >  .../linuxapp/eal/include/exec-env/rte_kni_common.h |  2 ++
> > >  lib/librte_eal/linuxapp/kni/kni_misc.c             | 39
> > > ++++++++++++++++++++++
> > >  lib/librte_kni/rte_kni.c                           | 18 ++++++++++
> > >  lib/librte_kni/rte_kni.h                           | 17 ++++++++++
> > >  4 files changed, 76 insertions(+)
> > >
> > > diff --git
> > > a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > > b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > > index 1e55c2d..b68001d 100644
> > > --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > > +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > > @@ -163,6 +163,7 @@ struct rte_kni_device_info {
> > >
> > >     /* mbuf size */
> > >     unsigned mbuf_size;
> > > +   uint8_t link_state;
> > How about transfer more states from user space to kernel space, such as
> link
> > speed, duplex, etc?
> >
> > >  };
> > >
> > >  #define KNI_DEVICE "kni"
> > > @@ -170,5 +171,6 @@ struct rte_kni_device_info {
> > >  #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
> > >  #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct
> > > rte_kni_device_info)  #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct
> > > rte_kni_device_info)
> > > +#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct
> > > +rte_kni_device_info)
> > >
> > >  #endif /* _RTE_KNI_COMMON_H_ */
> > > diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > > b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > > index 1935d32..b1015cd 100644
> > > --- a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > > +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > > @@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num,
> > > unsigned long ioctl_param)  }
> > >
> > >  static int
> > > +kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long
> > > +ioctl_param) {
> > > +   int ret = -EINVAL;
> > > +   struct kni_dev *dev, *n;
> > > +   struct rte_kni_device_info dev_info;
> > > +
> > > +   if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
> > > +                   return -EINVAL;
> > > +
> > > +   ret = copy_from_user(&dev_info, (void *)ioctl_param,
> > > sizeof(dev_info));
> > > +   if (ret) {
> > > +           KNI_ERR("copy_from_user in kni_ioctl_update_link_status");
> > > +           return -EIO;
> > > +   }
> > > +
> > > +   if (strlen(dev_info.name) == 0)
> > > +           return ret;
> > > +
> > > +   down_write(&kni_list_lock);
> > > +   list_for_each_entry_safe(dev, n, &kni_list_head, list) {
> > > +           if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) !=
> > > 0)
> > > +                   continue;
> > > +
> > > +           if (dev_info.link_state == 0)
> > > +                   netif_carrier_off(dev->net_dev);
> > > +           else
> > > +                   netif_carrier_on(dev->net_dev);
> > > +           ret = 0;
> > > +           break;
> > > +   }
> > > +   up_write(&kni_list_lock);
> > > +
> > > +   return ret;
> > > +}
> > > +
> > > +static int
> > >  kni_ioctl(struct inode *inode,
> > >     unsigned int ioctl_num,
> > >     unsigned long ioctl_param)
> > > @@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode,
> > >     case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
> > >             ret = kni_ioctl_release(ioctl_num, ioctl_param);
> > >             break;
> > > +   case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE):
> > > +           ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param);
> > > +           break;
> > >     default:
> > >             KNI_DBG("IOCTL default \n");
> > >             break;
> > > diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index
> > > 4e70fa0..b6eda8a 100644
> > > --- a/lib/librte_kni/rte_kni.c
> > > +++ b/lib/librte_kni/rte_kni.c
> > > @@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni)  }
> > >
> > >  int
> > > +rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up) {
> > > +   struct rte_kni_device_info dev_info;
> > > +
> > > +   if (!kni || !kni->in_use)
> > > +           return -1;
> > > +
> > > +   snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name);
> > > +   dev_info.link_state = if_up;
> > > +   if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) {
> > > +           RTE_LOG(ERR, KNI, "Fail to update link state\n");
> > > +           return -1;
> > > +   }
> > > +
> > > +   return 0;
> > > +}
> > > +
> > This new interface should be called at the end of rte_kni_alloc() to
> notify the link
> > status after a KNI interface is created.
> >
> > Thanks,
> > Helin
> >
> > > +int
> > >  rte_kni_handle_request(struct rte_kni *kni)  {
> > >     unsigned ret;
> > > diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index
> > > 98edd72..a1bafd9 100644
> > > --- a/lib/librte_kni/rte_kni.h
> > > +++ b/lib/librte_kni/rte_kni.h
> > > @@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t
> > > port_id,  extern int rte_kni_release(struct rte_kni *kni);
> > >
> > >  /**
> > > + * Send link state changes to KNI interface in kernel space
> > > + *
> > > + * rte_kni_update_link_state is thread safe.
> > > + *
> > > + * @param kni
> > > + *  The pointer to the context of an existent KNI interface.
> > > + * @param if_up
> > > + *  interface link status
> > > + *
> > > + * @return
> > > + *  - 0 indicates success.
> > > + *  - negative value indicates failure.
> > > + */
> > > +
> > > +extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t
> > > +if_up);
> > > +
> > > +/**
> > >   * It is used to handle the request mbufs sent from kernel space.
> > >   * Then analyzes it and calls the specific actions for the specific
> requests.
> > >   * Finally constructs the response mbuf and puts it back to the
> resp_q.
> > > --
> > > 1.8.1.4
>
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH] kni: Add link status update
  2015-06-15  1:11     ` Vijayakumar Muthuvel Manickam
@ 2015-06-15  1:12       ` Zhang, Helin
  2015-06-15  8:21         ` [dpdk-dev] [PATCH v2] " Vijayakumar Muthuvel Manickam
  0 siblings, 1 reply; 11+ messages in thread
From: Zhang, Helin @ 2015-06-15  1:12 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam; +Cc: dev

That’s great. Thanks!


-          Helin

From: Vijayakumar Muthuvel Manickam [mailto:mmvijay@gmail.com]
Sent: Monday, June 15, 2015 9:11 AM
To: Zhang, Helin
Cc: thomas.monjalon@6wind.com; dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH] kni: Add link status update

Hi Helin,

Since Stepthen pointed out ioctl is not the best way to add this facility, I have a patch that will enable link status update through sysfs by implementing .ndo_change_carrier. I will submit it today.
I will submit a separate patch for transferring link speed,duplex etc., this week.

Thanks,
Vijay

On Sun, Jun 14, 2015 at 5:57 PM, Zhang, Helin <helin.zhang@intel.com<mailto:helin.zhang@intel.com>> wrote:
Any response for my comments? Did I miss anything?

- Helin

> -----Original Message-----
> From: Zhang, Helin
> Sent: Tuesday, May 19, 2015 8:54 AM
> To: Vijayakumar Muthuvel Manickam; dev@dpdk.org<mailto:dev@dpdk.org>
> Subject: RE: [dpdk-dev] [PATCH] kni: Add link status update
>
> Hello
>
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org<mailto:dev-bounces@dpdk.org>] On Behalf Of Vijayakumar
> > Muthuvel Manickam
> > Sent: Tuesday, May 19, 2015 7:33 AM
> > To: dev@dpdk.org<mailto:dev@dpdk.org>
> > Subject: [dpdk-dev] [PATCH] kni: Add link status update
> >
> > Add an ioctl command in rte_kni module to enable DPDK applications to
> > propagate link state changes to kni virtual interfaces.
> >
> > Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com<mailto:mmvijay@gmail.com>>
> > ---
> >  .../linuxapp/eal/include/exec-env/rte_kni_common.h |  2 ++
> >  lib/librte_eal/linuxapp/kni/kni_misc.c             | 39
> > ++++++++++++++++++++++
> >  lib/librte_kni/rte_kni.c                           | 18 ++++++++++
> >  lib/librte_kni/rte_kni.h                           | 17 ++++++++++
> >  4 files changed, 76 insertions(+)
> >
> > diff --git
> > a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > index 1e55c2d..b68001d 100644
> > --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
> > @@ -163,6 +163,7 @@ struct rte_kni_device_info {
> >
> >     /* mbuf size */
> >     unsigned mbuf_size;
> > +   uint8_t link_state;
> How about transfer more states from user space to kernel space, such as link
> speed, duplex, etc?
>
> >  };
> >
> >  #define KNI_DEVICE "kni"
> > @@ -170,5 +171,6 @@ struct rte_kni_device_info {
> >  #define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
> >  #define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct
> > rte_kni_device_info)  #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct
> > rte_kni_device_info)
> > +#define RTE_KNI_IOCTL_LINK_UPDATE _IOWR(0, 4, struct
> > +rte_kni_device_info)
> >
> >  #endif /* _RTE_KNI_COMMON_H_ */
> > diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > index 1935d32..b1015cd 100644
> > --- a/lib/librte_eal/linuxapp/kni/kni_misc.c
> > +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c
> > @@ -548,6 +548,42 @@ kni_ioctl_release(unsigned int ioctl_num,
> > unsigned long ioctl_param)  }
> >
> >  static int
> > +kni_ioctl_update_link_state(unsigned int ioctl_num, unsigned long
> > +ioctl_param) {
> > +   int ret = -EINVAL;
> > +   struct kni_dev *dev, *n;
> > +   struct rte_kni_device_info dev_info;
> > +
> > +   if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
> > +                   return -EINVAL;
> > +
> > +   ret = copy_from_user(&dev_info, (void *)ioctl_param,
> > sizeof(dev_info));
> > +   if (ret) {
> > +           KNI_ERR("copy_from_user in kni_ioctl_update_link_status");
> > +           return -EIO;
> > +   }
> > +
> > +   if (strlen(dev_info.name<http://dev_info.name>) == 0)
> > +           return ret;
> > +
> > +   down_write(&kni_list_lock);
> > +   list_for_each_entry_safe(dev, n, &kni_list_head, list) {
> > +           if (strncmp(dev->name, dev_info.name<http://dev_info.name>, RTE_KNI_NAMESIZE) !=
> > 0)
> > +                   continue;
> > +
> > +           if (dev_info.link_state == 0)
> > +                   netif_carrier_off(dev->net_dev);
> > +           else
> > +                   netif_carrier_on(dev->net_dev);
> > +           ret = 0;
> > +           break;
> > +   }
> > +   up_write(&kni_list_lock);
> > +
> > +   return ret;
> > +}
> > +
> > +static int
> >  kni_ioctl(struct inode *inode,
> >     unsigned int ioctl_num,
> >     unsigned long ioctl_param)
> > @@ -569,6 +605,9 @@ kni_ioctl(struct inode *inode,
> >     case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
> >             ret = kni_ioctl_release(ioctl_num, ioctl_param);
> >             break;
> > +   case _IOC_NR(RTE_KNI_IOCTL_LINK_UPDATE):
> > +           ret = kni_ioctl_update_link_state(ioctl_num, ioctl_param);
> > +           break;
> >     default:
> >             KNI_DBG("IOCTL default \n");
> >             break;
> > diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index
> > 4e70fa0..b6eda8a 100644
> > --- a/lib/librte_kni/rte_kni.c
> > +++ b/lib/librte_kni/rte_kni.c
> > @@ -512,6 +512,24 @@ rte_kni_release(struct rte_kni *kni)  }
> >
> >  int
> > +rte_kni_update_link_state(struct rte_kni *kni, uint8_t if_up) {
> > +   struct rte_kni_device_info dev_info;
> > +
> > +   if (!kni || !kni->in_use)
> > +           return -1;
> > +
> > +   snprintf(dev_info.name<http://dev_info.name>, sizeof(dev_info.name<http://dev_info.name>), "%s", kni->name);
> > +   dev_info.link_state = if_up;
> > +   if (ioctl(kni_fd, RTE_KNI_IOCTL_LINK_UPDATE, &dev_info) < 0) {
> > +           RTE_LOG(ERR, KNI, "Fail to update link state\n");
> > +           return -1;
> > +   }
> > +
> > +   return 0;
> > +}
> > +
> This new interface should be called at the end of rte_kni_alloc() to notify the link
> status after a KNI interface is created.
>
> Thanks,
> Helin
>
> > +int
> >  rte_kni_handle_request(struct rte_kni *kni)  {
> >     unsigned ret;
> > diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index
> > 98edd72..a1bafd9 100644
> > --- a/lib/librte_kni/rte_kni.h
> > +++ b/lib/librte_kni/rte_kni.h
> > @@ -167,6 +167,23 @@ extern struct rte_kni *rte_kni_create(uint8_t
> > port_id,  extern int rte_kni_release(struct rte_kni *kni);
> >
> >  /**
> > + * Send link state changes to KNI interface in kernel space
> > + *
> > + * rte_kni_update_link_state is thread safe.
> > + *
> > + * @param kni
> > + *  The pointer to the context of an existent KNI interface.
> > + * @param if_up
> > + *  interface link status
> > + *
> > + * @return
> > + *  - 0 indicates success.
> > + *  - negative value indicates failure.
> > + */
> > +
> > +extern int rte_kni_update_link_state(struct rte_kni *kni, uint8_t
> > +if_up);
> > +
> > +/**
> >   * It is used to handle the request mbufs sent from kernel space.
> >   * Then analyzes it and calls the specific actions for the specific requests.
> >   * Finally constructs the response mbuf and puts it back to the resp_q.
> > --
> > 1.8.1.4


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [dpdk-dev] [PATCH v2] kni: Add link status update
  2015-06-15  1:12       ` Zhang, Helin
@ 2015-06-15  8:21         ` Vijayakumar Muthuvel Manickam
  2015-06-15 16:09           ` Stephen Hemminger
  0 siblings, 1 reply; 11+ messages in thread
From: Vijayakumar Muthuvel Manickam @ 2015-06-15  8:21 UTC (permalink / raw)
  To: dev

Implement .ndo_change_carrier to enable
DPDK applications to propagate link state changes to
kni virtual interfaces through sysfs

Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
---
Implemented .ndo_change_carrier instead of adding a new ioctl

 lib/librte_eal/linuxapp/kni/kni_net.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c b/lib/librte_eal/linuxapp/kni/kni_net.c
index dd95db5..10c94ce 100644
--- a/lib/librte_eal/linuxapp/kni/kni_net.c
+++ b/lib/librte_eal/linuxapp/kni/kni_net.c
@@ -632,6 +632,15 @@ static int kni_net_set_mac(struct net_device *netdev, void *p)
 	return 0;
 }
 
+static int kni_net_change_carrier(struct net_device *dev, bool new_carrier)
+{
+	if (new_carrier)
+		netif_carrier_on(dev);
+	else
+		netif_carrier_off(dev);
+	return 0;
+}
+
 static const struct header_ops kni_net_header_ops = {
 	.create  = kni_net_header,
 	.rebuild = kni_net_rebuild_header,
@@ -648,6 +657,7 @@ static const struct net_device_ops kni_net_netdev_ops = {
 	.ndo_get_stats = kni_net_stats,
 	.ndo_tx_timeout = kni_net_tx_timeout,
 	.ndo_set_mac_address = kni_net_set_mac,
+	.ndo_change_carrier = kni_net_change_carrier,
 };
 
 void
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH v2] kni: Add link status update
  2015-06-15  8:21         ` [dpdk-dev] [PATCH v2] " Vijayakumar Muthuvel Manickam
@ 2015-06-15 16:09           ` Stephen Hemminger
  2015-06-16  6:39             ` [dpdk-dev] [PATCH v3] " Vijayakumar Muthuvel Manickam
  0 siblings, 1 reply; 11+ messages in thread
From: Stephen Hemminger @ 2015-06-15 16:09 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam; +Cc: dev

On Mon, 15 Jun 2015 04:21:43 -0400
Vijayakumar Muthuvel Manickam <mmvijay@gmail.com> wrote:

> Implement .ndo_change_carrier to enable
> DPDK applications to propagate link state changes to
> kni virtual interfaces through sysfs
> 
> Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
> ---
> Implemented .ndo_change_carrier instead of adding a new ioctl
> 
>  lib/librte_eal/linuxapp/kni/kni_net.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c b/lib/librte_eal/linuxapp/kni/kni_net.c
> index dd95db5..10c94ce 100644
> --- a/lib/librte_eal/linuxapp/kni/kni_net.c
> +++ b/lib/librte_eal/linuxapp/kni/kni_net.c
> @@ -632,6 +632,15 @@ static int kni_net_set_mac(struct net_device *netdev, void *p)
>  	return 0;
>  }
>  
> +static int kni_net_change_carrier(struct net_device *dev, bool new_carrier)
> +{
> +	if (new_carrier)
> +		netif_carrier_on(dev);
> +	else
> +		netif_carrier_off(dev);
> +	return 0;
> +}
> +
>  static const struct header_ops kni_net_header_ops = {
>  	.create  = kni_net_header,
>  	.rebuild = kni_net_rebuild_header,
> @@ -648,6 +657,7 @@ static const struct net_device_ops kni_net_netdev_ops = {
>  	.ndo_get_stats = kni_net_stats,
>  	.ndo_tx_timeout = kni_net_tx_timeout,
>  	.ndo_set_mac_address = kni_net_set_mac,
> +	.ndo_change_carrier = kni_net_change_carrier,
>  };
>  
>  void

Acked-by: Stephen Hemminger <stephen@networkplumber.org>

You might need to have a kernel version test?? since carrier change was
introduced in 3.9 kernel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [dpdk-dev] [PATCH v3] kni: Add link status update
  2015-06-15 16:09           ` Stephen Hemminger
@ 2015-06-16  6:39             ` Vijayakumar Muthuvel Manickam
  2015-06-16  7:33               ` Zhang, Helin
  0 siblings, 1 reply; 11+ messages in thread
From: Vijayakumar Muthuvel Manickam @ 2015-06-16  6:39 UTC (permalink / raw)
  To: dev

Implement .ndo_change_carrier to enable
DPDK applications to propagate link state changes to
kni virtual interfaces through sysfs

Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
---
Added kernel version check as .ndo_change_carrier is available only in kernel 
versions 3.9 and after

 lib/librte_eal/linuxapp/kni/kni_net.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c b/lib/librte_eal/linuxapp/kni/kni_net.c
index dd95db5..9f9022b 100644
--- a/lib/librte_eal/linuxapp/kni/kni_net.c
+++ b/lib/librte_eal/linuxapp/kni/kni_net.c
@@ -632,6 +632,17 @@ static int kni_net_set_mac(struct net_device *netdev, void *p)
 	return 0;
 }
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
+static int kni_net_change_carrier(struct net_device *dev, bool new_carrier)
+{
+	if (new_carrier)
+		netif_carrier_on(dev);
+	else
+		netif_carrier_off(dev);
+	return 0;
+}
+#endif
+
 static const struct header_ops kni_net_header_ops = {
 	.create  = kni_net_header,
 	.rebuild = kni_net_rebuild_header,
@@ -648,6 +659,9 @@ static const struct net_device_ops kni_net_netdev_ops = {
 	.ndo_get_stats = kni_net_stats,
 	.ndo_tx_timeout = kni_net_tx_timeout,
 	.ndo_set_mac_address = kni_net_set_mac,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
+	.ndo_change_carrier = kni_net_change_carrier,
+#endif
 };
 
 void
-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH v3] kni: Add link status update
  2015-06-16  6:39             ` [dpdk-dev] [PATCH v3] " Vijayakumar Muthuvel Manickam
@ 2015-06-16  7:33               ` Zhang, Helin
  2015-06-16 14:29                 ` Thomas Monjalon
  0 siblings, 1 reply; 11+ messages in thread
From: Zhang, Helin @ 2015-06-16  7:33 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam, Thomas Monjalon; +Cc: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Vijayakumar Muthuvel
> Manickam
> Sent: Tuesday, June 16, 2015 2:40 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3] kni: Add link status update
> 
> Implement .ndo_change_carrier to enable
> DPDK applications to propagate link state changes to kni virtual interfaces
> through sysfs
> 
> Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>

> ---
> Added kernel version check as .ndo_change_carrier is available only in kernel
> versions 3.9 and after
> 
>  lib/librte_eal/linuxapp/kni/kni_net.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c
> b/lib/librte_eal/linuxapp/kni/kni_net.c
> index dd95db5..9f9022b 100644
> --- a/lib/librte_eal/linuxapp/kni/kni_net.c
> +++ b/lib/librte_eal/linuxapp/kni/kni_net.c
> @@ -632,6 +632,17 @@ static int kni_net_set_mac(struct net_device *netdev,
> void *p)
>  	return 0;
>  }
> 
> +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) static int
> +kni_net_change_carrier(struct net_device *dev, bool new_carrier) {
> +	if (new_carrier)
> +		netif_carrier_on(dev);
> +	else
> +		netif_carrier_off(dev);
> +	return 0;
> +}
> +#endif
> +
>  static const struct header_ops kni_net_header_ops = {
>  	.create  = kni_net_header,
>  	.rebuild = kni_net_rebuild_header,
> @@ -648,6 +659,9 @@ static const struct net_device_ops kni_net_netdev_ops =
> {
>  	.ndo_get_stats = kni_net_stats,
>  	.ndo_tx_timeout = kni_net_tx_timeout,
>  	.ndo_set_mac_address = kni_net_set_mac,
> +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
> +	.ndo_change_carrier = kni_net_change_carrier, #endif
>  };
> 
>  void
> --
> 1.8.1.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [dpdk-dev] [PATCH v3] kni: Add link status update
  2015-06-16  7:33               ` Zhang, Helin
@ 2015-06-16 14:29                 ` Thomas Monjalon
  0 siblings, 0 replies; 11+ messages in thread
From: Thomas Monjalon @ 2015-06-16 14:29 UTC (permalink / raw)
  To: Vijayakumar Muthuvel Manickam; +Cc: dev

> > Implement .ndo_change_carrier to enable
> > DPDK applications to propagate link state changes to kni virtual interfaces
> > through sysfs
> > 
> > Signed-off-by: Vijayakumar Muthuvel Manickam <mmvijay@gmail.com>
> Acked-by: Helin Zhang <helin.zhang@intel.com>

Applied, thanks

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-06-16 14:30 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-18 23:33 [dpdk-dev] [PATCH] kni: Add link status update Vijayakumar Muthuvel Manickam
2015-05-19  0:54 ` Zhang, Helin
2015-06-15  0:57   ` Zhang, Helin
2015-06-15  1:11     ` Vijayakumar Muthuvel Manickam
2015-06-15  1:12       ` Zhang, Helin
2015-06-15  8:21         ` [dpdk-dev] [PATCH v2] " Vijayakumar Muthuvel Manickam
2015-06-15 16:09           ` Stephen Hemminger
2015-06-16  6:39             ` [dpdk-dev] [PATCH v3] " Vijayakumar Muthuvel Manickam
2015-06-16  7:33               ` Zhang, Helin
2015-06-16 14:29                 ` Thomas Monjalon
2015-05-19  3:11 ` [dpdk-dev] [PATCH] " Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).