mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 23:28:29 +00:00
lxip: dhcp update on link state change
This commit is contained in:
committed by
Norman Feske
parent
a1453d83ff
commit
b8b34efef9
@ -48,4 +48,6 @@ extern "C" void lxip_configure_static(char const *addr,
|
|||||||
char const *nameserver);
|
char const *nameserver);
|
||||||
extern "C" void lxip_configure_dhcp();
|
extern "C" void lxip_configure_dhcp();
|
||||||
|
|
||||||
|
extern "C" bool lxip_do_dhcp();
|
||||||
|
|
||||||
#endif /* _LX_H_ */
|
#endif /* _LX_H_ */
|
||||||
|
@ -509,7 +509,6 @@ void lxip_init()
|
|||||||
/*
|
/*
|
||||||
* Network configuration
|
* Network configuration
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void lxip_configure(char const *address_config)
|
static void lxip_configure(char const *address_config)
|
||||||
{
|
{
|
||||||
__ip_auto_config_setup((char *)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,
|
void lxip_configure_static(char const *addr, char const *netmask,
|
||||||
char const *gateway, char const *nameserver)
|
char const *gateway, char const *nameserver)
|
||||||
{
|
{
|
||||||
char address_config[128];
|
char address_config[128];
|
||||||
|
|
||||||
|
dhcp_configured = false;
|
||||||
|
|
||||||
snprintf(address_config, sizeof(address_config),
|
snprintf(address_config, sizeof(address_config),
|
||||||
"%s::%s:%s:::off:%s",
|
"%s::%s:%s:::off:%s",
|
||||||
addr, gateway, netmask, nameserver);
|
addr, gateway, netmask, nameserver);
|
||||||
@ -530,7 +535,17 @@ void lxip_configure_static(char const *addr, char const *netmask,
|
|||||||
|
|
||||||
void lxip_configure_dhcp()
|
void lxip_configure_dhcp()
|
||||||
{
|
{
|
||||||
|
dhcp_configured = true;
|
||||||
|
dhcp_pending = true;
|
||||||
|
|
||||||
lxip_configure("dhcp");
|
lxip_configure("dhcp");
|
||||||
|
dhcp_pending = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool lxip_do_dhcp()
|
||||||
|
{
|
||||||
|
return dhcp_configured && !dhcp_pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,9 +38,19 @@ class Nic_client
|
|||||||
Genode::Signal_handler<Nic_client> _sink_ack;
|
Genode::Signal_handler<Nic_client> _sink_ack;
|
||||||
Genode::Signal_handler<Nic_client> _sink_submit;
|
Genode::Signal_handler<Nic_client> _sink_submit;
|
||||||
Genode::Signal_handler<Nic_client> _source_ack;
|
Genode::Signal_handler<Nic_client> _source_ack;
|
||||||
|
Genode::Signal_handler<Nic_client> _link_state_change;
|
||||||
|
|
||||||
void (*_tick)();
|
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
|
* submit queue not empty anymore
|
||||||
*/
|
*/
|
||||||
@ -98,11 +108,13 @@ class Nic_client
|
|||||||
_sink_ack(ep, *this, &Nic_client::_packet_avail),
|
_sink_ack(ep, *this, &Nic_client::_packet_avail),
|
||||||
_sink_submit(ep, *this, &Nic_client::_ready_to_ack),
|
_sink_submit(ep, *this, &Nic_client::_ready_to_ack),
|
||||||
_source_ack(ep, *this, &Nic_client::_ack_avail),
|
_source_ack(ep, *this, &Nic_client::_ack_avail),
|
||||||
|
_link_state_change(ep, *this, &Nic_client::_link_state),
|
||||||
_tick(ticker)
|
_tick(ticker)
|
||||||
{
|
{
|
||||||
_nic.rx_channel()->sigh_ready_to_ack(_sink_ack);
|
_nic.rx_channel()->sigh_ready_to_ack(_sink_ack);
|
||||||
_nic.rx_channel()->sigh_packet_avail(_sink_submit);
|
_nic.rx_channel()->sigh_packet_avail(_sink_submit);
|
||||||
_nic.tx_channel()->sigh_ack_avail(_source_ack);
|
_nic.tx_channel()->sigh_ack_avail(_source_ack);
|
||||||
|
_nic.link_state_sigh(_link_state_change);
|
||||||
/* ready_to_submit not handled */
|
/* ready_to_submit not handled */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user