DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/2] net/tap: improve link_update
@ 2017-03-22  8:40 Pascal Mazon
  2017-03-22  8:40 ` [dpdk-dev] [PATCH 2/2] net/tap: add link status notification Pascal Mazon
  2017-03-22 14:11 ` [dpdk-dev] [PATCH 1/2] net/tap: improve link_update Wiles, Keith
  0 siblings, 2 replies; 8+ messages in thread
From: Pascal Mazon @ 2017-03-22  8:40 UTC (permalink / raw)
  To: keith.wiles; +Cc: dev, Pascal Mazon

Reflect device link status according to the state of the tap netdevice
and the remote netdevice (if any). If both are UP and RUNNING, then the
device link status is set to ETH_LINK_UP, otherwise ETH_LINK_DOWN.

Signed-off-by: Pascal Mazon <pascal.mazon@6wind.com>
---
 drivers/net/tap/rte_eth_tap.c | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index 1570aef297a0..54122fd13c66 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -443,6 +443,14 @@ tap_ioctl(struct pmd_internals *pmd, unsigned long request,
 	 * If there is a remote netdevice, apply ioctl on it, then apply it on
 	 * the tap netdevice.
 	 */
+	if (request == SIOCGIFFLAGS && !set) {
+		/*
+		 * Special case for getting flags. If set is given,
+		 * then return the flags from the remote netdevice only.
+		 * Otherwise return the flags from the tap netdevice.
+		 */
+		remote = 0;
+	}
 apply:
 	if (remote)
 		snprintf(ifr->ifr_name, IFNAMSIZ, "%s", pmd->remote_iface);
@@ -458,6 +466,10 @@ tap_ioctl(struct pmd_internals *pmd, unsigned long request,
 		else
 			ifr->ifr_flags &= ~req_flags;
 		break;
+	case SIOCGIFFLAGS:
+		if (remote && set)
+			remote = 0; /* don't loop */
+		break;
 	case SIOCGIFHWADDR:
 		/* Set remote MAC on the tap netdevice */
 		if (!remote && pmd->remote_if_index) {
@@ -674,9 +686,25 @@ tap_tx_queue_release(void *queue)
 }
 
 static int
-tap_link_update(struct rte_eth_dev *dev __rte_unused,
-		int wait_to_complete __rte_unused)
+tap_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
 {
+	struct rte_eth_link *dev_link = &dev->data->dev_link;
+	struct pmd_internals *pmd = dev->data->dev_private;
+	struct ifreq ifr = { .ifr_flags = 0 };
+
+	if (pmd->remote_if_index) {
+		tap_ioctl(pmd, SIOCGIFFLAGS, &ifr, 1);
+		if (!(ifr.ifr_flags & IFF_UP) ||
+		    !(ifr.ifr_flags & IFF_RUNNING)) {
+			dev_link->link_status = ETH_LINK_DOWN;
+			return 0;
+		}
+	}
+	tap_ioctl(pmd, SIOCGIFFLAGS, &ifr, 0);
+	dev_link->link_status =
+		((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING) ?
+		 ETH_LINK_UP :
+		 ETH_LINK_DOWN);
 	return 0;
 }
 
-- 
2.12.0.306.g4a9b9b3

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

end of thread, other threads:[~2017-03-27 11:35 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-22  8:40 [dpdk-dev] [PATCH 1/2] net/tap: improve link_update Pascal Mazon
2017-03-22  8:40 ` [dpdk-dev] [PATCH 2/2] net/tap: add link status notification Pascal Mazon
2017-03-22 14:10   ` Wiles, Keith
2017-03-22 14:11 ` [dpdk-dev] [PATCH 1/2] net/tap: improve link_update Wiles, Keith
2017-03-24 16:02   ` Ferruh Yigit
2017-03-27  9:45     ` Pascal Mazon
2017-03-27 11:21       ` Ferruh Yigit
2017-03-27 11:34         ` Pascal Mazon

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).