From 136b23cb5e302983bea8c4d643a342bf25f5a27e Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Sun, 27 May 2018 23:18:47 +0200 Subject: [PATCH] ipxe nic_drv: do not leak packets on link down/up On link down toggle the netdev off/on to drain the TX DMA. As long as the link stays down, do not write packets to TX DMA. --- repos/dde_ipxe/src/drivers/nic/main.cc | 6 ++++-- repos/dde_ipxe/src/lib/dde_ipxe/nic.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/repos/dde_ipxe/src/drivers/nic/main.cc b/repos/dde_ipxe/src/drivers/nic/main.cc index fbe270fd9e..fc2e494e3a 100644 --- a/repos/dde_ipxe/src/drivers/nic/main.cc +++ b/repos/dde_ipxe/src/drivers/nic/main.cc @@ -65,8 +65,10 @@ class Ipxe_session_component : public Nic::Session_component return true; } - if (dde_ipxe_nic_tx(1, _tx.sink()->packet_content(packet), packet.size())) - Genode::warning("Sending packet failed!"); + if (link_state()) { + if (dde_ipxe_nic_tx(1, _tx.sink()->packet_content(packet), packet.size())) + Genode::warning("Sending packet failed!"); + } _tx.sink()->acknowledge_packet(packet); return true; diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c index 698d50cbf2..8e8a230b6d 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c +++ b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c @@ -199,10 +199,20 @@ static void irq_handler(void *p) dde_lock_leave(); - if (link_ok != netdev_link_ok(net_dev)) + int const new_link_ok = netdev_link_ok(net_dev); + if (link_ok != new_link_ok) { + /* report link-state changes */ if (link_callback) link_callback(); + + /* on link down, drain TX DMA to not leak packets on next link up */ + if (!new_link_ok) { + netdev_close(net_dev); + netdev_open(net_dev); + netdev_irq(net_dev, 1); + } + } }