From b8b34efef98025c936a7f6e62b6612f45ca1e7e4 Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Wed, 8 Feb 2017 14:33:00 +0100 Subject: [PATCH] lxip: dhcp update on link state change --- repos/dde_linux/src/lib/lxip/lx.h | 2 ++ repos/dde_linux/src/lib/lxip/lxc_emul.c | 17 ++++++++++++++++- repos/dde_linux/src/lib/lxip/nic_handler.cc | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/repos/dde_linux/src/lib/lxip/lx.h b/repos/dde_linux/src/lib/lxip/lx.h index b6de858732..85b26a67ae 100644 --- a/repos/dde_linux/src/lib/lxip/lx.h +++ b/repos/dde_linux/src/lib/lxip/lx.h @@ -48,4 +48,6 @@ extern "C" void lxip_configure_static(char const *addr, char const *nameserver); extern "C" void lxip_configure_dhcp(); +extern "C" bool lxip_do_dhcp(); + #endif /* _LX_H_ */ diff --git a/repos/dde_linux/src/lib/lxip/lxc_emul.c b/repos/dde_linux/src/lib/lxip/lxc_emul.c index ee1d417186..f66440fe83 100644 --- a/repos/dde_linux/src/lib/lxip/lxc_emul.c +++ b/repos/dde_linux/src/lib/lxip/lxc_emul.c @@ -509,7 +509,6 @@ void lxip_init() /* * Network configuration */ - static void lxip_configure(char const *address_config) { __ip_auto_config_setup((char *)address_config); @@ -517,10 +516,16 @@ static void lxip_configure(char const *address_config) } +static bool dhcp_configured = false; +static bool dhcp_pending = false; + void lxip_configure_static(char const *addr, char const *netmask, char const *gateway, char const *nameserver) { char address_config[128]; + + dhcp_configured = false; + snprintf(address_config, sizeof(address_config), "%s::%s:%s:::off:%s", addr, gateway, netmask, nameserver); @@ -530,7 +535,17 @@ void lxip_configure_static(char const *addr, char const *netmask, void lxip_configure_dhcp() { + dhcp_configured = true; + dhcp_pending = true; + lxip_configure("dhcp"); + dhcp_pending = false; +} + + +bool lxip_do_dhcp() +{ + return dhcp_configured && !dhcp_pending; } diff --git a/repos/dde_linux/src/lib/lxip/nic_handler.cc b/repos/dde_linux/src/lib/lxip/nic_handler.cc index 9e6e51c476..d2548a351b 100644 --- a/repos/dde_linux/src/lib/lxip/nic_handler.cc +++ b/repos/dde_linux/src/lib/lxip/nic_handler.cc @@ -38,9 +38,19 @@ class Nic_client Genode::Signal_handler _sink_ack; Genode::Signal_handler _sink_submit; Genode::Signal_handler _source_ack; + Genode::Signal_handler _link_state_change; void (*_tick)(); + void _link_state() + { + if (_nic.link_state() == false || lxip_do_dhcp() == false) + return; + + /* reconnect dhcp client */ + lxip_configure_dhcp(); + } + /** * submit queue not empty anymore */ @@ -98,11 +108,13 @@ class Nic_client _sink_ack(ep, *this, &Nic_client::_packet_avail), _sink_submit(ep, *this, &Nic_client::_ready_to_ack), _source_ack(ep, *this, &Nic_client::_ack_avail), + _link_state_change(ep, *this, &Nic_client::_link_state), _tick(ticker) { _nic.rx_channel()->sigh_ready_to_ack(_sink_ack); _nic.rx_channel()->sigh_packet_avail(_sink_submit); _nic.tx_channel()->sigh_ack_avail(_source_ack); + _nic.link_state_sigh(_link_state_change); /* ready_to_submit not handled */ }