During init phase some DHCP servers may send suggested hostname as part of DHCPOFFER reply message. Right now OSv ignores suggested hostname and always sends back osv.local. This patch slightly changes this logic to make OSv return back suggested hostname if present as part of the DHCPREQUEST message.
Fixes #866 Signed-off-by: Waldemar Kozaczuk <[email protected]> --- core/dhcp.cc | 34 +++++++++++++++++++++++++++------- include/osv/dhcp.hh | 3 ++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/dhcp.cc b/core/dhcp.cc index 5d3ec9a..5cbfeea 100644 --- a/core/dhcp.cc +++ b/core/dhcp.cc @@ -221,7 +221,8 @@ namespace dhcp { u32 xid, ip::address_v4 yip, ip::address_v4 sip, - dhcp_request_packet_type request_packet_type) + dhcp_request_packet_type request_packet_type, + std::string hostname) { size_t dhcp_len = sizeof(struct dhcp_packet); struct dhcp_packet* pkt = pdhcp(); @@ -256,10 +257,10 @@ namespace dhcp { if(request_packet_type == DHCP_REQUEST_SELECTING) { options = add_option(options, DHCP_OPTION_DHCP_SERVER, 4, (u8*)&dhcp_server_ip); } - char hostname[256]; - if (0 == gethostname(hostname, sizeof(hostname))) { - options = add_option(options, DHCP_OPTION_HOSTNAME, strlen(hostname), (u8*)hostname); + if (hostname.length() > 0) { + options = add_option(options, DHCP_OPTION_HOSTNAME, hostname.length(), (u8*)(hostname.c_str())); } + if(request_packet_type == DHCP_REQUEST_SELECTING) { options = add_option(options, DHCP_OPTION_REQUESTED_ADDRESS, 4, (u8*)&requested_ip); } @@ -588,11 +589,17 @@ namespace dhcp { // Compose a dhcp request packet dhcp_mbuf dm(false); _xid = rand(); + std::string hostname_str(""); + char hostname[256]; + if (0 == gethostname(hostname, sizeof(hostname))) { + hostname_str.assign(hostname); + } dm.compose_request(_ifp, _xid, _client_addr, _server_addr, - dhcp_mbuf::DHCP_REQUEST_RENEWING); + dhcp_mbuf::DHCP_REQUEST_RENEWING, + hostname_str); // Send dhcp_i( "Unicasting DHCPREQUEST message with xid: [%d] from client: %s to server: %s in order to RENEW lease of: %s", @@ -638,11 +645,23 @@ namespace dhcp { // Send a DHCP Request _state = DHCP_REQUEST; dhcp_mbuf dm_req(false); + std::string hostname_str(""); + if(dm.get_hostname().length() > 0) { + // Get from the offer message + hostname_str = dm.get_hostname(); + } + else { + char hostname[256]; + if (0 == gethostname(hostname, sizeof(hostname))) { + hostname_str = hostname; + } + } dm_req.compose_request(_ifp, _xid, dm.get_your_ip(), dm.get_dhcp_server_ip(), - dhcp_mbuf::DHCP_REQUEST_SELECTING); + dhcp_mbuf::DHCP_REQUEST_SELECTING, + hostname_str); dhcp_i( "Broadcasting DHCPREQUEST message with xid: [%d] to SELECT offered IP: %s", _xid, dm.get_your_ip().to_string().c_str()); _sock->dhcp_send(dm_req); @@ -702,7 +721,8 @@ namespace dhcp { osv::set_dns_config(dm.get_dns_ips(), std::vector<std::string>()); if (dm.get_hostname().size()) { - sethostname(dm.get_hostname().c_str(), dm.get_hostname().size()); + sethostname(dm.get_hostname().c_str(), dm.get_hostname().size()); + dhcp_i("Set hostname to: %s", dm.get_hostname().c_str()); } // TODO: setup lease } else if (dm.get_message_type() == DHCP_MT_NAK) { diff --git a/include/osv/dhcp.hh b/include/osv/dhcp.hh index 6797b7f..7309db9 100644 --- a/include/osv/dhcp.hh +++ b/include/osv/dhcp.hh @@ -137,7 +137,8 @@ namespace dhcp { u32 xid, boost::asio::ip::address_v4 yip, boost::asio::ip::address_v4 sip, - dhcp_request_packet_type request_packet_type); + dhcp_request_packet_type request_packet_type, + std::string hostname); void compose_release(struct ifnet* ifp, boost::asio::ip::address_v4 yip, boost::asio::ip::address_v4 sip); -- 2.7.4 -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
