DHCPMessage: support DHCP option 'parameter request list'
This adds the support for DHCP option 'parameter request
list'. This allows the client to request specified
configuration parameters from the DHCP server.
There are some other minor changes:
Replace 'GetData' with 'GetConstData' in DeviceInfo unittest.
Add a missing 'return false' in DHCPMessage.
Add DHCP message length checking in DHCPMessage
::Serialize().
Bug: 25642025
TEST=compile and unittest
Change-Id: I6e9d756aa2925ab2390b0a1096ae3d663b241aba
diff --git a/device_info_unittest.cc b/device_info_unittest.cc
index cd0bd89..c5f7006 100644
--- a/device_info_unittest.cc
+++ b/device_info_unittest.cc
@@ -92,7 +92,8 @@
&interface_index));
EXPECT_EQ(interface_index, kFakeInterfaceIndex);
EXPECT_THAT(kFakeMacAddress,
- ElementsAreArray(mac_address.GetData(), sizeof(kFakeMacAddress)));
+ ElementsAreArray(mac_address.GetConstData(),
+ sizeof(kFakeMacAddress)));
}
TEST_F(DeviceInfoTest, GetDeviceInfoNameTooLong) {
diff --git a/dhcp_message.cc b/dhcp_message.cc
index bff73d3..1fc2dd3 100644
--- a/dhcp_message.cc
+++ b/dhcp_message.cc
@@ -24,6 +24,7 @@
#include <set>
#include <string>
#include <utility>
+#include <vector>
#include <base/logging.h>
@@ -113,6 +114,7 @@
message->hardware_address_length_ = raw_message->hlen;
if (message->hardware_address_length_ > kClientHardwareAddressLength) {
LOG(ERROR) << "Invalid hardware address length";
+ return false;
}
message->relay_hops_ = raw_message->hops;
message->transaction_id_ = ntohl(raw_message->xid);
@@ -323,12 +325,25 @@
return false;
}
}
+ if (parameter_request_list_.size() != 0) {
+ if (options_writer->WriteUInt8ListOption(data,
+ kDHCPOptionParameterRequestList,
+ parameter_request_list_) == -1) {
+ LOG(ERROR) << "Failed to write parameter request list";
+ return false;
+ }
+ }
// TODO(nywang): Append other options.
// Append end tag.
if (options_writer->WriteEndTag(data) == -1) {
LOG(ERROR) << "Failed to write DHCP options end tag";
return false;
}
+ // Ensure we do not exceed the maximum length.
+ if (data->GetLength() > kDHCPMessageMaxLength) {
+ LOG(ERROR) << "DHCP message length exceeds the limit";
+ return false;
+ }
return true;
}
@@ -377,6 +392,10 @@
message_type_ = message_type;
}
+void DHCPMessage::SetParameterRequestList(
+ const std::vector<uint8_t>& parameter_request_list) {
+ parameter_request_list_ = parameter_request_list;
+}
void DHCPMessage::SetServerIdentifier(uint32_t server_identifier) {
server_identifier_ = server_identifier;
}
diff --git a/dhcp_message.h b/dhcp_message.h
index 124000b..3fc5bca 100644
--- a/dhcp_message.h
+++ b/dhcp_message.h
@@ -72,6 +72,8 @@
void SetClientIPAddress(uint32_t client_ip_address);
void SetLeaseTime(uint32_t lease_time);
void SetMessageType(uint8_t message_type);
+ void SetParameterRequestList(
+ const std::vector<uint8_t>& parameter_request_list);
void SetServerIdentifier(uint32_t server_identifier);
void SetTransactionID(uint32_t transaction_id);
@@ -153,6 +155,8 @@
uint8_t message_type_;
// Option 54: Server Identifier.
uint32_t server_identifier_;
+ // Option 55: Parameter Request List.
+ std::vector<uint8_t> parameter_request_list_;
// Option 58: Renewal time value in unit of seconds.
uint32_t renewal_time_;
// Option 59: Rebinding time value in unit of seconds.
diff --git a/dhcp_options.h b/dhcp_options.h
index 1e4d6d9..1a9f498 100644
--- a/dhcp_options.h
+++ b/dhcp_options.h
@@ -27,6 +27,7 @@
const uint8_t kDHCPOptionLeaseTime = 51;
const uint8_t kDHCPOptionMessageType = 53;
const uint8_t kDHCPOptionServerIdentifier = 54;
+const uint8_t kDHCPOptionParameterRequestList = 55;
const uint8_t kDHCPOptionRenewalTime = 58;
const uint8_t kDHCPOptionRebindingTime = 59;
const uint8_t kDHCPOptionClientIdentifier = 61;