From 10cc12da06b8a621bd91b517257b42dbcd03ddc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 12 Dec 2006 01:49:47 +0000 Subject: [PATCH] Now delays configuring the interface until we got the DHCP acknowledge message - this might fix the missing message from my router. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19468 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/net/DHCPClient.cpp | 40 ++++++++++++++++++---------------- src/servers/net/DHCPClient.h | 1 + 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/servers/net/DHCPClient.cpp b/src/servers/net/DHCPClient.cpp index a7c5cf7ba6..0e2ec9f0e9 100644 --- a/src/servers/net/DHCPClient.cpp +++ b/src/servers/net/DHCPClient.cpp @@ -292,7 +292,8 @@ dhcp_message::PutOption(uint8* options, message_option option, uint8* data, uint DHCPClient::DHCPClient(BMessenger target, const char* device) : BHandler("dhcp"), - fDevice(device) + fDevice(device), + fConfiguration(kMsgConfigureInterface) { fTransactionID = system_time(); @@ -409,42 +410,43 @@ DHCPClient::DHCPClient(BMessenger target, const char* device) fAssignedAddress = message->your_address; - BMessage configure(kMsgConfigureInterface); - configure.AddString("device", fDevice.String()); + fConfiguration.MakeEmpty(); + fConfiguration.AddString("device", fDevice.String()); BMessage address; address.AddString("family", "inet"); address.AddString("address", _ToString(fAssignedAddress)); _ParseOptions(*message, address); - configure.AddMessage("address", &address); + fConfiguration.AddMessage("address", &address); - // configure interface - BMessage reply; - target.SendMessage(&configure, &reply); + // request configuration from the server - status_t status; - if (reply.FindInt32("status", &status) == B_OK - && status == B_OK) { - // configuration succeeded, request it from the server - _ResetTimeout(socket); + _ResetTimeout(socket); + state = REQUESTING; + _PrepareMessage(request); - state = REQUESTING; - _PrepareMessage(request); - - fStatus = _SendMessage(socket, request, broadcast); - // we're sending a broadcast so that all offers get an answer - } + fStatus = _SendMessage(socket, request, broadcast); + // we're sending a broadcast so that all potential offers get an answer + break; } case DHCP_ACK: + { if (state != REQUESTING) continue; // our address request has been acknowledged state = ACKNOWLEDGED; - fStatus = B_OK; + + // configure interface + BMessage reply; + target.SendMessage(&fConfiguration, &reply); + + if (reply.FindInt32("status", &fStatus) != B_OK) + fStatus = B_OK; break; + } case DHCP_NACK: if (state != REQUESTING) diff --git a/src/servers/net/DHCPClient.h b/src/servers/net/DHCPClient.h index e101ed9282..8dd85733f1 100644 --- a/src/servers/net/DHCPClient.h +++ b/src/servers/net/DHCPClient.h @@ -38,6 +38,7 @@ class DHCPClient : public BHandler { BString _ToString(in_addr_t address) const; BString fDevice; + BMessage fConfiguration; BMessageRunner* fRunner; uint8 fMAC[6]; uint32 fTransactionID;