works for me, also on openstack and on HLRS testbed. Drop my patch, accept 
that one please :)

On Thursday, March 30, 2017 at 3:00:17 PM UTC+2, Waldek Kozaczuk wrote:
>
> 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] <javascript:>> 
> --- 
>  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.

Reply via email to