[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
- [hurd] branch upstream updated (5aa7b58 -> 5f34e6b), Samuel Thibault, 2014/02/04
- [hurd] 06/21: libtrivfs: include the mig-generated server headers in demuxer.c, Samuel Thibault, 2014/02/04
- [hurd] 12/21: utils: include the mig-generated server headers in fakeauth.c, Samuel Thibault, 2014/02/04
- [hurd] 05/21: libnetfs: include the mig-generated server headers in demuxer.c, Samuel Thibault, 2014/02/04
- [hurd] 16/21: Merge branch 'master' of git.savannah.gnu.org:/srv/git/hurd/hurd, Samuel Thibault, 2014/02/04
- [hurd] 15/21: Make pfinet re-open ethernet device on transmission error,
Samuel Thibault <=
- [hurd] 13/21: proc: fix the receiver lookup in S_proc_exception_raise, Samuel Thibault, 2014/02/04
- [hurd] 21/21: Merge remote-tracking branch 'upstream/master' into upstream, Samuel Thibault, 2014/02/04
- [hurd] 04/21: libdiskfs: include the mig-generated server headers in demuxer.c, Samuel Thibault, 2014/02/04
- [hurd] 17/21: Also re-open Ethernet device on EMIG_SERVER_DIED, Samuel Thibault, 2014/02/04
- [hurd] 08/21: proc: include the mig-generated server headers in main.c, Samuel Thibault, 2014/02/04
- [hurd] 19/21: Fix crash on fsysopts when pfinet has no IPv6, Samuel Thibault, 2014/02/04
- [hurd] 09/21: pfinet: include the mig-generated server headers in main.c, Samuel Thibault, 2014/02/04
- [hurd] 03/21: trans: fix the receiver lookup in password, Samuel Thibault, 2014/02/04
- [hurd] 10/21: pflocal: include the mig-generated server headers, Samuel Thibault, 2014/02/04
- [hurd] 07/21: exec: include the mig-generated server headers in main.c, Samuel Thibault, 2014/02/04