commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd] 15/21: Make pfinet re-open ethernet device on transmission error


From: Samuel Thibault
Subject: [hurd] 15/21: Make pfinet re-open ethernet device on transmission error
Date: Tue, 04 Feb 2014 17:25:28 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit 613f84a0fcd46f2143b046b57c6c6444eafa4d4d
Author: Samuel Thibault <address@hidden>
Date:   Tue Jan 28 23:42:06 2014 +0100

    Make pfinet re-open ethernet device on transmission error
    
    * pfinet/ethernet.c (ethernet_close): New function.
    (ethernet_xmit): On EMACH_SEND_INVALID_DEST error, call ethernet_close
    and ethernet_open again to re-open ethernet device.
---
 pfinet/ethernet.c | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c
index 768d528..74c1a08 100644
--- a/pfinet/ethernet.c
+++ b/pfinet/ethernet.c
@@ -233,6 +233,18 @@ ethernet_open (struct device *dev)
   return 0;
 }
 
+int
+ethernet_close (struct device *dev)
+{
+  struct ether_device *edev = (struct ether_device *) dev->priv;
+
+  mach_port_deallocate (mach_task_self (), edev->readptname);
+  edev->readptname = MACH_PORT_NULL;
+  ports_destroy_right (edev->readpt);
+  edev->readpt = NULL;
+  device_close (edev->ether_port);
+  edev->ether_port = MACH_PORT_NULL;
+}
 
 /* Transmit an ethernet frame */
 int
@@ -241,10 +253,31 @@ ethernet_xmit (struct sk_buff *skb, struct device *dev)
   error_t err;
   struct ether_device *edev = (struct ether_device *) dev->priv;
   u_int count;
+  u_int tried = 0;
+
+  do
+    {
+      tried++;
+      err = device_write (edev->ether_port, D_NOWAIT, 0, skb->data, skb->len, 
&count);
+      if (err == EMACH_SEND_INVALID_DEST)
+       {
+         /* Device probably just died, try to reopen it.  */
+
+         if (tried == 2)
+           /* Too many tries, abort */
+           break;
+
+         ethernet_close (dev);
+         ethernet_open (dev);
+       }
+      else
+       {
+         assert_perror (err);
+         assert (count == skb->len);
+       }
+    }
+  while (err);
 
-  err = device_write (edev->ether_port, D_NOWAIT, 0, skb->data, skb->len, 
&count);
-  assert_perror (err);
-  assert (count == skb->len);
   dev_kfree_skb (skb);
   return 0;
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]