// ******************************** OptionDefParser ****************************
+const SimpleKeywords
+OptionDefParser::OPTION_DEF_PARAMETERS = {
+ { "name", Element::string },
+ { "code", Element::integer },
+ { "type", Element::string },
+ { "record-types", Element::string },
+ { "space", Element::string },
+ { "encapsulate", Element::string },
+ { "array", Element::boolean, },
+ { "user-context", Element::map },
+ { "comment", Element::string }
+};
+
OptionDefParser::OptionDefParser(const uint16_t address_family)
: address_family_(address_family) {
}
std::pair<isc::dhcp::OptionDefinitionPtr, std::string>
OptionDefParser::parse(ConstElementPtr option_def) {
+ // Check parameters.
+ checkKeywords(OPTION_DEF_PARAMETERS, option_def);
+
// Get mandatory parameters.
std::string name = getString(option_def, "name");
int64_t code64 = getInteger(option_def, "code");
//****************************** PoolParser ********************************
+const SimpleKeywords
+PoolParser::POOL_PARAMETERS = {
+ { "pool", Element::string },
+ { "option-data", Element::list },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "user-context", Element::map },
+ { "comment", Element::string }
+};
+
void
PoolParser::parse(PoolStoragePtr pools,
ConstElementPtr pool_structure,
const uint16_t address_family) {
+ checkKeywords(POOL_PARAMETERS, pool_structure);
+
ConstElementPtr text_pool = pool_structure->get("pool");
if (!text_pool) {
//****************************** Subnet4ConfigParser *************************
+const SimpleKeywords
+Subnet4ConfigParser::SUBNET4_PARAMETERS = {
+ { "valid-lifetime", Element::integer },
+ { "renew-timer", Element::integer },
+ { "rebind-timer", Element::integer },
+ { "option-data", Element::list },
+ { "pools", Element::list },
+ { "subnet", Element::string },
+ { "interface", Element::string },
+ { "id", Element::integer },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "reservations", Element::list },
+ { "reservation-mode", Element::string },
+ { "relay", Element::map },
+ { "match-client-id", Element::boolean },
+ { "authoritative", Element::boolean },
+ { "next-server", Element::string },
+ { "server-hostname", Element::string },
+ { "boot-file-name", Element::string },
+ { "4o6-interface", Element::string },
+ { "4o6-interface-id", Element::string },
+ { "4o6-subnet", Element::string },
+ { "user-context", Element::map },
+ { "comment", Element::string },
+ { "calculate-tee-times", Element::boolean },
+ { "t1-percent", Element::real },
+ { "t2-percent", Element::real }
+};
+
Subnet4ConfigParser::Subnet4ConfigParser()
:SubnetConfigParser(AF_INET) {
}
Subnet4Ptr
Subnet4ConfigParser::parse(ConstElementPtr subnet) {
+ // Check parameters.
+ checkKeywords(SUBNET4_PARAMETERS, subnet);
+
/// Parse Pools first.
ConstElementPtr pools = subnet->get("pools");
if (pools) {
//**************************** PdPoolParser ******************************
+const SimpleKeywords
+PdPoolParser::PD_POOL_PARAMETERS = {
+ { "prefix", Element::string },
+ { "prefix-len", Element::integer },
+ { "delegated-len", Element::integer },
+ { "option-data", Element::list },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "excluded-prefix", Element::string },
+ { "excluded-prefix-len", Element::integer },
+ { "user-context", Element::map },
+ { "comment", Element::string }
+};
+
PdPoolParser::PdPoolParser() : options_(new CfgOption()) {
}
void
PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) {
+ checkKeywords(PD_POOL_PARAMETERS, pd_pool_);
+
std::string addr_str = getString(pd_pool_, "prefix");
uint8_t prefix_len = getUint8(pd_pool_, "prefix-len");
//**************************** Subnet6ConfigParser ***********************
+const SimpleKeywords
+Subnet6ConfigParser::SUBNET6_PARAMETERS = {
+ { "preferred-lifetime", Element::integer },
+ { "valid-lifetime", Element::integer },
+ { "renew-timer", Element::integer },
+ { "rebind-timer", Element::integer },
+ { "option-data", Element::list },
+ { "pools", Element::list },
+ { "pd-pools", Element::list },
+ { "subnet", Element::string },
+ { "interface", Element::string },
+ { "interface-id", Element::string },
+ { "id", Element::integer },
+ { "rapid-commit", Element::boolean },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "reservations", Element::list },
+ { "reservation-mode", Element::string },
+ { "relay", Element::map },
+ { "user-context", Element::map },
+ { "comment", Element::string },
+ { "calculate-tee-times", Element::boolean },
+ { "t1-percent", Element::real },
+ { "t2-percent", Element::real }
+};
+
Subnet6ConfigParser::Subnet6ConfigParser()
: SubnetConfigParser(AF_INET6) {
}
Subnet6Ptr
Subnet6ConfigParser::parse(ConstElementPtr subnet) {
+ // Check parameters.
+ checkKeywords(SUBNET6_PARAMETERS, subnet);
+
/// Parse all pools first.
ConstElementPtr pools = subnet->get("pools");
if (pools) {
OptionDefinitionTuple
parse(isc::data::ConstElementPtr option_def);
+ /// @brief This table defines all option definition parameters.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows option_def_param rules in bison grammar.
+ static const isc::data::SimpleKeywords OPTION_DEF_PARAMETERS;
+
private:
/// @brief Address family: @c AF_INET or @c AF_INET6.
uint16_t address_family_;
isc::data::ConstElementPtr pool_structure,
const uint16_t address_family);
+ /// @brief This table defines all pool parameters.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows pool_param rules in bison grammar.
+ static const isc::data::SimpleKeywords POOL_PARAMETERS;
+
protected:
/// @brief Creates a Pool object given a IPv4 prefix and the prefix length.
///
/// @return a pointer to created Subnet4 object
Subnet4Ptr parse(data::ConstElementPtr subnet);
+ /// @brief This table defines all subnet parameters for DHCPv4.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows subnet4_param rule in bison grammar.
+ static const isc::data::SimpleKeywords SUBNET4_PARAMETERS;
+
protected:
/// @brief Instantiates the IPv4 Subnet based on a given IPv4 address
/// @throw DhcpConfigError if configuration parsing fails.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_);
+ /// @brief This table defines all prefix delegation pool parameters.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows pd_pool_param rules in bison grammar.
+ static const isc::data::SimpleKeywords PD_POOL_PARAMETERS;
+
private:
/// Pointer to the created pool object.
/// @return a pointer to created Subnet6 object
Subnet6Ptr parse(data::ConstElementPtr subnet);
+ /// @brief This table defines all subnet parameters for DHCPv6.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows subnet6_param rule in bison grammar.
+ static const isc::data::SimpleKeywords SUBNET6_PARAMETERS;
+
protected:
/// @brief Issues a DHCP6 server specific warning regarding duplicate subnet
/// options.
// **************************** OptionDataParser *************************
+const SimpleKeywords
+OptionDataParser::OPTION_PARAMETERS = {
+ { "name", Element::string },
+ { "data", Element::string },
+ { "code", Element::integer },
+ { "space", Element::string },
+ { "csv-format", Element::boolean },
+ { "always-send", Element::boolean },
+ { "user-context", Element::map },
+ { "comment", Element::string }
+};
+
OptionDataParser::OptionDataParser(const uint16_t address_family,
CfgOptionDefPtr cfg_option_def)
: address_family_(address_family), cfg_option_def_(cfg_option_def) {
std::pair<OptionDescriptor, std::string>
OptionDataParser::parse(isc::data::ConstElementPtr single_option) {
+ // Check parameters.
+ checkKeywords(OPTION_PARAMETERS, single_option);
+
// Try to create the option instance.
std::pair<OptionDescriptor, std::string> opt = createOption(single_option);
/// space
std::pair<OptionDescriptor, std::string>
parse(isc::data::ConstElementPtr single_option);
+
+ /// @brief This table defines all option parameters.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows option_param rules in bison grammar.
+ static const isc::data::SimpleKeywords OPTION_PARAMETERS;
+
private:
/// @brief Finds an option definition within an option space
namespace isc {
namespace dhcp {
+const SimpleKeywords
+SharedNetwork4Parser::SHARED_NETWORK4_PARAMETERS = {
+ { "name", Element::string },
+ { "subnet4", Element::list },
+ { "interface", Element::string },
+ { "renew-timer", Element::integer },
+ { "rebind-timer", Element::integer },
+ { "option-data", Element::list },
+ { "match-client-id", Element::boolean },
+ { "authoritative", Element::boolean },
+ { "next-server", Element::string },
+ { "server-hostname", Element::string },
+ { "boot-file-name", Element::string },
+ { "relay", Element::map },
+ { "reservation-mode", Element::string },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "valid-lifetime", Element::integer },
+ { "user-context", Element::map },
+ { "comment", Element::string },
+ { "calculate-tee-times", Element::boolean },
+ { "t1-percent", Element::real },
+ { "t2-percent", Element::real }
+};
+
SharedNetwork4Ptr
SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
SharedNetwork4Ptr shared_network;
try {
+ // Check parameters.
+ checkKeywords(SHARED_NETWORK4_PARAMETERS, shared_network_data);
+
// Make sure that the network name has been specified. The name is required
// to create a SharedNetwork4 object.
std::string name = getString(shared_network_data, "name");
return (shared_network);
}
+const SimpleKeywords
+SharedNetwork6Parser::SHARED_NETWORK6_PARAMETERS = {
+ { "name", Element::string },
+ { "subnet6", Element::list },
+ { "interface", Element::string },
+ { "interface-id", Element::string },
+ { "renew-timer", Element::integer },
+ { "rebind-timer", Element::integer },
+ { "option-data", Element::list },
+ { "relay", Element::map },
+ { "reservation-mode", Element::string },
+ { "client-class", Element::string },
+ { "require-client-classes", Element::list },
+ { "preferred-lifetime", Element::integer },
+ { "rapid-commit", Element::boolean },
+ { "valid-lifetime", Element::integer },
+ { "user-context", Element::map },
+ { "comment", Element::string },
+ { "calculate-tee-times", Element::boolean },
+ { "t1-percent", Element::real },
+ { "t2-percent", Element::real }
+};
+
SharedNetwork6Ptr
SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) {
SharedNetwork6Ptr shared_network;
std::string name;
try {
+ // Check parameters.
+ checkKeywords(SHARED_NETWORK6_PARAMETERS, shared_network_data);
+
// Make sure that the network name has been specified. The name is required
// to create a SharedNetwork6 object.
std::string name = getString(shared_network_data, "name");
class SharedNetwork4Parser : public BaseNetworkParser {
public:
+ /// @brief This table defines all shared network parameters for DHCPv4.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows shared_network_param rule in bison grammar.
+ static const isc::data::SimpleKeywords SHARED_NETWORK4_PARAMETERS;
+
/// @brief Parses shared configuration information for IPv4 shared network.
///
/// @param shared_network_data Data element holding shared network
class SharedNetwork6Parser : public BaseNetworkParser {
public:
+ /// @brief This table defines all shared network parameters for DHCPv6.
+ ///
+ /// Boolean, integer, real and string types are for scalar parameters,
+ /// list and map types for entries.
+ /// Order follows shared_network_param rule in bison grammar.
+ static const isc::data::SimpleKeywords SHARED_NETWORK6_PARAMETERS;
+
/// @brief Parses shared configuration information for IPv6 shared network.
///
/// @param shared_network_data Data element holding shared network
" \"reservation-mode\": \"all\", \n"
" \"4o6-interface\": \"\", \n"
" \"4o6-interface-id\": \"\", \n"
- " \"4o6-subnet\": \"\", \n"
- " \"dhcp4o6-port\": 0, \n"
- " \"decline-probation-period\": 86400 \n"
+ " \"4o6-subnet\": \"\" \n"
" }";
" \"valid-lifetime\": 300, \n"
" \"client-class\": \"\", \n"
" \"require-client-classes\": [] \n,"
- " \"reservation-mode\": \"all\", \n"
- " \"4o6-interface\": \"\", \n"
- " \"4o6-interface-id\": \"\", \n"
- " \"4o6-subnet\": \"\", \n"
- " \"dhcp4o6-port\": 0, \n"
- " \"decline-probation-period\": 86400 \n"
+ " \"reservation-mode\": \"all\" \n"
" }";
"{ \n"
" \"option-data\": [ { \n"
" \"name\": \"domain-name-servers\", \n"
- " \"code \": 6, \n"
+ " \"code\": 6, \n"
" \"space\": \"dhcp4\", \n"
" \"csv-format\": false, \n"
" \"data\": \"" << hex_str << "\" \n"
" \"4o6-interface\": \"\","
" \"4o6-interface-id\": \"\","
" \"4o6-subnet\": \"\","
- " \"dhcp4o6-port\": 0,"
- " \"decline-probation-period\": 86400,"
" \"reservation-mode\": \"all\","
" \"calculate-tee-times\": true,"
" \"t1-percent\": .45,"
" \"4o6-interface\": \"\","
" \"4o6-interface-id\": \"\","
" \"4o6-subnet\": \"\","
- " \"dhcp4o6-port\": 0,"
- " \"decline-probation-period\": 86400,"
" \"reservation-mode\": \"all\","
" \"calculate-tee-times\": false,"
" \"t1-percent\": .40,"
" \"client-class\": \"\","
" \"require-client-classes\": []\n,"
" \"reservation-mode\": \"all\","
- " \"decline-probation-period\": 86400,"
- " \"dhcp4o6-port\": 0,"
" \"rapid-commit\": false"
" },"
" {"
" \"client-class\": \"\","
" \"require-client-classes\": []\n,"
" \"reservation-mode\": \"all\","
- " \"decline-probation-period\": 86400,"
- " \"dhcp4o6-port\": 0,"
" \"rapid-commit\": false"
" }"
" ]"