Thread (24 messages) 24 messages, 6 authors, 2015-10-29

RE: [PATCH net-next] hyperv: Add handler for RNDIS_STATUS_NETWORK_CHANGE event

From: Haiyang Zhang <haiyangz@microsoft.com>
Date: 2014-06-20 15:49:25
Also in: lkml

-----Original Message-----
From: Dan Carpenter [mailto:dan.carpenter@oracle.com]
Sent: Friday, June 20, 2014 4:42 AM
To: Haiyang Zhang
Cc: davem@davemloft.net; netdev@vger.kernel.org; olaf@aepfle.de;
jasowang@redhat.com; driverdev-devel@linuxdriverproject.org; linux-
kernel@vger.kernel.org
Subject: Re: [PATCH net-next] hyperv: Add handler for
RNDIS_STATUS_NETWORK_CHANGE event

On Thu, Jun 19, 2014 at 06:34:36PM -0700, Haiyang Zhang wrote:
quoted
@@ -589,7 +590,19 @@ void netvsc_linkstatus_callback(struct hv_device
*device_obj,
quoted
 	net_device = hv_get_drvdata(device_obj);
 	rdev = net_device->extension;

-	rdev->link_state = status != 1;
+	switch (indicate->status) {
+	case RNDIS_STATUS_MEDIA_CONNECT:
+		rdev->link_state = false;
link_state false means that we want to connect?
Yes
quoted
+		break;
+	case RNDIS_STATUS_MEDIA_DISCONNECT:
+		rdev->link_state = true;
link_state true means that we are disconnecting.
Yes.
quoted
@@ -782,10 +797,17 @@ static void netvsc_link_change(struct
work_struct *w)
quoted
 	} else {
 		netif_carrier_on(net);
 		notify = true;
+		if (rdev->link_change) {
+			rdev->link_change = false;
+			refresh = true;
+		}
How do we know that we received a RNDIS_STATUS_MEDIA_CONNECT before we
received the RNDIS_STATUS_NETWORK_CHANGE?  In other words, why does
RNDIS_STATUS_NETWORK_CHANGE imply that the link_state is false?
After host sleep, both RNDIS_STATUS_MEDIA_CONNECT and 
RNDIS_STATUS_NETWORK_CHANGE events are received, but not necessarily in
this order. If RNDIS_STATUS_MEDIA_CONNECT arrives later, the flag saved
in rdev->link_change previously will trigger the refresh, not in the
RNDIS_STATUS_NETWORK_CHANGE event, but in the latter RNDIS_STATUS_MEDIA_CONNECT
event.
quoted
 	}

 	rtnl_unlock();

+	if (refresh)
+		call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
You may as well use UMH_NO_WAIT since there is no error handling if
/etc/init.d/network is not found.
I previously tried UMH_NO_WAIT, but not working. We need to wait for the 
exec (not process completion) in this case. Since it's in the work queue,
a bit of waiting is OK.

Thanks,
- Haiyang
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help