db9d4d3a3c
If the attribute 'interface' is not set in a 'domain' tag, the router tries to dynamically receive and maintain an IP configuration for that domain by using DHCP in the client role at all interfaces that connect to the domain. In the DHCP discover phase, the router simply chooses the first DHCP offer that arrives. So, no comparison of different DHCP offers is done. In the DHCP request phase, the server is expected to provide an IP address, a gateway, a subnet mask, and an IP lease time to the router. If anything substantial goes wrong during a DHCP exchange, the router discards the outcome of the exchange and goes back to the DHCP discover phase. At any time where there is no valid IP configuration present at a domain, the domain does only act as DHCP client and all other router functionality is disabled for the domain. A domain cannot act as DHCP client and DHCP server at once. So, a 'domain' tag must either have an 'interface' attribute or must not contain a 'dhcp-server' tag. Ref #2534
75 lines
1.6 KiB
C++
75 lines
1.6 KiB
C++
/*
|
|
* \brief DHCP client state model
|
|
* \author Martin Stein
|
|
* \date 2016-08-24
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2016-2017 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU Affero General Public License version 3.
|
|
*/
|
|
|
|
#ifndef _DHCP_CLIENT_H_
|
|
#define _DHCP_CLIENT_H_
|
|
|
|
/* Genode includes */
|
|
#include <timer_session/connection.h>
|
|
#include <net/dhcp.h>
|
|
|
|
namespace Net {
|
|
|
|
class Domain;
|
|
class Configuration;
|
|
class Interface;
|
|
class Ethernet_frame;
|
|
class Dhcp_client;
|
|
}
|
|
|
|
class Net::Dhcp_client
|
|
{
|
|
private:
|
|
|
|
enum class State
|
|
{
|
|
INIT = 0, SELECT = 1, REQUEST = 2, BOUND = 3, RENEW = 4, REBIND = 5
|
|
};
|
|
|
|
Genode::Allocator &_alloc;
|
|
Interface &_interface;
|
|
State _state { State::INIT };
|
|
Timer::One_shot_timeout<Dhcp_client> _timeout;
|
|
unsigned long _lease_time_sec;
|
|
|
|
void _handle_dhcp_reply(Dhcp_packet &dhcp);
|
|
|
|
void _handle_timeout(Genode::Duration);
|
|
|
|
void _rerequest(State next_state);
|
|
|
|
Genode::Microseconds _rerequest_timeout(unsigned lease_time_div_log2);
|
|
|
|
void _set_state(State state, Genode::Microseconds timeout);
|
|
|
|
void _send(Dhcp_packet::Message_type msg_type,
|
|
Ipv4_address client_ip,
|
|
Ipv4_address server_ip);
|
|
|
|
Configuration &_config();
|
|
|
|
Domain &_domain();
|
|
|
|
public:
|
|
|
|
Dhcp_client(Genode::Allocator &alloc,
|
|
Timer::Connection &timer,
|
|
Interface &interface);
|
|
|
|
void handle_ip(Ethernet_frame ð, Genode::size_t eth_size);
|
|
|
|
void discover();
|
|
};
|
|
|
|
#endif /* _DHCP_CLIENT_H_ */
|