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;