From fa59dc0a5b840b4b0239c658f4c174b7d630d33f Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 6 Apr 2018 17:34:01 +0200 Subject: [PATCH] nic_router: use DHCP parameter request list Send a list of the expected options with the DHCP DISCOVER and REQUEST when acting as DHCP client. Fixes #2738 --- repos/os/src/server/nic_router/dhcp_client.cc | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/repos/os/src/server/nic_router/dhcp_client.cc b/repos/os/src/server/nic_router/dhcp_client.cc index b606bb3aeb..8a6c020365 100644 --- a/repos/os/src/server/nic_router/dhcp_client.cc +++ b/repos/os/src/server/nic_router/dhcp_client.cc @@ -18,12 +18,37 @@ #include #include +enum { PKT_SIZE = 1024 }; + using namespace Genode; using namespace Net; using Message_type = Dhcp_packet::Message_type; using Drop_packet_inform = Net::Interface::Drop_packet_inform; +using Size_guard = Size_guard_tpl; +using Dhcp_options = Dhcp_packet::Options_aggregator; +/*************** + ** Utilities ** + ***************/ + +void append_param_req_list(Dhcp_options &dhcp_opts) +{ + dhcp_opts.append_param_req_list([&] (Dhcp_options::Parameter_request_list_data &data) { + data.append_param_req(); + data.append_param_req(); + data.append_param_req(); + data.append_param_req(); + data.append_param_req(); + data.append_param_req(); + }); +} + + +/***************** + ** Dhcp_client ** + *****************/ + Configuration &Dhcp_client::_config() { return _domain().config(); }; @@ -175,8 +200,6 @@ void Dhcp_client::_send(Message_type msg_type, Ipv4_address server_ip, Ipv4_address requested_ip) { - enum { PKT_SIZE = 1024 }; - using Size_guard = Size_guard_tpl; Mac_address client_mac = _interface.router_mac(); _interface.send(PKT_SIZE, [&] (void *pkt_base) { @@ -233,17 +256,17 @@ void Dhcp_client::_send(Message_type msg_type, dhcp.default_magic_cookie(); /* append DHCP option fields to the request */ - Dhcp_packet::Options_aggregator - dhcp_opts(dhcp, size); + Dhcp_options dhcp_opts(dhcp, size); dhcp_opts.append_option(msg_type); - switch (msg_type) { case Message_type::DISCOVER: + append_param_req_list(dhcp_opts); dhcp_opts.append_option(client_mac); dhcp_opts.append_option(PKT_SIZE - dhcp_off); break; case Message_type::REQUEST: + append_param_req_list(dhcp_opts); dhcp_opts.append_option(client_mac); dhcp_opts.append_option(PKT_SIZE - dhcp_off); if (_state == State::REQUEST) {