From 5d4d5313c7abf91e4ed6ad564d32e149e9b2e5ed Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Sun, 1 Apr 2007 22:05:35 +0000 Subject: [PATCH] DHCP: explicitly request the gateway address and domain name servers to the DHCP server. This fixes an issue some people reported regarding obtaining such information. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20505 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/net/DHCPClient.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/servers/net/DHCPClient.cpp b/src/servers/net/DHCPClient.cpp index e984fa7105..8ff52ea802 100644 --- a/src/servers/net/DHCPClient.cpp +++ b/src/servers/net/DHCPClient.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2007, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -76,6 +76,18 @@ enum message_type { DHCP_INFORM }; +enum parameter_type { + PARAMETER_SUBNET_MASK = 1, + PARAMETER_TIME_OFFSET = 2, + PARAMETER_ROUTER = 3, + PARAMETER_NAME_SERVER = 6, + PARAMETER_HOST_NAME = 12, + PARAMETER_DOMAIN_NAME = 15, + PARAMETER_BROADCAST_ADDRESS = 28, + PARAMETER_NETBIOS_NAME_SERVER = 44, + PARAMETER_NETBIOS_SCOPE = 47, +}; + struct dhcp_option_cookie { dhcp_option_cookie() : state(0), file_has_options(false), server_name_has_options(false) {} @@ -118,7 +130,7 @@ struct dhcp_message { uint8* PutOption(uint8* options, message_option option, uint8 data); uint8* PutOption(uint8* options, message_option option, uint16 data); uint8* PutOption(uint8* options, message_option option, uint32 data); - uint8* PutOption(uint8* options, message_option option, uint8* data, uint32 size); + uint8* PutOption(uint8* options, message_option option, const uint8* data, uint32 size); } _PACKED; #define DHCP_FLAG_BROADCAST 0x8000 @@ -127,6 +139,11 @@ struct dhcp_message { const uint32 kMsgLeaseTime = 'lstm'; +static const uint8 kRequiredParameters[] = { + PARAMETER_SUBNET_MASK, PARAMETER_ROUTER, + PARAMETER_NAME_SERVER, PARAMETER_BROADCAST_ADDRESS +}; + dhcp_message::dhcp_message(message_type type) { @@ -280,7 +297,7 @@ dhcp_message::PutOption(uint8* options, message_option option, uint32 data) uint8* -dhcp_message::PutOption(uint8* options, message_option option, uint8* data, uint32 size) +dhcp_message::PutOption(uint8* options, message_option option, const uint8* data, uint32 size) { options[0] = option; options[1] = size; @@ -645,9 +662,11 @@ DHCPClient::_PrepareMessage(dhcp_message& message, dhcp_state state) // In RENEWAL or REBINDING state, we must set the client_address field, and not // use OPTION_REQUEST_IP_ADDRESS for DHCP_REQUEST messages - if (type == DHCP_REQUEST && (state == INIT || state == REQUESTING)) + if (type == DHCP_REQUEST && (state == INIT || state == REQUESTING)) { next = message.PutOption(next, OPTION_REQUEST_IP_ADDRESS, fAssignedAddress); - else + next = message.PutOption(next, OPTION_REQUEST_PARAMETERS, + kRequiredParameters, sizeof(kRequiredParameters)); + } else message.client_address = fAssignedAddress; next = message.PutOption(next, OPTION_END);