lxip: dhcp update on link state change

This commit is contained in:
Sebastian Sumpf 2017-02-08 14:33:00 +01:00 committed by Norman Feske
parent a1453d83ff
commit b8b34efef9
3 changed files with 30 additions and 1 deletions

View File

@ -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_ */

View File

@ -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;
}

View File

@ -38,9 +38,19 @@ class Nic_client
Genode::Signal_handler<Nic_client> _sink_ack;
Genode::Signal_handler<Nic_client> _sink_submit;
Genode::Signal_handler<Nic_client> _source_ack;
Genode::Signal_handler<Nic_client> _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 */
}