dhcp client: parse options for class DHCPMessages

Parse the options filed from dhcp message and store options
into corresponding member variables.

Bug: 25642025
TEST=compile

Change-Id: I8876e191ff42ed25e078306cccaa57c04f2f8be0
diff --git a/dhcp_message.h b/dhcp_message.h
index c23db47..faef9e3 100644
--- a/dhcp_message.h
+++ b/dhcp_message.h
@@ -17,37 +17,69 @@
 #ifndef DHCP_CLIENT_DHCP_MESSAGE_H_
 #define DHCP_CLIENT_DHCP_MESSAGE_H_
 
+#include <map>
+#include <memory>
 #include <string>
+#include <vector>
 
 #include <base/macros.h>
 
+#include <dhcp_client/dhcp_options_parser.h>
+
 namespace dhcp_client {
 
+static const uint8_t kDHCPMessageTypeDiscover = 1;
+static const uint8_t kDHCPMessageTypeOffer = 2;
+static const uint8_t kDHCPMessageTypeRequest = 3;
+static const uint8_t kDHCPMessageTypeDecline = 4;
+static const uint8_t kDHCPMessageTypeAck = 5;
+static const uint8_t kDHCPMessageTypeNak = 6;
+static const uint8_t kDHCPMessageTypeRelease = 7;
+static const uint8_t kDHCPMessageTypeInform = 8;
+
+typedef std::unique_ptr<DHCPOptionsParser> ParserPtr;
+
+struct ParserContext{
+  ParserPtr parser;
+  void* output;
+  ParserContext(DHCPOptionsParser* parser_ptr, void* output_ptr)
+      : parser(parser_ptr),
+        output(output_ptr) {}
+};
+
 class DHCPMessage {
  public:
-  static const uint8_t kDHCPMessageTypeDiscover = 1;
-  static const uint8_t kDHCPMessageTypeOffer = 2;
-  static const uint8_t kDHCPMessageTypeRequest = 3;
-  static const uint8_t kDHCPMessageTypeDecline = 4;
-  static const uint8_t kDHCPMessageTypeAck = 5;
-  static const uint8_t kDHCPMessageTypeNak = 6;
-  static const uint8_t kDHCPMessageTypeRelease = 7;
-  static const uint8_t kDHCPMessageTypeInform = 8;
-
   DHCPMessage();
   ~DHCPMessage();
   static bool InitFromBuffer(const unsigned char* buffer,
                              size_t length,
                              DHCPMessage* message);
-  uint32_t GetTransactionID();
-  std::string GetClientHardwareAddress();
+
+  uint8_t message_type() const {return message_type_;}
+
+  uint32_t lease_time() const {return lease_time_;}
+
+  uint32_t rebinding_time() const {return rebinding_time_;}
+
+  uint32_t renewal_time() const {return renewal_time_;}
+
+  uint32_t server_identifier() const {return server_identifier_;}
+
+  uint32_t transaction_id() const {return transaction_id_;}
+
+  uint32_t your_ip_Address() const {return your_ip_address_;}
+
+  const std::vector<uint32_t>& dns_server() const {return dns_server_;}
+
+  const std::string& client_hardware_address() const {
+    return client_hardware_address_;
+  }
 
  private:
-  bool ParseDHCPOptions(const unsigned char* options,
-                        size_t options_length);
+  bool ParseDHCPOptions(const uint8_t* options, size_t options_length);
   bool IsValid();
 
-  // Message type.
+  // Message type: request or reply.
   uint8_t opcode_;
   // Hardware address type.
   uint8_t hardware_address_type_;
@@ -81,6 +113,23 @@
   std::string bootfile_;
   uint32_t cookie_;
 
+  // A map from DHCP Options number to corresponding callbacks.
+  std::map<uint8_t, ParserContext> options_map_;
+
+  // Fields for DHCP Options.
+  // Option 6: Domain Name Server Option
+  std::vector<uint32_t> dns_server_;
+  // Option 51: IP address lease time in unit of seconds.
+  uint32_t lease_time_;
+  // Option 53: DHCP message type.
+  uint8_t message_type_;
+  // Option 54: Server Identifier.
+  uint32_t server_identifier_;
+  // Option 58: Renewal time value in unit of seconds.
+  uint32_t renewal_time_;
+  // Option 59: Rebinding time value in unit of seconds.
+  uint32_t rebinding_time_;
+
   DISALLOW_COPY_AND_ASSIGN(DHCPMessage);
 };