Browse Source

dhcp4 parser: add a new parameter "client-prefix-length" to subnet configuration

Baptiste Jonglez 7 years ago
parent
commit
af7256128e

+ 9 - 0
src/bin/dhcp4/dhcp4_lexer.ll

@@ -595,6 +595,15 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"client-prefix-length\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::SUBNET4:
+        return isc::dhcp::Dhcp4Parser::make_CLIENT_PREFIX_LEN(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("client-prefix-length", driver.loc_);
+    }
+}
+
 \"interface\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:

+ 10 - 0
src/bin/dhcp4/dhcp4_parser.yy

@@ -111,6 +111,7 @@ using namespace std;
   USER_CONTEXT "user-context"
 
   SUBNET "subnet"
+  CLIENT_PREFIX_LEN "client-prefix-length"
   INTERFACE "interface"
   INTERFACE_ID "interface-id"
   ID "id"
@@ -904,6 +905,7 @@ subnet4_param: valid_lifetime
              | option_data_list
              | pools_list
              | subnet
+             | client_prefix_len
              | interface
              | interface_id
              | id
@@ -971,6 +973,14 @@ interface_id: INTERFACE_ID {
     ctx.leave();
 };
 
+client_prefix_len: CLIENT_PREFIX_LEN {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON INTEGER {
+    ElementPtr client_prefix_len(new IntElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("client-prefix-length", client_prefix_len);
+    ctx.leave();
+};
+
 client_class: CLIENT_CLASS {
     ctx.enter(ctx.CLIENT_CLASS);
 } COLON STRING {

+ 7 - 0
src/lib/dhcpsrv/parsers/dhcp_parsers.cc

@@ -586,6 +586,13 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params,
     // SimpleParser4::setAllDefaults.
     SubnetID subnet_id = static_cast<SubnetID>(getInteger(params, "id"));
 
+    // Client prefix length is optional.  If not supplied, the default
+    // value is 255, which means "use the prefix length from the subnet".
+    uint8_t client_prefix_len = getInteger(params, "client-prefix-length");
+    if (client_prefix_len == 255) {
+        client_prefix_len = len;
+    }
+
     stringstream s;
     s << addr << "/" << static_cast<int>(len) << " with params: ";
     // t1 and t2 are optional may be not specified.

+ 3 - 0
src/lib/dhcpsrv/parsers/simple_parser4.cc

@@ -76,6 +76,7 @@ const SimpleDefaults SimpleParser4::GLOBAL4_DEFAULTS = {
 /// defined on global level. Currently there are two such parameters:
 /// interface and reservation-mode
 const SimpleDefaults SimpleParser4::SUBNET4_DEFAULTS = {
+    { "client-prefix-length", Element::integer, "255" }, // 255 means same as subnet prefix length
     { "id",               Element::integer, "0" }, // 0 means autogenerate
     { "interface",        Element::string,  "" },
     { "client-class",     Element::string,  "" },
@@ -92,6 +93,7 @@ const SimpleDefaults SimpleParser4::SUBNET4_DEFAULTS = {
 /// that can be derived from shared-network, but cannot from global scope.
 /// Those are: interface and reservation-mode.
 const SimpleDefaults SimpleParser4::SHARED_SUBNET4_DEFAULTS = {
+    { "client-prefix-length", Element::integer, "255" }, // 255 means same as subnet prefix length
     { "id",               Element::integer, "0" }, // 0 means autogenerate
     { "4o6-interface",    Element::string,  "" },
     { "4o6-interface-id", Element::string,  "" },
@@ -122,6 +124,7 @@ const SimpleDefaults SimpleParser4::IFACE4_DEFAULTS = {
 const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = {
     "boot-file-name",
     "client-class",
+    "client-prefix-length",
     "interface",
     "match-client-id",
     "next-server",