From b6ba1daaacca4c68146e1aa7ebe515f6c7964f10 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Mon, 16 May 2011 16:00:18 +0000 Subject: [PATCH] There is no point trying to request back from DHCP a link-local auto-configured address... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41538 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/net/DHCPClient.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/servers/net/DHCPClient.cpp b/src/servers/net/DHCPClient.cpp index 54bd81b3dd..7aac5a4930 100644 --- a/src/servers/net/DHCPClient.cpp +++ b/src/servers/net/DHCPClient.cpp @@ -446,6 +446,13 @@ DHCPClient::DHCPClient(BMessenger target, const char* device) BNetworkAddress address = interfaceAddress.Address(); const sockaddr_in& addr = (sockaddr_in&)address.SockAddr(); fAssignedAddress = addr.sin_addr.s_addr; + + if ((ntohl(fAssignedAddress) & IN_CLASSB_NET) == 0xa9fe0000) { + // previous auto-configured address is a link-local one: + // there is no point asking a DHCP server to renew such + // server-less assigned address... + fAssignedAddress = 0; + } } } @@ -561,8 +568,8 @@ DHCPClient::_Negotiate(dhcp_state state) _SendMessage(socket, state == INIT ? discover : request, state != RENEWING ? broadcast : fServer); - continue; + } else if (bytesReceived < 0) break; @@ -845,7 +852,7 @@ DHCPClient::_PrepareMessage(dhcp_message& message, dhcp_state state) (uint32)server.sin_addr.s_addr); } - if (state == INIT || state == INIT_REBOOT + if (state == INIT || state == INIT_REBOOT || state == REQUESTING) { next = message.PutOption(next, OPTION_REQUEST_IP_ADDRESS, (uint32)fAssignedAddress); @@ -928,12 +935,12 @@ DHCPClient::_SendMessage(int socket, dhcp_message& message, message_type type = message.Type(); BString text; text << dhcp_message::TypeToString(type); - + const uint8* requestAddress = message.FindOption(OPTION_REQUEST_IP_ADDRESS); if (type == DHCP_REQUEST && requestAddress != NULL) text << " for " << _AddressToString(requestAddress).String(); - - syslog(LOG_DEBUG, "%s: Send %s to %s\n", Device(), text.String(), + + syslog(LOG_DEBUG, "%s: Send %s to %s\n", Device(), text.String(), address.ToString().String()); ssize_t bytesSent = sendto(socket, &message, message.Size(),