--- /dev/null
+
+{
+ "Dhcp4": {
+ "interfaces-config": {
+ "interfaces": [ "eth0" ]
+ },
+
+ "lease-database": {
+ "type": "memfile",
+ "lfc-interval": 3600
+ },
+
+ "shared-networks": [
+ {
+ "interface": "eth1",
+ "match-client-id": false,
+ "name": "frog",
+ "option-data": [ ],
+ "rebind-timer": 150,
+ "relay": {
+ "ip-address": "0.0.0.0"
+ },
+ "renew-timer": 100,
+ "reservation-mode": "all",
+ "subnet4": [
+ {
+ "4o6-interface": "",
+ "4o6-interface-id": "",
+ "4o6-subnet": "",
+ "id": 1,
+ "match-client-id": true,
+ "next-server": "0.0.0.0",
+ "option-data": [ ],
+ "pools": [ ],
+ "rebind-timer": 20,
+ "relay": {
+ "ip-address": "0.0.0.0"
+ },
+ "renew-timer": 10,
+ "reservation-mode": "all",
+ "subnet": "10.0.0.0/8",
+ "valid-lifetime": 30
+ },
+ {
+ "4o6-interface": "",
+ "4o6-interface-id": "",
+ "4o6-subnet": "",
+ "id": 2,
+ "match-client-id": true,
+ "next-server": "0.0.0.0",
+ "option-data": [ ],
+ "pools": [ ],
+ "rebind-timer": 20,
+ "relay": {
+ "ip-address": "0.0.0.0"
+ },
+ "renew-timer": 10,
+ "reservation-mode": "all",
+ "subnet": "192.0.2.0/24",
+ "valid-lifetime": 30
+ }
+ ],
+ "valid-lifetime": 200
+ } ], // end of shared-networks
+
+ // This is regular subnet. It's not part of any shared-network.
+ "subnet4": [
+ {
+ "pools": [ { "pool": "192.0.3.1 - 192.0.3.200" } ],
+ "subnet": "192.0.3.0/24",
+ "interface": "eth0"
+ }
+ ]
+
+ } // end of Dhcp4
+}
--- /dev/null
+{
+ "Dhcp6": {
+// Kea is told to listen on ethX interface only.
+ "interfaces-config": {
+ "interfaces": [ "eth0" ]
+ },
+
+// We need to specify the the database used to store leases. As of
+// September 2016, four database backends are supported: MySQL,
+// PostgreSQL, Cassandra, and the in-memory database, Memfile.
+// We'll use memfile because it doesn't require any prior set up.
+ "lease-database": {
+ "type": "memfile",
+ "lfc-interval": 3600
+ },
+
+ "subnet6": [
+ {
+ "pools": [ { "pool": "2001:db8:1::/80" } ],
+ "subnet": "2001:db8:1::/64",
+ "interface": "eth0"
+ }
+ ],
+
+ "shared-networks": [
+ {
+ "interface": "eth1",
+ "name": "frog",
+ "option-data": [ ],
+ "preferred-lifetime": 200,
+ "rapid-commit": true,
+ "rebind-timer": 150,
+ "relay": {
+ "ip-address": "::"
+ },
+ "renew-timer": 100,
+ "reservation-mode": "all", "subnet6": [
+ {
+ "id": 1,
+ "option-data": [ ],
+ "pd-pools": [ ],
+ "pools": [ ],
+ "preferred-lifetime": 30,
+ "rapid-commit": false,
+ "rebind-timer": 20,
+ "relay": {
+ "ip-address": "2001:db8:1::1"
+ },
+ "renew-timer": 10,
+ "reservation-mode": "all",
+ "subnet": "2001:db8:1::/64",
+ "valid-lifetime": 40
+ },
+ {
+ "id": 2,
+ "option-data": [ ],
+ "pd-pools": [ ],
+ "pools": [ ],
+ "preferred-lifetime": 30,
+ "rapid-commit": false,
+ "rebind-timer": 20,
+ "relay": {
+ "ip-address": "3000::1"
+ },
+ "renew-timer": 10,
+ "reservation-mode": "all",
+ "subnet": "3000::/16",
+ "valid-lifetime": 40
+ }
+ ],
+ "valid-lifetime": 300
+ } ]
+ }
+}
isc::dhcp::Parser4Context::ParserType start_token_value;
unsigned int comment_start_line = 0;
+using namespace isc::dhcp;
+
};
/* To avoid the call to exit... oops! */
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_VALID_LIFETIME(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("valid-lifetime", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_RENEW_TIMER(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("renew-timer", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_REBIND_TIMER(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("rebind-timer", driver.loc_);
\"subnet4\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
+ case isc::dhcp::Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_SUBNET4(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("subnet4", driver.loc_);
}
}
+\"shared-networks\" {
+ switch (driver.ctx_) {
+ case Parser4Context::DHCP4:
+ return Dhcp4Parser::make_SHARED_NETWORKS(driver.loc_);
+ default:
+ return Dhcp4Parser::make_STRING("shared-networks", driver.loc_);
+ }
+}
+
\"option-def\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::RESERVATIONS:
case isc::dhcp::Parser4Context::CLIENT_CLASSES:
case isc::dhcp::Parser4Context::CLIENT_CLASS:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_OPTION_DATA(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("option-data", driver.loc_);
case isc::dhcp::Parser4Context::OPTION_DATA:
case isc::dhcp::Parser4Context::CLIENT_CLASSES:
case isc::dhcp::Parser4Context::CLIENT_CLASS:
+ case Parser4Context::SHARED_NETWORK:
case isc::dhcp::Parser4Context::LOGGERS:
return isc::dhcp::Dhcp4Parser::make_NAME(driver.loc_);
default:
\"interface\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_INTERFACE(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("interface", driver.loc_);
\"reservation-mode\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::SUBNET4:
+ case isc::dhcp::Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_RESERVATION_MODE(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("reservation-mode", driver.loc_);
\"relay\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_RELAY(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("relay", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_ECHO_CLIENT_ID(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("echo-client-id", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::DHCP4:
case isc::dhcp::Parser4Context::SUBNET4:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_MATCH_CLIENT_ID(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("match-client-id", driver.loc_);
case isc::dhcp::Parser4Context::SUBNET4:
case isc::dhcp::Parser4Context::RESERVATIONS:
case isc::dhcp::Parser4Context::CLIENT_CLASSES:
+ case Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_NEXT_SERVER(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("next-server", driver.loc_);
ENCAPSULATE "encapsulate"
ARRAY "array"
+ SHARED_NETWORKS "shared-networks"
+
POOLS "pools"
POOL "pool"
USER_CONTEXT "user-context"
| rebind_timer
| decline_probation_period
| subnet4_list
+ | shared_networks
| interfaces_config
| lease_database
| hosts_database
ctx.stack_.back()->set("rapid-commit", rc);
};
+// ---- shared-networks ---------------------
+
+shared_networks: SHARED_NETWORKS {
+ ElementPtr l(new ListElement(ctx.loc2pos(@1)));
+ ctx.stack_.back()->set("shared-networks", l);
+ ctx.stack_.push_back(l);
+ ctx.enter(ctx.SHARED_NETWORK);
+} COLON LSQUARE_BRACKET shared_networks_list RSQUARE_BRACKET {
+ ctx.stack_.pop_back();
+ ctx.leave();
+};
+
+shared_networks_list: shared_network
+ | shared_networks_list COMMA shared_network
+ ;
+
+shared_network: LCURLY_BRACKET {
+ ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+ ctx.stack_.back()->add(m);
+ ctx.stack_.push_back(m);
+} shared_network_params RCURLY_BRACKET {
+ ctx.stack_.pop_back();
+}
+
+shared_network_params: shared_network_param
+ | shared_network_params COMMA shared_network_param
+ ;
+
+shared_network_param: name
+ | subnet4_list
+ | interface
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | match_client_id
+ | next_server
+ | relay
+ | reservation_mode
+ | echo_client_id
+ | client_classes
+ | valid_lifetime
+ | unknown_map_entry
+ ;
+
// ---- option-def --------------------------
// This defines the "option-def": [ ... ] entry that may appear
return ("ncr-format");
case REPLACE_CLIENT_NAME:
return ("replace-client-name");
+ case SHARED_NETWORK:
+ return ("shared-networks");
default:
return ("__unknown__");
}
/// Used while parsing Dhcp4/Subnet4 structures.
SUBNET4,
+ /// Used while parsing shared-networks structures.
+ SHARED_NETWORK,
+
/// Used while parsing Dhcp4/Subnet4/reservation-mode.
RESERVATION_MODE,
"pgsql-reservations.json",
"reservations.json",
"several-subnets.json",
+ "shared-network.json",
"single-subnet.json",
"with-ddns.json" };
isc::dhcp::Parser6Context::ParserType start_token_value;
unsigned int comment_start_line = 0;
+using namespace isc::dhcp;
+
};
/* To avoid the call to exit... oops! */
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_);
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_);
\"subnet6\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_);
}
}
+\"shared-networks\" {
+ switch (driver.ctx_) {
+ case Parser6Context::DHCP6:
+ return Dhcp6Parser::make_SHARED_NETWORKS(driver.loc_);
+ default:
+ return Dhcp6Parser::make_STRING("shared-networks", driver.loc_);
+ }
+}
+
\"option-def\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::DHCP6:
case isc::dhcp::Parser6Context::RESERVATIONS:
case isc::dhcp::Parser6Context::CLIENT_CLASSES:
case isc::dhcp::Parser6Context::CLIENT_CLASS:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_);
case isc::dhcp::Parser6Context::CLIENT_CLASSES:
case isc::dhcp::Parser6Context::CLIENT_CLASS:
case isc::dhcp::Parser6Context::LOGGERS:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_);
\"interface\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_);
\"interface-id\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_);
\"rapid-commit\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_);
\"reservation-mode\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_);
\"relay\" {
switch(driver.ctx_) {
case isc::dhcp::Parser6Context::SUBNET6:
+ case Parser6Context::SHARED_NETWORK:
return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_);
default:
return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_);
DISABLED "disabled"
OUT_OF_POOL "out-of-pool"
ALL "all"
+ SHARED_NETWORKS "shared-networks"
MAC_SOURCES "mac-sources"
RELAY_SUPPLIED_OPTIONS "relay-supplied-options"
| rebind_timer
| decline_probation_period
| subnet6_list
+ | shared_networks
| interfaces_config
| lease_database
| hosts_database
ctx.stack_.back()->set("rapid-commit", rc);
};
+
+// ---- shared-networks ---------------------
+
+shared_networks: SHARED_NETWORKS {
+ ElementPtr l(new ListElement(ctx.loc2pos(@1)));
+ ctx.stack_.back()->set("shared-networks", l);
+ ctx.stack_.push_back(l);
+ ctx.enter(ctx.SHARED_NETWORK);
+} COLON LSQUARE_BRACKET shared_networks_list RSQUARE_BRACKET {
+ ctx.stack_.pop_back();
+ ctx.leave();
+};
+
+shared_networks_list: shared_network
+ | shared_networks_list COMMA shared_network
+ ;
+
+shared_network: LCURLY_BRACKET {
+ ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+ ctx.stack_.back()->add(m);
+ ctx.stack_.push_back(m);
+} shared_network_params RCURLY_BRACKET {
+ ctx.stack_.pop_back();
+}
+
+shared_network_params: shared_network_param
+ | shared_network_params COMMA shared_network_param
+ ;
+
+shared_network_param: name
+ | subnet6_list
+ | interface
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | relay
+ | reservation_mode
+ | client_classes
+ | preferred_lifetime
+ | rapid_commit
+ | valid_lifetime
+ | unknown_map_entry
+ ;
+
// ---- option-def --------------------------
// This defines the "option-def": [ ... ] entry that may appear
return ("ncr-format");
case REPLACE_CLIENT_NAME:
return ("replace-client-name");
- default:
+ case SHARED_NETWORK:
+ return ("shared-networks");
+ default:
return ("__unknown__");
}
}
/// Used while parsing Dhcp6/Subnet6 structures.
SUBNET6,
+ /// Used while parsing shared-networks structures.
+ SHARED_NETWORK,
+
/// Used while parsing Dhcp6/Subnet6/reservation-mode.
RESERVATION_MODE,
configs.push_back("pgsql-reservations.json");
configs.push_back("reservations.json");
configs.push_back("several-subnets.json");
+ configs.push_back("shared-network.json");
configs.push_back("simple.json");
configs.push_back("stateless.json");
configs.push_back("with-ddns.json");