Commit 74b824cc authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[master] Merge branch 'trac5357' (shared network parsers update)

# Conflicts:
#	src/bin/dhcp4/dhcp4_lexer.cc
#	src/bin/dhcp4/dhcp4_parser.cc
#	src/bin/dhcp4/dhcp4_parser.h
#	src/bin/dhcp6/dhcp6_lexer.cc
#	src/bin/dhcp6/dhcp6_parser.cc
#	src/bin/dhcp6/dhcp6_parser.h
parents 5b1dc564 f695a3e4
......@@ -25,6 +25,7 @@ nobase_dist_doc_DATA += examples/kea4/mysql-reservations.json
nobase_dist_doc_DATA += examples/kea4/pgsql-reservations.json
nobase_dist_doc_DATA += examples/kea4/reservations.json
nobase_dist_doc_DATA += examples/kea4/several-subnets.json
nobase_dist_doc_DATA += examples/kea4/shared-network.json
nobase_dist_doc_DATA += examples/kea4/single-subnet.json
nobase_dist_doc_DATA += examples/kea4/with-ddns.json
nobase_dist_doc_DATA += examples/kea6/advanced.json
......@@ -40,6 +41,7 @@ nobase_dist_doc_DATA += examples/kea6/mysql-reservations.json
nobase_dist_doc_DATA += examples/kea6/pgsql-reservations.json
nobase_dist_doc_DATA += examples/kea6/reservations.json
nobase_dist_doc_DATA += examples/kea6/several-subnets.json
nobase_dist_doc_DATA += examples/kea6/shared-network.json
nobase_dist_doc_DATA += examples/kea6/simple.json
nobase_dist_doc_DATA += examples/kea6/softwire46.json
nobase_dist_doc_DATA += examples/kea6/stateless.json
......
// This is an example configuration file for DHCPv4 server in Kea.
// It demonstrates an advanced feature called shared network. Typically, for
// each physical link there is one IPv4 subnet that the server is expected
// to manage. However, in some cases there is a need to configure more subnets
// in the same physical location. The most common use case is an existing
// subnet that grew past its original assumptions and ran out of addresses,
// so the sysadmin needs to add another subnet on top of existing one.
{
"Dhcp4": {
// As with any other configuration, you need to tell Kea the interface
// names, so it would listen to incoming traffic.
"interfaces-config": {
"interfaces": [ "ethX" ]
},
// You also need to tell where to store lease information.
// memfile is the backend that is easiest to set up.
"lease-database": {
"type": "memfile",
"lfc-interval": 3600
},
// The shared networks definition starts here. shared-networks can
// contain a list of shared networks. There are many parameters
// that can be specified here, so this example may be overwhelming
// at first, but the only mandatory parameter for each shared
// network is name. It must be unique. Typically, each shared
// network also needs to have at least two subnets to be functional,
// but if you really want to, you can define a degraded shared
// network that has 1 or even 0 subnets. This may come in handy
// when migrating between regular subnets and shared networks
// or when debugging a problem. It is not recommended to use
// 1 subnet per shared network, as there is extra processing
// overhead for shared networks.
"shared-networks": [
{
// Name of the shared network. It may be an arbitrary string
// and it must be unique among all shared networks.
"name": "frog",
// You may specify interface name if the shared network is
// reachable directly from the server.
"interface": "eth1",
// You can specify many parameters that are allowed in subnet scope
// here. It's useful to put them here if they apply to all subnets
// in this shared network. It's likely that the most common
// parameter here will be option values defined with option-data.
"match-client-id": false,
"option-data": [ ],
"rebind-timer": 150,
// If all the traffic coming from that shared network is reachable
// via relay and that relay always use the same IP address, you
// can specify that relay address here. Since this example shows
// a shared network reachable directly, we put 0.0.0.0 here.
// It would be better to skip the relay scope altogether, but
// it was left here for demonstration purposes.
"relay": {
"ip-address": "0.0.0.0"
},
// Timer values can be overridden here.
"renew-timer": 100,
"reservation-mode": "all",
// This starts a list of subnets allowed in this shared network.
// In our example, there are two subnets.
"subnet4": [
{
"id": 1,
"match-client-id": true,
"next-server": "0.0.0.0",
"option-data": [ ],
"pools": [ ],
"rebind-timer": 20,
// You can override the value inherited from shared-network
// here if your relay uses different IP addresses for
// each subnet.
"relay": {
"ip-address": "0.0.0.0"
},
"renew-timer": 10,
"reservation-mode": "all",
"subnet": "10.0.0.0/8",
"valid-lifetime": 30
},
{
"id": 2,
"match-client-id": true,
"next-server": "0.0.0.0",
"option-data": [ ],
"pools": [ ],
"rebind-timer": 20,
"renew-timer": 10,
"reservation-mode": "all",
"subnet": "192.0.2.0/24",
"valid-lifetime": 30
}
],
"valid-lifetime": 200
} ], // end of shared-networks
// It is likely that in your network you'll have a mix of regular,
// "plain" subnets and shared networks. It is perfectly valid to mix
// them in the same config file.
//
// 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",
"id": 3
}
]
} // end of Dhcp4
}
// This is an example configuration file for DHCPv6 server in Kea.
// It demonstrates an advanced feature called shared network. Typically, for
// each physical link there is one IPv6 subnet that the server is expected
// to manage. However, in some cases there is a need to configure more subnets
// in the same physical location. This may sound odd, as IPv6 is not expected
// to run out of addresses. However, due to vast address space some deployments
// experiment with various addressing schemes and later find out that the
// initial proposal was not best and way to migrate to something else.
{
"Dhcp6": {
// Kea is told to listen on ethX interface only.
"interfaces-config": {
"interfaces": [ "ethX" ]
},
// You also need to tell where to store lease information.
// memfile is the backend that is easiest to set up.
"lease-database": {
"type": "memfile",
"lfc-interval": 3600
},
// It is likely that in your network you'll have a mix of regular,
// "plain" subnets and shared networks. It is perfectly valid to mix
// them in the same config file.
//
// This is regular subnet. It's not part of any shared-network.
"subnet6": [
{
"pools": [ { "pool": "2001:db8:2::/80" } ],
"subnet": "2001:db8:2::/64",
"interface": "ethX"
}
],
// Hhe shared networks definition starts here. shared-networks can
// contain a list of shared networks. There are many parameters
// that can be specified here, so this example may be overwhelming
// at first, but the only mandatory parameter for each shared
// network is name. It must be unique. Typically, each shared
// network also needs to have at least two subnets to be functional,
// but if you really want to, you can define a degraded shared
// network that has 1 or even 0 subnets. This may come in handy
// when migrating between regular subnets and shared networks
// or when debugging a problem. It is not recommended to use
// 1 subnet per shared network, as there is extra processing
// overhead for shared networks.
"shared-networks": [
{
"interface": "eth1",
// Similar to regular subnets, it is forbidden to define both
// interface and interface-id at the same time. That's because
// interface parameter expresses physical network interface
// for links available locally and interface-id identifies
// values inserted by relays, which are only used for
// remote traffic. A shared network cannot be both direct
// and relayed.
//"interface-id": "content of the option",
// Other parameters defined here will be inherited by the
// subnets.
"name": "frog",
"option-data": [ ],
"preferred-lifetime": 200,
"rapid-commit": true,
"rebind-timer": 150,
"relay": {
"ip-address": "2001:db8::1"
},
"renew-timer": 100,
"reservation-mode": "all",
// List of subnets belonging to this particular shared-network
// start here.
"subnet6": [
// This is the first subnet.
{
"preferred-lifetime": 30,
"rapid-commit": false,
"rebind-timer": 20,
// It is possible to override some values here.
"relay": {
"ip-address": "2001:db8:1::123"
},
"renew-timer": 10,
"reservation-mode": "all",
"subnet": "2001:db8:1::/64",
"pools": [ { "pool": "2001:db8:1:abcd::/64" } ],
"valid-lifetime": 40
},
// This is the second subnet.
{
"preferred-lifetime": 30,
"pools": [ { "pool": "3000:db8::/64" } ],
"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
} ]
}
}
This diff is collapsed.
......@@ -30,6 +30,8 @@ bool start_token_flag = false;
isc::dhcp::Parser4Context::ParserType start_token_value;
unsigned int comment_start_line = 0;
using namespace isc::dhcp;
};
/* To avoid the call to exit... oops! */
......@@ -409,6 +411,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -419,6 +422,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -429,6 +433,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -447,12 +452,22 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
\"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:
......@@ -470,6 +485,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -484,6 +500,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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:
......@@ -549,6 +566,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
\"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_);
......@@ -585,6 +603,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
\"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_);
......@@ -874,6 +893,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
\"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_);
......@@ -1300,6 +1320,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -1310,6 +1331,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......@@ -1322,6 +1344,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
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_);
......
This diff is collapsed.
......@@ -402,94 +402,95 @@ namespace isc { namespace dhcp {
TOKEN_RECORD_TYPES = 310,
TOKEN_ENCAPSULATE = 311,
TOKEN_ARRAY = 312,
TOKEN_POOLS = 313,
TOKEN_POOL = 314,
TOKEN_USER_CONTEXT = 315,
TOKEN_SUBNET = 316,
TOKEN_INTERFACE = 317,
TOKEN_INTERFACE_ID = 318,
TOKEN_ID = 319,
TOKEN_RAPID_COMMIT = 320,
TOKEN_RESERVATION_MODE = 321,
TOKEN_DISABLED = 322,
TOKEN_OUT_OF_POOL = 323,
TOKEN_ALL = 324,
TOKEN_HOST_RESERVATION_IDENTIFIERS = 325,
TOKEN_CLIENT_CLASSES = 326,
TOKEN_TEST = 327,
TOKEN_CLIENT_CLASS = 328,
TOKEN_RESERVATIONS = 329,
TOKEN_DUID = 330,
TOKEN_HW_ADDRESS = 331,
TOKEN_CIRCUIT_ID = 332,
TOKEN_CLIENT_ID = 333,
TOKEN_HOSTNAME = 334,
TOKEN_FLEX_ID = 335,
TOKEN_RELAY = 336,
TOKEN_IP_ADDRESS = 337,
TOKEN_HOOKS_LIBRARIES = 338,
TOKEN_LIBRARY = 339,
TOKEN_PARAMETERS = 340,
TOKEN_EXPIRED_LEASES_PROCESSING = 341,
TOKEN_RECLAIM_TIMER_WAIT_TIME = 342,
TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 343,
TOKEN_HOLD_RECLAIMED_TIME = 344,
TOKEN_MAX_RECLAIM_LEASES = 345,
TOKEN_MAX_RECLAIM_TIME = 346,
TOKEN_UNWARNED_RECLAIM_CYCLES = 347,
TOKEN_DHCP4O6_PORT = 348,
TOKEN_CONTROL_SOCKET = 349,
TOKEN_SOCKET_TYPE = 350,
TOKEN_SOCKET_NAME = 351,
TOKEN_DHCP_DDNS = 352,
TOKEN_ENABLE_UPDATES = 353,
TOKEN_QUALIFYING_SUFFIX = 354,
TOKEN_SERVER_IP = 355,
TOKEN_SERVER_PORT = 356,
TOKEN_SENDER_IP = 357,
TOKEN_SENDER_PORT = 358,
TOKEN_MAX_QUEUE_SIZE = 359,
TOKEN_NCR_PROTOCOL = 360,
TOKEN_NCR_FORMAT = 361,
TOKEN_ALWAYS_INCLUDE_FQDN = 362,
TOKEN_OVERRIDE_NO_UPDATE = 363,
TOKEN_OVERRIDE_CLIENT_UPDATE = 364,
TOKEN_REPLACE_CLIENT_NAME = 365,
TOKEN_GENERATED_PREFIX = 366,
TOKEN_TCP = 367,
TOKEN_JSON = 368,
TOKEN_WHEN_PRESENT = 369,
TOKEN_NEVER = 370,
TOKEN_ALWAYS = 371,
TOKEN_WHEN_NOT_PRESENT = 372,
TOKEN_LOGGING = 373,
TOKEN_LOGGERS = 374,
TOKEN_OUTPUT_OPTIONS = 375,
TOKEN_OUTPUT = 376,
TOKEN_DEBUGLEVEL = 377,
TOKEN_SEVERITY = 378,
TOKEN_FLUSH = 379,
TOKEN_MAXSIZE = 380,
TOKEN_MAXVER = 381,
TOKEN_DHCP6 = 382,
TOKEN_DHCPDDNS = 383,
TOKEN_CONTROL_AGENT = 384,
TOKEN_TOPLEVEL_JSON = 385,
TOKEN_TOPLEVEL_DHCP4 = 386,
TOKEN_SUB_DHCP4 = 387,
TOKEN_SUB_INTERFACES4 = 388,
TOKEN_SUB_SUBNET4 = 389,
TOKEN_SUB_POOL4 = 390,
TOKEN_SUB_RESERVATION = 391,
TOKEN_SUB_OPTION_DEFS = 392,
TOKEN_SUB_OPTION_DEF = 393,
TOKEN_SUB_OPTION_DATA = 394,
TOKEN_SUB_HOOKS_LIBRARY = 395,
TOKEN_SUB_DHCP_DDNS = 396,
TOKEN_STRING = 397,
TOKEN_INTEGER = 398,
TOKEN_FLOAT = 399,
TOKEN_BOOLEAN = 400
TOKEN_SHARED_NETWORKS = 313,
TOKEN_POOLS = 314,
TOKEN_POOL = 315,
TOKEN_USER_CONTEXT = 316,
TOKEN_SUBNET = 317,
TOKEN_INTERFACE = 318,
TOKEN_INTERFACE_ID = 319,
TOKEN_ID = 320,
TOKEN_RAPID_COMMIT = 321,
TOKEN_RESERVATION_MODE = 322,
TOKEN_DISABLED = 323,
TOKEN_OUT_OF_POOL = 324,
TOKEN_ALL = 325,
TOKEN_HOST_RESERVATION_IDENTIFIERS = 326,
TOKEN_CLIENT_CLASSES = 327,
TOKEN_TEST = 328,
TOKEN_CLIENT_CLASS = 329,
TOKEN_RESERVATIONS = 330,
TOKEN_DUID = 331,
TOKEN_HW_ADDRESS = 332,
TOKEN_CIRCUIT_ID = 333,
TOKEN_CLIENT_ID = 334,
TOKEN_HOSTNAME = 335,
TOKEN_FLEX_ID = 336,
TOKEN_RELAY = 337,
TOKEN_IP_ADDRESS = 338,
TOKEN_HOOKS_LIBRARIES = 339,
TOKEN_LIBRARY = 340,
TOKEN_PARAMETERS = 341,
TOKEN_EXPIRED_LEASES_PROCESSING = 342,
TOKEN_RECLAIM_TIMER_WAIT_TIME = 343,
TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 344,
TOKEN_HOLD_RECLAIMED_TIME = 345,
TOKEN_MAX_RECLAIM_LEASES = 346,
TOKEN_MAX_RECLAIM_TIME = 347,
TOKEN_UNWARNED_RECLAIM_CYCLES = 348,
TOKEN_DHCP4O6_PORT = 349,
TOKEN_CONTROL_SOCKET = 350,
TOKEN_SOCKET_TYPE = 351,
TOKEN_SOCKET_NAME = 352,
TOKEN_DHCP_DDNS = 353,
TOKEN_ENABLE_UPDATES = 354,
TOKEN_QUALIFYING_SUFFIX = 355,
TOKEN_SERVER_IP = 356,
TOKEN_SERVER_PORT = 357,
TOKEN_SENDER_IP = 358,
TOKEN_SENDER_PORT = 359,
TOKEN_MAX_QUEUE_SIZE = 360,
TOKEN_NCR_PROTOCOL = 361,
TOKEN_NCR_FORMAT = 362,
TOKEN_ALWAYS_INCLUDE_FQDN = 363,
TOKEN_OVERRIDE_NO_UPDATE = 364,
TOKEN_OVERRIDE_CLIENT_UPDATE = 365,
TOKEN_REPLACE_CLIENT_NAME = 366,
TOKEN_GENERATED_PREFIX = 367,
TOKEN_TCP = 368,
TOKEN_JSON = 369,
TOKEN_WHEN_PRESENT = 370,
TOKEN_NEVER = 371,
TOKEN_ALWAYS = 372,
TOKEN_WHEN_NOT_PRESENT = 373,
TOKEN_LOGGING = 374,
TOKEN_LOGGERS = 375,
TOKEN_OUTPUT_OPTIONS = 376,
TOKEN_OUTPUT = 377,
TOKEN_DEBUGLEVEL = 378,
TOKEN_SEVERITY = 379,
TOKEN_FLUSH = 380,
TOKEN_MAXSIZE = 381,
TOKEN_MAXVER = 382,
TOKEN_DHCP6 = 383,
TOKEN_DHCPDDNS = 384,
TOKEN_CONTROL_AGENT = 385,
TOKEN_TOPLEVEL_JSON = 386,
TOKEN_TOPLEVEL_DHCP4 = 387,
TOKEN_SUB_DHCP4 = 388,
TOKEN_SUB_INTERFACES4 = 389,
TOKEN_SUB_SUBNET4 = 390,
TOKEN_SUB_POOL4 = 391,
TOKEN_SUB_RESERVATION = 392,
TOKEN_SUB_OPTION_DEFS = 393,
TOKEN_SUB_OPTION_DEF = 394,
TOKEN_SUB_OPTION_DATA = 395,
TOKEN_SUB_HOOKS_LIBRARY = 396,
TOKEN_SUB_DHCP_DDNS = 397,
TOKEN_STRING = 398,
TOKEN_INTEGER = 399,
TOKEN_FLOAT = 400,
TOKEN_BOOLEAN = 401
};
};
......@@ -828,6 +829,10 @@ namespace isc { namespace dhcp {
symbol_type
make_ARRAY (const location_type& l);
static inline
symbol_type
make_SHARED_NETWORKS (const location_type& l);
static inline
symbol_type
make_POOLS (const location_type& l);
......@@ -1385,12 +1390,12 @@ namespace isc { namespace dhcp {
enum
{
yyeof_ = 0,
yylast_ = 756, ///< Last index in yytable_.
yynnts_ = 321, ///< Number of nonterminal symbols.
yylast_ = 787, ///< Last index in yytable_.
yynnts_ = 329, ///< Number of nonterminal symbols.
yyfinal_ = 26, ///< Termination state number.
yyterror_ = 1,
yyerrcode_ = 256,
yyntokens_ = 146 ///< Number of tokens.
yyntokens_ = 147 ///< Number of tokens.
};
......@@ -1447,9 +1452,9 @@ namespace isc { namespace dhcp {
115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
145
145, 146
};
const unsigned int user_token_number_max_ = 400;
const unsigned int user_token_number_max_ = 401;
const token_number_type undef_token_ = 2;