From f0c5b59a0768564f1cd155b31a1ec8929769146d Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 3 Nov 2017 22:50:12 +0100 Subject: [PATCH 01/52] [5425] Extended syntax --- src/bin/dhcp4/dhcp4_lexer.ll | 1 + src/bin/dhcp4/dhcp4_parser.yy | 7 ++++--- src/bin/dhcp6/dhcp6_lexer.ll | 32 +++++++++++++++++--------------- src/bin/dhcp6/dhcp6_parser.yy | 8 +++++--- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index c0ea9459df..ba8f1f1944 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -791,6 +791,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::CLIENT_CLASSES: return isc::dhcp::Dhcp4Parser::make_CLIENT_CLASS(driver.loc_); diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 66ea540244..f72a5524c4 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1329,6 +1329,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list + | client_class | user_context | unknown_map_entry ; @@ -1535,11 +1536,11 @@ client_classes: CLIENT_CLASSES { ctx.leave(); }; -client_classes_list: client_class - | client_classes_list COMMA client_class +client_classes_list: client_class_entry + | client_classes_list COMMA client_class_entry ; -client_class: LCURLY_BRACKET { +client_class_entry: LCURLY_BRACKET { ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 6d891067c4..a31486b3fb 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -607,7 +607,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_); @@ -618,7 +618,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_); @@ -629,7 +629,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_); @@ -640,7 +640,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_); @@ -659,7 +659,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"subnet6\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_); @@ -668,7 +668,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"shared-networks\" { switch (driver.ctx_) { - case Parser6Context::DHCP6: + case isc::dhcp::Parser6Context::DHCP6: return Dhcp6Parser::make_SHARED_NETWORKS(driver.loc_); default: return Dhcp6Parser::make_STRING("shared-networks", driver.loc_); @@ -693,7 +693,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_); @@ -709,7 +709,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_); @@ -829,7 +829,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"interface\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_); @@ -839,7 +839,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"interface-id\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_); @@ -858,7 +858,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"rapid-commit\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_); @@ -868,7 +868,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"reservation-mode\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_); @@ -1043,8 +1043,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("client-class", driver.loc_); @@ -1177,7 +1179,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"relay\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_); @@ -1187,7 +1189,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"ip-address\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: - return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("ip-address", driver.loc_); } diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 5b59e0dc5b..7ad030d55e 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1292,6 +1292,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list + | client_class | user_context | unknown_map_entry ; @@ -1366,6 +1367,7 @@ pd_pool_param: pd_prefix | pd_prefix_len | pd_delegated_len | option_data_list + | client_class | excluded_prefix | excluded_prefix_len | user_context @@ -1558,11 +1560,11 @@ client_classes: CLIENT_CLASSES { ctx.leave(); }; -client_classes_list: client_class - | client_classes_list COMMA client_class +client_classes_list: client_class_entry + | client_classes_list COMMA client_class_entry ; -client_class: LCURLY_BRACKET { +client_class_entry: LCURLY_BRACKET { ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); From 035609706627b5fd11a217663045341dcc388018 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 3 Nov 2017 21:51:59 +0000 Subject: [PATCH 02/52] [trac5425] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 191 ++-- src/bin/dhcp4/dhcp4_parser.cc | 1466 ++++++++++++++--------------- src/bin/dhcp4/dhcp4_parser.h | 20 +- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 170 ++-- src/bin/dhcp6/dhcp6_parser.cc | 1646 +++++++++++++++++---------------- src/bin/dhcp6/dhcp6_parser.h | 28 +- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 1772 insertions(+), 1761 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 54334ed8ee..5a1731e814 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -1584,16 +1584,16 @@ static const flex_int16_t yy_rule_linenum[158] = 464, 475, 484, 494, 503, 513, 528, 544, 553, 562, 571, 580, 590, 599, 609, 618, 627, 636, 646, 655, 664, 673, 682, 692, 701, 710, 719, 728, 737, 746, - 755, 764, 773, 782, 792, 803, 813, 822, 832, 842, - 852, 862, 872, 881, 891, 900, 909, 918, 927, 937, - 947, 957, 966, 975, 984, 993, 1002, 1011, 1020, 1029, + 755, 764, 773, 782, 792, 804, 814, 823, 833, 843, + 853, 863, 873, 882, 892, 901, 910, 919, 928, 938, + 948, 958, 967, 976, 985, 994, 1003, 1012, 1021, 1030, - 1038, 1047, 1056, 1065, 1074, 1083, 1092, 1101, 1110, 1119, - 1128, 1137, 1146, 1155, 1164, 1173, 1182, 1191, 1200, 1209, - 1219, 1229, 1239, 1249, 1259, 1269, 1279, 1289, 1299, 1308, - 1317, 1326, 1335, 1344, 1353, 1362, 1373, 1386, 1399, 1414, - 1512, 1517, 1522, 1527, 1528, 1529, 1530, 1531, 1532, 1534, - 1552, 1565, 1570, 1574, 1576, 1578, 1580 + 1039, 1048, 1057, 1066, 1075, 1084, 1093, 1102, 1111, 1120, + 1129, 1138, 1147, 1156, 1165, 1174, 1183, 1192, 1201, 1210, + 1220, 1230, 1240, 1250, 1260, 1270, 1280, 1290, 1300, 1309, + 1318, 1327, 1336, 1345, 1354, 1363, 1374, 1387, 1400, 1415, + 1513, 1518, 1523, 1528, 1529, 1530, 1531, 1532, 1533, 1535, + 1553, 1566, 1571, 1575, 1577, 1579, 1581 } ; /* The intent behind this definition is that it'll catch @@ -2963,6 +2963,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::CLIENT_CLASSES: return isc::dhcp::Dhcp4Parser::make_CLIENT_CLASS(driver.loc_); @@ -2973,7 +2974,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 803 "dhcp4_lexer.ll" +#line 804 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -2986,7 +2987,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 813 "dhcp4_lexer.ll" +#line 814 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2998,7 +2999,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 822 "dhcp4_lexer.ll" +#line 823 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3011,7 +3012,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 832 "dhcp4_lexer.ll" +#line 833 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3024,7 +3025,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 842 "dhcp4_lexer.ll" +#line 843 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3037,7 +3038,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 852 "dhcp4_lexer.ll" +#line 853 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3050,7 +3051,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 862 "dhcp4_lexer.ll" +#line 863 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3063,7 +3064,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 872 "dhcp4_lexer.ll" +#line 873 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3075,7 +3076,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 881 "dhcp4_lexer.ll" +#line 882 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3088,7 +3089,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 891 "dhcp4_lexer.ll" +#line 892 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3100,7 +3101,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 900 "dhcp4_lexer.ll" +#line 901 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3112,7 +3113,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 909 "dhcp4_lexer.ll" +#line 910 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3124,7 +3125,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 918 "dhcp4_lexer.ll" +#line 919 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3136,7 +3137,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 927 "dhcp4_lexer.ll" +#line 928 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3149,7 +3150,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 937 "dhcp4_lexer.ll" +#line 938 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3162,7 +3163,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 947 "dhcp4_lexer.ll" +#line 948 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3174,7 +3175,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 957 "dhcp4_lexer.ll" +#line 958 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3186,7 +3187,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 966 "dhcp4_lexer.ll" +#line 967 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3198,7 +3199,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 975 "dhcp4_lexer.ll" +#line 976 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3210,7 +3211,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 984 "dhcp4_lexer.ll" +#line 985 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3222,7 +3223,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 993 "dhcp4_lexer.ll" +#line 994 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3234,7 +3235,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1002 "dhcp4_lexer.ll" +#line 1003 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3246,7 +3247,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1011 "dhcp4_lexer.ll" +#line 1012 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3258,7 +3259,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1020 "dhcp4_lexer.ll" +#line 1021 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3270,7 +3271,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1029 "dhcp4_lexer.ll" +#line 1030 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3282,7 +3283,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1038 "dhcp4_lexer.ll" +#line 1039 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3294,7 +3295,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1047 "dhcp4_lexer.ll" +#line 1048 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3306,7 +3307,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1056 "dhcp4_lexer.ll" +#line 1057 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3318,7 +3319,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1065 "dhcp4_lexer.ll" +#line 1066 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3330,7 +3331,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1074 "dhcp4_lexer.ll" +#line 1075 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3342,7 +3343,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1083 "dhcp4_lexer.ll" +#line 1084 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3354,7 +3355,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1092 "dhcp4_lexer.ll" +#line 1093 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3366,7 +3367,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1101 "dhcp4_lexer.ll" +#line 1102 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3378,7 +3379,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1110 "dhcp4_lexer.ll" +#line 1111 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3390,7 +3391,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1119 "dhcp4_lexer.ll" +#line 1120 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3402,7 +3403,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1128 "dhcp4_lexer.ll" +#line 1129 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3414,7 +3415,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1137 "dhcp4_lexer.ll" +#line 1138 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3426,7 +3427,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1146 "dhcp4_lexer.ll" +#line 1147 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3438,7 +3439,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1155 "dhcp4_lexer.ll" +#line 1156 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3450,7 +3451,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1164 "dhcp4_lexer.ll" +#line 1165 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3462,7 +3463,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1173 "dhcp4_lexer.ll" +#line 1174 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3474,7 +3475,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1182 "dhcp4_lexer.ll" +#line 1183 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3486,7 +3487,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1191 "dhcp4_lexer.ll" +#line 1192 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3498,7 +3499,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1200 "dhcp4_lexer.ll" +#line 1201 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3510,7 +3511,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1209 "dhcp4_lexer.ll" +#line 1210 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3523,7 +3524,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1219 "dhcp4_lexer.ll" +#line 1220 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3536,7 +3537,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1229 "dhcp4_lexer.ll" +#line 1230 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3549,7 +3550,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1239 "dhcp4_lexer.ll" +#line 1240 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3562,7 +3563,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1249 "dhcp4_lexer.ll" +#line 1250 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3575,7 +3576,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1259 "dhcp4_lexer.ll" +#line 1260 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3588,7 +3589,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1269 "dhcp4_lexer.ll" +#line 1270 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3601,7 +3602,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1279 "dhcp4_lexer.ll" +#line 1280 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3614,7 +3615,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1289 "dhcp4_lexer.ll" +#line 1290 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3627,7 +3628,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1299 "dhcp4_lexer.ll" +#line 1300 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3639,7 +3640,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1308 "dhcp4_lexer.ll" +#line 1309 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3651,7 +3652,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1317 "dhcp4_lexer.ll" +#line 1318 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3663,7 +3664,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1326 "dhcp4_lexer.ll" +#line 1327 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3675,7 +3676,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1335 "dhcp4_lexer.ll" +#line 1336 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3687,7 +3688,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1344 "dhcp4_lexer.ll" +#line 1345 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3699,7 +3700,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1353 "dhcp4_lexer.ll" +#line 1354 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3711,7 +3712,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1362 "dhcp4_lexer.ll" +#line 1363 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3725,7 +3726,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1373 "dhcp4_lexer.ll" +#line 1374 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3741,7 +3742,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1386 "dhcp4_lexer.ll" +#line 1387 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3757,7 +3758,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1399 "dhcp4_lexer.ll" +#line 1400 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3773,7 +3774,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1414 "dhcp4_lexer.ll" +#line 1415 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3875,7 +3876,7 @@ YY_RULE_SETUP case 141: /* rule 141 can match eol */ YY_RULE_SETUP -#line 1512 "dhcp4_lexer.ll" +#line 1513 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3884,7 +3885,7 @@ YY_RULE_SETUP case 142: /* rule 142 can match eol */ YY_RULE_SETUP -#line 1517 "dhcp4_lexer.ll" +#line 1518 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3892,7 +3893,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1522 "dhcp4_lexer.ll" +#line 1523 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3900,37 +3901,37 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1527 "dhcp4_lexer.ll" +#line 1528 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 145: YY_RULE_SETUP -#line 1528 "dhcp4_lexer.ll" +#line 1529 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 146: YY_RULE_SETUP -#line 1529 "dhcp4_lexer.ll" +#line 1530 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 147: YY_RULE_SETUP -#line 1530 "dhcp4_lexer.ll" +#line 1531 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1531 "dhcp4_lexer.ll" +#line 1532 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1532 "dhcp4_lexer.ll" +#line 1533 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1534 "dhcp4_lexer.ll" +#line 1535 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3951,7 +3952,7 @@ YY_RULE_SETUP YY_BREAK case 151: YY_RULE_SETUP -#line 1552 "dhcp4_lexer.ll" +#line 1553 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -3967,7 +3968,7 @@ YY_RULE_SETUP YY_BREAK case 152: YY_RULE_SETUP -#line 1565 "dhcp4_lexer.ll" +#line 1566 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -3975,33 +3976,33 @@ YY_RULE_SETUP YY_BREAK case 153: YY_RULE_SETUP -#line 1570 "dhcp4_lexer.ll" +#line 1571 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1574 "dhcp4_lexer.ll" +#line 1575 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 155: YY_RULE_SETUP -#line 1576 "dhcp4_lexer.ll" +#line 1577 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 156: YY_RULE_SETUP -#line 1578 "dhcp4_lexer.ll" +#line 1579 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 157: YY_RULE_SETUP -#line 1580 "dhcp4_lexer.ll" +#line 1581 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1582 "dhcp4_lexer.ll" +#line 1583 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4027,10 +4028,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 158: YY_RULE_SETUP -#line 1605 "dhcp4_lexer.ll" +#line 1606 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4033 "dhcp4_lexer.cc" +#line 4034 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -5135,7 +5136,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1605 "dhcp4_lexer.ll" +#line 1606 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index e77398b20a..a70202b350 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -259,8 +259,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.move< ElementPtr > (that.value); break; @@ -301,8 +301,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.copy< ElementPtr > (that.value); break; @@ -428,14 +428,14 @@ namespace isc { namespace dhcp { #line 429 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 439: // ncr_protocol_value + case 440: // ncr_protocol_value #line 224 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 436 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 447: // replace_client_name_value + case 448: // replace_client_name_value #line 224 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } @@ -645,8 +645,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; @@ -2275,16 +2275,16 @@ namespace isc { namespace dhcp { #line 2276 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 374: -#line 1336 "dhcp4_parser.yy" // lalr1.cc:859 + case 375: +#line 1337 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2284 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 375: -#line 1338 "dhcp4_parser.yy" // lalr1.cc:859 + case 376: +#line 1339 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); @@ -2293,16 +2293,16 @@ namespace isc { namespace dhcp { #line 2294 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 376: -#line 1344 "dhcp4_parser.yy" // lalr1.cc:859 + case 377: +#line 1345 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2302 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 377: -#line 1346 "dhcp4_parser.yy" // lalr1.cc:859 + case 378: +#line 1347 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2310,8 +2310,8 @@ namespace isc { namespace dhcp { #line 2311 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1354 "dhcp4_parser.yy" // lalr1.cc:859 + case 379: +#line 1355 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); @@ -2321,8 +2321,8 @@ namespace isc { namespace dhcp { #line 2322 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1359 "dhcp4_parser.yy" // lalr1.cc:859 + case 380: +#line 1360 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2330,8 +2330,8 @@ namespace isc { namespace dhcp { #line 2331 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1372 "dhcp4_parser.yy" // lalr1.cc:859 + case 385: +#line 1373 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2340,8 +2340,8 @@ namespace isc { namespace dhcp { #line 2341 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1376 "dhcp4_parser.yy" // lalr1.cc:859 + case 386: +#line 1377 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); @@ -2349,8 +2349,8 @@ namespace isc { namespace dhcp { #line 2350 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1381 "dhcp4_parser.yy" // lalr1.cc:859 + case 387: +#line 1382 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2359,8 +2359,8 @@ namespace isc { namespace dhcp { #line 2360 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1385 "dhcp4_parser.yy" // lalr1.cc:859 + case 388: +#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed @@ -2368,16 +2368,16 @@ namespace isc { namespace dhcp { #line 2369 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 405: -#line 1414 "dhcp4_parser.yy" // lalr1.cc:859 + case 406: +#line 1415 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2377 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 406: -#line 1416 "dhcp4_parser.yy" // lalr1.cc:859 + case 407: +#line 1417 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); @@ -2386,16 +2386,16 @@ namespace isc { namespace dhcp { #line 2387 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 407: -#line 1422 "dhcp4_parser.yy" // lalr1.cc:859 + case 408: +#line 1423 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2395 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 408: -#line 1424 "dhcp4_parser.yy" // lalr1.cc:859 + case 409: +#line 1425 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); @@ -2404,16 +2404,16 @@ namespace isc { namespace dhcp { #line 2405 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 409: -#line 1430 "dhcp4_parser.yy" // lalr1.cc:859 + case 410: +#line 1431 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2413 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 410: -#line 1432 "dhcp4_parser.yy" // lalr1.cc:859 + case 411: +#line 1433 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); @@ -2422,16 +2422,16 @@ namespace isc { namespace dhcp { #line 2423 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 411: -#line 1438 "dhcp4_parser.yy" // lalr1.cc:859 + case 412: +#line 1439 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2431 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 412: -#line 1440 "dhcp4_parser.yy" // lalr1.cc:859 + case 413: +#line 1441 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); @@ -2440,16 +2440,16 @@ namespace isc { namespace dhcp { #line 2441 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1446 "dhcp4_parser.yy" // lalr1.cc:859 + case 414: +#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2449 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1448 "dhcp4_parser.yy" // lalr1.cc:859 + case 415: +#line 1449 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); @@ -2458,16 +2458,16 @@ namespace isc { namespace dhcp { #line 2459 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1454 "dhcp4_parser.yy" // lalr1.cc:859 + case 416: +#line 1455 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2467 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1456 "dhcp4_parser.yy" // lalr1.cc:859 + case 417: +#line 1457 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); @@ -2476,16 +2476,16 @@ namespace isc { namespace dhcp { #line 2477 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1462 "dhcp4_parser.yy" // lalr1.cc:859 + case 418: +#line 1463 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2485 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1464 "dhcp4_parser.yy" // lalr1.cc:859 + case 419: +#line 1465 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); @@ -2494,16 +2494,16 @@ namespace isc { namespace dhcp { #line 2495 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1470 "dhcp4_parser.yy" // lalr1.cc:859 + case 420: +#line 1471 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2503 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1472 "dhcp4_parser.yy" // lalr1.cc:859 + case 421: +#line 1473 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); @@ -2512,16 +2512,16 @@ namespace isc { namespace dhcp { #line 2513 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 + case 422: +#line 1479 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2521 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 + case 423: +#line 1481 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); @@ -2530,16 +2530,16 @@ namespace isc { namespace dhcp { #line 2531 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 + case 424: +#line 1487 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2539 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 + case 425: +#line 1489 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); @@ -2548,8 +2548,8 @@ namespace isc { namespace dhcp { #line 2549 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 + case 426: +#line 1495 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); @@ -2559,8 +2559,8 @@ namespace isc { namespace dhcp { #line 2560 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1499 "dhcp4_parser.yy" // lalr1.cc:859 + case 427: +#line 1500 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2568,8 +2568,8 @@ namespace isc { namespace dhcp { #line 2569 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1507 "dhcp4_parser.yy" // lalr1.cc:859 + case 428: +#line 1508 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); @@ -2579,8 +2579,8 @@ namespace isc { namespace dhcp { #line 2580 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1512 "dhcp4_parser.yy" // lalr1.cc:859 + case 429: +#line 1513 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2588,16 +2588,16 @@ namespace isc { namespace dhcp { #line 2589 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1517 "dhcp4_parser.yy" // lalr1.cc:859 + case 430: +#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2597 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1519 "dhcp4_parser.yy" // lalr1.cc:859 + case 431: +#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); @@ -2606,8 +2606,8 @@ namespace isc { namespace dhcp { #line 2607 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1528 "dhcp4_parser.yy" // lalr1.cc:859 + case 432: +#line 1529 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); @@ -2617,8 +2617,8 @@ namespace isc { namespace dhcp { #line 2618 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1533 "dhcp4_parser.yy" // lalr1.cc:859 + case 433: +#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2626,8 +2626,8 @@ namespace isc { namespace dhcp { #line 2627 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1542 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1543 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2636,8 +2636,8 @@ namespace isc { namespace dhcp { #line 2637 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1546 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1547 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2646,16 +2646,16 @@ namespace isc { namespace dhcp { #line 2647 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 450: -#line 1572 "dhcp4_parser.yy" // lalr1.cc:859 + case 451: +#line 1573 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2655 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 451: -#line 1574 "dhcp4_parser.yy" // lalr1.cc:859 + case 452: +#line 1575 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); @@ -2664,8 +2664,8 @@ namespace isc { namespace dhcp { #line 2665 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 452: -#line 1584 "dhcp4_parser.yy" // lalr1.cc:859 + case 453: +#line 1585 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); @@ -2673,8 +2673,8 @@ namespace isc { namespace dhcp { #line 2674 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 453: -#line 1591 "dhcp4_parser.yy" // lalr1.cc:859 + case 454: +#line 1592 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); @@ -2684,8 +2684,8 @@ namespace isc { namespace dhcp { #line 2685 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 454: -#line 1596 "dhcp4_parser.yy" // lalr1.cc:859 + case 455: +#line 1597 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2693,16 +2693,16 @@ namespace isc { namespace dhcp { #line 2694 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 459: -#line 1609 "dhcp4_parser.yy" // lalr1.cc:859 + case 460: +#line 1610 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2702 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 460: -#line 1611 "dhcp4_parser.yy" // lalr1.cc:859 + case 461: +#line 1612 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); @@ -2711,16 +2711,16 @@ namespace isc { namespace dhcp { #line 2712 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 461: -#line 1617 "dhcp4_parser.yy" // lalr1.cc:859 + case 462: +#line 1618 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2720 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 462: -#line 1619 "dhcp4_parser.yy" // lalr1.cc:859 + case 463: +#line 1620 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); @@ -2729,8 +2729,8 @@ namespace isc { namespace dhcp { #line 2730 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 463: -#line 1627 "dhcp4_parser.yy" // lalr1.cc:859 + case 464: +#line 1628 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); @@ -2740,8 +2740,8 @@ namespace isc { namespace dhcp { #line 2741 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 464: -#line 1632 "dhcp4_parser.yy" // lalr1.cc:859 + case 465: +#line 1633 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2751,8 +2751,8 @@ namespace isc { namespace dhcp { #line 2752 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 465: -#line 1639 "dhcp4_parser.yy" // lalr1.cc:859 + case 466: +#line 1640 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2761,8 +2761,8 @@ namespace isc { namespace dhcp { #line 2762 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1643 "dhcp4_parser.yy" // lalr1.cc:859 + case 467: +#line 1644 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2771,8 +2771,8 @@ namespace isc { namespace dhcp { #line 2772 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1670 "dhcp4_parser.yy" // lalr1.cc:859 + case 485: +#line 1671 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); @@ -2780,16 +2780,16 @@ namespace isc { namespace dhcp { #line 2781 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1675 "dhcp4_parser.yy" // lalr1.cc:859 + case 486: +#line 1676 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2789 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1677 "dhcp4_parser.yy" // lalr1.cc:859 + case 487: +#line 1678 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); @@ -2798,16 +2798,16 @@ namespace isc { namespace dhcp { #line 2799 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1683 "dhcp4_parser.yy" // lalr1.cc:859 + case 488: +#line 1684 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2807 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1685 "dhcp4_parser.yy" // lalr1.cc:859 + case 489: +#line 1686 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); @@ -2816,8 +2816,8 @@ namespace isc { namespace dhcp { #line 2817 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1691 "dhcp4_parser.yy" // lalr1.cc:859 + case 490: +#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); @@ -2825,16 +2825,16 @@ namespace isc { namespace dhcp { #line 2826 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1696 "dhcp4_parser.yy" // lalr1.cc:859 + case 491: +#line 1697 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2834 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1698 "dhcp4_parser.yy" // lalr1.cc:859 + case 492: +#line 1699 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); @@ -2843,8 +2843,8 @@ namespace isc { namespace dhcp { #line 2844 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 492: -#line 1704 "dhcp4_parser.yy" // lalr1.cc:859 + case 493: +#line 1705 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); @@ -2852,8 +2852,8 @@ namespace isc { namespace dhcp { #line 2853 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 493: -#line 1709 "dhcp4_parser.yy" // lalr1.cc:859 + case 494: +#line 1710 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); @@ -2861,16 +2861,16 @@ namespace isc { namespace dhcp { #line 2862 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 494: -#line 1714 "dhcp4_parser.yy" // lalr1.cc:859 + case 495: +#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } #line 2870 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 495: -#line 1716 "dhcp4_parser.yy" // lalr1.cc:859 + case 496: +#line 1717 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2878,28 +2878,28 @@ namespace isc { namespace dhcp { #line 2879 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 496: -#line 1722 "dhcp4_parser.yy" // lalr1.cc:859 + case 497: +#line 1723 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } #line 2885 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 497: -#line 1723 "dhcp4_parser.yy" // lalr1.cc:859 + case 498: +#line 1724 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 2891 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 498: -#line 1726 "dhcp4_parser.yy" // lalr1.cc:859 + case 499: +#line 1727 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } #line 2899 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 499: -#line 1728 "dhcp4_parser.yy" // lalr1.cc:859 + case 500: +#line 1729 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); @@ -2908,8 +2908,8 @@ namespace isc { namespace dhcp { #line 2909 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 500: -#line 1734 "dhcp4_parser.yy" // lalr1.cc:859 + case 501: +#line 1735 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); @@ -2917,8 +2917,8 @@ namespace isc { namespace dhcp { #line 2918 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 501: -#line 1739 "dhcp4_parser.yy" // lalr1.cc:859 + case 502: +#line 1740 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); @@ -2926,8 +2926,8 @@ namespace isc { namespace dhcp { #line 2927 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 502: -#line 1744 "dhcp4_parser.yy" // lalr1.cc:859 + case 503: +#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); @@ -2935,16 +2935,16 @@ namespace isc { namespace dhcp { #line 2936 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1749 "dhcp4_parser.yy" // lalr1.cc:859 + case 504: +#line 1750 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } #line 2944 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1751 "dhcp4_parser.yy" // lalr1.cc:859 + case 505: +#line 1752 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2952,40 +2952,40 @@ namespace isc { namespace dhcp { #line 2953 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1757 "dhcp4_parser.yy" // lalr1.cc:859 + case 506: +#line 1758 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } #line 2961 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1760 "dhcp4_parser.yy" // lalr1.cc:859 + case 507: +#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } #line 2969 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1763 "dhcp4_parser.yy" // lalr1.cc:859 + case 508: +#line 1764 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } #line 2977 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 + case 509: +#line 1767 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } #line 2985 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1769 "dhcp4_parser.yy" // lalr1.cc:859 + case 510: +#line 1770 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); @@ -2993,16 +2993,16 @@ namespace isc { namespace dhcp { #line 2994 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1775 "dhcp4_parser.yy" // lalr1.cc:859 + case 511: +#line 1776 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3002 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1777 "dhcp4_parser.yy" // lalr1.cc:859 + case 512: +#line 1778 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); @@ -3011,16 +3011,16 @@ namespace isc { namespace dhcp { #line 3012 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1785 "dhcp4_parser.yy" // lalr1.cc:859 + case 513: +#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3020 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1787 "dhcp4_parser.yy" // lalr1.cc:859 + case 514: +#line 1788 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3028,16 +3028,16 @@ namespace isc { namespace dhcp { #line 3029 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1792 "dhcp4_parser.yy" // lalr1.cc:859 + case 515: +#line 1793 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3037 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1794 "dhcp4_parser.yy" // lalr1.cc:859 + case 516: +#line 1795 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3045,16 +3045,16 @@ namespace isc { namespace dhcp { #line 3046 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1799 "dhcp4_parser.yy" // lalr1.cc:859 + case 517: +#line 1800 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3054 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1801 "dhcp4_parser.yy" // lalr1.cc:859 + case 518: +#line 1802 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3062,8 +3062,8 @@ namespace isc { namespace dhcp { #line 3063 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1811 "dhcp4_parser.yy" // lalr1.cc:859 + case 519: +#line 1812 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); @@ -3073,8 +3073,8 @@ namespace isc { namespace dhcp { #line 3074 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1816 "dhcp4_parser.yy" // lalr1.cc:859 + case 520: +#line 1817 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3082,8 +3082,8 @@ namespace isc { namespace dhcp { #line 3083 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1833 "dhcp4_parser.yy" // lalr1.cc:859 + case 524: +#line 1834 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); @@ -3093,8 +3093,8 @@ namespace isc { namespace dhcp { #line 3094 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1838 "dhcp4_parser.yy" // lalr1.cc:859 + case 525: +#line 1839 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3102,8 +3102,8 @@ namespace isc { namespace dhcp { #line 3103 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1850 "dhcp4_parser.yy" // lalr1.cc:859 + case 528: +#line 1851 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); @@ -3112,16 +3112,16 @@ namespace isc { namespace dhcp { #line 3113 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1854 "dhcp4_parser.yy" // lalr1.cc:859 + case 529: +#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3121 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1869 "dhcp4_parser.yy" // lalr1.cc:859 + case 537: +#line 1870 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); @@ -3129,16 +3129,16 @@ namespace isc { namespace dhcp { #line 3130 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1874 "dhcp4_parser.yy" // lalr1.cc:859 + case 538: +#line 1875 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3138 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1876 "dhcp4_parser.yy" // lalr1.cc:859 + case 539: +#line 1877 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); @@ -3147,8 +3147,8 @@ namespace isc { namespace dhcp { #line 3148 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1882 "dhcp4_parser.yy" // lalr1.cc:859 + case 540: +#line 1883 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); @@ -3158,8 +3158,8 @@ namespace isc { namespace dhcp { #line 3159 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1887 "dhcp4_parser.yy" // lalr1.cc:859 + case 541: +#line 1888 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3167,8 +3167,8 @@ namespace isc { namespace dhcp { #line 3168 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1896 "dhcp4_parser.yy" // lalr1.cc:859 + case 544: +#line 1897 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3177,24 +3177,24 @@ namespace isc { namespace dhcp { #line 3178 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1900 "dhcp4_parser.yy" // lalr1.cc:859 + case 545: +#line 1901 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3186 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1914 "dhcp4_parser.yy" // lalr1.cc:859 + case 552: +#line 1915 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3194 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1916 "dhcp4_parser.yy" // lalr1.cc:859 + case 553: +#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); @@ -3203,8 +3203,8 @@ namespace isc { namespace dhcp { #line 3204 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1922 "dhcp4_parser.yy" // lalr1.cc:859 + case 554: +#line 1923 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); @@ -3212,8 +3212,8 @@ namespace isc { namespace dhcp { #line 3213 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1927 "dhcp4_parser.yy" // lalr1.cc:859 + case 555: +#line 1928 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); @@ -3221,8 +3221,8 @@ namespace isc { namespace dhcp { #line 3222 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1932 "dhcp4_parser.yy" // lalr1.cc:859 + case 556: +#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); @@ -3486,103 +3486,104 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -713; + const short int Dhcp4Parser::yypact_ninf_ = -694; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 248, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, 40, 32, 35, 43, 45, 49, 65, - 67, 71, 78, 97, 106, 115, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - 32, -48, 8, 140, 113, 22, 4, 180, 70, -1, - 141, -27, 266, -713, 161, 196, 202, 224, 230, -713, - -713, -713, -713, -713, 252, -713, 94, -713, -713, -713, - -713, -713, -713, -713, 253, 271, -713, -713, -713, -713, - -713, 284, 285, 286, 287, -713, -713, -713, -713, -713, - -713, -713, -713, 288, -713, -713, -713, 102, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, 290, 109, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, 291, 293, -713, -713, -713, -713, -713, -713, -713, - -713, -713, 128, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, 144, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, 228, - 240, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, 238, -713, -713, 296, -713, -713, -713, - 298, -713, -713, 246, 300, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, 301, 305, -713, -713, - -713, -713, 261, 309, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, 145, -713, -713, -713, 313, -713, - -713, 327, -713, 328, 329, -713, -713, 330, 332, 333, - -713, -713, -713, 184, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - 32, 32, -713, 158, 334, 335, 336, 339, 341, -713, - 8, -713, 342, 170, 208, 354, 355, 356, 357, 358, - 216, 247, 249, 251, 391, 393, 395, 396, 397, 398, - 399, 400, 258, 402, 403, 140, -713, 404, 405, 406, - 267, 113, -713, 25, 407, 409, 410, 411, 413, 414, - 415, 416, 274, 273, 419, 420, 421, 422, 22, -713, - 423, 4, -713, 424, 425, 426, 427, 428, 429, 430, - 431, -713, 180, -713, 432, 433, 292, 434, 436, 437, - 294, -713, -1, 438, 295, 297, -713, 141, 441, 443, - 55, -713, 299, 446, 447, 306, 448, 307, 308, 454, - 455, 311, 316, 318, 458, 464, 266, -713, -713, -713, - 465, 463, 466, 32, 32, 32, -713, 468, -713, -713, - 325, 326, 331, 469, 472, -713, -713, -713, -713, 475, - 477, 478, 479, 481, 482, 483, 484, -713, 485, 486, - -713, 489, 155, 171, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, 487, 493, -713, -713, -713, 343, - 344, 352, 494, 496, 360, 361, 362, -713, -713, 207, - 363, 495, 497, -713, 365, -713, 489, 366, 367, 368, - 369, 370, 371, 372, -713, 373, 374, -713, 375, 376, - 377, -713, -713, 378, -713, -713, -713, 379, 32, -713, - -713, 380, 381, -713, 382, -713, -713, 17, 384, -713, - -713, -713, -38, 383, -713, 32, 140, 408, -713, -713, - -713, 113, -713, -713, -713, 315, 315, 523, 525, 526, - 527, 129, 26, 528, 81, 126, 266, -713, -713, -713, - -713, -713, -713, -713, -713, 532, -713, 25, -713, -713, - -713, 530, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, 531, 453, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, 197, -713, 214, -713, - -713, 220, -713, -713, -713, -713, 536, 537, 538, 539, - 540, -713, -713, -713, 221, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, 231, -713, - 541, 542, -713, -713, 543, 545, -713, -713, 544, 548, - -713, -713, 546, 550, -713, -713, -713, -713, -713, -713, - 57, -713, -713, -713, -713, -713, -713, -713, 131, -713, - 549, 551, -713, 552, 553, 554, 555, 556, 557, 232, - -713, -713, -713, -713, -713, -713, -713, -713, -713, 239, - -713, -713, -713, 241, 417, 418, -713, -713, 559, 563, - -713, -713, 561, 565, -713, -713, 562, -713, 558, 408, - -713, -713, 567, 568, 569, 570, 435, 439, 440, 442, - 445, 571, 572, 315, -713, -713, 22, -713, 523, -1, - -713, 525, 141, -713, 526, 72, -713, 527, 129, -713, - 26, -713, -27, -713, 528, 449, 450, 451, 452, 456, - 457, 81, -713, 573, 574, 126, -713, -713, -713, 575, - 566, -713, 4, -713, 530, 180, -713, 531, 576, -713, - 578, -713, 254, 444, 459, 460, -713, -713, -713, -713, - -713, 461, 462, -713, 242, -713, 577, -713, 581, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - 250, -713, -713, -713, -713, -713, -713, -713, -713, -713, - 262, -713, -713, -713, -713, -713, -713, -713, -713, 467, - 470, -713, -713, 471, 264, -713, 585, -713, 473, 579, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, 72, -713, -713, -713, -713, -713, -713, - -713, -713, -713, 152, -713, -713, -18, 579, -713, -713, - 580, -713, -713, -713, 265, -713, -713, -713, -713, -713, - 590, 474, 591, -18, -713, 595, -713, 476, -713, 594, - -713, -713, 153, -713, 91, 594, -713, -713, 598, 605, - 606, 268, -713, -713, -713, -713, -713, -713, 607, 480, - 488, 490, 91, -713, 492, -713, -713, -713, -713, -713 + 234, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, 11, 22, 72, 80, 84, 102, 106, + 119, 176, 180, 187, 205, 222, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + 22, -109, -8, 31, 91, 131, 38, 138, -5, 213, + 150, -56, 243, -694, 65, 96, 153, 237, 246, -694, + -694, -694, -694, -694, 272, -694, 35, -694, -694, -694, + -694, -694, -694, -694, 279, 281, -694, -694, -694, -694, + -694, 282, 283, 284, 285, -694, -694, -694, -694, -694, + -694, -694, -694, 286, -694, -694, -694, 36, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, 287, 64, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + 288, 289, -694, -694, -694, -694, -694, -694, -694, -694, + -694, 92, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, 108, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, 291, + 294, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, 292, -694, -694, 290, -694, -694, -694, + 297, -694, -694, 295, 299, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, 300, 301, -694, -694, + -694, -694, 303, 305, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, 155, -694, -694, -694, 309, -694, + -694, 312, -694, 314, 316, -694, -694, 319, 321, 326, + -694, -694, -694, 156, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + 22, 22, -694, 185, 330, 331, 332, 333, 335, -694, + -8, -694, 337, 211, 212, 358, 359, 360, 376, 377, + 235, 236, 238, 239, 380, 383, 384, 386, 387, 388, + 389, 390, 249, 391, 393, 31, -694, 394, 395, 396, + 253, 91, -694, 397, 399, 400, 401, 402, 403, 404, + 405, 263, 262, 408, 409, 410, 411, 131, -694, 412, + 38, -694, 413, 414, 415, 416, 417, 418, 419, 420, + -694, 138, -694, 421, 422, 280, 424, 425, 426, 296, + -694, 213, 427, 298, 302, -694, 150, 428, 429, 51, + -694, 304, 430, 431, 293, 432, 308, 310, 434, 435, + 307, 313, 315, 437, 440, 243, -694, -694, -694, 442, + 441, 445, 22, 22, 22, -694, 451, -694, -694, 317, + 320, 322, 452, 454, -694, -694, -694, -694, 460, 462, + 464, 465, 466, 467, 468, 469, -694, 470, 471, -694, + 474, 136, 148, -694, -694, 328, 329, 334, 476, 475, + 338, 339, 340, -694, -694, 209, 341, 478, 481, -694, + 343, -694, 474, 344, 345, 346, 347, 348, 349, 350, + -694, 351, 352, -694, 353, 354, 355, -694, -694, 356, + -694, -694, -694, 357, 22, -694, -694, 361, 362, -694, + 363, -694, -694, 15, 398, -694, -694, -694, -71, 364, + -694, 22, 31, 381, -694, -694, -694, 91, -694, -694, + -694, 198, 198, 498, 499, 504, 505, 162, 506, 507, + 52, 179, 243, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, 509, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, 510, 433, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, 164, + -694, 173, -694, -694, 182, -694, -694, -694, -694, 514, + 516, 517, 518, 519, -694, -694, -694, 183, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, 207, -694, 520, 521, -694, -694, 522, 524, -694, + -694, 523, 527, -694, -694, 525, 529, -694, -694, -694, + -694, -694, -694, 77, -694, -694, -694, -694, -694, -694, + -694, 114, -694, -694, 528, 530, -694, 531, 532, 533, + 534, 535, 536, 244, -694, -694, -694, -694, -694, -694, + -694, -694, -694, 248, -694, -694, -694, 252, 379, -694, + 537, 538, -694, -694, 539, 541, -694, -694, 540, -694, + 542, 381, -694, -694, 543, 545, 546, 547, 406, 407, + 423, 436, 439, 548, 550, 198, -694, -694, 131, -694, + 498, 213, -694, 499, 150, -694, 504, 42, -694, 505, + 162, -694, 46, 506, -694, -56, -694, 507, 443, 444, + 446, 447, 448, 449, 52, -694, 551, 553, 179, -694, + -694, -694, 552, 556, 38, -694, 509, 138, -694, 510, + 557, -694, 555, -694, 30, 438, 453, 455, -694, -694, + -694, -694, -694, 456, 457, -694, 254, -694, 554, -694, + 558, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, 255, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, 559, + 560, -694, -694, -694, -694, 256, -694, -694, -694, -694, + -694, -694, -694, -694, 458, 459, -694, -694, 461, 258, + -694, 561, -694, 463, 564, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, 42, -694, + 568, -694, 46, -694, -694, -694, -694, -694, -694, -694, + -694, 127, -694, -694, 472, -694, 10, 564, -694, -694, + -694, 569, -694, -694, -694, 266, -694, -694, -694, -694, + -694, 570, 450, 571, 10, -694, 563, -694, 473, -694, + 572, -694, -694, 208, -694, 98, 572, -694, -694, 573, + 574, 576, 267, -694, -694, -694, -694, -694, -694, 577, + 479, 477, 480, 98, -694, 483, -694, -694, -694, -694, + -694 }; const unsigned short int @@ -3592,342 +3593,343 @@ namespace isc { namespace dhcp { 20, 22, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 34, 30, 29, 26, 27, 28, 33, 3, 31, 32, 54, 5, - 66, 7, 108, 9, 220, 11, 366, 13, 386, 15, - 295, 17, 303, 19, 338, 21, 185, 23, 465, 25, - 43, 37, 0, 0, 0, 0, 0, 388, 0, 305, + 66, 7, 108, 9, 220, 11, 366, 13, 387, 15, + 295, 17, 303, 19, 338, 21, 185, 23, 466, 25, + 43, 37, 0, 0, 0, 0, 0, 389, 0, 305, 340, 0, 0, 45, 0, 44, 0, 0, 38, 64, - 518, 512, 514, 516, 0, 63, 0, 56, 58, 60, - 61, 62, 59, 100, 0, 0, 405, 407, 409, 121, + 519, 513, 515, 517, 0, 63, 0, 56, 58, 60, + 61, 62, 59, 100, 0, 0, 406, 408, 410, 121, 123, 0, 0, 0, 0, 212, 293, 330, 268, 163, - 431, 177, 196, 0, 453, 463, 93, 0, 68, 70, + 432, 177, 196, 0, 454, 464, 93, 0, 68, 70, 71, 72, 73, 88, 89, 76, 77, 78, 79, 83, 84, 74, 75, 81, 82, 90, 91, 92, 80, 85, 86, 87, 110, 112, 116, 0, 0, 102, 104, 105, - 106, 107, 435, 249, 251, 253, 358, 376, 247, 255, - 257, 0, 0, 261, 259, 378, 427, 246, 224, 225, - 226, 238, 0, 222, 229, 242, 243, 244, 230, 231, - 234, 236, 232, 233, 227, 228, 245, 235, 239, 240, - 241, 237, 374, 373, 371, 0, 368, 370, 372, 425, - 413, 415, 419, 417, 423, 421, 411, 404, 400, 0, - 389, 390, 401, 402, 403, 397, 392, 398, 394, 395, - 396, 399, 393, 0, 320, 153, 0, 324, 322, 327, + 106, 107, 249, 251, 253, 358, 377, 247, 255, 257, + 0, 0, 261, 259, 379, 428, 246, 224, 225, 226, + 238, 0, 222, 229, 242, 243, 244, 230, 231, 234, + 236, 232, 233, 227, 228, 245, 235, 239, 240, 241, + 237, 375, 374, 372, 371, 0, 368, 370, 373, 426, + 414, 416, 420, 418, 424, 422, 412, 405, 401, 0, + 390, 391, 402, 403, 404, 398, 393, 399, 395, 396, + 397, 400, 394, 0, 320, 153, 0, 324, 322, 327, 0, 316, 317, 0, 306, 307, 309, 319, 310, 311, 312, 326, 313, 314, 315, 352, 0, 0, 350, 351, 354, 355, 0, 341, 342, 344, 345, 346, 347, 348, - 349, 192, 194, 189, 0, 187, 190, 191, 0, 485, - 487, 0, 490, 0, 0, 494, 498, 0, 0, 0, - 503, 510, 483, 0, 467, 469, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, 482, 42, + 349, 192, 194, 189, 0, 187, 190, 191, 0, 486, + 488, 0, 491, 0, 0, 495, 499, 0, 0, 0, + 504, 511, 484, 0, 468, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 42, 0, 0, 35, 0, 0, 0, 0, 0, 0, 53, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 109, 437, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, - 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, - 0, 387, 0, 296, 0, 0, 0, 0, 0, 0, - 0, 304, 0, 0, 0, 0, 339, 0, 0, 0, - 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 466, 46, 39, - 0, 0, 0, 0, 0, 0, 57, 0, 98, 99, - 0, 0, 0, 0, 0, 94, 95, 96, 97, 0, - 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, - 69, 0, 0, 0, 120, 103, 450, 448, 449, 443, - 444, 445, 446, 447, 0, 438, 439, 441, 442, 0, - 0, 0, 0, 0, 0, 0, 0, 266, 267, 0, - 0, 0, 0, 223, 0, 369, 0, 0, 0, 0, - 0, 0, 0, 0, 391, 0, 0, 318, 0, 0, - 0, 329, 308, 0, 356, 357, 343, 0, 0, 188, - 484, 0, 0, 489, 0, 492, 493, 0, 0, 500, - 501, 502, 0, 0, 468, 0, 0, 0, 513, 515, - 517, 0, 406, 408, 410, 0, 0, 214, 297, 332, - 270, 0, 0, 179, 0, 0, 0, 47, 111, 114, - 115, 113, 118, 119, 117, 0, 436, 0, 250, 252, - 254, 360, 36, 377, 248, 256, 258, 263, 264, 265, - 262, 260, 380, 0, 375, 426, 414, 416, 420, 418, - 424, 422, 412, 321, 154, 325, 323, 328, 353, 193, - 195, 486, 488, 491, 496, 497, 495, 499, 505, 506, - 507, 508, 509, 504, 511, 40, 0, 523, 0, 520, - 522, 0, 140, 146, 148, 150, 0, 0, 0, 0, - 0, 159, 161, 139, 0, 125, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 0, 218, - 0, 215, 216, 301, 0, 298, 299, 336, 0, 333, - 334, 274, 0, 271, 272, 172, 173, 174, 175, 176, - 0, 165, 167, 168, 169, 170, 171, 433, 0, 183, - 0, 180, 181, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 201, 202, 203, 204, 205, 459, 461, 0, - 455, 457, 458, 0, 49, 0, 440, 364, 0, 361, - 362, 384, 0, 381, 382, 429, 0, 65, 0, 0, - 519, 101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 122, 124, 0, 213, 0, 305, - 294, 0, 340, 331, 0, 0, 269, 0, 0, 164, - 0, 432, 0, 178, 0, 0, 0, 0, 0, 0, - 0, 0, 197, 0, 0, 0, 454, 464, 51, 0, - 50, 451, 0, 359, 0, 388, 379, 0, 0, 428, - 0, 521, 0, 0, 0, 0, 152, 155, 156, 157, - 158, 0, 0, 126, 0, 217, 0, 300, 0, 335, - 292, 291, 281, 282, 284, 278, 279, 280, 290, 289, - 0, 276, 283, 285, 286, 287, 288, 273, 166, 434, - 0, 182, 206, 207, 208, 209, 210, 211, 199, 0, - 0, 456, 48, 0, 0, 363, 0, 383, 0, 0, - 142, 143, 144, 145, 141, 147, 149, 151, 160, 162, - 219, 302, 337, 0, 275, 184, 460, 462, 52, 365, - 385, 430, 527, 0, 525, 277, 0, 0, 524, 539, - 0, 537, 535, 531, 0, 529, 533, 534, 532, 526, - 0, 0, 0, 0, 528, 0, 536, 0, 530, 0, - 538, 543, 0, 541, 0, 0, 540, 551, 0, 0, - 0, 0, 545, 547, 548, 549, 550, 542, 0, 0, - 0, 0, 0, 544, 0, 553, 554, 555, 546, 552 + 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, + 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, + 388, 0, 296, 0, 0, 0, 0, 0, 0, 0, + 304, 0, 0, 0, 0, 339, 0, 0, 0, 0, + 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 467, 46, 39, 0, + 0, 0, 0, 0, 0, 57, 0, 98, 99, 0, + 0, 0, 0, 0, 94, 95, 96, 97, 0, 0, + 0, 0, 0, 0, 0, 0, 453, 0, 0, 69, + 0, 0, 0, 120, 103, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 267, 0, 0, 0, 0, 223, + 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, + 392, 0, 0, 318, 0, 0, 0, 329, 308, 0, + 356, 357, 343, 0, 0, 188, 485, 0, 0, 490, + 0, 493, 494, 0, 0, 501, 502, 503, 0, 0, + 469, 0, 0, 0, 514, 516, 518, 0, 407, 409, + 411, 0, 0, 214, 297, 332, 270, 0, 0, 179, + 0, 0, 0, 47, 111, 114, 115, 113, 118, 119, + 117, 250, 252, 254, 360, 36, 378, 248, 256, 258, + 263, 264, 265, 262, 260, 381, 0, 376, 427, 415, + 417, 421, 419, 425, 423, 413, 321, 154, 325, 323, + 328, 353, 193, 195, 487, 489, 492, 497, 498, 496, + 500, 506, 507, 508, 509, 510, 505, 512, 40, 0, + 524, 0, 521, 523, 0, 140, 146, 148, 150, 0, + 0, 0, 0, 0, 159, 161, 139, 0, 125, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 0, 218, 0, 215, 216, 301, 0, 298, 299, + 336, 0, 333, 334, 274, 0, 271, 272, 172, 173, + 174, 175, 176, 0, 165, 167, 168, 169, 170, 171, + 436, 0, 434, 183, 0, 180, 181, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 201, 202, 203, 204, + 205, 460, 462, 0, 456, 458, 459, 0, 49, 364, + 0, 361, 362, 385, 0, 382, 383, 430, 0, 65, + 0, 0, 520, 101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 122, 124, 0, 213, + 0, 305, 294, 0, 340, 331, 0, 0, 269, 0, + 0, 164, 438, 0, 433, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 197, 0, 0, 0, 455, + 465, 51, 0, 50, 0, 359, 0, 389, 380, 0, + 0, 429, 0, 522, 0, 0, 0, 0, 152, 155, + 156, 157, 158, 0, 0, 126, 0, 217, 0, 300, + 0, 335, 292, 291, 281, 282, 284, 278, 279, 280, + 290, 289, 0, 276, 283, 285, 286, 287, 288, 273, + 166, 451, 449, 450, 444, 445, 446, 447, 448, 0, + 439, 440, 442, 443, 435, 0, 182, 206, 207, 208, + 209, 210, 211, 199, 0, 0, 457, 48, 0, 0, + 363, 0, 384, 0, 0, 142, 143, 144, 145, 141, + 147, 149, 151, 160, 162, 219, 302, 337, 0, 275, + 0, 437, 0, 184, 461, 463, 52, 365, 386, 431, + 528, 0, 526, 277, 0, 441, 0, 0, 525, 452, + 540, 0, 538, 536, 532, 0, 530, 534, 535, 533, + 527, 0, 0, 0, 0, 529, 0, 537, 0, 531, + 0, 539, 544, 0, 542, 0, 0, 541, 552, 0, + 0, 0, 0, 546, 548, 549, 550, 551, 543, 0, + 0, 0, 0, 0, 545, 0, 554, 555, 556, 547, + 553 }; const short int Dhcp4Parser::yypgoto_[] = { - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -49, -713, 83, -713, -713, -713, - -713, -713, -713, -713, -713, 103, -713, -713, -713, -62, - -713, -713, -713, 302, -713, -713, -713, -713, 98, 280, - -44, -34, -30, -713, -713, -29, -713, -713, 99, 277, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, 100, -90, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -69, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -104, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -109, -713, -713, -713, -105, 243, -713, -713, -713, -713, - -713, -713, -713, -113, -713, -713, -713, -713, -713, -713, - -712, -713, -713, -713, -88, -713, -713, -713, -85, 276, - -713, -713, -713, -713, -713, -713, -713, -713, -706, -713, - -713, -713, -518, -713, -698, -713, -713, -713, -713, -713, - -713, -713, -713, -95, -713, -713, -197, -66, -713, -713, - -713, -713, -713, -82, -713, -713, -713, -79, -713, 259, - -713, -64, -713, -713, -713, -713, -713, -46, -713, -713, - -713, -713, -713, -50, -713, -713, -713, -81, -713, -713, - -713, -80, -713, 260, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -108, -713, -713, -713, -107, - 289, -713, -713, -54, -713, -713, -713, -713, -713, -102, - -713, -713, -713, -106, -713, 312, -45, -713, -42, -713, - -37, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -687, -713, - -713, -713, -713, -713, -713, -713, -713, -713, 101, -713, - -713, -713, -713, -713, -713, -713, -93, -713, -713, -713, - -713, -713, -713, -713, -713, 123, 255, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -713, - -713, -713, -713, -713, -713, -713, -713, -713, -713, -35, - -713, -713, -713, -185, -713, -713, -198, -713, -713, -713, - -713, -713, -713, -208, -713, -713, -224, -713, -713, -713, - -713, -713 + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -47, -694, 93, -694, -694, -694, + -694, -694, -694, -694, -694, 103, -694, -694, -694, -62, + -694, -694, -694, 273, -694, -694, -694, -694, 62, 241, + -30, -25, -24, -694, -694, -19, -694, -694, 75, 247, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, 86, -108, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -69, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -121, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -125, -694, -694, -694, -115, 217, -694, -694, -694, -694, + -694, -694, -694, -116, -694, -694, -694, -694, -694, -694, + -693, -694, -694, -694, -90, -694, -694, -694, -87, 257, + -694, -694, -694, -694, -694, -694, -694, -694, -687, -694, + -694, -694, -48, -694, -686, -694, -694, -694, -694, -694, + -694, -694, -694, -97, -694, -694, -215, -49, -694, -694, + -694, -694, -694, -88, -694, -694, -694, -85, -694, 240, + -694, -64, -694, -694, -694, -694, -694, -44, -694, -694, + -694, -694, -694, -50, -694, -694, -694, -89, -694, -694, + -694, -84, -694, 245, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -114, -694, -694, -694, -111, + 265, -694, -694, -54, -694, -694, -694, -694, -694, -107, + -694, -694, -694, -103, -694, 259, -43, -694, -42, -694, + -31, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -679, -694, + -694, -694, -694, -694, -694, -76, -694, -694, -694, -191, + -694, -694, -694, -694, -694, -694, -694, -82, -694, -694, + -694, -694, -694, -694, -694, -694, 122, 242, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, + -32, -694, -694, -694, -196, -694, -694, -212, -694, -694, + -694, -694, -694, -694, -222, -694, -694, -235, -694, -694, + -694, -694, -694 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 34, 35, 36, 61, 553, 77, - 78, 37, 60, 74, 75, 538, 684, 749, 750, 116, + 22, 23, 24, 25, 34, 35, 36, 61, 536, 77, + 78, 37, 60, 74, 75, 524, 668, 732, 733, 116, 39, 62, 86, 87, 88, 304, 41, 63, 117, 118, 119, 120, 121, 122, 123, 124, 125, 312, 146, 147, - 43, 64, 148, 337, 149, 338, 541, 150, 339, 544, - 151, 126, 318, 127, 319, 614, 615, 616, 702, 824, - 617, 703, 618, 704, 619, 705, 620, 232, 375, 622, - 623, 624, 625, 626, 711, 627, 712, 128, 328, 650, - 651, 652, 653, 654, 655, 656, 129, 330, 660, 661, - 662, 732, 57, 71, 264, 265, 266, 388, 267, 389, - 130, 331, 669, 670, 671, 672, 673, 674, 675, 676, - 131, 324, 630, 631, 632, 716, 45, 65, 172, 173, - 174, 349, 175, 344, 176, 345, 177, 346, 178, 350, - 179, 351, 180, 355, 181, 354, 560, 182, 183, 132, - 327, 642, 643, 644, 725, 790, 791, 133, 325, 51, - 68, 634, 635, 636, 719, 53, 69, 233, 234, 235, - 236, 237, 238, 239, 374, 240, 378, 241, 377, 242, - 243, 379, 244, 134, 326, 638, 639, 640, 722, 55, - 70, 252, 253, 254, 255, 256, 383, 257, 258, 259, - 260, 185, 347, 688, 689, 690, 752, 47, 66, 195, - 196, 197, 360, 186, 348, 187, 356, 692, 693, 694, - 755, 49, 67, 209, 210, 211, 135, 315, 136, 316, - 137, 317, 215, 370, 216, 364, 217, 365, 218, 367, - 219, 366, 220, 369, 221, 368, 222, 363, 191, 357, - 696, 758, 138, 329, 658, 343, 454, 455, 456, 457, - 458, 545, 139, 140, 333, 679, 680, 681, 743, 682, - 744, 141, 334, 59, 72, 283, 284, 285, 286, 393, - 287, 394, 288, 289, 396, 290, 291, 292, 399, 586, - 293, 400, 294, 295, 296, 297, 404, 593, 298, 405, - 89, 306, 90, 307, 91, 308, 92, 305, 598, 599, - 600, 698, 843, 844, 846, 854, 855, 856, 857, 862, - 858, 860, 872, 873, 874, 881, 882, 883, 888, 884, - 885, 886 + 43, 64, 148, 337, 149, 338, 527, 150, 339, 530, + 151, 126, 318, 127, 319, 597, 598, 599, 684, 819, + 600, 685, 601, 686, 602, 687, 603, 232, 374, 605, + 606, 607, 608, 609, 693, 610, 694, 128, 328, 633, + 634, 635, 636, 637, 638, 639, 129, 330, 644, 645, + 646, 715, 57, 71, 264, 265, 266, 387, 267, 388, + 130, 331, 653, 654, 655, 656, 657, 658, 659, 660, + 131, 324, 613, 614, 615, 698, 45, 65, 171, 172, + 173, 348, 174, 343, 175, 344, 176, 345, 177, 349, + 178, 350, 179, 354, 180, 353, 543, 181, 182, 132, + 327, 625, 626, 627, 707, 772, 773, 133, 325, 51, + 68, 617, 618, 619, 701, 53, 69, 233, 234, 235, + 236, 237, 238, 239, 373, 240, 377, 241, 376, 242, + 243, 378, 244, 134, 326, 621, 622, 623, 704, 55, + 70, 252, 253, 254, 255, 256, 382, 257, 258, 259, + 260, 184, 346, 670, 671, 672, 734, 47, 66, 195, + 196, 197, 359, 185, 347, 186, 355, 674, 675, 676, + 737, 49, 67, 209, 210, 211, 135, 315, 136, 316, + 137, 317, 215, 369, 216, 363, 217, 364, 218, 366, + 219, 365, 220, 368, 221, 367, 222, 362, 190, 356, + 678, 740, 138, 329, 641, 642, 712, 789, 790, 791, + 792, 793, 830, 139, 140, 333, 663, 664, 665, 726, + 666, 727, 141, 334, 59, 72, 283, 284, 285, 286, + 392, 287, 393, 288, 289, 395, 290, 291, 292, 398, + 569, 293, 399, 294, 295, 296, 297, 403, 576, 298, + 404, 89, 306, 90, 307, 91, 308, 92, 305, 581, + 582, 583, 680, 841, 842, 846, 855, 856, 857, 858, + 863, 859, 861, 873, 874, 875, 882, 883, 884, 889, + 885, 886, 887 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 85, 249, 223, 167, 193, 207, 250, 231, 248, 263, - 282, 73, 198, 786, 657, 184, 194, 208, 79, 787, - 188, 168, 212, 189, 251, 213, 224, 789, 190, 152, - 214, 169, 584, 152, 225, 170, 171, 27, 796, 28, - 26, 29, 38, 95, 96, 97, 98, 96, 97, 98, - 40, 225, 42, 226, 227, 107, 44, 228, 229, 230, - 728, 261, 262, 729, 101, 102, 103, 192, 157, 153, - 154, 155, 46, 107, 48, 106, 107, 225, 50, 152, - 588, 589, 590, 591, 156, 52, 157, 158, 159, 160, - 161, 162, 163, 95, 96, 97, 98, 310, 76, 164, - 165, 446, 311, 164, 54, 335, 849, 166, 850, 851, - 336, 592, 341, 56, 101, 102, 103, 342, 105, 84, - 106, 786, 58, 107, 225, 142, 143, 787, 84, 144, - 80, 358, 145, 585, 730, 789, 359, 731, 159, 81, - 82, 83, 163, 261, 262, 84, 796, 361, 390, 164, - 84, 93, 362, 391, 84, 847, 875, 166, 848, 876, - 94, 95, 96, 97, 98, 99, 100, 299, 84, 539, - 540, 84, 663, 664, 665, 666, 667, 668, 30, 31, - 32, 33, 101, 102, 103, 104, 105, 406, 542, 543, - 106, 107, 407, 225, 245, 226, 227, 246, 247, 300, - 335, 108, 96, 97, 98, 697, 301, 788, 645, 646, - 647, 648, 799, 649, 109, 110, 877, 699, 84, 878, - 879, 880, 700, 341, 713, 677, 678, 111, 701, 714, - 112, 107, 302, 303, 713, 741, 371, 113, 114, 715, - 742, 115, 745, 372, 406, 358, 373, 746, 85, 747, - 830, 408, 409, 833, 381, 199, 309, 313, 834, 200, - 201, 202, 203, 204, 205, 390, 206, 361, 863, 386, - 835, 892, 839, 864, 448, 314, 893, 449, 557, 558, - 559, 447, 820, 821, 822, 823, 84, 84, 320, 321, - 322, 323, 332, 450, 340, 352, 167, 353, 451, 193, - 376, 452, 380, 382, 410, 384, 453, 198, 184, 385, - 207, 194, 387, 188, 168, 788, 189, 392, 249, 418, - 231, 190, 208, 250, 169, 248, 84, 212, 170, 171, - 213, 395, 397, 398, 401, 214, 402, 403, 411, 412, - 413, 251, 602, 414, 282, 415, 417, 603, 604, 605, - 606, 607, 608, 609, 610, 611, 612, 419, 420, 421, - 422, 423, 424, 425, 518, 519, 520, 225, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 426, 429, 427, 430, 428, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 441, 442, - 443, 459, 84, 460, 461, 462, 444, 463, 464, 465, - 466, 467, 468, 469, 470, 471, 472, 474, 476, 477, - 478, 479, 480, 481, 482, 483, 485, 486, 488, 487, - 489, 490, 493, 491, 494, 497, 495, 498, 500, 580, - 501, 502, 504, 503, 505, 506, 621, 621, 507, 508, - 509, 84, 512, 613, 613, 510, 595, 511, 513, 515, - 516, 522, 523, 517, 282, 521, 525, 524, 448, 526, - 527, 449, 528, 529, 530, 447, 531, 532, 533, 548, - 549, 534, 535, 536, 537, 546, 547, 450, 550, 551, - 562, 587, 451, 28, 563, 452, 554, 555, 556, 561, - 453, 564, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 575, 576, 577, 578, 579, 581, 582, 583, 594, - 629, 597, 633, 637, 641, 659, 685, 687, 691, 695, - 706, 707, 708, 709, 710, 718, 552, 717, 721, 720, - 723, 724, 726, 727, 734, 733, 735, 736, 737, 738, - 739, 740, 760, 748, 751, 753, 754, 756, 757, 813, - 759, 762, 763, 764, 765, 771, 772, 809, 810, 565, - 818, 812, 766, 819, 861, 831, 842, 768, 767, 832, - 825, 769, 770, 840, 865, 867, 802, 803, 804, 805, - 869, 871, 889, 806, 807, 826, 827, 828, 829, 890, - 891, 894, 416, 836, 596, 440, 837, 838, 445, 841, - 601, 866, 870, 773, 798, 801, 628, 800, 808, 895, - 775, 774, 797, 499, 473, 896, 845, 897, 899, 777, - 776, 492, 778, 779, 621, 814, 815, 496, 686, 816, - 475, 613, 811, 249, 167, 817, 785, 231, 250, 683, - 248, 514, 859, 780, 761, 868, 184, 887, 898, 0, - 263, 188, 168, 0, 189, 792, 251, 0, 0, 190, - 793, 781, 169, 794, 484, 0, 170, 171, 795, 0, - 193, 782, 0, 207, 0, 783, 784, 0, 198, 0, - 0, 0, 194, 0, 0, 208, 0, 0, 0, 0, - 212, 0, 0, 213, 0, 0, 0, 0, 214, 0, + 85, 249, 79, 166, 192, 207, 250, 231, 248, 263, + 282, 26, 198, 73, 768, 183, 194, 208, 193, 223, + 769, 771, 187, 188, 212, 213, 251, 27, 778, 28, + 567, 29, 261, 262, 189, 167, 214, 76, 310, 335, + 168, 169, 93, 311, 336, 106, 170, 571, 572, 573, + 574, 94, 95, 96, 97, 98, 99, 100, 815, 816, + 817, 818, 225, 95, 96, 97, 98, 341, 96, 97, + 98, 299, 342, 101, 102, 103, 104, 105, 575, 38, + 710, 106, 107, 711, 101, 102, 103, 40, 105, 107, + 84, 42, 108, 107, 225, 357, 106, 107, 225, 300, + 358, 191, 156, 142, 143, 109, 110, 144, 158, 44, + 145, 360, 162, 46, 80, 163, 361, 713, 111, 163, + 714, 112, 781, 81, 82, 83, 48, 165, 113, 114, + 847, 568, 115, 848, 850, 768, 851, 852, 84, 261, + 262, 769, 771, 647, 648, 649, 650, 651, 652, 778, + 525, 526, 95, 96, 97, 98, 84, 301, 389, 405, + 96, 97, 98, 390, 406, 528, 529, 335, 30, 31, + 32, 33, 679, 101, 102, 103, 681, 84, 152, 153, + 154, 682, 107, 50, 84, 341, 695, 52, 84, 107, + 683, 696, 84, 155, 54, 156, 157, 158, 159, 160, + 161, 162, 225, 245, 226, 227, 246, 247, 163, 164, + 695, 876, 56, 199, 877, 697, 165, 200, 201, 202, + 203, 204, 205, 878, 206, 585, 879, 880, 881, 58, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 224, 628, 629, 630, 631, 302, 632, 724, 85, 303, + 225, 728, 725, 407, 408, 405, 729, 357, 828, 389, + 730, 360, 825, 829, 833, 225, 837, 226, 227, 864, + 893, 228, 229, 230, 865, 894, 309, 84, 661, 662, + 540, 541, 542, 313, 84, 314, 320, 321, 322, 323, + 332, 340, 351, 352, 375, 166, 84, 371, 192, 370, + 372, 379, 381, 380, 383, 384, 198, 183, 386, 207, + 194, 385, 193, 391, 187, 188, 394, 249, 396, 231, + 397, 208, 250, 400, 248, 401, 189, 167, 212, 213, + 402, 409, 168, 169, 410, 411, 412, 413, 170, 414, + 214, 416, 251, 282, 84, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 84, + 417, 418, 419, 420, 421, 504, 505, 506, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 422, 423, 424, 425, 428, 426, 427, 429, 430, 84, + 431, 432, 433, 434, 435, 437, 436, 438, 440, 441, + 442, 445, 443, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 460, 462, 463, 464, + 465, 466, 467, 468, 469, 471, 472, 473, 474, 475, + 476, 479, 483, 484, 487, 488, 490, 563, 493, 494, + 489, 498, 604, 604, 499, 477, 501, 480, 502, 596, + 596, 481, 503, 486, 578, 491, 495, 492, 507, 511, + 282, 512, 496, 508, 497, 513, 509, 514, 510, 515, + 516, 517, 518, 519, 531, 532, 520, 521, 522, 523, + 533, 534, 28, 545, 537, 538, 539, 544, 546, 547, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 580, 612, 616, 564, 565, 566, + 577, 620, 624, 640, 643, 570, 669, 673, 688, 677, + 689, 690, 691, 692, 700, 731, 699, 703, 702, 705, + 706, 708, 709, 717, 716, 718, 719, 720, 721, 722, + 723, 736, 535, 735, 739, 738, 742, 744, 741, 745, + 746, 747, 753, 748, 754, 804, 749, 805, 807, 808, + 814, 813, 826, 832, 579, 548, 827, 831, 870, 838, + 750, 840, 844, 862, 866, 868, 439, 890, 891, 872, + 892, 895, 584, 415, 820, 751, 752, 755, 444, 780, + 797, 798, 796, 799, 800, 801, 802, 867, 611, 821, + 795, 822, 823, 824, 834, 835, 485, 836, 803, 839, + 757, 756, 779, 843, 459, 759, 758, 761, 849, 871, + 760, 478, 810, 809, 897, 461, 604, 898, 896, 900, + 470, 482, 812, 596, 811, 249, 166, 794, 767, 231, + 250, 845, 248, 783, 667, 762, 806, 500, 183, 743, + 782, 860, 869, 263, 888, 187, 188, 774, 899, 770, + 251, 0, 785, 784, 775, 776, 0, 189, 167, 786, + 787, 0, 192, 168, 169, 207, 777, 763, 0, 170, + 198, 788, 764, 765, 194, 0, 193, 208, 766, 0, + 0, 0, 0, 0, 212, 213, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 785, 0, 0, 0, 0, 0, - 0, 780, 0, 0, 0, 0, 0, 853, 0, 0, - 0, 0, 0, 792, 852, 0, 0, 0, 793, 781, - 0, 794, 0, 0, 853, 0, 795, 0, 0, 782, - 0, 852, 0, 783, 784 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 767, + 0, 0, 0, 783, 0, 0, 762, 0, 0, 0, + 782, 0, 0, 0, 0, 0, 0, 854, 774, 0, + 770, 0, 785, 784, 853, 775, 776, 0, 0, 786, + 787, 0, 0, 0, 0, 854, 0, 777, 763, 0, + 0, 788, 853, 764, 765, 0, 0, 0, 0, 766 }; const short int Dhcp4Parser::yycheck_[] = { - 62, 70, 68, 65, 66, 67, 70, 69, 70, 71, - 72, 60, 66, 725, 532, 65, 66, 67, 10, 725, - 65, 65, 67, 65, 70, 67, 27, 725, 65, 7, - 67, 65, 15, 7, 52, 65, 65, 5, 725, 7, - 0, 9, 7, 21, 22, 23, 24, 22, 23, 24, - 7, 52, 7, 54, 55, 51, 7, 58, 59, 60, - 3, 88, 89, 6, 42, 43, 44, 63, 64, 47, - 48, 49, 7, 51, 7, 50, 51, 52, 7, 7, - 118, 119, 120, 121, 62, 7, 64, 65, 66, 67, - 68, 69, 70, 21, 22, 23, 24, 3, 146, 77, - 78, 76, 8, 77, 7, 3, 124, 85, 126, 127, - 8, 149, 3, 7, 42, 43, 44, 8, 46, 146, - 50, 833, 7, 51, 52, 12, 13, 833, 146, 16, - 122, 3, 19, 116, 3, 833, 8, 6, 66, 131, - 132, 133, 70, 88, 89, 146, 833, 3, 3, 77, - 146, 11, 8, 8, 146, 3, 3, 85, 6, 6, - 20, 21, 22, 23, 24, 25, 26, 6, 146, 14, - 15, 146, 91, 92, 93, 94, 95, 96, 146, 147, - 148, 149, 42, 43, 44, 45, 46, 3, 17, 18, - 50, 51, 8, 52, 53, 54, 55, 56, 57, 3, - 3, 61, 22, 23, 24, 8, 4, 725, 79, 80, - 81, 82, 730, 84, 74, 75, 125, 3, 146, 128, - 129, 130, 8, 3, 3, 99, 100, 87, 8, 8, - 90, 51, 8, 3, 3, 3, 8, 97, 98, 8, - 8, 101, 3, 3, 3, 3, 8, 8, 310, 8, - 8, 300, 301, 3, 8, 75, 4, 4, 8, 79, - 80, 81, 82, 83, 84, 3, 86, 3, 3, 8, - 8, 3, 8, 8, 343, 4, 8, 343, 71, 72, - 73, 343, 28, 29, 30, 31, 146, 146, 4, 4, - 4, 4, 4, 343, 4, 4, 358, 4, 343, 361, - 4, 343, 4, 3, 146, 4, 343, 361, 358, 4, - 372, 361, 3, 358, 358, 833, 358, 4, 387, 149, - 382, 358, 372, 387, 358, 387, 146, 372, 358, 358, - 372, 4, 4, 4, 4, 372, 4, 4, 4, 4, - 4, 387, 27, 4, 406, 4, 4, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 149, 4, 4, - 4, 4, 4, 147, 413, 414, 415, 52, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 147, 4, 147, 4, 147, 4, - 4, 4, 4, 4, 4, 147, 4, 4, 4, 4, - 4, 4, 146, 4, 4, 4, 149, 4, 4, 4, - 4, 147, 149, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 147, - 4, 4, 4, 149, 149, 4, 149, 4, 149, 498, - 4, 4, 4, 147, 147, 147, 525, 526, 4, 4, - 149, 146, 4, 525, 526, 149, 515, 149, 4, 4, - 7, 146, 146, 7, 536, 7, 7, 146, 547, 7, - 5, 547, 5, 5, 5, 547, 5, 5, 5, 146, - 146, 7, 7, 7, 5, 8, 3, 547, 146, 5, - 5, 117, 547, 7, 7, 547, 146, 146, 146, 146, - 547, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 62, 70, 10, 65, 66, 67, 70, 69, 70, 71, + 72, 0, 66, 60, 707, 65, 66, 67, 66, 68, + 707, 707, 65, 65, 67, 67, 70, 5, 707, 7, + 15, 9, 88, 89, 65, 65, 67, 146, 3, 3, + 65, 65, 11, 8, 8, 50, 65, 118, 119, 120, + 121, 20, 21, 22, 23, 24, 25, 26, 28, 29, + 30, 31, 52, 21, 22, 23, 24, 3, 22, 23, + 24, 6, 8, 42, 43, 44, 45, 46, 149, 7, + 3, 50, 51, 6, 42, 43, 44, 7, 46, 51, + 146, 7, 61, 51, 52, 3, 50, 51, 52, 3, + 8, 63, 64, 12, 13, 74, 75, 16, 66, 7, + 19, 3, 70, 7, 122, 77, 8, 3, 87, 77, + 6, 90, 76, 131, 132, 133, 7, 85, 97, 98, + 3, 116, 101, 6, 124, 828, 126, 127, 146, 88, + 89, 828, 828, 91, 92, 93, 94, 95, 96, 828, + 14, 15, 21, 22, 23, 24, 146, 4, 3, 3, + 22, 23, 24, 8, 8, 17, 18, 3, 146, 147, + 148, 149, 8, 42, 43, 44, 3, 146, 47, 48, + 49, 8, 51, 7, 146, 3, 3, 7, 146, 51, + 8, 8, 146, 62, 7, 64, 65, 66, 67, 68, + 69, 70, 52, 53, 54, 55, 56, 57, 77, 78, + 3, 3, 7, 75, 6, 8, 85, 79, 80, 81, + 82, 83, 84, 125, 86, 27, 128, 129, 130, 7, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 27, 79, 80, 81, 82, 8, 84, 3, 310, 3, + 52, 3, 8, 300, 301, 3, 8, 3, 3, 3, + 8, 3, 8, 8, 8, 52, 8, 54, 55, 3, + 3, 58, 59, 60, 8, 8, 4, 146, 99, 100, + 71, 72, 73, 4, 146, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 357, 146, 3, 360, 8, + 8, 4, 3, 8, 4, 4, 360, 357, 3, 371, + 360, 8, 360, 4, 357, 357, 4, 386, 4, 381, + 4, 371, 386, 4, 386, 4, 357, 357, 371, 371, + 4, 146, 357, 357, 4, 4, 4, 4, 357, 4, + 371, 4, 386, 405, 146, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 146, + 149, 149, 4, 4, 4, 412, 413, 414, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 4, 4, 147, 147, 4, 147, 147, 4, 4, 146, + 4, 4, 4, 4, 4, 4, 147, 4, 4, 4, + 4, 4, 149, 4, 4, 4, 4, 4, 4, 4, + 147, 149, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 147, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 484, 4, 4, + 147, 4, 511, 512, 4, 149, 4, 149, 7, 511, + 512, 149, 7, 149, 501, 147, 149, 147, 7, 7, + 522, 7, 149, 146, 149, 5, 146, 5, 146, 5, + 5, 5, 5, 5, 146, 146, 7, 7, 7, 5, + 146, 5, 7, 5, 146, 146, 146, 146, 7, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 7, 123, 7, 7, 7, 7, 4, 7, 7, 86, - 4, 4, 4, 4, 4, 3, 463, 6, 3, 6, - 6, 3, 6, 3, 3, 6, 4, 4, 4, 4, - 4, 4, 4, 146, 146, 6, 3, 6, 3, 3, - 8, 4, 4, 4, 4, 4, 4, 4, 4, 476, - 4, 6, 147, 5, 4, 8, 7, 147, 149, 8, - 146, 149, 147, 8, 4, 4, 147, 147, 147, 147, - 5, 7, 4, 147, 147, 146, 146, 146, 146, 4, - 4, 4, 310, 146, 516, 335, 146, 146, 341, 146, - 521, 147, 146, 713, 728, 734, 526, 732, 741, 149, - 718, 716, 727, 390, 358, 147, 833, 147, 146, 721, - 719, 382, 722, 724, 713, 752, 754, 387, 547, 755, - 361, 713, 745, 722, 716, 757, 725, 719, 722, 536, - 722, 406, 847, 725, 699, 863, 716, 875, 892, -1, - 732, 716, 716, -1, 716, 725, 722, -1, -1, 716, - 725, 725, 716, 725, 372, -1, 716, 716, 725, -1, - 752, 725, -1, 755, -1, 725, 725, -1, 752, -1, - -1, -1, 752, -1, -1, 755, -1, -1, -1, -1, - 755, -1, -1, 755, -1, -1, -1, -1, 755, -1, + 146, 146, 146, 146, 123, 7, 7, 146, 146, 146, + 146, 7, 7, 7, 7, 117, 7, 7, 4, 86, + 4, 4, 4, 4, 3, 146, 6, 3, 6, 6, + 3, 6, 3, 3, 6, 4, 4, 4, 4, 4, + 4, 3, 449, 6, 3, 6, 4, 4, 8, 4, + 4, 4, 4, 147, 4, 4, 149, 4, 6, 3, + 5, 4, 8, 3, 502, 462, 8, 8, 5, 8, + 147, 7, 4, 4, 4, 4, 335, 4, 4, 7, + 4, 4, 507, 310, 146, 149, 147, 695, 341, 710, + 147, 147, 717, 147, 147, 147, 147, 147, 512, 146, + 715, 146, 146, 146, 146, 146, 389, 146, 724, 146, + 700, 698, 709, 828, 357, 703, 701, 706, 146, 146, + 704, 381, 736, 734, 147, 360, 695, 147, 149, 146, + 371, 386, 739, 695, 737, 704, 698, 713, 707, 701, + 704, 832, 704, 712, 522, 707, 728, 405, 698, 681, + 712, 847, 864, 715, 876, 698, 698, 707, 893, 707, + 704, -1, 712, 712, 707, 707, -1, 698, 698, 712, + 712, -1, 734, 698, 698, 737, 707, 707, -1, 698, + 734, 712, 707, 707, 734, -1, 734, 737, 707, -1, + -1, -1, -1, -1, 737, 737, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 737, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 833, -1, -1, -1, -1, -1, - -1, 833, -1, -1, -1, -1, -1, 846, -1, -1, - -1, -1, -1, 833, 846, -1, -1, -1, 833, 833, - -1, 833, -1, -1, 863, -1, 833, -1, -1, 833, - -1, 863, -1, 833, 833 + -1, -1, -1, -1, -1, -1, -1, -1, -1, 828, + -1, -1, -1, 832, -1, -1, 828, -1, -1, -1, + 832, -1, -1, -1, -1, -1, -1, 846, 828, -1, + 828, -1, 832, 832, 846, 828, 828, -1, -1, 832, + 832, -1, -1, -1, -1, 864, -1, 828, 828, -1, + -1, 832, 864, 828, 828, -1, -1, -1, -1, 828 }; const unsigned short int @@ -3938,21 +3940,21 @@ namespace isc { namespace dhcp { 158, 159, 160, 161, 162, 163, 0, 5, 7, 9, 146, 147, 148, 149, 164, 165, 166, 171, 7, 180, 7, 186, 7, 200, 7, 276, 7, 357, 7, 371, - 7, 309, 7, 315, 7, 339, 7, 252, 7, 423, + 7, 309, 7, 315, 7, 339, 7, 252, 7, 424, 172, 167, 181, 187, 201, 277, 358, 372, 310, 316, - 340, 253, 424, 164, 173, 174, 146, 169, 170, 10, - 122, 131, 132, 133, 146, 179, 182, 183, 184, 450, - 452, 454, 456, 11, 20, 21, 22, 23, 24, 25, + 340, 253, 425, 164, 173, 174, 146, 169, 170, 10, + 122, 131, 132, 133, 146, 179, 182, 183, 184, 451, + 453, 455, 457, 11, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 50, 51, 61, 74, 75, 87, 90, 97, 98, 101, 179, 188, 189, 190, 191, 192, 193, 194, 195, 196, 211, 213, 237, 246, - 260, 270, 299, 307, 333, 376, 378, 380, 402, 412, - 413, 421, 12, 13, 16, 19, 198, 199, 202, 204, - 207, 210, 7, 47, 48, 49, 62, 64, 65, 66, - 67, 68, 69, 70, 77, 78, 85, 179, 190, 191, - 192, 195, 278, 279, 280, 282, 284, 286, 288, 290, - 292, 294, 297, 298, 333, 351, 363, 365, 376, 378, - 380, 398, 63, 179, 333, 359, 360, 361, 363, 75, + 260, 270, 299, 307, 333, 376, 378, 380, 402, 413, + 414, 422, 12, 13, 16, 19, 198, 199, 202, 204, + 207, 210, 47, 48, 49, 62, 64, 65, 66, 67, + 68, 69, 70, 77, 78, 85, 179, 190, 191, 192, + 195, 278, 279, 280, 282, 284, 286, 288, 290, 292, + 294, 297, 298, 333, 351, 363, 365, 376, 378, 380, + 398, 63, 179, 292, 333, 359, 360, 361, 363, 75, 79, 80, 81, 82, 83, 84, 86, 179, 333, 373, 374, 375, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 307, 27, 52, 54, 55, 58, 59, @@ -3961,68 +3963,69 @@ namespace isc { namespace dhcp { 321, 327, 341, 342, 343, 344, 345, 347, 348, 349, 350, 88, 89, 179, 254, 255, 256, 258, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 179, 425, 426, 427, 428, 430, 432, 433, - 435, 436, 437, 440, 442, 443, 444, 445, 448, 6, - 3, 4, 8, 3, 185, 457, 451, 453, 455, 4, + 114, 115, 179, 426, 427, 428, 429, 431, 433, 434, + 436, 437, 438, 441, 443, 444, 445, 446, 449, 6, + 3, 4, 8, 3, 185, 458, 452, 454, 456, 4, 3, 8, 197, 4, 4, 377, 379, 381, 212, 214, 4, 4, 4, 4, 271, 308, 334, 300, 238, 403, - 247, 261, 4, 414, 422, 3, 8, 203, 205, 208, - 4, 3, 8, 405, 283, 285, 287, 352, 364, 281, - 289, 291, 4, 4, 295, 293, 366, 399, 3, 8, - 362, 3, 8, 397, 385, 387, 391, 389, 395, 393, - 383, 8, 3, 8, 324, 228, 4, 328, 326, 331, - 4, 8, 3, 346, 4, 4, 8, 3, 257, 259, - 3, 8, 4, 429, 431, 4, 434, 4, 4, 438, - 441, 4, 4, 4, 446, 449, 3, 8, 164, 164, - 146, 4, 4, 4, 4, 4, 183, 4, 149, 149, - 4, 4, 4, 4, 4, 147, 147, 147, 147, 4, - 4, 4, 4, 4, 4, 4, 4, 147, 4, 4, - 189, 4, 4, 4, 149, 199, 76, 179, 227, 307, - 333, 376, 378, 380, 406, 407, 408, 409, 410, 4, - 4, 4, 4, 4, 4, 4, 4, 147, 149, 4, - 4, 4, 4, 279, 4, 360, 4, 4, 4, 4, - 4, 4, 4, 4, 375, 4, 4, 147, 4, 4, - 4, 149, 319, 4, 149, 149, 343, 4, 4, 255, - 149, 4, 4, 147, 4, 147, 147, 4, 4, 149, - 149, 149, 4, 4, 426, 4, 7, 7, 164, 164, - 164, 7, 146, 146, 146, 7, 7, 5, 5, 5, - 5, 5, 5, 5, 7, 7, 7, 5, 175, 14, - 15, 206, 17, 18, 209, 411, 8, 3, 146, 146, - 146, 5, 166, 168, 146, 146, 146, 71, 72, 73, - 296, 146, 5, 7, 146, 175, 146, 146, 146, 146, + 247, 261, 4, 415, 423, 3, 8, 203, 205, 208, + 4, 3, 8, 283, 285, 287, 352, 364, 281, 289, + 291, 4, 4, 295, 293, 366, 399, 3, 8, 362, + 3, 8, 397, 385, 387, 391, 389, 395, 393, 383, + 8, 3, 8, 324, 228, 4, 328, 326, 331, 4, + 8, 3, 346, 4, 4, 8, 3, 257, 259, 3, + 8, 4, 430, 432, 4, 435, 4, 4, 439, 442, + 4, 4, 4, 447, 450, 3, 8, 164, 164, 146, + 4, 4, 4, 4, 4, 183, 4, 149, 149, 4, + 4, 4, 4, 4, 147, 147, 147, 147, 4, 4, + 4, 4, 4, 4, 4, 4, 147, 4, 4, 189, + 4, 4, 4, 149, 199, 4, 4, 4, 4, 4, + 4, 4, 4, 147, 149, 4, 4, 4, 4, 279, + 4, 360, 4, 4, 4, 4, 4, 4, 4, 4, + 375, 4, 4, 147, 4, 4, 4, 149, 319, 4, + 149, 149, 343, 4, 4, 255, 149, 4, 4, 147, + 4, 147, 147, 4, 4, 149, 149, 149, 4, 4, + 427, 4, 7, 7, 164, 164, 164, 7, 146, 146, + 146, 7, 7, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 5, 175, 14, 15, 206, 17, 18, + 209, 146, 146, 146, 5, 166, 168, 146, 146, 146, + 71, 72, 73, 296, 146, 5, 7, 146, 175, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 164, 146, 146, 146, 15, 116, 439, 117, 118, 119, - 120, 121, 149, 447, 146, 164, 188, 123, 458, 459, - 460, 198, 27, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 179, 215, 216, 217, 220, 222, 224, - 226, 227, 229, 230, 231, 232, 233, 235, 215, 7, - 272, 273, 274, 7, 311, 312, 313, 7, 335, 336, - 337, 7, 301, 302, 303, 79, 80, 81, 82, 84, - 239, 240, 241, 242, 243, 244, 245, 292, 404, 7, - 248, 249, 250, 91, 92, 93, 94, 95, 96, 262, - 263, 264, 265, 266, 267, 268, 269, 99, 100, 415, - 416, 417, 419, 425, 176, 4, 408, 7, 353, 354, - 355, 7, 367, 368, 369, 86, 400, 8, 461, 3, - 8, 8, 218, 221, 223, 225, 4, 4, 4, 4, - 4, 234, 236, 3, 8, 8, 275, 6, 3, 314, - 6, 3, 338, 6, 3, 304, 6, 3, 3, 6, - 3, 6, 251, 6, 3, 4, 4, 4, 4, 4, - 4, 3, 8, 418, 420, 3, 8, 8, 146, 177, - 178, 146, 356, 6, 3, 370, 6, 3, 401, 8, - 4, 459, 4, 4, 4, 4, 147, 149, 147, 149, - 147, 4, 4, 216, 278, 274, 317, 313, 341, 337, - 179, 190, 191, 192, 195, 227, 270, 288, 292, 294, - 305, 306, 333, 376, 378, 380, 398, 303, 240, 292, - 254, 250, 147, 147, 147, 147, 147, 147, 263, 4, - 4, 416, 6, 3, 359, 355, 373, 369, 4, 5, - 28, 29, 30, 31, 219, 146, 146, 146, 146, 146, - 8, 8, 8, 3, 8, 8, 146, 146, 146, 8, - 8, 146, 7, 462, 463, 306, 464, 3, 6, 124, - 126, 127, 179, 227, 465, 466, 467, 468, 470, 463, - 471, 4, 469, 3, 8, 4, 147, 4, 466, 5, - 146, 7, 472, 473, 474, 3, 6, 125, 128, 129, - 130, 475, 476, 477, 479, 480, 481, 473, 478, 4, - 4, 4, 3, 8, 4, 149, 147, 147, 476, 146 + 146, 146, 146, 164, 146, 146, 146, 15, 116, 440, + 117, 118, 119, 120, 121, 149, 448, 146, 164, 188, + 123, 459, 460, 461, 198, 27, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 179, 215, 216, 217, + 220, 222, 224, 226, 227, 229, 230, 231, 232, 233, + 235, 215, 7, 272, 273, 274, 7, 311, 312, 313, + 7, 335, 336, 337, 7, 301, 302, 303, 79, 80, + 81, 82, 84, 239, 240, 241, 242, 243, 244, 245, + 7, 404, 405, 7, 248, 249, 250, 91, 92, 93, + 94, 95, 96, 262, 263, 264, 265, 266, 267, 268, + 269, 99, 100, 416, 417, 418, 420, 426, 176, 7, + 353, 354, 355, 7, 367, 368, 369, 86, 400, 8, + 462, 3, 8, 8, 218, 221, 223, 225, 4, 4, + 4, 4, 4, 234, 236, 3, 8, 8, 275, 6, + 3, 314, 6, 3, 338, 6, 3, 304, 6, 3, + 3, 6, 406, 3, 6, 251, 6, 3, 4, 4, + 4, 4, 4, 4, 3, 8, 419, 421, 3, 8, + 8, 146, 177, 178, 356, 6, 3, 370, 6, 3, + 401, 8, 4, 460, 4, 4, 4, 4, 147, 149, + 147, 149, 147, 4, 4, 216, 278, 274, 317, 313, + 341, 337, 179, 190, 191, 192, 195, 227, 270, 288, + 292, 294, 305, 306, 333, 376, 378, 380, 398, 303, + 240, 76, 179, 227, 307, 333, 376, 378, 380, 407, + 408, 409, 410, 411, 405, 254, 250, 147, 147, 147, + 147, 147, 147, 263, 4, 4, 417, 6, 3, 359, + 355, 373, 369, 4, 5, 28, 29, 30, 31, 219, + 146, 146, 146, 146, 146, 8, 8, 8, 3, 8, + 412, 8, 3, 8, 146, 146, 146, 8, 8, 146, + 7, 463, 464, 306, 4, 409, 465, 3, 6, 146, + 124, 126, 127, 179, 227, 466, 467, 468, 469, 471, + 464, 472, 4, 470, 3, 8, 4, 147, 4, 467, + 5, 146, 7, 473, 474, 475, 3, 6, 125, 128, + 129, 130, 476, 477, 478, 480, 481, 482, 474, 479, + 4, 4, 4, 3, 8, 4, 149, 147, 147, 477, + 146 }; const unsigned short int @@ -4065,25 +4068,25 @@ namespace isc { namespace dhcp { 341, 341, 342, 342, 343, 343, 343, 343, 343, 343, 343, 344, 346, 345, 347, 348, 349, 350, 352, 351, 353, 353, 354, 354, 356, 355, 358, 357, 359, 359, - 360, 360, 360, 360, 362, 361, 364, 363, 366, 365, - 367, 367, 368, 368, 370, 369, 372, 371, 373, 373, - 374, 374, 375, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 377, 376, 379, 378, 381, - 380, 383, 382, 385, 384, 387, 386, 389, 388, 391, - 390, 393, 392, 395, 394, 397, 396, 399, 398, 401, - 400, 403, 402, 404, 404, 405, 292, 406, 406, 407, - 407, 408, 408, 408, 408, 408, 408, 408, 408, 409, - 411, 410, 412, 414, 413, 415, 415, 416, 416, 418, - 417, 420, 419, 422, 421, 424, 423, 425, 425, 426, - 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, - 426, 426, 426, 426, 427, 429, 428, 431, 430, 432, - 434, 433, 435, 436, 438, 437, 439, 439, 441, 440, - 442, 443, 444, 446, 445, 447, 447, 447, 447, 447, - 449, 448, 451, 450, 453, 452, 455, 454, 457, 456, - 458, 458, 459, 461, 460, 462, 462, 464, 463, 465, - 465, 466, 466, 466, 466, 466, 467, 469, 468, 471, - 470, 472, 472, 474, 473, 475, 475, 476, 476, 476, - 476, 478, 477, 479, 480, 481 + 360, 360, 360, 360, 360, 362, 361, 364, 363, 366, + 365, 367, 367, 368, 368, 370, 369, 372, 371, 373, + 373, 374, 374, 375, 375, 375, 375, 375, 375, 375, + 375, 375, 375, 375, 375, 375, 377, 376, 379, 378, + 381, 380, 383, 382, 385, 384, 387, 386, 389, 388, + 391, 390, 393, 392, 395, 394, 397, 396, 399, 398, + 401, 400, 403, 402, 404, 404, 406, 405, 407, 407, + 408, 408, 409, 409, 409, 409, 409, 409, 409, 409, + 410, 412, 411, 413, 415, 414, 416, 416, 417, 417, + 419, 418, 421, 420, 423, 422, 425, 424, 426, 426, + 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 427, 428, 430, 429, 432, 431, + 433, 435, 434, 436, 437, 439, 438, 440, 440, 442, + 441, 443, 444, 445, 447, 446, 448, 448, 448, 448, + 448, 450, 449, 452, 451, 454, 453, 456, 455, 458, + 457, 459, 459, 460, 462, 461, 463, 463, 465, 464, + 466, 466, 467, 467, 467, 467, 467, 468, 470, 469, + 472, 471, 473, 473, 475, 474, 476, 476, 477, 477, + 477, 477, 479, 478, 480, 481, 482 }; const unsigned char @@ -4126,25 +4129,25 @@ namespace isc { namespace dhcp { 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, - 1, 1, 1, 1, 0, 4, 0, 4, 0, 6, - 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, - 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 4, 3, 0, 6, 1, 3, 1, 1, 0, - 4, 0, 4, 0, 6, 0, 4, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 0, 4, 0, 4, 3, - 0, 4, 3, 3, 0, 4, 1, 1, 0, 4, - 3, 3, 3, 0, 4, 1, 1, 1, 1, 1, + 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, - 1, 3, 1, 0, 6, 1, 3, 0, 4, 1, - 3, 1, 1, 1, 1, 1, 3, 0, 4, 0, - 6, 1, 3, 0, 4, 1, 3, 1, 1, 1, - 1, 0, 4, 3, 3, 3 + 0, 4, 0, 6, 1, 3, 0, 4, 0, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 4, 3, 0, 6, 1, 3, 1, 1, + 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 4, 0, 4, + 3, 0, 4, 3, 3, 0, 4, 1, 1, 0, + 4, 3, 3, 3, 0, 4, 1, 1, 1, 1, + 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 6, 1, 3, 1, 0, 6, 1, 3, 0, 4, + 1, 3, 1, 1, 1, 1, 1, 3, 0, 4, + 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, + 1, 1, 0, 4, 3, 3, 3 }; @@ -4257,10 +4260,11 @@ namespace isc { namespace dhcp { "hw_address", "$@78", "client_id_value", "$@79", "circuit_id_value", "$@80", "flex_id_value", "$@81", "hostname", "$@82", "reservation_client_classes", "$@83", "relay", "$@84", "relay_map", - "$@85", "client_classes", "$@86", "client_classes_list", "$@87", - "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@88", - "dhcp4o6_port", "control_socket", "$@89", "control_socket_params", + "$@85", "client_classes", "$@86", "client_classes_list", + "client_class_entry", "$@87", "client_class_params", + "not_empty_client_class_params", "client_class_param", + "client_class_name", "client_class_test", "$@88", "dhcp4o6_port", + "control_socket", "$@89", "control_socket_params", "control_socket_param", "control_socket_type", "$@90", "control_socket_name", "$@91", "dhcp_ddns", "$@92", "sub_dhcp_ddns", "$@93", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", @@ -4320,25 +4324,25 @@ namespace isc { namespace dhcp { 1238, 1239, 1244, 1245, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1259, 1261, 1261, 1269, 1271, 1273, 1278, 1286, 1286, 1298, 1299, 1302, 1303, 1306, 1306, 1316, 1316, 1326, 1327, - 1330, 1331, 1332, 1333, 1336, 1336, 1344, 1344, 1354, 1354, - 1364, 1365, 1368, 1369, 1372, 1372, 1381, 1381, 1390, 1391, - 1394, 1395, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, - 1407, 1408, 1409, 1410, 1411, 1414, 1414, 1422, 1422, 1430, - 1430, 1438, 1438, 1446, 1446, 1454, 1454, 1462, 1462, 1470, - 1470, 1478, 1478, 1486, 1486, 1494, 1494, 1507, 1507, 1517, - 1517, 1528, 1528, 1538, 1539, 1542, 1542, 1552, 1553, 1556, - 1557, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1570, - 1572, 1572, 1584, 1591, 1591, 1601, 1602, 1605, 1606, 1609, - 1609, 1617, 1617, 1627, 1627, 1639, 1639, 1649, 1650, 1653, + 1330, 1331, 1332, 1333, 1334, 1337, 1337, 1345, 1345, 1355, + 1355, 1365, 1366, 1369, 1370, 1373, 1373, 1382, 1382, 1391, + 1392, 1395, 1396, 1400, 1401, 1402, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1412, 1415, 1415, 1423, 1423, + 1431, 1431, 1439, 1439, 1447, 1447, 1455, 1455, 1463, 1463, + 1471, 1471, 1479, 1479, 1487, 1487, 1495, 1495, 1508, 1508, + 1518, 1518, 1529, 1529, 1539, 1540, 1543, 1543, 1553, 1554, + 1557, 1558, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1571, 1573, 1573, 1585, 1592, 1592, 1602, 1603, 1606, 1607, + 1610, 1610, 1618, 1618, 1628, 1628, 1640, 1640, 1650, 1651, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1670, 1675, 1675, 1683, 1683, 1691, - 1696, 1696, 1704, 1709, 1714, 1714, 1722, 1723, 1726, 1726, - 1734, 1739, 1744, 1749, 1749, 1757, 1760, 1763, 1766, 1769, - 1775, 1775, 1785, 1785, 1792, 1792, 1799, 1799, 1811, 1811, - 1824, 1825, 1829, 1833, 1833, 1845, 1846, 1850, 1850, 1858, - 1859, 1862, 1863, 1864, 1865, 1866, 1869, 1874, 1874, 1882, - 1882, 1892, 1893, 1896, 1896, 1904, 1905, 1908, 1909, 1910, - 1911, 1914, 1914, 1922, 1927, 1932 + 1664, 1665, 1666, 1667, 1668, 1671, 1676, 1676, 1684, 1684, + 1692, 1697, 1697, 1705, 1710, 1715, 1715, 1723, 1724, 1727, + 1727, 1735, 1740, 1745, 1750, 1750, 1758, 1761, 1764, 1767, + 1770, 1776, 1776, 1786, 1786, 1793, 1793, 1800, 1800, 1812, + 1812, 1825, 1826, 1830, 1834, 1834, 1846, 1847, 1851, 1851, + 1859, 1860, 1863, 1864, 1865, 1866, 1867, 1870, 1875, 1875, + 1883, 1883, 1893, 1894, 1897, 1897, 1905, 1906, 1909, 1910, + 1911, 1912, 1915, 1915, 1923, 1928, 1933 }; // Print the state stack on the debug stream. @@ -4373,8 +4377,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4377 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 1937 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4381 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 1938 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index dc4a31dbb6..7ac3490a66 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -1406,8 +1406,8 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 804, ///< Last index in yytable_. - yynnts_ = 332, ///< Number of nonterminal symbols. + yylast_ = 809, ///< Last index in yytable_. + yynnts_ = 333, ///< Number of nonterminal symbols. yyfinal_ = 26, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, @@ -1509,8 +1509,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.copy< ElementPtr > (other.value); break; @@ -1553,8 +1553,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.copy< ElementPtr > (v); break; @@ -1656,8 +1656,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.template destroy< ElementPtr > (); break; @@ -1706,8 +1706,8 @@ namespace isc { namespace dhcp { case 209: // outbound_interface_value case 219: // db_type case 296: // hr_mode - case 439: // ncr_protocol_value - case 447: // replace_client_name_value + case 440: // ncr_protocol_value + case 448: // replace_client_name_value value.move< ElementPtr > (s.value); break; diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index cc40e6f07a..406760160c 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201710231324 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 45d4f94cf6..5093784f84 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201710231324 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index e0ef0e6b25..faba59c6ed 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201710231324 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index 00a2c77107..ba4ee93e01 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -1576,12 +1576,12 @@ static const flex_int16_t yy_rule_linenum[161] = 859, 869, 879, 888, 897, 906, 915, 925, 934, 943, 952, 961, 970, 979, 988, 997, 1006, 1016, 1025, 1034, - 1044, 1055, 1065, 1074, 1083, 1092, 1103, 1113, 1122, 1132, - 1142, 1151, 1160, 1169, 1178, 1188, 1197, 1207, 1216, 1225, - 1234, 1243, 1252, 1261, 1270, 1279, 1288, 1297, 1306, 1315, - 1324, 1333, 1342, 1351, 1360, 1369, 1378, 1387, 1396, 1405, - 1414, 1423, 1433, 1531, 1536, 1541, 1546, 1547, 1548, 1549, - 1550, 1551, 1553, 1571, 1584, 1589, 1593, 1595, 1597, 1599 + 1044, 1057, 1067, 1076, 1085, 1094, 1105, 1115, 1124, 1134, + 1144, 1153, 1162, 1171, 1180, 1190, 1199, 1209, 1218, 1227, + 1236, 1245, 1254, 1263, 1272, 1281, 1290, 1299, 1308, 1317, + 1326, 1335, 1344, 1353, 1362, 1371, 1380, 1389, 1398, 1407, + 1416, 1425, 1435, 1533, 1538, 1543, 1548, 1549, 1550, 1551, + 1552, 1553, 1555, 1573, 1586, 1591, 1595, 1597, 1599, 1601 } ; /* The intent behind this definition is that it'll catch @@ -2710,7 +2710,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_); @@ -2724,7 +2724,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_); @@ -2738,7 +2738,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_); @@ -2752,7 +2752,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_); @@ -2777,7 +2777,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_); @@ -2789,7 +2789,7 @@ YY_RULE_SETUP #line 670 "dhcp6_lexer.ll" { switch (driver.ctx_) { - case Parser6Context::DHCP6: + case isc::dhcp::Parser6Context::DHCP6: return Dhcp6Parser::make_SHARED_NETWORKS(driver.loc_); default: return Dhcp6Parser::make_STRING("shared-networks", driver.loc_); @@ -2820,7 +2820,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_); @@ -2839,7 +2839,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_); @@ -2998,7 +2998,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_); @@ -3011,7 +3011,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_); @@ -3036,7 +3036,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_); @@ -3049,7 +3049,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_); @@ -3280,8 +3280,10 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("client-class", driver.loc_); @@ -3290,7 +3292,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1055 "dhcp6_lexer.ll" +#line 1057 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3303,7 +3305,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1065 "dhcp6_lexer.ll" +#line 1067 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3315,7 +3317,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1074 "dhcp6_lexer.ll" +#line 1076 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3327,7 +3329,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1083 "dhcp6_lexer.ll" +#line 1085 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3339,7 +3341,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1092 "dhcp6_lexer.ll" +#line 1094 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3353,7 +3355,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1103 "dhcp6_lexer.ll" +#line 1105 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3366,7 +3368,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1113 "dhcp6_lexer.ll" +#line 1115 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3378,7 +3380,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1122 "dhcp6_lexer.ll" +#line 1124 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3391,7 +3393,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1132 "dhcp6_lexer.ll" +#line 1134 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3404,7 +3406,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1142 "dhcp6_lexer.ll" +#line 1144 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3416,7 +3418,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1151 "dhcp6_lexer.ll" +#line 1153 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3428,7 +3430,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1160 "dhcp6_lexer.ll" +#line 1162 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3440,7 +3442,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1169 "dhcp6_lexer.ll" +#line 1171 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3452,11 +3454,11 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1178 "dhcp6_lexer.ll" +#line 1180 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_); @@ -3465,11 +3467,11 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1188 "dhcp6_lexer.ll" +#line 1190 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: - return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("ip-address", driver.loc_); } @@ -3477,7 +3479,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1197 "dhcp6_lexer.ll" +#line 1199 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3489,7 +3491,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1207 "dhcp6_lexer.ll" +#line 1209 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3501,7 +3503,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1216 "dhcp6_lexer.ll" +#line 1218 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3513,7 +3515,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1225 "dhcp6_lexer.ll" +#line 1227 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3525,7 +3527,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1234 "dhcp6_lexer.ll" +#line 1236 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3537,7 +3539,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1243 "dhcp6_lexer.ll" +#line 1245 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3549,7 +3551,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1252 "dhcp6_lexer.ll" +#line 1254 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3561,7 +3563,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1261 "dhcp6_lexer.ll" +#line 1263 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3573,7 +3575,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1270 "dhcp6_lexer.ll" +#line 1272 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3585,7 +3587,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1279 "dhcp6_lexer.ll" +#line 1281 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3597,7 +3599,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1288 "dhcp6_lexer.ll" +#line 1290 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3609,7 +3611,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1297 "dhcp6_lexer.ll" +#line 1299 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3621,7 +3623,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1306 "dhcp6_lexer.ll" +#line 1308 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3633,7 +3635,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1315 "dhcp6_lexer.ll" +#line 1317 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3645,7 +3647,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1324 "dhcp6_lexer.ll" +#line 1326 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3657,7 +3659,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1333 "dhcp6_lexer.ll" +#line 1335 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3669,7 +3671,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1342 "dhcp6_lexer.ll" +#line 1344 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3681,7 +3683,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1351 "dhcp6_lexer.ll" +#line 1353 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3693,7 +3695,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1360 "dhcp6_lexer.ll" +#line 1362 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3705,7 +3707,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1369 "dhcp6_lexer.ll" +#line 1371 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3717,7 +3719,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1378 "dhcp6_lexer.ll" +#line 1380 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3729,7 +3731,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1387 "dhcp6_lexer.ll" +#line 1389 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3741,7 +3743,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1396 "dhcp6_lexer.ll" +#line 1398 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3753,7 +3755,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1405 "dhcp6_lexer.ll" +#line 1407 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3765,7 +3767,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1414 "dhcp6_lexer.ll" +#line 1416 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3777,7 +3779,7 @@ YY_RULE_SETUP YY_BREAK case 142: YY_RULE_SETUP -#line 1423 "dhcp6_lexer.ll" +#line 1425 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3789,7 +3791,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1433 "dhcp6_lexer.ll" +#line 1435 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3891,7 +3893,7 @@ YY_RULE_SETUP case 144: /* rule 144 can match eol */ YY_RULE_SETUP -#line 1531 "dhcp6_lexer.ll" +#line 1533 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3900,7 +3902,7 @@ YY_RULE_SETUP case 145: /* rule 145 can match eol */ YY_RULE_SETUP -#line 1536 "dhcp6_lexer.ll" +#line 1538 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3908,7 +3910,7 @@ YY_RULE_SETUP YY_BREAK case 146: YY_RULE_SETUP -#line 1541 "dhcp6_lexer.ll" +#line 1543 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3916,37 +3918,37 @@ YY_RULE_SETUP YY_BREAK case 147: YY_RULE_SETUP -#line 1546 "dhcp6_lexer.ll" +#line 1548 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1547 "dhcp6_lexer.ll" +#line 1549 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1548 "dhcp6_lexer.ll" +#line 1550 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1549 "dhcp6_lexer.ll" +#line 1551 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1550 "dhcp6_lexer.ll" +#line 1552 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1551 "dhcp6_lexer.ll" +#line 1553 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1553 "dhcp6_lexer.ll" +#line 1555 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3967,7 +3969,7 @@ YY_RULE_SETUP YY_BREAK case 154: YY_RULE_SETUP -#line 1571 "dhcp6_lexer.ll" +#line 1573 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -3983,7 +3985,7 @@ YY_RULE_SETUP YY_BREAK case 155: YY_RULE_SETUP -#line 1584 "dhcp6_lexer.ll" +#line 1586 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -3991,33 +3993,33 @@ YY_RULE_SETUP YY_BREAK case 156: YY_RULE_SETUP -#line 1589 "dhcp6_lexer.ll" +#line 1591 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 157: YY_RULE_SETUP -#line 1593 "dhcp6_lexer.ll" +#line 1595 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 158: YY_RULE_SETUP -#line 1595 "dhcp6_lexer.ll" +#line 1597 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 159: YY_RULE_SETUP -#line 1597 "dhcp6_lexer.ll" +#line 1599 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1599 "dhcp6_lexer.ll" +#line 1601 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1601 "dhcp6_lexer.ll" +#line 1603 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4043,10 +4045,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 161: YY_RULE_SETUP -#line 1624 "dhcp6_lexer.ll" +#line 1626 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4049 "dhcp6_lexer.cc" +#line 4051 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -5151,7 +5153,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1624 "dhcp6_lexer.ll" +#line 1626 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index 4bf6ed5f00..93f236d87b 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -257,9 +257,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.move< ElementPtr > (that.value); break; @@ -298,9 +298,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.copy< ElementPtr > (that.value); break; @@ -412,21 +412,21 @@ namespace isc { namespace dhcp { #line 413 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 425: // duid_type + case 426: // duid_type #line 227 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 420 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 458: // ncr_protocol_value + case 459: // ncr_protocol_value #line 227 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 427 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 466: // replace_client_name_value + case 467: // replace_client_name_value #line 227 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } @@ -634,9 +634,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; @@ -2176,16 +2176,16 @@ namespace isc { namespace dhcp { #line 2177 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 357: -#line 1299 "dhcp6_parser.yy" // lalr1.cc:859 + case 358: +#line 1300 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2185 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 358: -#line 1301 "dhcp6_parser.yy" // lalr1.cc:859 + case 359: +#line 1302 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); @@ -2194,16 +2194,16 @@ namespace isc { namespace dhcp { #line 2195 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 359: -#line 1307 "dhcp6_parser.yy" // lalr1.cc:859 + case 360: +#line 1308 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2203 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 360: -#line 1309 "dhcp6_parser.yy" // lalr1.cc:859 + case 361: +#line 1310 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2211,8 +2211,8 @@ namespace isc { namespace dhcp { #line 2212 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 361: -#line 1317 "dhcp6_parser.yy" // lalr1.cc:859 + case 362: +#line 1318 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); @@ -2222,8 +2222,8 @@ namespace isc { namespace dhcp { #line 2223 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 362: -#line 1322 "dhcp6_parser.yy" // lalr1.cc:859 + case 363: +#line 1323 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2231,8 +2231,8 @@ namespace isc { namespace dhcp { #line 2232 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 367: -#line 1337 "dhcp6_parser.yy" // lalr1.cc:859 + case 368: +#line 1338 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2241,8 +2241,8 @@ namespace isc { namespace dhcp { #line 2242 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 368: -#line 1341 "dhcp6_parser.yy" // lalr1.cc:859 + case 369: +#line 1342 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2253,8 +2253,8 @@ namespace isc { namespace dhcp { #line 2254 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 369: -#line 1349 "dhcp6_parser.yy" // lalr1.cc:859 + case 370: +#line 1350 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2263,8 +2263,8 @@ namespace isc { namespace dhcp { #line 2264 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 370: -#line 1353 "dhcp6_parser.yy" // lalr1.cc:859 + case 371: +#line 1354 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2275,16 +2275,16 @@ namespace isc { namespace dhcp { #line 2276 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 381: -#line 1375 "dhcp6_parser.yy" // lalr1.cc:859 + case 383: +#line 1377 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 382: -#line 1377 "dhcp6_parser.yy" // lalr1.cc:859 + case 384: +#line 1379 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); @@ -2293,8 +2293,8 @@ namespace isc { namespace dhcp { #line 2294 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 383: -#line 1383 "dhcp6_parser.yy" // lalr1.cc:859 + case 385: +#line 1385 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); @@ -2302,16 +2302,16 @@ namespace isc { namespace dhcp { #line 2303 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1388 "dhcp6_parser.yy" // lalr1.cc:859 + case 386: +#line 1390 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2311 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1390 "dhcp6_parser.yy" // lalr1.cc:859 + case 387: +#line 1392 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); @@ -2320,8 +2320,8 @@ namespace isc { namespace dhcp { #line 2321 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1396 "dhcp6_parser.yy" // lalr1.cc:859 + case 388: +#line 1398 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); @@ -2329,8 +2329,8 @@ namespace isc { namespace dhcp { #line 2330 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1401 "dhcp6_parser.yy" // lalr1.cc:859 + case 389: +#line 1403 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); @@ -2338,8 +2338,8 @@ namespace isc { namespace dhcp { #line 2339 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 388: -#line 1409 "dhcp6_parser.yy" // lalr1.cc:859 + case 390: +#line 1411 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); @@ -2349,8 +2349,8 @@ namespace isc { namespace dhcp { #line 2350 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 389: -#line 1414 "dhcp6_parser.yy" // lalr1.cc:859 + case 391: +#line 1416 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2358,8 +2358,8 @@ namespace isc { namespace dhcp { #line 2359 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 394: -#line 1427 "dhcp6_parser.yy" // lalr1.cc:859 + case 396: +#line 1429 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2368,8 +2368,8 @@ namespace isc { namespace dhcp { #line 2369 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1431 "dhcp6_parser.yy" // lalr1.cc:859 + case 397: +#line 1433 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); @@ -2377,8 +2377,8 @@ namespace isc { namespace dhcp { #line 2378 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1436 "dhcp6_parser.yy" // lalr1.cc:859 + case 398: +#line 1438 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2387,8 +2387,8 @@ namespace isc { namespace dhcp { #line 2388 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 397: -#line 1440 "dhcp6_parser.yy" // lalr1.cc:859 + case 399: +#line 1442 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed @@ -2396,8 +2396,8 @@ namespace isc { namespace dhcp { #line 2397 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 411: -#line 1465 "dhcp6_parser.yy" // lalr1.cc:859 + case 413: +#line 1467 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); @@ -2407,8 +2407,8 @@ namespace isc { namespace dhcp { #line 2408 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 412: -#line 1470 "dhcp6_parser.yy" // lalr1.cc:859 + case 414: +#line 1472 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2416,8 +2416,8 @@ namespace isc { namespace dhcp { #line 2417 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1475 "dhcp6_parser.yy" // lalr1.cc:859 + case 415: +#line 1477 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefixes", l); @@ -2427,8 +2427,8 @@ namespace isc { namespace dhcp { #line 2428 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1480 "dhcp6_parser.yy" // lalr1.cc:859 + case 416: +#line 1482 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2436,16 +2436,16 @@ namespace isc { namespace dhcp { #line 2437 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1485 "dhcp6_parser.yy" // lalr1.cc:859 + case 417: +#line 1487 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2445 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1487 "dhcp6_parser.yy" // lalr1.cc:859 + case 418: +#line 1489 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); @@ -2454,16 +2454,16 @@ namespace isc { namespace dhcp { #line 2455 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1493 "dhcp6_parser.yy" // lalr1.cc:859 + case 419: +#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2463 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 + case 420: +#line 1497 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); @@ -2472,16 +2472,16 @@ namespace isc { namespace dhcp { #line 2473 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1501 "dhcp6_parser.yy" // lalr1.cc:859 + case 421: +#line 1503 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2481 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1503 "dhcp6_parser.yy" // lalr1.cc:859 + case 422: +#line 1505 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); @@ -2490,16 +2490,16 @@ namespace isc { namespace dhcp { #line 2491 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1509 "dhcp6_parser.yy" // lalr1.cc:859 + case 423: +#line 1511 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2499 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1511 "dhcp6_parser.yy" // lalr1.cc:859 + case 424: +#line 1513 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); @@ -2508,8 +2508,8 @@ namespace isc { namespace dhcp { #line 2509 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1517 "dhcp6_parser.yy" // lalr1.cc:859 + case 425: +#line 1519 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); @@ -2519,8 +2519,8 @@ namespace isc { namespace dhcp { #line 2520 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1522 "dhcp6_parser.yy" // lalr1.cc:859 + case 426: +#line 1524 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2528,8 +2528,8 @@ namespace isc { namespace dhcp { #line 2529 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 + case 427: +#line 1532 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); @@ -2539,8 +2539,8 @@ namespace isc { namespace dhcp { #line 2540 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1535 "dhcp6_parser.yy" // lalr1.cc:859 + case 428: +#line 1537 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2548,16 +2548,16 @@ namespace isc { namespace dhcp { #line 2549 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1540 "dhcp6_parser.yy" // lalr1.cc:859 + case 429: +#line 1542 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2557 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1542 "dhcp6_parser.yy" // lalr1.cc:859 + case 430: +#line 1544 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); @@ -2566,8 +2566,8 @@ namespace isc { namespace dhcp { #line 2567 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1551 "dhcp6_parser.yy" // lalr1.cc:859 + case 431: +#line 1553 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); @@ -2577,8 +2577,8 @@ namespace isc { namespace dhcp { #line 2578 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1556 "dhcp6_parser.yy" // lalr1.cc:859 + case 432: +#line 1558 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2586,8 +2586,8 @@ namespace isc { namespace dhcp { #line 2587 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1565 "dhcp6_parser.yy" // lalr1.cc:859 + case 435: +#line 1567 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2596,8 +2596,8 @@ namespace isc { namespace dhcp { #line 2597 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1569 "dhcp6_parser.yy" // lalr1.cc:859 + case 436: +#line 1571 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2606,16 +2606,16 @@ namespace isc { namespace dhcp { #line 2607 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1591 "dhcp6_parser.yy" // lalr1.cc:859 + case 446: +#line 1593 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2615 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 445: -#line 1593 "dhcp6_parser.yy" // lalr1.cc:859 + case 447: +#line 1595 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); @@ -2624,8 +2624,8 @@ namespace isc { namespace dhcp { #line 2625 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1602 "dhcp6_parser.yy" // lalr1.cc:859 + case 448: +#line 1604 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); @@ -2635,8 +2635,8 @@ namespace isc { namespace dhcp { #line 2636 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1607 "dhcp6_parser.yy" // lalr1.cc:859 + case 449: +#line 1609 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2646,16 +2646,16 @@ namespace isc { namespace dhcp { #line 2647 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 457: -#line 1627 "dhcp6_parser.yy" // lalr1.cc:859 + case 459: +#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DUID_TYPE); } #line 2655 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 458: -#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 + case 460: +#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2663,26 +2663,26 @@ namespace isc { namespace dhcp { #line 2664 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 459: -#line 1634 "dhcp6_parser.yy" // lalr1.cc:859 + case 461: +#line 1636 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } #line 2670 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 460: -#line 1635 "dhcp6_parser.yy" // lalr1.cc:859 + case 462: +#line 1637 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } #line 2676 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 461: -#line 1636 "dhcp6_parser.yy" // lalr1.cc:859 + case 463: +#line 1638 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } #line 2682 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 462: -#line 1639 "dhcp6_parser.yy" // lalr1.cc:859 + case 464: +#line 1641 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("htype", htype); @@ -2690,16 +2690,16 @@ namespace isc { namespace dhcp { #line 2691 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 463: -#line 1644 "dhcp6_parser.yy" // lalr1.cc:859 + case 465: +#line 1646 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2699 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 464: -#line 1646 "dhcp6_parser.yy" // lalr1.cc:859 + case 466: +#line 1648 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("identifier", id); @@ -2708,8 +2708,8 @@ namespace isc { namespace dhcp { #line 2709 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 465: -#line 1652 "dhcp6_parser.yy" // lalr1.cc:859 + case 467: +#line 1654 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("time", time); @@ -2717,8 +2717,8 @@ namespace isc { namespace dhcp { #line 2718 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1657 "dhcp6_parser.yy" // lalr1.cc:859 + case 468: +#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enterprise-id", time); @@ -2726,8 +2726,8 @@ namespace isc { namespace dhcp { #line 2727 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1664 "dhcp6_parser.yy" // lalr1.cc:859 + case 469: +#line 1666 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); @@ -2735,8 +2735,8 @@ namespace isc { namespace dhcp { #line 2736 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1671 "dhcp6_parser.yy" // lalr1.cc:859 + case 470: +#line 1673 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); @@ -2746,8 +2746,8 @@ namespace isc { namespace dhcp { #line 2747 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 + case 471: +#line 1678 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2755,16 +2755,16 @@ namespace isc { namespace dhcp { #line 2756 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 474: -#line 1689 "dhcp6_parser.yy" // lalr1.cc:859 + case 476: +#line 1691 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2764 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 475: -#line 1691 "dhcp6_parser.yy" // lalr1.cc:859 + case 477: +#line 1693 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); @@ -2773,16 +2773,16 @@ namespace isc { namespace dhcp { #line 2774 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 476: -#line 1697 "dhcp6_parser.yy" // lalr1.cc:859 + case 478: +#line 1699 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2782 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 477: -#line 1699 "dhcp6_parser.yy" // lalr1.cc:859 + case 479: +#line 1701 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); @@ -2791,8 +2791,8 @@ namespace isc { namespace dhcp { #line 2792 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 478: -#line 1707 "dhcp6_parser.yy" // lalr1.cc:859 + case 480: +#line 1709 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); @@ -2802,8 +2802,8 @@ namespace isc { namespace dhcp { #line 2803 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 479: -#line 1712 "dhcp6_parser.yy" // lalr1.cc:859 + case 481: +#line 1714 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2813,8 +2813,8 @@ namespace isc { namespace dhcp { #line 2814 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 480: -#line 1719 "dhcp6_parser.yy" // lalr1.cc:859 + case 482: +#line 1721 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2823,8 +2823,8 @@ namespace isc { namespace dhcp { #line 2824 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 481: -#line 1723 "dhcp6_parser.yy" // lalr1.cc:859 + case 483: +#line 1725 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2833,8 +2833,8 @@ namespace isc { namespace dhcp { #line 2834 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 499: -#line 1750 "dhcp6_parser.yy" // lalr1.cc:859 + case 501: +#line 1752 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); @@ -2842,16 +2842,16 @@ namespace isc { namespace dhcp { #line 2843 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 500: -#line 1755 "dhcp6_parser.yy" // lalr1.cc:859 + case 502: +#line 1757 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2851 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 501: -#line 1757 "dhcp6_parser.yy" // lalr1.cc:859 + case 503: +#line 1759 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); @@ -2860,16 +2860,16 @@ namespace isc { namespace dhcp { #line 2861 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 502: -#line 1763 "dhcp6_parser.yy" // lalr1.cc:859 + case 504: +#line 1765 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2869 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1765 "dhcp6_parser.yy" // lalr1.cc:859 + case 505: +#line 1767 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); @@ -2878,8 +2878,8 @@ namespace isc { namespace dhcp { #line 2879 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1771 "dhcp6_parser.yy" // lalr1.cc:859 + case 506: +#line 1773 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); @@ -2887,16 +2887,16 @@ namespace isc { namespace dhcp { #line 2888 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1776 "dhcp6_parser.yy" // lalr1.cc:859 + case 507: +#line 1778 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2896 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1778 "dhcp6_parser.yy" // lalr1.cc:859 + case 508: +#line 1780 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); @@ -2905,8 +2905,8 @@ namespace isc { namespace dhcp { #line 2906 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1784 "dhcp6_parser.yy" // lalr1.cc:859 + case 509: +#line 1786 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); @@ -2914,8 +2914,8 @@ namespace isc { namespace dhcp { #line 2915 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1789 "dhcp6_parser.yy" // lalr1.cc:859 + case 510: +#line 1791 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); @@ -2923,16 +2923,16 @@ namespace isc { namespace dhcp { #line 2924 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1794 "dhcp6_parser.yy" // lalr1.cc:859 + case 511: +#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } #line 2932 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 + case 512: +#line 1798 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2940,28 +2940,28 @@ namespace isc { namespace dhcp { #line 2941 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1802 "dhcp6_parser.yy" // lalr1.cc:859 + case 513: +#line 1804 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } #line 2947 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1803 "dhcp6_parser.yy" // lalr1.cc:859 + case 514: +#line 1805 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 2953 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1806 "dhcp6_parser.yy" // lalr1.cc:859 + case 515: +#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } #line 2961 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 + case 516: +#line 1810 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); @@ -2970,8 +2970,8 @@ namespace isc { namespace dhcp { #line 2971 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1814 "dhcp6_parser.yy" // lalr1.cc:859 + case 517: +#line 1816 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); @@ -2979,8 +2979,8 @@ namespace isc { namespace dhcp { #line 2980 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1819 "dhcp6_parser.yy" // lalr1.cc:859 + case 518: +#line 1821 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); @@ -2988,8 +2988,8 @@ namespace isc { namespace dhcp { #line 2989 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1824 "dhcp6_parser.yy" // lalr1.cc:859 + case 519: +#line 1826 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); @@ -2997,16 +2997,16 @@ namespace isc { namespace dhcp { #line 2998 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1829 "dhcp6_parser.yy" // lalr1.cc:859 + case 520: +#line 1831 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } #line 3006 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1831 "dhcp6_parser.yy" // lalr1.cc:859 + case 521: +#line 1833 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3014,40 +3014,40 @@ namespace isc { namespace dhcp { #line 3015 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1837 "dhcp6_parser.yy" // lalr1.cc:859 + case 522: +#line 1839 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } #line 3023 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1840 "dhcp6_parser.yy" // lalr1.cc:859 + case 523: +#line 1842 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } #line 3031 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 + case 524: +#line 1845 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } #line 3039 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1846 "dhcp6_parser.yy" // lalr1.cc:859 + case 525: +#line 1848 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } #line 3047 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1849 "dhcp6_parser.yy" // lalr1.cc:859 + case 526: +#line 1851 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); @@ -3055,16 +3055,16 @@ namespace isc { namespace dhcp { #line 3056 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1855 "dhcp6_parser.yy" // lalr1.cc:859 + case 527: +#line 1857 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3064 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1857 "dhcp6_parser.yy" // lalr1.cc:859 + case 528: +#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); @@ -3073,16 +3073,16 @@ namespace isc { namespace dhcp { #line 3074 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1865 "dhcp6_parser.yy" // lalr1.cc:859 + case 529: +#line 1867 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3082 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1867 "dhcp6_parser.yy" // lalr1.cc:859 + case 530: +#line 1869 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3090,16 +3090,16 @@ namespace isc { namespace dhcp { #line 3091 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1872 "dhcp6_parser.yy" // lalr1.cc:859 + case 531: +#line 1874 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3099 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1874 "dhcp6_parser.yy" // lalr1.cc:859 + case 532: +#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3107,16 +3107,16 @@ namespace isc { namespace dhcp { #line 3108 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1879 "dhcp6_parser.yy" // lalr1.cc:859 + case 533: +#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3116 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 + case 534: +#line 1883 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3124,8 +3124,8 @@ namespace isc { namespace dhcp { #line 3125 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1892 "dhcp6_parser.yy" // lalr1.cc:859 + case 535: +#line 1894 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); @@ -3135,8 +3135,8 @@ namespace isc { namespace dhcp { #line 3136 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1897 "dhcp6_parser.yy" // lalr1.cc:859 + case 536: +#line 1899 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3144,8 +3144,8 @@ namespace isc { namespace dhcp { #line 3145 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1914 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); @@ -3155,8 +3155,8 @@ namespace isc { namespace dhcp { #line 3156 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1919 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1921 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3164,8 +3164,8 @@ namespace isc { namespace dhcp { #line 3165 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1931 "dhcp6_parser.yy" // lalr1.cc:859 + case 544: +#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); @@ -3174,16 +3174,16 @@ namespace isc { namespace dhcp { #line 3175 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1935 "dhcp6_parser.yy" // lalr1.cc:859 + case 545: +#line 1937 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3183 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1950 "dhcp6_parser.yy" // lalr1.cc:859 + case 553: +#line 1952 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); @@ -3191,16 +3191,16 @@ namespace isc { namespace dhcp { #line 3192 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1955 "dhcp6_parser.yy" // lalr1.cc:859 + case 554: +#line 1957 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3200 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1957 "dhcp6_parser.yy" // lalr1.cc:859 + case 555: +#line 1959 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); @@ -3209,8 +3209,8 @@ namespace isc { namespace dhcp { #line 3210 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1963 "dhcp6_parser.yy" // lalr1.cc:859 + case 556: +#line 1965 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); @@ -3220,8 +3220,8 @@ namespace isc { namespace dhcp { #line 3221 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1968 "dhcp6_parser.yy" // lalr1.cc:859 + case 557: +#line 1970 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3229,8 +3229,8 @@ namespace isc { namespace dhcp { #line 3230 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 558: -#line 1977 "dhcp6_parser.yy" // lalr1.cc:859 + case 560: +#line 1979 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3239,24 +3239,24 @@ namespace isc { namespace dhcp { #line 3240 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 559: -#line 1981 "dhcp6_parser.yy" // lalr1.cc:859 + case 561: +#line 1983 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3248 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 566: -#line 1995 "dhcp6_parser.yy" // lalr1.cc:859 + case 568: +#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3256 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 + case 569: +#line 1999 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); @@ -3265,8 +3265,8 @@ namespace isc { namespace dhcp { #line 3266 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 568: -#line 2003 "dhcp6_parser.yy" // lalr1.cc:859 + case 570: +#line 2005 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); @@ -3274,8 +3274,8 @@ namespace isc { namespace dhcp { #line 3275 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 569: -#line 2008 "dhcp6_parser.yy" // lalr1.cc:859 + case 571: +#line 2010 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); @@ -3283,8 +3283,8 @@ namespace isc { namespace dhcp { #line 3284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 570: -#line 2013 "dhcp6_parser.yy" // lalr1.cc:859 + case 572: +#line 2015 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); @@ -3548,107 +3548,108 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -707; + const short int Dhcp6Parser::yypact_ninf_ = -701; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 211, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, 45, 23, 61, 76, 86, 116, - 124, 126, 166, 177, 187, 204, 227, 238, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, 23, 120, 14, 121, 135, 16, - 73, 63, 67, 246, 53, 189, -13, 143, -707, 281, - 297, 304, 302, 309, -707, -707, -707, -707, -707, 314, - -707, 59, -707, -707, -707, -707, -707, -707, -707, -707, - -707, 318, 319, 337, 338, 343, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, 358, -707, -707, - -707, 82, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, 359, 94, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, 360, 361, - -707, -707, -707, -707, -707, -707, -707, -707, -707, 100, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, 131, -707, -707, - -707, -707, 362, -707, 363, 364, -707, -707, -707, 158, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, 365, 366, -707, -707, -707, - -707, -707, -707, -707, -707, 367, -707, -707, 368, -707, - -707, -707, 370, -707, -707, 369, 373, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, 374, 375, - -707, -707, -707, -707, 372, 378, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, 160, -707, -707, -707, - 379, -707, -707, 380, -707, 381, 382, -707, -707, 383, - 384, 385, -707, -707, -707, 194, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, 23, 23, -707, 219, 386, 387, 388, 389, - 390, -707, 14, -707, 391, 392, 393, 230, 247, 248, - 249, 250, 394, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 261, 410, 411, 121, -707, 412, 217, - 135, -707, 20, 413, 414, 415, 416, 417, 418, 272, - 269, 421, 422, 423, 427, 16, -707, 428, 73, -707, - 429, 282, 431, 284, 285, 63, -707, 434, 435, 436, - 437, 438, 439, 440, -707, 67, -707, 441, 442, 298, - 445, 447, 448, 299, -707, 53, 450, 303, 305, -707, - 189, 454, 456, -23, -707, 307, 458, 459, 312, 461, - 316, 320, 466, 467, 321, 322, 323, 469, 474, 143, - -707, -707, -707, 475, 473, 476, 23, 23, 23, -707, - 477, 478, 480, -707, -707, -707, -707, -707, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, -707, - 494, 495, -707, 498, -707, -707, -707, -707, -707, -707, - 496, 479, -707, -707, -707, 500, 501, 503, 330, 346, - 347, -707, -707, 271, 356, 506, 505, -707, 357, -707, - 371, -707, 376, -707, -707, -707, 498, 498, 498, 377, - 395, 396, 397, -707, 398, 409, -707, 419, 420, 424, - -707, -707, 425, -707, -707, -707, 426, 23, -707, -707, - 430, 432, -707, 433, -707, -707, -7, 443, -707, -707, - -707, 85, 444, -707, 23, 121, 446, -707, -707, -707, - 135, 13, 13, 507, 508, 509, 510, -30, 23, 93, - 58, 511, 176, 28, 229, 143, -707, -707, 515, -707, - 20, 513, 514, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, 516, 449, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, 197, -707, - 209, -707, -707, 212, -707, -707, -707, -707, 520, 521, - 525, 527, 528, -707, -707, -707, 232, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - 234, -707, 529, 530, -707, -707, 531, 533, -707, -707, - 532, 536, -707, -707, 534, 538, -707, -707, -707, 195, - -707, -707, -707, 537, -707, -707, -707, 220, -707, -707, - -707, -707, 235, -707, 539, 541, -707, 546, 547, 548, - 549, 550, 551, 266, -707, -707, -707, -707, -707, -707, - -707, -707, -707, 552, 553, 554, -707, -707, 267, -707, - -707, -707, -707, -707, -707, -707, -707, 270, -707, -707, - -707, 274, 451, 452, -707, -707, 555, 556, -707, -707, - 557, 559, -707, -707, 560, 562, -707, -707, 526, -707, - 563, 446, -707, -707, 564, 565, 568, 570, 453, 455, - 460, 457, 462, 574, 575, 13, -707, -707, 16, -707, - 507, 53, -707, 508, 189, -707, 509, 48, -707, 510, - -30, -707, -707, 93, -707, 58, -707, -13, -707, 511, - 463, 464, 465, 468, 470, 471, 176, -707, 576, 578, - 472, 481, 482, 28, -707, 581, 582, 229, -707, -707, - -707, 583, 584, -707, 73, -707, 513, 63, -707, 514, - 67, -707, 516, 586, -707, 587, -707, 308, 497, 499, - 502, -707, -707, -707, -707, -707, 504, 518, -707, 276, - -707, 580, -707, 585, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, 277, -707, -707, - -707, -707, -707, -707, -707, 278, -707, -707, -707, -707, - -707, -707, -707, -707, 244, 519, -707, -707, -707, -707, - 535, 540, -707, -707, 542, 287, -707, 288, -707, 588, - -707, 543, 590, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, 48, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, 241, -707, -707, 65, 590, -707, -707, 594, - -707, -707, -707, 294, -707, -707, -707, -707, -707, 595, - 512, 596, 65, -707, 589, -707, 544, -707, 597, -707, - -707, 327, -707, 49, 597, -707, -707, 602, 603, 604, - 295, -707, -707, -707, -707, -707, -707, 606, 522, 558, - 561, 49, -707, 545, -707, -707, -707, -707, -707 + 206, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, 32, 18, 57, 93, 101, 147, + 167, 168, 182, 184, 191, 211, 215, 217, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, 18, 58, 10, 22, 66, 169, + 63, 43, 55, 175, 64, 4, -49, 159, -701, 214, + 231, 259, 228, 241, -701, -701, -701, -701, -701, 274, + -701, 74, -701, -701, -701, -701, -701, -701, -701, -701, + -701, 293, 302, 322, 324, 337, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, 338, -701, -701, + -701, 134, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, 353, 145, -701, -701, + -701, -701, -701, -701, -701, -701, -701, 354, 355, -701, + -701, -701, -701, -701, -701, -701, -701, -701, 157, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, 185, -701, -701, + -701, -701, 356, -701, 357, 358, -701, -701, -701, -701, + 187, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, 359, 360, -701, -701, + -701, -701, -701, -701, -701, -701, 361, -701, -701, 362, + -701, -701, -701, 364, -701, -701, 363, 367, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, 368, + 370, -701, -701, -701, -701, 369, 372, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, 189, -701, -701, + -701, 374, -701, -701, 375, -701, 376, 377, -701, -701, + 378, 379, 380, -701, -701, -701, 196, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, 18, 18, -701, 225, 381, 382, 383, + 384, 385, -701, 10, -701, 386, 387, 388, 212, 244, + 245, 246, 247, 389, 390, 391, 396, 397, 398, 399, + 400, 401, 402, 403, 260, 407, 409, 22, -701, 410, + 261, 66, -701, 412, 413, 414, 415, 416, 417, 270, + 269, 420, 421, 422, 423, 169, -701, 424, 63, -701, + 425, 278, 427, 280, 281, 43, -701, 430, 431, 432, + 433, 434, 437, 438, -701, 55, -701, 439, 440, 296, + 441, 445, 446, 298, -701, 64, 447, 299, 300, -701, + 4, 451, 452, 3, -701, 303, 455, 457, 310, 459, + 312, 314, 461, 463, 315, 316, 317, 464, 468, 159, + -701, -701, -701, 469, 467, 470, 18, 18, 18, -701, + 471, 472, 474, -701, -701, -701, -701, -701, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, -701, + 488, 489, -701, 493, -701, -701, 494, 495, 496, 325, + 340, 341, -701, -701, 75, 350, 497, 498, -701, 365, + -701, 366, -701, 371, -701, -701, -701, 493, 493, 493, + 373, 392, 393, 394, -701, 395, 404, -701, 405, 406, + 408, -701, -701, 411, -701, -701, -701, 418, 18, -701, + -701, 419, 426, -701, 428, -701, -701, 1, 429, -701, + -701, -701, 27, 435, -701, 18, 22, 238, -701, -701, + -701, 66, 45, 45, 499, 500, 501, 502, -27, 18, + -14, 503, 504, 96, 60, 25, 159, -701, -701, 505, + 506, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, 507, 442, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, 202, -701, 205, -701, + -701, 213, -701, -701, -701, -701, 511, 514, 515, 516, + 517, -701, -701, -701, 229, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, 230, -701, + 519, 523, -701, -701, 521, 525, -701, -701, 524, 526, + -701, -701, 527, 528, -701, -701, -701, 256, -701, -701, + -701, 529, -701, -701, -701, 276, -701, -701, -701, -701, + 332, -701, -701, 530, 531, -701, 533, 534, 535, 536, + 537, 538, 232, -701, -701, -701, -701, -701, -701, -701, + -701, -701, 543, 544, 545, -701, -701, 240, -701, -701, + -701, -701, -701, -701, -701, -701, 242, -701, -701, -701, + 243, 436, -701, 546, 548, -701, -701, 547, 551, -701, + -701, 552, 557, -701, -701, 553, -701, 559, 238, -701, + -701, 560, 561, 562, 563, 323, 443, 352, 444, 448, + 564, 567, 45, -701, -701, 169, -701, 499, 64, -701, + 500, 4, -701, 501, 222, -701, 502, -27, -701, -701, + -14, -701, 12, 503, -701, -49, -701, 504, 449, 450, + 453, 454, 456, 458, 96, -701, 568, 569, 460, 462, + 465, 60, -701, 570, 571, 25, -701, -701, -701, 572, + 573, 63, -701, 505, 43, -701, 506, 55, -701, 507, + 576, -701, 577, -701, 313, 473, 475, 476, -701, -701, + -701, -701, -701, 490, 491, -701, 249, -701, 575, -701, + 580, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, 282, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, 581, 578, -701, -701, -701, + -701, 283, -701, -701, -701, -701, -701, -701, -701, -701, + 73, 492, -701, -701, -701, -701, 512, 513, -701, -701, + 520, 285, -701, 295, -701, 582, -701, 522, 584, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, 222, -701, 588, -701, 12, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, 333, -701, -701, 532, -701, 13, 584, -701, -701, + -701, 589, -701, -701, -701, 297, -701, -701, -701, -701, + -701, 590, 466, 591, 13, -701, 579, -701, 539, -701, + 592, -701, -701, 334, -701, -16, 592, -701, -701, 599, + 600, 603, 319, -701, -701, -701, -701, -701, -701, 605, + 508, 540, 541, -16, -701, 549, -701, -701, -701, -701, + -701 }; const unsigned short int @@ -3659,353 +3660,354 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, 56, 5, 68, 7, 102, 9, 215, 11, 349, 13, - 369, 15, 396, 17, 278, 19, 286, 21, 321, 23, - 180, 25, 480, 27, 45, 39, 0, 0, 0, 0, - 0, 0, 398, 0, 288, 323, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 533, 527, 529, 531, 0, + 370, 15, 398, 17, 278, 19, 286, 21, 321, 23, + 180, 25, 482, 27, 45, 39, 0, 0, 0, 0, + 0, 0, 400, 0, 288, 323, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 535, 529, 531, 533, 0, 65, 0, 58, 60, 62, 63, 64, 61, 100, 111, 113, 0, 0, 0, 0, 0, 207, 276, 313, 252, - 153, 170, 161, 429, 172, 191, 446, 0, 468, 478, + 153, 170, 161, 431, 172, 191, 448, 0, 470, 480, 94, 0, 70, 72, 73, 74, 75, 76, 79, 80, 81, 82, 84, 83, 88, 89, 77, 78, 86, 87, 85, 90, 91, 92, 93, 108, 0, 0, 104, 106, - 107, 433, 341, 361, 359, 237, 239, 241, 0, 0, - 245, 243, 388, 425, 236, 219, 220, 221, 222, 0, - 217, 226, 227, 228, 231, 233, 229, 230, 223, 224, - 235, 225, 232, 234, 357, 356, 354, 0, 351, 353, - 355, 381, 0, 384, 0, 0, 380, 376, 379, 0, - 371, 373, 374, 377, 378, 375, 423, 411, 413, 415, - 417, 419, 421, 410, 409, 0, 399, 400, 404, 405, - 402, 406, 407, 408, 403, 0, 303, 143, 0, 307, - 305, 310, 0, 299, 300, 0, 289, 290, 292, 302, - 293, 294, 295, 309, 296, 297, 298, 335, 0, 0, - 333, 334, 337, 338, 0, 324, 325, 327, 328, 329, - 330, 331, 332, 187, 189, 184, 0, 182, 185, 186, - 0, 500, 502, 0, 505, 0, 0, 509, 513, 0, - 0, 0, 518, 525, 498, 0, 482, 484, 485, 486, - 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 44, 0, 0, 37, 0, 0, 0, 0, 0, - 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, + 107, 341, 362, 360, 237, 239, 241, 0, 0, 245, + 243, 390, 427, 236, 219, 220, 221, 222, 0, 217, + 226, 227, 228, 231, 233, 229, 230, 223, 224, 235, + 225, 232, 234, 358, 357, 355, 354, 0, 351, 353, + 356, 383, 0, 386, 0, 0, 382, 378, 377, 381, + 0, 372, 374, 375, 379, 380, 376, 425, 413, 415, + 417, 419, 421, 423, 412, 411, 0, 401, 402, 406, + 407, 404, 408, 409, 410, 405, 0, 303, 143, 0, + 307, 305, 310, 0, 299, 300, 0, 289, 290, 292, + 302, 293, 294, 295, 309, 296, 297, 298, 335, 0, + 0, 333, 334, 337, 338, 0, 324, 325, 327, 328, + 329, 330, 331, 332, 187, 189, 184, 0, 182, 185, + 186, 0, 502, 504, 0, 507, 0, 0, 511, 515, + 0, 0, 0, 520, 527, 500, 0, 484, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 44, 0, 0, 37, 0, 0, 0, 0, + 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, - 0, 103, 435, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, + 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 350, - 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, - 0, 0, 0, 0, 397, 0, 279, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 279, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 322, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 481, 48, 41, 0, 0, 0, 0, 0, 0, 59, + 483, 48, 41, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 95, 96, 97, 98, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, - 0, 0, 71, 0, 110, 105, 444, 442, 443, 441, - 0, 436, 437, 439, 440, 0, 0, 0, 0, 0, - 0, 250, 251, 0, 0, 0, 0, 218, 0, 352, - 0, 383, 0, 386, 387, 372, 0, 0, 0, 0, - 0, 0, 0, 401, 0, 0, 301, 0, 0, 0, - 312, 291, 0, 339, 340, 326, 0, 0, 183, 499, - 0, 0, 504, 0, 507, 508, 0, 0, 515, 516, - 517, 0, 0, 483, 0, 0, 0, 528, 530, 532, - 0, 0, 0, 209, 280, 315, 254, 0, 45, 0, - 0, 174, 0, 0, 0, 0, 49, 109, 0, 434, - 0, 343, 363, 38, 360, 238, 240, 242, 247, 248, - 249, 246, 244, 390, 0, 358, 382, 385, 424, 412, - 414, 416, 418, 420, 422, 304, 144, 308, 306, 311, - 336, 188, 190, 501, 503, 506, 511, 512, 510, 514, - 520, 521, 522, 523, 524, 519, 526, 42, 0, 538, - 0, 535, 537, 0, 130, 136, 138, 140, 0, 0, - 0, 0, 0, 149, 151, 129, 0, 115, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 0, 213, 0, 210, 211, 284, 0, 281, 282, 319, - 0, 316, 317, 258, 0, 255, 256, 159, 160, 0, - 155, 157, 158, 0, 168, 169, 165, 0, 163, 166, - 167, 431, 0, 178, 0, 175, 176, 0, 0, 0, - 0, 0, 0, 0, 193, 195, 196, 197, 198, 199, - 200, 457, 463, 0, 0, 0, 456, 455, 0, 448, - 450, 453, 451, 452, 454, 474, 476, 0, 470, 472, - 473, 0, 51, 0, 438, 347, 0, 344, 345, 367, - 0, 364, 365, 394, 0, 391, 392, 427, 0, 67, - 0, 0, 534, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 112, 114, 0, 208, - 0, 288, 277, 0, 323, 314, 0, 0, 253, 0, - 0, 154, 171, 0, 162, 0, 430, 0, 173, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, - 0, 0, 0, 0, 447, 0, 0, 0, 469, 479, - 53, 0, 52, 445, 0, 342, 0, 0, 362, 0, - 398, 389, 0, 0, 426, 0, 536, 0, 0, 0, - 0, 142, 145, 146, 147, 148, 0, 0, 116, 0, - 212, 0, 283, 0, 318, 275, 272, 274, 266, 267, - 262, 263, 264, 265, 271, 270, 273, 0, 260, 268, - 269, 257, 156, 164, 432, 0, 177, 201, 202, 203, - 204, 205, 206, 194, 0, 0, 462, 465, 466, 449, - 0, 0, 471, 50, 0, 0, 346, 0, 366, 0, - 393, 0, 0, 132, 133, 134, 135, 131, 137, 139, - 141, 150, 152, 214, 285, 320, 0, 259, 179, 459, - 460, 461, 458, 464, 475, 477, 54, 348, 368, 395, - 428, 542, 0, 540, 261, 0, 0, 539, 554, 0, - 552, 550, 546, 0, 544, 548, 549, 547, 541, 0, - 0, 0, 0, 543, 0, 551, 0, 545, 0, 553, - 558, 0, 556, 0, 0, 555, 566, 0, 0, 0, - 0, 560, 562, 563, 564, 565, 557, 0, 0, 0, - 0, 0, 559, 0, 568, 569, 570, 561, 567 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, + 0, 0, 71, 0, 110, 105, 0, 0, 0, 0, + 0, 0, 250, 251, 0, 0, 0, 0, 218, 0, + 352, 0, 385, 0, 388, 389, 373, 0, 0, 0, + 0, 0, 0, 0, 403, 0, 0, 301, 0, 0, + 0, 312, 291, 0, 339, 340, 326, 0, 0, 183, + 501, 0, 0, 506, 0, 509, 510, 0, 0, 517, + 518, 519, 0, 0, 485, 0, 0, 0, 530, 532, + 534, 0, 0, 0, 209, 280, 315, 254, 0, 45, + 0, 0, 174, 0, 0, 0, 0, 49, 109, 343, + 364, 38, 361, 238, 240, 242, 247, 248, 249, 246, + 244, 392, 0, 359, 384, 387, 426, 414, 416, 418, + 420, 422, 424, 304, 144, 308, 306, 311, 336, 188, + 190, 503, 505, 508, 513, 514, 512, 516, 522, 523, + 524, 525, 526, 521, 528, 42, 0, 540, 0, 537, + 539, 0, 130, 136, 138, 140, 0, 0, 0, 0, + 0, 149, 151, 129, 0, 115, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 0, 213, + 0, 210, 211, 284, 0, 281, 282, 319, 0, 316, + 317, 258, 0, 255, 256, 159, 160, 0, 155, 157, + 158, 0, 168, 169, 165, 0, 163, 166, 167, 435, + 0, 433, 178, 0, 175, 176, 0, 0, 0, 0, + 0, 0, 0, 193, 195, 196, 197, 198, 199, 200, + 459, 465, 0, 0, 0, 458, 457, 0, 450, 452, + 455, 453, 454, 456, 476, 478, 0, 472, 474, 475, + 0, 51, 347, 0, 344, 345, 368, 0, 365, 366, + 396, 0, 393, 394, 429, 0, 67, 0, 0, 536, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 112, 114, 0, 208, 0, 288, 277, + 0, 323, 314, 0, 0, 253, 0, 0, 154, 171, + 0, 162, 437, 0, 432, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, + 0, 0, 449, 0, 0, 0, 471, 481, 53, 0, + 52, 0, 342, 0, 0, 363, 0, 400, 391, 0, + 0, 428, 0, 538, 0, 0, 0, 0, 142, 145, + 146, 147, 148, 0, 0, 116, 0, 212, 0, 283, + 0, 318, 275, 272, 274, 266, 267, 262, 263, 264, + 265, 271, 270, 273, 0, 260, 268, 269, 257, 156, + 164, 446, 444, 445, 443, 0, 438, 439, 441, 442, + 434, 0, 177, 201, 202, 203, 204, 205, 206, 194, + 0, 0, 464, 467, 468, 451, 0, 0, 473, 50, + 0, 0, 346, 0, 367, 0, 395, 0, 0, 132, + 133, 134, 135, 131, 137, 139, 141, 150, 152, 214, + 285, 320, 0, 259, 0, 436, 0, 179, 461, 462, + 463, 460, 466, 477, 479, 54, 348, 369, 397, 430, + 544, 0, 542, 261, 0, 440, 0, 0, 541, 447, + 556, 0, 554, 552, 548, 0, 546, 550, 551, 549, + 543, 0, 0, 0, 0, 545, 0, 553, 0, 547, + 0, 555, 560, 0, 558, 0, 0, 557, 568, 0, + 0, 0, 0, 562, 564, 565, 566, 567, 559, 0, + 0, 0, 0, 0, 561, 0, 570, 571, 572, 563, + 569 }; const short int Dhcp6Parser::yypgoto_[] = { - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, 12, -707, 56, -707, -707, - -707, -707, -707, -707, 90, -707, -132, -707, -707, -707, - -66, -707, -707, -707, 279, -707, -707, -707, -707, 27, - 265, -62, -50, -49, -48, -707, -707, -707, -707, -707, - 99, 273, -707, -707, -707, -707, -707, -707, -707, 103, - -104, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -74, -707, -520, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -114, -507, -707, -707, -707, -707, - -116, -707, -707, -707, -707, -707, -707, -707, -707, -121, - -707, -707, -707, -118, 237, -707, -707, -707, -707, -707, - -707, -707, -125, -707, -707, -707, -707, -707, -707, -706, - -707, -707, -707, -98, -707, -707, -707, -93, 283, -707, - -707, -704, -707, -686, -707, -518, -707, -681, -707, -707, - -707, -680, -707, -707, -707, -707, -103, -707, -707, -229, - 566, -707, -707, -707, -707, -707, -92, -707, -707, -707, - -91, -707, 257, -707, -73, -707, -707, -707, -707, -707, - -61, -707, -707, -707, -707, -707, -54, -707, -707, -707, - -90, -707, -707, -707, -89, -707, 253, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -129, -707, - -707, -707, -130, 291, -707, -707, -45, -707, -707, -707, - -707, -707, -127, -707, -707, -707, -123, 292, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -126, - -707, -707, -707, -122, -707, 310, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -674, -707, -707, -707, -707, -707, -707, -707, -707, -707, - 127, -707, -707, -707, -707, -707, -707, -86, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -95, -707, -707, -707, -707, -707, -707, -707, -707, 147, - 275, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, - -707, -707, -707, -21, -707, -707, -707, -194, -707, -707, - -204, -707, -707, -707, -707, -707, -707, -215, -707, -707, - -231, -707, -707, -707, -707, -707 + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -8, -701, 84, -701, -701, + -701, -701, -701, -701, 77, -701, -154, -701, -701, -701, + -66, -701, -701, -701, 272, -701, -701, -701, -701, 105, + 279, -68, -48, -47, -43, -701, -701, -701, -701, -701, + 102, 284, -701, -701, -701, -701, -701, -701, -701, 106, + -97, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -73, -701, -512, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -107, -507, -701, -701, -701, -701, + -109, -701, -701, -701, -701, -701, -701, -701, -701, -115, + -701, -701, -701, -112, 235, -701, -701, -701, -701, -701, + -701, -701, -114, -701, -701, -701, -701, -701, -701, -700, + -701, -701, -701, -88, -701, -701, -701, -84, 277, -701, + -701, -686, -701, -685, -701, -40, -701, -684, -701, -701, + -701, -683, -701, -701, -701, -701, -93, -701, -701, -228, + 565, -701, -701, -701, -701, -701, -85, -701, -701, -701, + -82, -701, 252, -701, -61, -701, -701, -701, -701, -701, + -56, -701, -701, -701, -701, -701, -54, -701, -701, -701, + -83, -701, -701, -701, -77, -701, 255, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -113, -701, + -701, -701, -108, 321, -701, -701, -42, -701, -701, -701, + -701, -701, -92, -701, -701, -701, -110, 292, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -94, + -701, -701, -701, -87, -701, 307, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -682, -701, -701, -701, -701, -701, -701, -46, -701, -701, + -701, -180, -701, -701, -701, -701, -701, -701, -63, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -64, -701, -701, -701, -701, -701, -701, -701, -701, + 163, 287, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, + -701, -701, -701, -701, -4, -701, -701, -701, -190, -701, + -701, -205, -701, -701, -701, -701, -701, -701, -214, -701, + -701, -230, -701, -701, -701, -701, -701 }; const short int Dhcp6Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 78, 37, 38, 65, 544, - 82, 83, 39, 64, 79, 80, 537, 692, 771, 772, - 120, 41, 66, 91, 92, 93, 306, 43, 67, 121, - 122, 123, 124, 125, 126, 127, 128, 314, 45, 68, - 147, 148, 149, 338, 150, 129, 315, 130, 316, 606, - 607, 608, 714, 857, 609, 715, 610, 716, 611, 717, - 612, 234, 378, 614, 615, 616, 617, 618, 723, 619, - 724, 131, 326, 639, 640, 641, 642, 132, 328, 647, - 648, 649, 650, 133, 327, 134, 330, 654, 655, 656, - 747, 61, 76, 266, 267, 268, 391, 269, 392, 135, - 331, 663, 664, 665, 666, 667, 668, 669, 670, 136, - 322, 622, 623, 624, 728, 47, 69, 169, 170, 171, - 346, 172, 347, 173, 348, 174, 352, 175, 351, 551, - 176, 177, 137, 325, 634, 635, 636, 737, 817, 818, - 138, 323, 55, 73, 626, 627, 628, 731, 57, 74, - 235, 236, 237, 238, 239, 240, 241, 377, 242, 381, - 243, 380, 244, 245, 382, 246, 139, 324, 630, 631, - 632, 734, 59, 75, 254, 255, 256, 257, 258, 386, - 259, 260, 261, 262, 179, 343, 696, 697, 698, 774, - 49, 70, 187, 188, 189, 357, 180, 345, 181, 344, - 700, 701, 702, 777, 51, 71, 199, 200, 201, 360, - 202, 203, 362, 204, 205, 182, 353, 704, 705, 706, - 780, 53, 72, 215, 216, 217, 218, 368, 219, 369, - 220, 370, 221, 371, 222, 372, 223, 373, 224, 367, - 183, 354, 708, 783, 140, 329, 652, 342, 450, 451, - 452, 453, 454, 538, 141, 332, 678, 679, 680, 758, - 872, 681, 682, 759, 683, 684, 142, 143, 334, 687, - 688, 689, 765, 690, 766, 144, 335, 63, 77, 285, - 286, 287, 288, 396, 289, 397, 290, 291, 399, 292, - 293, 294, 402, 578, 295, 403, 296, 297, 298, 299, - 407, 585, 300, 408, 94, 308, 95, 309, 96, 310, - 97, 307, 590, 591, 592, 710, 882, 883, 885, 893, - 894, 895, 896, 901, 897, 899, 911, 912, 913, 920, - 921, 922, 927, 923, 924, 925 + 23, 24, 25, 26, 27, 78, 37, 38, 65, 532, + 82, 83, 39, 64, 79, 80, 528, 681, 759, 760, + 120, 41, 66, 91, 92, 93, 307, 43, 67, 121, + 122, 123, 124, 125, 126, 127, 128, 315, 45, 68, + 147, 148, 149, 339, 150, 129, 316, 130, 317, 594, + 595, 596, 701, 853, 597, 702, 598, 703, 599, 704, + 600, 235, 378, 602, 603, 604, 605, 606, 710, 607, + 711, 131, 327, 627, 628, 629, 630, 132, 329, 635, + 636, 637, 638, 133, 328, 134, 331, 643, 644, 645, + 735, 61, 76, 267, 268, 269, 391, 270, 392, 135, + 332, 652, 653, 654, 655, 656, 657, 658, 659, 136, + 323, 610, 611, 612, 715, 47, 69, 168, 169, 170, + 346, 171, 347, 172, 348, 173, 352, 174, 351, 539, + 175, 176, 137, 326, 622, 623, 624, 724, 804, 805, + 138, 324, 55, 73, 614, 615, 616, 718, 57, 74, + 236, 237, 238, 239, 240, 241, 242, 377, 243, 381, + 244, 380, 245, 246, 382, 247, 139, 325, 618, 619, + 620, 721, 59, 75, 255, 256, 257, 258, 259, 386, + 260, 261, 262, 263, 178, 343, 683, 684, 685, 761, + 49, 70, 187, 188, 189, 357, 179, 345, 180, 344, + 687, 688, 689, 764, 51, 71, 200, 201, 202, 360, + 203, 204, 362, 205, 206, 181, 353, 691, 692, 693, + 767, 53, 72, 216, 217, 218, 219, 368, 220, 369, + 221, 370, 222, 371, 223, 372, 224, 373, 225, 367, + 182, 354, 695, 770, 140, 330, 640, 641, 732, 815, + 816, 817, 818, 819, 864, 141, 333, 667, 668, 669, + 746, 871, 670, 671, 747, 672, 673, 142, 143, 335, + 676, 677, 678, 753, 679, 754, 144, 336, 63, 77, + 286, 287, 288, 289, 396, 290, 397, 291, 292, 399, + 293, 294, 295, 402, 566, 296, 403, 297, 298, 299, + 300, 407, 573, 301, 408, 94, 309, 95, 310, 96, + 311, 97, 308, 578, 579, 580, 697, 881, 882, 886, + 895, 896, 897, 898, 903, 899, 901, 913, 914, 915, + 922, 923, 924, 929, 925, 926, 927 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 90, 251, 252, 164, 185, 196, 213, 165, 233, 250, - 265, 284, 651, 677, 253, 178, 186, 197, 214, 166, - 167, 168, 646, 151, 84, 190, 198, 36, 29, 594, - 30, 811, 31, 812, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 671, 28, 637, 101, 102, 103, - 104, 813, 227, 599, 108, 151, 815, 816, 108, 227, - 263, 264, 312, 820, 152, 151, 153, 313, 40, 226, - 263, 264, 154, 155, 156, 157, 158, 159, 160, 101, - 102, 103, 104, 42, 106, 336, 108, 227, 161, 162, - 337, 446, 227, 44, 228, 229, 163, 340, 230, 231, - 232, 108, 341, 355, 227, 108, 156, 157, 356, 159, - 160, 108, 576, 577, 191, 192, 193, 194, 195, 154, - 161, 638, 184, 46, 672, 673, 674, 675, 163, 154, - 161, 48, 98, 50, 358, 99, 100, 206, 89, 359, - 85, 207, 208, 209, 210, 211, 212, 145, 146, 86, - 87, 88, 101, 102, 103, 104, 105, 106, 107, 108, - 811, 365, 812, 393, 89, 89, 366, 89, 394, 637, - 644, 89, 645, 52, 32, 33, 34, 35, 916, 89, - 813, 917, 918, 919, 54, 815, 816, 109, 110, 111, - 112, 113, 820, 888, 56, 889, 890, 409, 740, 89, - 336, 741, 410, 114, 89, 709, 115, 580, 581, 582, - 583, 58, 711, 116, 89, 340, 89, 712, 89, 814, - 713, 117, 118, 743, 89, 119, 744, 824, 227, 247, - 228, 229, 248, 249, 60, 725, 646, 725, 745, 584, - 726, 746, 727, 677, 886, 62, 90, 887, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 657, 658, 659, 660, 661, 662, 448, 756, - 763, 81, 89, 767, 757, 764, 447, 409, 768, 355, - 866, 393, 769, 107, 863, 867, 868, 301, 449, 164, - 358, 365, 185, 165, 89, 877, 878, 902, 931, 196, - 302, 178, 903, 932, 186, 166, 167, 168, 303, 213, - 304, 197, 305, 190, 411, 412, 251, 252, 311, 233, - 198, 214, 317, 318, 250, 853, 854, 855, 856, 253, - 914, 685, 686, 915, 548, 549, 550, 869, 870, 871, - 89, 319, 320, 284, 558, 559, 560, 321, 814, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 333, 339, 349, 350, 361, 363, 364, 375, - 413, 444, 379, 374, 383, 376, 385, 384, 387, 388, - 389, 390, 423, 395, 398, 400, 401, 404, 405, 406, - 414, 415, 416, 417, 418, 420, 421, 422, 428, 424, - 425, 426, 427, 429, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 443, 455, 456, 457, - 458, 459, 460, 462, 461, 463, 464, 465, 517, 518, - 519, 466, 468, 470, 471, 472, 473, 474, 476, 477, - 478, 479, 480, 481, 482, 484, 485, 613, 613, 487, - 486, 488, 489, 490, 492, 605, 605, 493, 496, 494, - 497, 499, 500, 501, 502, 503, 448, 676, 504, 284, - 506, 507, 505, 511, 447, 508, 509, 510, 512, 514, - 515, 545, 540, 516, 520, 521, 449, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 546, 547, 532, - 533, 534, 535, 536, 539, 541, 542, 552, 555, 572, - 30, 553, 554, 543, 621, 625, 629, 633, 653, 693, - 695, 699, 556, 703, 718, 719, 587, 557, 561, 720, - 707, 721, 722, 730, 784, 729, 733, 732, 735, 736, - 738, 739, 588, 742, 749, 748, 562, 563, 564, 565, - 750, 751, 752, 753, 754, 755, 760, 761, 762, 776, - 566, 775, 779, 778, 579, 782, 781, 785, 787, 788, - 567, 568, 789, 589, 790, 569, 570, 571, 796, 797, - 834, 573, 835, 574, 575, 840, 841, 844, 864, 843, - 851, 419, 852, 865, 908, 586, 879, 881, 900, 904, - 906, 442, 770, 773, 910, 791, 928, 929, 930, 792, - 933, 794, 793, 445, 795, 827, 828, 829, 643, 593, - 830, 798, 831, 832, 836, 620, 822, 823, 826, 825, - 498, 833, 800, 837, 838, 799, 821, 884, 467, 225, - 801, 802, 491, 495, 845, 803, 804, 846, 858, 469, - 859, 613, 848, 860, 847, 861, 850, 475, 849, 605, - 251, 252, 164, 810, 905, 233, 165, 694, 250, 862, - 873, 805, 842, 253, 178, 806, 934, 839, 166, 167, - 168, 265, 691, 819, 513, 483, 874, 807, 808, 809, - 786, 875, 898, 876, 880, 909, 938, 676, 907, 926, - 937, 0, 0, 0, 0, 0, 0, 0, 185, 0, - 935, 196, 0, 936, 213, 0, 0, 0, 0, 0, - 186, 0, 0, 197, 0, 0, 214, 0, 0, 190, - 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, + 90, 164, 252, 163, 184, 196, 214, 36, 234, 251, + 266, 285, 666, 634, 253, 177, 186, 198, 215, 254, + 84, 165, 166, 29, 798, 30, 167, 31, 190, 199, + 185, 197, 28, 98, 264, 265, 99, 100, 799, 800, + 802, 803, 807, 228, 248, 229, 230, 249, 250, 625, + 108, 228, 228, 101, 102, 103, 104, 105, 106, 107, + 108, 582, 625, 632, 40, 633, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 660, 313, 145, 146, + 227, 108, 314, 811, 228, 587, 264, 265, 109, 110, + 111, 112, 113, 108, 191, 192, 193, 194, 195, 153, + 42, 108, 89, 228, 114, 229, 230, 115, 44, 231, + 232, 233, 183, 918, 116, 160, 919, 920, 921, 153, + 564, 565, 117, 118, 626, 207, 119, 674, 675, 208, + 209, 210, 211, 212, 213, 160, 85, 337, 536, 537, + 538, 890, 338, 891, 892, 86, 87, 88, 341, 568, + 569, 570, 571, 342, 46, 89, 661, 662, 663, 664, + 355, 89, 798, 89, 89, 356, 868, 869, 870, 32, + 33, 34, 35, 89, 48, 50, 799, 800, 802, 803, + 807, 572, 646, 647, 648, 649, 650, 651, 358, 52, + 365, 54, 393, 359, 89, 366, 89, 394, 56, 409, + 101, 102, 103, 104, 410, 337, 89, 108, 698, 81, + 696, 89, 107, 699, 89, 89, 341, 151, 58, 152, + 302, 700, 60, 634, 62, 153, 154, 155, 156, 157, + 158, 159, 712, 712, 303, 744, 305, 713, 714, 666, + 745, 160, 161, 751, 306, 755, 409, 90, 752, 162, + 756, 757, 355, 101, 102, 103, 104, 859, 106, 727, + 108, 228, 728, 304, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 312, 730, + 155, 156, 731, 158, 159, 862, 393, 164, 358, 163, + 863, 867, 184, 876, 160, 411, 412, 318, 365, 196, + 904, 177, 162, 877, 186, 905, 319, 165, 166, 214, + 89, 198, 167, 546, 547, 548, 190, 252, 185, 234, + 89, 215, 933, 199, 251, 197, 320, 934, 321, 253, + 849, 850, 851, 852, 254, 733, 887, 916, 734, 888, + 917, 322, 334, 285, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 340, 349, 350, + 361, 363, 364, 375, 423, 577, 379, 374, 383, 376, + 385, 384, 387, 89, 388, 390, 413, 389, 395, 398, + 400, 401, 404, 405, 406, 414, 415, 416, 417, 418, + 420, 421, 422, 428, 429, 430, 424, 425, 426, 427, + 431, 432, 433, 434, 435, 436, 437, 438, 508, 509, + 510, 440, 439, 441, 443, 444, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 459, 461, + 462, 463, 464, 465, 467, 468, 469, 470, 471, 601, + 601, 472, 473, 475, 476, 478, 593, 593, 477, 479, + 480, 483, 481, 484, 485, 487, 488, 490, 665, 491, + 285, 492, 493, 494, 495, 497, 496, 498, 502, 499, + 500, 501, 503, 505, 506, 778, 533, 507, 511, 512, + 560, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 534, 535, 523, 524, 525, 526, 575, 527, 529, + 530, 540, 541, 30, 780, 542, 609, 613, 617, 621, + 639, 642, 682, 686, 690, 705, 543, 544, 706, 707, + 708, 709, 545, 694, 549, 716, 717, 719, 720, 723, + 722, 726, 531, 725, 737, 729, 736, 738, 739, 740, + 741, 742, 743, 550, 551, 552, 553, 748, 749, 750, + 567, 763, 762, 765, 766, 554, 555, 556, 768, 557, + 769, 771, 558, 772, 774, 775, 776, 777, 783, 559, + 561, 784, 830, 831, 836, 837, 840, 562, 839, 563, + 847, 866, 848, 860, 910, 419, 574, 758, 861, 865, + 878, 880, 884, 902, 906, 908, 631, 779, 781, 912, + 782, 823, 824, 930, 931, 825, 826, 932, 827, 935, + 828, 576, 832, 581, 833, 785, 442, 834, 907, 608, + 809, 810, 822, 821, 854, 445, 855, 856, 489, 787, + 829, 786, 458, 808, 883, 789, 788, 482, 226, 601, + 791, 857, 858, 872, 790, 486, 593, 164, 252, 163, + 842, 797, 234, 841, 843, 251, 793, 466, 792, 813, + 253, 177, 936, 873, 874, 254, 812, 165, 166, 266, + 806, 875, 167, 879, 844, 846, 794, 795, 814, 460, + 845, 796, 474, 889, 801, 665, 885, 820, 835, 680, + 911, 838, 937, 938, 773, 184, 504, 900, 196, 909, + 940, 214, 928, 939, 0, 0, 0, 186, 0, 0, + 198, 0, 0, 215, 0, 0, 0, 0, 0, 190, + 0, 185, 199, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 810, 0, 0, 0, 0, 0, 0, 0, - 805, 0, 0, 0, 806, 0, 0, 0, 0, 0, - 0, 892, 819, 0, 0, 0, 807, 808, 809, 891, - 0, 0, 0, 0, 0, 0, 0, 0, 892, 0, - 0, 0, 0, 0, 0, 0, 891 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, + 0, 0, 0, 813, 793, 0, 792, 0, 0, 0, + 812, 0, 0, 0, 0, 0, 0, 0, 806, 0, + 0, 0, 814, 894, 794, 795, 0, 0, 0, 796, + 893, 0, 801, 0, 0, 0, 0, 0, 0, 0, + 0, 894, 0, 0, 0, 0, 0, 0, 893 }; const short int Dhcp6Parser::yycheck_[] = { - 66, 75, 75, 69, 70, 71, 72, 69, 74, 75, - 76, 77, 530, 533, 75, 69, 70, 71, 72, 69, - 69, 69, 529, 7, 10, 70, 71, 15, 5, 16, - 7, 737, 9, 737, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 16, 0, 76, 31, 32, 33, - 34, 737, 39, 25, 38, 7, 737, 737, 38, 39, - 83, 84, 3, 737, 48, 7, 50, 8, 7, 16, - 83, 84, 56, 57, 58, 59, 60, 61, 62, 31, - 32, 33, 34, 7, 36, 3, 38, 39, 72, 73, - 8, 71, 39, 7, 41, 42, 80, 3, 45, 46, - 47, 38, 8, 3, 39, 38, 58, 59, 8, 61, - 62, 38, 119, 120, 51, 52, 53, 54, 55, 56, - 72, 151, 49, 7, 96, 97, 98, 99, 80, 56, - 72, 7, 11, 7, 3, 14, 15, 70, 151, 8, - 126, 74, 75, 76, 77, 78, 79, 12, 13, 135, - 136, 137, 31, 32, 33, 34, 35, 36, 37, 38, - 866, 3, 866, 3, 151, 151, 8, 151, 8, 76, - 77, 151, 79, 7, 151, 152, 153, 154, 129, 151, - 866, 132, 133, 134, 7, 866, 866, 66, 67, 68, - 69, 70, 866, 128, 7, 130, 131, 3, 3, 151, - 3, 6, 8, 82, 151, 8, 85, 122, 123, 124, - 125, 7, 3, 92, 151, 3, 151, 8, 151, 737, - 8, 100, 101, 3, 151, 104, 6, 745, 39, 40, - 41, 42, 43, 44, 7, 3, 743, 3, 3, 154, - 8, 6, 8, 763, 3, 7, 312, 6, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 86, 87, 88, 89, 90, 91, 342, 3, - 3, 151, 151, 3, 8, 8, 342, 3, 8, 3, - 3, 3, 8, 37, 8, 8, 8, 6, 342, 355, - 3, 3, 358, 355, 151, 8, 8, 3, 3, 365, - 3, 355, 8, 8, 358, 355, 355, 355, 4, 375, - 8, 365, 3, 358, 302, 303, 390, 390, 4, 385, - 365, 375, 4, 4, 390, 17, 18, 19, 20, 390, - 3, 102, 103, 6, 63, 64, 65, 93, 94, 95, - 151, 4, 4, 409, 476, 477, 478, 4, 866, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 4, 4, 4, 4, 4, 4, 4, 3, - 151, 154, 4, 8, 4, 8, 3, 8, 4, 4, - 8, 3, 152, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 152, - 152, 152, 152, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 152, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 154, 152, 4, 4, 4, 416, 417, - 418, 4, 4, 4, 152, 4, 152, 152, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 521, 522, 4, - 152, 4, 4, 154, 4, 521, 522, 154, 4, 154, - 4, 154, 4, 4, 152, 4, 540, 533, 152, 535, - 4, 4, 152, 4, 540, 154, 154, 154, 4, 4, - 7, 151, 3, 7, 7, 7, 540, 7, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 151, 151, 7, - 7, 7, 7, 5, 8, 5, 5, 151, 151, 497, - 7, 5, 7, 457, 7, 7, 7, 7, 7, 4, - 7, 7, 151, 7, 4, 4, 514, 151, 151, 4, - 81, 4, 4, 3, 8, 6, 3, 6, 6, 3, - 6, 3, 515, 6, 3, 6, 151, 151, 151, 151, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, - 151, 6, 3, 6, 121, 3, 6, 4, 4, 4, - 151, 151, 4, 127, 4, 151, 151, 151, 4, 4, - 4, 151, 4, 151, 151, 4, 4, 3, 8, 6, - 4, 312, 5, 8, 5, 151, 8, 7, 4, 4, - 4, 336, 151, 151, 7, 152, 4, 4, 4, 154, - 4, 154, 152, 340, 152, 152, 152, 152, 528, 520, - 152, 725, 152, 152, 152, 522, 740, 743, 749, 747, - 393, 756, 730, 152, 152, 728, 739, 866, 355, 73, - 731, 733, 385, 390, 774, 734, 736, 776, 151, 358, - 151, 725, 779, 151, 777, 151, 782, 365, 780, 725, - 734, 734, 728, 737, 152, 731, 728, 540, 734, 151, - 151, 737, 767, 734, 728, 737, 154, 763, 728, 728, - 728, 747, 535, 737, 409, 375, 151, 737, 737, 737, - 711, 151, 886, 151, 151, 151, 151, 763, 902, 914, - 931, -1, -1, -1, -1, -1, -1, -1, 774, -1, - 152, 777, -1, 152, 780, -1, -1, -1, -1, -1, - 774, -1, -1, 777, -1, -1, 780, -1, -1, 774, - -1, -1, 777, -1, -1, -1, -1, -1, -1, -1, + 66, 69, 75, 69, 70, 71, 72, 15, 74, 75, + 76, 77, 524, 520, 75, 69, 70, 71, 72, 75, + 10, 69, 69, 5, 724, 7, 69, 9, 70, 71, + 70, 71, 0, 11, 83, 84, 14, 15, 724, 724, + 724, 724, 724, 39, 40, 41, 42, 43, 44, 76, + 38, 39, 39, 31, 32, 33, 34, 35, 36, 37, + 38, 16, 76, 77, 7, 79, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 16, 3, 12, 13, + 16, 38, 8, 71, 39, 25, 83, 84, 66, 67, + 68, 69, 70, 38, 51, 52, 53, 54, 55, 56, + 7, 38, 151, 39, 82, 41, 42, 85, 7, 45, + 46, 47, 49, 129, 92, 72, 132, 133, 134, 56, + 119, 120, 100, 101, 151, 70, 104, 102, 103, 74, + 75, 76, 77, 78, 79, 72, 126, 3, 63, 64, + 65, 128, 8, 130, 131, 135, 136, 137, 3, 122, + 123, 124, 125, 8, 7, 151, 96, 97, 98, 99, + 3, 151, 862, 151, 151, 8, 93, 94, 95, 151, + 152, 153, 154, 151, 7, 7, 862, 862, 862, 862, + 862, 154, 86, 87, 88, 89, 90, 91, 3, 7, + 3, 7, 3, 8, 151, 8, 151, 8, 7, 3, + 31, 32, 33, 34, 8, 3, 151, 38, 3, 151, + 8, 151, 37, 8, 151, 151, 3, 48, 7, 50, + 6, 8, 7, 730, 7, 56, 57, 58, 59, 60, + 61, 62, 3, 3, 3, 3, 8, 8, 8, 751, + 8, 72, 73, 3, 3, 3, 3, 313, 8, 80, + 8, 8, 3, 31, 32, 33, 34, 8, 36, 3, + 38, 39, 6, 4, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 4, 3, + 58, 59, 6, 61, 62, 3, 3, 355, 3, 355, + 8, 8, 358, 8, 72, 303, 304, 4, 3, 365, + 3, 355, 80, 8, 358, 8, 4, 355, 355, 375, + 151, 365, 355, 467, 468, 469, 358, 390, 358, 385, + 151, 375, 3, 365, 390, 365, 4, 8, 4, 390, + 17, 18, 19, 20, 390, 3, 3, 3, 6, 6, + 6, 4, 4, 409, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 4, 4, 4, + 4, 4, 4, 3, 152, 127, 4, 8, 4, 8, + 3, 8, 4, 151, 4, 3, 151, 8, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 152, 152, 152, 152, + 4, 4, 4, 4, 4, 4, 4, 4, 416, 417, + 418, 4, 152, 4, 4, 154, 4, 4, 4, 4, + 4, 4, 152, 154, 4, 4, 4, 4, 4, 4, + 152, 4, 152, 152, 4, 4, 4, 4, 4, 512, + 513, 4, 4, 4, 4, 4, 512, 513, 152, 4, + 4, 4, 154, 154, 154, 4, 4, 154, 524, 4, + 526, 4, 152, 4, 152, 4, 152, 4, 4, 154, + 154, 154, 4, 4, 7, 152, 151, 7, 7, 7, + 488, 7, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 151, 151, 7, 7, 7, 7, 505, 5, 5, + 5, 151, 5, 7, 152, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 4, 151, 151, 4, 4, + 4, 4, 151, 81, 151, 6, 3, 6, 3, 3, + 6, 3, 448, 6, 3, 6, 6, 4, 4, 4, + 4, 4, 4, 151, 151, 151, 151, 4, 4, 4, + 121, 3, 6, 6, 3, 151, 151, 151, 6, 151, + 3, 8, 151, 4, 4, 4, 4, 4, 4, 151, + 151, 4, 4, 4, 4, 4, 3, 151, 6, 151, + 4, 3, 5, 8, 5, 313, 151, 151, 8, 8, + 8, 7, 4, 4, 4, 4, 519, 154, 154, 7, + 152, 152, 152, 4, 4, 152, 152, 4, 152, 4, + 152, 506, 152, 511, 152, 712, 337, 152, 152, 513, + 727, 730, 737, 735, 151, 341, 151, 151, 393, 717, + 744, 715, 355, 726, 862, 720, 718, 385, 73, 712, + 723, 151, 151, 151, 721, 390, 712, 715, 721, 715, + 763, 724, 718, 761, 764, 721, 724, 365, 724, 732, + 721, 715, 154, 151, 151, 721, 732, 715, 715, 735, + 724, 151, 715, 151, 766, 769, 724, 724, 732, 358, + 767, 724, 375, 151, 724, 751, 866, 733, 751, 526, + 151, 755, 152, 152, 698, 761, 409, 887, 764, 904, + 151, 767, 916, 933, -1, -1, -1, 761, -1, -1, + 764, -1, -1, 767, -1, -1, -1, -1, -1, 761, + -1, 761, 764, -1, 764, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 866, -1, -1, -1, -1, -1, -1, -1, - 866, -1, -1, -1, 866, -1, -1, -1, -1, -1, - -1, 885, 866, -1, -1, -1, 866, 866, 866, 885, - -1, -1, -1, -1, -1, -1, -1, -1, 902, -1, - -1, -1, -1, -1, -1, -1, 902 + -1, -1, -1, -1, -1, -1, -1, -1, -1, 862, + -1, -1, -1, 866, 862, -1, 862, -1, -1, -1, + 866, -1, -1, -1, -1, -1, -1, -1, 862, -1, + -1, -1, 866, 886, 862, 862, -1, -1, -1, 862, + 886, -1, 862, -1, -1, -1, -1, -1, -1, -1, + -1, 904, -1, -1, -1, -1, -1, -1, 904 }; const unsigned short int @@ -4017,94 +4019,95 @@ namespace isc { namespace dhcp { 7, 9, 151, 152, 153, 154, 170, 171, 172, 177, 7, 186, 7, 192, 7, 203, 7, 280, 7, 355, 7, 369, 7, 386, 7, 307, 7, 313, 7, 337, - 7, 256, 7, 442, 178, 173, 187, 193, 204, 281, - 356, 370, 387, 308, 314, 338, 257, 443, 170, 179, + 7, 256, 7, 443, 178, 173, 187, 193, 204, 281, + 356, 370, 387, 308, 314, 338, 257, 444, 170, 179, 180, 151, 175, 176, 10, 126, 135, 136, 137, 151, - 185, 188, 189, 190, 469, 471, 473, 475, 11, 14, + 185, 188, 189, 190, 470, 472, 474, 476, 11, 14, 15, 31, 32, 33, 34, 35, 36, 37, 38, 66, 67, 68, 69, 70, 82, 85, 92, 100, 101, 104, 185, 194, 195, 196, 197, 198, 199, 200, 201, 210, 212, 236, 242, 248, 250, 264, 274, 297, 305, 331, - 409, 419, 431, 432, 440, 12, 13, 205, 206, 207, - 209, 7, 48, 50, 56, 57, 58, 59, 60, 61, - 62, 72, 73, 80, 185, 196, 197, 198, 199, 282, - 283, 284, 286, 288, 290, 292, 295, 296, 331, 349, - 361, 363, 380, 405, 49, 185, 331, 357, 358, 359, - 361, 51, 52, 53, 54, 55, 185, 331, 361, 371, - 372, 373, 375, 376, 378, 379, 70, 74, 75, 76, - 77, 78, 79, 185, 331, 388, 389, 390, 391, 393, - 395, 397, 399, 401, 403, 305, 16, 39, 41, 42, - 45, 46, 47, 185, 226, 315, 316, 317, 318, 319, - 320, 321, 323, 325, 327, 328, 330, 40, 43, 44, - 185, 226, 319, 325, 339, 340, 341, 342, 343, 345, - 346, 347, 348, 83, 84, 185, 258, 259, 260, 262, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 185, 444, 445, 446, 447, 449, - 451, 452, 454, 455, 456, 459, 461, 462, 463, 464, - 467, 6, 3, 4, 8, 3, 191, 476, 470, 472, - 474, 4, 3, 8, 202, 211, 213, 4, 4, 4, - 4, 4, 275, 306, 332, 298, 237, 249, 243, 410, - 251, 265, 420, 4, 433, 441, 3, 8, 208, 4, - 3, 8, 412, 350, 364, 362, 285, 287, 289, 4, + 409, 420, 432, 433, 441, 12, 13, 205, 206, 207, + 209, 48, 50, 56, 57, 58, 59, 60, 61, 62, + 72, 73, 80, 185, 196, 197, 198, 199, 282, 283, + 284, 286, 288, 290, 292, 295, 296, 331, 349, 361, + 363, 380, 405, 49, 185, 290, 331, 357, 358, 359, + 361, 51, 52, 53, 54, 55, 185, 290, 331, 361, + 371, 372, 373, 375, 376, 378, 379, 70, 74, 75, + 76, 77, 78, 79, 185, 331, 388, 389, 390, 391, + 393, 395, 397, 399, 401, 403, 305, 16, 39, 41, + 42, 45, 46, 47, 185, 226, 315, 316, 317, 318, + 319, 320, 321, 323, 325, 327, 328, 330, 40, 43, + 44, 185, 226, 319, 325, 339, 340, 341, 342, 343, + 345, 346, 347, 348, 83, 84, 185, 258, 259, 260, + 262, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 185, 445, 446, 447, 448, + 450, 452, 453, 455, 456, 457, 460, 462, 463, 464, + 465, 468, 6, 3, 4, 8, 3, 191, 477, 471, + 473, 475, 4, 3, 8, 202, 211, 213, 4, 4, + 4, 4, 4, 275, 306, 332, 298, 237, 249, 243, + 410, 251, 265, 421, 4, 434, 442, 3, 8, 208, + 4, 3, 8, 350, 364, 362, 285, 287, 289, 4, 4, 293, 291, 381, 406, 3, 8, 360, 3, 8, 374, 4, 377, 4, 4, 3, 8, 404, 392, 394, 396, 398, 400, 402, 8, 3, 8, 322, 227, 4, 326, 324, 329, 4, 8, 3, 344, 4, 4, 8, - 3, 261, 263, 3, 8, 4, 448, 450, 4, 453, - 4, 4, 457, 460, 4, 4, 4, 465, 468, 3, + 3, 261, 263, 3, 8, 4, 449, 451, 4, 454, + 4, 4, 458, 461, 4, 4, 4, 466, 469, 3, 8, 170, 170, 151, 4, 4, 4, 4, 4, 189, 4, 4, 4, 152, 152, 152, 152, 152, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 152, - 4, 4, 195, 4, 154, 206, 71, 185, 226, 331, - 413, 414, 415, 416, 417, 4, 4, 4, 4, 4, - 4, 152, 154, 4, 4, 4, 4, 283, 4, 358, - 4, 152, 4, 152, 152, 372, 4, 4, 4, 4, - 4, 4, 4, 390, 4, 4, 152, 4, 4, 4, - 154, 317, 4, 154, 154, 341, 4, 4, 259, 154, - 4, 4, 152, 4, 152, 152, 4, 4, 154, 154, - 154, 4, 4, 445, 4, 7, 7, 170, 170, 170, - 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 7, 7, 7, 7, 5, 181, 418, 8, - 3, 5, 5, 172, 174, 151, 151, 151, 63, 64, - 65, 294, 151, 5, 7, 151, 151, 151, 181, 181, - 181, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 170, 151, 151, 151, 119, 120, 458, 121, - 122, 123, 124, 125, 154, 466, 151, 170, 194, 127, - 477, 478, 479, 205, 16, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 185, 214, 215, 216, 219, - 221, 223, 225, 226, 228, 229, 230, 231, 232, 234, - 214, 7, 276, 277, 278, 7, 309, 310, 311, 7, - 333, 334, 335, 7, 299, 300, 301, 76, 151, 238, - 239, 240, 241, 179, 77, 79, 240, 244, 245, 246, - 247, 290, 411, 7, 252, 253, 254, 86, 87, 88, - 89, 90, 91, 266, 267, 268, 269, 270, 271, 272, - 273, 16, 96, 97, 98, 99, 185, 228, 421, 422, - 423, 426, 427, 429, 430, 102, 103, 434, 435, 436, - 438, 444, 182, 4, 415, 7, 351, 352, 353, 7, - 365, 366, 367, 7, 382, 383, 384, 81, 407, 8, - 480, 3, 8, 8, 217, 220, 222, 224, 4, 4, - 4, 4, 4, 233, 235, 3, 8, 8, 279, 6, - 3, 312, 6, 3, 336, 6, 3, 302, 6, 3, - 3, 6, 6, 3, 6, 3, 6, 255, 6, 3, - 4, 4, 4, 4, 4, 4, 3, 8, 424, 428, - 4, 4, 4, 3, 8, 437, 439, 3, 8, 8, - 151, 183, 184, 151, 354, 6, 3, 368, 6, 3, - 385, 6, 3, 408, 8, 4, 478, 4, 4, 4, - 4, 152, 154, 152, 154, 152, 4, 4, 215, 282, - 278, 315, 311, 339, 335, 185, 196, 197, 198, 199, - 226, 274, 286, 288, 290, 292, 296, 303, 304, 331, - 405, 301, 239, 245, 290, 258, 254, 152, 152, 152, - 152, 152, 152, 267, 4, 4, 152, 152, 152, 422, - 4, 4, 435, 6, 3, 357, 353, 371, 367, 388, - 384, 4, 5, 17, 18, 19, 20, 218, 151, 151, - 151, 151, 151, 8, 8, 8, 3, 8, 8, 93, - 94, 95, 425, 151, 151, 151, 151, 8, 8, 8, - 151, 7, 481, 482, 304, 483, 3, 6, 128, 130, - 131, 185, 226, 484, 485, 486, 487, 489, 482, 490, - 4, 488, 3, 8, 4, 152, 4, 485, 5, 151, - 7, 491, 492, 493, 3, 6, 129, 132, 133, 134, - 494, 495, 496, 498, 499, 500, 492, 497, 4, 4, - 4, 3, 8, 4, 154, 152, 152, 495, 151 + 4, 4, 195, 4, 154, 206, 4, 4, 4, 4, + 4, 4, 152, 154, 4, 4, 4, 4, 283, 4, + 358, 4, 152, 4, 152, 152, 372, 4, 4, 4, + 4, 4, 4, 4, 390, 4, 4, 152, 4, 4, + 4, 154, 317, 4, 154, 154, 341, 4, 4, 259, + 154, 4, 4, 152, 4, 152, 152, 4, 4, 154, + 154, 154, 4, 4, 446, 4, 7, 7, 170, 170, + 170, 7, 7, 7, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 7, 7, 7, 7, 5, 181, 5, + 5, 172, 174, 151, 151, 151, 63, 64, 65, 294, + 151, 5, 7, 151, 151, 151, 181, 181, 181, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 170, 151, 151, 151, 119, 120, 459, 121, 122, 123, + 124, 125, 154, 467, 151, 170, 194, 127, 478, 479, + 480, 205, 16, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 185, 214, 215, 216, 219, 221, 223, + 225, 226, 228, 229, 230, 231, 232, 234, 214, 7, + 276, 277, 278, 7, 309, 310, 311, 7, 333, 334, + 335, 7, 299, 300, 301, 76, 151, 238, 239, 240, + 241, 179, 77, 79, 240, 244, 245, 246, 247, 7, + 411, 412, 7, 252, 253, 254, 86, 87, 88, 89, + 90, 91, 266, 267, 268, 269, 270, 271, 272, 273, + 16, 96, 97, 98, 99, 185, 228, 422, 423, 424, + 427, 428, 430, 431, 102, 103, 435, 436, 437, 439, + 445, 182, 7, 351, 352, 353, 7, 365, 366, 367, + 7, 382, 383, 384, 81, 407, 8, 481, 3, 8, + 8, 217, 220, 222, 224, 4, 4, 4, 4, 4, + 233, 235, 3, 8, 8, 279, 6, 3, 312, 6, + 3, 336, 6, 3, 302, 6, 3, 3, 6, 6, + 3, 6, 413, 3, 6, 255, 6, 3, 4, 4, + 4, 4, 4, 4, 3, 8, 425, 429, 4, 4, + 4, 3, 8, 438, 440, 3, 8, 8, 151, 183, + 184, 354, 6, 3, 368, 6, 3, 385, 6, 3, + 408, 8, 4, 479, 4, 4, 4, 4, 152, 154, + 152, 154, 152, 4, 4, 215, 282, 278, 315, 311, + 339, 335, 185, 196, 197, 198, 199, 226, 274, 286, + 288, 290, 292, 296, 303, 304, 331, 405, 301, 239, + 245, 71, 185, 226, 331, 414, 415, 416, 417, 418, + 412, 258, 254, 152, 152, 152, 152, 152, 152, 267, + 4, 4, 152, 152, 152, 423, 4, 4, 436, 6, + 3, 357, 353, 371, 367, 388, 384, 4, 5, 17, + 18, 19, 20, 218, 151, 151, 151, 151, 151, 8, + 8, 8, 3, 8, 419, 8, 3, 8, 93, 94, + 95, 426, 151, 151, 151, 151, 8, 8, 8, 151, + 7, 482, 483, 304, 4, 416, 484, 3, 6, 151, + 128, 130, 131, 185, 226, 485, 486, 487, 488, 490, + 483, 491, 4, 489, 3, 8, 4, 152, 4, 486, + 5, 151, 7, 492, 493, 494, 3, 6, 129, 132, + 133, 134, 495, 496, 497, 499, 500, 501, 493, 498, + 4, 4, 4, 3, 8, 4, 154, 152, 152, 496, + 151 }; const unsigned short int @@ -4145,29 +4148,29 @@ namespace isc { namespace dhcp { 335, 338, 337, 339, 339, 340, 340, 341, 341, 341, 341, 341, 341, 341, 342, 344, 343, 345, 346, 347, 348, 350, 349, 351, 351, 352, 352, 354, 353, 356, - 355, 357, 357, 358, 358, 358, 358, 360, 359, 362, - 361, 364, 363, 365, 365, 366, 366, 368, 367, 370, - 369, 371, 371, 372, 372, 372, 372, 372, 372, 372, - 372, 374, 373, 375, 377, 376, 378, 379, 381, 380, - 382, 382, 383, 383, 385, 384, 387, 386, 388, 388, - 389, 389, 390, 390, 390, 390, 390, 390, 390, 390, - 390, 392, 391, 394, 393, 396, 395, 398, 397, 400, - 399, 402, 401, 404, 403, 406, 405, 408, 407, 410, - 409, 411, 411, 412, 290, 413, 413, 414, 414, 415, - 415, 415, 415, 416, 418, 417, 420, 419, 421, 421, - 422, 422, 422, 422, 422, 422, 422, 424, 423, 425, - 425, 425, 426, 428, 427, 429, 430, 431, 433, 432, - 434, 434, 435, 435, 437, 436, 439, 438, 441, 440, - 443, 442, 444, 444, 445, 445, 445, 445, 445, 445, - 445, 445, 445, 445, 445, 445, 445, 445, 445, 446, - 448, 447, 450, 449, 451, 453, 452, 454, 455, 457, - 456, 458, 458, 460, 459, 461, 462, 463, 465, 464, - 466, 466, 466, 466, 466, 468, 467, 470, 469, 472, - 471, 474, 473, 476, 475, 477, 477, 478, 480, 479, - 481, 481, 483, 482, 484, 484, 485, 485, 485, 485, - 485, 486, 488, 487, 490, 489, 491, 491, 493, 492, - 494, 494, 495, 495, 495, 495, 497, 496, 498, 499, - 500 + 355, 357, 357, 358, 358, 358, 358, 358, 360, 359, + 362, 361, 364, 363, 365, 365, 366, 366, 368, 367, + 370, 369, 371, 371, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 374, 373, 375, 377, 376, 378, 379, + 381, 380, 382, 382, 383, 383, 385, 384, 387, 386, + 388, 388, 389, 389, 390, 390, 390, 390, 390, 390, + 390, 390, 390, 392, 391, 394, 393, 396, 395, 398, + 397, 400, 399, 402, 401, 404, 403, 406, 405, 408, + 407, 410, 409, 411, 411, 413, 412, 414, 414, 415, + 415, 416, 416, 416, 416, 417, 419, 418, 421, 420, + 422, 422, 423, 423, 423, 423, 423, 423, 423, 425, + 424, 426, 426, 426, 427, 429, 428, 430, 431, 432, + 434, 433, 435, 435, 436, 436, 438, 437, 440, 439, + 442, 441, 444, 443, 445, 445, 446, 446, 446, 446, + 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, + 446, 447, 449, 448, 451, 450, 452, 454, 453, 455, + 456, 458, 457, 459, 459, 461, 460, 462, 463, 464, + 466, 465, 467, 467, 467, 467, 467, 469, 468, 471, + 470, 473, 472, 475, 474, 477, 476, 478, 478, 479, + 481, 480, 482, 482, 484, 483, 485, 485, 486, 486, + 486, 486, 486, 487, 489, 488, 491, 490, 492, 492, + 494, 493, 495, 495, 496, 496, 496, 496, 498, 497, + 499, 500, 501 }; const unsigned char @@ -4208,29 +4211,29 @@ namespace isc { namespace dhcp { 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, - 4, 1, 3, 1, 1, 1, 1, 0, 4, 0, - 4, 0, 6, 0, 1, 1, 3, 0, 4, 0, - 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 3, 0, 4, 3, 3, 0, 6, - 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 6, 0, 4, 0, - 6, 1, 3, 0, 4, 0, 1, 1, 3, 1, - 1, 1, 1, 1, 0, 4, 0, 6, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, - 1, 1, 3, 0, 4, 3, 3, 3, 0, 6, - 1, 3, 1, 1, 0, 4, 0, 4, 0, 6, + 4, 1, 3, 1, 1, 1, 1, 1, 0, 4, + 0, 4, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 4, 0, 4, 3, 0, 4, 3, 3, 0, - 4, 1, 1, 0, 4, 3, 3, 3, 0, 4, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 6, 1, 3, 1, 0, 6, - 1, 3, 0, 4, 1, 3, 1, 1, 1, 1, - 1, 3, 0, 4, 0, 6, 1, 3, 0, 4, - 1, 3, 1, 1, 1, 1, 0, 4, 3, 3, - 3 + 1, 1, 1, 0, 4, 3, 0, 4, 3, 3, + 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, + 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, + 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 0, 4, 0, 6, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 1, 1, 1, 3, 0, 4, 3, 3, 3, + 0, 6, 1, 3, 1, 1, 0, 4, 0, 4, + 0, 6, 0, 4, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 0, 4, 0, 4, 3, 0, 4, 3, + 3, 0, 4, 1, 1, 0, 4, 3, 3, 3, + 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 6, 1, 3, 1, + 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, + 1, 1, 1, 3, 0, 4, 0, 6, 1, 3, + 0, 4, 1, 3, 1, 1, 1, 1, 0, 4, + 3, 3, 3 }; @@ -4344,25 +4347,26 @@ namespace isc { namespace dhcp { "$@78", "hw_address", "$@79", "hostname", "$@80", "flex_id_value", "$@81", "reservation_client_classes", "$@82", "relay", "$@83", "relay_map", "$@84", "client_classes", "$@85", "client_classes_list", - "$@86", "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@87", - "server_id", "$@88", "server_id_params", "server_id_param", - "server_id_type", "$@89", "duid_type", "htype", "identifier", "$@90", - "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@91", - "control_socket_params", "control_socket_param", "socket_type", "$@92", - "socket_name", "$@93", "dhcp_ddns", "$@94", "sub_dhcp_ddns", "$@95", - "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@96", "server_ip", "$@97", "server_port", - "sender_ip", "$@98", "sender_port", "max_queue_size", "ncr_protocol", - "$@99", "ncr_protocol_value", "ncr_format", "$@100", - "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@101", "replace_client_name_value", - "generated_prefix", "$@102", "dhcp4_json_object", "$@103", - "dhcpddns_json_object", "$@104", "control_agent_json_object", "$@105", - "logging_object", "$@106", "logging_params", "logging_param", "loggers", - "$@107", "loggers_entries", "logger_entry", "$@108", "logger_params", - "logger_param", "debuglevel", "severity", "$@109", "output_options_list", - "$@110", "output_options_list_content", "output_entry", "$@111", + "client_class_entry", "$@86", "client_class_params", + "not_empty_client_class_params", "client_class_param", + "client_class_name", "client_class_test", "$@87", "server_id", "$@88", + "server_id_params", "server_id_param", "server_id_type", "$@89", + "duid_type", "htype", "identifier", "$@90", "time", "enterprise_id", + "dhcp4o6_port", "control_socket", "$@91", "control_socket_params", + "control_socket_param", "socket_type", "$@92", "socket_name", "$@93", + "dhcp_ddns", "$@94", "sub_dhcp_ddns", "$@95", "dhcp_ddns_params", + "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@96", + "server_ip", "$@97", "server_port", "sender_ip", "$@98", "sender_port", + "max_queue_size", "ncr_protocol", "$@99", "ncr_protocol_value", + "ncr_format", "$@100", "always_include_fqdn", "override_no_update", + "override_client_update", "replace_client_name", "$@101", + "replace_client_name_value", "generated_prefix", "$@102", + "dhcp4_json_object", "$@103", "dhcpddns_json_object", "$@104", + "control_agent_json_object", "$@105", "logging_object", "$@106", + "logging_params", "logging_param", "loggers", "$@107", "loggers_entries", + "logger_entry", "$@108", "logger_params", "logger_param", "debuglevel", + "severity", "$@109", "output_options_list", "$@110", + "output_options_list_content", "output_entry", "$@111", "output_params_list", "output_params", "output", "$@112", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4406,29 +4410,29 @@ namespace isc { namespace dhcp { 1178, 1190, 1190, 1202, 1203, 1208, 1209, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1223, 1225, 1225, 1233, 1235, 1237, 1242, 1250, 1250, 1262, 1263, 1266, 1267, 1270, 1270, 1280, - 1280, 1289, 1290, 1293, 1294, 1295, 1296, 1299, 1299, 1307, - 1307, 1317, 1317, 1329, 1330, 1333, 1334, 1337, 1337, 1349, - 1349, 1361, 1362, 1365, 1366, 1367, 1368, 1369, 1370, 1371, - 1372, 1375, 1375, 1383, 1388, 1388, 1396, 1401, 1409, 1409, - 1419, 1420, 1423, 1424, 1427, 1427, 1436, 1436, 1445, 1446, - 1449, 1450, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, - 1462, 1465, 1465, 1475, 1475, 1485, 1485, 1493, 1493, 1501, - 1501, 1509, 1509, 1517, 1517, 1530, 1530, 1540, 1540, 1551, - 1551, 1561, 1562, 1565, 1565, 1575, 1576, 1579, 1580, 1583, - 1584, 1585, 1586, 1589, 1591, 1591, 1602, 1602, 1614, 1615, - 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1627, 1627, 1634, - 1635, 1636, 1639, 1644, 1644, 1652, 1657, 1664, 1671, 1671, - 1681, 1682, 1685, 1686, 1689, 1689, 1697, 1697, 1707, 1707, - 1719, 1719, 1729, 1730, 1733, 1734, 1735, 1736, 1737, 1738, - 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1750, - 1755, 1755, 1763, 1763, 1771, 1776, 1776, 1784, 1789, 1794, - 1794, 1802, 1803, 1806, 1806, 1814, 1819, 1824, 1829, 1829, - 1837, 1840, 1843, 1846, 1849, 1855, 1855, 1865, 1865, 1872, - 1872, 1879, 1879, 1892, 1892, 1905, 1906, 1910, 1914, 1914, - 1926, 1927, 1931, 1931, 1939, 1940, 1943, 1944, 1945, 1946, - 1947, 1950, 1955, 1955, 1963, 1963, 1973, 1974, 1977, 1977, - 1985, 1986, 1989, 1990, 1991, 1992, 1995, 1995, 2003, 2008, - 2013 + 1280, 1289, 1290, 1293, 1294, 1295, 1296, 1297, 1300, 1300, + 1308, 1308, 1318, 1318, 1330, 1331, 1334, 1335, 1338, 1338, + 1350, 1350, 1362, 1363, 1366, 1367, 1368, 1369, 1370, 1371, + 1372, 1373, 1374, 1377, 1377, 1385, 1390, 1390, 1398, 1403, + 1411, 1411, 1421, 1422, 1425, 1426, 1429, 1429, 1438, 1438, + 1447, 1448, 1451, 1452, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1467, 1467, 1477, 1477, 1487, 1487, 1495, + 1495, 1503, 1503, 1511, 1511, 1519, 1519, 1532, 1532, 1542, + 1542, 1553, 1553, 1563, 1564, 1567, 1567, 1577, 1578, 1581, + 1582, 1585, 1586, 1587, 1588, 1591, 1593, 1593, 1604, 1604, + 1616, 1617, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1629, + 1629, 1636, 1637, 1638, 1641, 1646, 1646, 1654, 1659, 1666, + 1673, 1673, 1683, 1684, 1687, 1688, 1691, 1691, 1699, 1699, + 1709, 1709, 1721, 1721, 1731, 1732, 1735, 1736, 1737, 1738, + 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, + 1749, 1752, 1757, 1757, 1765, 1765, 1773, 1778, 1778, 1786, + 1791, 1796, 1796, 1804, 1805, 1808, 1808, 1816, 1821, 1826, + 1831, 1831, 1839, 1842, 1845, 1848, 1851, 1857, 1857, 1867, + 1867, 1874, 1874, 1881, 1881, 1894, 1894, 1907, 1908, 1912, + 1916, 1916, 1928, 1929, 1933, 1933, 1941, 1942, 1945, 1946, + 1947, 1948, 1949, 1952, 1957, 1957, 1965, 1965, 1975, 1976, + 1979, 1979, 1987, 1988, 1991, 1992, 1993, 1994, 1997, 1997, + 2005, 2010, 2015 }; // Print the state stack on the debug stream. @@ -4463,8 +4467,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4467 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2018 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4471 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2020 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index 74da420982..ebc67f6955 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -1430,8 +1430,8 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 836, ///< Last index in yytable_. - yynnts_ = 346, ///< Number of nonterminal symbols. + yylast_ = 838, ///< Last index in yytable_. + yynnts_ = 347, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, @@ -1531,9 +1531,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.copy< ElementPtr > (other.value); break; @@ -1574,9 +1574,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.copy< ElementPtr > (v); break; @@ -1676,9 +1676,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.template destroy< ElementPtr > (); break; @@ -1725,9 +1725,9 @@ namespace isc { namespace dhcp { case 174: // map_value case 218: // db_type case 294: // hr_mode - case 425: // duid_type - case 458: // ncr_protocol_value - case 466: // replace_client_name_value + case 426: // duid_type + case 459: // ncr_protocol_value + case 467: // replace_client_name_value value.move< ElementPtr > (s.value); break; diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index e92157cf62..ae485e22aa 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201709141022 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 773b8f56c0..3cf50f8471 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201709141022 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index f1d230b1c1..dbed07ff12 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201709141022 +// Generated 201711032151 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 53440e83787db21b79b47c1be41ba92e0cb02542 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 3 Nov 2017 23:34:21 +0100 Subject: [PATCH 03/52] [5425] Added class/pool in doc and examples --- doc/examples/kea4/classify.json | 22 ++++++++++++++- doc/examples/kea6/classify.json | 12 ++++++++ doc/guide/classify.xml | 50 +++++++++++++++++++++++++++++++++ doc/guide/dhcp4-srv.xml | 9 ++++++ doc/guide/dhcp6-srv.xml | 10 +++++++ 5 files changed, 102 insertions(+), 1 deletion(-) diff --git a/doc/examples/kea4/classify.json b/doc/examples/kea4/classify.json index 6964960e22..e769e581f0 100644 --- a/doc/examples/kea4/classify.json +++ b/doc/examples/kea4/classify.json @@ -97,7 +97,27 @@ "client-classes": [ "VoIP" ] } ], "interface": "ethX" - } + }, + +// The following list defines a subnet with pools. For some pools +// we defined a class that is allowed in that pool. If not specified +// everyone is allowed. When a class is specified, only packets belonging +// to that class are allowed for that pool. + { + "pools": [ + { +// This one is for VoIP devices only. + "pool": "192.0.4.1 - 192.0.4.200", + "client-class": "VoIP" + }, +// This one doesn't have any client-class specified, so everyone +// is allowed in. + { + "pool": "192.0.5.1 - 192.0.5.200" + } ], + "subnet": "192.0.4.0/23", + "interface": "ethY" + } ] }, diff --git a/doc/examples/kea6/classify.json b/doc/examples/kea6/classify.json index eaa37beec4..b6e184b618 100644 --- a/doc/examples/kea6/classify.json +++ b/doc/examples/kea6/classify.json @@ -73,7 +73,19 @@ "client-classes": [ "cable-modems" ] } ], "interface": "ethX" + }, +// The following subnet contains a pool with a class constraint: only +// clients which belong to the class are allowed to use this pool. + { + "pools": [ + { + "pool": "2001:db8:3::/80", + "client-class": "cable-modems" + } ], + "subnet": "2001:db8:4::/64", + "interface": "ethY" } + ] }, diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index cfc515f9a1..bd5ab03907 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -801,6 +801,56 @@ concatenation of the strings +
+ Configuring Pools With Class Information + + Similar to subnets in certain cases access to certain address or + prefix pools must be restricted to only clients that belong to a + given class, using the "client-class" when defining the pool. + + + + Let's assume that the server is connected to a network segment that uses + the 192.0.2.0/24 prefix. The Administrator of that network has decided + that addresses from range 192.0.2.10 to 192.0.2.20 are going to be + managed by the DHCP4 server. Only clients belonging to client class + Client_foo are allowed to use this pool. Such a + configuration can be achieved in the following way: + +"Dhcp4": { + "client-classes": [ + { + "name": "Client_foo", + "test": "substring(option[61].hex,0,3) == 'foo'", + "option-data": [ + { + "name": "domain-name-servers", + "code": 6, + "space": "dhcp4", + "csv-format": true, + "data": "192.0.2.1, 192.0.2.2" + } + ] + }, + ... + ], + "subnet4": [ + { + "subnet": "192.0.2.0/24", + "pools": [ + { + "pool": "192.0.2.10 - 192.0.2.20", + "client-class": "Client_foo" + } + ] + }, + ... + ],, + ... +} + +
+
Using Classes diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index b0070184be..bdd58cf015 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2081,6 +2081,15 @@ It is merely echoed by the server class restrictions on subnets, see . + + When subnets belong to a shared network the classification applies + to subnet selection but not to pools, e.g., a pool in a subnet + limited to a particular class can still be used by clients which do not + belong to the class if the pool they are expected to use is exhausted. + So the limit access based on class information is also available + at the pool level, see . + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 06d5717aed..a577843c37 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1940,6 +1940,16 @@ should include options from the isc option space: class restrictions on subnets, see . + + When subnets belong to a shared network the classification applies + to subnet selection but not to pools, e.g., a pool in a subnet + limited to a particular class can still be used by clients which do not + belong to the class if the pool they are expected to use is exhausted. + So the limit access based on class information is also available + at the address/prefix pool level, see . + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The From 90a8c58d1a4ed66e2291f4ca5f255dd70501cf81 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 4 Nov 2017 10:12:17 +0100 Subject: [PATCH 04/52] [5425] Checkpoint: code one, tests todo --- src/lib/dhcpsrv/alloc_engine.cc | 173 +++++++++++++----- src/lib/dhcpsrv/alloc_engine.h | 38 +++- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 11 ++ .../dhcpsrv/parsers/shared_network_parser.cc | 4 +- src/lib/dhcpsrv/pool.cc | 33 +++- src/lib/dhcpsrv/pool.h | 67 +++++++ src/lib/dhcpsrv/subnet.cc | 66 +++++++ src/lib/dhcpsrv/subnet.h | 36 +++- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 4 +- .../dhcpsrv/tests/alloc_engine6_unittest.cc | 70 +++---- src/lib/dhcpsrv/tests/alloc_engine_utils.h | 2 + 11 files changed, 412 insertions(+), 92 deletions(-) diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index c7c08c371a..e6945c0aa7 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -144,19 +144,33 @@ AllocEngine::IterativeAllocator::increasePrefix(const isc::asiolink::IOAddress& return (IOAddress::fromBytes(AF_INET6, packed)); } +isc::asiolink::IOAddress +AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress& address, + bool prefix, + const uint8_t prefix_len) { + if (!prefix) { + return (IOAddress::increase(address)); + } else { + return (increasePrefix(address, prefix_len)); + } +} isc::asiolink::IOAddress AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, const DuidPtr&, const IOAddress&) { // Is this prefix allocation? bool prefix = pool_type_ == Lease::TYPE_PD; + uint8_t prefix_len = 0; // Let's get the last allocated address. It is usually set correctly, // but there are times when it won't be (like after removing a pool or // perhaps restarting the server). IOAddress last = subnet->getLastAllocated(pool_type_); + bool valid = true; + bool retrying = false; const PoolCollection& pools = subnet->getPools(pool_type_); @@ -166,58 +180,108 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // first we need to find a pool the last address belongs to. PoolCollection::const_iterator it; + PoolCollection::const_iterator first = pools.end(); + PoolPtr first_pool; for (it = pools.begin(); it != pools.end(); ++it) { + if (!(*it)->clientSupported(client_classes)) { + continue; + } + if (first == pools.end()) { + first = it; + } if ((*it)->inRange(last)) { break; } } + // Caller checked this cannot happen + if (first == pools.end()) { + isc_throw(AllocFailed, "No allowed pools defined in selected subnet"); + } + // last one was bogus for one of several reasons: // - we just booted up and that's the first address we're allocating // - a subnet was removed or other reconfiguration just completed // - perhaps allocation algorithm was changed + // - last pool does not allow this client if (it == pools.end()) { - // ok to access first element directly. We checked that pools is non-empty - IOAddress next = pools[0]->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + it = first; } - // Ok, we have a pool that the last address belonged to, let's use it. - - IOAddress next("::"); - if (!prefix) { - next = IOAddress::increase(last); // basically addr++ - } else { - Pool6Ptr pool6 = boost::dynamic_pointer_cast(*it); - if (!pool6) { - // Something is gravely wrong here - isc_throw(Unexpected, "Wrong type of pool: " << (*it)->toText() - << " is not Pool6"); + for (;;) { + // Trying next pool + if (retrying) { + for (; it != pools.end(); ++it) { + if ((*it)->clientSupported(client_classes)) { + break; + } + } + if (it == pools.end()) { + // Really out of luck today. That was the last pool. + break; + } } - // Get the next prefix - next = increasePrefix(last, pool6->getLength()); - } - if ((*it)->inRange(next)) { - // the next one is in the pool as well, so we haven't hit pool boundary yet - subnet->setLastAllocated(pool_type_, next); - return (next); + + last = (*it)->getLastAllocated(); + valid = (*it)->isLastAllocatedValid(); + if (!valid && (last == (*it)->getFirstAddress())) { + // Pool was (re)initialized + (*it)->setLastAllocated(last); + subnet->setLastAllocated(pool_type_, last); + return (last); + } + // still can be bogus + if (valid && !(*it)->inRange(last)) { + valid = false; + (*it)->resetLastAllocated(); + (*it)->setLastAllocated((*it)->getFirstAddress()); + } + + if (valid) { + // Ok, we have a pool that the last address belonged to, let's use it. + if (prefix) { + Pool6Ptr pool6 = boost::dynamic_pointer_cast(*it); + + if (!pool6) { + // Something is gravely wrong here + isc_throw(Unexpected, "Wrong type of pool: " + << (*it)->toText() + << " is not Pool6"); + } + // Get the prefix length + prefix_len = pool6->getLength(); + } + + IOAddress next = increaseAddress(last, prefix, prefix_len); + if ((*it)->inRange(next)) { + // the next one is in the pool as well, so we haven't hit + // pool boundary yet + (*it)->setLastAllocated(next); + subnet->setLastAllocated(pool_type_, next); + return (next); + } + + valid = false; + (*it)->resetLastAllocated(); + } + // We hit pool boundary, let's try to jump to the next pool and try again + ++it; + retrying = true; } - // We hit pool boundary, let's try to jump to the next pool and try again - ++it; - if (it == pools.end()) { - // Really out of luck today. That was the last pool. Let's rewind - // to the beginning. - next = pools[0]->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + // Let's rewind to the beginning. + for (it = first; it != pools.end(); ++it) { + if ((*it)->clientSupported(client_classes)) { + (*it)->setLastAllocated((*it)->getFirstAddress()); + (*it)->resetLastAllocated(); + } } - // there is a next pool, let's try first address from it - next = (*it)->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + // ok to access first element directly. We checked that pools is non-empty + last = (*first)->getLastAllocated(); + (*first)->setLastAllocated(last); + subnet->setLastAllocated(pool_type_, last); + return (last); } AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) @@ -228,6 +292,7 @@ AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::HashedAllocator::pickAddress(const SubnetPtr&, + const ClientClasses&, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Hashed allocator is not implemented"); @@ -241,6 +306,7 @@ AllocEngine::RandomAllocator::RandomAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::RandomAllocator::pickAddress(const SubnetPtr&, + const ClientClasses&, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Random allocator is not implemented"); @@ -677,7 +743,12 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // check if the hint is in pool and is available // This is equivalent of subnet->inPool(hint), but returns the pool pool = boost::dynamic_pointer_cast - (subnet->getPool(ctx.currentIA().type_, hint, false)); + (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), hint)); + + // check if the pool is allowed + if (pool && !pool->clientSupported(ctx.query_->getClasses())) { + pool.reset(); + } if (pool) { @@ -775,14 +846,23 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // - we find a free address // - we find an address for which the lease has expired // - we exhaust number of tries - uint64_t max_attempts = (attempts_ > 0 ? attempts_ : - subnet->getPoolCapacity(ctx.currentIA().type_)); + uint64_t possible_attempts = + subnet->getPoolCapacity(ctx.currentIA().type_, + ctx.query_->getClasses()); + // Try next subnet if there is no chance to get something + if (possible_attempts == 0) { + subnet = subnet->getNextSubnet(original_subnet); + continue; + } + uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); for (uint64_t i = 0; i < max_attempts; ++i) { ++total_attempts; - IOAddress candidate = allocator->pickAddress(subnet, ctx.duid_, + IOAddress candidate = allocator->pickAddress(subnet, + ctx.query_->getClasses(), + ctx.duid_, hint); /// In-pool reservations: Check if this address is reserved for someone @@ -800,7 +880,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { uint8_t prefix_len = 128; if (ctx.currentIA().type_ == Lease::TYPE_PD) { pool = boost::dynamic_pointer_cast( - subnet->getPool(ctx.currentIA().type_, candidate, false)); + subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), candidate)); if (pool) { prefix_len = pool->getLength(); } @@ -3214,10 +3294,19 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { client_id = ctx.clientid_; } - const uint64_t max_attempts = (attempts_ > 0 ? attempts_ : - subnet->getPoolCapacity(Lease::TYPE_V4)); + uint64_t possible_attempts = + subnet->getPoolCapacity(Lease::TYPE_V4, + ctx.query_->getClasses()); + uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); + // Skip trying if there is no chance to get something + if (possible_attempts == 0) { + max_attempts = 0; + } + for (uint64_t i = 0; i < max_attempts; ++i) { - IOAddress candidate = allocator->pickAddress(subnet, client_id, + IOAddress candidate = allocator->pickAddress(subnet, + ctx.query_->getClasses(), + client_id, ctx.requested_address_); // If address is not reserved for another client, try to allocate it. if (!addressReserved(candidate, ctx)) { diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index e33b2f7056..d30e96008c 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -8,6 +8,7 @@ #define ALLOC_ENGINE_H #include +#include #include #include #include @@ -78,13 +79,19 @@ protected: /// than pickResource(), because nobody would immediately know what the /// resource means in this context. /// + /// Pools which are not allowed for client classes are skipped. + /// /// @param subnet next address will be returned from pool of that subnet + /// @param client_classes list of classes client belongs to + /// @param duid Client's DUID /// @param hint client's hint /// /// @return the next address virtual isc::asiolink::IOAddress - pickAddress(const SubnetPtr& subnet, const DuidPtr& duid, + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, const isc::asiolink::IOAddress& hint) = 0; /// @brief Default constructor. @@ -125,11 +132,13 @@ protected: /// @brief returns the next address from pools in a subnet /// /// @param subnet next address will be returned from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID (ignored) /// @param hint client's hint (ignored) /// @return the next address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); protected: @@ -147,6 +156,20 @@ protected: static isc::asiolink::IOAddress increasePrefix(const isc::asiolink::IOAddress& prefix, const uint8_t prefix_len); + + /// @brief Returns the next address or prefix + /// + /// This method works for IPv4 addresses, IPv6 addresses and + /// IPv6 prefixes. + /// + /// @param address address or prefix to be increased + /// @param prefix true when the previous argument is a prefix + /// @param prefix_len length of the prefix + /// @return result address or prefix + static isc::asiolink::IOAddress + increaseAddress(const isc::asiolink::IOAddress& address, + bool prefix, const uint8_t prefix_len); + }; /// @brief Address/prefix allocator that gets an address based on a hash @@ -164,12 +187,15 @@ protected: /// @todo: Implement this method /// /// @param subnet an address will be picked from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID /// @param hint a hint (last address that was picked) /// @return selected address - virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, - const DuidPtr& duid, - const isc::asiolink::IOAddress& hint); + virtual isc::asiolink::IOAddress + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, + const isc::asiolink::IOAddress& hint); }; /// @brief Random allocator that picks address randomly @@ -191,7 +217,9 @@ protected: /// @param hint the last address that was picked (ignored) /// @return a random address from the pool virtual isc::asiolink::IOAddress - pickAddress(const SubnetPtr& subnet, const DuidPtr& duid, + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index a2926ecf06..d57b94a894 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -378,6 +378,12 @@ PoolParser::parse(PoolStoragePtr pools, << " (" << option_data->getPosition() << ")"); } } + + // Client-class. + string client_class = getString(pool_structure, "client-class"); + if (!client_class.empty()) { + pool->allowClientClass(client_class); + } } //****************************** Pool4Parser ************************* @@ -870,6 +876,11 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { pool_->setContext(user_context_); } + string client_class = getString(pd_pool_, "client-class"); + if (!client_class.empty()) { + pool_->allowClientClass(client_class); + } + // Add the local pool to the external storage ptr. pools->push_back(pool_); } diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 8a3cb14b31..65f201e439 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -71,8 +71,8 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { } } catch (const DhcpConfigError&) { - // Position was already added - throw; + // Position was already added + throw; } catch (const std::exception& ex) { isc_throw(DhcpConfigError, ex.what() << " (" << shared_network_data->getPosition() << ")"); diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 77cdc46121..1e3b622160 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -18,13 +18,35 @@ namespace dhcp { Pool::Pool(Lease::Type type, const isc::asiolink::IOAddress& first, const isc::asiolink::IOAddress& last) :id_(getNextID()), first_(first), last_(last), type_(type), - capacity_(0), cfg_option_(new CfgOption()) { + capacity_(0), cfg_option_(new CfgOption()), white_list_(), + last_allocated_(first), last_allocated_valid_(false) { } bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { return (first_.smallerEqual(addr) && addr.smallerEqual(last_)); } +bool Pool::clientSupported(const ClientClasses& classes) const { + if (white_list_.empty()) { + // There is no class defined for this pool, so we do + // support everyone. + return (true); + } + + for (ClientClasses::const_iterator it = white_list_.begin(); + it != white_list_.end(); ++it) { + if (classes.contains(*it)) { + return (true); + } + } + + return (false); +} + +void Pool::allowClientClass(const ClientClass& class_name) { + white_list_.insert(class_name); +} + std::string Pool::toText() const { std::stringstream tmp; @@ -90,6 +112,15 @@ Pool::toElement() const { ConstCfgOptionPtr opts = getCfgOption(); map->set("option-data", opts->toElement()); return (map); + + // Set client-class + const ClientClasses& cclasses = getClientClasses(); + if (cclasses.size() > 1) { + isc_throw(ToElementError, "client-class has too many items: " + << cclasses.size()); + } else if (!cclasses.empty()) { + map->set("client-class", Element::create(*cclasses.cbegin())); + } } data::ElementPtr diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index 56d769891d..5254ea5ca5 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -8,6 +8,7 @@ #define POOL_H #include +#include #include #include #include @@ -106,6 +107,58 @@ public: user_context_ = ctx; } + /// @Checks whether this pool supports client that belongs to + /// specified classes. + /// + /// @todo: currently doing the same than network which + /// is known to be improved. + /// + /// @param client_classes list of all classes the client belongs to + /// @return true if client can be supported, false otherwise + bool clientSupported(const ClientClasses& client_classes) const; + + /// @brief Adds class class_name to the list of supported classes + /// + /// @param class_name client class to be supported by this pool + void allowClientClass(const ClientClass& class_name); + + /// @brief returns the client class white list + /// + /// @note Currently white list is empty or has one element + /// @note The returned reference is only valid as long as the object + /// returned is valid. + /// + /// @return client classes @ref white_list_ + const ClientClasses& getClientClasses() const { + return (white_list_); + } + + /// @brief returns the last address that was tried from this pool + /// + /// @return address/prefix that was last tried from this pool + isc::asiolink::IOAddress getLastAllocated() const { + return last_allocated_; + } + + /// @brief checks if the last address is valid + /// @return true if the last address is valid + bool isLastAllocatedValid() const { + return last_allocated_valid_; + } + + /// @brief sets the last address that was tried from this pool + /// + /// @param addr address/prefix to that was tried last + void setLastAllocated(const isc::asiolink::IOAddress& addr) { + last_allocated_ = addr; + last_allocated_valid_ = true; + } + + /// @brief resets the last address to invalid + void resetLastAllocated() { + last_allocated_valid_ = false; + } + /// @brief Unparse a pool object. /// /// @return A pointer to unparsed pool configuration. @@ -164,8 +217,22 @@ protected: /// @brief Pointer to the option data configuration for this pool. CfgOptionPtr cfg_option_; + /// @brief Optional definition of a client class + /// + /// @ref Network::white_list_ + ClientClasses white_list_; + /// @brief Pointer to the user context (may be NULL) data::ConstElementPtr user_context_; + + /// @brief Last allocated address + /// See @ref isc::dhcp::subnet::last_allocated_ia_ + /// Initialized and reset to first + isc::asiolink::IOAddress last_allocated_; + + /// @brief Status of last allocated address + bool last_allocated_valid_; + }; /// @brief Pool information for IPv4 addresses diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 837faed171..0e0f0baca7 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -134,6 +134,23 @@ Subnet::getPoolCapacity(Lease::Type type) const { } } +uint64_t +Subnet::getPoolCapacity(Lease::Type type, + const ClientClasses& client_classes) const { + switch (type) { + case Lease::TYPE_V4: + case Lease::TYPE_NA: + return sumPoolCapacity(pools_, client_classes); + case Lease::TYPE_TA: + return sumPoolCapacity(pools_ta_, client_classes); + case Lease::TYPE_PD: + return sumPoolCapacity(pools_pd_, client_classes); + default: + isc_throw(BadValue, "Unsupported pool type: " + << static_cast(type)); + } +} + uint64_t Subnet::sumPoolCapacity(const PoolCollection& pools) const { uint64_t sum = 0; @@ -152,6 +169,28 @@ Subnet::sumPoolCapacity(const PoolCollection& pools) const { return (sum); } +uint64_t +Subnet::sumPoolCapacity(const PoolCollection& pools, + const ClientClasses& client_classes) const { + uint64_t sum = 0; + for (PoolCollection::const_iterator p = pools.begin(); p != pools.end(); ++p) { + if (!(*p)->clientSupported(client_classes)) { + continue; + } + uint64_t x = (*p)->getCapacity(); + + // Check if we can add it. If sum + x > uint64::max, then we would have + // overflown if we tried to add it. + if (x > std::numeric_limits::max() - sum) { + return (std::numeric_limits::max()); + } + + sum += x; + } + + return (sum); +} + void Subnet4::checkType(Lease::Type type) const { if (type != Lease::TYPE_V4) { isc_throw(BadValue, "Only TYPE_V4 is allowed for Subnet4"); @@ -329,6 +368,33 @@ const PoolPtr Subnet::getPool(Lease::Type type, const isc::asiolink::IOAddress& return (candidate); } +const PoolPtr Subnet::getPool(Lease::Type type, + const ClientClasses& client_classes, + const isc::asiolink::IOAddress& hint) const { + // check if the type is valid (and throw if it isn't) + checkType(type); + + const PoolCollection& pools = getPools(type); + + PoolPtr candidate; + + if (!pools.empty()) { + PoolCollection::const_iterator ub = + std::upper_bound(pools.begin(), pools.end(), hint, + prefixLessThanFirstAddress); + + if (ub != pools.begin()) { + --ub; + if ((*ub)->inRange(hint) && (*ub)->clientSupported(client_classes)) { + candidate = *ub; + } + } + } + + // Return a pool or NULL if no match found. + return (candidate); +} + void Subnet::addPool(const PoolPtr& pool) { // check if the type is valid (and throw if it isn't) diff --git a/src/lib/dhcpsrv/subnet.h b/src/lib/dhcpsrv/subnet.h index 03b1f7784c..883aa229b6 100644 --- a/src/lib/dhcpsrv/subnet.h +++ b/src/lib/dhcpsrv/subnet.h @@ -54,26 +54,26 @@ public: /// @return true if the address is in any of the pools bool inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const; - /// @brief returns the last address that was tried from this pool + /// @brief returns the last address that was tried from this subnet /// /// This method returns the last address that was attempted to be allocated /// from this subnet. This is used as helper information for the next /// iteration of the allocation algorithm. /// - /// @todo: Define map somewhere in the + /// @todo: Define map somewhere in the /// AllocEngine::IterativeAllocator and keep the data there /// /// @param type lease type to be returned - /// @return address/prefix that was last tried from this pool + /// @return address/prefix that was last tried from this subnet isc::asiolink::IOAddress getLastAllocated(Lease::Type type) const; - /// @brief sets the last address that was tried from this pool + /// @brief sets the last address that was tried from this subnet /// /// This method sets the last address that was attempted to be allocated /// from this subnet. This is used as helper information for the next /// iteration of the allocation algorithm. /// - /// @todo: Define map somewhere in the + /// @todo: Define map somewhere in the /// AllocEngine::IterativeAllocator and keep the data there /// @param addr address/prefix to that was tried last /// @param type lease type to be set @@ -142,6 +142,17 @@ public: const PoolPtr getPool(Lease::Type type, const isc::asiolink::IOAddress& addr, bool anypool = true) const; + /// @brief Returns a pool that specified address belongs to with classes + /// + /// Variant using only pools allowing given classes + /// + /// @param type pool type that the pool is looked for + /// @param client_classes client class list which must be allowed + /// @param addr address that the returned pool should cover (optional) + const PoolPtr getPool(Lease::Type type, + const ClientClasses& client_classes, + const isc::asiolink::IOAddress& addr) const; + /// @brief Returns a pool without any address specified /// /// @param type pool type that the pool is looked for @@ -169,6 +180,14 @@ public: /// @param type type of the lease uint64_t getPoolCapacity(Lease::Type type) const; + /// @brief Returns the number of possible leases for specified lease type + /// allowed for a client which belongs to classes. + /// + /// @param type type of the lease + /// @param client_classes List of classes the client belongs to. + uint64_t getPoolCapacity(Lease::Type type, + const ClientClasses& client_classes) const; + /// @brief Returns textual representation of the subnet (e.g. /// "2001:db8::/64") /// @@ -300,6 +319,13 @@ protected: /// @return sum of possible leases uint64_t sumPoolCapacity(const PoolCollection& pools) const; + /// @brief returns a sum of possible leases in all pools allowing classes + /// @param pools list of pools + /// @param client_classes list of classes + /// @return sum of possible/allowed leases + uint64_t sumPoolCapacity(const PoolCollection& pools, + const ClientClasses& client_classes) const; + /// @brief Checks if the specified pool overlaps with an existing pool. /// /// @param pool_type Pool type. diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index ff216a6a77..ab02757247 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -326,7 +326,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); } @@ -359,7 +359,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator_manyPools4) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, clientid_, IOAddress("0.0.0.0")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); // One way to easily verify that the iterative allocator really works is diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 1002958cfb..a8d80109ea 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -189,7 +189,7 @@ TEST_F(AllocEngine6Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, duid_, IOAddress("::")); + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); } } @@ -210,23 +210,23 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { subnet_->addPool(pool3); // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is easy - only one address here - EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { @@ -247,41 +247,41 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Second pool (just one lease here) - EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool - EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } - EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } // This test verifies that the iterative allocator can step over addresses @@ -289,7 +289,7 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); // Let's pick the first address - IOAddress addr1 = alloc.pickAddress(subnet_, duid_, IOAddress("2001:db8:1::10")); + IOAddress addr1 = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("2001:db8:1::10")); // Check that we can indeed pick the first address from the pool EXPECT_EQ("2001:db8:1::10", addr1.toText()); @@ -379,7 +379,7 @@ TEST_F(AllocEngine6Test, IterativeAllocator_manyPools6) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, duid_, IOAddress("::")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); // One way to easily verify that the iterative allocator really works is diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index 426189eaaa..de3d8a2886 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -409,6 +409,7 @@ public: bool fqdn_fwd_; ///< Perform forward update for a lease. bool fqdn_rev_; ///< Perform reverse update for a lease. LeaseMgrFactory factory_; ///< pointer to LeaseMgr factory + ClientClasses cc_; ///< client classes }; /// @brief Used in Allocation Engine tests for IPv4 @@ -510,6 +511,7 @@ public: Pool4Ptr pool_; ///< Pool belonging to subnet_ LeaseMgrFactory factory_; ///< Pointer to LeaseMgr factory AllocEngine::ClientContext4 ctx_; ///< Context information passed to various + ClientClasses cc_; ///< Client classes ///< allocation engine functions. }; From b4e2cf347a0cd7bd71554a483af182a217e74c67 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 4 Nov 2017 11:48:52 +0100 Subject: [PATCH 05/52] [5425] Checkpoint: began tests --- src/lib/dhcpsrv/tests/alloc_engine_utils.h | 7 +- src/lib/dhcpsrv/tests/pool_unittest.cc | 200 +++++++++++++++++++++ src/lib/dhcpsrv/tests/subnet_unittest.cc | 163 ++++++++++++++++- 3 files changed, 362 insertions(+), 8 deletions(-) diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index de3d8a2886..eeed469755 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -74,6 +74,7 @@ public: :IterativeAllocator(type) { } + using AllocEngine::IterativeAllocator::increaseAddress; using AllocEngine::IterativeAllocator::increasePrefix; }; }; @@ -221,10 +222,10 @@ public: /// @param input address to be increased /// @param exp_output expected address after increase void - checkAddrIncrease(NakedAllocEngine::NakedIterativeAllocator&, + checkAddrIncrease(NakedAllocEngine::NakedIterativeAllocator& alloc, std::string input, std::string exp_output) { - EXPECT_EQ(exp_output, asiolink::IOAddress::increase( - asiolink::IOAddress(input)).toText()); + EXPECT_EQ(exp_output, alloc.increaseAddress(asiolink::IOAddress(input), + false, 0).toText()); } /// @brief Checks if increasePrefix() works as expected diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index b78cf1fbcd..5662f6a5ce 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -190,6 +190,106 @@ TEST(Pool4Test, userContext) { EXPECT_EQ(ctx->str(), pool->getContext()->str()); } +// This test checks that handling for client-class is valid. +TEST(Pool4Test, clientClass) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool->getClientClasses().size()); + EXPECT_TRUE(pool->clientSupported(no_class)); + EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); + + // Let's allow only clients belonging to "bar" class. + pool->allowClientClass("bar"); + EXPECT_EQ(1, pool->getClientClasses().size()); + + EXPECT_FALSE(pool->clientSupported(no_class)); + EXPECT_FALSE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); +} + +// This test checks that handling for multiple client-classes is valid. +TEST(Pool4Test, clientClasses) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool->getClientClasses().size()); + EXPECT_TRUE(pool->clientSupported(no_class)); + EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + + // Let's allow clients belonging to "bar" or "foo" class. + pool->allowClientClass("bar"); + pool->allowClientClass("foo"); + EXPECT_EQ(2, pool->getClientClasses().size()); + + // Class-less clients are to be rejected. + EXPECT_FALSE(pool->clientSupported(no_class)); + + // Clients in foo class should be accepted. + EXPECT_TRUE(pool->clientSupported(foo_class)); + + // Clients in bar class should be accepted as well. + EXPECT_TRUE(pool->clientSupported(bar_class)); +} + +// This test checks that handling for last allocated address/prefix is valid. +TEST(Pool4Test, lastAllocated) { + // Create a pool. + IOAddress first("192.0.2.0"); + Pool4Ptr pool(new Pool4(first, IOAddress("192.0.2.255"))); + + // Initial values are first invalid. + EXPECT_EQ(first.toText(), pool->getLastAllocated().toText()); + EXPECT_FALSE(pool->isLastAllocatedValid()); + + // Now set last allocated + IOAddress addr("192.0.2.100"); + EXPECT_NO_THROW(pool->setLastAllocated(addr)); + EXPECT_EQ(addr.toText(), pool->getLastAllocated().toText()); + EXPECT_TRUE(pool->isLastAllocatedValid()); + + // Reset makes it invalid and does not touch address + pool->resetLastAllocated(); + EXPECT_EQ(addr.toText(), pool->getLastAllocated().toText()); + EXPECT_FALSE(pool->isLastAllocatedValid()); +} + TEST(Pool6Test, constructor_first_last) { // let's construct 2001:db8:1:: - 2001:db8:1::ffff:ffff:ffff:ffff pool @@ -494,4 +594,104 @@ TEST(Pool6Test, userContext) { EXPECT_EQ(ctx->str(), pool.getContext()->str()); } +// This test checks that handling for client-class is valid. +TEST(Pool6Test, clientClass) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool.getClientClasses().size()); + EXPECT_TRUE(pool.clientSupported(no_class)); + EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); + + // Let's allow only clients belonging to "bar" class. + pool.allowClientClass("bar"); + EXPECT_EQ(1, pool.getClientClasses().size()); + + EXPECT_FALSE(pool.clientSupported(no_class)); + EXPECT_FALSE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); +} + +// This test checks that handling for multiple client-classes is valid. +TEST(Pool6Test, clientClasses) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool.getClientClasses().size()); + EXPECT_TRUE(pool.clientSupported(no_class)); + EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + + // Let's allow clients belonging to "bar" or "foo" class. + pool.allowClientClass("bar"); + pool.allowClientClass("foo"); + EXPECT_EQ(2, pool.getClientClasses().size()); + + // Class-less clients are to be rejected. + EXPECT_FALSE(pool.clientSupported(no_class)); + + // Clients in foo class should be accepted. + EXPECT_TRUE(pool.clientSupported(foo_class)); + + // Clients in bar class should be accepted as well. + EXPECT_TRUE(pool.clientSupported(bar_class)); +} + +// This test checks that handling for last allocated address/prefix is valid. +TEST(Pool6Test, lastAllocated) { + // Create a pool. + IOAddress first("2001:db8::1"); + Pool6 pool(Lease::TYPE_NA, first, IOAddress("2001:db8::200")); + + // Initial values are first invalid. + EXPECT_EQ(first.toText(), pool.getLastAllocated().toText()); + EXPECT_FALSE(pool.isLastAllocatedValid()); + + // Now set last allocated + IOAddress addr("2001:db8::100"); + EXPECT_NO_THROW(pool.setLastAllocated(addr)); + EXPECT_EQ(addr.toText(), pool.getLastAllocated().toText()); + EXPECT_TRUE(pool.isLastAllocatedValid()); + + // Reset makes it invalid and does not touch address + pool.resetLastAllocated(); + EXPECT_EQ(addr.toText(), pool.getLastAllocated().toText()); + EXPECT_FALSE(pool.isLastAllocatedValid()); +} + }; // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index a969b9ccab..efb4cafe1d 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -168,15 +168,18 @@ TEST(Subnet4Test, pool4InSubnet4) { PoolPtr pool1(new Pool4(IOAddress("192.1.2.0"), 25)); PoolPtr pool2(new Pool4(IOAddress("192.1.2.128"), 26)); PoolPtr pool3(new Pool4(IOAddress("192.1.2.192"), 30)); + pool3->allowClientClass("bar"); + PoolPtr pool4(new Pool4(IOAddress("192.1.2.200"), 30)); // Add pools in reverse order to make sure that they get ordered by // first address. - EXPECT_NO_THROW(subnet->addPool(pool3)); + EXPECT_NO_THROW(subnet->addPool(pool4)); // If there's only one pool, get that pool PoolPtr mypool = subnet->getAnyPool(Lease::TYPE_V4); - EXPECT_EQ(mypool, pool3); + EXPECT_EQ(mypool, pool4); + EXPECT_NO_THROW(subnet->addPool(pool3)); EXPECT_NO_THROW(subnet->addPool(pool2)); EXPECT_NO_THROW(subnet->addPool(pool1)); @@ -188,8 +191,8 @@ TEST(Subnet4Test, pool4InSubnet4) { // If we provide a hint, we should get a pool that this hint belongs to ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, - IOAddress("192.1.2.195"))); - EXPECT_EQ(mypool, pool3); + IOAddress("192.1.2.201"))); + EXPECT_EQ(mypool, pool4); ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, IOAddress("192.1.2.129"))); @@ -203,7 +206,7 @@ TEST(Subnet4Test, pool4InSubnet4) { // third parameter prevents it from returning "any" available // pool if a good match is not found. ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, - IOAddress("192.1.2.200"), + IOAddress("192.1.2.210"), false)); EXPECT_FALSE(mypool); @@ -211,6 +214,57 @@ TEST(Subnet4Test, pool4InSubnet4) { IOAddress("192.1.1.254"), false)); EXPECT_FALSE(mypool); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // If we provide a hint, we should get a pool that this hint belongs to + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.201"))); + EXPECT_EQ(mypool, pool4); + + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.129"))); + EXPECT_EQ(mypool, pool2); + + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.64"))); + EXPECT_EQ(mypool, pool1); + + // Specify addresses which don't belong to any existing pools. + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + IOAddress("192.1.2.210"))); + EXPECT_FALSE(mypool); + + // Pool3 requires a member of bar + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, + IOAddress("192.1.2.195"))); + EXPECT_EQ(mypool, pool3); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + IOAddress("192.1.2.195"))); + EXPECT_EQ(mypool, pool3); } // Check if it's possible to get specified number of possible leases for @@ -237,6 +291,38 @@ TEST(Subnet4Test, getCapacity) { PoolPtr pool3(new Pool4(IOAddress("192.1.2.192"), 30)); subnet->addPool(pool3); EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4)); + + // Let's add a forth pool /30. This one has 4 addresses. + PoolPtr pool4(new Pool4(IOAddress("192.1.2.200"), 30)); + subnet->addPool(pool4); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4)); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes)); } // Checks that it is not allowed to add invalid pools. @@ -647,6 +733,37 @@ TEST(Subnet6Test, Pool6getCapacity) { EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), subnet->getPoolCapacity(Lease::TYPE_NA)); + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + EXPECT_EQ(uint64_t(4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, no_class)); + EXPECT_EQ(uint64_t(4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, foo_class)); + EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, bar_class)); + EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, three_classes)); + // This is 2^64 prefixes. We're overflown uint64_t. PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64)); subnet->addPool(pool4); @@ -657,6 +774,7 @@ TEST(Subnet6Test, Pool6getCapacity) { subnet->addPool(pool5); EXPECT_EQ(std::numeric_limits::max(), subnet->getPoolCapacity(Lease::TYPE_NA)); + } // Test checks whether the number of prefixes available in the pools are @@ -725,6 +843,41 @@ TEST(Subnet6Test, Pool6InSubnet6) { mypool = subnet->getPool(Lease::TYPE_NA, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + mypool = subnet->getPool(Lease::TYPE_NA, no_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); } // Check if Subnet6 supports different types of pools properly. From 3c48a2ebb24e14bfc8ba6659d4262025d221d682 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 5 Nov 2017 11:12:27 +0100 Subject: [PATCH 06/52] [5425] Checkpoint: added not alloc and service tests --- src/bin/dhcp4/tests/config_parser_unittest.cc | 90 ++ src/bin/dhcp4/tests/dhcp4_srv_unittest.cc | 69 ++ .../dhcp4/tests/shared_network_unittest.cc | 79 +- src/bin/dhcp6/dhcp6_messages.mes | 2 +- src/bin/dhcp6/tests/classify_unittests.cc | 92 ++ src/bin/dhcp6/tests/config_parser_unittest.cc | 188 +++ src/bin/dhcp6/tests/get_config_unittest.cc | 1066 ++++++++++------- .../dhcp6/tests/shared_network_unittest.cc | 81 +- src/lib/dhcpsrv/alloc_engine.cc | 7 +- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 23 +- src/lib/dhcpsrv/parsers/dhcp_parsers.h | 3 + src/lib/dhcpsrv/pool.cc | 3 +- src/lib/dhcpsrv/subnet.cc | 41 + src/lib/dhcpsrv/subnet.h | 13 + .../dhcpsrv/tests/alloc_engine4_unittest.cc | 94 ++ .../dhcpsrv/tests/alloc_engine6_unittest.cc | 52 + .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 4 +- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 8 +- src/lib/dhcpsrv/tests/subnet_unittest.cc | 60 +- 19 files changed, 1551 insertions(+), 424 deletions(-) diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index 8c00d545be..dcc3bf2377 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -4040,6 +4040,7 @@ TEST_F(Dhcp4ParserTest, classifySubnets) { ConstElementPtr json; ASSERT_NO_THROW(json = parseDHCP4(config)); + extractConfig(config); EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json)); checkResult(x, 0); @@ -4097,6 +4098,95 @@ TEST_F(Dhcp4ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } +// Goal of this test is to verify that multiple pools can be configured +// with defined client classes. +TEST_F(Dhcp4ParserTest, classifyPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"pool\": \"192.0.3.101 - 192.0.3.150\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"pool\": \"192.0.4.101 - 192.0.4.150\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"pool\": \"192.0.5.101 - 192.0.5.150\" " + " } ]," + " \"subnet\": \"192.0.0.0/16\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json)); + checkResult(x, 0); + + const Subnet4Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_V4); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pools[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); +} + // This test verifies that the host reservations can be specified for // respective IPv4 subnets. TEST_F(Dhcp4ParserTest, reservations) { diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index df1ae36fb9..f650d33867 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -2318,6 +2318,75 @@ TEST_F(Dhcpv4SrvTest, clientClassify) { EXPECT_TRUE(srv_.selectSubnet(dis)); } +// Checks if the client-class field is indeed used for pool selection. +TEST_F(Dhcpv4SrvTest, clientPoolClassify) { + IfaceMgrTestConfig test_config(true); + IfaceMgr::instance().openSockets4(); + + NakedDhcpv4Srv srv(0); + + // This test configures 2 pools. + // The second pool does not play any role here. The client's + // IP address belongs to the first pool, so only that first + // pool is being tested. + string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ " + "{ \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"client-class\": \"foo\" }, " + " { \"pool\": \"192.0.3.1 - 192.0.3.100\", " + " \"client-class\": \"xyzzy\" } ], " + " \"subnet\": \"192.0.0.0/16\" } " + "]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp4Server(srv, json)); + + CfgMgr::instance().commit(); + + // check if returned status is OK + ASSERT_TRUE(status); + comment_ = config::parseAnswer(rcode_, status); + ASSERT_EQ(0, rcode_); + + // Create a simple packet that we'll use for classification + Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234)); + dis->setRemoteAddr(IOAddress("192.0.2.1")); + dis->setCiaddr(IOAddress("192.0.2.1")); + dis->setIface("eth0"); + OptionPtr clientid = generateClientId(); + dis->addOption(clientid); + + // This discover does not belong to foo class, so it will not + // be serviced + Pkt4Ptr offer = srv.processDiscover(dis); + EXPECT_FALSE(offer); + + // Let's add the packet to bar class and try again. + dis->addClass("bar"); + + // Still not supported, because it belongs to wrong class. + offer = srv.processDiscover(dis); + EXPECT_FALSE(offer); + + // Let's add it to matching class. + dis->addClass("foo"); + + // This time it should work + offer = srv.processDiscover(dis); + ASSERT_TRUE(offer); + EXPECT_EQ(DHCPOFFER, offer->getType()); + EXPECT_FALSE(offer->getYiaddr().isV4Zero()); +} + // Verifies last resort option 43 is backward compatible TEST_F(Dhcpv4SrvTest, option43LastResort) { IfaceMgrTestConfig test_config(true); diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index 15cdf20973..bc50de5486 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -698,7 +698,7 @@ const char* NETWORKS_CONFIG[] = { // Configuration #13. // - 2 classes -// - 2 shared networks, each with 1 subnet and client class restricton +// - 2 shared networks, each with 1 subnet and client class restriction "{" " \"interfaces-config\": {" " \"interfaces\": [ \"*\" ]" @@ -859,6 +859,42 @@ const char* NETWORKS_CONFIG[] = { " ]" " }" " ]" + "}", + +// Configuration #16 +// - 1 shared network with 1 subnet and 2 pools and client class restriction + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" "}" }; @@ -1779,4 +1815,45 @@ TEST_F(Dhcpv4SharedNetworkTest, customServerIdentifier) { EXPECT_EQ("2.3.4.5", client2.config_.serverid_.toText()); } +// Access to a pool within shared network is restricted by client +// classification. +TEST_F(Dhcpv4SharedNetworkTest, poolInSharedNetworkSelectedByClass) { + // Create client #1 + Dhcp4Client client1(Dhcp4Client::SELECTING); + client1.setIfaceName("eth1"); + + // Configure the server with one shared network including one subnet and + // in 2 pools in it. The access to one of the pools is restricted + // by client classification. + configure(NETWORKS_CONFIG[16], *client1.getServer()); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.100", "192.0.2.63"); + }); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option93 which would cause the client to be classified as "a-devices". + OptionPtr option93(new OptionUint16(Option::V4, 93, 0x0001)); + client1.addExtraOption(option93); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.63", "192.0.2.63"); + }); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp4Client client2(client1.getServer(), Dhcp4Client::SELECTING); + client2.setIfaceName("eth1"); + testAssigned([this, &client2] { + doDORA(client2, "192.0.2.100"); + }); +} + } // end of anonymous namespace diff --git a/src/bin/dhcp6/dhcp6_messages.mes b/src/bin/dhcp6/dhcp6_messages.mes index 4fde8c77ed..4c8c115454 100644 --- a/src/bin/dhcp6/dhcp6_messages.mes +++ b/src/bin/dhcp6/dhcp6_messages.mes @@ -60,7 +60,7 @@ The first argument specifies the client and transaction identification information. The second argument includes all classes to which the packet has been assigned. -% DHCP6_CLASS_UNCONFIGURED %1: client packet belongs to an unconfigured class: %1 +% DHCP6_CLASS_UNCONFIGURED %1: client packet belongs to an unconfigured class: %2 This debug message informs that incoming packet belongs to a class which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 9b04d035c2..7a81310f92 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -643,6 +643,98 @@ TEST_F(ClassifyTest, clientClassifySubnet) { EXPECT_TRUE(srv_.selectSubnet(sol)); } +// Checks if the client-class field is indeed used for pool selection. +TEST_F(ClassifyTest, clientClassifyPool) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // This test configures 2 pools. + // The second pool does not play any role here. The client's + // IP address belongs to the first pool, so only that first + // pool is being tested. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"client-classes\": [ " + " { " + " \"name\": \"foo\" " + " }, " + " { " + " \"name\": \"bar\" " + " } " + "], " + "\"subnet6\": [ " + " { \"pools\": [ " + " { " + " \"pool\": \"2001:db8:1::/64\", " + " \"client-class\": \"foo\" " + " }, " + " { " + " \"pool\": \"2001:db8:2::/64\", " + " \"client-class\": \"xyzzy\" " + " } " + " ], " + " \"subnet\": \"2001:db8:2::/40\" " + " } " + "], " + "\"valid-lifetime\": 4000 }"; + + ASSERT_NO_THROW(configure(config)); + + OptionPtr clientid = generateClientId(); + Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); + query1->setRemoteAddr(IOAddress("2001:db8:1::3")); + query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + query1->addOption(clientid); + query1->setIface("eth1"); + Pkt6Ptr query2 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); + query2->setRemoteAddr(IOAddress("2001:db8:1::3")); + query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + query2->addOption(clientid); + query2->setIface("eth1"); + Pkt6Ptr query3 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); + query3->setRemoteAddr(IOAddress("2001:db8:1::3")); + query3->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + query3->addOption(clientid); + query3->setIface("eth1"); + + // This discover does not belong to foo class, so it will not + // be serviced + srv.classifyPacket(query1); + Pkt6Ptr response1 = srv.processSolicit(query1); + ASSERT_TRUE(response1); + OptionPtr ia_na1 = response1->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na1); + EXPECT_TRUE(ia_na1->getOption(D6O_STATUS_CODE)); + EXPECT_FALSE(ia_na1->getOption(D6O_IAADDR)); + + // Let's add the packet to bar class and try again. + query2->addClass("bar"); + // Still not supported, because it belongs to wrong class. + srv.classifyPacket(query2); + Pkt6Ptr response2 = srv.processSolicit(query2); + ASSERT_TRUE(response2); + OptionPtr ia_na2 = response2->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na2); + EXPECT_TRUE(ia_na2->getOption(D6O_STATUS_CODE)); + EXPECT_FALSE(ia_na2->getOption(D6O_IAADDR)); + + // Let's add it to matching class. + query3->addClass("foo"); + // This time it should work + srv.classifyPacket(query3); + Pkt6Ptr response3 = srv.processSolicit(query3); + ASSERT_TRUE(response3); + OptionPtr ia_na3 = response3->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na3); + EXPECT_FALSE(ia_na3->getOption(D6O_STATUS_CODE)); + EXPECT_TRUE(ia_na3->getOption(D6O_IAADDR)); +} + // Tests whether a packet with custom vendor-class (not erouter or docsis) // is classified properly. TEST_F(ClassifyTest, vendorClientClassification2) { diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 946ba5cb9c..b29fd5840f 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -4134,6 +4134,194 @@ TEST_F(Dhcp6ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } +// Goal of this test is to verify that multiple pools can be configured +// with defined client classes. +TEST_F(Dhcp6ParserTest, classifyPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::/80\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"pool\": \"2001:db8:2::/80\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"pool\": \"2001:db8:3::/80\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"pool\": \"2001:db8:4::/80\" " + " } ]," + " \"subnet\": \"2001:db8:0::/40\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP6(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); + checkResult(x, 0); + + const Subnet6Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_NA); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE (pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); +} + +// Goal of this test is to verify that multiple pdpools can be configured +// with defined client classes. +TEST_F(Dhcp6ParserTest, classifyPdPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pd-pools\": [ { " + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:1::\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:2::\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:3::\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:4::\" " + " } ]," + " \"subnet\": \"2001:db8::/64\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP6(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); + checkResult(x, 0); + + const Subnet6Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_PD); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE (pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); +} + // This test checks the ability of the server to parse a configuration // containing a full, valid dhcp-ddns (D2ClientConfig) entry. TEST_F(Dhcp6ParserTest, d2ClientConfig) { diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index dae152ebc2..22f8b4d971 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -987,6 +987,78 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 32 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"preferred-lifetime\": 3000,\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet6\": [\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"pool\": \"2001:db8:1::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"pool\": \"2001:db8:2::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"pool\": \"2001:db8:3::/80\"\n" +" },\n" +" {\n" +" \"pool\": \"2001:db8:4::/80\"\n" +" }\n" +" ],\n" +" \"subnet\": \"2001:db8:0::/40\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 33 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"preferred-lifetime\": 3000,\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet6\": [\n" +" {\n" +" \"pd-pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:1::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:2::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:3::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:4::\",\n" +" \"prefix-len\": 48\n" +" }\n" +" ],\n" +" \"subnet\": \"2001:db8::/64\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 34 +"{\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" @@ -1021,7 +1093,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 33 + // CONFIGURATION 35 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1107,7 +1179,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 34 + // CONFIGURATION 36 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1146,7 +1218,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 35 + // CONFIGURATION 37 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1158,7 +1230,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 36 + // CONFIGURATION 38 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1170,7 +1242,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 37 + // CONFIGURATION 39 "{\n" " \"preferred-lifetime\": 3000,\n" " \"rebind-timer\": 2000,\n" @@ -1214,7 +1286,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 38 + // CONFIGURATION 40 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1225,30 +1297,30 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 39 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 40 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 41 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1263,7 +1335,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"client-classes\": [\n" " {\n" @@ -1294,7 +1366,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 44 + // CONFIGURATION 46 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1314,7 +1386,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 47 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1335,7 +1407,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 46 + // CONFIGURATION 48 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1361,7 +1433,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 49 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1387,7 +1459,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 50 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1409,7 +1481,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1432,7 +1504,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -4323,6 +4395,194 @@ const char* UNPARSED_CONFIGS[] = { "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:1::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:2::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:3::/80\"\n" +" },\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:4::/80\"\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/40\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 33 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:1::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:2::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:3::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:4::\",\n" +" \"prefix-len\": 48\n" +" }\n" +" ],\n" +" \"pools\": [ ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/64\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 34 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" " \"generated-prefix\": \"test.prefix\",\n" @@ -4394,7 +4654,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 33 + // CONFIGURATION 35 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4588,7 +4848,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 34 + // CONFIGURATION 36 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4685,110 +4945,6 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 35 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 36 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 37 "{\n" @@ -4821,6 +4977,110 @@ const char* UNPARSED_CONFIGS[] = { " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" " \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 38 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 39 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" " \"interfaces\": [ ],\n" " \"re-detect\": false\n" " },\n" @@ -4931,7 +5191,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 38 + // CONFIGURATION 40 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4982,114 +5242,10 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 39 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 40 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 41 "{\n" -" \"decline-probation-period\": 12345,\n" +" \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5160,6 +5316,110 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"dhcp4o6-port\": 0,\n" " \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"decline-probation-period\": 12345,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 44 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" " \"hold-reclaimed-time\": 1800,\n" " \"max-reclaim-leases\": 50,\n" @@ -5191,7 +5451,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"client-classes\": [\n" " {\n" @@ -5279,157 +5539,6 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\"\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": { }\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" " }\n", // CONFIGURATION 46 "{\n" @@ -5489,13 +5598,7 @@ const char* UNPARSED_CONFIGS[] = { " \"pools\": [\n" " {\n" " \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": {\n" -" \"lw4over6-bind-prefix-len\": 56,\n" -" \"lw4over6-sharing-ratio\": 64,\n" -" \"lw4over6-sysports-exclude\": true,\n" -" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" -" }\n" +" \"pool\": \"2001:db8::/64\"\n" " }\n" " ],\n" " \"preferred-lifetime\": 3000,\n" @@ -5571,6 +5674,82 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"option-data\": [ ],\n" " \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": { }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 48 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" " \"user-context\": {\n" " \"lw4over6-bind-prefix-len\": 56,\n" " \"lw4over6-sharing-ratio\": 64,\n" @@ -5593,7 +5772,88 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 49 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": {\n" +" \"lw4over6-bind-prefix-len\": 56,\n" +" \"lw4over6-sharing-ratio\": 64,\n" +" \"lw4over6-sysports-exclude\": true,\n" +" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" +" }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 50 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5670,7 +5930,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5748,7 +6008,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index 38d7d3cc3c..adeab7ed7e 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -954,7 +954,41 @@ const char* NETWORKS_CONFIG[] = { " ]" " }" " ]" - "}" + "}", + +// Configuration #19. +// - one shared network with on subnet and two pools (the first has +// class restrictions) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + }; /// @Brief Test fixture class for DHCPv6 server using shared networks. @@ -2161,4 +2195,49 @@ TEST_F(Dhcpv6SharedNetworkTest, sharedNetworkRapidCommit3) { testRapidCommit(NETWORKS_CONFIG[1], false, "", ""); } +// Pool is selected based on the client class specified. +TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { + // Create client #1. + Dhcp6Client client1; + client1.setInterface("eth1"); + + // Configure the server with one shared network including one subnet and + // two pools. The access to one of the pools is restricted by + // by client classification. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[19], *client1.getServer())); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + ASSERT_NO_THROW(client1.requestAddress(0xabca, IOAddress("2001:db8:1::20"))); + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::50"))); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option 1234 which would cause the client to be classified as "a-devices". + OptionPtr option1234(new OptionUint16(Option::V6, 1234, 0x0001)); + client1.addExtraOption(option1234); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::20"))); + + // Client 2 should be assigned an address from the unrestricted subnet. + Dhcp6Client client2(client1.getServer()); + client2.setInterface("eth1"); + ASSERT_NO_THROW(client2.requestAddress(0xabca0)); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:1::50"))); +} + } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index e6945c0aa7..b4f93d2733 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -262,10 +262,10 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, } valid = false; - (*it)->resetLastAllocated(); + (*it)->resetLastAllocated(); } // We hit pool boundary, let's try to jump to the next pool and try again - ++it; + ++it; retrying = true; } @@ -2572,7 +2572,8 @@ inAllowedPool(AllocEngine::ClientContext4& ctx, const IOAddress& address) { Subnet4Ptr current_subnet = ctx.subnet_; while (current_subnet) { - if (current_subnet->inPool(Lease::TYPE_V4, address)) { + if (current_subnet->inPool(Lease::TYPE_V4, address, + ctx.query_->getClasses())) { // We found a subnet that this address belongs to, so it // seems that this subnet is the good candidate for allocation. // Let's update the selected subnet. diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index d57b94a894..4499cbe4aa 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -380,9 +380,12 @@ PoolParser::parse(PoolStoragePtr pools, } // Client-class. - string client_class = getString(pool_structure, "client-class"); - if (!client_class.empty()) { - pool->allowClientClass(client_class); + ConstElementPtr client_class = pool_structure->get("client-class"); + if (client_class) { + string cclass = client_class->stringValue(); + if (!cclass.empty()) { + pool->allowClientClass(cclass); + } } } @@ -853,6 +856,11 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { user_context_ = user_context; } + ConstElementPtr client_class = pd_pool_->get("client-class"); + if (client_class) { + client_class_ = client_class; + } + // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. try { @@ -876,9 +884,12 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { pool_->setContext(user_context_); } - string client_class = getString(pd_pool_, "client-class"); - if (!client_class.empty()) { - pool_->allowClientClass(client_class); + + if (client_class_) { + string cclass = client_class_->stringValue(); + if (!cclass.empty()) { + pool_->allowClientClass(cclass); + } } // Add the local pool to the external storage ptr. diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.h b/src/lib/dhcpsrv/parsers/dhcp_parsers.h index 0941e70b46..e195cd4bad 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.h +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.h @@ -652,6 +652,9 @@ private: CfgOptionPtr options_; isc::data::ConstElementPtr user_context_; + + isc::data::ConstElementPtr client_class_; + }; /// @brief Parser for a list of prefix delegation pools. diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 1e3b622160..3e41426eac 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -111,7 +111,6 @@ Pool::toElement() const { // Set pool options ConstCfgOptionPtr opts = getCfgOption(); map->set("option-data", opts->toElement()); - return (map); // Set client-class const ClientClasses& cclasses = getClientClasses(); @@ -121,6 +120,8 @@ Pool::toElement() const { } else if (!cclasses.empty()) { map->set("client-class", Element::create(*cclasses.cbegin())); } + + return (map); } data::ElementPtr diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 0e0f0baca7..a07a9c47c0 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -475,6 +475,31 @@ Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const { return (false); } +bool +Subnet::inPool(Lease::Type type, + const isc::asiolink::IOAddress& addr, + const ClientClasses& client_classes) const { + + // Let's start with checking if it even belongs to that subnet. + if ((type != Lease::TYPE_PD) && !inRange(addr)) { + return (false); + } + + const PoolCollection& pools = getPools(type); + + for (PoolCollection::const_iterator pool = pools.begin(); + pool != pools.end(); ++pool) { + if (!(*pool)->clientSupported(client_classes)) { + continue; + } + if ((*pool)->inRange(addr)) { + return (true); + } + } + // There's no pool that address belongs to + return (false); +} + bool Subnet::poolOverlaps(const Lease::Type& pool_type, const PoolPtr& pool) const { const PoolCollection& pools = getPools(pool_type); @@ -709,6 +734,14 @@ Subnet6::toElement() const { // Set pool options ConstCfgOptionPtr opts = (*pool)->getCfgOption(); pool_map->set("option-data", opts->toElement()); + // Set client-class + const ClientClasses& cclasses = (*pool)->getClientClasses(); + if (cclasses.size() > 1) { + isc_throw(ToElementError, "client-class has too many items: " + << cclasses.size()); + } else if (!cclasses.empty()) { + pool_map->set("client-class", Element::create(*cclasses.cbegin())); + } // Push on the pool list pool_list->add(pool_map); } @@ -763,6 +796,14 @@ Subnet6::toElement() const { // Set pool options ConstCfgOptionPtr opts = pdpool->getCfgOption(); pool_map->set("option-data", opts->toElement()); + // Set client-class + const ClientClasses& cclasses = pdpool->getClientClasses(); + if (cclasses.size() > 1) { + isc_throw(ToElementError, "client-class has too many items: " + << cclasses.size()); + } else if (!cclasses.empty()) { + pool_map->set("client-class", Element::create(*cclasses.cbegin())); + } // Push on the pool list pdpool_list->add(pool_map); } diff --git a/src/lib/dhcpsrv/subnet.h b/src/lib/dhcpsrv/subnet.h index 883aa229b6..dacdad8d05 100644 --- a/src/lib/dhcpsrv/subnet.h +++ b/src/lib/dhcpsrv/subnet.h @@ -54,6 +54,19 @@ public: /// @return true if the address is in any of the pools bool inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const; + /// @brief checks if the specified address is in allowed pools + /// + /// This takes also into account client classes + /// + /// @param type type of pools to iterate over + /// @param addr this address will be checked if it belongs to any pools in + /// that subnet + /// @param client_classes client class list which must be allowed + /// @return true if the address is in any of the allowed pools + bool inPool(Lease::Type type, + const isc::asiolink::IOAddress& addr, + const ClientClasses& client_classes) const; + /// @brief returns the last address that was tried from this subnet /// /// This method returns the last address that was attempted to be allocated diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index ab02757247..8f92b2ffa6 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -690,6 +690,44 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkClassification) { EXPECT_EQ("192.0.2.17", lease->addr_.toText()); } +// This test verifies that the server can offer an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolClassification) { + + // Try to offer address from subnet1. There is one address available + // so it should be offerred. + AllocEngine::ClientContext4 + ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), + false, false, "host.example.com.", true); + ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234)); + Lease4Ptr lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should offer an address from subnet2 that belongs + // to the same shared network. + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1. + ctx.query_->addClass(ClientClass("cable-modem")); + + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_EQ("192.0.2.17", lease->addr_.toText()); +} + // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong. @@ -888,6 +926,62 @@ TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkClassification) { EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); } +// This test verifies that the server can assign an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolClassification) { + // Try to offer address from subnet1. There is one address available + // so it should be offerred. + AllocEngine::ClientContext4 + ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), + false, false, "host.example.com.", false); + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + Lease4Ptr lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should assign an address from subnet2 that belongs + // to the same shared network. + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1. + ctx.query_->addClass(ClientClass("cable-modem")); + + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Let's now remove the client from the cable-modem class and try + // to renew the address. The engine should determine that the + // client doesn't have access to the pool1 anymore and + // assign an address from unrestricted pool. + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); +#if 0 + // It should work but currently it does not... + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); +#endif +} + // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong (DHCPREQUEST case). diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index a8d80109ea..97c1b69daa 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -2185,6 +2185,58 @@ TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkClassification) { EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); } +// This test verifies that the server can offer an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolClassification) { + // Try to offer address from subnet1. There is an address available so + // it should be offerred. + Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); + AllocEngine::ClientContext6 ctx(subnet1_, duid_, false, false, "", true, + query); + ctx.currentIA().iaid_ = iaid_; + + Lease6Ptr lease; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet1_->inRange(lease->addr_)); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should offer an address from subnet2 that belongs + // to the same shared network. + AllocEngine::ClientContext6 ctx2(subnet1_, duid_, false, false, "", true, + query); + ctx2.currentIA().iaid_ = iaid_; + ctx2.query_ = query; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx2))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet2_->inRange(lease->addr_)); + + AllocEngine::ClientContext6 ctx3(subnet1_, duid_, false, false, "", true, + query); + ctx3.currentIA().iaid_ = iaid_; + ctx3.query_ = query; + + AllocEngine::ClientContext6 ctx4(subnet1_, duid_, false, false, "", true, + query); + ctx4.currentIA().iaid_ = iaid_; + ctx4.query_ = query; + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1_. + ctx4.query_->addClass(ClientClass("cable-modem")); + + AllocEngine::findReservation(ctx4); + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx4))); + ASSERT_TRUE(lease); + EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); +} + // This test verifies that the client is offerred a reserved address // even if this address belongs to another subnet within the same // shared network. diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index c8083d0c84..0e5e0c59ed 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -812,6 +812,7 @@ TEST(CfgSubnets4Test, unparsePool) { Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 24, 1, 2, 3, 123)); Pool4Ptr pool1(new Pool4(IOAddress("192.0.2.1"), IOAddress("192.0.2.10"))); Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); + pool2->allowClientClass("bar"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -841,7 +842,8 @@ TEST(CfgSubnets4Test, unparsePool) { " \"pool\": \"192.0.2.1-192.0.2.10\"\n" " },{\n" " \"option-data\": [ ],\n" - " \"pool\": \"192.0.2.64/26\"\n" + " \"pool\": \"192.0.2.64/26\",\n" + " \"client-class\": \"bar\"\n" " }\n" " ]\n" "} ]\n"; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index 575a0b8e90..df09f3301f 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -503,6 +503,7 @@ TEST(CfgSubnets6Test, unparsePool) { IOAddress("2001:db8:1::100"), IOAddress("2001:db8:1::199"))); Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); + pool2->allowClientClass("bar"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -526,7 +527,8 @@ TEST(CfgSubnets6Test, unparsePool) { " \"option-data\": [ ]\n" " },{\n" " \"pool\": \"2001:db8:1:1::/64\",\n" - " \"option-data\": [ ]\n" + " \"option-data\": [ ],\n" + " \"client-class\": \"bar\"\n" " }\n" " ],\n" " \"pd-pools\": [ ],\n" @@ -547,6 +549,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { IOAddress("2001:db8:2::"), 48, 64)); Pool6Ptr pdpool2(new Pool6(IOAddress("2001:db8:3::"), 48, 56, IOAddress("2001:db8:3::"), 64)); + pdpool2->allowClientClass("bar"); subnet->addPool(pdpool1); subnet->addPool(pdpool2); @@ -577,7 +580,8 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"delegated-len\": 56,\n" " \"excluded-prefix\": \"2001:db8:3::\",\n" " \"excluded-prefix-len\": 64,\n" - " \"option-data\": [ ]\n" + " \"option-data\": [ ],\n" + " \"client-class\": \"bar\"\n" " }\n" " ],\n" " \"option-data\": [ ]\n" diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index efb4cafe1d..4226bc2eea 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -521,19 +521,44 @@ TEST(Subnet4Test, inRangeinPool) { // the first address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("192.2.0.0"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.0.0"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.0.0"))); // let's try something in the middle as well EXPECT_TRUE(subnet->inRange(IOAddress("192.2.3.4"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); // the last address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("192.2.255.255"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.255.255"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.255.255"))); // the first address that is in range, but out of pool EXPECT_TRUE(subnet->inRange(IOAddress("192.3.0.0"))); EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.3.0.0"))); + + // Add with classes + pool1->allowClientClass("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class)); + + // This client belongs to foo only + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class)); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class)); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes)); } // This test checks if the toText() method returns text representation @@ -1351,11 +1376,11 @@ TEST(Subnet6Test, inRangeinPool) { // the first address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::10"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::10"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::10"))); // let's try something in the middle as well EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::18"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); // the last address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::20"))); @@ -1364,6 +1389,31 @@ TEST(Subnet6Test, inRangeinPool) { // the first address that is in range, but out of pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::21"))); EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::21"))); + + // Add with classes + pool1->allowClientClass("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class)); + + // This client belongs to foo only + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class)); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class)); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes)); } // This test verifies that inRange() and inPool() methods work properly From 7a5eeed8ad2de1bfa95da1555fd40378f9bc20e7 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 5 Nov 2017 11:58:06 +0100 Subject: [PATCH 07/52] [5425] Added final? new tests --- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 23 ++ .../dhcpsrv/tests/alloc_engine6_unittest.cc | 217 ++++++++++++++++++ 2 files changed, 240 insertions(+) diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index 8f92b2ffa6..7abfd5cc87 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -332,6 +332,29 @@ TEST_F(AllocEngine4Test, IterativeAllocator) { } } +// This test verifies that the allocator picks addresses that belong to the +// pool using classification +TEST_F(AllocEngine4Test, IterativeAllocator_class) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); + + // Restrict pool_ to the foo class. Add a second pool with bar class. + pool_->allowClientClass("foo"); + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.200"), + IOAddress("192.0.2.209"))); + pool->allowClientClass("bar"); + subnet_->addPool(pool); + + // Clients are in bar + cc_.insert("bar"); + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, + IOAddress("0.0.0.0")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_)); + } +} // This test verifies that the iterative allocator really walks over all addresses // in all pools in specified subnet. It also must not pick the same address twice diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 97c1b69daa..e96ebbd37b 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -194,6 +194,29 @@ TEST_F(AllocEngine6Test, IterativeAllocator) { } } +// This test verifies that the allocator picks addresses that belong to the +// pool using classification +TEST_F(AllocEngine6Test, IterativeAllocator_class) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); + + // Restrict pool_ to the foo class. Add a second pool with bar class. + pool_->allowClientClass("foo"); + Pool6Ptr pool(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::109"))); + pool->allowClientClass("bar"); + subnet_->addPool(pool); + + // Clients are in bar + cc_.insert("bar"); + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_)); + } +} + TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); @@ -229,6 +252,83 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } +TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); + + subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool + + Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + IOAddress("2001:db8:1::5"))); + Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::100"))); + Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), + IOAddress("2001:db8:1::106"))); + // Set pool1 and pool3 but not pool2 in foo class + pool1->allowClientClass("foo"); + pool3->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients are in foo + cc_.insert("foo"); + + // Let's check the first pool (5 addresses here) + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is easy - only one address here + EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // This is the third and last pool, with 2 addresses in it + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // We iterated over all addresses and reached to the end of the last pool. + // Let's wrap around and start from the beginning + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); + + subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool + + Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + IOAddress("2001:db8:1::5"))); + Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::100"))); + Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), + IOAddress("2001:db8:1::106"))); + // Set pool2 in foo + pool2->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Let's check the first pool (5 addresses here) + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is skipped + + // This is the third and last pool, with 2 addresses in it + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // We iterated over all addresses and reached to the end of the last pool. + // Let's wrap around and start from the beginning + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); @@ -284,6 +384,123 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } +TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); + + subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); + + Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); + Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); + Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); + // Set pool1 and pool3 but not pool2 in foo class + pool1->allowClientClass("foo"); + pool3->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients are in foo + cc_.insert("foo"); + + // We have a 2001:db8::/48 subnet that has 3 pools defined in it: + // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) + // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) + // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) + + // First pool check (Let's check over all 16 leases) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Second pool (just one lease here) + EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Third pool (256 leases, let's check first and last explicitly and the + // rest over in a pool + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + for (int i = 1; i < 255; i++) { + stringstream exp; + exp << "2001:db8:2:" << hex << i << dec << "::"; + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + } + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Ok, we've iterated over all prefixes in all pools. We now wrap around. + // We're looping over now (iterating over first pool again) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); + + subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); + + Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); + Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); + Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); + // Set pool2 in foo + pool2->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // We have a 2001:db8::/48 subnet that has 3 pools defined in it: + // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) + // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) + // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) + + // First pool check (Let's check over all 16 leases) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is skipped + + // Third pool (256 leases, let's check first and last explicitly and the + // rest over in a pool + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + for (int i = 1; i < 255; i++) { + stringstream exp; + exp << "2001:db8:2:" << hex << i << dec << "::"; + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + } + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Ok, we've iterated over all prefixes in all pools. We now wrap around. + // We're looping over now (iterating over first pool again) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + // This test verifies that the iterative allocator can step over addresses TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); From 57cd314b47a154e6573fb8727f1cf31cbbd9dd6e Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 5 Nov 2017 17:57:49 +0100 Subject: [PATCH 08/52] [5425] Completed pool tests (with bug to fix) and cloned to plain subnets --- .../dhcp4/tests/shared_network_unittest.cc | 196 ++++++++++++++++- .../dhcp6/tests/shared_network_unittest.cc | 198 +++++++++++++++++- 2 files changed, 391 insertions(+), 3 deletions(-) diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index bc50de5486..9e564d551e 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -862,7 +862,7 @@ const char* NETWORKS_CONFIG[] = { "}", // Configuration #16 -// - 1 shared network with 1 subnet and 2 pools and client class restriction +// - 1 shared network with 1 subnet and 2 pools (first pool has class restriction) "{" " \"interfaces-config\": {" " \"interfaces\": [ \"*\" ]" @@ -871,6 +871,10 @@ const char* NETWORKS_CONFIG[] = { " {" " \"name\": \"a-devices\"," " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" " }" " ]," " \"valid-lifetime\": 600," @@ -895,6 +899,118 @@ const char* NETWORKS_CONFIG[] = { " ]" " }" " ]" + "}", + +// Configuration #17 +// - 1 shared network with 1 subnet and 2 pools (each with class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #18 +// - plain subnet and 2 pools (first pool has class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #19 +// - plain subnet and 2 pools (each with class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" "}" }; @@ -1854,6 +1970,84 @@ TEST_F(Dhcpv4SharedNetworkTest, poolInSharedNetworkSelectedByClass) { testAssigned([this, &client2] { doDORA(client2, "192.0.2.100"); }); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + configure(NETWORKS_CONFIG[17], *client1.getServer()); + + // The client should be refused to renew the lease because it doesn't belong + // to "b-devices" class. + client2.setState(Dhcp4Client::RENEWING); + testAssigned([this, &client2] { + doRequest(client2, ""); + }); + + // If we add option93 with a value matching this class, the lease should + // get renewed. + OptionPtr option93_bis(new OptionUint16(Option::V4, 93, 0x0002)); + client2.addExtraOption(option93_bis); + + testAssigned([this, &client2] { + doRequest(client2, "192.0.2.100"); + }); } +// Access to a pool within plain subnet is restricted by client classification. +TEST_F(Dhcpv4SharedNetworkTest, poolInSubnetSelectedByClass) { + // Create client #1 + Dhcp4Client client1(Dhcp4Client::SELECTING); + client1.setIfaceName("eth1"); + + // Configure the server with one plain subnet including two pools. + // The access to one of the pools is restricted by client classification. + configure(NETWORKS_CONFIG[18], *client1.getServer()); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.100", "192.0.2.63"); + }); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option93 which would cause the client to be classified as "a-devices". + OptionPtr option93(new OptionUint16(Option::V4, 93, 0x0001)); + client1.addExtraOption(option93); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.63", "192.0.2.63"); + }); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp4Client client2(client1.getServer(), Dhcp4Client::SELECTING); + client2.setIfaceName("eth1"); + testAssigned([this, &client2] { + doDORA(client2, "192.0.2.100"); + }); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + configure(NETWORKS_CONFIG[19], *client1.getServer()); + + // The client should be refused to renew the lease because it doesn't belong + // to "b-devices" class. + client2.setState(Dhcp4Client::RENEWING); + testAssigned([this, &client2] { + doRequest(client2, ""); + }); + + // If we add option93 with a value matching this class, the lease should + // get renewed. + OptionPtr option93_bis(new OptionUint16(Option::V4, 93, 0x0002)); + client2.addExtraOption(option93_bis); + + testAssigned([this, &client2] { + doRequest(client2, "192.0.2.100"); + }); +} } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index adeab7ed7e..2e869443d9 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -957,13 +957,17 @@ const char* NETWORKS_CONFIG[] = { "}", // Configuration #19. -// - one shared network with on subnet and two pools (the first has +// - one shared network with one subnet and two pools (the first has // class restrictions) "{" " \"client-classes\": [" " {" " \"name\": \"a-devices\"," " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" " }" " ]," " \"shared-networks\": [" @@ -989,6 +993,112 @@ const char* NETWORKS_CONFIG[] = { " ]" "}", +// Configuration #20. +// - one shared network with one subnet and two pools (each with class +// restriction) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #21. +// - one plain subnet with two pools (the first has class restrictions) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #22. +// - one plain subnet with two pools (each with class restriction) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}" + }; /// @Brief Test fixture class for DHCPv6 server using shared networks. @@ -2230,7 +2340,7 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { }); ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::20"))); - // Client 2 should be assigned an address from the unrestricted subnet. + // Client 2 should be assigned an address from the unrestricted pool. Dhcp6Client client2(client1.getServer()); client2.setInterface("eth1"); ASSERT_NO_THROW(client2.requestAddress(0xabca0)); @@ -2238,6 +2348,90 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { ASSERT_NO_THROW(client2.doSARR()); }); ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:1::50"))); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[20], *client1.getServer())); + + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); +#if 0 + EXPECT_EQ(0, client2.getLeaseNum()); +#endif + + // If we add option 1234 with a value matching this class, the lease should + // get renewed. + OptionPtr option1234_bis(new OptionUint16(Option::V6, 1234, 0x0002)); + client2.addExtraOption(option1234_bis); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(1, client2.getLeaseNum()); +} + +// Pool is selected based on the client class specified using a plain subnet. +TEST_F(Dhcpv6SharedNetworkTest, poolInSubnetSelectedByClass) { + // Create client #1. + Dhcp6Client client1; + client1.setInterface("eth1"); + + // Configure the server with one plain subnet including two pools. + // The access to one of the pools is restricted by client classification. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[21], *client1.getServer())); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + ASSERT_NO_THROW(client1.requestAddress(0xabca, IOAddress("2001:db8:1::20"))); + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::50"))); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option 1234 which would cause the client to be classified as "a-devices". + OptionPtr option1234(new OptionUint16(Option::V6, 1234, 0x0001)); + client1.addExtraOption(option1234); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::20"))); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp6Client client2(client1.getServer()); + client2.setInterface("eth1"); + ASSERT_NO_THROW(client2.requestAddress(0xabca0)); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:1::50"))); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[22], *client1.getServer())); + + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); +#if 0 + EXPECT_EQ(0, client2.getLeaseNum()); +#endif + + // If we add option 1234 with a value matching this class, the lease should + // get renewed. + OptionPtr option1234_bis(new OptionUint16(Option::V6, 1234, 0x0002)); + client2.addExtraOption(option1234_bis); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(1, client2.getLeaseNum()); } } // end of anonymous namespace From 29c00734a010dc09b5d30aaa82b3b7926deace77 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 5 Nov 2017 22:53:49 +0100 Subject: [PATCH 09/52] [5425] Fixed renew after pool class change --- .../dhcp6/tests/shared_network_unittest.cc | 10 +-- src/lib/dhcpsrv/alloc_engine.cc | 81 ++++++++++++++++--- src/lib/dhcpsrv/alloc_engine.h | 15 +++- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 3 - 4 files changed, 86 insertions(+), 23 deletions(-) diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index 2e869443d9..bca8a1e08f 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -2356,9 +2356,7 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { testAssigned([this, &client2] { ASSERT_NO_THROW(client2.doRenew()); }); -#if 0 - EXPECT_EQ(0, client2.getLeaseNum()); -#endif + EXPECT_EQ(0, client2.getLeasesWithNonZeroLifetime().size()); // If we add option 1234 with a value matching this class, the lease should // get renewed. @@ -2368,6 +2366,7 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { ASSERT_NO_THROW(client2.doRenew()); }); EXPECT_EQ(1, client2.getLeaseNum()); + EXPECT_EQ(1, client2.getLeasesWithNonZeroLifetime().size()); } // Pool is selected based on the client class specified using a plain subnet. @@ -2420,9 +2419,7 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSubnetSelectedByClass) { testAssigned([this, &client2] { ASSERT_NO_THROW(client2.doRenew()); }); -#if 0 - EXPECT_EQ(0, client2.getLeaseNum()); -#endif + EXPECT_EQ(0, client2.getLeasesWithNonZeroLifetime().size()); // If we add option 1234 with a value matching this class, the lease should // get renewed. @@ -2432,6 +2429,7 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSubnetSelectedByClass) { ASSERT_NO_THROW(client2.doRenew()); }); EXPECT_EQ(1, client2.getLeaseNum()); + EXPECT_EQ(1, client2.getLeasesWithNonZeroLifetime().size()); } } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index b4f93d2733..d608de1b28 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -427,20 +427,29 @@ namespace { /// function when it belongs to a shared network. /// @param lease_type Type of the lease. /// @param address IPv6 address or prefix to be checked. +/// @param check_subnet if true only subnets are checked else both subnets +/// and pools are checked /// /// @return true if address belongs to a pool in a selected subnet or in /// a pool within any of the subnets belonging to the current shared network. bool inAllowedPool(AllocEngine::ClientContext6& ctx, const Lease::Type& lease_type, - const IOAddress& address) { + const IOAddress& address, bool check_subnet) { // If the subnet belongs to a shared network we will be iterating // over the subnets that belong to this shared network. Subnet6Ptr current_subnet = ctx.subnet_; while (current_subnet) { if (current_subnet->clientSupported(ctx.query_->getClasses())) { - if (current_subnet->inPool(lease_type, address)) { - return (true); + if (check_subnet) { + if (current_subnet->inPool(lease_type, address)) { + return (true); + } + } else { + if (current_subnet->inPool(lease_type, address, + ctx.query_->getClasses())) { + return (true); + } } } @@ -1114,11 +1123,14 @@ AllocEngine::allocateReservedLeases6(ClientContext6& ctx, void AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, Lease6Collection& existing_leases) { - // If there are no leases (so nothing to remove) or - // host reservation is disabled (so there are no reserved leases), - // just return. - if (existing_leases.empty() || !ctx.subnet_ || - (ctx.subnet_->getHostReservationMode() == Network::HR_DISABLED) ) { + // If there are no leases (so nothing to remove) just return. + if (existing_leases.empty() || !ctx.subnet_) { + return; + } + // If host reservation is disabled (so there are no reserved leases) + // use the simplified version. + if (ctx.subnet_->getHostReservationMode() == Network::HR_DISABLED) { + removeNonmatchingReservedNoHostLeases6(ctx, existing_leases); return; } @@ -1155,7 +1167,8 @@ AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, // be allocated to us from a dynamic pool, but we must check if // this lease belongs to any pool. If it does, we can proceed to // checking the next lease. - if (!host && inAllowedPool(ctx, candidate->type_, candidate->addr_)) { + if (!host && inAllowedPool(ctx, candidate->type_, + candidate->addr_, false)) { continue; } @@ -1202,6 +1215,44 @@ AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, } } +void +AllocEngine::removeNonmatchingReservedNoHostLeases6(ClientContext6& ctx, + Lease6Collection& existing_leases) { + // We need a copy, so we won't be iterating over a container and + // removing from it at the same time. It's only a copy of pointers, + // so the operation shouldn't be that expensive. + Lease6Collection copy = existing_leases; + + BOOST_FOREACH(const Lease6Ptr& candidate, copy) { + // Lease can be allocated to us from a dynamic pool, but we must + // check if this lease belongs to any allowed pool. If it does, + // we can proceed to checking the next lease. + if (inAllowedPool(ctx, candidate->type_, + candidate->addr_, false)) { + continue; + } + + // Remove this lease from LeaseMgr as it doesn't belong to a pool. + LeaseMgrFactory::instance().deleteLease(candidate->addr_); + + // Update DNS if needed. + queueNCR(CHG_REMOVE, candidate); + + // Need to decrease statistic for assigned addresses. + StatsMgr::instance().addValue( + StatsMgr::generateName("subnet", candidate->subnet_id_, + ctx.currentIA().type_ == Lease::TYPE_NA ? + "assigned-nas" : "assigned-pds"), + static_cast(-1)); + + // Add this to the list of removed leases. + ctx.currentIA().old_leases_.push_back(candidate); + + // Let's remove this candidate from existing leases + removeLeases(existing_leases, candidate->addr_); + } +} + bool AllocEngine::removeLeases(Lease6Collection& container, const asiolink::IOAddress& addr) { @@ -1755,7 +1806,8 @@ AllocEngine::updateLeaseData(ClientContext6& ctx, const Lease6Collection& leases // If the lease is in the current subnet we need to account // for the re-assignment of The lease. - if (inAllowedPool(ctx, ctx.currentIA().type_, lease->addr_)) { + if (inAllowedPool(ctx, ctx.currentIA().type_, + lease->addr_, true)) { StatsMgr::instance().addValue( StatsMgr::generateName("subnet", lease->subnet_id_, ctx.currentIA().type_ == Lease::TYPE_NA ? @@ -2558,6 +2610,7 @@ void findClientLease(AllocEngine::ClientContext4& ctx, Lease4Ptr& client_lease) /// within a shared network. /// /// @todo Update this function to take client classification into account. +/// @note client classification in pools (vs subnets) is checked /// /// @param ctx Client context. Current subnet may be modified by this /// function when it belongs to a shared network. @@ -2897,9 +2950,13 @@ AllocEngine::requestLease4(AllocEngine::ClientContext4& ctx) { // If the client is requesting an address which is assigned to the client // let's just renew this address. Also, renew this address if the client // doesn't request any specific address. + // Added extra checks: the address is reserved or belongs to the dynamic + // pool for the case the pool class has changed before the request. if (client_lease) { - if ((client_lease->addr_ == ctx.requested_address_) || - ctx.requested_address_.isV4Zero()) { + if (((client_lease->addr_ == ctx.requested_address_) || + ctx.requested_address_.isV4Zero()) && + (hasAddressReservation(ctx) || + inAllowedPool(ctx, client_lease->addr_))) { LOG_DEBUG(alloc_engine_logger, ALLOC_ENGINE_DBG_TRACE, ALLOC_ENGINE_V4_REQUEST_EXTEND_LEASE) diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index d30e96008c..af5c44da21 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -831,8 +831,8 @@ private: /// @brief Removes leases that are reserved for someone else. /// /// Goes through the list specified in existing_leases and removes those that - /// are reserved by someone else. The removed leases are added to the - /// ctx.removed_leases_ collection. + /// are reserved by someone else or do not belong to an allowed pool. + /// The removed leases are added to the ctx.removed_leases_ collection. /// /// @param ctx client context that contains all details (subnet, client-id, etc.) /// @param existing_leases [in/out] leases that should be checked @@ -840,6 +840,17 @@ private: removeNonmatchingReservedLeases6(ClientContext6& ctx, Lease6Collection& existing_leases); + /// @brief Removes leases that are reserved for someone else. + /// + /// Simplified version of removeNonmatchingReservedLeases6 to be + /// used when host reservations are disabled. + /// + /// @param ctx client context that contains all details (subnet, client-id, etc.) + /// @param existing_leases [in/out] leases that should be checked + void + removeNonmatchingReservedNoHostLeases6(ClientContext6& ctx, + Lease6Collection& existing_leases); + /// @brief Removed leases that are not reserved for this client /// /// This method iterates over existing_leases and will remove leases that are diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index 7abfd5cc87..3e1a370580 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -999,10 +999,7 @@ TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolClassification) { ctx.subnet_ = subnet1_; lease = engine_.allocateLease4(ctx); ASSERT_TRUE(lease); -#if 0 - // It should work but currently it does not... EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); -#endif } // Test that reservations within shared network take precedence over the From 9be04ee3973c1097a9d73dded7dedbfba9932812 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 19 Nov 2017 11:25:09 +0100 Subject: [PATCH 10/52] [5425] Extended syntax --- src/bin/dhcp4/dhcp4_lexer.ll | 25 +++++++++++++++++++++++++ src/bin/dhcp4/dhcp4_parser.yy | 17 ++++++++++++++++- src/bin/dhcp4/parser_context.cc | 2 ++ src/bin/dhcp4/parser_context.h | 3 +++ src/bin/dhcp6/dhcp6_lexer.ll | 25 +++++++++++++++++++++++++ src/bin/dhcp6/dhcp6_parser.yy | 18 +++++++++++++++++- src/bin/dhcp6/parser_context.cc | 2 ++ src/bin/dhcp6/parser_context.h | 3 +++ 8 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index ba8f1f1944..1623ca910c 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -586,6 +586,31 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"known-clients\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::POOLS: + return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); +} + +\"only\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::KNOWN_CLIENTS: + return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); +} + +\"never\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::KNOWN_CLIENTS: + case isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME: + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("never", driver.loc_); +} + \"subnet\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index f72a5524c4..dc5fcbf4eb 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -109,6 +109,9 @@ using namespace std; POOLS "pools" POOL "pool" USER_CONTEXT "user-context" + KNOWN_CLIENTS "known-clients" + ONLY "only" + NEVER "never" SUBNET "subnet" INTERFACE "interface" @@ -173,7 +176,6 @@ using namespace std; TCP "tcp" JSON "JSON" WHEN_PRESENT "when-present" - NEVER "never" ALWAYS "always" WHEN_NOT_PRESENT "when-not-present" @@ -1331,6 +1333,7 @@ pool_param: pool_entry | option_data_list | client_class | user_context + | known_clients | unknown_map_entry ; @@ -1349,6 +1352,18 @@ user_context: USER_CONTEXT { ctx.leave(); }; +known_clients: KNOWN_CLIENTS { + ctx.enter(ctx.KNOWN_CLIENTS); +} COLON known_clients_value { + ctx.stack_.back()->set("known-clients", $4); + ctx.leave(); +} + +known_clients_value: + ONLY { $$ = ElementPtr(new StringElement("only", ctx.loc2pos(@1))); } + | NEVER { $$ = ElementPtr(new StringElement("never", ctx.loc2pos(@1))); } +; + // --- end of pools definition ------------------------------- // --- reservations ------------------------------------------ diff --git a/src/bin/dhcp4/parser_context.cc b/src/bin/dhcp4/parser_context.cc index 17c268a929..bbafcc2f2e 100644 --- a/src/bin/dhcp4/parser_context.cc +++ b/src/bin/dhcp4/parser_context.cc @@ -174,6 +174,8 @@ Parser4Context::contextName() return ("control-socket"); case POOLS: return ("pools"); + case KNOWN_CLIENTS: + return ("known-clients"); case RESERVATIONS: return ("reservations"); case RELAY: diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index ee998e05f8..83e1f0a13a 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -264,6 +264,9 @@ public: /// Used while parsing Dhcp4/subnet4/pools structures. POOLS, + /// Used while parsing Dhcp4/subnet4/pools/known_client structures. + KNOWN_CLIENTS, + /// Used while parsing Dhcp4/reservations structures. RESERVATIONS, diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index a31486b3fb..d29bdb376d 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -361,6 +361,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_); } +\"never\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::KNOWN_CLIENTS: + case isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME: + return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("never", driver.loc_); +} + (?i:\"never\") { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -817,6 +826,22 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"known-clients\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::POOLS: + return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); +} + +\"only\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::KNOWN_CLIENTS: + return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); +} + \"subnet\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 7ad030d55e..eaff6f36cf 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -99,6 +99,9 @@ using namespace std; EXCLUDED_PREFIX_LEN "excluded-prefix-len" DELEGATED_LEN "delegated-len" USER_CONTEXT "user-context" + KNOWN_CLIENTS "known-clients" + ONLY "only" + NEVER "never" SUBNET "subnet" INTERFACE "interface" @@ -176,7 +179,6 @@ using namespace std; TCP "TCP" JSON "JSON" WHEN_PRESENT "when-present" - NEVER "never" ALWAYS "always" WHEN_NOT_PRESENT "when-not-present" @@ -1294,6 +1296,7 @@ pool_param: pool_entry | option_data_list | client_class | user_context + | known_clients | unknown_map_entry ; @@ -1312,6 +1315,18 @@ user_context: USER_CONTEXT { ctx.leave(); }; +known_clients: KNOWN_CLIENTS { + ctx.enter(ctx.KNOWN_CLIENTS); +} COLON known_clients_value { + ctx.stack_.back()->set("known-clients", $4); + ctx.leave(); +} + +known_clients_value: + ONLY { $$ = ElementPtr(new StringElement("only", ctx.loc2pos(@1))); } + | NEVER { $$ = ElementPtr(new StringElement("never", ctx.loc2pos(@1))); } +; + // --- end of pools definition ------------------------------- // --- pd-pools ---------------------------------------------- @@ -1371,6 +1386,7 @@ pd_pool_param: pd_prefix | excluded_prefix | excluded_prefix_len | user_context + | known_clients | unknown_map_entry ; diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index abef30928e..1ff28141ea 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -176,6 +176,8 @@ Parser6Context::contextName() return ("pools"); case PD_POOLS: return ("pd-pools"); + case KNOWN_CLIENTS: + return ("known-clients"); case RESERVATIONS: return ("reservations"); case RELAY: diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 63f4b882c4..568cd995b5 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -270,6 +270,9 @@ public: /// Used while parsing Dhcp6/subnet6/pd-pools structures. PD_POOLS, + /// Used while parsing Dhcp4/subnet6/pools/known_client structures. + KNOWN_CLIENTS, + /// Used while parsing Dhcp6/reservations structures. RESERVATIONS, From b940473cebea1eadec47a726a8672196e4ce2e8a Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 19 Nov 2017 11:32:00 +0100 Subject: [PATCH 11/52] [5425] Added known_clients_value type --- src/bin/dhcp4/dhcp4_parser.yy | 1 + src/bin/dhcp6/dhcp6_parser.yy | 1 + 2 files changed, 2 insertions(+) diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index dc5fcbf4eb..247a240855 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -220,6 +220,7 @@ using namespace std; %type outbound_interface_value %type db_type %type hr_mode +%type known_clients_value %type ncr_protocol_value %type replace_client_name_value diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index eaff6f36cf..34c346503d 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -222,6 +222,7 @@ using namespace std; %type map_value %type db_type %type hr_mode +%type known_clients_value %type duid_type %type ncr_protocol_value %type replace_client_name_value From 4e5ae0aee93878208b50be4fe679ab2e9aea6343 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 19 Nov 2017 10:33:24 +0000 Subject: [PATCH 12/52] [trac5425] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 1509 ++++++++-------- src/bin/dhcp4/dhcp4_parser.cc | 2966 ++++++++++++++++---------------- src/bin/dhcp4/dhcp4_parser.h | 328 ++-- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 1579 ++++++++--------- src/bin/dhcp6/dhcp6_parser.cc | 3057 +++++++++++++++++---------------- src/bin/dhcp6/dhcp6_parser.h | 346 ++-- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 5000 insertions(+), 4797 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 5a1731e814..af86d72cc8 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1286] = +static const flex_int16_t yy_accept[1298] = { 0, 151, 151, 0, 0, 0, 0, 0, 0, 0, 0, 159, 157, 10, 11, 157, 1, 151, 148, 151, 151, @@ -720,129 +720,131 @@ static const flex_int16_t yy_accept[1286] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 156, 154, 0, - 153, 152, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 121, 0, 120, 0, 0, 62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, + 154, 0, 153, 152, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 0, 120, 0, 0, 62, - 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 155, 152, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 122, 0, 0, 124, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 155, 152, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 122, 0, 0, 124, 0, - 0, 0, 0, 63, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 48, 0, 0, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 51, 0, 33, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, + 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 25, - 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 129, 0, 126, 0, 125, 0, 0, 0, + 0, 0, 76, 25, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 129, 0, 126, 0, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, + 125, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 84, 0, 0, 0, 0, 0, 7, 0, - 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, + 0, 0, 0, 7, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, - 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, + 0, 72, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 66, 0, 0, 0, 71, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 93, 66, 0, 0, 0, 71, 26, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 110, 0, 0, 108, 0, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, + 85, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 79, 0, 20, 0, 90, + 0, 0, 0, 0, 0, 0, 114, 0, 0, 0, + 45, 0, 0, 0, 0, 0, 92, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, - 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, - 134, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 85, 69, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 79, 0, 20, - 0, 90, 0, 0, 0, 0, 0, 114, 0, 0, - 0, 45, 0, 0, 0, 0, 0, 92, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 137, 46, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 111, 0, 109, 0, 104, 103, 0, 19, 0, 0, 0, 0, 0, 123, 0, 0, 75, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 35, 0, 0, 0, 0, 113, 0, - 0, 0, 0, 0, 57, 41, 0, 86, 0, 0, - 77, 0, 0, 0, 0, 52, 0, 132, 0, 131, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 0, 35, 0, 0, 0, 0, 113, + 0, 0, 0, 0, 0, 57, 41, 0, 86, 0, + 0, 77, 0, 0, 0, 0, 52, 0, 132, 0, + 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 139, 74, 0, 38, 102, 0, 0, 135, 106, 0, - 0, 0, 0, 0, 0, 23, 0, 22, 0, 112, - 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 39, 0, 0, 0, 36, 0, - 0, 0, 0, 0, 0, 91, 0, 0, 136, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 138, - 44, 0, 133, 128, 0, 0, 14, 0, 0, 119, - 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, + 0, 0, 139, 74, 0, 38, 102, 0, 0, 135, + 106, 0, 0, 0, 0, 0, 0, 23, 0, 22, + 0, 112, 0, 0, 0, 67, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 91, 0, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 138, 44, 0, 133, 128, 0, 0, 14, 0, - 0, 58, 0, 0, 0, 0, 0, 0, 0, 13, - 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 98, 17, 0, 116, 0, 0, - 0, 115, 0, 0, 0, 97, 0, 0, 0, 118, + 0, 119, 0, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 17, 0, 116, + 0, 0, 0, 115, 0, 0, 0, 97, 0, 0, + 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 95, 100, 42, 0, - 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 96, 0 + 0, 117, 0, 0, 0, 0, 0, 0, 95, 100, + 42, 0, 0, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 64, 0, 0, 96, 0 + } ; static const YY_CHAR yy_ec[256] = @@ -889,317 +891,319 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1298] = +static const flex_int16_t yy_base[1310] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1647, 1648, 32, 1643, 141, 0, 201, 1648, 206, 88, - 11, 213, 1648, 1625, 114, 25, 2, 6, 1648, 1648, - 73, 11, 17, 1648, 1648, 1648, 104, 1631, 1586, 0, - 1623, 107, 1638, 217, 247, 1648, 1582, 185, 1581, 1587, - 93, 58, 1579, 91, 211, 195, 14, 273, 195, 1578, - 181, 275, 202, 209, 1587, 66, 188, 1586, 232, 219, - 296, 282, 207, 1569, 78, 301, 302, 296, 1588, 0, - 341, 357, 365, 371, 376, 1648, 0, 1648, 301, 379, - 223, 299, 196, 309, 322, 210, 1648, 1585, 1624, 1648, + 1661, 1662, 32, 1657, 141, 0, 201, 1662, 206, 88, + 11, 213, 1662, 1639, 114, 25, 2, 6, 1662, 1662, + 73, 11, 17, 1662, 1662, 1662, 104, 1645, 1600, 0, + 1637, 107, 1652, 217, 247, 1662, 1596, 185, 1595, 1601, + 93, 58, 1593, 91, 211, 195, 14, 273, 195, 1592, + 181, 275, 202, 209, 1601, 66, 188, 11, 232, 219, + 296, 282, 207, 1584, 78, 301, 302, 296, 1603, 0, + 341, 357, 365, 371, 376, 1662, 0, 1662, 301, 379, + 223, 299, 196, 309, 322, 210, 1662, 1600, 1639, 1662, - 283, 1648, 391, 1613, 295, 1571, 1581, 333, 344, 1576, - 341, 352, 362, 368, 374, 1619, 0, 442, 365, 1563, - 1565, 1561, 1569, 74, 1565, 1554, 1555, 89, 1571, 1554, - 1563, 1563, 363, 1554, 364, 1555, 355, 1600, 1604, 1546, - 1597, 1539, 1562, 1559, 1559, 1553, 351, 1546, 1539, 1544, - 1538, 378, 1549, 1534, 1533, 1547, 306, 1533, 372, 1549, - 357, 438, 1536, 364, 1547, 1544, 1545, 1543, 1525, 1527, - 376, 1519, 1536, 1528, 0, 407, 415, 412, 412, 418, - 413, 1527, 1648, 0, 1570, 418, 1517, 1520, 416, 423, - 1528, 446, 1571, 450, 1570, 442, 1569, 1648, 487, 1568, + 283, 1662, 391, 1628, 295, 1586, 1596, 333, 344, 1591, + 341, 352, 362, 368, 374, 1634, 0, 442, 365, 1578, + 1580, 1576, 1584, 74, 1580, 1569, 1570, 89, 1586, 1569, + 1578, 1578, 363, 1569, 364, 1570, 355, 1615, 1619, 1561, + 1612, 1554, 1563, 1576, 1573, 1573, 1567, 351, 1560, 1553, + 1558, 1552, 378, 1563, 1548, 1547, 1561, 306, 1547, 372, + 1563, 357, 438, 1550, 364, 1561, 1558, 1559, 1557, 1539, + 1541, 376, 1533, 1550, 1542, 0, 407, 415, 412, 412, + 418, 413, 1541, 1662, 0, 1584, 418, 1531, 1534, 416, + 423, 1542, 446, 1585, 450, 1584, 442, 1583, 1662, 487, - 460, 1529, 1509, 1525, 1522, 1521, 422, 1562, 1556, 1522, - 1501, 1509, 1504, 1518, 1514, 1502, 1514, 1514, 1505, 1489, - 1493, 1506, 1506, 1498, 1488, 1506, 1648, 1501, 1504, 1485, - 1484, 1534, 1483, 1493, 1496, 465, 1492, 1480, 1491, 1527, - 1474, 1530, 1483, 481, 1473, 1489, 1470, 1469, 1475, 1466, - 1465, 1472, 1474, 1519, 1477, 1476, 1470, 274, 1477, 1472, - 1464, 1470, 1469, 1469, 1450, 1466, 1452, 1458, 1465, 1453, - 1446, 1460, 1501, 1462, 485, 1453, 480, 1648, 1648, 481, - 1648, 1648, 1440, 0, 455, 198, 1442, 499, 491, 1496, - 1449, 486, 1648, 1494, 1648, 1488, 534, 1648, 483, 1430, + 1582, 460, 1543, 1523, 1539, 1536, 1535, 422, 1576, 1570, + 1536, 1515, 1523, 1518, 1532, 1528, 1516, 1528, 1528, 1519, + 1503, 1507, 1520, 1520, 1512, 1502, 1520, 1662, 1515, 1518, + 1499, 1494, 1497, 1547, 1496, 1506, 1509, 465, 1505, 1493, + 1504, 1540, 1487, 1543, 1496, 481, 1486, 1502, 1483, 1482, + 1488, 1479, 1478, 1485, 1487, 1532, 1490, 1489, 1483, 274, + 1490, 1485, 1477, 1483, 1482, 1482, 1463, 1479, 1465, 1471, + 1478, 1466, 1459, 1473, 1514, 1475, 485, 1466, 480, 1662, + 1662, 481, 1662, 1662, 1453, 0, 455, 198, 1455, 499, + 491, 1509, 1462, 486, 1662, 1507, 1662, 1501, 534, 1662, - 1486, 1432, 1438, 1488, 1445, 398, 1648, 1443, 1485, 1440, - 1437, 509, 1443, 1481, 1475, 1430, 1425, 1422, 1471, 1430, - 1419, 1468, 1416, 531, 1430, 1415, 1428, 1415, 1425, 1420, - 1427, 1422, 1418, 483, 1416, 1419, 1414, 1410, 1458, 503, - 1452, 1648, 1404, 1403, 1402, 1395, 1397, 1401, 1390, 1403, - 512, 1448, 1403, 1400, 1404, 1648, 1402, 1391, 1391, 1403, - 1385, 1377, 1378, 1399, 1381, 1430, 1392, 1391, 1377, 1389, - 1388, 1387, 1386, 1427, 1426, 1648, 1370, 1369, 555, 1382, - 1648, 1648, 1381, 0, 1370, 1362, 491, 1367, 1418, 1417, - 1375, 1415, 1648, 1363, 1413, 1648, 533, 580, 507, 1412, + 483, 1443, 1499, 1445, 1451, 1501, 1458, 398, 1662, 1456, + 1498, 1453, 1450, 509, 1456, 1494, 1488, 1443, 1438, 1435, + 1484, 1443, 1432, 1481, 1429, 531, 1443, 1428, 1441, 1428, + 1429, 1437, 1432, 1439, 1434, 1430, 483, 1428, 1431, 1426, + 1422, 1470, 503, 1464, 1662, 1416, 1415, 1414, 1407, 1409, + 1413, 1402, 1415, 512, 1460, 1415, 1412, 1416, 1662, 1414, + 1403, 1403, 1415, 1397, 1389, 1390, 1411, 1393, 1442, 1404, + 1403, 1389, 1401, 1400, 1399, 1398, 1439, 1438, 1662, 1382, + 1381, 555, 1394, 1662, 1662, 1393, 0, 1382, 1374, 491, + 1379, 1430, 1429, 1387, 1427, 1662, 1375, 1425, 1662, 533, - 1368, 1364, 1352, 1648, 1368, 1367, 1354, 1353, 1648, 1355, - 1352, 523, 1350, 1352, 1648, 1360, 1357, 1342, 1355, 1350, - 561, 1357, 1339, 1388, 1648, 1337, 1353, 1385, 1348, 1345, - 1346, 1348, 1380, 1333, 1328, 1327, 1376, 1322, 1337, 1315, - 1322, 1327, 1375, 1648, 1322, 1318, 1316, 1320, 1327, 1311, - 1311, 1321, 1324, 1313, 1308, 1648, 1363, 1648, 1307, 1318, - 1355, 1302, 1307, 1316, 1310, 1314, 1354, 1348, 1312, 1292, - 1312, 1294, 1293, 1301, 1305, 1288, 1344, 1286, 1648, 1648, - 1291, 1289, 1648, 1300, 1334, 1296, 0, 1280, 1297, 1335, - 1285, 1648, 1648, 1282, 1648, 1288, 1648, 533, 512, 565, + 580, 507, 1424, 1380, 1376, 1364, 1662, 1380, 1379, 1366, + 1365, 1662, 1367, 1364, 523, 1362, 1364, 1662, 1372, 1369, + 1354, 1367, 1362, 561, 1369, 1351, 1400, 1662, 1349, 1365, + 1397, 1360, 1357, 1358, 1360, 1392, 1391, 1344, 1339, 1338, + 1387, 1333, 1348, 1326, 1333, 1338, 1386, 1662, 1333, 1329, + 1327, 1331, 1338, 1322, 1322, 1332, 1335, 1324, 1319, 1662, + 1374, 1662, 1318, 1329, 1366, 1313, 1318, 1327, 1321, 1325, + 1365, 1359, 1323, 1303, 1323, 1305, 1304, 1312, 1316, 1299, + 1355, 1297, 1662, 1662, 1302, 1300, 1662, 1311, 1345, 1307, + 0, 1291, 1308, 1346, 1296, 1662, 1662, 1293, 1662, 1299, - 1648, 1285, 1273, 1324, 1271, 1270, 1277, 1270, 1282, 1281, - 1281, 1269, 1310, 1277, 1269, 1312, 1258, 1274, 1273, 1648, - 1258, 1255, 1269, 1261, 1267, 1258, 1266, 1251, 1267, 1249, - 1263, 1261, 1244, 1238, 1243, 1258, 1255, 1256, 1253, 1294, - 1251, 1648, 1237, 1239, 1248, 1284, 1283, 1236, 532, 1245, - 1228, 1229, 1226, 1648, 1240, 1219, 1240, 1237, 1229, 1272, - 1226, 1270, 1648, 1217, 1231, 1234, 1215, 1265, 1264, 1211, - 1262, 1261, 1648, 14, 1223, 1206, 1211, 1213, 1648, 1219, - 1209, 1648, 1254, 1202, 1257, 549, 529, 535, 1207, 1250, - 561, 1249, 1248, 1247, 1201, 1191, 1244, 1197, 1207, 1241, + 1662, 533, 512, 565, 1662, 1296, 1284, 1335, 1282, 1281, + 1288, 1281, 1293, 1292, 1292, 1280, 1321, 1288, 1280, 1323, + 1269, 1285, 1284, 1662, 1269, 1266, 1280, 1272, 1278, 1269, + 1277, 1262, 1278, 1260, 1274, 1273, 1271, 1254, 1248, 1253, + 1268, 1265, 1266, 1263, 1304, 1261, 1662, 1247, 1249, 1258, + 1294, 1293, 1246, 532, 1255, 1238, 1239, 1236, 1662, 1250, + 1229, 1250, 1247, 1239, 1282, 1236, 1280, 1662, 1227, 1241, + 1244, 1225, 1275, 1274, 1221, 1272, 1271, 1662, 1266, 1232, + 1215, 1220, 1222, 1662, 1228, 1218, 1662, 1263, 1211, 1266, + 549, 529, 535, 1216, 1259, 561, 1258, 1257, 1256, 1210, - 1204, 1198, 1185, 1193, 1236, 1240, 1197, 1196, 1197, 1190, - 1179, 1192, 1195, 1190, 1191, 1188, 1187, 1190, 1185, 1226, - 1225, 1175, 1165, 1173, 1221, 1648, 1220, 1169, 1161, 1162, - 1175, 1162, 1173, 1648, 1161, 1170, 1169, 1169, 1209, 1152, - 1161, 1154, 1165, 1142, 1146, 1197, 1144, 1154, 1194, 1141, - 1192, 556, 558, 1134, 1144, 557, 1648, 1194, 1152, 1135, - 1140, 1144, 1134, 1146, 1149, 1186, 1648, 1180, 577, 1133, - 1141, 1140, 1135, 1131, 1138, 1121, 1124, 1120, 1137, 1132, - 1120, 1116, 1123, 1117, 1169, 1126, 1114, 1128, 1116, 1648, - 1124, 1122, 1113, 1122, 1118, 1159, 1101, 1101, 1114, 1099, + 1200, 1253, 1206, 1216, 1250, 1213, 1207, 1194, 1202, 1245, + 1249, 1206, 1205, 1206, 1199, 1188, 1201, 1204, 1199, 1200, + 1197, 1196, 1188, 1198, 1193, 1234, 1233, 1183, 1173, 1181, + 1229, 1662, 1228, 1177, 1169, 1170, 1183, 1170, 1181, 1662, + 1169, 1178, 1177, 1177, 1217, 1160, 1169, 1162, 1173, 1150, + 1154, 1205, 1152, 1162, 1202, 1149, 1200, 556, 558, 1142, + 1152, 557, 1202, 1160, 1143, 1148, 1152, 1142, 1154, 1157, + 1194, 1662, 1188, 577, 1141, 1149, 1148, 1143, 1139, 1146, + 1129, 1132, 1128, 1145, 1140, 1128, 1124, 1131, 1125, 1177, + 1134, 1122, 1136, 1124, 1662, 1132, 1130, 1121, 1130, 1126, - 1154, 1096, 1097, 1648, 1648, 1105, 1108, 1111, 1648, 1648, - 1110, 1095, 1087, 574, 1093, 1139, 1090, 17, 7, 132, - 1648, 228, 394, 421, 458, 562, 534, 526, 530, 543, - 554, 564, 567, 562, 565, 572, 572, 574, 627, 586, - 591, 568, 1648, 626, 586, 577, 592, 593, 580, 594, - 1648, 613, 621, 601, 591, 638, 603, 607, 646, 601, - 596, 597, 593, 602, 597, 653, 612, 603, 1648, 605, - 616, 601, 617, 611, 656, 624, 609, 610, 1648, 629, - 612, 669, 614, 1648, 633, 613, 631, 670, 630, 620, - 638, 637, 623, 638, 630, 637, 627, 645, 630, 1648, + 1167, 1109, 1109, 1122, 1107, 1162, 1115, 1103, 1104, 1662, + 1662, 1112, 1115, 94, 1662, 1662, 244, 393, 412, 574, + 463, 557, 527, 578, 537, 593, 1662, 540, 559, 563, + 558, 617, 578, 568, 564, 577, 588, 583, 584, 578, + 580, 582, 582, 584, 637, 596, 601, 578, 1662, 636, + 596, 586, 601, 602, 589, 603, 1662, 622, 630, 610, + 600, 647, 612, 616, 655, 610, 605, 606, 602, 611, + 606, 662, 621, 612, 1662, 614, 625, 610, 626, 620, + 665, 633, 618, 619, 1662, 638, 621, 678, 623, 1662, + 638, 643, 623, 642, 680, 640, 630, 648, 647, 633, - 638, 644, 639, 690, 1648, 641, 646, 640, 652, 646, - 645, 647, 699, 645, 645, 702, 648, 1648, 647, 655, - 653, 652, 657, 667, 668, 673, 712, 671, 687, 692, - 666, 676, 667, 719, 664, 1648, 671, 676, 683, 724, - 726, 675, 1648, 671, 674, 673, 693, 690, 695, 696, - 682, 690, 699, 679, 700, 740, 1648, 695, 744, 745, - 707, 709, 697, 694, 701, 752, 701, 699, 717, 756, - 708, 707, 713, 711, 709, 762, 763, 759, 719, 1648, - 724, 717, 726, 714, 724, 720, 733, 1648, 716, 717, - 1648, 718, 716, 735, 736, 737, 736, 720, 725, 743, + 648, 640, 647, 637, 655, 640, 1662, 648, 654, 649, + 700, 1662, 651, 656, 650, 662, 656, 655, 657, 709, + 655, 655, 712, 658, 1662, 657, 665, 663, 662, 667, + 677, 678, 683, 722, 681, 697, 702, 676, 686, 677, + 729, 674, 1662, 681, 686, 693, 735, 736, 685, 1662, + 681, 684, 683, 703, 700, 705, 706, 692, 700, 709, + 689, 710, 750, 1662, 705, 754, 755, 705, 718, 720, + 709, 705, 712, 763, 712, 710, 728, 767, 719, 718, + 724, 722, 720, 773, 774, 770, 730, 1662, 735, 728, + 737, 725, 735, 731, 744, 1662, 727, 728, 1662, 729, - 1648, 733, 766, 757, 729, 788, 751, 1648, 734, 749, - 741, 745, 1648, 1648, 755, 790, 739, 792, 741, 799, - 744, 755, 747, 753, 749, 767, 768, 1648, 766, 1648, - 769, 1648, 772, 762, 755, 767, 810, 1648, 767, 817, - 818, 1648, 819, 763, 769, 776, 818, 1648, 1648, 768, - 768, 771, 785, 772, 829, 788, 826, 780, 833, 783, - 835, 784, 837, 838, 799, 840, 784, 796, 801, 787, - 817, 846, 806, 1648, 798, 849, 798, 794, 810, 815, - 797, 855, 810, 815, 1648, 816, 809, 818, 819, 816, - 806, 808, 865, 814, 811, 868, 864, 807, 822, 872, + 727, 746, 747, 748, 747, 731, 736, 754, 1662, 744, + 777, 768, 740, 799, 762, 1662, 745, 760, 752, 756, + 1662, 1662, 766, 801, 750, 803, 752, 810, 755, 766, + 758, 764, 760, 778, 779, 1662, 777, 1662, 780, 1662, + 764, 784, 774, 767, 780, 822, 1662, 779, 829, 830, + 1662, 831, 775, 781, 788, 830, 1662, 1662, 780, 780, + 783, 797, 784, 841, 800, 838, 792, 845, 795, 847, + 796, 849, 850, 811, 852, 796, 808, 813, 799, 829, + 858, 818, 1662, 810, 861, 810, 806, 822, 827, 809, + 867, 822, 827, 1662, 828, 821, 830, 831, 828, 818, - 1648, 1648, 1648, 832, 824, 834, 819, 820, 880, 881, - 828, 884, 1648, 834, 836, 887, 830, 1648, 851, 1648, - 835, 1648, 1648, 843, 1648, 893, 844, 895, 896, 878, - 1648, 856, 857, 1648, 845, 844, 847, 847, 848, 844, - 1648, 866, 852, 853, 868, 868, 871, 871, 868, 873, - 1648, 865, 875, 1648, 872, 877, 879, 876, 1648, 868, - 868, 874, 873, 884, 1648, 1648, 923, 1648, 872, 878, - 1648, 880, 882, 885, 896, 1648, 893, 1648, 890, 1648, - 913, 933, 939, 940, 884, 942, 943, 898, 892, 946, - 947, 943, 908, 904, 946, 896, 901, 954, 912, 956, + 820, 877, 826, 823, 824, 881, 877, 820, 835, 886, + 1662, 1662, 1662, 845, 837, 847, 832, 833, 893, 895, + 841, 897, 1662, 847, 849, 900, 843, 1662, 864, 1662, + 849, 1662, 1662, 856, 1662, 906, 857, 908, 909, 891, + 1662, 869, 870, 1662, 858, 857, 860, 860, 861, 857, + 1662, 879, 865, 866, 881, 881, 884, 884, 881, 886, + 1662, 878, 930, 889, 1662, 886, 892, 893, 890, 1662, + 882, 882, 888, 887, 898, 1662, 1662, 937, 1662, 886, + 892, 1662, 894, 896, 899, 910, 1662, 907, 1662, 904, + 1662, 927, 947, 953, 954, 898, 956, 957, 912, 906, - 916, 958, 921, 910, 918, 962, 906, 924, 923, 907, - 963, 928, 929, 929, 916, 927, 974, 934, 947, 934, - 1648, 1648, 978, 1648, 1648, 927, 938, 1648, 1648, 928, - 977, 922, 927, 985, 935, 1648, 941, 1648, 988, 1648, - 933, 948, 953, 1648, 987, 955, 948, 957, 945, 955, - 998, 999, 1000, 951, 1648, 1002, 1003, 951, 1648, 955, - 1007, 953, 952, 1010, 965, 1648, 1007, 969, 1648, 972, - 1015, 976, 959, 961, 958, 974, 983, 1022, 1648, 1648, - 1648, 1018, 1648, 1648, 983, 1020, 1648, 974, 981, 1648, - 978, 983, 1030, 975, 1648, 990, 980, 992, 1035, 979, + 960, 961, 957, 922, 918, 960, 910, 915, 968, 926, + 1662, 970, 930, 972, 935, 924, 932, 976, 920, 938, + 937, 921, 977, 942, 943, 943, 930, 941, 988, 948, + 961, 948, 1662, 1662, 992, 1662, 1662, 941, 952, 1662, + 1662, 942, 991, 936, 941, 999, 949, 1662, 955, 1662, + 1002, 1662, 947, 962, 967, 1662, 1001, 969, 962, 971, + 959, 969, 1012, 1013, 1014, 965, 1662, 1016, 1017, 965, + 1662, 969, 1021, 967, 966, 1024, 979, 1662, 1021, 983, + 1662, 986, 1029, 990, 973, 975, 972, 988, 997, 1036, + 1662, 1662, 1662, 1032, 1662, 1662, 997, 1034, 1662, 988, - 987, 1648, 998, 988, 987, 1001, 992, 1001, 1003, 1648, - 1045, 1046, 1006, 1048, 1648, 1044, 1008, 989, 1052, 1011, - 1012, 1013, 1056, 1015, 1648, 1648, 1020, 1648, 1002, 1060, - 1021, 1648, 1007, 1007, 1009, 1648, 1014, 1009, 1021, 1648, - 1019, 1023, 1014, 1066, 1015, 1031, 1024, 1033, 1024, 1031, - 1018, 1033, 1080, 1039, 1026, 1042, 1033, 1047, 1043, 1648, - 1087, 1088, 1089, 1046, 1045, 1046, 1648, 1648, 1648, 1093, - 1037, 1053, 1648, 1091, 1042, 1041, 1043, 1054, 1101, 1052, - 1648, 1061, 1104, 1648, 1648, 1110, 1115, 1120, 1125, 1130, - 1135, 1140, 1143, 1117, 1122, 1124, 1137 + 995, 1662, 992, 997, 1044, 989, 1662, 1004, 994, 1006, + 1049, 993, 1001, 1662, 1012, 1002, 1001, 1015, 1006, 1015, + 1017, 1662, 1059, 1060, 1020, 1062, 1662, 1058, 1022, 1003, + 1066, 1025, 1026, 1027, 1070, 1029, 1662, 1662, 1034, 1662, + 1016, 1074, 1035, 1662, 1021, 1021, 1023, 1662, 1028, 1023, + 1035, 1662, 1033, 1037, 1028, 1080, 1029, 1045, 1038, 1047, + 1038, 1045, 1032, 1047, 1094, 1053, 1040, 1056, 1047, 1061, + 1057, 1662, 1101, 1102, 1103, 1060, 1059, 1060, 1662, 1662, + 1662, 1107, 1051, 1067, 1662, 1105, 1056, 1055, 1057, 1068, + 1115, 1066, 1662, 1075, 1118, 1662, 1662, 1124, 1129, 1134, + 1139, 1144, 1149, 1154, 1157, 1131, 1136, 1138, 1151 } ; -static const flex_int16_t yy_def[1298] = +static const flex_int16_t yy_def[1310] = { 0, - 1286, 1286, 1287, 1287, 1286, 1286, 1286, 1286, 1286, 1286, - 1285, 1285, 1285, 1285, 1285, 1288, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1289, - 1285, 1285, 1285, 1290, 15, 1285, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, + 1298, 1298, 1299, 1299, 1298, 1298, 1298, 1298, 1298, 1298, + 1297, 1297, 1297, 1297, 1297, 1300, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, + 1297, 1297, 1297, 1302, 15, 1297, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1303, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1288, - 1285, 1285, 1285, 1285, 1285, 1285, 1292, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1289, 1285, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1300, + 1297, 1297, 1297, 1297, 1297, 1297, 1304, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, 1297, - 1290, 1285, 1285, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1293, 45, 1291, 45, 45, + 1302, 1297, 1297, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1305, 45, 1303, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1292, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1294, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1293, 1285, 1291, 45, + 45, 45, 45, 45, 45, 1304, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1306, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1305, 1297, 1303, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1285, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1295, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 1285, 45, 1291, 1285, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1307, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 1297, 45, 1303, 1297, - 45, 45, 45, 45, 45, 45, 1285, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1285, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1285, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1285, 45, 45, 45, 45, - 1285, 1285, 1285, 1296, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 1285, 45, 1291, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 45, 45, 1297, 1297, 1297, 1308, 45, 45, 45, + 45, 45, 45, 45, 45, 1297, 45, 45, 1297, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 1285, 45, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, + 1303, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1285, 45, 1285, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1297, + 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1285, 1285, - 45, 45, 1285, 45, 45, 1285, 1297, 45, 45, 45, - 45, 1285, 1285, 45, 1285, 45, 1285, 45, 45, 45, + 45, 45, 1297, 1297, 45, 45, 1297, 45, 45, 1297, + 1309, 45, 45, 45, 45, 1297, 1297, 45, 1297, 45, - 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1285, + 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1285, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 45, 45, 45, 1285, 45, - 45, 1285, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 1297, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1285, 45, 45, 45, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1285, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1285, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1285, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1297, + 1297, 45, 45, 45, 1297, 1297, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1285, 1285, 45, 45, 45, 1285, 1285, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1297, 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, - 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1285, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1285, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1285, + 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 45, 45, 1297, 45, 45, 1297, 45, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1285, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1285, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1285, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1285, - 45, 45, 45, 45, 45, 45, 45, 1285, 45, 45, - 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, - - 1285, 45, 45, 45, 45, 45, 45, 1285, 45, 45, - 45, 45, 1285, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1285, 45, 1285, - 45, 1285, 45, 45, 45, 45, 45, 1285, 45, 45, - 45, 1285, 45, 45, 45, 45, 45, 1285, 1285, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - - 1285, 1285, 1285, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1285, 45, 45, 45, 45, 1285, 45, 1285, - 45, 1285, 1285, 45, 1285, 45, 45, 45, 45, 45, - 1285, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1285, 45, 45, 1285, 45, 45, 45, 45, 1285, 45, - 45, 45, 45, 45, 1285, 1285, 45, 1285, 45, 45, - 1285, 45, 45, 45, 45, 1285, 45, 1285, 45, 1285, + 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, + 1297, 1297, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1297, 45, 1297, 45, 1297, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 1297, 45, 45, 45, 45, 45, 1297, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1285, 1285, 45, 1285, 1285, 45, 45, 1285, 1285, 45, - 45, 45, 45, 45, 45, 1285, 45, 1285, 45, 1285, - 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1285, 45, 45, 45, 1285, 45, - 45, 45, 45, 45, 45, 1285, 45, 45, 1285, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1285, 1285, - 1285, 45, 1285, 1285, 45, 45, 1285, 45, 45, 1285, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, + 1297, 1297, 1297, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1297, 45, 45, 45, 45, 1297, 45, 1297, + 45, 1297, 1297, 45, 1297, 45, 45, 45, 45, 45, + 1297, 45, 45, 1297, 45, 45, 45, 45, 45, 45, + 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 1297, + 45, 45, 45, 45, 45, 1297, 1297, 45, 1297, 45, + 45, 1297, 45, 45, 45, 45, 1297, 45, 1297, 45, + 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1285, 45, 45, 45, 45, 45, 45, 45, 1285, - 45, 45, 45, 45, 1285, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1285, 1285, 45, 1285, 45, 45, - 45, 1285, 45, 45, 45, 1285, 45, 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1285, - 45, 45, 45, 45, 45, 45, 1285, 1285, 1285, 45, - 45, 45, 1285, 45, 45, 45, 45, 45, 45, 45, - 1285, 45, 45, 1285, 0, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285 + 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1297, 1297, 45, 1297, 1297, 45, 45, 1297, + 1297, 45, 45, 45, 45, 45, 45, 1297, 45, 1297, + 45, 1297, 45, 45, 45, 1297, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, + 1297, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1297, 1297, 1297, 45, 1297, 1297, 45, 45, 1297, 45, + 45, 1297, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 1297, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1297, 1297, 45, 1297, + 45, 45, 45, 1297, 45, 45, 45, 1297, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1297, 45, 45, 45, 45, 45, 45, 1297, 1297, + 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + 45, 45, 1297, 45, 45, 1297, 0, 1297, 1297, 1297, + + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297 } ; -static const flex_int16_t yy_nxt[1720] = +static const flex_int16_t yy_nxt[1734] = { 0, - 1285, 13, 14, 13, 1285, 15, 16, 1285, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 86, 657, - 37, 14, 37, 87, 25, 26, 38, 798, 658, 27, + 1297, 13, 14, 13, 1297, 15, 16, 1297, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 86, 1297, + 37, 14, 37, 87, 25, 26, 38, 1297, 1297, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, - 13, 14, 13, 13, 14, 13, 32, 40, 1285, 13, - 14, 13, 33, 40, 115, 92, 93, 799, 91, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 142, 13, + 14, 13, 33, 40, 115, 92, 93, 143, 91, 34, 35, 13, 14, 13, 95, 15, 16, 96, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 109, 39, 91, 25, 26, 13, 14, 13, 27, 39, 85, 85, 85, 28, 42, 41, 42, 42, 29, 42, 30, 83, 108, 41, 111, 94, 25, 31, 109, - 206, 161, 89, 137, 89, 162, 32, 90, 90, 90, - 207, 138, 33, 211, 212, 83, 108, 800, 111, 34, + 207, 162, 89, 137, 89, 163, 32, 90, 90, 90, + 208, 138, 33, 212, 213, 83, 108, 796, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 45, 45, 45, 45, 48, 45, 49, 50, 45, 51, 45, 52, 53, @@ -1210,181 +1214,183 @@ static const flex_int16_t yy_nxt[1720] = 74, 75, 76, 77, 78, 79, 57, 45, 45, 45, 45, 45, 81, 105, 82, 82, 82, 81, 114, 84, 84, 84, 102, 105, 81, 83, 84, 84, 84, 108, - 83, 178, 122, 112, 139, 123, 387, 83, 124, 105, - 125, 114, 126, 113, 140, 178, 141, 132, 83, 119, - 157, 176, 108, 83, 158, 120, 112, 103, 133, 178, - 83, 45, 147, 135, 159, 387, 148, 45, 134, 45, - 45, 113, 45, 181, 45, 45, 45, 176, 117, 143, - 144, 45, 45, 145, 45, 45, 149, 801, 102, 146, + 83, 179, 122, 112, 139, 123, 390, 83, 124, 105, + 125, 114, 126, 113, 140, 179, 141, 132, 83, 119, + 158, 177, 108, 83, 159, 120, 112, 103, 133, 179, + 83, 45, 148, 135, 160, 390, 149, 45, 134, 45, + 45, 113, 45, 182, 45, 45, 45, 177, 117, 144, + 145, 45, 45, 146, 45, 45, 150, 797, 102, 147, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 90, 90, 90, 45, 127, 114, - 111, 45, 128, 103, 112, 129, 130, 177, 360, 45, - 153, 361, 186, 45, 113, 45, 118, 176, 131, 150, - 154, 151, 171, 152, 163, 155, 156, 112, 164, 169, - 177, 165, 172, 177, 85, 85, 85, 173, 166, 167, - 186, 189, 113, 179, 168, 83, 246, 247, 81, 170, - 82, 82, 82, 89, 190, 89, 180, 192, 90, 90, - 90, 83, 81, 193, 84, 84, 84, 189, 83, 85, - 85, 85, 90, 90, 90, 83, 101, 194, 196, 195, + 111, 45, 128, 103, 112, 129, 130, 178, 363, 45, + 154, 364, 187, 45, 113, 45, 118, 177, 131, 151, + 155, 152, 172, 153, 164, 156, 157, 112, 165, 170, + 178, 166, 173, 178, 85, 85, 85, 174, 167, 168, + 187, 190, 113, 180, 169, 83, 248, 249, 81, 171, + 82, 82, 82, 89, 191, 89, 181, 193, 90, 90, + 90, 83, 81, 194, 84, 84, 84, 190, 83, 85, + 85, 85, 90, 90, 90, 83, 101, 195, 197, 196, - 83, 190, 186, 101, 83, 192, 217, 195, 218, 223, - 193, 220, 224, 235, 192, 253, 225, 236, 83, 200, - 264, 196, 254, 83, 265, 194, 195, 221, 266, 249, - 201, 101, 250, 251, 273, 101, 279, 279, 286, 101, - 277, 406, 192, 278, 241, 277, 278, 101, 255, 289, - 802, 101, 290, 101, 184, 199, 199, 199, 407, 279, - 282, 286, 199, 199, 199, 199, 199, 199, 277, 278, - 292, 296, 281, 280, 294, 334, 803, 289, 305, 290, - 286, 256, 257, 258, 306, 199, 199, 199, 199, 199, - 199, 344, 259, 292, 260, 378, 261, 294, 296, 262, + 83, 191, 187, 101, 83, 193, 218, 196, 219, 224, + 194, 221, 225, 237, 193, 255, 226, 238, 83, 201, + 266, 197, 256, 83, 267, 195, 196, 222, 268, 251, + 202, 101, 252, 253, 275, 101, 281, 281, 288, 101, + 279, 409, 193, 280, 243, 279, 280, 101, 257, 291, + 798, 101, 292, 101, 185, 200, 200, 200, 410, 281, + 284, 288, 200, 200, 200, 200, 200, 200, 279, 280, + 294, 298, 283, 282, 296, 337, 799, 291, 307, 292, + 288, 258, 259, 260, 308, 200, 200, 200, 200, 200, + 200, 347, 261, 294, 262, 381, 263, 296, 298, 264, - 297, 297, 297, 299, 381, 381, 385, 297, 297, 297, - 297, 297, 297, 389, 390, 392, 386, 456, 395, 412, - 804, 387, 391, 413, 490, 345, 335, 381, 382, 336, - 297, 297, 297, 297, 297, 297, 425, 634, 392, 346, - 490, 426, 438, 439, 587, 379, 395, 398, 398, 398, - 399, 445, 490, 669, 398, 398, 398, 398, 398, 398, - 483, 446, 498, 586, 499, 484, 520, 805, 500, 511, - 582, 521, 587, 457, 635, 588, 669, 398, 398, 398, - 398, 398, 398, 668, 512, 806, 670, 427, 807, 498, - 586, 499, 428, 45, 45, 45, 671, 808, 809, 810, + 299, 299, 299, 301, 384, 384, 388, 299, 299, 299, + 299, 299, 299, 392, 393, 395, 389, 460, 398, 415, + 802, 390, 394, 416, 494, 348, 338, 384, 385, 339, + 299, 299, 299, 299, 299, 299, 428, 640, 395, 349, + 494, 429, 442, 443, 592, 382, 398, 401, 401, 401, + 402, 449, 494, 674, 401, 401, 401, 401, 401, 401, + 487, 450, 502, 591, 503, 488, 524, 803, 504, 515, + 587, 525, 592, 461, 641, 593, 674, 401, 401, 401, + 401, 401, 401, 673, 516, 804, 675, 430, 805, 502, + 591, 503, 431, 45, 45, 45, 676, 806, 807, 808, - 45, 45, 45, 45, 45, 45, 674, 734, 736, 737, - 753, 668, 675, 741, 735, 811, 738, 793, 812, 742, - 813, 794, 814, 45, 45, 45, 45, 45, 45, 815, - 816, 817, 818, 819, 820, 821, 822, 823, 753, 824, - 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, - 845, 846, 847, 848, 849, 850, 851, 852, 830, 853, - 854, 829, 855, 856, 857, 860, 861, 862, 863, 858, - 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 876, 877, 878, 879, 880, 881, 882, 883, 884, + 45, 45, 45, 45, 45, 45, 679, 740, 742, 743, + 759, 673, 680, 747, 741, 809, 744, 800, 810, 748, + 811, 801, 812, 45, 45, 45, 45, 45, 45, 813, + 814, 815, 816, 817, 818, 819, 820, 821, 759, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 837, 860, 861, + 836, 862, 863, 864, 867, 868, 869, 870, 865, 871, + 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, - 885, 875, 886, 887, 888, 889, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, - 905, 904, 906, 907, 908, 909, 910, 911, 912, 913, - 859, 914, 915, 916, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 903, 904, 930, - 932, 933, 934, 935, 931, 936, 937, 938, 939, 940, - 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, - 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, + 882, 884, 885, 886, 887, 888, 889, 890, 891, 892, + 893, 883, 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, + 913, 912, 914, 915, 916, 917, 918, 919, 920, 866, + 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 936, 937, 911, 912, 938, + 940, 941, 942, 943, 939, 944, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 971, 994, 995, 996, 997, 998, 972, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1036, 1037, 1038, 1039, 1040, - 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, - 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1059, 1030, 1060, - 1061, 1062, 1063, 1064, 1058, 1065, 1066, 1016, 1067, 1068, - 1069, 1070, 1071, 1072, 1073, 1074, 1035, 1075, 1076, 1077, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 980, 1003, 1004, 1005, 1006, 1007, + 981, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, + 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, + 1040, 1070, 1071, 1072, 1073, 1074, 1075, 1069, 1076, 1026, - 1078, 1080, 1081, 1082, 1083, 1079, 1084, 1085, 1086, 1087, - 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, - 1098, 1099, 1100, 1101, 1102, 1081, 1103, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1119, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, - 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, + 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1045, 1085, + 1086, 1087, 1088, 1089, 1091, 1092, 1093, 1094, 1090, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, + 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1092, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1131, 1158, 1159, 1160, 1161, 1162, 1163, + 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, - 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1157, - 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, - 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, - 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, - 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, - 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, - 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, - 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, - 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, - 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, + 1194, 1195, 1196, 1169, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, + 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, - 12, 12, 12, 12, 12, 36, 36, 36, 36, 36, - 80, 284, 80, 80, 80, 99, 384, 99, 487, 99, - 101, 101, 101, 101, 101, 116, 116, 116, 116, 116, - 175, 101, 175, 175, 175, 197, 197, 197, 797, 796, - 795, 792, 791, 790, 789, 788, 787, 786, 785, 784, - 783, 782, 781, 780, 779, 778, 777, 776, 775, 774, - 773, 772, 771, 770, 769, 768, 767, 766, 765, 764, - 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, - 752, 751, 750, 749, 748, 747, 746, 745, 744, 743, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, + 1293, 1294, 1295, 1296, 12, 12, 12, 12, 12, 36, + 36, 36, 36, 36, 80, 286, 80, 80, 80, 99, + 387, 99, 491, 99, 101, 101, 101, 101, 101, 116, + 116, 116, 116, 116, 176, 101, 176, 176, 176, 198, + 198, 198, 795, 794, 793, 792, 791, 790, 789, 788, + 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, + 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, + 767, 766, 765, 764, 763, 762, 761, 760, 758, 757, - 740, 739, 733, 732, 731, 730, 729, 728, 727, 726, - 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, - 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, - 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, - 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, - 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, - 673, 672, 667, 666, 665, 664, 663, 662, 661, 660, - 659, 656, 655, 654, 653, 652, 651, 650, 649, 648, - 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, - 637, 636, 633, 632, 631, 630, 629, 628, 627, 626, + 756, 755, 754, 753, 752, 751, 750, 749, 746, 745, + 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, + 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, + 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, + 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, + 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, + 689, 688, 687, 686, 685, 684, 683, 682, 681, 678, + 677, 672, 671, 670, 669, 668, 667, 666, 665, 664, + 663, 662, 661, 660, 659, 658, 657, 656, 655, 654, + 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, - 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, - 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, - 595, 594, 593, 592, 591, 590, 589, 585, 584, 583, - 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, - 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, - 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, - 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, - 532, 531, 530, 529, 528, 527, 526, 525, 524, 523, + 643, 642, 639, 638, 637, 636, 635, 634, 633, 632, + 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, + 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, + 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, + 601, 600, 599, 598, 597, 596, 595, 594, 590, 589, + 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, + 578, 577, 576, 575, 574, 573, 572, 571, 570, 569, + 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, + 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, + 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, - 522, 519, 518, 517, 516, 515, 514, 513, 510, 509, - 508, 507, 506, 505, 504, 503, 502, 501, 497, 496, - 495, 494, 493, 492, 491, 489, 488, 486, 485, 482, - 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, - 471, 470, 469, 468, 467, 466, 465, 464, 463, 462, - 461, 460, 459, 458, 455, 454, 453, 452, 451, 450, - 449, 448, 447, 444, 443, 442, 441, 440, 437, 436, - 435, 434, 433, 432, 431, 430, 429, 424, 423, 422, - 421, 420, 419, 418, 417, 416, 415, 414, 411, 410, - 409, 408, 405, 404, 403, 402, 401, 400, 397, 396, + 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, + 528, 527, 526, 523, 522, 521, 520, 519, 518, 517, + 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, + 501, 500, 499, 498, 497, 496, 495, 493, 492, 490, + 489, 486, 485, 484, 483, 482, 481, 480, 479, 478, + 477, 476, 475, 474, 473, 472, 471, 470, 469, 468, + 467, 466, 465, 464, 463, 462, 459, 458, 457, 456, + 455, 454, 453, 452, 451, 448, 447, 446, 445, 444, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, + 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, - 394, 393, 388, 383, 380, 377, 376, 375, 374, 373, - 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, - 362, 359, 358, 357, 356, 355, 354, 353, 352, 351, - 350, 349, 348, 347, 343, 342, 341, 340, 339, 338, - 337, 333, 332, 331, 330, 329, 328, 327, 326, 325, - 324, 323, 322, 321, 320, 319, 318, 317, 316, 315, - 314, 313, 312, 311, 310, 309, 308, 307, 304, 303, - 302, 301, 300, 298, 198, 295, 293, 291, 288, 287, - 285, 283, 276, 275, 274, 272, 271, 270, 269, 268, - 267, 263, 252, 248, 245, 244, 243, 242, 240, 239, + 417, 414, 413, 412, 411, 408, 407, 406, 405, 404, + 403, 400, 399, 397, 396, 391, 386, 383, 380, 379, + 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, + 368, 367, 366, 365, 362, 361, 360, 359, 358, 357, + 356, 355, 354, 353, 352, 351, 350, 346, 345, 344, + 343, 342, 341, 340, 336, 335, 334, 333, 332, 331, + 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, + 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, + 310, 309, 306, 305, 304, 303, 302, 300, 199, 297, + 295, 293, 290, 289, 287, 285, 278, 277, 276, 274, - 238, 237, 234, 233, 232, 231, 230, 229, 228, 227, - 226, 222, 219, 216, 215, 214, 213, 210, 209, 208, - 205, 204, 203, 202, 198, 191, 188, 187, 185, 183, - 182, 174, 160, 142, 136, 121, 110, 107, 106, 104, - 43, 100, 98, 97, 88, 43, 1285, 11, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, + 273, 272, 271, 270, 269, 265, 254, 250, 247, 246, + 245, 244, 242, 241, 240, 239, 236, 235, 234, 233, + 232, 231, 230, 229, 228, 227, 223, 220, 217, 216, + 215, 214, 211, 210, 209, 206, 205, 204, 203, 199, + 192, 189, 188, 186, 184, 183, 175, 161, 136, 121, + 110, 107, 106, 104, 43, 100, 98, 97, 88, 43, + 1297, 11, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285 + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297 } ; -static const flex_int16_t yy_chk[1720] = +static const flex_int16_t yy_chk[1734] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 574, - 3, 3, 3, 21, 1, 1, 3, 718, 574, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 0, + 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, - 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, - 8, 8, 1, 8, 57, 27, 28, 719, 26, 1, + 6, 6, 6, 7, 7, 7, 1, 7, 68, 8, + 8, 8, 1, 8, 57, 27, 28, 68, 26, 1, 1, 2, 2, 2, 32, 2, 2, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 52, 5, 31, 2, 2, 10, 10, 10, 2, @@ -1392,7 +1398,7 @@ static const flex_int16_t yy_chk[1720] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 124, 75, 25, 66, 25, 75, 2, 25, 25, 25, - 124, 66, 2, 128, 128, 20, 51, 720, 54, 2, + 124, 66, 2, 128, 128, 20, 51, 714, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1403,170 +1409,172 @@ static const flex_int16_t yy_chk[1720] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 48, 17, 17, 17, 19, 56, 19, 19, 19, 44, 59, 22, 17, 22, 22, 22, 64, - 19, 93, 61, 55, 67, 61, 286, 22, 61, 48, + 19, 93, 61, 55, 67, 61, 288, 22, 61, 48, 61, 56, 61, 55, 67, 96, 67, 63, 17, 59, 73, 91, 64, 19, 73, 59, 55, 44, 63, 93, - 22, 45, 70, 64, 73, 286, 70, 45, 63, 45, + 22, 45, 70, 64, 73, 288, 70, 45, 63, 45, 45, 55, 45, 96, 45, 45, 45, 91, 58, 69, - 69, 45, 45, 69, 45, 58, 70, 722, 101, 69, + 69, 45, 45, 69, 45, 58, 70, 717, 101, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, 89, 58, 62, 78, - 71, 58, 62, 101, 77, 62, 62, 92, 258, 58, - 72, 258, 105, 58, 77, 58, 58, 94, 62, 71, + 71, 58, 62, 101, 77, 62, 62, 92, 260, 58, + 72, 260, 105, 58, 77, 58, 58, 94, 62, 71, 72, 71, 78, 71, 76, 72, 72, 77, 76, 77, 95, 76, 78, 92, 81, 81, 81, 78, 76, 76, - 105, 108, 77, 94, 76, 81, 157, 157, 82, 77, + 105, 108, 77, 94, 76, 81, 158, 158, 82, 77, 82, 82, 82, 83, 109, 83, 95, 111, 83, 83, 83, 82, 84, 112, 84, 84, 84, 108, 81, 85, 85, 85, 90, 90, 90, 84, 103, 113, 115, 114, - 85, 109, 119, 103, 82, 111, 133, 171, 133, 137, - 112, 135, 137, 147, 152, 161, 137, 147, 84, 119, - 164, 115, 161, 85, 164, 113, 114, 135, 164, 159, - 119, 103, 159, 159, 171, 103, 178, 181, 186, 103, - 176, 306, 152, 177, 152, 179, 180, 103, 162, 189, - 723, 103, 190, 103, 103, 118, 118, 118, 306, 178, - 181, 186, 118, 118, 118, 118, 118, 118, 176, 177, - 192, 196, 180, 179, 194, 236, 724, 189, 207, 190, - 201, 162, 162, 162, 207, 118, 118, 118, 118, 118, - 118, 244, 162, 192, 162, 275, 162, 194, 196, 162, + 85, 109, 119, 103, 82, 111, 133, 172, 133, 137, + 112, 135, 137, 148, 153, 162, 137, 148, 84, 119, + 165, 115, 162, 85, 165, 113, 114, 135, 165, 160, + 119, 103, 160, 160, 172, 103, 179, 182, 187, 103, + 177, 308, 153, 178, 153, 180, 181, 103, 163, 190, + 718, 103, 191, 103, 103, 118, 118, 118, 308, 179, + 182, 187, 118, 118, 118, 118, 118, 118, 177, 178, + 193, 197, 181, 180, 195, 238, 719, 190, 208, 191, + 202, 163, 163, 163, 208, 118, 118, 118, 118, 118, + 118, 246, 163, 193, 163, 277, 163, 195, 197, 163, - 199, 199, 199, 201, 277, 280, 285, 199, 199, 199, - 199, 199, 199, 288, 288, 289, 285, 351, 292, 312, - 725, 299, 288, 312, 387, 244, 236, 277, 280, 236, - 199, 199, 199, 199, 199, 199, 324, 549, 289, 244, - 399, 324, 334, 334, 499, 275, 292, 297, 297, 297, - 299, 340, 387, 587, 297, 297, 297, 297, 297, 297, - 379, 340, 397, 498, 397, 379, 421, 726, 399, 412, - 500, 421, 499, 351, 549, 500, 587, 297, 297, 297, - 297, 297, 297, 586, 412, 727, 588, 324, 728, 397, - 498, 397, 324, 398, 398, 398, 588, 729, 730, 731, + 200, 200, 200, 202, 279, 282, 287, 200, 200, 200, + 200, 200, 200, 290, 290, 291, 287, 354, 294, 314, + 721, 301, 290, 314, 390, 246, 238, 279, 282, 238, + 200, 200, 200, 200, 200, 200, 326, 554, 291, 246, + 402, 326, 337, 337, 503, 277, 294, 299, 299, 299, + 301, 343, 390, 592, 299, 299, 299, 299, 299, 299, + 382, 343, 400, 502, 400, 382, 424, 722, 402, 415, + 504, 424, 503, 354, 554, 504, 592, 299, 299, 299, + 299, 299, 299, 591, 415, 723, 593, 326, 724, 400, + 502, 400, 326, 401, 401, 401, 593, 725, 726, 728, - 398, 398, 398, 398, 398, 398, 591, 652, 653, 653, - 669, 586, 591, 656, 652, 732, 653, 714, 733, 656, - 734, 714, 735, 398, 398, 398, 398, 398, 398, 736, - 737, 738, 739, 740, 741, 742, 744, 745, 669, 746, - 747, 748, 749, 750, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, - 768, 770, 771, 772, 773, 774, 775, 776, 753, 777, - 778, 752, 780, 781, 782, 783, 785, 786, 787, 782, - 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, - 798, 799, 801, 802, 803, 804, 806, 807, 808, 809, + 401, 401, 401, 401, 401, 401, 596, 658, 659, 659, + 674, 591, 596, 662, 658, 729, 659, 720, 730, 662, + 731, 720, 732, 401, 401, 401, 401, 401, 401, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 674, 742, + 743, 744, 745, 746, 747, 748, 750, 751, 752, 753, + 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 776, 777, 778, 779, 780, 781, 782, 759, 783, 784, + 758, 786, 787, 788, 789, 791, 792, 793, 788, 794, + 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, - 810, 798, 811, 812, 813, 814, 815, 816, 817, 819, - 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, - 831, 830, 832, 833, 834, 835, 837, 838, 839, 840, - 782, 841, 842, 844, 845, 846, 847, 848, 849, 850, - 851, 852, 853, 854, 855, 856, 858, 829, 830, 859, - 860, 861, 862, 863, 859, 864, 865, 866, 867, 868, - 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, - 879, 881, 882, 883, 884, 885, 886, 887, 889, 890, - 892, 893, 894, 895, 896, 897, 898, 899, 900, 902, - 903, 904, 905, 906, 907, 909, 910, 911, 912, 915, + 805, 806, 808, 809, 810, 811, 813, 814, 815, 816, + 817, 805, 818, 819, 820, 821, 822, 823, 824, 826, + 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, + 838, 837, 839, 840, 841, 842, 844, 845, 846, 788, + 847, 848, 849, 851, 852, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 865, 836, 837, 866, + 867, 868, 869, 870, 866, 871, 872, 873, 874, 875, + 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, + 886, 887, 889, 890, 891, 892, 893, 894, 895, 897, + 898, 900, 901, 902, 903, 904, 905, 906, 907, 908, - 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, - 926, 927, 929, 903, 931, 933, 934, 935, 936, 904, - 937, 939, 940, 941, 943, 944, 945, 946, 947, 950, - 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 986, 987, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 971, 1004, - 1005, 1006, 1007, 1008, 999, 1009, 1010, 957, 1011, 1012, - 1014, 1015, 1016, 1017, 1019, 1021, 976, 1024, 1026, 1027, + 910, 911, 912, 913, 914, 915, 917, 918, 919, 920, + 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, + 933, 934, 935, 937, 911, 939, 941, 942, 943, 944, + 912, 945, 946, 948, 949, 950, 952, 953, 954, 955, + 956, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 980, 1010, 1014, 1015, 1016, 1017, 1018, 1009, 1019, 966, - 1028, 1029, 1030, 1032, 1033, 1028, 1035, 1036, 1037, 1038, - 1039, 1040, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1052, 1053, 1055, 1056, 1030, 1057, 1058, 1060, 1061, - 1062, 1063, 1064, 1067, 1069, 1070, 1072, 1073, 1074, 1075, - 1077, 1079, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, - 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, - 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1081, - 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 1120, 1123, 1126, 1127, 1130, 1131, 1132, 1133, - 1134, 1135, 1137, 1139, 1141, 1142, 1143, 1145, 1146, 1147, + 1020, 1021, 1022, 1024, 1025, 1026, 1027, 1029, 985, 1031, + 1034, 1036, 1037, 1038, 1039, 1040, 1042, 1043, 1038, 1045, + 1046, 1047, 1048, 1049, 1050, 1052, 1053, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1062, 1063, 1064, 1066, 1040, 1067, + 1068, 1069, 1071, 1072, 1073, 1074, 1075, 1078, 1080, 1081, + 1083, 1084, 1085, 1086, 1088, 1090, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, + 1106, 1107, 1108, 1109, 1110, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1092, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1135, 1138, 1139, - 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1156, 1157, 1119, - 1158, 1160, 1161, 1162, 1163, 1164, 1165, 1167, 1168, 1170, - 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1182, 1185, - 1186, 1188, 1189, 1191, 1192, 1193, 1194, 1196, 1197, 1198, - 1199, 1200, 1201, 1203, 1204, 1205, 1206, 1207, 1208, 1209, - 1211, 1212, 1213, 1214, 1216, 1217, 1218, 1219, 1220, 1221, - 1222, 1223, 1224, 1227, 1229, 1230, 1231, 1233, 1234, 1235, - 1237, 1238, 1239, 1241, 1242, 1243, 1244, 1245, 1246, 1247, - 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, - 1258, 1259, 1261, 1262, 1263, 1264, 1265, 1266, 1270, 1271, + 1142, 1143, 1144, 1145, 1146, 1147, 1149, 1151, 1153, 1154, + 1155, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1168, 1169, 1131, 1170, 1172, 1173, 1174, 1175, 1176, + 1177, 1179, 1180, 1182, 1183, 1184, 1185, 1186, 1187, 1188, + 1189, 1190, 1194, 1197, 1198, 1200, 1201, 1203, 1204, 1205, + 1206, 1208, 1209, 1210, 1211, 1212, 1213, 1215, 1216, 1217, + 1218, 1219, 1220, 1221, 1223, 1224, 1225, 1226, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1239, 1241, 1242, + 1243, 1245, 1246, 1247, 1249, 1250, 1251, 1253, 1254, 1255, + 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, - 1272, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1282, 1283, - 1286, 1286, 1286, 1286, 1286, 1287, 1287, 1287, 1287, 1287, - 1288, 1294, 1288, 1288, 1288, 1289, 1295, 1289, 1296, 1289, - 1290, 1290, 1290, 1290, 1290, 1291, 1291, 1291, 1291, 1291, - 1292, 1297, 1292, 1292, 1292, 1293, 1293, 1293, 717, 716, - 715, 713, 712, 711, 708, 707, 706, 703, 702, 701, - 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, - 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, - 679, 678, 677, 676, 675, 674, 673, 672, 671, 670, - 668, 666, 665, 664, 663, 662, 661, 660, 659, 658, + 1266, 1267, 1268, 1269, 1270, 1271, 1273, 1274, 1275, 1276, + 1277, 1278, 1282, 1283, 1284, 1286, 1287, 1288, 1289, 1290, + 1291, 1292, 1294, 1295, 1298, 1298, 1298, 1298, 1298, 1299, + 1299, 1299, 1299, 1299, 1300, 1306, 1300, 1300, 1300, 1301, + 1307, 1301, 1308, 1301, 1302, 1302, 1302, 1302, 1302, 1303, + 1303, 1303, 1303, 1303, 1304, 1309, 1304, 1304, 1304, 1305, + 1305, 1305, 713, 712, 709, 708, 707, 706, 705, 704, + 703, 702, 701, 700, 699, 698, 697, 696, 694, 693, + 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, + 682, 681, 680, 679, 678, 677, 676, 675, 673, 671, - 655, 654, 651, 650, 649, 648, 647, 646, 645, 644, - 643, 642, 641, 640, 639, 638, 637, 636, 635, 633, - 632, 631, 630, 629, 628, 627, 625, 624, 623, 622, - 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, - 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, - 601, 600, 599, 598, 597, 596, 595, 594, 593, 592, - 590, 589, 585, 584, 583, 581, 580, 578, 577, 576, - 575, 572, 571, 570, 569, 568, 567, 566, 565, 564, - 562, 561, 560, 559, 558, 557, 556, 555, 553, 552, - 551, 550, 548, 547, 546, 545, 544, 543, 541, 540, + 670, 669, 668, 667, 666, 665, 664, 663, 661, 660, + 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, + 647, 646, 645, 644, 643, 642, 641, 639, 638, 637, + 636, 635, 634, 633, 631, 630, 629, 628, 627, 626, + 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, + 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, + 605, 604, 603, 602, 601, 600, 599, 598, 597, 595, + 594, 590, 589, 588, 586, 585, 583, 582, 581, 580, + 579, 577, 576, 575, 574, 573, 572, 571, 570, 569, + 567, 566, 565, 564, 563, 562, 561, 560, 558, 557, - 539, 538, 537, 536, 535, 534, 533, 532, 531, 530, - 529, 528, 527, 526, 525, 524, 523, 522, 521, 519, - 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, - 508, 507, 506, 505, 504, 503, 502, 496, 494, 491, - 490, 489, 488, 486, 485, 484, 482, 481, 478, 477, - 476, 475, 474, 473, 472, 471, 470, 469, 468, 467, - 466, 465, 464, 463, 462, 461, 460, 459, 457, 455, - 454, 453, 452, 451, 450, 449, 448, 447, 446, 445, - 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, - 433, 432, 431, 430, 429, 428, 427, 426, 424, 423, + 556, 555, 553, 552, 551, 550, 549, 548, 546, 545, + 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, + 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, + 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, + 513, 512, 511, 510, 509, 508, 507, 506, 500, 498, + 495, 494, 493, 492, 490, 489, 488, 486, 485, 482, + 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, + 471, 470, 469, 468, 467, 466, 465, 464, 463, 461, + 459, 458, 457, 456, 455, 454, 453, 452, 451, 450, + 449, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 422, 420, 419, 418, 417, 416, 414, 413, 411, 410, - 408, 407, 406, 405, 403, 402, 401, 400, 395, 394, - 392, 391, 390, 389, 388, 386, 385, 383, 380, 378, - 377, 375, 374, 373, 372, 371, 370, 369, 368, 367, - 366, 365, 364, 363, 362, 361, 360, 359, 358, 357, - 355, 354, 353, 352, 350, 349, 348, 347, 346, 345, - 344, 343, 341, 339, 338, 337, 336, 335, 333, 332, - 331, 330, 329, 328, 327, 326, 325, 323, 322, 321, - 320, 319, 318, 317, 316, 315, 314, 313, 311, 310, - 309, 308, 305, 304, 303, 302, 301, 300, 296, 294, + 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, + 427, 426, 425, 423, 422, 421, 420, 419, 417, 416, + 414, 413, 411, 410, 409, 408, 406, 405, 404, 403, + 398, 397, 395, 394, 393, 392, 391, 389, 388, 386, + 383, 381, 380, 378, 377, 376, 375, 374, 373, 372, + 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, + 361, 360, 358, 357, 356, 355, 353, 352, 351, 350, + 349, 348, 347, 346, 344, 342, 341, 340, 339, 338, + 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, + 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, - 291, 290, 287, 283, 276, 274, 273, 272, 271, 270, - 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, - 259, 257, 256, 255, 254, 253, 252, 251, 250, 249, - 248, 247, 246, 245, 243, 242, 241, 240, 239, 238, - 237, 235, 234, 233, 232, 231, 230, 229, 228, 226, - 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, - 215, 214, 213, 212, 211, 210, 209, 208, 206, 205, - 204, 203, 202, 200, 197, 195, 193, 191, 188, 187, - 185, 182, 174, 173, 172, 170, 169, 168, 167, 166, - 165, 163, 160, 158, 156, 155, 154, 153, 151, 150, + 315, 313, 312, 311, 310, 307, 306, 305, 304, 303, + 302, 298, 296, 293, 292, 289, 285, 278, 276, 275, + 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, + 264, 263, 262, 261, 259, 258, 257, 256, 255, 254, + 253, 252, 251, 250, 249, 248, 247, 245, 244, 243, + 242, 241, 240, 239, 237, 236, 235, 234, 233, 232, + 231, 230, 229, 227, 226, 225, 224, 223, 222, 221, + 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, + 210, 209, 207, 206, 205, 204, 203, 201, 198, 196, + 194, 192, 189, 188, 186, 183, 175, 174, 173, 171, - 149, 148, 146, 145, 144, 143, 142, 141, 140, 139, - 138, 136, 134, 132, 131, 130, 129, 127, 126, 125, - 123, 122, 121, 120, 116, 110, 107, 106, 104, 99, - 98, 79, 74, 68, 65, 60, 53, 50, 49, 47, - 43, 41, 39, 38, 24, 14, 11, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, + 170, 169, 168, 167, 166, 164, 161, 159, 157, 156, + 155, 154, 152, 151, 150, 149, 147, 146, 145, 144, + 143, 142, 141, 140, 139, 138, 136, 134, 132, 131, + 130, 129, 127, 126, 125, 123, 122, 121, 120, 116, + 110, 107, 106, 104, 99, 98, 79, 74, 65, 60, + 53, 50, 49, 47, 43, 41, 39, 38, 24, 14, + 11, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285 + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 1297, 1297, 1297 } ; static yy_state_type yy_last_accepting_state; @@ -1582,18 +1590,18 @@ static const flex_int16_t yy_rule_linenum[158] = 269, 278, 287, 296, 305, 316, 325, 334, 343, 352, 362, 372, 382, 392, 402, 412, 422, 432, 442, 453, 464, 475, 484, 494, 503, 513, 528, 544, 553, 562, - 571, 580, 590, 599, 609, 618, 627, 636, 646, 655, - 664, 673, 682, 692, 701, 710, 719, 728, 737, 746, - 755, 764, 773, 782, 792, 804, 814, 823, 833, 843, - 853, 863, 873, 882, 892, 901, 910, 919, 928, 938, - 948, 958, 967, 976, 985, 994, 1003, 1012, 1021, 1030, + 571, 580, 590, 624, 634, 643, 652, 661, 671, 680, + 689, 698, 707, 717, 726, 735, 744, 753, 762, 771, + 780, 789, 798, 807, 817, 829, 839, 848, 858, 868, + 878, 888, 898, 907, 917, 926, 935, 944, 953, 963, + 973, 983, 992, 1001, 1010, 1019, 1028, 1037, 1046, 1055, - 1039, 1048, 1057, 1066, 1075, 1084, 1093, 1102, 1111, 1120, - 1129, 1138, 1147, 1156, 1165, 1174, 1183, 1192, 1201, 1210, - 1220, 1230, 1240, 1250, 1260, 1270, 1280, 1290, 1300, 1309, - 1318, 1327, 1336, 1345, 1354, 1363, 1374, 1387, 1400, 1415, - 1513, 1518, 1523, 1528, 1529, 1530, 1531, 1532, 1533, 1535, - 1553, 1566, 1571, 1575, 1577, 1579, 1581 + 1064, 1073, 1082, 1091, 1100, 1109, 1118, 1127, 1136, 1145, + 1154, 1163, 1172, 1181, 1190, 1199, 1208, 1217, 1226, 1235, + 1245, 1255, 1265, 1275, 1285, 1295, 1305, 1315, 1325, 1334, + 1343, 1352, 1361, 1370, 1379, 1388, 1399, 1412, 1425, 1440, + 1538, 1543, 1548, 1553, 1554, 1555, 1556, 1557, 1558, 1560, + 1578, 1591, 1596, 1600, 1602, 1604, 1606 } ; /* The intent behind this definition is that it'll catch @@ -1646,7 +1654,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg) -#line 1649 "dhcp4_lexer.cc" +#line 1657 "dhcp4_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1672,8 +1680,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1675 "dhcp4_lexer.cc" -#line 1676 "dhcp4_lexer.cc" +#line 1683 "dhcp4_lexer.cc" +#line 1684 "dhcp4_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -1999,7 +2007,7 @@ YY_DECL } -#line 2002 "dhcp4_lexer.cc" +#line 2010 "dhcp4_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2028,13 +2036,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1286 ) + if ( yy_current_state >= 1298 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1285 ); + while ( yy_current_state != 1297 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2693,6 +2701,31 @@ case 53: YY_RULE_SETUP #line 590 "dhcp4_lexer.ll" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::POOLS: + return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); +} + +\"only\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::KNOWN_CLIENTS: + return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); +} + +\"never\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::KNOWN_CLIENTS: + case isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME: + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("never", driver.loc_); +} + +\"subnet\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: return isc::dhcp::Dhcp4Parser::make_SUBNET(driver.loc_); @@ -2703,7 +2736,7 @@ YY_RULE_SETUP YY_BREAK case 54: YY_RULE_SETUP -#line 599 "dhcp4_lexer.ll" +#line 624 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2716,7 +2749,7 @@ YY_RULE_SETUP YY_BREAK case 55: YY_RULE_SETUP -#line 609 "dhcp4_lexer.ll" +#line 634 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2728,7 +2761,7 @@ YY_RULE_SETUP YY_BREAK case 56: YY_RULE_SETUP -#line 618 "dhcp4_lexer.ll" +#line 643 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2740,7 +2773,7 @@ YY_RULE_SETUP YY_BREAK case 57: YY_RULE_SETUP -#line 627 "dhcp4_lexer.ll" +#line 652 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2752,7 +2785,7 @@ YY_RULE_SETUP YY_BREAK case 58: YY_RULE_SETUP -#line 636 "dhcp4_lexer.ll" +#line 661 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2765,7 +2798,7 @@ YY_RULE_SETUP YY_BREAK case 59: YY_RULE_SETUP -#line 646 "dhcp4_lexer.ll" +#line 671 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2777,7 +2810,7 @@ YY_RULE_SETUP YY_BREAK case 60: YY_RULE_SETUP -#line 655 "dhcp4_lexer.ll" +#line 680 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2789,7 +2822,7 @@ YY_RULE_SETUP YY_BREAK case 61: YY_RULE_SETUP -#line 664 "dhcp4_lexer.ll" +#line 689 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2801,7 +2834,7 @@ YY_RULE_SETUP YY_BREAK case 62: YY_RULE_SETUP -#line 673 "dhcp4_lexer.ll" +#line 698 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2813,7 +2846,7 @@ YY_RULE_SETUP YY_BREAK case 63: YY_RULE_SETUP -#line 682 "dhcp4_lexer.ll" +#line 707 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -2826,7 +2859,7 @@ YY_RULE_SETUP YY_BREAK case 64: YY_RULE_SETUP -#line 692 "dhcp4_lexer.ll" +#line 717 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2838,7 +2871,7 @@ YY_RULE_SETUP YY_BREAK case 65: YY_RULE_SETUP -#line 701 "dhcp4_lexer.ll" +#line 726 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -2850,7 +2883,7 @@ YY_RULE_SETUP YY_BREAK case 66: YY_RULE_SETUP -#line 710 "dhcp4_lexer.ll" +#line 735 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGING: @@ -2862,7 +2895,7 @@ YY_RULE_SETUP YY_BREAK case 67: YY_RULE_SETUP -#line 719 "dhcp4_lexer.ll" +#line 744 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2874,7 +2907,7 @@ YY_RULE_SETUP YY_BREAK case 68: YY_RULE_SETUP -#line 728 "dhcp4_lexer.ll" +#line 753 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2886,7 +2919,7 @@ YY_RULE_SETUP YY_BREAK case 69: YY_RULE_SETUP -#line 737 "dhcp4_lexer.ll" +#line 762 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2898,7 +2931,7 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 746 "dhcp4_lexer.ll" +#line 771 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2910,7 +2943,7 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 755 "dhcp4_lexer.ll" +#line 780 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2922,7 +2955,7 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 764 "dhcp4_lexer.ll" +#line 789 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2934,7 +2967,7 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 773 "dhcp4_lexer.ll" +#line 798 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2946,7 +2979,7 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 782 "dhcp4_lexer.ll" +#line 807 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2959,7 +2992,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 792 "dhcp4_lexer.ll" +#line 817 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2974,7 +3007,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 804 "dhcp4_lexer.ll" +#line 829 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -2987,7 +3020,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 814 "dhcp4_lexer.ll" +#line 839 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2999,7 +3032,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 823 "dhcp4_lexer.ll" +#line 848 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3012,7 +3045,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 833 "dhcp4_lexer.ll" +#line 858 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3025,7 +3058,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 843 "dhcp4_lexer.ll" +#line 868 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3038,7 +3071,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 853 "dhcp4_lexer.ll" +#line 878 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3051,7 +3084,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 863 "dhcp4_lexer.ll" +#line 888 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3064,7 +3097,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 873 "dhcp4_lexer.ll" +#line 898 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3076,7 +3109,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 882 "dhcp4_lexer.ll" +#line 907 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3089,7 +3122,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 892 "dhcp4_lexer.ll" +#line 917 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3101,7 +3134,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 901 "dhcp4_lexer.ll" +#line 926 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3113,7 +3146,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 910 "dhcp4_lexer.ll" +#line 935 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3125,7 +3158,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 919 "dhcp4_lexer.ll" +#line 944 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3137,7 +3170,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 928 "dhcp4_lexer.ll" +#line 953 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3150,7 +3183,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 938 "dhcp4_lexer.ll" +#line 963 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3163,7 +3196,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 948 "dhcp4_lexer.ll" +#line 973 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3175,7 +3208,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 958 "dhcp4_lexer.ll" +#line 983 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3187,7 +3220,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 967 "dhcp4_lexer.ll" +#line 992 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3199,7 +3232,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 976 "dhcp4_lexer.ll" +#line 1001 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3211,7 +3244,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 985 "dhcp4_lexer.ll" +#line 1010 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3223,7 +3256,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 994 "dhcp4_lexer.ll" +#line 1019 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3235,7 +3268,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1003 "dhcp4_lexer.ll" +#line 1028 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3247,7 +3280,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1012 "dhcp4_lexer.ll" +#line 1037 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3259,7 +3292,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1021 "dhcp4_lexer.ll" +#line 1046 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3271,7 +3304,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1030 "dhcp4_lexer.ll" +#line 1055 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3283,7 +3316,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1039 "dhcp4_lexer.ll" +#line 1064 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3295,7 +3328,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1048 "dhcp4_lexer.ll" +#line 1073 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3307,7 +3340,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1057 "dhcp4_lexer.ll" +#line 1082 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3319,7 +3352,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1066 "dhcp4_lexer.ll" +#line 1091 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3331,7 +3364,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1075 "dhcp4_lexer.ll" +#line 1100 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3343,7 +3376,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1084 "dhcp4_lexer.ll" +#line 1109 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3355,7 +3388,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1093 "dhcp4_lexer.ll" +#line 1118 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3367,7 +3400,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1102 "dhcp4_lexer.ll" +#line 1127 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3379,7 +3412,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1111 "dhcp4_lexer.ll" +#line 1136 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3391,7 +3424,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1120 "dhcp4_lexer.ll" +#line 1145 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3403,7 +3436,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1129 "dhcp4_lexer.ll" +#line 1154 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3415,7 +3448,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1138 "dhcp4_lexer.ll" +#line 1163 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3427,7 +3460,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1147 "dhcp4_lexer.ll" +#line 1172 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3439,7 +3472,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1156 "dhcp4_lexer.ll" +#line 1181 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3451,7 +3484,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1165 "dhcp4_lexer.ll" +#line 1190 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3463,7 +3496,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1174 "dhcp4_lexer.ll" +#line 1199 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3475,7 +3508,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1183 "dhcp4_lexer.ll" +#line 1208 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3487,7 +3520,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1192 "dhcp4_lexer.ll" +#line 1217 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3499,7 +3532,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1201 "dhcp4_lexer.ll" +#line 1226 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3511,7 +3544,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1210 "dhcp4_lexer.ll" +#line 1235 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3524,7 +3557,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1220 "dhcp4_lexer.ll" +#line 1245 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3537,7 +3570,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1230 "dhcp4_lexer.ll" +#line 1255 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3550,7 +3583,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1240 "dhcp4_lexer.ll" +#line 1265 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3563,7 +3596,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1250 "dhcp4_lexer.ll" +#line 1275 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3576,7 +3609,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1260 "dhcp4_lexer.ll" +#line 1285 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3589,7 +3622,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1270 "dhcp4_lexer.ll" +#line 1295 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3602,7 +3635,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1280 "dhcp4_lexer.ll" +#line 1305 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3615,7 +3648,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1290 "dhcp4_lexer.ll" +#line 1315 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3628,7 +3661,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1300 "dhcp4_lexer.ll" +#line 1325 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3640,7 +3673,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1309 "dhcp4_lexer.ll" +#line 1334 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3652,7 +3685,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1318 "dhcp4_lexer.ll" +#line 1343 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3664,7 +3697,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1327 "dhcp4_lexer.ll" +#line 1352 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3676,7 +3709,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1336 "dhcp4_lexer.ll" +#line 1361 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3688,7 +3721,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1345 "dhcp4_lexer.ll" +#line 1370 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3700,7 +3733,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1354 "dhcp4_lexer.ll" +#line 1379 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3712,7 +3745,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1363 "dhcp4_lexer.ll" +#line 1388 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3726,7 +3759,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1374 "dhcp4_lexer.ll" +#line 1399 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3742,7 +3775,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1387 "dhcp4_lexer.ll" +#line 1412 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3758,7 +3791,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1400 "dhcp4_lexer.ll" +#line 1425 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3774,7 +3807,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1415 "dhcp4_lexer.ll" +#line 1440 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3876,7 +3909,7 @@ YY_RULE_SETUP case 141: /* rule 141 can match eol */ YY_RULE_SETUP -#line 1513 "dhcp4_lexer.ll" +#line 1538 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3885,7 +3918,7 @@ YY_RULE_SETUP case 142: /* rule 142 can match eol */ YY_RULE_SETUP -#line 1518 "dhcp4_lexer.ll" +#line 1543 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3893,7 +3926,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1523 "dhcp4_lexer.ll" +#line 1548 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3901,37 +3934,37 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1528 "dhcp4_lexer.ll" +#line 1553 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 145: YY_RULE_SETUP -#line 1529 "dhcp4_lexer.ll" +#line 1554 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 146: YY_RULE_SETUP -#line 1530 "dhcp4_lexer.ll" +#line 1555 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 147: YY_RULE_SETUP -#line 1531 "dhcp4_lexer.ll" +#line 1556 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1532 "dhcp4_lexer.ll" +#line 1557 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1533 "dhcp4_lexer.ll" +#line 1558 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1535 "dhcp4_lexer.ll" +#line 1560 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3952,7 +3985,7 @@ YY_RULE_SETUP YY_BREAK case 151: YY_RULE_SETUP -#line 1553 "dhcp4_lexer.ll" +#line 1578 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -3968,7 +4001,7 @@ YY_RULE_SETUP YY_BREAK case 152: YY_RULE_SETUP -#line 1566 "dhcp4_lexer.ll" +#line 1591 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -3976,33 +4009,33 @@ YY_RULE_SETUP YY_BREAK case 153: YY_RULE_SETUP -#line 1571 "dhcp4_lexer.ll" +#line 1596 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1575 "dhcp4_lexer.ll" +#line 1600 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 155: YY_RULE_SETUP -#line 1577 "dhcp4_lexer.ll" +#line 1602 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 156: YY_RULE_SETUP -#line 1579 "dhcp4_lexer.ll" +#line 1604 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 157: YY_RULE_SETUP -#line 1581 "dhcp4_lexer.ll" +#line 1606 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1583 "dhcp4_lexer.ll" +#line 1608 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4028,10 +4061,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 158: YY_RULE_SETUP -#line 1606 "dhcp4_lexer.ll" +#line 1631 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4034 "dhcp4_lexer.cc" +#line 4067 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4350,7 +4383,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1286 ) + if ( yy_current_state >= 1298 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4383,11 +4416,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1286 ) + if ( yy_current_state >= 1298 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1285); + yy_is_jam = (yy_current_state == 1297); return yy_is_jam ? 0 : yy_current_state; } @@ -5136,7 +5169,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1606 "dhcp4_lexer.ll" +#line 1631 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index a70202b350..2ba542bbe0 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -253,30 +253,31 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 149: // "boolean" + case 151: // "boolean" value.move< bool > (that.value); break; - case 148: // "floating point" + case 150: // "floating point" value.move< double > (that.value); break; - case 147: // "integer" + case 149: // "integer" value.move< int64_t > (that.value); break; - case 146: // "constant string" + case 148: // "constant string" value.move< std::string > (that.value); break; @@ -295,30 +296,31 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 149: // "boolean" + case 151: // "boolean" value.copy< bool > (that.value); break; - case 148: // "floating point" + case 150: // "floating point" value.copy< double > (that.value); break; - case 147: // "integer" + case 149: // "integer" value.copy< int64_t > (that.value); break; - case 146: // "constant string" + case 148: // "constant string" value.copy< std::string > (that.value); break; @@ -358,88 +360,95 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 146: // "constant string" + case 148: // "constant string" -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } -#line 366 "dhcp4_parser.cc" // lalr1.cc:636 +#line 368 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 147: // "integer" + case 149: // "integer" -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } -#line 373 "dhcp4_parser.cc" // lalr1.cc:636 +#line 375 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 148: // "floating point" + case 150: // "floating point" -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } -#line 380 "dhcp4_parser.cc" // lalr1.cc:636 +#line 382 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 149: // "boolean" + case 151: // "boolean" -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } -#line 387 "dhcp4_parser.cc" // lalr1.cc:636 +#line 389 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 164: // value + case 166: // value -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 394 "dhcp4_parser.cc" // lalr1.cc:636 +#line 396 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 168: // map_value + case 170: // map_value -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 401 "dhcp4_parser.cc" // lalr1.cc:636 +#line 403 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 206: // socket_type + case 208: // socket_type -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 408 "dhcp4_parser.cc" // lalr1.cc:636 +#line 410 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 209: // outbound_interface_value + case 211: // outbound_interface_value -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 415 "dhcp4_parser.cc" // lalr1.cc:636 +#line 417 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 219: // db_type + case 221: // db_type -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 422 "dhcp4_parser.cc" // lalr1.cc:636 +#line 424 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 296: // hr_mode + case 298: // hr_mode -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 429 "dhcp4_parser.cc" // lalr1.cc:636 +#line 431 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 440: // ncr_protocol_value + case 369: // known_clients_value -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 436 "dhcp4_parser.cc" // lalr1.cc:636 +#line 438 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 448: // replace_client_name_value + case 445: // ncr_protocol_value -#line 224 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 443 "dhcp4_parser.cc" // lalr1.cc:636 +#line 445 "dhcp4_parser.cc" // lalr1.cc:636 + break; + + case 453: // replace_client_name_value + +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 + { yyoutput << yysym.value.template as< ElementPtr > (); } +#line 452 "dhcp4_parser.cc" // lalr1.cc:636 break; @@ -639,30 +648,31 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 149: // "boolean" + case 151: // "boolean" yylhs.value.build< bool > (); break; - case 148: // "floating point" + case 150: // "floating point" yylhs.value.build< double > (); break; - case 147: // "integer" + case 149: // "integer" yylhs.value.build< int64_t > (); break; - case 146: // "constant string" + case 148: // "constant string" yylhs.value.build< std::string > (); break; @@ -684,268 +694,268 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 233 "dhcp4_parser.yy" // lalr1.cc:859 +#line 236 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } -#line 690 "dhcp4_parser.cc" // lalr1.cc:859 +#line 700 "dhcp4_parser.cc" // lalr1.cc:859 break; case 4: -#line 234 "dhcp4_parser.yy" // lalr1.cc:859 +#line 237 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } -#line 696 "dhcp4_parser.cc" // lalr1.cc:859 +#line 706 "dhcp4_parser.cc" // lalr1.cc:859 break; case 6: -#line 235 "dhcp4_parser.yy" // lalr1.cc:859 +#line 238 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } -#line 702 "dhcp4_parser.cc" // lalr1.cc:859 +#line 712 "dhcp4_parser.cc" // lalr1.cc:859 break; case 8: -#line 236 "dhcp4_parser.yy" // lalr1.cc:859 +#line 239 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } -#line 708 "dhcp4_parser.cc" // lalr1.cc:859 +#line 718 "dhcp4_parser.cc" // lalr1.cc:859 break; case 10: -#line 237 "dhcp4_parser.yy" // lalr1.cc:859 +#line 240 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET4; } -#line 714 "dhcp4_parser.cc" // lalr1.cc:859 +#line 724 "dhcp4_parser.cc" // lalr1.cc:859 break; case 12: -#line 238 "dhcp4_parser.yy" // lalr1.cc:859 +#line 241 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } -#line 720 "dhcp4_parser.cc" // lalr1.cc:859 +#line 730 "dhcp4_parser.cc" // lalr1.cc:859 break; case 14: -#line 239 "dhcp4_parser.yy" // lalr1.cc:859 +#line 242 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } -#line 726 "dhcp4_parser.cc" // lalr1.cc:859 +#line 736 "dhcp4_parser.cc" // lalr1.cc:859 break; case 16: -#line 240 "dhcp4_parser.yy" // lalr1.cc:859 +#line 243 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } -#line 732 "dhcp4_parser.cc" // lalr1.cc:859 +#line 742 "dhcp4_parser.cc" // lalr1.cc:859 break; case 18: -#line 241 "dhcp4_parser.yy" // lalr1.cc:859 +#line 244 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } -#line 738 "dhcp4_parser.cc" // lalr1.cc:859 +#line 748 "dhcp4_parser.cc" // lalr1.cc:859 break; case 20: -#line 242 "dhcp4_parser.yy" // lalr1.cc:859 +#line 245 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } -#line 744 "dhcp4_parser.cc" // lalr1.cc:859 +#line 754 "dhcp4_parser.cc" // lalr1.cc:859 break; case 22: -#line 243 "dhcp4_parser.yy" // lalr1.cc:859 +#line 246 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } -#line 750 "dhcp4_parser.cc" // lalr1.cc:859 +#line 760 "dhcp4_parser.cc" // lalr1.cc:859 break; case 24: -#line 244 "dhcp4_parser.yy" // lalr1.cc:859 +#line 247 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } -#line 756 "dhcp4_parser.cc" // lalr1.cc:859 +#line 766 "dhcp4_parser.cc" // lalr1.cc:859 break; case 26: -#line 252 "dhcp4_parser.yy" // lalr1.cc:859 +#line 255 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } -#line 762 "dhcp4_parser.cc" // lalr1.cc:859 +#line 772 "dhcp4_parser.cc" // lalr1.cc:859 break; case 27: -#line 253 "dhcp4_parser.yy" // lalr1.cc:859 +#line 256 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } -#line 768 "dhcp4_parser.cc" // lalr1.cc:859 +#line 778 "dhcp4_parser.cc" // lalr1.cc:859 break; case 28: -#line 254 "dhcp4_parser.yy" // lalr1.cc:859 +#line 257 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } -#line 774 "dhcp4_parser.cc" // lalr1.cc:859 +#line 784 "dhcp4_parser.cc" // lalr1.cc:859 break; case 29: -#line 255 "dhcp4_parser.yy" // lalr1.cc:859 +#line 258 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } -#line 780 "dhcp4_parser.cc" // lalr1.cc:859 +#line 790 "dhcp4_parser.cc" // lalr1.cc:859 break; case 30: -#line 256 "dhcp4_parser.yy" // lalr1.cc:859 +#line 259 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } -#line 786 "dhcp4_parser.cc" // lalr1.cc:859 +#line 796 "dhcp4_parser.cc" // lalr1.cc:859 break; case 31: -#line 257 "dhcp4_parser.yy" // lalr1.cc:859 +#line 260 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 792 "dhcp4_parser.cc" // lalr1.cc:859 +#line 802 "dhcp4_parser.cc" // lalr1.cc:859 break; case 32: -#line 258 "dhcp4_parser.yy" // lalr1.cc:859 +#line 261 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 798 "dhcp4_parser.cc" // lalr1.cc:859 +#line 808 "dhcp4_parser.cc" // lalr1.cc:859 break; case 33: -#line 261 "dhcp4_parser.yy" // lalr1.cc:859 +#line 264 "dhcp4_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); } -#line 807 "dhcp4_parser.cc" // lalr1.cc:859 +#line 817 "dhcp4_parser.cc" // lalr1.cc:859 break; case 34: -#line 266 "dhcp4_parser.yy" // lalr1.cc:859 +#line 269 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 818 "dhcp4_parser.cc" // lalr1.cc:859 +#line 828 "dhcp4_parser.cc" // lalr1.cc:859 break; case 35: -#line 271 "dhcp4_parser.yy" // lalr1.cc:859 +#line 274 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place // for it. } -#line 828 "dhcp4_parser.cc" // lalr1.cc:859 +#line 838 "dhcp4_parser.cc" // lalr1.cc:859 break; case 36: -#line 277 "dhcp4_parser.yy" // lalr1.cc:859 +#line 280 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 834 "dhcp4_parser.cc" // lalr1.cc:859 +#line 844 "dhcp4_parser.cc" // lalr1.cc:859 break; case 39: -#line 284 "dhcp4_parser.yy" // lalr1.cc:859 +#line 287 "dhcp4_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 843 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 40: -#line 288 "dhcp4_parser.yy" // lalr1.cc:859 - { - // map consisting of a shorter map followed by - // comma and string:value - ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); - } #line 853 "dhcp4_parser.cc" // lalr1.cc:859 break; + case 40: +#line 291 "dhcp4_parser.yy" // lalr1.cc:859 + { + // map consisting of a shorter map followed by + // comma and string:value + ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); + } +#line 863 "dhcp4_parser.cc" // lalr1.cc:859 + break; + case 41: -#line 295 "dhcp4_parser.yy" // lalr1.cc:859 +#line 298 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); } -#line 862 "dhcp4_parser.cc" // lalr1.cc:859 +#line 872 "dhcp4_parser.cc" // lalr1.cc:859 break; case 42: -#line 298 "dhcp4_parser.yy" // lalr1.cc:859 +#line 301 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } -#line 870 "dhcp4_parser.cc" // lalr1.cc:859 +#line 880 "dhcp4_parser.cc" // lalr1.cc:859 break; case 45: -#line 306 "dhcp4_parser.yy" // lalr1.cc:859 +#line 309 "dhcp4_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 879 "dhcp4_parser.cc" // lalr1.cc:859 +#line 889 "dhcp4_parser.cc" // lalr1.cc:859 break; case 46: -#line 310 "dhcp4_parser.yy" // lalr1.cc:859 +#line 313 "dhcp4_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 888 "dhcp4_parser.cc" // lalr1.cc:859 +#line 898 "dhcp4_parser.cc" // lalr1.cc:859 break; case 47: -#line 317 "dhcp4_parser.yy" // lalr1.cc:859 +#line 320 "dhcp4_parser.yy" // lalr1.cc:859 { // List parsing about to start } -#line 896 "dhcp4_parser.cc" // lalr1.cc:859 +#line 906 "dhcp4_parser.cc" // lalr1.cc:859 break; case 48: -#line 319 "dhcp4_parser.yy" // lalr1.cc:859 +#line 322 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); } -#line 905 "dhcp4_parser.cc" // lalr1.cc:859 +#line 915 "dhcp4_parser.cc" // lalr1.cc:859 break; case 51: -#line 328 "dhcp4_parser.yy" // lalr1.cc:859 +#line 331 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 914 "dhcp4_parser.cc" // lalr1.cc:859 +#line 924 "dhcp4_parser.cc" // lalr1.cc:859 break; case 52: -#line 332 "dhcp4_parser.yy" // lalr1.cc:859 +#line 335 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 923 "dhcp4_parser.cc" // lalr1.cc:859 +#line 933 "dhcp4_parser.cc" // lalr1.cc:859 break; case 53: -#line 343 "dhcp4_parser.yy" // lalr1.cc:859 +#line 346 "dhcp4_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); error(yystack_[1].location, "got unexpected keyword \"" + keyword + "\" in " + where + " map."); } -#line 934 "dhcp4_parser.cc" // lalr1.cc:859 +#line 944 "dhcp4_parser.cc" // lalr1.cc:859 break; case 54: -#line 353 "dhcp4_parser.yy" // lalr1.cc:859 +#line 356 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 945 "dhcp4_parser.cc" // lalr1.cc:859 +#line 955 "dhcp4_parser.cc" // lalr1.cc:859 break; case 55: -#line 358 "dhcp4_parser.yy" // lalr1.cc:859 +#line 361 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -954,11 +964,11 @@ namespace isc { namespace dhcp { // Dhcp4 is required ctx.require("Dhcp4", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 958 "dhcp4_parser.cc" // lalr1.cc:859 +#line 968 "dhcp4_parser.cc" // lalr1.cc:859 break; case 64: -#line 382 "dhcp4_parser.yy" // lalr1.cc:859 +#line 385 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -967,728 +977,728 @@ namespace isc { namespace dhcp { ctx.stack_.push_back(m); ctx.enter(ctx.DHCP4); } -#line 971 "dhcp4_parser.cc" // lalr1.cc:859 +#line 981 "dhcp4_parser.cc" // lalr1.cc:859 break; case 65: -#line 389 "dhcp4_parser.yy" // lalr1.cc:859 +#line 392 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 981 "dhcp4_parser.cc" // lalr1.cc:859 +#line 991 "dhcp4_parser.cc" // lalr1.cc:859 break; case 66: -#line 397 "dhcp4_parser.yy" // lalr1.cc:859 +#line 400 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Dhcp4 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 991 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1001 "dhcp4_parser.cc" // lalr1.cc:859 break; case 67: -#line 401 "dhcp4_parser.yy" // lalr1.cc:859 +#line 404 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed } -#line 1000 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1010 "dhcp4_parser.cc" // lalr1.cc:859 break; case 94: -#line 438 "dhcp4_parser.yy" // lalr1.cc:859 +#line 441 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); } -#line 1009 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1019 "dhcp4_parser.cc" // lalr1.cc:859 break; case 95: -#line 443 "dhcp4_parser.yy" // lalr1.cc:859 +#line 446 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); } -#line 1018 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1028 "dhcp4_parser.cc" // lalr1.cc:859 break; case 96: -#line 448 "dhcp4_parser.yy" // lalr1.cc:859 +#line 451 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); } -#line 1027 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1037 "dhcp4_parser.cc" // lalr1.cc:859 break; case 97: -#line 453 "dhcp4_parser.yy" // lalr1.cc:859 +#line 456 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); } -#line 1036 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1046 "dhcp4_parser.cc" // lalr1.cc:859 break; case 98: -#line 458 "dhcp4_parser.yy" // lalr1.cc:859 +#line 461 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("echo-client-id", echo); } -#line 1045 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1055 "dhcp4_parser.cc" // lalr1.cc:859 break; case 99: -#line 463 "dhcp4_parser.yy" // lalr1.cc:859 +#line 466 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("match-client-id", match); } -#line 1054 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1064 "dhcp4_parser.cc" // lalr1.cc:859 break; case 100: -#line 469 "dhcp4_parser.yy" // lalr1.cc:859 +#line 472 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); ctx.stack_.push_back(i); ctx.enter(ctx.INTERFACES_CONFIG); } -#line 1065 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1075 "dhcp4_parser.cc" // lalr1.cc:859 break; case 101: -#line 474 "dhcp4_parser.yy" // lalr1.cc:859 +#line 477 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1075 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1085 "dhcp4_parser.cc" // lalr1.cc:859 break; case 108: -#line 490 "dhcp4_parser.yy" // lalr1.cc:859 +#line 493 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1085 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1095 "dhcp4_parser.cc" // lalr1.cc:859 break; case 109: -#line 494 "dhcp4_parser.yy" // lalr1.cc:859 +#line 497 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed } -#line 1094 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1104 "dhcp4_parser.cc" // lalr1.cc:859 break; case 110: -#line 499 "dhcp4_parser.yy" // lalr1.cc:859 +#line 502 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1105 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1115 "dhcp4_parser.cc" // lalr1.cc:859 break; case 111: -#line 504 "dhcp4_parser.yy" // lalr1.cc:859 +#line 507 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1114 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1124 "dhcp4_parser.cc" // lalr1.cc:859 break; case 112: -#line 509 "dhcp4_parser.yy" // lalr1.cc:859 +#line 512 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DHCP_SOCKET_TYPE); } -#line 1122 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1132 "dhcp4_parser.cc" // lalr1.cc:859 break; case 113: -#line 511 "dhcp4_parser.yy" // lalr1.cc:859 +#line 514 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1131 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1141 "dhcp4_parser.cc" // lalr1.cc:859 break; case 114: -#line 516 "dhcp4_parser.yy" // lalr1.cc:859 +#line 519 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); } -#line 1137 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1147 "dhcp4_parser.cc" // lalr1.cc:859 break; case 115: -#line 517 "dhcp4_parser.yy" // lalr1.cc:859 +#line 520 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); } -#line 1143 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1153 "dhcp4_parser.cc" // lalr1.cc:859 break; case 116: -#line 520 "dhcp4_parser.yy" // lalr1.cc:859 +#line 523 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.OUTBOUND_INTERFACE); } -#line 1151 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1161 "dhcp4_parser.cc" // lalr1.cc:859 break; case 117: -#line 522 "dhcp4_parser.yy" // lalr1.cc:859 +#line 525 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1160 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1170 "dhcp4_parser.cc" // lalr1.cc:859 break; case 118: -#line 527 "dhcp4_parser.yy" // lalr1.cc:859 +#line 530 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location))); } -#line 1168 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1178 "dhcp4_parser.cc" // lalr1.cc:859 break; case 119: -#line 529 "dhcp4_parser.yy" // lalr1.cc:859 +#line 532 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location))); } -#line 1176 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1186 "dhcp4_parser.cc" // lalr1.cc:859 break; case 120: -#line 533 "dhcp4_parser.yy" // lalr1.cc:859 +#line 536 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); } -#line 1185 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1195 "dhcp4_parser.cc" // lalr1.cc:859 break; case 121: -#line 539 "dhcp4_parser.yy" // lalr1.cc:859 +#line 542 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.LEASE_DATABASE); } -#line 1196 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1206 "dhcp4_parser.cc" // lalr1.cc:859 break; case 122: -#line 544 "dhcp4_parser.yy" // lalr1.cc:859 +#line 547 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1207 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1217 "dhcp4_parser.cc" // lalr1.cc:859 break; case 123: -#line 551 "dhcp4_parser.yy" // lalr1.cc:859 +#line 554 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.HOSTS_DATABASE); } -#line 1218 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1228 "dhcp4_parser.cc" // lalr1.cc:859 break; case 124: -#line 556 "dhcp4_parser.yy" // lalr1.cc:859 +#line 559 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1229 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1239 "dhcp4_parser.cc" // lalr1.cc:859 break; case 140: -#line 582 "dhcp4_parser.yy" // lalr1.cc:859 +#line 585 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1237 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1247 "dhcp4_parser.cc" // lalr1.cc:859 break; case 141: -#line 584 "dhcp4_parser.yy" // lalr1.cc:859 +#line 587 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1246 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1256 "dhcp4_parser.cc" // lalr1.cc:859 break; case 142: -#line 589 "dhcp4_parser.yy" // lalr1.cc:859 +#line 592 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1252 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1262 "dhcp4_parser.cc" // lalr1.cc:859 break; case 143: -#line 590 "dhcp4_parser.yy" // lalr1.cc:859 +#line 593 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1258 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1268 "dhcp4_parser.cc" // lalr1.cc:859 break; case 144: -#line 591 "dhcp4_parser.yy" // lalr1.cc:859 +#line 594 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1264 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1274 "dhcp4_parser.cc" // lalr1.cc:859 break; case 145: -#line 592 "dhcp4_parser.yy" // lalr1.cc:859 +#line 595 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1270 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1280 "dhcp4_parser.cc" // lalr1.cc:859 break; case 146: -#line 595 "dhcp4_parser.yy" // lalr1.cc:859 +#line 598 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1278 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1288 "dhcp4_parser.cc" // lalr1.cc:859 break; case 147: -#line 597 "dhcp4_parser.yy" // lalr1.cc:859 +#line 600 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); ctx.leave(); } -#line 1288 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1298 "dhcp4_parser.cc" // lalr1.cc:859 break; case 148: -#line 603 "dhcp4_parser.yy" // lalr1.cc:859 +#line 606 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1296 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1306 "dhcp4_parser.cc" // lalr1.cc:859 break; case 149: -#line 605 "dhcp4_parser.yy" // lalr1.cc:859 +#line 608 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); ctx.leave(); } -#line 1306 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1316 "dhcp4_parser.cc" // lalr1.cc:859 break; case 150: -#line 611 "dhcp4_parser.yy" // lalr1.cc:859 +#line 614 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1314 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1324 "dhcp4_parser.cc" // lalr1.cc:859 break; case 151: -#line 613 "dhcp4_parser.yy" // lalr1.cc:859 +#line 616 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); ctx.leave(); } -#line 1324 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1334 "dhcp4_parser.cc" // lalr1.cc:859 break; case 152: -#line 619 "dhcp4_parser.yy" // lalr1.cc:859 +#line 622 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1333 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1343 "dhcp4_parser.cc" // lalr1.cc:859 break; case 153: -#line 624 "dhcp4_parser.yy" // lalr1.cc:859 +#line 627 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1341 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1351 "dhcp4_parser.cc" // lalr1.cc:859 break; case 154: -#line 626 "dhcp4_parser.yy" // lalr1.cc:859 +#line 629 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1351 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1361 "dhcp4_parser.cc" // lalr1.cc:859 break; case 155: -#line 632 "dhcp4_parser.yy" // lalr1.cc:859 +#line 635 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); } -#line 1360 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1370 "dhcp4_parser.cc" // lalr1.cc:859 break; case 156: -#line 637 "dhcp4_parser.yy" // lalr1.cc:859 +#line 640 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); } -#line 1369 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1379 "dhcp4_parser.cc" // lalr1.cc:859 break; case 157: -#line 642 "dhcp4_parser.yy" // lalr1.cc:859 +#line 645 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); } -#line 1378 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1388 "dhcp4_parser.cc" // lalr1.cc:859 break; case 158: -#line 647 "dhcp4_parser.yy" // lalr1.cc:859 +#line 650 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); } -#line 1387 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1397 "dhcp4_parser.cc" // lalr1.cc:859 break; case 159: -#line 652 "dhcp4_parser.yy" // lalr1.cc:859 +#line 655 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1395 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1405 "dhcp4_parser.cc" // lalr1.cc:859 break; case 160: -#line 654 "dhcp4_parser.yy" // lalr1.cc:859 +#line 657 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1405 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1415 "dhcp4_parser.cc" // lalr1.cc:859 break; case 161: -#line 660 "dhcp4_parser.yy" // lalr1.cc:859 +#line 663 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1413 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1423 "dhcp4_parser.cc" // lalr1.cc:859 break; case 162: -#line 662 "dhcp4_parser.yy" // lalr1.cc:859 +#line 665 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1423 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1433 "dhcp4_parser.cc" // lalr1.cc:859 break; case 163: -#line 669 "dhcp4_parser.yy" // lalr1.cc:859 +#line 672 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); } -#line 1434 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1444 "dhcp4_parser.cc" // lalr1.cc:859 break; case 164: -#line 674 "dhcp4_parser.yy" // lalr1.cc:859 +#line 677 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1443 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1453 "dhcp4_parser.cc" // lalr1.cc:859 break; case 172: -#line 690 "dhcp4_parser.yy" // lalr1.cc:859 +#line 693 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1452 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1462 "dhcp4_parser.cc" // lalr1.cc:859 break; case 173: -#line 695 "dhcp4_parser.yy" // lalr1.cc:859 +#line 698 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1461 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1471 "dhcp4_parser.cc" // lalr1.cc:859 break; case 174: -#line 700 "dhcp4_parser.yy" // lalr1.cc:859 +#line 703 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(circuit); } -#line 1470 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1480 "dhcp4_parser.cc" // lalr1.cc:859 break; case 175: -#line 705 "dhcp4_parser.yy" // lalr1.cc:859 +#line 708 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(client); } -#line 1479 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1489 "dhcp4_parser.cc" // lalr1.cc:859 break; case 176: -#line 710 "dhcp4_parser.yy" // lalr1.cc:859 +#line 713 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1488 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1498 "dhcp4_parser.cc" // lalr1.cc:859 break; case 177: -#line 715 "dhcp4_parser.yy" // lalr1.cc:859 +#line 718 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 1499 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1509 "dhcp4_parser.cc" // lalr1.cc:859 break; case 178: -#line 720 "dhcp4_parser.yy" // lalr1.cc:859 +#line 723 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1508 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1518 "dhcp4_parser.cc" // lalr1.cc:859 break; case 183: -#line 733 "dhcp4_parser.yy" // lalr1.cc:859 +#line 736 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1518 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1528 "dhcp4_parser.cc" // lalr1.cc:859 break; case 184: -#line 737 "dhcp4_parser.yy" // lalr1.cc:859 +#line 740 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1528 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1538 "dhcp4_parser.cc" // lalr1.cc:859 break; case 185: -#line 743 "dhcp4_parser.yy" // lalr1.cc:859 +#line 746 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1538 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1548 "dhcp4_parser.cc" // lalr1.cc:859 break; case 186: -#line 747 "dhcp4_parser.yy" // lalr1.cc:859 +#line 750 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1548 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1558 "dhcp4_parser.cc" // lalr1.cc:859 break; case 192: -#line 762 "dhcp4_parser.yy" // lalr1.cc:859 +#line 765 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1556 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1566 "dhcp4_parser.cc" // lalr1.cc:859 break; case 193: -#line 764 "dhcp4_parser.yy" // lalr1.cc:859 +#line 767 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1566 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1576 "dhcp4_parser.cc" // lalr1.cc:859 break; case 194: -#line 770 "dhcp4_parser.yy" // lalr1.cc:859 +#line 773 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1574 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1584 "dhcp4_parser.cc" // lalr1.cc:859 break; case 195: -#line 772 "dhcp4_parser.yy" // lalr1.cc:859 +#line 775 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1583 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1593 "dhcp4_parser.cc" // lalr1.cc:859 break; case 196: -#line 778 "dhcp4_parser.yy" // lalr1.cc:859 +#line 781 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.EXPIRED_LEASES_PROCESSING); } -#line 1594 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1604 "dhcp4_parser.cc" // lalr1.cc:859 break; case 197: -#line 783 "dhcp4_parser.yy" // lalr1.cc:859 +#line 786 "dhcp4_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1604 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1614 "dhcp4_parser.cc" // lalr1.cc:859 break; case 206: -#line 801 "dhcp4_parser.yy" // lalr1.cc:859 +#line 804 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); } -#line 1613 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1623 "dhcp4_parser.cc" // lalr1.cc:859 break; case 207: -#line 806 "dhcp4_parser.yy" // lalr1.cc:859 +#line 809 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); } -#line 1622 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1632 "dhcp4_parser.cc" // lalr1.cc:859 break; case 208: -#line 811 "dhcp4_parser.yy" // lalr1.cc:859 +#line 814 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); } -#line 1631 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1641 "dhcp4_parser.cc" // lalr1.cc:859 break; case 209: -#line 816 "dhcp4_parser.yy" // lalr1.cc:859 +#line 819 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); } -#line 1640 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1650 "dhcp4_parser.cc" // lalr1.cc:859 break; case 210: -#line 821 "dhcp4_parser.yy" // lalr1.cc:859 +#line 824 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); } -#line 1649 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1659 "dhcp4_parser.cc" // lalr1.cc:859 break; case 211: -#line 826 "dhcp4_parser.yy" // lalr1.cc:859 +#line 829 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); } -#line 1658 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1668 "dhcp4_parser.cc" // lalr1.cc:859 break; case 212: -#line 834 "dhcp4_parser.yy" // lalr1.cc:859 +#line 837 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet4", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET4); } -#line 1669 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1679 "dhcp4_parser.cc" // lalr1.cc:859 break; case 213: -#line 839 "dhcp4_parser.yy" // lalr1.cc:859 +#line 842 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1678 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1688 "dhcp4_parser.cc" // lalr1.cc:859 break; case 218: -#line 859 "dhcp4_parser.yy" // lalr1.cc:859 +#line 862 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1688 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1698 "dhcp4_parser.cc" // lalr1.cc:859 break; case 219: -#line 863 "dhcp4_parser.yy" // lalr1.cc:859 +#line 866 "dhcp4_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1710,295 +1720,295 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1714 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1724 "dhcp4_parser.cc" // lalr1.cc:859 break; case 220: -#line 885 "dhcp4_parser.yy" // lalr1.cc:859 +#line 888 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the subnet4 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1724 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1734 "dhcp4_parser.cc" // lalr1.cc:859 break; case 221: -#line 889 "dhcp4_parser.yy" // lalr1.cc:859 +#line 892 "dhcp4_parser.yy" // lalr1.cc:859 { // The subnet subnet4 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1734 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1744 "dhcp4_parser.cc" // lalr1.cc:859 break; case 247: -#line 926 "dhcp4_parser.yy" // lalr1.cc:859 +#line 929 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1742 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1752 "dhcp4_parser.cc" // lalr1.cc:859 break; case 248: -#line 928 "dhcp4_parser.yy" // lalr1.cc:859 +#line 931 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); } -#line 1752 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1762 "dhcp4_parser.cc" // lalr1.cc:859 break; case 249: -#line 934 "dhcp4_parser.yy" // lalr1.cc:859 +#line 937 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1760 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1770 "dhcp4_parser.cc" // lalr1.cc:859 break; case 250: -#line 936 "dhcp4_parser.yy" // lalr1.cc:859 +#line 939 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface", iface); ctx.leave(); } -#line 1770 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1780 "dhcp4_parser.cc" // lalr1.cc:859 break; case 251: -#line 942 "dhcp4_parser.yy" // lalr1.cc:859 +#line 945 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1778 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1788 "dhcp4_parser.cc" // lalr1.cc:859 break; case 252: -#line 944 "dhcp4_parser.yy" // lalr1.cc:859 +#line 947 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface-id", iface); ctx.leave(); } -#line 1788 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1798 "dhcp4_parser.cc" // lalr1.cc:859 break; case 253: -#line 950 "dhcp4_parser.yy" // lalr1.cc:859 +#line 953 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1796 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1806 "dhcp4_parser.cc" // lalr1.cc:859 break; case 254: -#line 952 "dhcp4_parser.yy" // lalr1.cc:859 +#line 955 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-subnet", iface); ctx.leave(); } -#line 1806 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1816 "dhcp4_parser.cc" // lalr1.cc:859 break; case 255: -#line 958 "dhcp4_parser.yy" // lalr1.cc:859 +#line 961 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1814 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1824 "dhcp4_parser.cc" // lalr1.cc:859 break; case 256: -#line 960 "dhcp4_parser.yy" // lalr1.cc:859 +#line 963 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); ctx.leave(); } -#line 1824 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1834 "dhcp4_parser.cc" // lalr1.cc:859 break; case 257: -#line 966 "dhcp4_parser.yy" // lalr1.cc:859 +#line 969 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1832 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1842 "dhcp4_parser.cc" // lalr1.cc:859 break; case 258: -#line 968 "dhcp4_parser.yy" // lalr1.cc:859 +#line 971 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); ctx.leave(); } -#line 1842 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1852 "dhcp4_parser.cc" // lalr1.cc:859 break; case 259: -#line 974 "dhcp4_parser.yy" // lalr1.cc:859 +#line 977 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.CLIENT_CLASS); } -#line 1850 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1860 "dhcp4_parser.cc" // lalr1.cc:859 break; case 260: -#line 976 "dhcp4_parser.yy" // lalr1.cc:859 +#line 979 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); } -#line 1860 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1870 "dhcp4_parser.cc" // lalr1.cc:859 break; case 261: -#line 982 "dhcp4_parser.yy" // lalr1.cc:859 +#line 985 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1868 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1878 "dhcp4_parser.cc" // lalr1.cc:859 break; case 262: -#line 984 "dhcp4_parser.yy" // lalr1.cc:859 +#line 987 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1877 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1887 "dhcp4_parser.cc" // lalr1.cc:859 break; case 263: -#line 989 "dhcp4_parser.yy" // lalr1.cc:859 +#line 992 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1883 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1893 "dhcp4_parser.cc" // lalr1.cc:859 break; case 264: -#line 990 "dhcp4_parser.yy" // lalr1.cc:859 +#line 993 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1889 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1899 "dhcp4_parser.cc" // lalr1.cc:859 break; case 265: -#line 991 "dhcp4_parser.yy" // lalr1.cc:859 +#line 994 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1895 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1905 "dhcp4_parser.cc" // lalr1.cc:859 break; case 266: -#line 994 "dhcp4_parser.yy" // lalr1.cc:859 +#line 997 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1904 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1914 "dhcp4_parser.cc" // lalr1.cc:859 break; case 267: -#line 999 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1002 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1913 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1923 "dhcp4_parser.cc" // lalr1.cc:859 break; case 268: -#line 1006 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1009 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1924 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1934 "dhcp4_parser.cc" // lalr1.cc:859 break; case 269: -#line 1011 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1014 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1933 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1943 "dhcp4_parser.cc" // lalr1.cc:859 break; case 274: -#line 1026 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1029 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1943 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1953 "dhcp4_parser.cc" // lalr1.cc:859 break; case 275: -#line 1030 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1033 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1951 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1961 "dhcp4_parser.cc" // lalr1.cc:859 break; case 293: -#line 1059 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1062 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1962 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1972 "dhcp4_parser.cc" // lalr1.cc:859 break; case 294: -#line 1064 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1067 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1971 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1981 "dhcp4_parser.cc" // lalr1.cc:859 break; case 295: -#line 1072 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1075 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1980 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1990 "dhcp4_parser.cc" // lalr1.cc:859 break; case 296: -#line 1075 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1078 "dhcp4_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 1988 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1998 "dhcp4_parser.cc" // lalr1.cc:859 break; case 301: -#line 1091 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1094 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1998 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2008 "dhcp4_parser.cc" // lalr1.cc:859 break; case 302: -#line 1095 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1098 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2006,21 +2016,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2010 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2020 "dhcp4_parser.cc" // lalr1.cc:859 break; case 303: -#line 1106 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1109 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2020 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2030 "dhcp4_parser.cc" // lalr1.cc:859 break; case 304: -#line 1110 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1113 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2028,1210 +2038,1239 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2032 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2042 "dhcp4_parser.cc" // lalr1.cc:859 break; case 318: -#line 1140 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1143 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 2041 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2051 "dhcp4_parser.cc" // lalr1.cc:859 break; case 320: -#line 1147 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1150 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2049 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2059 "dhcp4_parser.cc" // lalr1.cc:859 break; case 321: -#line 1149 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1152 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 2059 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2069 "dhcp4_parser.cc" // lalr1.cc:859 break; case 322: -#line 1155 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1158 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2067 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2077 "dhcp4_parser.cc" // lalr1.cc:859 break; case 323: -#line 1157 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1160 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 2077 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2087 "dhcp4_parser.cc" // lalr1.cc:859 break; case 324: -#line 1163 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1166 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2085 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2095 "dhcp4_parser.cc" // lalr1.cc:859 break; case 325: -#line 1165 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1168 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2095 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2105 "dhcp4_parser.cc" // lalr1.cc:859 break; case 327: -#line 1173 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1176 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2103 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2113 "dhcp4_parser.cc" // lalr1.cc:859 break; case 328: -#line 1175 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1178 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2113 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2123 "dhcp4_parser.cc" // lalr1.cc:859 break; case 329: -#line 1181 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1184 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2122 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2132 "dhcp4_parser.cc" // lalr1.cc:859 break; case 330: -#line 1190 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1193 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2133 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2143 "dhcp4_parser.cc" // lalr1.cc:859 break; case 331: -#line 1195 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1198 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2142 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2152 "dhcp4_parser.cc" // lalr1.cc:859 break; case 336: -#line 1214 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1217 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2152 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2162 "dhcp4_parser.cc" // lalr1.cc:859 break; case 337: -#line 1218 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1221 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2161 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2171 "dhcp4_parser.cc" // lalr1.cc:859 break; case 338: -#line 1226 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1229 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2171 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2181 "dhcp4_parser.cc" // lalr1.cc:859 break; case 339: -#line 1230 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1233 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2180 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2190 "dhcp4_parser.cc" // lalr1.cc:859 break; case 352: -#line 1261 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1264 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2188 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2198 "dhcp4_parser.cc" // lalr1.cc:859 break; case 353: -#line 1263 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1266 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2198 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2208 "dhcp4_parser.cc" // lalr1.cc:859 break; case 356: -#line 1273 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1276 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2207 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2217 "dhcp4_parser.cc" // lalr1.cc:859 break; case 357: -#line 1278 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1281 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2216 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2226 "dhcp4_parser.cc" // lalr1.cc:859 break; case 358: -#line 1286 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1289 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2227 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2237 "dhcp4_parser.cc" // lalr1.cc:859 break; case 359: -#line 1291 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1294 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2236 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2246 "dhcp4_parser.cc" // lalr1.cc:859 break; case 364: -#line 1306 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1309 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2246 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2256 "dhcp4_parser.cc" // lalr1.cc:859 break; case 365: -#line 1310 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1313 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2256 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 break; case 366: -#line 1316 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1319 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 break; case 367: -#line 1320 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1323 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 375: -#line 1337 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 2284 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2286 "dhcp4_parser.cc" // lalr1.cc:859 break; case 376: -#line 1339 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1341 "dhcp4_parser.yy" // lalr1.cc:859 { - ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("pool", pool); - ctx.leave(); + ctx.enter(ctx.NO_KEYWORD); } #line 2294 "dhcp4_parser.cc" // lalr1.cc:859 break; case 377: -#line 1345 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1343 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("pool", pool); + ctx.leave(); } -#line 2302 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2304 "dhcp4_parser.cc" // lalr1.cc:859 break; case 378: -#line 1347 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1349 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2312 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 379: +#line 1351 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2311 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2321 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1355 "dhcp4_parser.yy" // lalr1.cc:859 + case 380: +#line 1356 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.KNOWN_CLIENTS); +} +#line 2329 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 381: +#line 1358 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2338 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 382: +#line 1364 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } +#line 2344 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 383: +#line 1365 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } +#line 2350 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 384: +#line 1371 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2322 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2361 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 380: -#line 1360 "dhcp4_parser.yy" // lalr1.cc:859 + case 385: +#line 1376 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2331 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2370 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1373 "dhcp4_parser.yy" // lalr1.cc:859 + case 390: +#line 1389 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2341 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2380 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1377 "dhcp4_parser.yy" // lalr1.cc:859 + case 391: +#line 1393 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2350 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2389 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1382 "dhcp4_parser.yy" // lalr1.cc:859 + case 392: +#line 1398 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2360 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2399 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 388: -#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 + case 393: +#line 1402 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2369 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2408 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 406: -#line 1415 "dhcp4_parser.yy" // lalr1.cc:859 + case 411: +#line 1431 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2377 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2416 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 407: -#line 1417 "dhcp4_parser.yy" // lalr1.cc:859 + case 412: +#line 1433 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); ctx.leave(); } -#line 2387 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2426 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 408: -#line 1423 "dhcp4_parser.yy" // lalr1.cc:859 + case 413: +#line 1439 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2395 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2434 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 409: -#line 1425 "dhcp4_parser.yy" // lalr1.cc:859 + case 414: +#line 1441 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); ctx.leave(); } -#line 2405 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2444 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 410: -#line 1431 "dhcp4_parser.yy" // lalr1.cc:859 + case 415: +#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2413 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2452 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 411: -#line 1433 "dhcp4_parser.yy" // lalr1.cc:859 + case 416: +#line 1449 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); ctx.leave(); } -#line 2423 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2462 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 412: -#line 1439 "dhcp4_parser.yy" // lalr1.cc:859 + case 417: +#line 1455 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2431 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2470 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1441 "dhcp4_parser.yy" // lalr1.cc:859 + case 418: +#line 1457 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); ctx.leave(); } -#line 2441 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2480 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 + case 419: +#line 1463 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2449 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2488 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1449 "dhcp4_parser.yy" // lalr1.cc:859 + case 420: +#line 1465 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2459 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2498 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1455 "dhcp4_parser.yy" // lalr1.cc:859 + case 421: +#line 1471 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2467 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2506 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1457 "dhcp4_parser.yy" // lalr1.cc:859 + case 422: +#line 1473 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2477 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2516 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1463 "dhcp4_parser.yy" // lalr1.cc:859 + case 423: +#line 1479 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2485 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2524 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1465 "dhcp4_parser.yy" // lalr1.cc:859 + case 424: +#line 1481 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); ctx.leave(); } -#line 2495 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2534 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1471 "dhcp4_parser.yy" // lalr1.cc:859 + case 425: +#line 1487 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2503 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2542 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1473 "dhcp4_parser.yy" // lalr1.cc:859 + case 426: +#line 1489 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); ctx.leave(); } -#line 2513 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2552 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1479 "dhcp4_parser.yy" // lalr1.cc:859 + case 427: +#line 1495 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2521 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2560 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1481 "dhcp4_parser.yy" // lalr1.cc:859 + case 428: +#line 1497 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2531 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2570 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1487 "dhcp4_parser.yy" // lalr1.cc:859 + case 429: +#line 1503 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2539 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2578 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1489 "dhcp4_parser.yy" // lalr1.cc:859 + case 430: +#line 1505 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2549 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2588 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1495 "dhcp4_parser.yy" // lalr1.cc:859 + case 431: +#line 1511 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2560 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2599 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1500 "dhcp4_parser.yy" // lalr1.cc:859 + case 432: +#line 1516 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2569 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2608 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1508 "dhcp4_parser.yy" // lalr1.cc:859 + case 433: +#line 1524 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); ctx.stack_.push_back(m); ctx.enter(ctx.RELAY); } -#line 2580 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2619 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1513 "dhcp4_parser.yy" // lalr1.cc:859 + case 434: +#line 1529 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2589 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2628 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 + case 435: +#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2597 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2636 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1536 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2607 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2646 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1529 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1545 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2618 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2657 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 + case 438: +#line 1550 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2627 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2666 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1543 "dhcp4_parser.yy" // lalr1.cc:859 + case 441: +#line 1559 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2637 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2676 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1547 "dhcp4_parser.yy" // lalr1.cc:859 + case 442: +#line 1563 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2647 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2686 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 451: -#line 1573 "dhcp4_parser.yy" // lalr1.cc:859 + case 456: +#line 1589 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2655 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2694 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 452: -#line 1575 "dhcp4_parser.yy" // lalr1.cc:859 + case 457: +#line 1591 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2665 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2704 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 453: -#line 1585 "dhcp4_parser.yy" // lalr1.cc:859 + case 458: +#line 1601 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2674 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2713 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 454: -#line 1592 "dhcp4_parser.yy" // lalr1.cc:859 + case 459: +#line 1608 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2685 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2724 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 455: -#line 1597 "dhcp4_parser.yy" // lalr1.cc:859 + case 460: +#line 1613 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2694 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2733 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 460: -#line 1610 "dhcp4_parser.yy" // lalr1.cc:859 + case 465: +#line 1626 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2702 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2741 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 461: -#line 1612 "dhcp4_parser.yy" // lalr1.cc:859 + case 466: +#line 1628 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2712 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2751 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 462: -#line 1618 "dhcp4_parser.yy" // lalr1.cc:859 + case 467: +#line 1634 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2720 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2759 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 463: -#line 1620 "dhcp4_parser.yy" // lalr1.cc:859 + case 468: +#line 1636 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2730 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2769 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 464: -#line 1628 "dhcp4_parser.yy" // lalr1.cc:859 + case 469: +#line 1644 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2741 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2780 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 465: -#line 1633 "dhcp4_parser.yy" // lalr1.cc:859 + case 470: +#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2752 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2791 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1640 "dhcp4_parser.yy" // lalr1.cc:859 + case 471: +#line 1656 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2762 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2801 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1644 "dhcp4_parser.yy" // lalr1.cc:859 + case 472: +#line 1660 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2772 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2811 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1671 "dhcp4_parser.yy" // lalr1.cc:859 + case 490: +#line 1687 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2781 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2820 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1676 "dhcp4_parser.yy" // lalr1.cc:859 + case 491: +#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2789 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2828 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1678 "dhcp4_parser.yy" // lalr1.cc:859 + case 492: +#line 1694 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2799 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2838 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1684 "dhcp4_parser.yy" // lalr1.cc:859 + case 493: +#line 1700 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2807 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2846 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1686 "dhcp4_parser.yy" // lalr1.cc:859 + case 494: +#line 1702 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2817 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2856 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 + case 495: +#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2826 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2865 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1697 "dhcp4_parser.yy" // lalr1.cc:859 + case 496: +#line 1713 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2834 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2873 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 492: -#line 1699 "dhcp4_parser.yy" // lalr1.cc:859 + case 497: +#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2844 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2883 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 493: -#line 1705 "dhcp4_parser.yy" // lalr1.cc:859 + case 498: +#line 1721 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2853 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2892 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 494: -#line 1710 "dhcp4_parser.yy" // lalr1.cc:859 + case 499: +#line 1726 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2862 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 495: -#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NCR_PROTOCOL); -} -#line 2870 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 496: -#line 1717 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2879 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 497: -#line 1723 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2885 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 498: -#line 1724 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 2891 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 499: -#line 1727 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NCR_FORMAT); -} -#line 2899 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2901 "dhcp4_parser.cc" // lalr1.cc:859 break; case 500: -#line 1729 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1731 "dhcp4_parser.yy" // lalr1.cc:859 { - ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("ncr-format", json); - ctx.leave(); + ctx.enter(ctx.NCR_PROTOCOL); } #line 2909 "dhcp4_parser.cc" // lalr1.cc:859 break; case 501: -#line 1735 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1733 "dhcp4_parser.yy" // lalr1.cc:859 { - ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("always-include-fqdn", b); + ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); } #line 2918 "dhcp4_parser.cc" // lalr1.cc:859 break; case 502: +#line 1739 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } +#line 2924 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 503: #line 1740 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } +#line 2930 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 504: +#line 1743 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NCR_FORMAT); +} +#line 2938 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 505: +#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("ncr-format", json); + ctx.leave(); +} +#line 2948 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 506: +#line 1751 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("always-include-fqdn", b); +} +#line 2957 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 507: +#line 1756 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 2927 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2966 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 + case 508: +#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 2936 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2975 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1750 "dhcp4_parser.yy" // lalr1.cc:859 + case 509: +#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 2944 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2983 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1752 "dhcp4_parser.yy" // lalr1.cc:859 + case 510: +#line 1768 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2953 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2992 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1758 "dhcp4_parser.yy" // lalr1.cc:859 + case 511: +#line 1774 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 2961 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3000 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 + case 512: +#line 1777 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 2969 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3008 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1764 "dhcp4_parser.yy" // lalr1.cc:859 + case 513: +#line 1780 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 2977 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3016 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1767 "dhcp4_parser.yy" // lalr1.cc:859 + case 514: +#line 1783 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 2985 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3024 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1770 "dhcp4_parser.yy" // lalr1.cc:859 + case 515: +#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 2994 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3033 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1776 "dhcp4_parser.yy" // lalr1.cc:859 + case 516: +#line 1792 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3002 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3041 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1778 "dhcp4_parser.yy" // lalr1.cc:859 + case 517: +#line 1794 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3012 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 513: -#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3020 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 514: -#line 1788 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 3029 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 515: -#line 1793 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3037 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 516: -#line 1795 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 3046 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 517: -#line 1800 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3054 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3051 "dhcp4_parser.cc" // lalr1.cc:859 break; case 518: #line 1802 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); + ctx.enter(ctx.NO_KEYWORD); } -#line 3063 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3059 "dhcp4_parser.cc" // lalr1.cc:859 break; case 519: -#line 1812 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1804 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3068 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 520: +#line 1809 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3076 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 521: +#line 1811 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3085 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 522: +#line 1816 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3093 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 523: +#line 1818 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3102 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 524: +#line 1828 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3074 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3113 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1817 "dhcp4_parser.yy" // lalr1.cc:859 + case 525: +#line 1833 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3083 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3122 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1834 "dhcp4_parser.yy" // lalr1.cc:859 + case 529: +#line 1850 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3094 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3133 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1839 "dhcp4_parser.yy" // lalr1.cc:859 + case 530: +#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3103 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3142 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1851 "dhcp4_parser.yy" // lalr1.cc:859 + case 533: +#line 1867 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3113 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3152 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 + case 534: +#line 1871 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3121 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3160 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1870 "dhcp4_parser.yy" // lalr1.cc:859 + case 542: +#line 1886 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3130 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3169 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1875 "dhcp4_parser.yy" // lalr1.cc:859 + case 543: +#line 1891 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3138 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3177 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1877 "dhcp4_parser.yy" // lalr1.cc:859 + case 544: +#line 1893 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3148 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3187 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1883 "dhcp4_parser.yy" // lalr1.cc:859 + case 545: +#line 1899 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3159 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3198 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1888 "dhcp4_parser.yy" // lalr1.cc:859 + case 546: +#line 1904 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3168 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3207 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1897 "dhcp4_parser.yy" // lalr1.cc:859 + case 549: +#line 1913 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3178 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3217 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1901 "dhcp4_parser.yy" // lalr1.cc:859 + case 550: +#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3186 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3225 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1915 "dhcp4_parser.yy" // lalr1.cc:859 + case 557: +#line 1931 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3194 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3233 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 + case 558: +#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3204 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3243 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1923 "dhcp4_parser.yy" // lalr1.cc:859 + case 559: +#line 1939 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3213 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3252 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1928 "dhcp4_parser.yy" // lalr1.cc:859 + case 560: +#line 1944 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3222 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3261 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 + case 561: +#line 1949 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3231 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3270 "dhcp4_parser.cc" // lalr1.cc:859 break; -#line 3235 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3274 "dhcp4_parser.cc" // lalr1.cc:859 default: break; } @@ -3486,104 +3525,104 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -694; + const short int Dhcp4Parser::yypact_ninf_ = -703; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 234, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, 11, 22, 72, 80, 84, 102, 106, - 119, 176, 180, 187, 205, 222, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - 22, -109, -8, 31, 91, 131, 38, 138, -5, 213, - 150, -56, 243, -694, 65, 96, 153, 237, 246, -694, - -694, -694, -694, -694, 272, -694, 35, -694, -694, -694, - -694, -694, -694, -694, 279, 281, -694, -694, -694, -694, - -694, 282, 283, 284, 285, -694, -694, -694, -694, -694, - -694, -694, -694, 286, -694, -694, -694, 36, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, 287, 64, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - 288, 289, -694, -694, -694, -694, -694, -694, -694, -694, - -694, 92, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, 108, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, 291, - 294, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, 292, -694, -694, 290, -694, -694, -694, - 297, -694, -694, 295, 299, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, 300, 301, -694, -694, - -694, -694, 303, 305, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, 155, -694, -694, -694, 309, -694, - -694, 312, -694, 314, 316, -694, -694, 319, 321, 326, - -694, -694, -694, 156, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - 22, 22, -694, 185, 330, 331, 332, 333, 335, -694, - -8, -694, 337, 211, 212, 358, 359, 360, 376, 377, - 235, 236, 238, 239, 380, 383, 384, 386, 387, 388, - 389, 390, 249, 391, 393, 31, -694, 394, 395, 396, - 253, 91, -694, 397, 399, 400, 401, 402, 403, 404, - 405, 263, 262, 408, 409, 410, 411, 131, -694, 412, - 38, -694, 413, 414, 415, 416, 417, 418, 419, 420, - -694, 138, -694, 421, 422, 280, 424, 425, 426, 296, - -694, 213, 427, 298, 302, -694, 150, 428, 429, 51, - -694, 304, 430, 431, 293, 432, 308, 310, 434, 435, - 307, 313, 315, 437, 440, 243, -694, -694, -694, 442, - 441, 445, 22, 22, 22, -694, 451, -694, -694, 317, - 320, 322, 452, 454, -694, -694, -694, -694, 460, 462, - 464, 465, 466, 467, 468, 469, -694, 470, 471, -694, - 474, 136, 148, -694, -694, 328, 329, 334, 476, 475, - 338, 339, 340, -694, -694, 209, 341, 478, 481, -694, - 343, -694, 474, 344, 345, 346, 347, 348, 349, 350, - -694, 351, 352, -694, 353, 354, 355, -694, -694, 356, - -694, -694, -694, 357, 22, -694, -694, 361, 362, -694, - 363, -694, -694, 15, 398, -694, -694, -694, -71, 364, - -694, 22, 31, 381, -694, -694, -694, 91, -694, -694, - -694, 198, 198, 498, 499, 504, 505, 162, 506, 507, - 52, 179, 243, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, 509, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, 510, 433, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, 164, - -694, 173, -694, -694, 182, -694, -694, -694, -694, 514, - 516, 517, 518, 519, -694, -694, -694, 183, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, 207, -694, 520, 521, -694, -694, 522, 524, -694, - -694, 523, 527, -694, -694, 525, 529, -694, -694, -694, - -694, -694, -694, 77, -694, -694, -694, -694, -694, -694, - -694, 114, -694, -694, 528, 530, -694, 531, 532, 533, - 534, 535, 536, 244, -694, -694, -694, -694, -694, -694, - -694, -694, -694, 248, -694, -694, -694, 252, 379, -694, - 537, 538, -694, -694, 539, 541, -694, -694, 540, -694, - 542, 381, -694, -694, 543, 545, 546, 547, 406, 407, - 423, 436, 439, 548, 550, 198, -694, -694, 131, -694, - 498, 213, -694, 499, 150, -694, 504, 42, -694, 505, - 162, -694, 46, 506, -694, -56, -694, 507, 443, 444, - 446, 447, 448, 449, 52, -694, 551, 553, 179, -694, - -694, -694, 552, 556, 38, -694, 509, 138, -694, 510, - 557, -694, 555, -694, 30, 438, 453, 455, -694, -694, - -694, -694, -694, 456, 457, -694, 254, -694, 554, -694, - 558, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, 255, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, 559, - 560, -694, -694, -694, -694, 256, -694, -694, -694, -694, - -694, -694, -694, -694, 458, 459, -694, -694, 461, 258, - -694, 561, -694, 463, 564, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, 42, -694, - 568, -694, 46, -694, -694, -694, -694, -694, -694, -694, - -694, 127, -694, -694, 472, -694, 10, 564, -694, -694, - -694, 569, -694, -694, -694, 266, -694, -694, -694, -694, - -694, 570, 450, 571, 10, -694, 563, -694, 473, -694, - 572, -694, -694, 208, -694, 98, 572, -694, -694, 573, - 574, 576, 267, -694, -694, -694, -694, -694, -694, 577, - 479, 477, 480, 98, -694, 483, -694, -694, -694, -694, - -694 + 126, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, 30, 22, 21, 37, 51, 76, 102, + 112, 116, 124, 141, 152, 167, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + 22, -67, -8, 28, 91, 113, -4, 127, 150, 87, + 43, -36, 171, -703, 209, 199, 217, 211, 235, -703, + -703, -703, -703, -703, 247, -703, 35, -703, -703, -703, + -703, -703, -703, -703, 270, 294, -703, -703, -703, -703, + -703, 296, 304, 306, 307, -703, -703, -703, -703, -703, + -703, -703, -703, 310, -703, -703, -703, 54, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, 326, 72, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + 332, 349, -703, -703, -703, -703, -703, -703, -703, -703, + -703, 74, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, 105, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, 250, 289, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, 315, -703, -703, 350, -703, + -703, -703, 351, -703, -703, 348, 354, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, 355, 356, + -703, -703, -703, -703, 353, 359, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, 135, -703, -703, -703, + 360, -703, -703, 361, -703, 362, 363, -703, -703, 367, + 368, 369, -703, -703, -703, 184, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, 22, 22, -703, 210, 370, 371, 372, 373, + 374, -703, -8, -703, 375, 212, 229, 377, 378, 379, + 380, 381, 237, 238, 239, 240, 386, 387, 388, 389, + 390, 391, 392, 393, 251, 394, 395, 28, -703, 397, + 398, 399, 253, 91, -703, 401, 402, 403, 404, 405, + 406, 407, 408, 264, 263, 411, 412, 413, 414, 113, + -703, 415, 416, -4, -703, 417, 418, 419, 420, 421, + 422, 423, 424, -703, 127, -703, 425, 426, 282, 428, + 429, 430, 284, -703, 87, 432, 286, 292, -703, 43, + 434, 435, 10, -703, 293, 436, 438, 299, 441, 300, + 301, 447, 448, 305, 308, 309, 451, 453, 171, -703, + -703, -703, 457, 455, 456, 22, 22, 22, -703, 458, + -703, -703, 320, 321, 322, 459, 460, -703, -703, -703, + -703, 466, 467, 468, 469, 470, 471, 472, 473, -703, + 474, 475, -703, 478, 151, 162, -703, -703, 331, 337, + 338, 479, 480, 340, 341, 342, -703, -703, -7, 343, + 487, 486, -703, 346, 122, -703, 478, 347, 352, 357, + 358, 364, 365, 366, -703, 376, 382, -703, 383, 384, + 385, -703, -703, 396, -703, -703, -703, 400, 22, -703, + -703, 409, 410, -703, 427, -703, -703, 5, 431, -703, + -703, -703, 85, 433, -703, 22, 28, 437, -703, -703, + -703, 91, -703, -703, -703, 193, 193, 489, 490, 491, + 492, 159, 494, 495, 208, 249, 171, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, 496, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, 497, + 439, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, 195, -703, 196, -703, + -703, 214, -703, -703, -703, -703, 503, 504, 505, 506, + 507, -703, -703, -703, 215, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, 244, -703, + 509, 513, -703, -703, 511, 515, -703, -703, 514, 516, + -703, -703, 517, 518, -703, -703, -703, -703, -703, -703, + 8, -703, -703, -703, -703, -703, -703, -703, 39, -703, + -703, 519, 523, -703, 525, 530, 531, 532, 533, 534, + 245, -703, -703, -703, -703, -703, -703, -703, -703, -703, + 246, -703, -703, -703, 287, 440, -703, 521, 536, -703, + -703, 535, 537, -703, -703, 538, -703, 539, 437, -703, + -703, 541, 543, 545, 546, 329, 442, 443, 444, 445, + 548, 549, 193, -703, -703, 113, -703, 489, 87, -703, + 490, 43, -703, 491, 42, -703, 492, 159, -703, 145, + 494, -703, -36, -703, 495, 449, 450, 452, 454, 461, + 462, 208, -703, 550, 551, 249, -703, -703, -703, 553, + 557, -4, -703, 496, 127, -703, 497, 552, -703, 556, + -703, 319, 464, 465, 476, -703, -703, -703, -703, -703, + 477, 481, -703, 288, -703, 555, -703, 558, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, 291, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, 559, 561, -703, -703, + -703, -703, 318, -703, -703, -703, -703, -703, -703, -703, + -703, 482, 483, -703, -703, 484, 330, -703, 560, -703, + 488, 562, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, 42, -703, 566, -703, 145, + -703, -703, -703, -703, -703, -703, -703, -703, 114, -703, + -703, 493, -703, 111, 562, -703, -703, -703, 567, -703, + -703, -703, 334, -703, -703, -703, -703, -703, 568, 485, + 569, 111, -703, 571, -703, 500, -703, 570, -703, -703, + 254, -703, -40, 570, -703, -703, 574, 575, 576, 336, + -703, -703, -703, -703, -703, -703, 578, 446, 502, 510, + -40, -703, 508, -703, -703, -703, -703, -703 }; const unsigned short int @@ -3593,500 +3632,503 @@ namespace isc { namespace dhcp { 20, 22, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 34, 30, 29, 26, 27, 28, 33, 3, 31, 32, 54, 5, - 66, 7, 108, 9, 220, 11, 366, 13, 387, 15, - 295, 17, 303, 19, 338, 21, 185, 23, 466, 25, - 43, 37, 0, 0, 0, 0, 0, 389, 0, 305, + 66, 7, 108, 9, 220, 11, 366, 13, 392, 15, + 295, 17, 303, 19, 338, 21, 185, 23, 471, 25, + 43, 37, 0, 0, 0, 0, 0, 394, 0, 305, 340, 0, 0, 45, 0, 44, 0, 0, 38, 64, - 519, 513, 515, 517, 0, 63, 0, 56, 58, 60, - 61, 62, 59, 100, 0, 0, 406, 408, 410, 121, + 524, 518, 520, 522, 0, 63, 0, 56, 58, 60, + 61, 62, 59, 100, 0, 0, 411, 413, 415, 121, 123, 0, 0, 0, 0, 212, 293, 330, 268, 163, - 432, 177, 196, 0, 454, 464, 93, 0, 68, 70, + 437, 177, 196, 0, 459, 469, 93, 0, 68, 70, 71, 72, 73, 88, 89, 76, 77, 78, 79, 83, 84, 74, 75, 81, 82, 90, 91, 92, 80, 85, 86, 87, 110, 112, 116, 0, 0, 102, 104, 105, - 106, 107, 249, 251, 253, 358, 377, 247, 255, 257, - 0, 0, 261, 259, 379, 428, 246, 224, 225, 226, + 106, 107, 249, 251, 253, 358, 378, 247, 255, 257, + 0, 0, 261, 259, 384, 433, 246, 224, 225, 226, 238, 0, 222, 229, 242, 243, 244, 230, 231, 234, 236, 232, 233, 227, 228, 245, 235, 239, 240, 241, - 237, 375, 374, 372, 371, 0, 368, 370, 373, 426, - 414, 416, 420, 418, 424, 422, 412, 405, 401, 0, - 390, 391, 402, 403, 404, 398, 393, 399, 395, 396, - 397, 400, 394, 0, 320, 153, 0, 324, 322, 327, - 0, 316, 317, 0, 306, 307, 309, 319, 310, 311, - 312, 326, 313, 314, 315, 352, 0, 0, 350, 351, - 354, 355, 0, 341, 342, 344, 345, 346, 347, 348, - 349, 192, 194, 189, 0, 187, 190, 191, 0, 486, - 488, 0, 491, 0, 0, 495, 499, 0, 0, 0, - 504, 511, 484, 0, 468, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 42, - 0, 0, 35, 0, 0, 0, 0, 0, 0, 53, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 376, 380, 375, 372, 371, 0, 368, 370, 373, + 374, 431, 419, 421, 425, 423, 429, 427, 417, 410, + 406, 0, 395, 396, 407, 408, 409, 403, 398, 404, + 400, 401, 402, 405, 399, 0, 320, 153, 0, 324, + 322, 327, 0, 316, 317, 0, 306, 307, 309, 319, + 310, 311, 312, 326, 313, 314, 315, 352, 0, 0, + 350, 351, 354, 355, 0, 341, 342, 344, 345, 346, + 347, 348, 349, 192, 194, 189, 0, 187, 190, 191, + 0, 491, 493, 0, 496, 0, 0, 500, 504, 0, + 0, 0, 509, 516, 489, 0, 473, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 42, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 53, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, - 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, - 388, 0, 296, 0, 0, 0, 0, 0, 0, 0, - 304, 0, 0, 0, 0, 339, 0, 0, 0, 0, - 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 467, 46, 39, 0, - 0, 0, 0, 0, 0, 57, 0, 98, 99, 0, - 0, 0, 0, 0, 94, 95, 96, 97, 0, 0, - 0, 0, 0, 0, 0, 0, 453, 0, 0, 69, - 0, 0, 0, 120, 103, 0, 0, 0, 0, 0, - 0, 0, 0, 266, 267, 0, 0, 0, 0, 223, - 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, - 392, 0, 0, 318, 0, 0, 0, 329, 308, 0, - 356, 357, 343, 0, 0, 188, 485, 0, 0, 490, - 0, 493, 494, 0, 0, 501, 502, 503, 0, 0, - 469, 0, 0, 0, 514, 516, 518, 0, 407, 409, - 411, 0, 0, 214, 297, 332, 270, 0, 0, 179, - 0, 0, 0, 47, 111, 114, 115, 113, 118, 119, - 117, 250, 252, 254, 360, 36, 378, 248, 256, 258, - 263, 264, 265, 262, 260, 381, 0, 376, 427, 415, - 417, 421, 419, 425, 423, 413, 321, 154, 325, 323, - 328, 353, 193, 195, 487, 489, 492, 497, 498, 496, - 500, 506, 507, 508, 509, 510, 505, 512, 40, 0, - 524, 0, 521, 523, 0, 140, 146, 148, 150, 0, - 0, 0, 0, 0, 159, 161, 139, 0, 125, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 0, 218, 0, 215, 216, 301, 0, 298, 299, - 336, 0, 333, 334, 274, 0, 271, 272, 172, 173, - 174, 175, 176, 0, 165, 167, 168, 169, 170, 171, - 436, 0, 434, 183, 0, 180, 181, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 201, 202, 203, 204, - 205, 460, 462, 0, 456, 458, 459, 0, 49, 364, - 0, 361, 362, 385, 0, 382, 383, 430, 0, 65, - 0, 0, 520, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 122, 124, 0, 213, - 0, 305, 294, 0, 340, 331, 0, 0, 269, 0, - 0, 164, 438, 0, 433, 0, 178, 0, 0, 0, - 0, 0, 0, 0, 0, 197, 0, 0, 0, 455, - 465, 51, 0, 50, 0, 359, 0, 389, 380, 0, - 0, 429, 0, 522, 0, 0, 0, 0, 152, 155, - 156, 157, 158, 0, 0, 126, 0, 217, 0, 300, - 0, 335, 292, 291, 281, 282, 284, 278, 279, 280, - 290, 289, 0, 276, 283, 285, 286, 287, 288, 273, - 166, 451, 449, 450, 444, 445, 446, 447, 448, 0, - 439, 440, 442, 443, 435, 0, 182, 206, 207, 208, - 209, 210, 211, 199, 0, 0, 457, 48, 0, 0, - 363, 0, 384, 0, 0, 142, 143, 144, 145, 141, - 147, 149, 151, 160, 162, 219, 302, 337, 0, 275, - 0, 437, 0, 184, 461, 463, 52, 365, 386, 431, - 528, 0, 526, 277, 0, 441, 0, 0, 525, 452, - 540, 0, 538, 536, 532, 0, 530, 534, 535, 533, - 527, 0, 0, 0, 0, 529, 0, 537, 0, 531, - 0, 539, 544, 0, 542, 0, 0, 541, 552, 0, - 0, 0, 0, 546, 548, 549, 550, 551, 543, 0, - 0, 0, 0, 0, 545, 0, 554, 555, 556, 547, - 553 + 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, + 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 221, 0, 0, 0, 367, 0, 0, 0, 0, 0, + 0, 0, 0, 393, 0, 296, 0, 0, 0, 0, + 0, 0, 0, 304, 0, 0, 0, 0, 339, 0, + 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, + 46, 39, 0, 0, 0, 0, 0, 0, 57, 0, + 98, 99, 0, 0, 0, 0, 0, 94, 95, 96, + 97, 0, 0, 0, 0, 0, 0, 0, 0, 458, + 0, 0, 69, 0, 0, 0, 120, 103, 0, 0, + 0, 0, 0, 0, 0, 0, 266, 267, 0, 0, + 0, 0, 223, 0, 0, 369, 0, 0, 0, 0, + 0, 0, 0, 0, 397, 0, 0, 318, 0, 0, + 0, 329, 308, 0, 356, 357, 343, 0, 0, 188, + 490, 0, 0, 495, 0, 498, 499, 0, 0, 506, + 507, 508, 0, 0, 474, 0, 0, 0, 519, 521, + 523, 0, 412, 414, 416, 0, 0, 214, 297, 332, + 270, 0, 0, 179, 0, 0, 0, 47, 111, 114, + 115, 113, 118, 119, 117, 250, 252, 254, 360, 36, + 379, 248, 256, 258, 263, 264, 265, 262, 260, 386, + 0, 377, 382, 383, 381, 432, 420, 422, 426, 424, + 430, 428, 418, 321, 154, 325, 323, 328, 353, 193, + 195, 492, 494, 497, 502, 503, 501, 505, 512, 511, + 513, 514, 515, 510, 517, 40, 0, 529, 0, 526, + 528, 0, 140, 146, 148, 150, 0, 0, 0, 0, + 0, 159, 161, 139, 0, 125, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 0, 218, + 0, 215, 216, 301, 0, 298, 299, 336, 0, 333, + 334, 274, 0, 271, 272, 172, 173, 174, 175, 176, + 0, 165, 167, 168, 169, 170, 171, 441, 0, 439, + 183, 0, 180, 181, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 201, 202, 203, 204, 205, 465, 467, + 0, 461, 463, 464, 0, 49, 364, 0, 361, 362, + 390, 0, 387, 388, 435, 0, 65, 0, 0, 525, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 122, 124, 0, 213, 0, 305, 294, + 0, 340, 331, 0, 0, 269, 0, 0, 164, 443, + 0, 438, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 0, 460, 470, 51, 0, + 50, 0, 359, 0, 394, 385, 0, 0, 434, 0, + 527, 0, 0, 0, 0, 152, 155, 156, 157, 158, + 0, 0, 126, 0, 217, 0, 300, 0, 335, 292, + 291, 281, 282, 284, 278, 279, 280, 290, 289, 0, + 276, 283, 285, 286, 287, 288, 273, 166, 456, 454, + 455, 449, 450, 451, 452, 453, 0, 444, 445, 447, + 448, 440, 0, 182, 206, 207, 208, 209, 210, 211, + 199, 0, 0, 462, 48, 0, 0, 363, 0, 389, + 0, 0, 142, 143, 144, 145, 141, 147, 149, 151, + 160, 162, 219, 302, 337, 0, 275, 0, 442, 0, + 184, 466, 468, 52, 365, 391, 436, 533, 0, 531, + 277, 0, 446, 0, 0, 530, 457, 545, 0, 543, + 541, 537, 0, 535, 539, 540, 538, 532, 0, 0, + 0, 0, 534, 0, 542, 0, 536, 0, 544, 549, + 0, 547, 0, 0, 546, 557, 0, 0, 0, 0, + 551, 553, 554, 555, 556, 548, 0, 0, 0, 0, + 0, 550, 0, 559, 560, 561, 552, 558 }; const short int Dhcp4Parser::yypgoto_[] = { - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -47, -694, 93, -694, -694, -694, - -694, -694, -694, -694, -694, 103, -694, -694, -694, -62, - -694, -694, -694, 273, -694, -694, -694, -694, 62, 241, - -30, -25, -24, -694, -694, -19, -694, -694, 75, 247, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, 86, -108, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -69, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -121, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -125, -694, -694, -694, -115, 217, -694, -694, -694, -694, - -694, -694, -694, -116, -694, -694, -694, -694, -694, -694, - -693, -694, -694, -694, -90, -694, -694, -694, -87, 257, - -694, -694, -694, -694, -694, -694, -694, -694, -687, -694, - -694, -694, -48, -694, -686, -694, -694, -694, -694, -694, - -694, -694, -694, -97, -694, -694, -215, -49, -694, -694, - -694, -694, -694, -88, -694, -694, -694, -85, -694, 240, - -694, -64, -694, -694, -694, -694, -694, -44, -694, -694, - -694, -694, -694, -50, -694, -694, -694, -89, -694, -694, - -694, -84, -694, 245, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -114, -694, -694, -694, -111, - 265, -694, -694, -54, -694, -694, -694, -694, -694, -107, - -694, -694, -694, -103, -694, 259, -43, -694, -42, -694, - -31, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -679, -694, - -694, -694, -694, -694, -694, -76, -694, -694, -694, -191, - -694, -694, -694, -694, -694, -694, -694, -82, -694, -694, - -694, -694, -694, -694, -694, -694, 122, 242, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -694, -694, -694, -694, -694, -694, -694, -694, -694, -694, - -32, -694, -694, -694, -196, -694, -694, -212, -694, -694, - -694, -694, -694, -694, -222, -694, -694, -235, -694, -694, - -694, -694, -694 + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -47, -703, 70, -703, -703, -703, + -703, -703, -703, -703, -703, 99, -703, -703, -703, -62, + -703, -703, -703, 230, -703, -703, -703, -703, 68, 248, + -30, -25, -24, -703, -703, -19, -703, -703, 73, 243, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, 67, -115, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -69, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -128, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -134, -703, -703, -703, -131, 204, -703, -703, -703, -703, + -703, -703, -703, -129, -703, -703, -703, -703, -703, -703, + -702, -703, -703, -703, -107, -703, -703, -703, -101, 255, + -703, -703, -703, -703, -703, -703, -703, -703, -682, -703, + -703, -703, -48, -703, -681, -703, -703, -703, -703, -703, + -703, -703, -703, -111, -703, -703, -229, -49, -703, -703, + -703, -703, -703, -103, -703, -703, -703, -100, -703, 225, + -703, -64, -703, -703, -703, -703, -703, -44, -703, -703, + -703, -703, -703, -50, -703, -703, -703, -98, -703, -703, + -703, -95, -703, 228, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -125, -703, -703, -703, -122, + 257, -703, -703, -45, -703, -703, -703, -703, -703, -703, + -703, -703, -124, -703, -703, -703, -123, -703, 252, -43, + -703, -42, -703, -31, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -677, -703, -703, -703, -703, -703, -703, -97, -703, + -703, -703, -212, -703, -703, -703, -703, -703, -703, -703, + -96, -703, -703, -703, -703, -703, -703, -703, -703, 109, + 220, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, + -703, -703, -703, -51, -703, -703, -703, -216, -703, -703, + -227, -703, -703, -703, -703, -703, -703, -230, -703, -703, + -246, -703, -703, -703, -703, -703 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 34, 35, 36, 61, 536, 77, - 78, 37, 60, 74, 75, 524, 668, 732, 733, 116, - 39, 62, 86, 87, 88, 304, 41, 63, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 312, 146, 147, - 43, 64, 148, 337, 149, 338, 527, 150, 339, 530, - 151, 126, 318, 127, 319, 597, 598, 599, 684, 819, - 600, 685, 601, 686, 602, 687, 603, 232, 374, 605, - 606, 607, 608, 609, 693, 610, 694, 128, 328, 633, - 634, 635, 636, 637, 638, 639, 129, 330, 644, 645, - 646, 715, 57, 71, 264, 265, 266, 387, 267, 388, - 130, 331, 653, 654, 655, 656, 657, 658, 659, 660, - 131, 324, 613, 614, 615, 698, 45, 65, 171, 172, - 173, 348, 174, 343, 175, 344, 176, 345, 177, 349, - 178, 350, 179, 354, 180, 353, 543, 181, 182, 132, - 327, 625, 626, 627, 707, 772, 773, 133, 325, 51, - 68, 617, 618, 619, 701, 53, 69, 233, 234, 235, - 236, 237, 238, 239, 373, 240, 377, 241, 376, 242, - 243, 378, 244, 134, 326, 621, 622, 623, 704, 55, - 70, 252, 253, 254, 255, 256, 382, 257, 258, 259, - 260, 184, 346, 670, 671, 672, 734, 47, 66, 195, - 196, 197, 359, 185, 347, 186, 355, 674, 675, 676, - 737, 49, 67, 209, 210, 211, 135, 315, 136, 316, - 137, 317, 215, 369, 216, 363, 217, 364, 218, 366, - 219, 365, 220, 368, 221, 367, 222, 362, 190, 356, - 678, 740, 138, 329, 641, 642, 712, 789, 790, 791, - 792, 793, 830, 139, 140, 333, 663, 664, 665, 726, - 666, 727, 141, 334, 59, 72, 283, 284, 285, 286, - 392, 287, 393, 288, 289, 395, 290, 291, 292, 398, - 569, 293, 399, 294, 295, 296, 297, 403, 576, 298, - 404, 89, 306, 90, 307, 91, 308, 92, 305, 581, - 582, 583, 680, 841, 842, 846, 855, 856, 857, 858, - 863, 859, 861, 873, 874, 875, 882, 883, 884, 889, - 885, 886, 887 + 22, 23, 24, 25, 34, 35, 36, 61, 540, 77, + 78, 37, 60, 74, 75, 528, 675, 739, 740, 116, + 39, 62, 86, 87, 88, 306, 41, 63, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 314, 146, 147, + 43, 64, 148, 339, 149, 340, 531, 150, 341, 534, + 151, 126, 320, 127, 321, 604, 605, 606, 691, 826, + 607, 692, 608, 693, 609, 694, 610, 234, 377, 612, + 613, 614, 615, 616, 700, 617, 701, 128, 330, 640, + 641, 642, 643, 644, 645, 646, 129, 332, 651, 652, + 653, 722, 57, 71, 266, 267, 268, 390, 269, 391, + 130, 333, 660, 661, 662, 663, 664, 665, 666, 667, + 131, 326, 620, 621, 622, 705, 45, 65, 171, 172, + 173, 350, 174, 345, 175, 346, 176, 347, 177, 351, + 178, 352, 179, 356, 180, 355, 547, 181, 182, 132, + 329, 632, 633, 634, 714, 779, 780, 133, 327, 51, + 68, 624, 625, 626, 708, 53, 69, 235, 236, 237, + 238, 239, 240, 241, 376, 242, 380, 243, 379, 244, + 245, 381, 246, 134, 328, 628, 629, 630, 711, 55, + 70, 254, 255, 256, 257, 258, 385, 259, 260, 261, + 262, 184, 348, 677, 678, 679, 741, 47, 66, 196, + 197, 198, 361, 185, 349, 200, 362, 554, 186, 357, + 681, 682, 683, 744, 49, 67, 211, 212, 213, 135, + 317, 136, 318, 137, 319, 217, 372, 218, 366, 219, + 367, 220, 369, 221, 368, 222, 371, 223, 370, 224, + 365, 190, 358, 685, 747, 138, 331, 648, 649, 719, + 796, 797, 798, 799, 800, 837, 139, 140, 335, 670, + 671, 672, 733, 673, 734, 141, 336, 59, 72, 285, + 286, 287, 288, 395, 289, 396, 290, 291, 398, 292, + 293, 294, 401, 576, 295, 402, 296, 297, 298, 299, + 406, 583, 300, 407, 89, 308, 90, 309, 91, 310, + 92, 307, 588, 589, 590, 687, 848, 849, 853, 862, + 863, 864, 865, 870, 866, 868, 880, 881, 882, 889, + 890, 891, 896, 892, 893, 894 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 85, 249, 79, 166, 192, 207, 250, 231, 248, 263, - 282, 26, 198, 73, 768, 183, 194, 208, 193, 223, - 769, 771, 187, 188, 212, 213, 251, 27, 778, 28, - 567, 29, 261, 262, 189, 167, 214, 76, 310, 335, - 168, 169, 93, 311, 336, 106, 170, 571, 572, 573, - 574, 94, 95, 96, 97, 98, 99, 100, 815, 816, - 817, 818, 225, 95, 96, 97, 98, 341, 96, 97, - 98, 299, 342, 101, 102, 103, 104, 105, 575, 38, - 710, 106, 107, 711, 101, 102, 103, 40, 105, 107, - 84, 42, 108, 107, 225, 357, 106, 107, 225, 300, - 358, 191, 156, 142, 143, 109, 110, 144, 158, 44, - 145, 360, 162, 46, 80, 163, 361, 713, 111, 163, - 714, 112, 781, 81, 82, 83, 48, 165, 113, 114, - 847, 568, 115, 848, 850, 768, 851, 852, 84, 261, - 262, 769, 771, 647, 648, 649, 650, 651, 652, 778, - 525, 526, 95, 96, 97, 98, 84, 301, 389, 405, - 96, 97, 98, 390, 406, 528, 529, 335, 30, 31, - 32, 33, 679, 101, 102, 103, 681, 84, 152, 153, - 154, 682, 107, 50, 84, 341, 695, 52, 84, 107, - 683, 696, 84, 155, 54, 156, 157, 158, 159, 160, - 161, 162, 225, 245, 226, 227, 246, 247, 163, 164, - 695, 876, 56, 199, 877, 697, 165, 200, 201, 202, - 203, 204, 205, 878, 206, 585, 879, 880, 881, 58, - 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, - 224, 628, 629, 630, 631, 302, 632, 724, 85, 303, - 225, 728, 725, 407, 408, 405, 729, 357, 828, 389, - 730, 360, 825, 829, 833, 225, 837, 226, 227, 864, - 893, 228, 229, 230, 865, 894, 309, 84, 661, 662, - 540, 541, 542, 313, 84, 314, 320, 321, 322, 323, - 332, 340, 351, 352, 375, 166, 84, 371, 192, 370, - 372, 379, 381, 380, 383, 384, 198, 183, 386, 207, - 194, 385, 193, 391, 187, 188, 394, 249, 396, 231, - 397, 208, 250, 400, 248, 401, 189, 167, 212, 213, - 402, 409, 168, 169, 410, 411, 412, 413, 170, 414, - 214, 416, 251, 282, 84, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 84, - 417, 418, 419, 420, 421, 504, 505, 506, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 422, 423, 424, 425, 428, 426, 427, 429, 430, 84, - 431, 432, 433, 434, 435, 437, 436, 438, 440, 441, - 442, 445, 443, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 460, 462, 463, 464, - 465, 466, 467, 468, 469, 471, 472, 473, 474, 475, - 476, 479, 483, 484, 487, 488, 490, 563, 493, 494, - 489, 498, 604, 604, 499, 477, 501, 480, 502, 596, - 596, 481, 503, 486, 578, 491, 495, 492, 507, 511, - 282, 512, 496, 508, 497, 513, 509, 514, 510, 515, - 516, 517, 518, 519, 531, 532, 520, 521, 522, 523, - 533, 534, 28, 545, 537, 538, 539, 544, 546, 547, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 580, 612, 616, 564, 565, 566, - 577, 620, 624, 640, 643, 570, 669, 673, 688, 677, - 689, 690, 691, 692, 700, 731, 699, 703, 702, 705, - 706, 708, 709, 717, 716, 718, 719, 720, 721, 722, - 723, 736, 535, 735, 739, 738, 742, 744, 741, 745, - 746, 747, 753, 748, 754, 804, 749, 805, 807, 808, - 814, 813, 826, 832, 579, 548, 827, 831, 870, 838, - 750, 840, 844, 862, 866, 868, 439, 890, 891, 872, - 892, 895, 584, 415, 820, 751, 752, 755, 444, 780, - 797, 798, 796, 799, 800, 801, 802, 867, 611, 821, - 795, 822, 823, 824, 834, 835, 485, 836, 803, 839, - 757, 756, 779, 843, 459, 759, 758, 761, 849, 871, - 760, 478, 810, 809, 897, 461, 604, 898, 896, 900, - 470, 482, 812, 596, 811, 249, 166, 794, 767, 231, - 250, 845, 248, 783, 667, 762, 806, 500, 183, 743, - 782, 860, 869, 263, 888, 187, 188, 774, 899, 770, - 251, 0, 785, 784, 775, 776, 0, 189, 167, 786, - 787, 0, 192, 168, 169, 207, 777, 763, 0, 170, - 198, 788, 764, 765, 194, 0, 193, 208, 766, 0, - 0, 0, 0, 0, 212, 213, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, + 85, 251, 79, 166, 193, 209, 252, 233, 250, 265, + 284, 717, 775, 73, 718, 183, 195, 210, 194, 225, + 574, 199, 187, 188, 214, 215, 253, 27, 38, 28, + 26, 29, 776, 778, 189, 167, 216, 785, 312, 93, + 168, 169, 720, 313, 40, 721, 170, 107, 94, 95, + 96, 97, 98, 99, 100, 263, 264, 337, 42, 191, + 156, 192, 338, 95, 96, 97, 98, 544, 545, 546, + 101, 102, 103, 104, 105, 343, 163, 359, 106, 107, + 344, 76, 360, 44, 101, 102, 103, 885, 105, 108, + 886, 887, 888, 107, 227, 227, 247, 228, 229, 248, + 249, 263, 264, 142, 143, 109, 110, 144, 363, 46, + 145, 158, 84, 364, 226, 162, 80, 854, 111, 48, + 855, 112, 163, 50, 575, 81, 82, 83, 113, 114, + 165, 52, 115, 775, 95, 96, 97, 98, 392, 227, + 84, 228, 229, 393, 84, 230, 231, 232, 54, 96, + 97, 98, 578, 776, 778, 101, 102, 103, 785, 56, + 152, 153, 154, 227, 107, 529, 530, 96, 97, 98, + 30, 31, 32, 33, 58, 155, 84, 156, 107, 532, + 533, 157, 158, 159, 160, 161, 162, 408, 552, 553, + 84, 84, 409, 163, 164, 106, 107, 227, 337, 688, + 106, 165, 302, 686, 689, 201, 579, 580, 581, 202, + 203, 204, 205, 206, 207, 301, 208, 343, 702, 304, + 592, 303, 690, 703, 788, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 84, 582, 857, 305, 858, + 859, 635, 636, 637, 638, 227, 639, 702, 731, 735, + 85, 311, 704, 732, 736, 410, 411, 883, 373, 84, + 884, 84, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 315, 84, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 408, 359, 374, 84, 835, 737, 832, 166, 316, 836, + 322, 193, 654, 655, 656, 657, 658, 659, 323, 183, + 324, 325, 209, 195, 334, 194, 187, 188, 199, 84, + 251, 392, 233, 375, 210, 252, 840, 250, 189, 167, + 342, 214, 215, 363, 168, 169, 353, 871, 844, 900, + 170, 84, 872, 216, 901, 253, 284, 822, 823, 824, + 825, 668, 669, 354, 378, 382, 383, 384, 412, 386, + 387, 388, 389, 420, 394, 397, 399, 400, 508, 509, + 510, 403, 404, 405, 413, 414, 415, 416, 417, 419, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 440, 441, + 439, 443, 444, 445, 446, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 463, + 464, 466, 467, 468, 469, 470, 471, 472, 473, 475, + 476, 477, 478, 479, 480, 481, 483, 484, 487, 488, + 491, 570, 492, 485, 490, 494, 611, 611, 493, 495, + 496, 497, 498, 603, 603, 502, 499, 503, 585, 500, + 501, 505, 506, 507, 284, 511, 515, 516, 512, 513, + 514, 517, 518, 519, 520, 521, 522, 523, 755, 535, + 524, 525, 526, 527, 538, 536, 537, 28, 541, 542, + 543, 548, 549, 550, 551, 556, 619, 623, 627, 631, + 557, 647, 650, 676, 680, 558, 559, 695, 696, 697, + 698, 699, 560, 561, 562, 706, 707, 709, 710, 713, + 712, 716, 539, 715, 563, 723, 724, 742, 684, 725, + 564, 565, 566, 567, 726, 727, 728, 729, 730, 743, + 746, 745, 418, 749, 568, 751, 748, 752, 569, 753, + 754, 577, 760, 761, 811, 812, 820, 571, 572, 814, + 815, 821, 587, 833, 839, 555, 834, 838, 845, 847, + 851, 869, 873, 875, 586, 573, 877, 879, 897, 898, + 899, 584, 902, 618, 591, 442, 447, 762, 738, 787, + 803, 802, 757, 756, 759, 758, 489, 903, 804, 805, + 764, 806, 810, 807, 763, 786, 850, 766, 765, 482, + 808, 809, 827, 828, 462, 768, 767, 486, 817, 816, + 465, 818, 819, 801, 829, 830, 474, 852, 504, 831, + 841, 842, 843, 611, 874, 674, 846, 750, 867, 813, + 603, 856, 251, 166, 876, 774, 233, 252, 878, 250, + 790, 904, 769, 895, 906, 183, 907, 789, 0, 905, + 265, 0, 187, 188, 781, 0, 777, 253, 0, 792, + 791, 782, 783, 0, 189, 167, 793, 794, 0, 193, + 168, 169, 209, 784, 770, 0, 170, 0, 795, 771, + 772, 195, 0, 194, 210, 773, 199, 0, 0, 0, + 0, 214, 215, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 767, - 0, 0, 0, 783, 0, 0, 762, 0, 0, 0, - 782, 0, 0, 0, 0, 0, 0, 854, 774, 0, - 770, 0, 785, 784, 853, 775, 776, 0, 0, 786, - 787, 0, 0, 0, 0, 854, 0, 777, 763, 0, - 0, 788, 853, 764, 765, 0, 0, 0, 0, 766 + 0, 0, 0, 0, 0, 0, 774, 0, 0, 0, + 790, 0, 0, 769, 0, 0, 0, 789, 0, 0, + 0, 0, 0, 0, 861, 781, 0, 777, 0, 792, + 791, 860, 782, 783, 0, 0, 793, 794, 0, 0, + 0, 0, 861, 0, 784, 770, 0, 0, 795, 860, + 771, 772, 0, 0, 0, 0, 773 }; const short int Dhcp4Parser::yycheck_[] = { 62, 70, 10, 65, 66, 67, 70, 69, 70, 71, - 72, 0, 66, 60, 707, 65, 66, 67, 66, 68, - 707, 707, 65, 65, 67, 67, 70, 5, 707, 7, - 15, 9, 88, 89, 65, 65, 67, 146, 3, 3, - 65, 65, 11, 8, 8, 50, 65, 118, 119, 120, - 121, 20, 21, 22, 23, 24, 25, 26, 28, 29, - 30, 31, 52, 21, 22, 23, 24, 3, 22, 23, - 24, 6, 8, 42, 43, 44, 45, 46, 149, 7, - 3, 50, 51, 6, 42, 43, 44, 7, 46, 51, - 146, 7, 61, 51, 52, 3, 50, 51, 52, 3, - 8, 63, 64, 12, 13, 74, 75, 16, 66, 7, - 19, 3, 70, 7, 122, 77, 8, 3, 87, 77, - 6, 90, 76, 131, 132, 133, 7, 85, 97, 98, - 3, 116, 101, 6, 124, 828, 126, 127, 146, 88, - 89, 828, 828, 91, 92, 93, 94, 95, 96, 828, - 14, 15, 21, 22, 23, 24, 146, 4, 3, 3, - 22, 23, 24, 8, 8, 17, 18, 3, 146, 147, - 148, 149, 8, 42, 43, 44, 3, 146, 47, 48, - 49, 8, 51, 7, 146, 3, 3, 7, 146, 51, - 8, 8, 146, 62, 7, 64, 65, 66, 67, 68, - 69, 70, 52, 53, 54, 55, 56, 57, 77, 78, - 3, 3, 7, 75, 6, 8, 85, 79, 80, 81, - 82, 83, 84, 125, 86, 27, 128, 129, 130, 7, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 27, 79, 80, 81, 82, 8, 84, 3, 310, 3, - 52, 3, 8, 300, 301, 3, 8, 3, 3, 3, - 8, 3, 8, 8, 8, 52, 8, 54, 55, 3, - 3, 58, 59, 60, 8, 8, 4, 146, 99, 100, - 71, 72, 73, 4, 146, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 357, 146, 3, 360, 8, - 8, 4, 3, 8, 4, 4, 360, 357, 3, 371, - 360, 8, 360, 4, 357, 357, 4, 386, 4, 381, - 4, 371, 386, 4, 386, 4, 357, 357, 371, 371, - 4, 146, 357, 357, 4, 4, 4, 4, 357, 4, - 371, 4, 386, 405, 146, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 146, - 149, 149, 4, 4, 4, 412, 413, 414, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 4, 4, 147, 147, 4, 147, 147, 4, 4, 146, - 4, 4, 4, 4, 4, 4, 147, 4, 4, 4, - 4, 4, 149, 4, 4, 4, 4, 4, 4, 4, - 147, 149, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 147, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 484, 4, 4, - 147, 4, 511, 512, 4, 149, 4, 149, 7, 511, - 512, 149, 7, 149, 501, 147, 149, 147, 7, 7, - 522, 7, 149, 146, 149, 5, 146, 5, 146, 5, - 5, 5, 5, 5, 146, 146, 7, 7, 7, 5, - 146, 5, 7, 5, 146, 146, 146, 146, 7, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 123, 7, 7, 146, 146, 146, - 146, 7, 7, 7, 7, 117, 7, 7, 4, 86, - 4, 4, 4, 4, 3, 146, 6, 3, 6, 6, - 3, 6, 3, 3, 6, 4, 4, 4, 4, 4, - 4, 3, 449, 6, 3, 6, 4, 4, 8, 4, - 4, 4, 4, 147, 4, 4, 149, 4, 6, 3, - 5, 4, 8, 3, 502, 462, 8, 8, 5, 8, - 147, 7, 4, 4, 4, 4, 335, 4, 4, 7, - 4, 4, 507, 310, 146, 149, 147, 695, 341, 710, - 147, 147, 717, 147, 147, 147, 147, 147, 512, 146, - 715, 146, 146, 146, 146, 146, 389, 146, 724, 146, - 700, 698, 709, 828, 357, 703, 701, 706, 146, 146, - 704, 381, 736, 734, 147, 360, 695, 147, 149, 146, - 371, 386, 739, 695, 737, 704, 698, 713, 707, 701, - 704, 832, 704, 712, 522, 707, 728, 405, 698, 681, - 712, 847, 864, 715, 876, 698, 698, 707, 893, 707, - 704, -1, 712, 712, 707, 707, -1, 698, 698, 712, - 712, -1, 734, 698, 698, 737, 707, 707, -1, 698, - 734, 712, 707, 707, 734, -1, 734, 737, 707, -1, - -1, -1, -1, -1, 737, 737, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 737, -1, -1, -1, + 72, 3, 714, 60, 6, 65, 66, 67, 66, 68, + 15, 66, 65, 65, 67, 67, 70, 5, 7, 7, + 0, 9, 714, 714, 65, 65, 67, 714, 3, 11, + 65, 65, 3, 8, 7, 6, 65, 51, 20, 21, + 22, 23, 24, 25, 26, 91, 92, 3, 7, 63, + 64, 65, 8, 21, 22, 23, 24, 74, 75, 76, + 42, 43, 44, 45, 46, 3, 80, 3, 50, 51, + 8, 148, 8, 7, 42, 43, 44, 127, 46, 61, + 130, 131, 132, 51, 52, 52, 53, 54, 55, 56, + 57, 91, 92, 12, 13, 77, 78, 16, 3, 7, + 19, 69, 148, 8, 27, 73, 124, 3, 90, 7, + 6, 93, 80, 7, 119, 133, 134, 135, 100, 101, + 88, 7, 104, 835, 21, 22, 23, 24, 3, 52, + 148, 54, 55, 8, 148, 58, 59, 60, 7, 22, + 23, 24, 67, 835, 835, 42, 43, 44, 835, 7, + 47, 48, 49, 52, 51, 14, 15, 22, 23, 24, + 148, 149, 150, 151, 7, 62, 148, 64, 51, 17, + 18, 68, 69, 70, 71, 72, 73, 3, 66, 67, + 148, 148, 8, 80, 81, 50, 51, 52, 3, 3, + 50, 88, 3, 8, 8, 78, 121, 122, 123, 82, + 83, 84, 85, 86, 87, 6, 89, 3, 3, 8, + 27, 4, 8, 8, 79, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 148, 151, 126, 3, 128, + 129, 82, 83, 84, 85, 52, 87, 3, 3, 3, + 312, 4, 8, 8, 8, 302, 303, 3, 8, 148, + 6, 148, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 4, 148, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 3, 3, 3, 148, 3, 8, 8, 359, 4, 8, + 4, 363, 94, 95, 96, 97, 98, 99, 4, 359, + 4, 4, 374, 363, 4, 363, 359, 359, 363, 148, + 389, 3, 384, 8, 374, 389, 8, 389, 359, 359, + 4, 374, 374, 3, 359, 359, 4, 3, 8, 3, + 359, 148, 8, 374, 8, 389, 408, 28, 29, 30, + 31, 102, 103, 4, 4, 4, 8, 3, 148, 4, + 4, 8, 3, 151, 4, 4, 4, 4, 415, 416, + 417, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 151, 4, 4, 4, 4, 4, 149, 149, 149, 149, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 149, 4, 4, 4, 151, 4, 4, 4, 4, 4, + 4, 4, 4, 149, 151, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 149, 4, 4, 4, 151, 4, 151, 4, 4, + 4, 488, 4, 151, 151, 4, 515, 516, 149, 149, + 149, 4, 4, 515, 516, 4, 151, 4, 505, 151, + 151, 4, 7, 7, 526, 7, 7, 7, 148, 148, + 148, 5, 5, 5, 5, 5, 5, 5, 149, 148, + 7, 7, 7, 5, 5, 148, 148, 7, 148, 148, + 148, 148, 5, 7, 148, 148, 7, 7, 7, 7, + 148, 7, 7, 7, 7, 148, 148, 4, 4, 4, + 4, 4, 148, 148, 148, 6, 3, 6, 3, 3, + 6, 3, 452, 6, 148, 6, 3, 6, 89, 4, + 148, 148, 148, 148, 4, 4, 4, 4, 4, 3, + 3, 6, 312, 4, 148, 4, 8, 4, 148, 4, + 4, 120, 4, 4, 4, 4, 4, 148, 148, 6, + 3, 5, 125, 8, 3, 466, 8, 8, 8, 7, + 4, 4, 4, 4, 506, 148, 5, 7, 4, 4, + 4, 148, 4, 516, 511, 337, 343, 702, 148, 717, + 724, 722, 149, 151, 149, 151, 392, 151, 149, 149, + 707, 149, 731, 149, 705, 716, 835, 710, 708, 384, + 149, 149, 148, 148, 359, 713, 711, 389, 743, 741, + 363, 744, 746, 720, 148, 148, 374, 839, 408, 148, + 148, 148, 148, 702, 149, 526, 148, 688, 854, 735, + 702, 148, 711, 705, 871, 714, 708, 711, 148, 711, + 719, 149, 714, 883, 900, 705, 148, 719, -1, 149, + 722, -1, 705, 705, 714, -1, 714, 711, -1, 719, + 719, 714, 714, -1, 705, 705, 719, 719, -1, 741, + 705, 705, 744, 714, 714, -1, 705, -1, 719, 714, + 714, 741, -1, 741, 744, 714, 741, -1, -1, -1, + -1, 744, 744, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 744, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 828, - -1, -1, -1, 832, -1, -1, 828, -1, -1, -1, - 832, -1, -1, -1, -1, -1, -1, 846, 828, -1, - 828, -1, 832, 832, 846, 828, 828, -1, -1, 832, - 832, -1, -1, -1, -1, 864, -1, 828, 828, -1, - -1, 832, 864, 828, 828, -1, -1, -1, -1, 828 + -1, -1, -1, -1, -1, -1, 835, -1, -1, -1, + 839, -1, -1, 835, -1, -1, -1, 839, -1, -1, + -1, -1, -1, -1, 853, 835, -1, 835, -1, 839, + 839, 853, 835, 835, -1, -1, 839, 839, -1, -1, + -1, -1, 871, -1, 835, 835, -1, -1, 839, 871, + 835, 835, -1, -1, -1, -1, 835 }; const unsigned short int Dhcp4Parser::yystos_[] = { - 0, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 0, 5, 7, 9, - 146, 147, 148, 149, 164, 165, 166, 171, 7, 180, - 7, 186, 7, 200, 7, 276, 7, 357, 7, 371, - 7, 309, 7, 315, 7, 339, 7, 252, 7, 424, - 172, 167, 181, 187, 201, 277, 358, 372, 310, 316, - 340, 253, 425, 164, 173, 174, 146, 169, 170, 10, - 122, 131, 132, 133, 146, 179, 182, 183, 184, 451, - 453, 455, 457, 11, 20, 21, 22, 23, 24, 25, - 26, 42, 43, 44, 45, 46, 50, 51, 61, 74, - 75, 87, 90, 97, 98, 101, 179, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 211, 213, 237, 246, - 260, 270, 299, 307, 333, 376, 378, 380, 402, 413, - 414, 422, 12, 13, 16, 19, 198, 199, 202, 204, - 207, 210, 47, 48, 49, 62, 64, 65, 66, 67, - 68, 69, 70, 77, 78, 85, 179, 190, 191, 192, - 195, 278, 279, 280, 282, 284, 286, 288, 290, 292, - 294, 297, 298, 333, 351, 363, 365, 376, 378, 380, - 398, 63, 179, 292, 333, 359, 360, 361, 363, 75, - 79, 80, 81, 82, 83, 84, 86, 179, 333, 373, - 374, 375, 376, 378, 380, 382, 384, 386, 388, 390, - 392, 394, 396, 307, 27, 52, 54, 55, 58, 59, - 60, 179, 227, 317, 318, 319, 320, 321, 322, 323, - 325, 327, 329, 330, 332, 53, 56, 57, 179, 227, - 321, 327, 341, 342, 343, 344, 345, 347, 348, 349, - 350, 88, 89, 179, 254, 255, 256, 258, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 179, 426, 427, 428, 429, 431, 433, 434, - 436, 437, 438, 441, 443, 444, 445, 446, 449, 6, - 3, 4, 8, 3, 185, 458, 452, 454, 456, 4, - 3, 8, 197, 4, 4, 377, 379, 381, 212, 214, - 4, 4, 4, 4, 271, 308, 334, 300, 238, 403, - 247, 261, 4, 415, 423, 3, 8, 203, 205, 208, - 4, 3, 8, 283, 285, 287, 352, 364, 281, 289, - 291, 4, 4, 295, 293, 366, 399, 3, 8, 362, - 3, 8, 397, 385, 387, 391, 389, 395, 393, 383, - 8, 3, 8, 324, 228, 4, 328, 326, 331, 4, - 8, 3, 346, 4, 4, 8, 3, 257, 259, 3, - 8, 4, 430, 432, 4, 435, 4, 4, 439, 442, - 4, 4, 4, 447, 450, 3, 8, 164, 164, 146, - 4, 4, 4, 4, 4, 183, 4, 149, 149, 4, - 4, 4, 4, 4, 147, 147, 147, 147, 4, 4, - 4, 4, 4, 4, 4, 4, 147, 4, 4, 189, - 4, 4, 4, 149, 199, 4, 4, 4, 4, 4, - 4, 4, 4, 147, 149, 4, 4, 4, 4, 279, - 4, 360, 4, 4, 4, 4, 4, 4, 4, 4, - 375, 4, 4, 147, 4, 4, 4, 149, 319, 4, - 149, 149, 343, 4, 4, 255, 149, 4, 4, 147, - 4, 147, 147, 4, 4, 149, 149, 149, 4, 4, - 427, 4, 7, 7, 164, 164, 164, 7, 146, 146, - 146, 7, 7, 5, 5, 5, 5, 5, 5, 5, - 7, 7, 7, 5, 175, 14, 15, 206, 17, 18, - 209, 146, 146, 146, 5, 166, 168, 146, 146, 146, - 71, 72, 73, 296, 146, 5, 7, 146, 175, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 164, 146, 146, 146, 15, 116, 440, - 117, 118, 119, 120, 121, 149, 448, 146, 164, 188, - 123, 459, 460, 461, 198, 27, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 179, 215, 216, 217, - 220, 222, 224, 226, 227, 229, 230, 231, 232, 233, - 235, 215, 7, 272, 273, 274, 7, 311, 312, 313, - 7, 335, 336, 337, 7, 301, 302, 303, 79, 80, - 81, 82, 84, 239, 240, 241, 242, 243, 244, 245, - 7, 404, 405, 7, 248, 249, 250, 91, 92, 93, - 94, 95, 96, 262, 263, 264, 265, 266, 267, 268, - 269, 99, 100, 416, 417, 418, 420, 426, 176, 7, - 353, 354, 355, 7, 367, 368, 369, 86, 400, 8, - 462, 3, 8, 8, 218, 221, 223, 225, 4, 4, - 4, 4, 4, 234, 236, 3, 8, 8, 275, 6, - 3, 314, 6, 3, 338, 6, 3, 304, 6, 3, - 3, 6, 406, 3, 6, 251, 6, 3, 4, 4, - 4, 4, 4, 4, 3, 8, 419, 421, 3, 8, - 8, 146, 177, 178, 356, 6, 3, 370, 6, 3, - 401, 8, 4, 460, 4, 4, 4, 4, 147, 149, - 147, 149, 147, 4, 4, 216, 278, 274, 317, 313, - 341, 337, 179, 190, 191, 192, 195, 227, 270, 288, - 292, 294, 305, 306, 333, 376, 378, 380, 398, 303, - 240, 76, 179, 227, 307, 333, 376, 378, 380, 407, - 408, 409, 410, 411, 405, 254, 250, 147, 147, 147, - 147, 147, 147, 263, 4, 4, 417, 6, 3, 359, - 355, 373, 369, 4, 5, 28, 29, 30, 31, 219, - 146, 146, 146, 146, 146, 8, 8, 8, 3, 8, - 412, 8, 3, 8, 146, 146, 146, 8, 8, 146, - 7, 463, 464, 306, 4, 409, 465, 3, 6, 146, - 124, 126, 127, 179, 227, 466, 467, 468, 469, 471, - 464, 472, 4, 470, 3, 8, 4, 147, 4, 467, - 5, 146, 7, 473, 474, 475, 3, 6, 125, 128, - 129, 130, 476, 477, 478, 480, 481, 482, 474, 479, - 4, 4, 4, 3, 8, 4, 149, 147, 147, 477, - 146 + 0, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 0, 5, 7, 9, + 148, 149, 150, 151, 166, 167, 168, 173, 7, 182, + 7, 188, 7, 202, 7, 278, 7, 359, 7, 376, + 7, 311, 7, 317, 7, 341, 7, 254, 7, 429, + 174, 169, 183, 189, 203, 279, 360, 377, 312, 318, + 342, 255, 430, 166, 175, 176, 148, 171, 172, 10, + 124, 133, 134, 135, 148, 181, 184, 185, 186, 456, + 458, 460, 462, 11, 20, 21, 22, 23, 24, 25, + 26, 42, 43, 44, 45, 46, 50, 51, 61, 77, + 78, 90, 93, 100, 101, 104, 181, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 213, 215, 239, 248, + 262, 272, 301, 309, 335, 381, 383, 385, 407, 418, + 419, 427, 12, 13, 16, 19, 200, 201, 204, 206, + 209, 212, 47, 48, 49, 62, 64, 68, 69, 70, + 71, 72, 73, 80, 81, 88, 181, 192, 193, 194, + 197, 280, 281, 282, 284, 286, 288, 290, 292, 294, + 296, 299, 300, 335, 353, 365, 370, 381, 383, 385, + 403, 63, 65, 181, 294, 335, 361, 362, 363, 365, + 367, 78, 82, 83, 84, 85, 86, 87, 89, 181, + 335, 378, 379, 380, 381, 383, 385, 387, 389, 391, + 393, 395, 397, 399, 401, 309, 27, 52, 54, 55, + 58, 59, 60, 181, 229, 319, 320, 321, 322, 323, + 324, 325, 327, 329, 331, 332, 334, 53, 56, 57, + 181, 229, 323, 329, 343, 344, 345, 346, 347, 349, + 350, 351, 352, 91, 92, 181, 256, 257, 258, 260, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 181, 431, 432, 433, 434, 436, + 438, 439, 441, 442, 443, 446, 448, 449, 450, 451, + 454, 6, 3, 4, 8, 3, 187, 463, 457, 459, + 461, 4, 3, 8, 199, 4, 4, 382, 384, 386, + 214, 216, 4, 4, 4, 4, 273, 310, 336, 302, + 240, 408, 249, 263, 4, 420, 428, 3, 8, 205, + 207, 210, 4, 3, 8, 285, 287, 289, 354, 366, + 283, 291, 293, 4, 4, 297, 295, 371, 404, 3, + 8, 364, 368, 3, 8, 402, 390, 392, 396, 394, + 400, 398, 388, 8, 3, 8, 326, 230, 4, 330, + 328, 333, 4, 8, 3, 348, 4, 4, 8, 3, + 259, 261, 3, 8, 4, 435, 437, 4, 440, 4, + 4, 444, 447, 4, 4, 4, 452, 455, 3, 8, + 166, 166, 148, 4, 4, 4, 4, 4, 185, 4, + 151, 151, 4, 4, 4, 4, 4, 149, 149, 149, + 149, 4, 4, 4, 4, 4, 4, 4, 4, 149, + 4, 4, 191, 4, 4, 4, 151, 201, 4, 4, + 4, 4, 4, 4, 4, 4, 149, 151, 4, 4, + 4, 4, 281, 4, 4, 362, 4, 4, 4, 4, + 4, 4, 4, 4, 380, 4, 4, 149, 4, 4, + 4, 151, 321, 4, 151, 151, 345, 4, 4, 257, + 151, 4, 4, 149, 4, 149, 149, 4, 4, 151, + 151, 151, 4, 4, 432, 4, 7, 7, 166, 166, + 166, 7, 148, 148, 148, 7, 7, 5, 5, 5, + 5, 5, 5, 5, 7, 7, 7, 5, 177, 14, + 15, 208, 17, 18, 211, 148, 148, 148, 5, 168, + 170, 148, 148, 148, 74, 75, 76, 298, 148, 5, + 7, 148, 66, 67, 369, 177, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 166, 148, 148, 148, 15, 119, 445, 120, 67, 121, + 122, 123, 151, 453, 148, 166, 190, 125, 464, 465, + 466, 200, 27, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 181, 217, 218, 219, 222, 224, 226, + 228, 229, 231, 232, 233, 234, 235, 237, 217, 7, + 274, 275, 276, 7, 313, 314, 315, 7, 337, 338, + 339, 7, 303, 304, 305, 82, 83, 84, 85, 87, + 241, 242, 243, 244, 245, 246, 247, 7, 409, 410, + 7, 250, 251, 252, 94, 95, 96, 97, 98, 99, + 264, 265, 266, 267, 268, 269, 270, 271, 102, 103, + 421, 422, 423, 425, 431, 178, 7, 355, 356, 357, + 7, 372, 373, 374, 89, 405, 8, 467, 3, 8, + 8, 220, 223, 225, 227, 4, 4, 4, 4, 4, + 236, 238, 3, 8, 8, 277, 6, 3, 316, 6, + 3, 340, 6, 3, 306, 6, 3, 3, 6, 411, + 3, 6, 253, 6, 3, 4, 4, 4, 4, 4, + 4, 3, 8, 424, 426, 3, 8, 8, 148, 179, + 180, 358, 6, 3, 375, 6, 3, 406, 8, 4, + 465, 4, 4, 4, 4, 149, 151, 149, 151, 149, + 4, 4, 218, 280, 276, 319, 315, 343, 339, 181, + 192, 193, 194, 197, 229, 272, 290, 294, 296, 307, + 308, 335, 381, 383, 385, 403, 305, 242, 79, 181, + 229, 309, 335, 381, 383, 385, 412, 413, 414, 415, + 416, 410, 256, 252, 149, 149, 149, 149, 149, 149, + 265, 4, 4, 422, 6, 3, 361, 357, 378, 374, + 4, 5, 28, 29, 30, 31, 221, 148, 148, 148, + 148, 148, 8, 8, 8, 3, 8, 417, 8, 3, + 8, 148, 148, 148, 8, 8, 148, 7, 468, 469, + 308, 4, 414, 470, 3, 6, 148, 126, 128, 129, + 181, 229, 471, 472, 473, 474, 476, 469, 477, 4, + 475, 3, 8, 4, 149, 4, 472, 5, 148, 7, + 478, 479, 480, 3, 6, 127, 130, 131, 132, 481, + 482, 483, 485, 486, 487, 479, 484, 4, 4, 4, + 3, 8, 4, 151, 149, 149, 482, 148 }; const unsigned short int Dhcp4Parser::yyr1_[] = { - 0, 150, 152, 151, 153, 151, 154, 151, 155, 151, - 156, 151, 157, 151, 158, 151, 159, 151, 160, 151, - 161, 151, 162, 151, 163, 151, 164, 164, 164, 164, - 164, 164, 164, 165, 167, 166, 168, 169, 169, 170, - 170, 172, 171, 173, 173, 174, 174, 176, 175, 177, - 177, 178, 178, 179, 181, 180, 182, 182, 183, 183, - 183, 183, 183, 183, 185, 184, 187, 186, 188, 188, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 190, 191, 192, 193, 194, 195, - 197, 196, 198, 198, 199, 199, 199, 199, 201, 200, - 203, 202, 205, 204, 206, 206, 208, 207, 209, 209, - 210, 212, 211, 214, 213, 215, 215, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 218, 217, 219, 219, 219, 219, 221, 220, 223, 222, - 225, 224, 226, 228, 227, 229, 230, 231, 232, 234, - 233, 236, 235, 238, 237, 239, 239, 240, 240, 240, - 240, 240, 241, 242, 243, 244, 245, 247, 246, 248, - 248, 249, 249, 251, 250, 253, 252, 254, 254, 254, - 255, 255, 257, 256, 259, 258, 261, 260, 262, 262, - 263, 263, 263, 263, 263, 263, 264, 265, 266, 267, - 268, 269, 271, 270, 272, 272, 273, 273, 275, 274, - 277, 276, 278, 278, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 279, 279, 279, 279, 281, 280, 283, - 282, 285, 284, 287, 286, 289, 288, 291, 290, 293, - 292, 295, 294, 296, 296, 296, 297, 298, 300, 299, - 301, 301, 302, 302, 304, 303, 305, 305, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 308, 307, 310, 309, 311, 311, 312, - 312, 314, 313, 316, 315, 317, 317, 318, 318, 319, - 319, 319, 319, 319, 319, 319, 319, 320, 321, 322, - 324, 323, 326, 325, 328, 327, 329, 331, 330, 332, - 334, 333, 335, 335, 336, 336, 338, 337, 340, 339, - 341, 341, 342, 342, 343, 343, 343, 343, 343, 343, - 343, 344, 346, 345, 347, 348, 349, 350, 352, 351, - 353, 353, 354, 354, 356, 355, 358, 357, 359, 359, - 360, 360, 360, 360, 360, 362, 361, 364, 363, 366, - 365, 367, 367, 368, 368, 370, 369, 372, 371, 373, - 373, 374, 374, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 377, 376, 379, 378, - 381, 380, 383, 382, 385, 384, 387, 386, 389, 388, - 391, 390, 393, 392, 395, 394, 397, 396, 399, 398, - 401, 400, 403, 402, 404, 404, 406, 405, 407, 407, - 408, 408, 409, 409, 409, 409, 409, 409, 409, 409, - 410, 412, 411, 413, 415, 414, 416, 416, 417, 417, - 419, 418, 421, 420, 423, 422, 425, 424, 426, 426, - 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - 427, 427, 427, 427, 427, 428, 430, 429, 432, 431, - 433, 435, 434, 436, 437, 439, 438, 440, 440, 442, - 441, 443, 444, 445, 447, 446, 448, 448, 448, 448, - 448, 450, 449, 452, 451, 454, 453, 456, 455, 458, - 457, 459, 459, 460, 462, 461, 463, 463, 465, 464, - 466, 466, 467, 467, 467, 467, 467, 468, 470, 469, - 472, 471, 473, 473, 475, 474, 476, 476, 477, 477, - 477, 477, 479, 478, 480, 481, 482 + 0, 152, 154, 153, 155, 153, 156, 153, 157, 153, + 158, 153, 159, 153, 160, 153, 161, 153, 162, 153, + 163, 153, 164, 153, 165, 153, 166, 166, 166, 166, + 166, 166, 166, 167, 169, 168, 170, 171, 171, 172, + 172, 174, 173, 175, 175, 176, 176, 178, 177, 179, + 179, 180, 180, 181, 183, 182, 184, 184, 185, 185, + 185, 185, 185, 185, 187, 186, 189, 188, 190, 190, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 192, 193, 194, 195, 196, 197, + 199, 198, 200, 200, 201, 201, 201, 201, 203, 202, + 205, 204, 207, 206, 208, 208, 210, 209, 211, 211, + 212, 214, 213, 216, 215, 217, 217, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 220, 219, 221, 221, 221, 221, 223, 222, 225, 224, + 227, 226, 228, 230, 229, 231, 232, 233, 234, 236, + 235, 238, 237, 240, 239, 241, 241, 242, 242, 242, + 242, 242, 243, 244, 245, 246, 247, 249, 248, 250, + 250, 251, 251, 253, 252, 255, 254, 256, 256, 256, + 257, 257, 259, 258, 261, 260, 263, 262, 264, 264, + 265, 265, 265, 265, 265, 265, 266, 267, 268, 269, + 270, 271, 273, 272, 274, 274, 275, 275, 277, 276, + 279, 278, 280, 280, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 283, 282, 285, + 284, 287, 286, 289, 288, 291, 290, 293, 292, 295, + 294, 297, 296, 298, 298, 298, 299, 300, 302, 301, + 303, 303, 304, 304, 306, 305, 307, 307, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 310, 309, 312, 311, 313, 313, 314, + 314, 316, 315, 318, 317, 319, 319, 320, 320, 321, + 321, 321, 321, 321, 321, 321, 321, 322, 323, 324, + 326, 325, 328, 327, 330, 329, 331, 333, 332, 334, + 336, 335, 337, 337, 338, 338, 340, 339, 342, 341, + 343, 343, 344, 344, 345, 345, 345, 345, 345, 345, + 345, 346, 348, 347, 349, 350, 351, 352, 354, 353, + 355, 355, 356, 356, 358, 357, 360, 359, 361, 361, + 362, 362, 362, 362, 362, 362, 364, 363, 366, 365, + 368, 367, 369, 369, 371, 370, 372, 372, 373, 373, + 375, 374, 377, 376, 378, 378, 379, 379, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 382, 381, 384, 383, 386, 385, 388, 387, 390, + 389, 392, 391, 394, 393, 396, 395, 398, 397, 400, + 399, 402, 401, 404, 403, 406, 405, 408, 407, 409, + 409, 411, 410, 412, 412, 413, 413, 414, 414, 414, + 414, 414, 414, 414, 414, 415, 417, 416, 418, 420, + 419, 421, 421, 422, 422, 424, 423, 426, 425, 428, + 427, 430, 429, 431, 431, 432, 432, 432, 432, 432, + 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, + 433, 435, 434, 437, 436, 438, 440, 439, 441, 442, + 444, 443, 445, 445, 447, 446, 448, 449, 450, 452, + 451, 453, 453, 453, 453, 453, 455, 454, 457, 456, + 459, 458, 461, 460, 463, 462, 464, 464, 465, 467, + 466, 468, 468, 470, 469, 471, 471, 472, 472, 472, + 472, 472, 473, 475, 474, 477, 476, 478, 478, 480, + 479, 481, 481, 482, 482, 482, 482, 484, 483, 485, + 486, 487 }; const unsigned char @@ -4129,25 +4171,26 @@ namespace isc { namespace dhcp { 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, - 0, 4, 0, 6, 1, 3, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 3, 0, 6, 1, 3, 1, 1, - 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, + 0, 4, 1, 1, 0, 6, 0, 1, 1, 3, + 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 0, 4, 0, 4, - 3, 0, 4, 3, 3, 0, 4, 1, 1, 0, - 4, 3, 3, 3, 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 6, 1, 3, 1, 0, 6, 1, 3, 0, 4, - 1, 3, 1, 1, 1, 1, 1, 3, 0, 4, - 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, - 1, 1, 0, 4, 3, 3, 3 + 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, + 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 3, 0, + 6, 1, 3, 1, 1, 0, 4, 0, 4, 0, + 6, 0, 4, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 0, 4, 0, 4, 3, 0, 4, 3, 3, + 0, 4, 1, 1, 0, 4, 3, 3, 3, 0, + 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 6, 1, 3, 1, 0, + 6, 1, 3, 0, 4, 1, 3, 1, 1, 1, + 1, 1, 3, 0, 4, 0, 6, 1, 3, 0, + 4, 1, 3, 1, 1, 1, 1, 0, 4, 3, + 3, 3 }; @@ -4174,25 +4217,25 @@ namespace isc { namespace dhcp { "\"data\"", "\"code\"", "\"space\"", "\"csv-format\"", "\"always-send\"", "\"record-types\"", "\"encapsulate\"", "\"array\"", "\"shared-networks\"", "\"pools\"", "\"pool\"", "\"user-context\"", - "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", - "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", - "\"out-of-pool\"", "\"all\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"test\"", "\"client-class\"", "\"reservations\"", - "\"duid\"", "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", - "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", - "\"hooks-libraries\"", "\"library\"", "\"parameters\"", - "\"expired-leases-processing\"", "\"reclaim-timer-wait-time\"", - "\"flush-reclaimed-timer-wait-time\"", "\"hold-reclaimed-time\"", - "\"max-reclaim-leases\"", "\"max-reclaim-time\"", - "\"unwarned-reclaim-cycles\"", "\"dhcp4o6-port\"", "\"control-socket\"", - "\"socket-type\"", "\"socket-name\"", "\"dhcp-ddns\"", - "\"enable-updates\"", "\"qualifying-suffix\"", "\"server-ip\"", - "\"server-port\"", "\"sender-ip\"", "\"sender-port\"", - "\"max-queue-size\"", "\"ncr-protocol\"", "\"ncr-format\"", - "\"always-include-fqdn\"", "\"override-no-update\"", - "\"override-client-update\"", "\"replace-client-name\"", - "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", "\"when-present\"", - "\"never\"", "\"always\"", "\"when-not-present\"", "\"Logging\"", + "\"known-clients\"", "\"only\"", "\"never\"", "\"subnet\"", + "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", + "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", + "\"host-reservation-identifiers\"", "\"client-classes\"", "\"test\"", + "\"client-class\"", "\"reservations\"", "\"duid\"", "\"hw-address\"", + "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"", + "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", + "\"parameters\"", "\"expired-leases-processing\"", + "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"", + "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"", + "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"", + "\"dhcp4o6-port\"", "\"control-socket\"", "\"socket-type\"", + "\"socket-name\"", "\"dhcp-ddns\"", "\"enable-updates\"", + "\"qualifying-suffix\"", "\"server-ip\"", "\"server-port\"", + "\"sender-ip\"", "\"sender-port\"", "\"max-queue-size\"", + "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", + "\"override-no-update\"", "\"override-client-update\"", + "\"replace-client-name\"", "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", + "\"when-present\"", "\"always\"", "\"when-not-present\"", "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp6\"", "\"DhcpDdns\"", "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", @@ -4252,34 +4295,34 @@ namespace isc { namespace dhcp { "option_data_always_send", "pools_list", "$@65", "pools_list_content", "not_empty_pools_list", "pool_list_entry", "$@66", "sub_pool4", "$@67", "pool_params", "pool_param", "pool_entry", "$@68", "user_context", - "$@69", "reservations", "$@70", "reservations_list", - "not_empty_reservations_list", "reservation", "$@71", "sub_reservation", - "$@72", "reservation_params", "not_empty_reservation_params", - "reservation_param", "next_server", "$@73", "server_hostname", "$@74", - "boot_file_name", "$@75", "ip_address", "$@76", "duid", "$@77", - "hw_address", "$@78", "client_id_value", "$@79", "circuit_id_value", - "$@80", "flex_id_value", "$@81", "hostname", "$@82", - "reservation_client_classes", "$@83", "relay", "$@84", "relay_map", - "$@85", "client_classes", "$@86", "client_classes_list", - "client_class_entry", "$@87", "client_class_params", - "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@88", "dhcp4o6_port", - "control_socket", "$@89", "control_socket_params", - "control_socket_param", "control_socket_type", "$@90", - "control_socket_name", "$@91", "dhcp_ddns", "$@92", "sub_dhcp_ddns", - "$@93", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@94", "server_ip", "$@95", "server_port", - "sender_ip", "$@96", "sender_port", "max_queue_size", "ncr_protocol", - "$@97", "ncr_protocol_value", "ncr_format", "$@98", + "$@69", "known_clients", "$@70", "known_clients_value", "reservations", + "$@71", "reservations_list", "not_empty_reservations_list", + "reservation", "$@72", "sub_reservation", "$@73", "reservation_params", + "not_empty_reservation_params", "reservation_param", "next_server", + "$@74", "server_hostname", "$@75", "boot_file_name", "$@76", + "ip_address", "$@77", "duid", "$@78", "hw_address", "$@79", + "client_id_value", "$@80", "circuit_id_value", "$@81", "flex_id_value", + "$@82", "hostname", "$@83", "reservation_client_classes", "$@84", + "relay", "$@85", "relay_map", "$@86", "client_classes", "$@87", + "client_classes_list", "client_class_entry", "$@88", + "client_class_params", "not_empty_client_class_params", + "client_class_param", "client_class_name", "client_class_test", "$@89", + "dhcp4o6_port", "control_socket", "$@90", "control_socket_params", + "control_socket_param", "control_socket_type", "$@91", + "control_socket_name", "$@92", "dhcp_ddns", "$@93", "sub_dhcp_ddns", + "$@94", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", + "qualifying_suffix", "$@95", "server_ip", "$@96", "server_port", + "sender_ip", "$@97", "sender_port", "max_queue_size", "ncr_protocol", + "$@98", "ncr_protocol_value", "ncr_format", "$@99", "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@99", "replace_client_name_value", - "generated_prefix", "$@100", "dhcp6_json_object", "$@101", - "dhcpddns_json_object", "$@102", "control_agent_json_object", "$@103", - "logging_object", "$@104", "logging_params", "logging_param", "loggers", - "$@105", "loggers_entries", "logger_entry", "$@106", "logger_params", - "logger_param", "debuglevel", "severity", "$@107", "output_options_list", - "$@108", "output_options_list_content", "output_entry", "$@109", - "output_params_list", "output_params", "output", "$@110", "flush", + "replace_client_name", "$@100", "replace_client_name_value", + "generated_prefix", "$@101", "dhcp6_json_object", "$@102", + "dhcpddns_json_object", "$@103", "control_agent_json_object", "$@104", + "logging_object", "$@105", "logging_params", "logging_param", "loggers", + "$@106", "loggers_entries", "logger_entry", "$@107", "logger_params", + "logger_param", "debuglevel", "severity", "$@108", "output_options_list", + "$@109", "output_options_list_content", "output_entry", "$@110", + "output_params_list", "output_params", "output", "$@111", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4287,62 +4330,63 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp4Parser::yyrline_[] = { - 0, 233, 233, 233, 234, 234, 235, 235, 236, 236, - 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, - 242, 242, 243, 243, 244, 244, 252, 253, 254, 255, - 256, 257, 258, 261, 266, 266, 277, 280, 281, 284, - 288, 295, 295, 302, 303, 306, 310, 317, 317, 324, - 325, 328, 332, 343, 353, 353, 369, 370, 374, 375, - 376, 377, 378, 379, 382, 382, 397, 397, 406, 407, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 438, 443, 448, 453, 458, 463, - 469, 469, 480, 481, 484, 485, 486, 487, 490, 490, - 499, 499, 509, 509, 516, 517, 520, 520, 527, 529, - 533, 539, 539, 551, 551, 563, 564, 567, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, - 582, 582, 589, 590, 591, 592, 595, 595, 603, 603, - 611, 611, 619, 624, 624, 632, 637, 642, 647, 652, - 652, 660, 660, 669, 669, 679, 680, 683, 684, 685, - 686, 687, 690, 695, 700, 705, 710, 715, 715, 725, - 726, 729, 730, 733, 733, 743, 743, 753, 754, 755, - 758, 759, 762, 762, 770, 770, 778, 778, 789, 790, - 793, 794, 795, 796, 797, 798, 801, 806, 811, 816, - 821, 826, 834, 834, 847, 848, 851, 852, 859, 859, - 885, 885, 896, 897, 901, 902, 903, 904, 905, 906, - 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, - 917, 918, 919, 920, 921, 922, 923, 926, 926, 934, - 934, 942, 942, 950, 950, 958, 958, 966, 966, 974, - 974, 982, 982, 989, 990, 991, 994, 999, 1006, 1006, - 1017, 1018, 1022, 1023, 1026, 1026, 1034, 1035, 1038, 1039, - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1059, 1059, 1072, 1072, 1081, 1082, 1085, - 1086, 1091, 1091, 1106, 1106, 1120, 1121, 1124, 1125, 1128, - 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1138, 1140, 1145, - 1147, 1147, 1155, 1155, 1163, 1163, 1171, 1173, 1173, 1181, - 1190, 1190, 1202, 1203, 1208, 1209, 1214, 1214, 1226, 1226, - 1238, 1239, 1244, 1245, 1250, 1251, 1252, 1253, 1254, 1255, - 1256, 1259, 1261, 1261, 1269, 1271, 1273, 1278, 1286, 1286, - 1298, 1299, 1302, 1303, 1306, 1306, 1316, 1316, 1326, 1327, - 1330, 1331, 1332, 1333, 1334, 1337, 1337, 1345, 1345, 1355, - 1355, 1365, 1366, 1369, 1370, 1373, 1373, 1382, 1382, 1391, - 1392, 1395, 1396, 1400, 1401, 1402, 1403, 1404, 1405, 1406, - 1407, 1408, 1409, 1410, 1411, 1412, 1415, 1415, 1423, 1423, - 1431, 1431, 1439, 1439, 1447, 1447, 1455, 1455, 1463, 1463, - 1471, 1471, 1479, 1479, 1487, 1487, 1495, 1495, 1508, 1508, - 1518, 1518, 1529, 1529, 1539, 1540, 1543, 1543, 1553, 1554, - 1557, 1558, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, - 1571, 1573, 1573, 1585, 1592, 1592, 1602, 1603, 1606, 1607, - 1610, 1610, 1618, 1618, 1628, 1628, 1640, 1640, 1650, 1651, - 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1671, 1676, 1676, 1684, 1684, - 1692, 1697, 1697, 1705, 1710, 1715, 1715, 1723, 1724, 1727, - 1727, 1735, 1740, 1745, 1750, 1750, 1758, 1761, 1764, 1767, - 1770, 1776, 1776, 1786, 1786, 1793, 1793, 1800, 1800, 1812, - 1812, 1825, 1826, 1830, 1834, 1834, 1846, 1847, 1851, 1851, - 1859, 1860, 1863, 1864, 1865, 1866, 1867, 1870, 1875, 1875, - 1883, 1883, 1893, 1894, 1897, 1897, 1905, 1906, 1909, 1910, - 1911, 1912, 1915, 1915, 1923, 1928, 1933 + 0, 236, 236, 236, 237, 237, 238, 238, 239, 239, + 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, + 245, 245, 246, 246, 247, 247, 255, 256, 257, 258, + 259, 260, 261, 264, 269, 269, 280, 283, 284, 287, + 291, 298, 298, 305, 306, 309, 313, 320, 320, 327, + 328, 331, 335, 346, 356, 356, 372, 373, 377, 378, + 379, 380, 381, 382, 385, 385, 400, 400, 409, 410, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 441, 446, 451, 456, 461, 466, + 472, 472, 483, 484, 487, 488, 489, 490, 493, 493, + 502, 502, 512, 512, 519, 520, 523, 523, 530, 532, + 536, 542, 542, 554, 554, 566, 567, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 585, 585, 592, 593, 594, 595, 598, 598, 606, 606, + 614, 614, 622, 627, 627, 635, 640, 645, 650, 655, + 655, 663, 663, 672, 672, 682, 683, 686, 687, 688, + 689, 690, 693, 698, 703, 708, 713, 718, 718, 728, + 729, 732, 733, 736, 736, 746, 746, 756, 757, 758, + 761, 762, 765, 765, 773, 773, 781, 781, 792, 793, + 796, 797, 798, 799, 800, 801, 804, 809, 814, 819, + 824, 829, 837, 837, 850, 851, 854, 855, 862, 862, + 888, 888, 899, 900, 904, 905, 906, 907, 908, 909, + 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 929, 929, 937, + 937, 945, 945, 953, 953, 961, 961, 969, 969, 977, + 977, 985, 985, 992, 993, 994, 997, 1002, 1009, 1009, + 1020, 1021, 1025, 1026, 1029, 1029, 1037, 1038, 1041, 1042, + 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1062, 1062, 1075, 1075, 1084, 1085, 1088, + 1089, 1094, 1094, 1109, 1109, 1123, 1124, 1127, 1128, 1131, + 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1141, 1143, 1148, + 1150, 1150, 1158, 1158, 1166, 1166, 1174, 1176, 1176, 1184, + 1193, 1193, 1205, 1206, 1211, 1212, 1217, 1217, 1229, 1229, + 1241, 1242, 1247, 1248, 1253, 1254, 1255, 1256, 1257, 1258, + 1259, 1262, 1264, 1264, 1272, 1274, 1276, 1281, 1289, 1289, + 1301, 1302, 1305, 1306, 1309, 1309, 1319, 1319, 1329, 1330, + 1333, 1334, 1335, 1336, 1337, 1338, 1341, 1341, 1349, 1349, + 1356, 1356, 1364, 1365, 1371, 1371, 1381, 1382, 1385, 1386, + 1389, 1389, 1398, 1398, 1407, 1408, 1411, 1412, 1416, 1417, + 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, + 1428, 1431, 1431, 1439, 1439, 1447, 1447, 1455, 1455, 1463, + 1463, 1471, 1471, 1479, 1479, 1487, 1487, 1495, 1495, 1503, + 1503, 1511, 1511, 1524, 1524, 1534, 1534, 1545, 1545, 1555, + 1556, 1559, 1559, 1569, 1570, 1573, 1574, 1577, 1578, 1579, + 1580, 1581, 1582, 1583, 1584, 1587, 1589, 1589, 1601, 1608, + 1608, 1618, 1619, 1622, 1623, 1626, 1626, 1634, 1634, 1644, + 1644, 1656, 1656, 1666, 1667, 1670, 1671, 1672, 1673, 1674, + 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, + 1687, 1692, 1692, 1700, 1700, 1708, 1713, 1713, 1721, 1726, + 1731, 1731, 1739, 1740, 1743, 1743, 1751, 1756, 1761, 1766, + 1766, 1774, 1777, 1780, 1783, 1786, 1792, 1792, 1802, 1802, + 1809, 1809, 1816, 1816, 1828, 1828, 1841, 1842, 1846, 1850, + 1850, 1862, 1863, 1867, 1867, 1875, 1876, 1879, 1880, 1881, + 1882, 1883, 1886, 1891, 1891, 1899, 1899, 1909, 1910, 1913, + 1913, 1921, 1922, 1925, 1926, 1927, 1928, 1931, 1931, 1939, + 1944, 1949 }; // Print the state stack on the debug stream. @@ -4377,8 +4421,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4381 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 1938 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4425 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 1954 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index 7ac3490a66..b231e29e94 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -310,6 +310,7 @@ namespace isc { namespace dhcp { // outbound_interface_value // db_type // hr_mode + // known_clients_value // ncr_protocol_value // replace_client_name_value char dummy1[sizeof(ElementPtr)]; @@ -410,91 +411,93 @@ namespace isc { namespace dhcp { TOKEN_POOLS = 317, TOKEN_POOL = 318, TOKEN_USER_CONTEXT = 319, - TOKEN_SUBNET = 320, - TOKEN_INTERFACE = 321, - TOKEN_INTERFACE_ID = 322, - TOKEN_ID = 323, - TOKEN_RAPID_COMMIT = 324, - TOKEN_RESERVATION_MODE = 325, - TOKEN_DISABLED = 326, - TOKEN_OUT_OF_POOL = 327, - TOKEN_ALL = 328, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 329, - TOKEN_CLIENT_CLASSES = 330, - TOKEN_TEST = 331, - TOKEN_CLIENT_CLASS = 332, - TOKEN_RESERVATIONS = 333, - TOKEN_DUID = 334, - TOKEN_HW_ADDRESS = 335, - TOKEN_CIRCUIT_ID = 336, - TOKEN_CLIENT_ID = 337, - TOKEN_HOSTNAME = 338, - TOKEN_FLEX_ID = 339, - TOKEN_RELAY = 340, - TOKEN_IP_ADDRESS = 341, - TOKEN_HOOKS_LIBRARIES = 342, - TOKEN_LIBRARY = 343, - TOKEN_PARAMETERS = 344, - TOKEN_EXPIRED_LEASES_PROCESSING = 345, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 346, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 347, - TOKEN_HOLD_RECLAIMED_TIME = 348, - TOKEN_MAX_RECLAIM_LEASES = 349, - TOKEN_MAX_RECLAIM_TIME = 350, - TOKEN_UNWARNED_RECLAIM_CYCLES = 351, - TOKEN_DHCP4O6_PORT = 352, - TOKEN_CONTROL_SOCKET = 353, - TOKEN_SOCKET_TYPE = 354, - TOKEN_SOCKET_NAME = 355, - TOKEN_DHCP_DDNS = 356, - TOKEN_ENABLE_UPDATES = 357, - TOKEN_QUALIFYING_SUFFIX = 358, - TOKEN_SERVER_IP = 359, - TOKEN_SERVER_PORT = 360, - TOKEN_SENDER_IP = 361, - TOKEN_SENDER_PORT = 362, - TOKEN_MAX_QUEUE_SIZE = 363, - TOKEN_NCR_PROTOCOL = 364, - TOKEN_NCR_FORMAT = 365, - TOKEN_ALWAYS_INCLUDE_FQDN = 366, - TOKEN_OVERRIDE_NO_UPDATE = 367, - TOKEN_OVERRIDE_CLIENT_UPDATE = 368, - TOKEN_REPLACE_CLIENT_NAME = 369, - TOKEN_GENERATED_PREFIX = 370, - TOKEN_TCP = 371, - TOKEN_JSON = 372, - TOKEN_WHEN_PRESENT = 373, - TOKEN_NEVER = 374, - TOKEN_ALWAYS = 375, - TOKEN_WHEN_NOT_PRESENT = 376, - TOKEN_LOGGING = 377, - TOKEN_LOGGERS = 378, - TOKEN_OUTPUT_OPTIONS = 379, - TOKEN_OUTPUT = 380, - TOKEN_DEBUGLEVEL = 381, - TOKEN_SEVERITY = 382, - TOKEN_FLUSH = 383, - TOKEN_MAXSIZE = 384, - TOKEN_MAXVER = 385, - TOKEN_DHCP6 = 386, - TOKEN_DHCPDDNS = 387, - TOKEN_CONTROL_AGENT = 388, - TOKEN_TOPLEVEL_JSON = 389, - TOKEN_TOPLEVEL_DHCP4 = 390, - TOKEN_SUB_DHCP4 = 391, - TOKEN_SUB_INTERFACES4 = 392, - TOKEN_SUB_SUBNET4 = 393, - TOKEN_SUB_POOL4 = 394, - TOKEN_SUB_RESERVATION = 395, - TOKEN_SUB_OPTION_DEFS = 396, - TOKEN_SUB_OPTION_DEF = 397, - TOKEN_SUB_OPTION_DATA = 398, - TOKEN_SUB_HOOKS_LIBRARY = 399, - TOKEN_SUB_DHCP_DDNS = 400, - TOKEN_STRING = 401, - TOKEN_INTEGER = 402, - TOKEN_FLOAT = 403, - TOKEN_BOOLEAN = 404 + TOKEN_KNOWN_CLIENTS = 320, + TOKEN_ONLY = 321, + TOKEN_NEVER = 322, + TOKEN_SUBNET = 323, + TOKEN_INTERFACE = 324, + TOKEN_INTERFACE_ID = 325, + TOKEN_ID = 326, + TOKEN_RAPID_COMMIT = 327, + TOKEN_RESERVATION_MODE = 328, + TOKEN_DISABLED = 329, + TOKEN_OUT_OF_POOL = 330, + TOKEN_ALL = 331, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 332, + TOKEN_CLIENT_CLASSES = 333, + TOKEN_TEST = 334, + TOKEN_CLIENT_CLASS = 335, + TOKEN_RESERVATIONS = 336, + TOKEN_DUID = 337, + TOKEN_HW_ADDRESS = 338, + TOKEN_CIRCUIT_ID = 339, + TOKEN_CLIENT_ID = 340, + TOKEN_HOSTNAME = 341, + TOKEN_FLEX_ID = 342, + TOKEN_RELAY = 343, + TOKEN_IP_ADDRESS = 344, + TOKEN_HOOKS_LIBRARIES = 345, + TOKEN_LIBRARY = 346, + TOKEN_PARAMETERS = 347, + TOKEN_EXPIRED_LEASES_PROCESSING = 348, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 349, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 350, + TOKEN_HOLD_RECLAIMED_TIME = 351, + TOKEN_MAX_RECLAIM_LEASES = 352, + TOKEN_MAX_RECLAIM_TIME = 353, + TOKEN_UNWARNED_RECLAIM_CYCLES = 354, + TOKEN_DHCP4O6_PORT = 355, + TOKEN_CONTROL_SOCKET = 356, + TOKEN_SOCKET_TYPE = 357, + TOKEN_SOCKET_NAME = 358, + TOKEN_DHCP_DDNS = 359, + TOKEN_ENABLE_UPDATES = 360, + TOKEN_QUALIFYING_SUFFIX = 361, + TOKEN_SERVER_IP = 362, + TOKEN_SERVER_PORT = 363, + TOKEN_SENDER_IP = 364, + TOKEN_SENDER_PORT = 365, + TOKEN_MAX_QUEUE_SIZE = 366, + TOKEN_NCR_PROTOCOL = 367, + TOKEN_NCR_FORMAT = 368, + TOKEN_ALWAYS_INCLUDE_FQDN = 369, + TOKEN_OVERRIDE_NO_UPDATE = 370, + TOKEN_OVERRIDE_CLIENT_UPDATE = 371, + TOKEN_REPLACE_CLIENT_NAME = 372, + TOKEN_GENERATED_PREFIX = 373, + TOKEN_TCP = 374, + TOKEN_JSON = 375, + TOKEN_WHEN_PRESENT = 376, + TOKEN_ALWAYS = 377, + TOKEN_WHEN_NOT_PRESENT = 378, + TOKEN_LOGGING = 379, + TOKEN_LOGGERS = 380, + TOKEN_OUTPUT_OPTIONS = 381, + TOKEN_OUTPUT = 382, + TOKEN_DEBUGLEVEL = 383, + TOKEN_SEVERITY = 384, + TOKEN_FLUSH = 385, + TOKEN_MAXSIZE = 386, + TOKEN_MAXVER = 387, + TOKEN_DHCP6 = 388, + TOKEN_DHCPDDNS = 389, + TOKEN_CONTROL_AGENT = 390, + TOKEN_TOPLEVEL_JSON = 391, + TOKEN_TOPLEVEL_DHCP4 = 392, + TOKEN_SUB_DHCP4 = 393, + TOKEN_SUB_INTERFACES4 = 394, + TOKEN_SUB_SUBNET4 = 395, + TOKEN_SUB_POOL4 = 396, + TOKEN_SUB_RESERVATION = 397, + TOKEN_SUB_OPTION_DEFS = 398, + TOKEN_SUB_OPTION_DEF = 399, + TOKEN_SUB_OPTION_DATA = 400, + TOKEN_SUB_HOOKS_LIBRARY = 401, + TOKEN_SUB_DHCP_DDNS = 402, + TOKEN_STRING = 403, + TOKEN_INTEGER = 404, + TOKEN_FLOAT = 405, + TOKEN_BOOLEAN = 406 }; }; @@ -861,6 +864,18 @@ namespace isc { namespace dhcp { symbol_type make_USER_CONTEXT (const location_type& l); + static inline + symbol_type + make_KNOWN_CLIENTS (const location_type& l); + + static inline + symbol_type + make_ONLY (const location_type& l); + + static inline + symbol_type + make_NEVER (const location_type& l); + static inline symbol_type make_SUBNET (const location_type& l); @@ -1077,10 +1092,6 @@ namespace isc { namespace dhcp { symbol_type make_WHEN_PRESENT (const location_type& l); - static inline - symbol_type - make_NEVER (const location_type& l); - static inline symbol_type make_ALWAYS (const location_type& l); @@ -1406,12 +1417,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 809, ///< Last index in yytable_. - yynnts_ = 333, ///< Number of nonterminal symbols. + yylast_ = 816, ///< Last index in yytable_. + yynnts_ = 336, ///< Number of nonterminal symbols. yyfinal_ = 26, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 150 ///< Number of tokens. + yyntokens_ = 152 ///< Number of tokens. }; @@ -1468,9 +1479,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, 146, 147, 148, 149 + 145, 146, 147, 148, 149, 150, 151 }; - const unsigned int user_token_number_max_ = 404; + const unsigned int user_token_number_max_ = 406; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1503,30 +1514,31 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 149: // "boolean" + case 151: // "boolean" value.copy< bool > (other.value); break; - case 148: // "floating point" + case 150: // "floating point" value.copy< double > (other.value); break; - case 147: // "integer" + case 149: // "integer" value.copy< int64_t > (other.value); break; - case 146: // "constant string" + case 148: // "constant string" value.copy< std::string > (other.value); break; @@ -1547,30 +1559,31 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 149: // "boolean" + case 151: // "boolean" value.copy< bool > (v); break; - case 148: // "floating point" + case 150: // "floating point" value.copy< double > (v); break; - case 147: // "integer" + case 149: // "integer" value.copy< int64_t > (v); break; - case 146: // "constant string" + case 148: // "constant string" value.copy< std::string > (v); break; @@ -1650,30 +1663,31 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 149: // "boolean" + case 151: // "boolean" value.template destroy< bool > (); break; - case 148: // "floating point" + case 150: // "floating point" value.template destroy< double > (); break; - case 147: // "integer" + case 149: // "integer" value.template destroy< int64_t > (); break; - case 146: // "constant string" + case 148: // "constant string" value.template destroy< std::string > (); break; @@ -1700,30 +1714,31 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 164: // value - case 168: // map_value - case 206: // socket_type - case 209: // outbound_interface_value - case 219: // db_type - case 296: // hr_mode - case 440: // ncr_protocol_value - case 448: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 298: // hr_mode + case 369: // known_clients_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 149: // "boolean" + case 151: // "boolean" value.move< bool > (s.value); break; - case 148: // "floating point" + case 150: // "floating point" value.move< double > (s.value); break; - case 147: // "integer" + case 149: // "integer" value.move< int64_t > (s.value); break; - case 146: // "constant string" + case 148: // "constant string" value.move< std::string > (s.value); break; @@ -1796,7 +1811,8 @@ namespace isc { namespace dhcp { 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404 + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406 }; return static_cast (yytoken_number_[type]); } @@ -2179,6 +2195,24 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_USER_CONTEXT, l); } + Dhcp4Parser::symbol_type + Dhcp4Parser::make_KNOWN_CLIENTS (const location_type& l) + { + return symbol_type (token::TOKEN_KNOWN_CLIENTS, l); + } + + Dhcp4Parser::symbol_type + Dhcp4Parser::make_ONLY (const location_type& l) + { + return symbol_type (token::TOKEN_ONLY, l); + } + + Dhcp4Parser::symbol_type + Dhcp4Parser::make_NEVER (const location_type& l) + { + return symbol_type (token::TOKEN_NEVER, l); + } + Dhcp4Parser::symbol_type Dhcp4Parser::make_SUBNET (const location_type& l) { @@ -2503,12 +2537,6 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_WHEN_PRESENT, l); } - Dhcp4Parser::symbol_type - Dhcp4Parser::make_NEVER (const location_type& l) - { - return symbol_type (token::TOKEN_NEVER, l); - } - Dhcp4Parser::symbol_type Dhcp4Parser::make_ALWAYS (const location_type& l) { @@ -2692,7 +2720,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2696 "dhcp4_parser.h" // lalr1.cc:377 +#line 2724 "dhcp4_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 406760160c..026c42d703 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191032 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 5093784f84..9a6143d45a 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191032 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index faba59c6ed..88216713cd 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191032 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index ba4ee93e01..e53e3ddb70 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1266] = +static const flex_int16_t yy_accept[1277] = { 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, @@ -709,12 +709,12 @@ static const flex_int16_t yy_accept[1266] = 160, 10, 11, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 154, - 154, 0, 153, 154, 3, 2, 6, 0, 154, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 154, 154, + 0, 153, 154, 3, 2, 6, 0, 154, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 9, 0, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -722,125 +722,126 @@ static const flex_int16_t yy_accept[1266] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 122, 0, 0, 123, 0, - 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, + 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 159, 157, - 0, 156, 155, 0, 0, 0, 0, 0, 0, 0, - 121, 0, 0, 27, 0, 26, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, + 157, 0, 156, 155, 0, 0, 0, 0, 0, 0, + 0, 121, 0, 27, 0, 26, 0, 0, 86, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 158, 155, 0, 0, 0, 0, 0, 0, 0, 0, - 28, 0, 0, 30, 0, 0, 0, 0, 0, 87, + 0, 0, 158, 155, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, - 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 0, 0, 0, 66, 0, 0, 0, 0, + 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 75, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 102, 126, - 42, 0, 47, 0, 0, 0, 0, 0, 0, 140, - 35, 0, 32, 0, 31, 0, 0, 0, 114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 102, 126, 42, 0, 47, 0, 0, 0, 0, + 0, 0, 140, 35, 0, 32, 0, 0, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, - 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 110, 0, 0, 0, 0, 7, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 7, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 0, 0, 0, 94, 0, - 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, + 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, + 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, - 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, - 92, 0, 0, 0, 96, 43, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 92, 0, 0, 0, 96, + 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 69, 0, 0, 0, 105, 0, 0, 0, 41, + 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, + 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 69, 0, 0, + 0, 105, 0, 0, 0, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 120, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 38, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 120, 14, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 111, 98, + 0, 0, 0, 0, 0, 111, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 107, 124, 0, 37, 0, 116, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 63, - 0, 0, 0, 0, 118, 45, 0, 71, 0, 0, + 0, 107, 124, 0, 37, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 63, 0, 0, + 0, 0, 118, 45, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 64, 85, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 88, 0, 0, 0, 64, 85, 0, 0, - 0, 0, 0, 17, 15, 0, 138, 137, 0, 0, - 0, 0, 0, 29, 0, 101, 0, 0, 0, 0, - 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 79, 0, 104, 0, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 17, 15, 0, 138, 137, 0, 0, 0, + 0, 0, 29, 0, 101, 0, 0, 0, 0, 0, + 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 79, 0, 104, 0, 0, 52, 0, 0, 0, 19, 0, 0, 0, 0, 0, 81, 59, 0, 112, 0, 0, 0, 103, 0, 0, 76, 0, 142, 0, 0, 0, 0, 0, 0, 0, 74, 0, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 0, 55, - 136, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 40, 0, 39, 18, 0, 0, 93, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, - 53, 0, 72, 0, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, + 55, 136, 0, 12, 0, 0, 0, 0, 0, 0, + 0, 40, 0, 39, 18, 0, 0, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 0, 53, 0, 72, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 62, 0, 34, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, - 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, + 0, 0, 62, 0, 34, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 133, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 0, 0, 0, 13, 0, 0, - 22, 56, 0, 0, 0, 0, 21, 0, 73, 0, - 0, 131, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, + 0, 22, 56, 0, 0, 0, 0, 21, 0, 73, + 0, 0, 131, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, - 89, 0, 0, 0, 0, 0, 129, 134, 60, 0, - 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 130, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, + 0, 89, 0, 0, 0, 0, 0, 129, 134, 60, + 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 0, 130, 0 } ; static const YY_CHAR yy_ec[256] = @@ -853,12 +854,12 @@ static const YY_CHAR yy_ec[256] = 14, 15, 14, 16, 14, 14, 14, 17, 5, 18, 5, 19, 20, 5, 21, 22, 23, 24, 25, 26, 5, 27, 5, 28, 5, 29, 5, 30, 31, 32, - 5, 33, 34, 35, 36, 37, 38, 5, 39, 5, - 40, 41, 42, 5, 43, 5, 44, 45, 46, 47, + 5, 33, 34, 35, 36, 5, 37, 5, 38, 5, + 39, 40, 41, 5, 42, 5, 43, 44, 45, 46, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 5, 71, 5, 5, 5, 5, 5, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 5, 70, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -875,419 +876,419 @@ static const YY_CHAR yy_ec[256] = 5, 5, 5, 5, 5 } ; -static const YY_CHAR yy_meta[72] = +static const YY_CHAR yy_meta[71] = { 0, 1, 1, 2, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 5, 5, 5, 5, 5, 5, 3, + 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; -static const flex_int16_t yy_base[1278] = +static const flex_int16_t yy_base[1289] = { 0, - 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1628, 1629, 32, 1624, 141, 0, 201, 1629, 206, 88, - 11, 213, 1629, 1606, 114, 25, 2, 6, 1629, 1629, - 73, 11, 17, 1629, 1629, 1629, 104, 1612, 1567, 0, - 1604, 107, 1619, 217, 241, 1629, 185, 1563, 1569, 1589, - 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 64, 231, 1570, 187, 75, 1569, 274, 188, 290, - 276, 295, 1552, 195, 296, 325, 305, 1571, 0, 349, - 354, 367, 373, 376, 1629, 0, 1629, 267, 295, 290, - 317, 339, 351, 355, 358, 1629, 1568, 1607, 1629, 308, + 0, 69, 19, 29, 40, 47, 51, 57, 86, 98, + 1629, 1630, 32, 1625, 139, 0, 198, 1630, 203, 206, + 11, 218, 1630, 1607, 98, 24, 2, 33, 1630, 1630, + 25, 56, 63, 1630, 1630, 1630, 101, 1613, 1569, 0, + 1605, 118, 1620, 34, 245, 1630, 23, 1565, 1571, 1590, + 90, 63, 182, 202, 91, 199, 271, 198, 73, 213, + 70, 203, 1572, 179, 229, 182, 265, 212, 278, 266, + 289, 1555, 294, 293, 315, 296, 1574, 0, 339, 353, + 365, 373, 376, 1630, 0, 1630, 356, 379, 213, 232, + 215, 329, 330, 281, 1630, 1571, 1609, 1630, 333, 1630, - 1629, 394, 357, 1555, 1565, 1604, 370, 220, 249, 1559, - 367, 377, 369, 379, 302, 1602, 0, 445, 374, 1546, - 1554, 304, 1550, 1539, 1540, 371, 1556, 1539, 1548, 374, - 200, 366, 1542, 386, 1530, 1586, 402, 1533, 1584, 1526, - 1549, 1546, 1546, 1540, 367, 1533, 1526, 1531, 1525, 1536, - 1521, 1520, 1534, 366, 1570, 1519, 384, 1531, 1534, 1518, - 441, 415, 1532, 1529, 1530, 1528, 1510, 1515, 1511, 1503, - 1520, 1512, 0, 385, 420, 406, 419, 427, 440, 1511, - 1629, 0, 453, 1502, 1505, 1629, 439, 447, 1629, 1557, - 1512, 454, 1555, 458, 1554, 448, 1553, 1629, 493, 1552, + 390, 340, 1558, 1568, 1606, 368, 368, 23, 1562, 370, + 282, 374, 379, 1604, 0, 440, 370, 1549, 1557, 362, + 1553, 1542, 1543, 365, 1559, 1542, 1551, 369, 371, 300, + 1545, 379, 1533, 1588, 242, 1536, 1586, 1529, 1538, 1551, + 1548, 1548, 1542, 171, 1535, 1528, 1533, 1527, 1522, 1537, + 1522, 1521, 1535, 68, 1570, 1520, 382, 1532, 1535, 1519, + 436, 357, 1533, 1530, 1531, 1529, 1511, 1516, 1512, 1504, + 1521, 1513, 0, 407, 415, 390, 411, 419, 402, 1512, + 1630, 0, 439, 1503, 1506, 1630, 417, 437, 1630, 1557, + 1513, 1555, 449, 1554, 445, 1553, 1630, 488, 1552, 455, - 478, 1513, 1508, 1507, 463, 1548, 1542, 1508, 1487, 1495, - 1501, 1489, 1503, 1499, 1500, 1500, 1495, 1487, 1489, 1473, - 1477, 1490, 1490, 1482, 1472, 1475, 1489, 1629, 1475, 1483, - 1486, 1467, 1466, 1516, 1465, 1475, 1513, 484, 1474, 1462, - 1473, 1509, 1513, 1466, 9, 1456, 1472, 1453, 1455, 1451, - 1457, 1448, 1447, 1460, 1453, 1455, 1459, 1458, 1452, 80, - 1459, 1454, 1446, 1452, 1452, 1433, 1449, 1435, 1441, 1448, - 1436, 1429, 1443, 1442, 1445, 1427, 1435, 485, 1629, 1629, - 486, 1629, 1629, 1422, 0, 445, 1424, 508, 487, 1478, - 1629, 1431, 492, 1629, 1476, 1629, 1470, 540, 1629, 482, + 1514, 1509, 1508, 415, 1548, 1542, 1509, 1488, 1496, 1502, + 1490, 1504, 1500, 1501, 1501, 1496, 1488, 1490, 1474, 1478, + 1491, 1491, 1483, 1473, 1476, 1490, 1630, 1476, 1484, 1487, + 1468, 1463, 1466, 1515, 1465, 1475, 1512, 459, 1474, 1462, + 1473, 1508, 1471, 1511, 1465, 400, 1455, 1471, 1452, 1454, + 1450, 1456, 1447, 1446, 1459, 1452, 1454, 1458, 1457, 1451, + 451, 1458, 1453, 1445, 1451, 1451, 1432, 1448, 1434, 1440, + 1447, 1435, 1428, 1442, 1441, 1444, 1426, 1434, 470, 1630, + 1630, 474, 1630, 1630, 1421, 0, 216, 1423, 491, 475, + 1476, 1630, 1430, 1630, 1474, 1630, 1468, 523, 1630, 451, - 1412, 1422, 1472, 1429, 483, 1629, 1427, 1469, 1424, 1421, - 1422, 532, 1426, 1464, 1414, 1409, 1406, 1402, 1404, 1453, - 1412, 1401, 1450, 1398, 546, 1411, 1411, 1394, 1395, 1408, - 1395, 1405, 1400, 1407, 1402, 1387, 402, 1396, 1399, 1394, - 1390, 1438, 499, 1629, 1385, 1384, 1377, 1379, 1383, 1372, - 1379, 1384, 353, 1429, 1384, 519, 1381, 1385, 1383, 1372, - 1372, 1384, 1366, 1358, 1359, 1380, 1362, 1374, 1373, 1359, - 1371, 1370, 1369, 1368, 1409, 1408, 1407, 1351, 525, 1364, - 1629, 1629, 1363, 0, 511, 1351, 1402, 1401, 1359, 1399, - 1629, 1347, 1397, 1629, 538, 595, 517, 1396, 1338, 1629, + 1411, 1421, 1470, 1428, 481, 1630, 1426, 1467, 1423, 1420, + 1421, 514, 1425, 1462, 1413, 1408, 1405, 1401, 1403, 1451, + 1411, 1400, 1448, 1397, 544, 1410, 1410, 1393, 1394, 1407, + 1394, 1395, 1403, 1398, 1405, 1400, 1385, 467, 1394, 1397, + 1392, 1388, 1435, 482, 1380, 1630, 1382, 1381, 1374, 1376, + 1380, 1369, 1376, 1381, 513, 1425, 1381, 505, 1378, 1382, + 1380, 1369, 1369, 1381, 1363, 1355, 1356, 1377, 1359, 1371, + 1370, 1356, 1368, 1367, 1366, 1365, 1405, 1404, 1403, 1348, + 547, 1361, 1630, 1630, 1360, 0, 482, 1348, 1398, 1397, + 1356, 1395, 1630, 1344, 1630, 527, 592, 517, 1393, 1336, - 1354, 1353, 1340, 1339, 1629, 1341, 1338, 1350, 1346, 1334, - 1336, 1629, 1342, 1327, 1329, 1340, 1338, 1333, 563, 1340, - 1322, 1371, 1629, 1320, 1336, 1368, 1372, 1330, 1324, 1326, - 1327, 1329, 1361, 1314, 1309, 1308, 1310, 1303, 1318, 1296, - 1303, 1308, 1356, 1629, 1303, 1299, 1302, 1309, 1294, 1304, - 1307, 1296, 1295, 1290, 1629, 1345, 1629, 1289, 1288, 1281, - 1298, 1335, 1282, 1287, 1296, 1290, 1294, 566, 1329, 1293, - 1273, 1276, 1275, 1283, 1287, 1270, 1326, 1268, 1629, 1629, - 1629, 1273, 1629, 1283, 1317, 1279, 0, 1320, 1270, 1629, - 1629, 1267, 1629, 1273, 1629, 544, 543, 572, 1629, 1311, + 1630, 1352, 1351, 1338, 1337, 1630, 1339, 1336, 1348, 1344, + 1332, 1334, 1630, 1340, 1325, 1327, 1338, 1336, 1331, 554, + 1338, 1320, 1368, 1630, 1318, 1334, 1365, 1369, 1328, 1322, + 1324, 1325, 1327, 1358, 1357, 1311, 1306, 1305, 1307, 1300, + 1315, 1293, 1300, 1305, 1352, 1630, 1300, 1296, 1349, 1298, + 1305, 1290, 1300, 1303, 1292, 1291, 1286, 1630, 1340, 1630, + 1285, 1284, 1277, 1294, 1330, 1278, 1283, 1292, 1286, 1290, + 566, 1324, 1289, 1269, 1272, 1271, 1279, 1283, 1266, 1321, + 1264, 1630, 1630, 1630, 1269, 1630, 1279, 1312, 1275, 0, + 1315, 1266, 1630, 1630, 1263, 1630, 1269, 497, 528, 569, - 1258, 1257, 1264, 1257, 1269, 1268, 1252, 1267, 1297, 1264, - 1300, 1246, 1248, 1260, 1260, 1259, 1629, 1244, 1241, 1255, - 1247, 1253, 1244, 1252, 1629, 1237, 1248, 1252, 1234, 1248, - 1246, 1229, 1223, 1228, 1225, 1240, 1241, 1238, 1279, 1236, - 1629, 1222, 1224, 1270, 1269, 553, 1232, 1215, 1216, 1221, - 1212, 1629, 1226, 1212, 587, 1204, 1225, 1222, 1214, 1257, - 1211, 1255, 1629, 1203, 1201, 1215, 1218, 1250, 1249, 1196, - 1247, 1246, 1629, 574, 1208, 1197, 1199, 1629, 1629, 1242, - 1190, 1245, 559, 557, 529, 1204, 1238, 1237, 1236, 1190, - 1180, 1233, 1195, 1185, 1230, 1193, 1175, 1183, 1185, 1189, + 1630, 1306, 1254, 1253, 1260, 1253, 1265, 1264, 1248, 1263, + 1292, 1260, 1295, 1242, 1244, 1256, 1256, 1255, 1630, 1240, + 1237, 1251, 1243, 1249, 1240, 1248, 1630, 1233, 1244, 1248, + 1230, 1244, 1243, 1241, 1224, 1218, 1223, 1220, 1235, 1236, + 1233, 1273, 1231, 1630, 1217, 1219, 1630, 1264, 1263, 22, + 1227, 1210, 1211, 1216, 1207, 1630, 1221, 1207, 573, 1199, + 1220, 1217, 1209, 1251, 1206, 1249, 1630, 1198, 1196, 1210, + 1213, 1244, 1243, 1191, 1241, 1240, 1630, 1234, 1202, 1191, + 1193, 1630, 1630, 1235, 1184, 1238, 527, 517, 512, 1198, + 1231, 1230, 1229, 1184, 1174, 1226, 1189, 1179, 1223, 1187, - 1224, 1228, 1185, 1184, 1185, 1178, 1167, 1180, 1183, 1178, - 1173, 1178, 1175, 1174, 1177, 1172, 1213, 1212, 1156, 1152, - 1160, 1208, 1629, 1207, 1156, 1148, 1163, 1150, 1629, 1150, - 1159, 1158, 1158, 1142, 1197, 1140, 1153, 1629, 1145, 1137, - 1146, 1139, 1150, 1127, 1131, 1182, 1129, 1127, 1138, 1178, - 1125, 540, 548, 1119, 1129, 549, 1629, 1179, 1137, 1126, - 1130, 1137, 1174, 1629, 1168, 567, 1121, 1129, 1121, 1112, - 1115, 1111, 1128, 1123, 1111, 1122, 1106, 1108, 1160, 1106, - 1120, 1101, 1151, 1106, 1629, 1114, 1112, 1103, 1112, 1108, - 1149, 1091, 1091, 1104, 1103, 1088, 1143, 1085, 1086, 1629, + 1169, 1177, 1179, 1183, 1217, 1221, 1179, 1178, 1179, 1172, + 1161, 1174, 1177, 1172, 1167, 1172, 1169, 1168, 1160, 1170, + 1165, 1205, 1204, 1149, 1145, 1153, 1200, 1630, 1199, 1149, + 1141, 1156, 1143, 1630, 1143, 1152, 1151, 1151, 1135, 1189, + 1133, 1146, 1630, 1138, 1130, 1139, 1132, 1143, 1120, 1124, + 1174, 1122, 1120, 1131, 1170, 1118, 535, 536, 1112, 1122, + 520, 1171, 1130, 1119, 1123, 1130, 1166, 1630, 1160, 558, + 1114, 1122, 1114, 1105, 1108, 1104, 1121, 1116, 1104, 1115, + 1099, 1101, 1152, 1099, 1113, 1094, 1143, 1099, 1630, 1107, + 1105, 1096, 1105, 1101, 1141, 1084, 1084, 1097, 1096, 1081, - 1629, 1100, 1097, 1100, 1629, 1629, 1099, 1084, 579, 1083, - 1081, 1128, 1077, 1131, 1130, 1629, 1075, 1087, 1085, 1126, - 1074, 1074, 61, 120, 189, 197, 195, 259, 281, 311, - 344, 405, 470, 566, 471, 524, 512, 570, 547, 1629, - 613, 563, 579, 580, 1629, 599, 607, 587, 577, 592, - 585, 580, 587, 583, 592, 587, 638, 644, 593, 1629, - 605, 590, 606, 597, 609, 604, 649, 617, 601, 602, - 1629, 620, 603, 605, 661, 606, 1629, 625, 605, 623, - 662, 622, 612, 630, 614, 629, 621, 617, 635, 620, - 1629, 1629, 628, 673, 628, 1629, 636, 631, 682, 1629, + 1135, 1089, 1077, 1078, 1630, 1630, 1092, 1089, 1092, 1630, + 1630, 1091, 1076, 548, 1075, 1073, 9, 61, 129, 234, + 1630, 213, 280, 281, 355, 401, 404, 429, 575, 539, + 534, 530, 540, 544, 556, 551, 545, 547, 563, 553, + 605, 565, 579, 556, 1630, 613, 563, 578, 578, 1630, + 596, 604, 585, 575, 589, 582, 577, 584, 580, 589, + 584, 634, 640, 590, 1630, 602, 587, 603, 594, 606, + 601, 645, 614, 598, 599, 1630, 617, 600, 602, 657, + 603, 1630, 618, 623, 603, 622, 659, 620, 610, 628, + 612, 627, 619, 615, 633, 618, 1630, 1630, 626, 670, - 633, 638, 632, 634, 646, 640, 638, 691, 637, 693, - 694, 640, 1629, 639, 647, 645, 644, 658, 659, 660, - 676, 681, 655, 665, 651, 658, 663, 670, 711, 712, - 661, 665, 1629, 660, 678, 676, 714, 665, 683, 684, - 670, 678, 687, 667, 688, 728, 729, 1629, 684, 733, - 734, 696, 698, 681, 683, 690, 741, 690, 705, 744, - 696, 700, 698, 696, 749, 750, 702, 752, 748, 708, - 1629, 713, 706, 715, 709, 704, 714, 710, 1629, 705, - 1629, 1629, 706, 704, 723, 724, 725, 707, 712, 719, - 752, 743, 715, 774, 719, 735, 727, 731, 1629, 1629, + 626, 1630, 634, 629, 679, 1630, 631, 636, 630, 632, + 644, 638, 636, 688, 635, 690, 691, 638, 1630, 637, + 645, 643, 642, 656, 657, 658, 673, 678, 653, 663, + 649, 656, 661, 668, 708, 709, 659, 663, 1630, 659, + 677, 674, 711, 663, 681, 682, 668, 676, 685, 665, + 686, 725, 726, 1630, 684, 730, 731, 682, 695, 697, + 681, 682, 689, 739, 689, 704, 742, 695, 699, 697, + 695, 747, 748, 701, 750, 746, 707, 1630, 712, 705, + 714, 708, 703, 713, 709, 1630, 704, 1630, 1630, 705, + 703, 722, 723, 724, 706, 711, 718, 750, 741, 714, - 741, 739, 725, 726, 784, 739, 744, 731, 742, 734, - 740, 736, 754, 755, 1629, 1629, 754, 1629, 756, 1629, - 741, 760, 750, 801, 756, 798, 1629, 755, 805, 1629, - 806, 755, 762, 804, 1629, 1629, 764, 1629, 755, 755, - 758, 772, 759, 770, 817, 776, 814, 820, 821, 770, - 823, 824, 785, 769, 781, 771, 801, 830, 790, 1629, - 832, 781, 777, 793, 798, 786, 838, 797, 1629, 799, - 798, 800, 793, 802, 803, 800, 790, 792, 849, 798, - 851, 796, 853, 1629, 791, 806, 856, 1629, 1629, 807, - 817, 802, 818, 804, 864, 865, 811, 867, 826, 1629, + 773, 719, 734, 726, 730, 1630, 1630, 740, 738, 724, + 725, 782, 738, 743, 730, 741, 733, 739, 735, 753, + 755, 1630, 1630, 753, 1630, 755, 1630, 740, 740, 761, + 751, 800, 756, 797, 1630, 755, 804, 1630, 805, 755, + 762, 803, 1630, 1630, 764, 1630, 755, 755, 758, 772, + 759, 770, 816, 776, 813, 819, 820, 770, 822, 823, + 785, 769, 781, 771, 800, 829, 790, 1630, 831, 781, + 777, 793, 798, 786, 837, 797, 1630, 799, 798, 800, + 793, 802, 803, 800, 790, 792, 848, 798, 850, 796, + 797, 853, 1630, 792, 808, 857, 1630, 1630, 808, 818, - 818, 821, 872, 1629, 1629, 818, 1629, 1629, 826, 876, - 827, 878, 860, 1629, 838, 1629, 825, 824, 827, 827, - 828, 886, 1629, 831, 888, 843, 834, 849, 849, 852, - 852, 849, 854, 1629, 846, 1629, 856, 1629, 857, 858, - 855, 1629, 847, 853, 852, 864, 864, 1629, 1629, 903, - 1629, 868, 853, 859, 1629, 864, 875, 1629, 872, 1629, - 891, 911, 917, 861, 919, 920, 875, 1629, 922, 1629, - 862, 919, 884, 880, 922, 872, 877, 930, 888, 932, - 933, 896, 885, 936, 880, 897, 882, 897, 881, 938, - 939, 904, 890, 901, 948, 920, 907, 1629, 951, 1629, + 803, 819, 805, 863, 865, 812, 867, 828, 1630, 820, + 822, 873, 1630, 1630, 820, 1630, 1630, 827, 876, 828, + 878, 860, 1630, 839, 1630, 826, 825, 828, 828, 829, + 886, 1630, 832, 888, 844, 835, 850, 850, 853, 853, + 850, 855, 1630, 847, 1630, 898, 858, 1630, 859, 861, + 858, 1630, 849, 855, 854, 866, 866, 1630, 1630, 904, + 1630, 870, 855, 861, 1630, 866, 877, 1630, 874, 1630, + 892, 912, 918, 863, 920, 921, 877, 1630, 923, 1630, + 864, 920, 886, 882, 923, 874, 879, 931, 890, 1630, + 933, 934, 898, 887, 937, 882, 899, 884, 899, 884, - 1629, 900, 1629, 953, 901, 950, 895, 900, 959, 909, - 1629, 915, 1629, 1629, 906, 921, 1629, 959, 927, 920, - 921, 930, 917, 919, 929, 972, 923, 1629, 974, 921, - 1629, 925, 1629, 929, 924, 923, 981, 936, 1629, 978, - 940, 943, 986, 929, 931, 939, 929, 945, 939, 955, - 994, 1629, 990, 1629, 955, 992, 956, 947, 954, 1629, - 951, 956, 1003, 948, 1629, 952, 964, 965, 1008, 952, - 953, 961, 1629, 972, 962, 961, 964, 976, 967, 976, - 978, 1629, 1020, 980, 1022, 1023, 1629, 1019, 979, 984, - 965, 1028, 987, 1030, 989, 990, 1033, 992, 1629, 997, + 939, 940, 906, 892, 903, 949, 921, 909, 1630, 952, + 1630, 1630, 902, 1630, 954, 903, 951, 897, 902, 960, + 911, 1630, 917, 1630, 1630, 908, 923, 1630, 960, 929, + 922, 923, 932, 919, 921, 931, 973, 925, 1630, 975, + 923, 1630, 928, 1630, 931, 926, 925, 982, 938, 1630, + 979, 942, 945, 987, 931, 933, 941, 931, 947, 941, + 957, 995, 1630, 991, 1630, 957, 993, 958, 949, 956, + 1630, 953, 958, 1004, 950, 1630, 954, 966, 967, 1009, + 954, 955, 963, 1630, 974, 964, 963, 966, 978, 969, + 978, 980, 1630, 1021, 982, 1023, 1024, 1630, 1020, 981, - 1629, 1629, 979, 985, 1038, 999, 1629, 985, 1629, 985, - 987, 1629, 992, 987, 999, 995, 1629, 998, 1002, 993, - 1045, 994, 1010, 1003, 998, 1013, 1004, 1011, 998, 1013, - 1060, 1019, 1062, 1007, 1023, 1014, 1028, 1024, 1629, 1068, - 1629, 1069, 1070, 1027, 1026, 1027, 1629, 1629, 1629, 1074, - 1018, 1034, 1629, 1072, 1023, 1022, 1024, 1035, 1082, 1033, - 1629, 1042, 1085, 1629, 1629, 1091, 1096, 1101, 1106, 1111, - 1116, 1121, 1124, 1098, 1103, 1105, 1118 + 986, 967, 1029, 989, 1031, 991, 992, 1034, 994, 1630, + 999, 1630, 1630, 981, 987, 1039, 1001, 1630, 987, 1630, + 987, 989, 1630, 994, 989, 1001, 997, 1630, 1000, 1004, + 995, 1046, 996, 1012, 1005, 1000, 1015, 1006, 1013, 1000, + 1015, 1061, 1021, 1063, 1009, 1025, 1016, 1030, 1026, 1630, + 1069, 1630, 1070, 1071, 1029, 1028, 1029, 1630, 1630, 1630, + 1075, 1020, 1036, 1630, 1073, 1025, 1024, 1026, 1037, 1083, + 1035, 1630, 1044, 1086, 1630, 1630, 1092, 1097, 1102, 1107, + 1112, 1117, 1122, 1125, 1099, 1104, 1106, 1119 } ; -static const flex_int16_t yy_def[1278] = +static const flex_int16_t yy_def[1289] = { 0, - 1266, 1266, 1267, 1267, 1266, 1266, 1266, 1266, 1266, 1266, - 1265, 1265, 1265, 1265, 1265, 1268, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1269, - 1265, 1265, 1265, 1270, 15, 1265, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 45, + 1277, 1277, 1278, 1278, 1277, 1277, 1277, 1277, 1277, 1277, + 1276, 1276, 1276, 1276, 1276, 1279, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1280, + 1276, 1276, 1276, 1281, 15, 1276, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1282, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1268, 1265, - 1265, 1265, 1265, 1265, 1265, 1272, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1269, 1265, 1270, + 45, 45, 45, 45, 45, 45, 45, 1279, 1276, 1276, + 1276, 1276, 1276, 1276, 1283, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1280, 1276, 1281, 1276, - 1265, 1265, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1273, 45, 1271, 45, 45, + 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1284, 45, 1282, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1272, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1274, 45, 45, 45, 1265, 45, 45, 1265, 45, - 45, 45, 45, 45, 45, 45, 1273, 1265, 1271, 45, + 45, 45, 1283, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1285, 45, 45, 45, 1276, 45, 45, 1276, 45, + 45, 45, 45, 45, 45, 1284, 1276, 1282, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 45, + 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1275, 45, 45, 45, 45, 45, - 1265, 45, 45, 1265, 45, 1265, 45, 1271, 1265, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1286, 45, 45, 45, 45, + 45, 1276, 45, 1276, 45, 1276, 45, 1282, 1276, 45, - 45, 45, 45, 45, 45, 1265, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1265, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1265, 1265, 1265, 1276, 45, 45, 45, 45, 45, 45, - 1265, 45, 45, 1265, 45, 1271, 45, 45, 45, 1265, + 45, 45, 1276, 1276, 1276, 1287, 45, 45, 45, 45, + 45, 45, 1276, 45, 1276, 45, 1282, 45, 45, 45, - 45, 45, 45, 45, 1265, 45, 45, 45, 45, 45, - 45, 1265, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, + 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1265, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1265, 45, 1265, 45, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1265, 1265, - 1265, 45, 1265, 45, 45, 1265, 1277, 45, 45, 1265, - 1265, 45, 1265, 45, 1265, 45, 45, 45, 1265, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1276, 1276, 1276, 45, 1276, 45, 45, 1276, 1288, + 45, 45, 1276, 1276, 45, 1276, 45, 45, 45, 45, + 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, + 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1265, 45, 45, 45, - 45, 45, 45, 45, 1265, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1265, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1265, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 1265, 1265, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1276, 45, 45, 1276, 45, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, + 45, 1276, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 1265, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, + 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, + 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1265, 45, 45, 45, - 45, 45, 45, 1265, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1265, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1265, - 1265, 45, 45, 45, 1265, 1265, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1265, 45, 45, 45, 45, + 45, 45, 45, 45, 1276, 1276, 45, 45, 45, 1276, + 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1265, - 45, 45, 45, 45, 1265, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1265, + 45, 45, 45, 45, 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1265, 45, 45, 45, 45, 45, 1265, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1265, 1265, 45, 45, 45, 1265, 45, 45, 45, 1265, + 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1276, 1276, 45, 45, + 45, 1276, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 45, + 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, + 45, 45, 45, 45, 45, 1276, 45, 1276, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1265, 45, 45, 45, 45, 45, 45, 45, 1265, 45, - 1265, 1265, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1265, 1265, + 45, 45, 45, 45, 45, 1276, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1265, 1265, 45, 1265, 45, 1265, - 45, 45, 45, 45, 45, 45, 1265, 45, 45, 1265, - 45, 45, 45, 45, 1265, 1265, 45, 1265, 45, 45, + 45, 1276, 1276, 45, 1276, 45, 1276, 45, 45, 45, + 45, 45, 45, 45, 1276, 45, 45, 1276, 45, 45, + 45, 45, 1276, 1276, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1265, - 45, 45, 45, 45, 45, 45, 45, 45, 1265, 45, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, + 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1265, 45, 45, 45, 1265, 1265, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1265, + 45, 45, 1276, 45, 45, 45, 1276, 1276, 45, 45, - 45, 45, 45, 1265, 1265, 45, 1265, 1265, 45, 45, - 45, 45, 45, 1265, 45, 1265, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1265, 45, 1265, 45, 1265, 45, 45, - 45, 1265, 45, 45, 45, 45, 45, 1265, 1265, 45, - 1265, 45, 45, 45, 1265, 45, 45, 1265, 45, 1265, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 1265, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, + 45, 45, 1276, 1276, 45, 1276, 1276, 45, 45, 45, + 45, 45, 1276, 45, 1276, 45, 45, 45, 45, 45, + 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1276, 45, 1276, 45, 45, 1276, 45, 45, + 45, 1276, 45, 45, 45, 45, 45, 1276, 1276, 45, + 1276, 45, 45, 45, 1276, 45, 45, 1276, 45, 1276, + 45, 45, 45, 45, 45, 45, 45, 1276, 45, 1276, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 1265, - 1265, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 1265, 45, 1265, 1265, 45, 45, 1265, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1265, 45, 45, - 1265, 45, 1265, 45, 45, 45, 45, 45, 1265, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, + 1276, 1276, 45, 1276, 45, 45, 45, 45, 45, 45, + 45, 1276, 45, 1276, 1276, 45, 45, 1276, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, + 45, 1276, 45, 1276, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1265, 45, 1265, 45, 45, 45, 45, 45, 1265, - 45, 45, 45, 45, 1265, 45, 45, 45, 45, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 45, 1265, 45, 45, 45, 45, 1265, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1265, 45, + 45, 45, 1276, 45, 1276, 45, 45, 45, 45, 45, + 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, + 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, + 45, 45, 1276, 45, 45, 45, 45, 1276, 45, 45, - 1265, 1265, 45, 45, 45, 45, 1265, 45, 1265, 45, - 45, 1265, 45, 45, 45, 45, 1265, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, + 45, 1276, 1276, 45, 45, 45, 45, 1276, 45, 1276, + 45, 45, 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1265, 45, - 1265, 45, 45, 45, 45, 45, 1265, 1265, 1265, 45, - 45, 45, 1265, 45, 45, 45, 45, 45, 45, 45, - 1265, 45, 45, 1265, 0, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265 + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, + 45, 1276, 45, 45, 45, 45, 45, 1276, 1276, 1276, + 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, + 45, 1276, 45, 45, 1276, 0, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 } ; static const flex_int16_t yy_nxt[1701] = { 0, - 1265, 13, 14, 13, 1265, 15, 16, 1265, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 85, 346, - 37, 14, 37, 86, 25, 26, 38, 1265, 1265, 27, - 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, - 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, - 13, 14, 13, 13, 14, 13, 32, 40, 1265, 13, - 14, 13, 33, 40, 115, 91, 92, 347, 90, 34, - 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, - 13, 108, 39, 90, 25, 26, 13, 14, 13, 27, + 1276, 13, 14, 13, 1276, 15, 16, 1276, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 84, 795, + 37, 14, 37, 85, 25, 26, 38, 634, 189, 27, + 37, 14, 37, 42, 28, 42, 38, 90, 29, 100, + 30, 13, 14, 13, 89, 89, 25, 31, 13, 14, + 13, 102, 13, 14, 13, 32, 40, 190, 13, 14, + 13, 33, 40, 635, 90, 91, 89, 92, 34, 35, + 13, 14, 13, 101, 15, 16, 102, 17, 18, 19, + 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, + 39, 90, 91, 25, 26, 91, 107, 39, 27, 13, - 39, 84, 84, 84, 28, 42, 41, 42, 42, 29, - 42, 30, 82, 107, 41, 111, 93, 25, 31, 108, - 130, 137, 88, 799, 88, 800, 32, 89, 89, 89, - 131, 138, 33, 139, 362, 82, 107, 363, 111, 34, - 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 47, 45, 48, 49, 50, 51, 45, 52, 53, - 54, 45, 45, 45, 45, 55, 56, 45, 57, 45, - 45, 58, 45, 45, 59, 45, 60, 61, 62, 63, - 64, 65, 66, 52, 67, 68, 69, 70, 71, 72, + 14, 13, 42, 28, 42, 41, 87, 29, 87, 30, + 106, 88, 88, 88, 112, 25, 31, 41, 93, 42, + 796, 42, 94, 107, 32, 128, 119, 248, 249, 120, + 33, 121, 106, 122, 797, 129, 112, 34, 35, 44, + 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, + 45, 48, 49, 50, 51, 45, 52, 53, 45, 45, + 45, 45, 45, 54, 55, 56, 45, 45, 57, 45, + 45, 58, 45, 59, 60, 61, 62, 63, 64, 65, + 52, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 73, 74, 75, 76, 77, 78, 57, 45, 45, 45, - 45, 45, 80, 103, 81, 81, 81, 80, 109, 83, - 83, 83, 101, 114, 80, 82, 83, 83, 83, 121, - 82, 145, 122, 112, 123, 146, 124, 82, 160, 103, - 801, 103, 161, 113, 134, 218, 114, 110, 82, 135, - 188, 107, 136, 82, 189, 147, 112, 102, 219, 802, - 82, 45, 803, 45, 45, 45, 45, 119, 45, 45, - 45, 113, 117, 120, 107, 45, 45, 188, 45, 45, - 89, 89, 89, 190, 45, 132, 45, 45, 45, 45, + 75, 76, 77, 56, 45, 45, 45, 45, 45, 79, + 108, 80, 80, 80, 79, 237, 82, 82, 82, 83, + 83, 83, 81, 106, 110, 113, 102, 81, 138, 79, + 81, 82, 82, 82, 111, 132, 238, 139, 109, 798, + 133, 174, 81, 134, 81, 106, 110, 227, 113, 81, + 176, 117, 81, 387, 144, 123, 130, 118, 145, 124, + 175, 111, 125, 126, 81, 45, 174, 45, 45, 45, + 45, 799, 45, 45, 135, 127, 115, 176, 146, 45, + 45, 45, 387, 45, 136, 175, 137, 45, 228, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 89, 89, - 89, 45, 125, 101, 111, 45, 126, 804, 174, 127, - 128, 141, 142, 45, 150, 143, 196, 45, 114, 45, - 118, 144, 129, 148, 151, 149, 805, 111, 154, 152, - 153, 155, 156, 162, 174, 175, 163, 112, 102, 196, - 204, 114, 157, 164, 165, 158, 806, 113, 455, 166, - 205, 170, 84, 84, 84, 80, 171, 81, 81, 81, - 112, 175, 167, 82, 176, 88, 168, 88, 82, 174, - 89, 89, 89, 175, 80, 113, 83, 83, 83, 84, - 84, 84, 169, 176, 183, 807, 82, 82, 187, 100, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 140, 141, 150, 45, 142, 176, 193, 45, 112, + 147, 143, 148, 151, 149, 800, 45, 801, 152, 153, + 45, 154, 45, 116, 155, 156, 160, 110, 100, 162, + 161, 112, 163, 179, 193, 157, 219, 111, 158, 164, + 165, 170, 83, 83, 83, 166, 171, 174, 175, 110, + 802, 167, 220, 81, 79, 168, 80, 80, 80, 88, + 88, 88, 101, 87, 111, 87, 183, 81, 88, 88, + 88, 169, 177, 178, 79, 81, 82, 82, 82, 83, + 83, 83, 88, 88, 88, 99, 187, 81, 188, 81, - 82, 82, 176, 192, 194, 177, 100, 228, 193, 178, - 195, 183, 237, 220, 456, 209, 210, 215, 278, 216, - 82, 179, 183, 82, 187, 211, 247, 248, 200, 221, - 280, 192, 194, 238, 100, 193, 217, 195, 100, 201, - 223, 251, 100, 224, 252, 253, 278, 225, 279, 229, - 100, 257, 278, 280, 100, 279, 100, 182, 199, 199, - 199, 438, 439, 808, 280, 199, 199, 199, 199, 199, - 199, 265, 289, 286, 279, 266, 290, 297, 293, 267, - 281, 282, 295, 385, 258, 259, 260, 283, 199, 199, - 199, 199, 199, 199, 337, 261, 286, 262, 286, 263, + 81, 192, 99, 195, 183, 194, 183, 203, 208, 209, + 348, 214, 266, 215, 281, 217, 267, 204, 210, 81, + 268, 187, 81, 199, 188, 195, 281, 192, 218, 99, + 216, 194, 222, 99, 200, 223, 281, 99, 252, 224, + 279, 253, 254, 280, 279, 99, 258, 280, 284, 99, + 290, 99, 182, 198, 198, 198, 803, 349, 804, 287, + 198, 198, 198, 198, 198, 198, 291, 279, 280, 338, + 304, 282, 283, 295, 297, 287, 305, 290, 259, 260, + 261, 287, 198, 198, 198, 198, 198, 198, 387, 262, + 805, 263, 291, 264, 383, 295, 265, 300, 383, 392, - 289, 293, 264, 290, 297, 295, 298, 298, 298, 381, - 381, 390, 385, 298, 298, 298, 298, 298, 298, 304, - 385, 300, 387, 388, 393, 305, 402, 809, 812, 813, - 483, 389, 381, 382, 390, 484, 298, 298, 298, 298, - 298, 298, 409, 403, 488, 338, 410, 445, 339, 397, - 488, 423, 393, 396, 396, 396, 424, 446, 629, 814, - 396, 396, 396, 396, 396, 396, 459, 496, 517, 497, - 460, 563, 488, 518, 583, 584, 564, 579, 498, 657, - 667, 666, 585, 396, 396, 396, 396, 396, 396, 658, - 668, 732, 638, 665, 496, 630, 497, 639, 733, 734, + 297, 298, 298, 298, 364, 389, 390, 365, 298, 298, + 298, 298, 298, 298, 391, 491, 383, 398, 458, 339, + 384, 392, 340, 403, 410, 440, 441, 587, 411, 447, + 298, 298, 298, 298, 298, 298, 397, 397, 397, 448, + 404, 670, 491, 397, 397, 397, 397, 397, 397, 424, + 491, 462, 486, 587, 425, 463, 498, 487, 499, 519, + 588, 669, 671, 670, 520, 397, 397, 397, 397, 397, + 397, 567, 672, 459, 583, 743, 568, 500, 643, 589, + 806, 744, 498, 644, 499, 737, 739, 588, 669, 807, + 791, 752, 738, 740, 792, 808, 809, 810, 811, 426, - 747, 583, 425, 584, 666, 738, 735, 426, 45, 45, - 45, 739, 810, 815, 816, 45, 45, 45, 45, 45, - 45, 665, 785, 817, 811, 818, 786, 819, 747, 820, - 821, 822, 823, 824, 640, 825, 826, 827, 45, 45, - 45, 45, 45, 45, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 822, 838, 839, 821, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 851, 852, 853, - 854, 849, 855, 856, 857, 858, 859, 860, 861, 862, - 863, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 864, 875, 876, 877, 878, 879, 880, 881, 882, + 812, 813, 814, 815, 427, 45, 45, 45, 816, 818, + 819, 820, 45, 45, 45, 45, 45, 45, 752, 645, + 817, 821, 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 45, 45, 45, 45, 45, 45, + 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, + 828, 844, 845, 827, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 857, 858, 859, 860, 855, 861, 862, + 863, 864, 865, 866, 867, 868, 869, 870, 872, 873, + 874, 875, 876, 877, 878, 879, 880, 881, 871, 882, + 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 883, 884, 885, 886, 887, 888, 889, 890, 891, 893, - 892, 894, 895, 896, 897, 898, 899, 900, 901, 902, - 903, 904, 850, 905, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 916, 917, 891, 892, 918, 920, - 922, 923, 924, 919, 925, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, + 893, 894, 895, 896, 897, 898, 900, 899, 901, 902, + 903, 904, 905, 906, 907, 908, 909, 856, 910, 911, + 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 898, 899, 924, 925, 927, 929, 930, 931, + 926, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 921, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 957, + 961, 962, 963, 964, 965, 966, 967, 928, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 984, 985, 965, 986, 987, 988, - 979, 980, 981, 982, 983, 958, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, + 989, 990, 966, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1042, 1013, 1043, 1044, 1045, 1046, 1047, 1041, 1048, - 1049, 1050, 1051, 1052, 1053, 1003, 1054, 1055, 1056, 1017, - 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1022, 1050, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1051, + 1059, 1060, 1061, 1012, 1062, 1063, 1064, 1026, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, + 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1061, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1087, 1088, 1089, 1090, 1091, 1092, 1071, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, - 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1096, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1135, - 1136, 1137, 1138, 1134, 1139, 1140, 1141, 1142, 1143, 1144, - 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, - 1155, 1156, 1129, 1157, 1158, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, - + 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1107, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 1146, 1147, 1148, 1149, 1145, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, + 1165, 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, @@ -1296,264 +1297,265 @@ static const flex_int16_t yy_nxt[1701] = 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, - 1264, 12, 12, 12, 12, 12, 36, 36, 36, 36, + 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, + 1274, 1275, 12, 12, 12, 12, 12, 36, 36, 36, - 36, 79, 285, 79, 79, 79, 98, 384, 98, 487, - 98, 100, 100, 100, 100, 100, 116, 116, 116, 116, - 116, 173, 100, 173, 173, 173, 197, 197, 197, 798, - 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, - 787, 784, 783, 782, 781, 780, 779, 778, 777, 776, - 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, - 765, 764, 763, 762, 761, 760, 759, 758, 757, 756, - 755, 754, 753, 752, 751, 750, 749, 748, 746, 745, - 744, 743, 742, 741, 740, 737, 736, 731, 730, 729, - 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, + 36, 36, 78, 286, 78, 78, 78, 97, 386, 97, + 490, 97, 99, 99, 99, 99, 99, 114, 114, 114, + 114, 114, 173, 99, 173, 173, 173, 196, 196, 196, + 794, 793, 790, 789, 788, 787, 786, 785, 784, 783, + 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, + 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, + 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, + 751, 750, 749, 748, 747, 746, 745, 742, 741, 736, + 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, + 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, - 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, - 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, - 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, - 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, - 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, - 664, 663, 662, 661, 660, 659, 656, 655, 654, 653, - 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, - 642, 641, 637, 636, 635, 634, 633, 632, 631, 628, - 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, - 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, + 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, + 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, + 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, + 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, + 675, 674, 673, 668, 667, 666, 665, 664, 663, 662, + 661, 660, 659, 658, 657, 656, 655, 654, 653, 652, + 651, 650, 649, 648, 647, 646, 642, 641, 640, 639, + 638, 637, 636, 633, 632, 631, 630, 629, 628, 627, + 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, + 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, - 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, - 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, - 587, 586, 582, 581, 580, 579, 578, 577, 576, 575, - 574, 573, 572, 571, 570, 569, 568, 567, 566, 565, - 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, - 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, - 532, 531, 530, 529, 528, 527, 526, 525, 524, 523, - 522, 521, 520, 519, 516, 515, 514, 513, 512, 511, - 510, 509, 508, 507, 506, 505, 504, 503, 502, 501, + 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, + 596, 595, 594, 593, 592, 591, 590, 586, 585, 584, + 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, + 573, 572, 571, 570, 569, 566, 565, 564, 563, 562, + 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, + 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, + 521, 518, 517, 516, 515, 514, 513, 512, 511, 510, + 509, 508, 507, 506, 505, 504, 503, 502, 501, 497, - 500, 499, 495, 494, 493, 492, 491, 490, 489, 486, - 485, 482, 481, 480, 479, 478, 477, 476, 475, 474, - 473, 472, 471, 470, 469, 468, 467, 466, 465, 464, - 463, 462, 461, 458, 457, 454, 453, 452, 451, 450, - 449, 448, 447, 444, 443, 442, 441, 440, 437, 436, - 435, 434, 433, 432, 431, 430, 429, 428, 427, 422, - 421, 420, 419, 418, 417, 416, 415, 414, 413, 412, - 411, 408, 407, 406, 405, 404, 401, 400, 399, 398, - 395, 394, 392, 391, 386, 383, 380, 379, 378, 377, + 496, 495, 494, 493, 492, 489, 488, 485, 484, 483, + 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, + 472, 471, 470, 469, 468, 467, 466, 465, 464, 461, + 460, 457, 456, 455, 454, 453, 452, 451, 450, 449, + 446, 445, 444, 443, 442, 439, 438, 437, 436, 435, + 434, 433, 432, 431, 430, 429, 428, 423, 422, 421, + 420, 419, 418, 417, 416, 415, 414, 413, 412, 409, + 408, 407, 406, 405, 402, 401, 400, 399, 396, 395, + 394, 393, 388, 385, 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, - 366, 365, 364, 361, 360, 359, 358, 357, 356, 355, - 354, 353, 352, 351, 350, 349, 348, 345, 344, 343, - 342, 341, 340, 336, 335, 334, 333, 332, 331, 330, + 366, 363, 362, 361, 360, 359, 358, 357, 356, 355, + 354, 353, 352, 351, 350, 347, 346, 345, 344, 343, + 342, 341, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, 310, - 309, 308, 307, 306, 303, 302, 301, 299, 198, 296, - 294, 292, 291, 288, 287, 284, 277, 276, 275, 274, - 273, 272, 271, 270, 269, 268, 256, 255, 254, 250, - 249, 246, 245, 244, 243, 242, 241, 240, 239, 236, - 235, 234, 233, 232, 231, 230, 227, 226, 222, 214, + 309, 308, 307, 306, 303, 302, 301, 299, 197, 296, + 294, 293, 292, 289, 288, 285, 278, 277, 276, 275, + 274, 273, 272, 271, 270, 269, 257, 256, 255, 251, + 250, 247, 246, 245, 244, 243, 242, 241, 240, 239, + 236, 235, 234, 233, 232, 231, 230, 229, 226, 225, - 213, 212, 208, 207, 206, 203, 202, 198, 191, 186, - 185, 184, 181, 180, 172, 159, 140, 133, 106, 105, - 104, 43, 99, 97, 96, 87, 43, 1265, 11, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265 + 221, 213, 212, 211, 207, 206, 205, 202, 201, 197, + 191, 186, 185, 184, 181, 180, 172, 159, 131, 105, + 104, 103, 43, 98, 96, 95, 86, 43, 1276, 11, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 } ; static const flex_int16_t yy_chk[1701] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 245, - 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, - 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, - 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, - 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, - 8, 8, 1, 8, 57, 27, 28, 245, 26, 1, - 1, 2, 2, 2, 32, 2, 2, 33, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, - 9, 52, 5, 31, 2, 2, 10, 10, 10, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 717, + 3, 3, 3, 21, 1, 1, 3, 550, 108, 1, + 4, 4, 4, 13, 1, 13, 4, 27, 1, 44, + 1, 5, 5, 5, 26, 31, 1, 1, 6, 6, + 6, 47, 7, 7, 7, 1, 7, 108, 8, 8, + 8, 1, 8, 550, 27, 28, 26, 31, 1, 1, + 2, 2, 2, 44, 2, 2, 47, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, + 5, 32, 28, 2, 2, 33, 52, 6, 2, 10, - 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, - 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, - 62, 66, 25, 723, 25, 724, 2, 25, 25, 25, - 62, 66, 2, 66, 260, 20, 51, 260, 54, 2, - 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 10, 10, 37, 2, 37, 9, 25, 2, 25, 2, + 51, 25, 25, 25, 55, 2, 2, 10, 32, 42, + 718, 42, 33, 52, 2, 61, 59, 154, 154, 59, + 2, 59, 51, 59, 719, 61, 55, 2, 2, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 17, 47, 17, 17, 17, 19, 53, 19, - 19, 19, 44, 56, 22, 17, 22, 22, 22, 60, - 19, 69, 60, 55, 60, 69, 60, 22, 74, 47, - 725, 59, 74, 55, 65, 131, 56, 53, 17, 65, - 108, 63, 65, 19, 109, 69, 55, 44, 131, 726, - 22, 45, 727, 45, 45, 45, 45, 59, 45, 45, - 45, 55, 58, 59, 63, 45, 45, 108, 45, 58, - 88, 88, 88, 109, 45, 63, 45, 45, 45, 45, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, + 53, 17, 17, 17, 19, 144, 19, 19, 19, 20, + 20, 20, 17, 62, 54, 56, 58, 19, 66, 22, + 20, 22, 22, 22, 54, 64, 144, 66, 53, 720, + 64, 89, 22, 64, 17, 62, 54, 135, 56, 19, + 91, 58, 20, 287, 68, 60, 62, 58, 68, 60, + 90, 54, 60, 60, 22, 45, 89, 45, 45, 45, + 45, 722, 45, 45, 65, 60, 57, 91, 68, 45, + 45, 45, 287, 57, 65, 90, 65, 45, 135, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, - 89, 58, 61, 100, 70, 58, 61, 728, 90, 61, - 61, 68, 68, 58, 71, 68, 115, 58, 77, 58, - 58, 68, 61, 70, 71, 70, 729, 70, 72, 71, - 71, 72, 72, 75, 90, 91, 75, 76, 100, 115, - 122, 77, 72, 75, 75, 72, 730, 76, 353, 75, - 122, 77, 80, 80, 80, 81, 77, 81, 81, 81, - 76, 91, 76, 80, 92, 82, 76, 82, 81, 93, - 82, 82, 82, 94, 83, 76, 83, 83, 83, 84, - 84, 84, 76, 95, 103, 731, 80, 83, 107, 102, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 57, 67, 67, 70, 57, 67, 94, 111, 57, 76, + 69, 67, 69, 70, 69, 723, 57, 724, 70, 70, + 57, 71, 57, 57, 71, 71, 73, 75, 99, 74, + 73, 76, 74, 94, 111, 71, 130, 75, 71, 74, + 74, 76, 79, 79, 79, 74, 76, 92, 93, 75, + 725, 75, 130, 79, 80, 75, 80, 80, 80, 87, + 87, 87, 99, 81, 75, 81, 102, 80, 81, 81, + 81, 75, 92, 93, 82, 79, 82, 82, 82, 83, + 83, 83, 88, 88, 88, 101, 106, 82, 107, 80, - 84, 81, 92, 111, 113, 93, 102, 137, 112, 94, - 114, 119, 145, 132, 353, 126, 126, 130, 174, 130, - 83, 95, 103, 84, 107, 126, 154, 154, 119, 132, - 176, 111, 113, 145, 102, 112, 130, 114, 102, 119, - 134, 157, 102, 134, 157, 157, 174, 134, 175, 137, - 102, 161, 177, 176, 102, 178, 102, 102, 118, 118, - 118, 337, 337, 732, 179, 118, 118, 118, 118, 118, - 118, 162, 187, 183, 175, 162, 188, 196, 192, 162, - 177, 178, 194, 286, 161, 161, 161, 179, 118, 118, - 118, 118, 118, 118, 238, 161, 183, 161, 201, 161, + 83, 110, 101, 113, 102, 112, 117, 120, 124, 124, + 246, 128, 162, 128, 176, 129, 162, 120, 124, 82, + 162, 106, 83, 117, 107, 113, 179, 110, 129, 101, + 128, 112, 132, 101, 117, 132, 176, 101, 157, 132, + 174, 157, 157, 175, 177, 101, 161, 178, 179, 101, + 187, 101, 101, 116, 116, 116, 726, 246, 727, 183, + 116, 116, 116, 116, 116, 116, 188, 174, 175, 238, + 204, 177, 178, 193, 195, 200, 204, 187, 161, 161, + 161, 183, 116, 116, 116, 116, 116, 116, 300, 161, + 728, 161, 188, 161, 279, 193, 161, 200, 282, 290, - 187, 192, 161, 188, 196, 194, 199, 199, 199, 278, - 281, 289, 286, 199, 199, 199, 199, 199, 199, 205, - 300, 201, 288, 288, 293, 205, 305, 733, 735, 736, - 379, 288, 278, 281, 289, 379, 199, 199, 199, 199, - 199, 199, 312, 305, 385, 238, 312, 343, 238, 300, - 397, 325, 293, 298, 298, 298, 325, 343, 546, 737, - 298, 298, 298, 298, 298, 298, 356, 395, 419, 395, - 356, 468, 385, 419, 496, 497, 468, 498, 397, 574, - 585, 584, 498, 298, 298, 298, 298, 298, 298, 574, - 585, 652, 555, 583, 395, 546, 395, 555, 652, 653, + 195, 198, 198, 198, 261, 289, 289, 261, 198, 198, + 198, 198, 198, 198, 289, 387, 279, 300, 355, 238, + 282, 290, 238, 305, 312, 338, 338, 498, 312, 344, + 198, 198, 198, 198, 198, 198, 298, 298, 298, 344, + 305, 588, 387, 298, 298, 298, 298, 298, 298, 325, + 398, 358, 381, 498, 325, 358, 396, 381, 396, 420, + 499, 587, 589, 588, 420, 298, 298, 298, 298, 298, + 298, 471, 589, 355, 500, 661, 471, 398, 559, 500, + 729, 661, 396, 559, 396, 657, 658, 499, 587, 730, + 714, 670, 657, 658, 714, 731, 732, 733, 734, 325, - 666, 496, 325, 497, 584, 656, 653, 325, 396, 396, - 396, 656, 734, 738, 739, 396, 396, 396, 396, 396, - 396, 583, 709, 741, 734, 742, 709, 743, 666, 744, - 746, 747, 748, 749, 555, 750, 751, 752, 396, 396, - 396, 396, 396, 396, 753, 754, 755, 756, 757, 758, - 759, 761, 762, 763, 747, 764, 765, 746, 766, 767, - 768, 769, 770, 772, 773, 774, 775, 776, 778, 779, - 780, 775, 781, 782, 783, 784, 785, 786, 787, 788, - 789, 790, 793, 794, 795, 797, 798, 799, 801, 802, - 803, 789, 804, 805, 806, 807, 808, 809, 810, 811, + 735, 736, 737, 738, 325, 397, 397, 397, 739, 740, + 741, 742, 397, 397, 397, 397, 397, 397, 670, 559, + 739, 743, 744, 746, 747, 748, 749, 751, 752, 753, + 754, 755, 756, 757, 397, 397, 397, 397, 397, 397, + 758, 759, 760, 761, 762, 763, 764, 766, 767, 768, + 752, 769, 770, 751, 771, 772, 773, 774, 775, 777, + 778, 779, 780, 781, 783, 784, 785, 780, 786, 787, + 788, 789, 790, 791, 792, 793, 794, 795, 796, 799, + 800, 801, 803, 804, 805, 807, 808, 809, 795, 810, + 811, 812, 813, 814, 815, 816, 817, 818, 820, 821, - 812, 814, 815, 816, 817, 818, 819, 820, 821, 823, - 822, 824, 825, 826, 827, 828, 829, 830, 831, 832, - 834, 835, 775, 836, 837, 838, 839, 840, 841, 842, - 843, 844, 845, 846, 847, 849, 821, 822, 850, 851, - 852, 853, 854, 850, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, - 872, 873, 874, 875, 876, 877, 878, 880, 883, 884, - 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, - 895, 851, 896, 897, 898, 901, 902, 903, 904, 905, - 906, 907, 908, 909, 910, 911, 912, 913, 914, 891, + 822, 823, 824, 825, 826, 827, 829, 828, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 780, 840, 841, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 827, 828, 855, 856, 857, 858, 859, 860, + 856, 861, 862, 863, 864, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 877, 879, 880, + 881, 882, 883, 884, 885, 887, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 857, 901, 902, + 903, 904, 905, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 898, 921, 924, 926, - 917, 919, 921, 922, 923, 892, 924, 925, 926, 928, - 929, 931, 932, 933, 934, 937, 939, 940, 941, 942, - 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 961, 962, 963, - 964, 965, 966, 967, 968, 970, 971, 972, 973, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 985, - 986, 987, 957, 990, 991, 992, 993, 994, 986, 995, - 996, 997, 998, 999, 1001, 947, 1002, 1003, 1006, 961, - 1009, 1010, 1011, 1012, 1013, 1015, 1017, 1018, 1019, 1020, - 1021, 1022, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 928, 929, 899, 930, 931, 932, 933, 934, 936, 937, + 939, 940, 941, 942, 945, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 965, 966, 967, 969, 970, 971, 972, + 973, 974, 975, 976, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 994, + 965, 995, 996, 999, 1000, 1001, 1002, 1003, 1004, 995, + 1005, 1006, 1007, 955, 1008, 1010, 1011, 969, 1012, 1015, + 1018, 1019, 1020, 1021, 1022, 1024, 1026, 1027, 1028, 1029, + 1030, 1031, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, - 1032, 1033, 1035, 1037, 1039, 1040, 1041, 1013, 1043, 1044, - 1045, 1046, 1047, 1050, 1052, 1053, 1054, 1056, 1057, 1059, - 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1069, 1071, 1072, - 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, - 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1061, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1099, 1102, 1104, 1105, - 1106, 1107, 1108, 1104, 1109, 1110, 1112, 1115, 1116, 1118, - 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1129, - 1130, 1132, 1096, 1134, 1135, 1136, 1137, 1138, 1140, 1141, - 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, + 1041, 1042, 1044, 1046, 1047, 1049, 1022, 1050, 1051, 1053, + 1054, 1055, 1056, 1057, 1060, 1062, 1063, 1064, 1066, 1067, + 1069, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1079, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1071, 1100, 1101, + 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1110, 1113, 1115, + 1116, 1117, 1118, 1119, 1115, 1120, 1121, 1123, 1126, 1127, + 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1140, 1141, 1107, 1143, 1145, 1146, 1147, 1148, 1149, 1151, + 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, - 1153, 1155, 1156, 1157, 1158, 1159, 1161, 1162, 1163, 1164, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1174, 1175, 1176, - 1177, 1178, 1179, 1180, 1181, 1183, 1184, 1185, 1186, 1188, - 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1200, 1203, 1204, 1205, 1206, 1208, 1210, 1211, 1213, 1214, - 1215, 1216, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, - 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, - 1236, 1237, 1238, 1240, 1242, 1243, 1244, 1245, 1246, 1250, - 1251, 1252, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1262, - 1263, 1266, 1266, 1266, 1266, 1266, 1267, 1267, 1267, 1267, + 1162, 1164, 1166, 1167, 1168, 1169, 1170, 1172, 1173, 1174, + 1175, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1194, 1195, 1196, 1197, + 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, + 1209, 1211, 1214, 1215, 1216, 1217, 1219, 1221, 1222, 1224, + 1225, 1226, 1227, 1229, 1230, 1231, 1232, 1233, 1234, 1235, + 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1247, 1248, 1249, 1251, 1253, 1254, 1255, 1256, 1257, + 1261, 1262, 1263, 1265, 1266, 1267, 1268, 1269, 1270, 1271, + 1273, 1274, 1277, 1277, 1277, 1277, 1277, 1278, 1278, 1278, - 1267, 1268, 1274, 1268, 1268, 1268, 1269, 1275, 1269, 1276, - 1269, 1270, 1270, 1270, 1270, 1270, 1271, 1271, 1271, 1271, - 1271, 1272, 1277, 1272, 1272, 1272, 1273, 1273, 1273, 722, - 721, 720, 719, 718, 717, 715, 714, 713, 712, 711, - 710, 708, 707, 704, 703, 702, 699, 698, 697, 696, - 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, - 684, 683, 682, 681, 680, 679, 678, 677, 676, 675, - 674, 673, 672, 671, 670, 669, 668, 667, 665, 663, - 662, 661, 660, 659, 658, 655, 654, 651, 650, 649, - 648, 647, 646, 645, 644, 643, 642, 641, 640, 639, + 1278, 1278, 1279, 1285, 1279, 1279, 1279, 1280, 1286, 1280, + 1287, 1280, 1281, 1281, 1281, 1281, 1281, 1282, 1282, 1282, + 1282, 1282, 1283, 1288, 1283, 1283, 1283, 1284, 1284, 1284, + 716, 715, 713, 712, 709, 708, 707, 704, 703, 702, + 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, + 691, 690, 688, 687, 686, 685, 684, 683, 682, 681, + 680, 679, 678, 677, 676, 675, 674, 673, 672, 671, + 669, 667, 666, 665, 664, 663, 662, 660, 659, 656, + 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, + 645, 644, 642, 641, 640, 639, 638, 637, 636, 635, - 637, 636, 635, 634, 633, 632, 631, 630, 628, 627, - 626, 625, 624, 622, 621, 620, 619, 618, 617, 616, - 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, - 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, - 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, - 582, 581, 580, 577, 576, 575, 572, 571, 570, 569, - 568, 567, 566, 565, 564, 562, 561, 560, 559, 558, - 557, 556, 554, 553, 551, 550, 549, 548, 547, 545, - 544, 543, 542, 540, 539, 538, 537, 536, 535, 534, - 533, 532, 531, 530, 529, 528, 527, 526, 524, 523, + 633, 632, 631, 630, 629, 627, 626, 625, 624, 623, + 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, + 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, + 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, + 592, 591, 590, 586, 585, 584, 581, 580, 579, 578, + 576, 575, 574, 573, 572, 571, 570, 569, 568, 566, + 565, 564, 563, 562, 561, 560, 558, 557, 555, 554, + 553, 552, 551, 549, 548, 546, 545, 543, 542, 541, + 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, + 530, 529, 528, 526, 525, 524, 523, 522, 521, 520, - 522, 521, 520, 519, 518, 516, 515, 514, 513, 512, - 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, - 501, 500, 494, 492, 489, 488, 486, 485, 484, 482, - 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, - 467, 466, 465, 464, 463, 462, 461, 460, 459, 458, - 456, 454, 453, 452, 451, 450, 449, 448, 447, 446, - 445, 443, 442, 441, 440, 439, 438, 437, 436, 435, - 434, 433, 432, 431, 430, 429, 428, 427, 426, 425, - 424, 422, 421, 420, 418, 417, 416, 415, 414, 413, - 411, 410, 409, 408, 407, 406, 404, 403, 402, 401, + 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, + 508, 507, 506, 505, 504, 503, 502, 497, 495, 492, + 491, 489, 488, 487, 485, 481, 480, 479, 478, 477, + 476, 475, 474, 473, 472, 470, 469, 468, 467, 466, + 465, 464, 463, 462, 461, 459, 457, 456, 455, 454, + 453, 452, 451, 450, 449, 448, 447, 445, 444, 443, + 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, + 432, 431, 430, 429, 428, 427, 426, 425, 423, 422, + 421, 419, 418, 417, 416, 415, 414, 412, 411, 410, + 409, 408, 407, 405, 404, 403, 402, 400, 399, 394, - 399, 398, 393, 392, 390, 389, 388, 387, 386, 383, - 380, 378, 377, 376, 375, 374, 373, 372, 371, 370, - 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, - 359, 358, 357, 355, 354, 352, 351, 350, 349, 348, - 347, 346, 345, 342, 341, 340, 339, 338, 336, 335, - 334, 333, 332, 331, 330, 329, 328, 327, 326, 324, - 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, - 313, 311, 310, 309, 308, 307, 304, 303, 302, 301, - 297, 295, 292, 290, 287, 284, 277, 276, 275, 274, - 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, + 392, 391, 390, 389, 388, 385, 382, 380, 379, 378, + 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, + 367, 366, 365, 364, 363, 362, 361, 360, 359, 357, + 356, 354, 353, 352, 351, 350, 349, 348, 347, 345, + 343, 342, 341, 340, 339, 337, 336, 335, 334, 333, + 332, 331, 330, 329, 328, 327, 326, 324, 323, 322, + 321, 320, 319, 318, 317, 316, 315, 314, 313, 311, + 310, 309, 308, 307, 304, 303, 302, 301, 297, 295, + 293, 291, 288, 285, 278, 277, 276, 275, 274, 273, + 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, - 263, 262, 261, 259, 258, 257, 256, 255, 254, 253, - 252, 251, 250, 249, 248, 247, 246, 244, 243, 242, - 241, 240, 239, 237, 236, 235, 234, 233, 232, 231, - 230, 229, 227, 226, 225, 224, 223, 222, 221, 220, - 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, - 209, 208, 207, 206, 204, 203, 202, 200, 197, 195, - 193, 191, 190, 185, 184, 180, 172, 171, 170, 169, + 262, 260, 259, 258, 257, 256, 255, 254, 253, 252, + 251, 250, 249, 248, 247, 245, 244, 243, 242, 241, + 240, 239, 237, 236, 235, 234, 233, 232, 231, 230, + 229, 228, 226, 225, 224, 223, 222, 221, 220, 219, + 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, + 208, 207, 206, 205, 203, 202, 201, 199, 196, 194, + 192, 191, 190, 185, 184, 180, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 160, 159, 158, 156, - 155, 153, 152, 151, 150, 149, 148, 147, 146, 144, - 143, 142, 141, 140, 139, 138, 136, 135, 133, 129, + 155, 153, 152, 151, 150, 149, 148, 147, 146, 145, + 143, 142, 141, 140, 139, 138, 137, 136, 134, 133, - 128, 127, 125, 124, 123, 121, 120, 116, 110, 106, - 105, 104, 98, 97, 78, 73, 67, 64, 50, 49, - 48, 43, 41, 39, 38, 24, 14, 11, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265 + 131, 127, 126, 125, 123, 122, 121, 119, 118, 114, + 109, 105, 104, 103, 97, 96, 77, 72, 63, 50, + 49, 48, 43, 41, 39, 38, 24, 14, 11, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, + 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 } ; @@ -1568,20 +1570,20 @@ static const flex_int16_t yy_rule_linenum[161] = 145, 147, 149, 154, 155, 160, 161, 162, 174, 177, 182, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 325, 335, 345, 355, - 365, 375, 385, 395, 405, 414, 423, 432, 441, 450, - 459, 468, 480, 489, 498, 507, 516, 526, 536, 546, - 556, 567, 577, 587, 597, 607, 618, 629, 640, 651, - 660, 670, 679, 688, 704, 720, 729, 738, 747, 756, - 765, 774, 783, 792, 801, 810, 821, 830, 840, 850, - 859, 869, 879, 888, 897, 906, 915, 925, 934, 943, - 952, 961, 970, 979, 988, 997, 1006, 1016, 1025, 1034, + 365, 384, 394, 404, 414, 423, 432, 441, 450, 459, + 468, 477, 489, 498, 507, 516, 525, 535, 545, 555, + 565, 576, 586, 596, 606, 616, 627, 638, 649, 660, + 669, 679, 688, 697, 713, 729, 738, 747, 756, 765, + 774, 783, 792, 801, 810, 819, 830, 855, 865, 875, + 884, 894, 904, 913, 922, 931, 940, 950, 959, 968, + 977, 986, 995, 1004, 1013, 1022, 1031, 1041, 1050, 1059, - 1044, 1057, 1067, 1076, 1085, 1094, 1105, 1115, 1124, 1134, - 1144, 1153, 1162, 1171, 1180, 1190, 1199, 1209, 1218, 1227, - 1236, 1245, 1254, 1263, 1272, 1281, 1290, 1299, 1308, 1317, - 1326, 1335, 1344, 1353, 1362, 1371, 1380, 1389, 1398, 1407, - 1416, 1425, 1435, 1533, 1538, 1543, 1548, 1549, 1550, 1551, - 1552, 1553, 1555, 1573, 1586, 1591, 1595, 1597, 1599, 1601 + 1069, 1082, 1092, 1101, 1110, 1119, 1130, 1140, 1149, 1159, + 1169, 1178, 1187, 1196, 1205, 1215, 1224, 1234, 1243, 1252, + 1261, 1270, 1279, 1288, 1297, 1306, 1315, 1324, 1333, 1342, + 1351, 1360, 1369, 1378, 1387, 1396, 1405, 1414, 1423, 1432, + 1441, 1450, 1460, 1558, 1563, 1568, 1573, 1574, 1575, 1576, + 1577, 1578, 1580, 1598, 1611, 1616, 1620, 1622, 1624, 1626 } ; /* The intent behind this definition is that it'll catch @@ -1634,7 +1636,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg) -#line 1637 "dhcp6_lexer.cc" +#line 1639 "dhcp6_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1660,8 +1662,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1663 "dhcp6_lexer.cc" -#line 1664 "dhcp6_lexer.cc" +#line 1665 "dhcp6_lexer.cc" +#line 1666 "dhcp6_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -1989,7 +1991,7 @@ YY_DECL } -#line 1992 "dhcp6_lexer.cc" +#line 1994 "dhcp6_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2018,13 +2020,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1266 ) + if ( yy_current_state >= 1277 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1265 ); + while ( yy_current_state != 1276 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2390,6 +2392,15 @@ case 31: YY_RULE_SETUP #line 365 "dhcp6_lexer.ll" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::KNOWN_CLIENTS: + case isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME: + return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("never", driver.loc_); +} + +(?i:\"never\") { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); @@ -2401,7 +2412,7 @@ YY_RULE_SETUP YY_BREAK case 32: YY_RULE_SETUP -#line 375 "dhcp6_lexer.ll" +#line 384 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2414,7 +2425,7 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 385 "dhcp6_lexer.ll" +#line 394 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2427,7 +2438,7 @@ YY_RULE_SETUP YY_BREAK case 34: YY_RULE_SETUP -#line 395 "dhcp6_lexer.ll" +#line 404 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2440,7 +2451,7 @@ YY_RULE_SETUP YY_BREAK case 35: YY_RULE_SETUP -#line 405 "dhcp6_lexer.ll" +#line 414 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -2452,7 +2463,7 @@ YY_RULE_SETUP YY_BREAK case 36: YY_RULE_SETUP -#line 414 "dhcp6_lexer.ll" +#line 423 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2464,7 +2475,7 @@ YY_RULE_SETUP YY_BREAK case 37: YY_RULE_SETUP -#line 423 "dhcp6_lexer.ll" +#line 432 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2476,7 +2487,7 @@ YY_RULE_SETUP YY_BREAK case 38: YY_RULE_SETUP -#line 432 "dhcp6_lexer.ll" +#line 441 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2488,7 +2499,7 @@ YY_RULE_SETUP YY_BREAK case 39: YY_RULE_SETUP -#line 441 "dhcp6_lexer.ll" +#line 450 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2500,7 +2511,7 @@ YY_RULE_SETUP YY_BREAK case 40: YY_RULE_SETUP -#line 450 "dhcp6_lexer.ll" +#line 459 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2512,7 +2523,7 @@ YY_RULE_SETUP YY_BREAK case 41: YY_RULE_SETUP -#line 459 "dhcp6_lexer.ll" +#line 468 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOSTS_DATABASE: @@ -2524,7 +2535,7 @@ YY_RULE_SETUP YY_BREAK case 42: YY_RULE_SETUP -#line 468 "dhcp6_lexer.ll" +#line 477 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2539,7 +2550,7 @@ YY_RULE_SETUP YY_BREAK case 43: YY_RULE_SETUP -#line 480 "dhcp6_lexer.ll" +#line 489 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2551,7 +2562,7 @@ YY_RULE_SETUP YY_BREAK case 44: YY_RULE_SETUP -#line 489 "dhcp6_lexer.ll" +#line 498 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2563,7 +2574,7 @@ YY_RULE_SETUP YY_BREAK case 45: YY_RULE_SETUP -#line 498 "dhcp6_lexer.ll" +#line 507 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2575,7 +2586,7 @@ YY_RULE_SETUP YY_BREAK case 46: YY_RULE_SETUP -#line 507 "dhcp6_lexer.ll" +#line 516 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2587,7 +2598,7 @@ YY_RULE_SETUP YY_BREAK case 47: YY_RULE_SETUP -#line 516 "dhcp6_lexer.ll" +#line 525 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2600,7 +2611,7 @@ YY_RULE_SETUP YY_BREAK case 48: YY_RULE_SETUP -#line 526 "dhcp6_lexer.ll" +#line 535 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2613,7 +2624,7 @@ YY_RULE_SETUP YY_BREAK case 49: YY_RULE_SETUP -#line 536 "dhcp6_lexer.ll" +#line 545 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2626,7 +2637,7 @@ YY_RULE_SETUP YY_BREAK case 50: YY_RULE_SETUP -#line 546 "dhcp6_lexer.ll" +#line 555 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2639,7 +2650,7 @@ YY_RULE_SETUP YY_BREAK case 51: YY_RULE_SETUP -#line 556 "dhcp6_lexer.ll" +#line 565 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2653,7 +2664,7 @@ YY_RULE_SETUP YY_BREAK case 52: YY_RULE_SETUP -#line 567 "dhcp6_lexer.ll" +#line 576 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2666,7 +2677,7 @@ YY_RULE_SETUP YY_BREAK case 53: YY_RULE_SETUP -#line 577 "dhcp6_lexer.ll" +#line 586 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2679,7 +2690,7 @@ YY_RULE_SETUP YY_BREAK case 54: YY_RULE_SETUP -#line 587 "dhcp6_lexer.ll" +#line 596 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2692,7 +2703,7 @@ YY_RULE_SETUP YY_BREAK case 55: YY_RULE_SETUP -#line 597 "dhcp6_lexer.ll" +#line 606 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2705,7 +2716,7 @@ YY_RULE_SETUP YY_BREAK case 56: YY_RULE_SETUP -#line 607 "dhcp6_lexer.ll" +#line 616 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2719,7 +2730,7 @@ YY_RULE_SETUP YY_BREAK case 57: YY_RULE_SETUP -#line 618 "dhcp6_lexer.ll" +#line 627 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2733,7 +2744,7 @@ YY_RULE_SETUP YY_BREAK case 58: YY_RULE_SETUP -#line 629 "dhcp6_lexer.ll" +#line 638 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2747,7 +2758,7 @@ YY_RULE_SETUP YY_BREAK case 59: YY_RULE_SETUP -#line 640 "dhcp6_lexer.ll" +#line 649 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2761,7 +2772,7 @@ YY_RULE_SETUP YY_BREAK case 60: YY_RULE_SETUP -#line 651 "dhcp6_lexer.ll" +#line 660 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2773,7 +2784,7 @@ YY_RULE_SETUP YY_BREAK case 61: YY_RULE_SETUP -#line 660 "dhcp6_lexer.ll" +#line 669 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2786,7 +2797,7 @@ YY_RULE_SETUP YY_BREAK case 62: YY_RULE_SETUP -#line 670 "dhcp6_lexer.ll" +#line 679 "dhcp6_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2798,7 +2809,7 @@ YY_RULE_SETUP YY_BREAK case 63: YY_RULE_SETUP -#line 679 "dhcp6_lexer.ll" +#line 688 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2810,7 +2821,7 @@ YY_RULE_SETUP YY_BREAK case 64: YY_RULE_SETUP -#line 688 "dhcp6_lexer.ll" +#line 697 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2829,7 +2840,7 @@ YY_RULE_SETUP YY_BREAK case 65: YY_RULE_SETUP -#line 704 "dhcp6_lexer.ll" +#line 713 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2848,7 +2859,7 @@ YY_RULE_SETUP YY_BREAK case 66: YY_RULE_SETUP -#line 720 "dhcp6_lexer.ll" +#line 729 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2860,7 +2871,7 @@ YY_RULE_SETUP YY_BREAK case 67: YY_RULE_SETUP -#line 729 "dhcp6_lexer.ll" +#line 738 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2872,7 +2883,7 @@ YY_RULE_SETUP YY_BREAK case 68: YY_RULE_SETUP -#line 738 "dhcp6_lexer.ll" +#line 747 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2884,7 +2895,7 @@ YY_RULE_SETUP YY_BREAK case 69: YY_RULE_SETUP -#line 747 "dhcp6_lexer.ll" +#line 756 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2896,7 +2907,7 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 756 "dhcp6_lexer.ll" +#line 765 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2908,7 +2919,7 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 765 "dhcp6_lexer.ll" +#line 774 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2920,7 +2931,7 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 774 "dhcp6_lexer.ll" +#line 783 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2932,7 +2943,7 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 783 "dhcp6_lexer.ll" +#line 792 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2944,7 +2955,7 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 792 "dhcp6_lexer.ll" +#line 801 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2956,7 +2967,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 801 "dhcp6_lexer.ll" +#line 810 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -2968,7 +2979,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 810 "dhcp6_lexer.ll" +#line 819 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -2982,8 +2993,24 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 821 "dhcp6_lexer.ll" +#line 830 "dhcp6_lexer.ll" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::POOLS: + return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); +} + +\"only\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::KNOWN_CLIENTS: + return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); +} + +\"subnet\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: return isc::dhcp::Dhcp6Parser::make_SUBNET(driver.loc_); @@ -2994,7 +3021,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 830 "dhcp6_lexer.ll" +#line 855 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3007,7 +3034,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 840 "dhcp6_lexer.ll" +#line 865 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3020,7 +3047,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 850 "dhcp6_lexer.ll" +#line 875 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3032,7 +3059,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 859 "dhcp6_lexer.ll" +#line 884 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3045,7 +3072,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 869 "dhcp6_lexer.ll" +#line 894 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3058,7 +3085,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 879 "dhcp6_lexer.ll" +#line 904 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3070,7 +3097,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 888 "dhcp6_lexer.ll" +#line 913 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3082,7 +3109,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 897 "dhcp6_lexer.ll" +#line 922 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3094,7 +3121,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 906 "dhcp6_lexer.ll" +#line 931 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3106,7 +3133,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 915 "dhcp6_lexer.ll" +#line 940 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3119,7 +3146,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 925 "dhcp6_lexer.ll" +#line 950 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3131,7 +3158,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 934 "dhcp6_lexer.ll" +#line 959 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3143,7 +3170,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 943 "dhcp6_lexer.ll" +#line 968 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3155,7 +3182,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 952 "dhcp6_lexer.ll" +#line 977 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3167,7 +3194,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 961 "dhcp6_lexer.ll" +#line 986 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3179,7 +3206,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 970 "dhcp6_lexer.ll" +#line 995 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3191,7 +3218,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 979 "dhcp6_lexer.ll" +#line 1004 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3203,7 +3230,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 988 "dhcp6_lexer.ll" +#line 1013 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3215,7 +3242,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 997 "dhcp6_lexer.ll" +#line 1022 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3227,7 +3254,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1006 "dhcp6_lexer.ll" +#line 1031 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3239,7 +3266,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1016 "dhcp6_lexer.ll" +#line 1041 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3251,7 +3278,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1025 "dhcp6_lexer.ll" +#line 1050 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3263,7 +3290,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1034 "dhcp6_lexer.ll" +#line 1059 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3276,7 +3303,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1044 "dhcp6_lexer.ll" +#line 1069 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3292,7 +3319,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1057 "dhcp6_lexer.ll" +#line 1082 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3305,7 +3332,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1067 "dhcp6_lexer.ll" +#line 1092 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3317,7 +3344,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1076 "dhcp6_lexer.ll" +#line 1101 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3329,7 +3356,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1085 "dhcp6_lexer.ll" +#line 1110 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3341,7 +3368,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1094 "dhcp6_lexer.ll" +#line 1119 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3355,7 +3382,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1105 "dhcp6_lexer.ll" +#line 1130 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3368,7 +3395,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1115 "dhcp6_lexer.ll" +#line 1140 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3380,7 +3407,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1124 "dhcp6_lexer.ll" +#line 1149 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3393,7 +3420,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1134 "dhcp6_lexer.ll" +#line 1159 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3406,7 +3433,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1144 "dhcp6_lexer.ll" +#line 1169 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3418,7 +3445,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1153 "dhcp6_lexer.ll" +#line 1178 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3430,7 +3457,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1162 "dhcp6_lexer.ll" +#line 1187 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3442,7 +3469,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1171 "dhcp6_lexer.ll" +#line 1196 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3454,7 +3481,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1180 "dhcp6_lexer.ll" +#line 1205 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3467,7 +3494,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1190 "dhcp6_lexer.ll" +#line 1215 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3479,7 +3506,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1199 "dhcp6_lexer.ll" +#line 1224 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3491,7 +3518,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1209 "dhcp6_lexer.ll" +#line 1234 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3503,7 +3530,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1218 "dhcp6_lexer.ll" +#line 1243 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3515,7 +3542,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1227 "dhcp6_lexer.ll" +#line 1252 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3527,7 +3554,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1236 "dhcp6_lexer.ll" +#line 1261 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3539,7 +3566,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1245 "dhcp6_lexer.ll" +#line 1270 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3551,7 +3578,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1254 "dhcp6_lexer.ll" +#line 1279 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3563,7 +3590,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1263 "dhcp6_lexer.ll" +#line 1288 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3575,7 +3602,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1272 "dhcp6_lexer.ll" +#line 1297 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3587,7 +3614,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1281 "dhcp6_lexer.ll" +#line 1306 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3599,7 +3626,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1290 "dhcp6_lexer.ll" +#line 1315 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3611,7 +3638,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1299 "dhcp6_lexer.ll" +#line 1324 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3623,7 +3650,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1308 "dhcp6_lexer.ll" +#line 1333 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3635,7 +3662,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1317 "dhcp6_lexer.ll" +#line 1342 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3647,7 +3674,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1326 "dhcp6_lexer.ll" +#line 1351 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3659,7 +3686,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1335 "dhcp6_lexer.ll" +#line 1360 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3671,7 +3698,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1344 "dhcp6_lexer.ll" +#line 1369 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3683,7 +3710,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1353 "dhcp6_lexer.ll" +#line 1378 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3695,7 +3722,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1362 "dhcp6_lexer.ll" +#line 1387 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3707,7 +3734,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1371 "dhcp6_lexer.ll" +#line 1396 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3719,7 +3746,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1380 "dhcp6_lexer.ll" +#line 1405 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3731,7 +3758,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1389 "dhcp6_lexer.ll" +#line 1414 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3743,7 +3770,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1398 "dhcp6_lexer.ll" +#line 1423 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3755,7 +3782,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1407 "dhcp6_lexer.ll" +#line 1432 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3767,7 +3794,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1416 "dhcp6_lexer.ll" +#line 1441 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3779,7 +3806,7 @@ YY_RULE_SETUP YY_BREAK case 142: YY_RULE_SETUP -#line 1425 "dhcp6_lexer.ll" +#line 1450 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3791,7 +3818,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1435 "dhcp6_lexer.ll" +#line 1460 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3893,7 +3920,7 @@ YY_RULE_SETUP case 144: /* rule 144 can match eol */ YY_RULE_SETUP -#line 1533 "dhcp6_lexer.ll" +#line 1558 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3902,7 +3929,7 @@ YY_RULE_SETUP case 145: /* rule 145 can match eol */ YY_RULE_SETUP -#line 1538 "dhcp6_lexer.ll" +#line 1563 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3910,7 +3937,7 @@ YY_RULE_SETUP YY_BREAK case 146: YY_RULE_SETUP -#line 1543 "dhcp6_lexer.ll" +#line 1568 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3918,37 +3945,37 @@ YY_RULE_SETUP YY_BREAK case 147: YY_RULE_SETUP -#line 1548 "dhcp6_lexer.ll" +#line 1573 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1549 "dhcp6_lexer.ll" +#line 1574 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1550 "dhcp6_lexer.ll" +#line 1575 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1551 "dhcp6_lexer.ll" +#line 1576 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1552 "dhcp6_lexer.ll" +#line 1577 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1553 "dhcp6_lexer.ll" +#line 1578 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1555 "dhcp6_lexer.ll" +#line 1580 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3969,7 +3996,7 @@ YY_RULE_SETUP YY_BREAK case 154: YY_RULE_SETUP -#line 1573 "dhcp6_lexer.ll" +#line 1598 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -3985,7 +4012,7 @@ YY_RULE_SETUP YY_BREAK case 155: YY_RULE_SETUP -#line 1586 "dhcp6_lexer.ll" +#line 1611 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -3993,33 +4020,33 @@ YY_RULE_SETUP YY_BREAK case 156: YY_RULE_SETUP -#line 1591 "dhcp6_lexer.ll" +#line 1616 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 157: YY_RULE_SETUP -#line 1595 "dhcp6_lexer.ll" +#line 1620 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 158: YY_RULE_SETUP -#line 1597 "dhcp6_lexer.ll" +#line 1622 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 159: YY_RULE_SETUP -#line 1599 "dhcp6_lexer.ll" +#line 1624 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1601 "dhcp6_lexer.ll" +#line 1626 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1603 "dhcp6_lexer.ll" +#line 1628 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4045,10 +4072,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 161: YY_RULE_SETUP -#line 1626 "dhcp6_lexer.ll" +#line 1651 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4051 "dhcp6_lexer.cc" +#line 4078 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4367,7 +4394,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1266 ) + if ( yy_current_state >= 1277 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4400,11 +4427,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1266 ) + if ( yy_current_state >= 1277 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1265); + yy_is_jam = (yy_current_state == 1276); return yy_is_jam ? 0 : yy_current_state; } @@ -5153,7 +5180,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1626 "dhcp6_lexer.ll" +#line 1651 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index 93f236d87b..f00484b8a3 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -253,29 +253,30 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 154: // "boolean" + case 156: // "boolean" value.move< bool > (that.value); break; - case 153: // "floating point" + case 155: // "floating point" value.move< double > (that.value); break; - case 152: // "integer" + case 154: // "integer" value.move< int64_t > (that.value); break; - case 151: // "constant string" + case 153: // "constant string" value.move< std::string > (that.value); break; @@ -294,29 +295,30 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 154: // "boolean" + case 156: // "boolean" value.copy< bool > (that.value); break; - case 153: // "floating point" + case 155: // "floating point" value.copy< double > (that.value); break; - case 152: // "integer" + case 154: // "integer" value.copy< int64_t > (that.value); break; - case 151: // "constant string" + case 153: // "constant string" value.copy< std::string > (that.value); break; @@ -356,81 +358,88 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 151: // "constant string" + case 153: // "constant string" -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } -#line 364 "dhcp6_parser.cc" // lalr1.cc:636 +#line 366 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 152: // "integer" + case 154: // "integer" -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } -#line 371 "dhcp6_parser.cc" // lalr1.cc:636 +#line 373 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 153: // "floating point" + case 155: // "floating point" -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } -#line 378 "dhcp6_parser.cc" // lalr1.cc:636 +#line 380 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 154: // "boolean" + case 156: // "boolean" -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } -#line 385 "dhcp6_parser.cc" // lalr1.cc:636 +#line 387 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 170: // value + case 172: // value -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 392 "dhcp6_parser.cc" // lalr1.cc:636 +#line 394 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 174: // map_value + case 176: // map_value -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 399 "dhcp6_parser.cc" // lalr1.cc:636 +#line 401 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 218: // db_type + case 220: // db_type -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 406 "dhcp6_parser.cc" // lalr1.cc:636 +#line 408 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 294: // hr_mode + case 296: // hr_mode -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 413 "dhcp6_parser.cc" // lalr1.cc:636 +#line 415 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 426: // duid_type + case 367: // known_clients_value -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 420 "dhcp6_parser.cc" // lalr1.cc:636 +#line 422 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 459: // ncr_protocol_value + case 431: // duid_type -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 427 "dhcp6_parser.cc" // lalr1.cc:636 +#line 429 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 467: // replace_client_name_value + case 464: // ncr_protocol_value -#line 227 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 434 "dhcp6_parser.cc" // lalr1.cc:636 +#line 436 "dhcp6_parser.cc" // lalr1.cc:636 + break; + + case 472: // replace_client_name_value + +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 + { yyoutput << yysym.value.template as< ElementPtr > (); } +#line 443 "dhcp6_parser.cc" // lalr1.cc:636 break; @@ -630,29 +639,30 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 154: // "boolean" + case 156: // "boolean" yylhs.value.build< bool > (); break; - case 153: // "floating point" + case 155: // "floating point" yylhs.value.build< double > (); break; - case 152: // "integer" + case 154: // "integer" yylhs.value.build< int64_t > (); break; - case 151: // "constant string" + case 153: // "constant string" yylhs.value.build< std::string > (); break; @@ -674,274 +684,274 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 236 "dhcp6_parser.yy" // lalr1.cc:859 +#line 239 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } -#line 680 "dhcp6_parser.cc" // lalr1.cc:859 +#line 690 "dhcp6_parser.cc" // lalr1.cc:859 break; case 4: -#line 237 "dhcp6_parser.yy" // lalr1.cc:859 +#line 240 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } -#line 686 "dhcp6_parser.cc" // lalr1.cc:859 +#line 696 "dhcp6_parser.cc" // lalr1.cc:859 break; case 6: -#line 238 "dhcp6_parser.yy" // lalr1.cc:859 +#line 241 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } -#line 692 "dhcp6_parser.cc" // lalr1.cc:859 +#line 702 "dhcp6_parser.cc" // lalr1.cc:859 break; case 8: -#line 239 "dhcp6_parser.yy" // lalr1.cc:859 +#line 242 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } -#line 698 "dhcp6_parser.cc" // lalr1.cc:859 +#line 708 "dhcp6_parser.cc" // lalr1.cc:859 break; case 10: -#line 240 "dhcp6_parser.yy" // lalr1.cc:859 +#line 243 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET6; } -#line 704 "dhcp6_parser.cc" // lalr1.cc:859 +#line 714 "dhcp6_parser.cc" // lalr1.cc:859 break; case 12: -#line 241 "dhcp6_parser.yy" // lalr1.cc:859 +#line 244 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } -#line 710 "dhcp6_parser.cc" // lalr1.cc:859 +#line 720 "dhcp6_parser.cc" // lalr1.cc:859 break; case 14: -#line 242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 245 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.PD_POOLS; } -#line 716 "dhcp6_parser.cc" // lalr1.cc:859 +#line 726 "dhcp6_parser.cc" // lalr1.cc:859 break; case 16: -#line 243 "dhcp6_parser.yy" // lalr1.cc:859 +#line 246 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } -#line 722 "dhcp6_parser.cc" // lalr1.cc:859 +#line 732 "dhcp6_parser.cc" // lalr1.cc:859 break; case 18: -#line 244 "dhcp6_parser.yy" // lalr1.cc:859 +#line 247 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } -#line 728 "dhcp6_parser.cc" // lalr1.cc:859 +#line 738 "dhcp6_parser.cc" // lalr1.cc:859 break; case 20: -#line 245 "dhcp6_parser.yy" // lalr1.cc:859 +#line 248 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } -#line 734 "dhcp6_parser.cc" // lalr1.cc:859 +#line 744 "dhcp6_parser.cc" // lalr1.cc:859 break; case 22: -#line 246 "dhcp6_parser.yy" // lalr1.cc:859 +#line 249 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } -#line 740 "dhcp6_parser.cc" // lalr1.cc:859 +#line 750 "dhcp6_parser.cc" // lalr1.cc:859 break; case 24: -#line 247 "dhcp6_parser.yy" // lalr1.cc:859 +#line 250 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } -#line 746 "dhcp6_parser.cc" // lalr1.cc:859 +#line 756 "dhcp6_parser.cc" // lalr1.cc:859 break; case 26: -#line 248 "dhcp6_parser.yy" // lalr1.cc:859 +#line 251 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } -#line 752 "dhcp6_parser.cc" // lalr1.cc:859 +#line 762 "dhcp6_parser.cc" // lalr1.cc:859 break; case 28: -#line 256 "dhcp6_parser.yy" // lalr1.cc:859 +#line 259 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } -#line 758 "dhcp6_parser.cc" // lalr1.cc:859 +#line 768 "dhcp6_parser.cc" // lalr1.cc:859 break; case 29: -#line 257 "dhcp6_parser.yy" // lalr1.cc:859 +#line 260 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } -#line 764 "dhcp6_parser.cc" // lalr1.cc:859 +#line 774 "dhcp6_parser.cc" // lalr1.cc:859 break; case 30: -#line 258 "dhcp6_parser.yy" // lalr1.cc:859 +#line 261 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } -#line 770 "dhcp6_parser.cc" // lalr1.cc:859 +#line 780 "dhcp6_parser.cc" // lalr1.cc:859 break; case 31: -#line 259 "dhcp6_parser.yy" // lalr1.cc:859 +#line 262 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } -#line 776 "dhcp6_parser.cc" // lalr1.cc:859 +#line 786 "dhcp6_parser.cc" // lalr1.cc:859 break; case 32: -#line 260 "dhcp6_parser.yy" // lalr1.cc:859 +#line 263 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } -#line 782 "dhcp6_parser.cc" // lalr1.cc:859 +#line 792 "dhcp6_parser.cc" // lalr1.cc:859 break; case 33: -#line 261 "dhcp6_parser.yy" // lalr1.cc:859 +#line 264 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 788 "dhcp6_parser.cc" // lalr1.cc:859 +#line 798 "dhcp6_parser.cc" // lalr1.cc:859 break; case 34: -#line 262 "dhcp6_parser.yy" // lalr1.cc:859 +#line 265 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 794 "dhcp6_parser.cc" // lalr1.cc:859 +#line 804 "dhcp6_parser.cc" // lalr1.cc:859 break; case 35: -#line 265 "dhcp6_parser.yy" // lalr1.cc:859 +#line 268 "dhcp6_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); } -#line 803 "dhcp6_parser.cc" // lalr1.cc:859 +#line 813 "dhcp6_parser.cc" // lalr1.cc:859 break; case 36: -#line 270 "dhcp6_parser.yy" // lalr1.cc:859 +#line 273 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 814 "dhcp6_parser.cc" // lalr1.cc:859 +#line 824 "dhcp6_parser.cc" // lalr1.cc:859 break; case 37: -#line 275 "dhcp6_parser.yy" // lalr1.cc:859 +#line 278 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place // for it. } -#line 824 "dhcp6_parser.cc" // lalr1.cc:859 +#line 834 "dhcp6_parser.cc" // lalr1.cc:859 break; case 38: -#line 281 "dhcp6_parser.yy" // lalr1.cc:859 +#line 284 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 830 "dhcp6_parser.cc" // lalr1.cc:859 +#line 840 "dhcp6_parser.cc" // lalr1.cc:859 break; case 41: -#line 288 "dhcp6_parser.yy" // lalr1.cc:859 +#line 291 "dhcp6_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 839 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 42: -#line 292 "dhcp6_parser.yy" // lalr1.cc:859 - { - // map consisting of a shorter map followed by - // comma and string:value - ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); - } #line 849 "dhcp6_parser.cc" // lalr1.cc:859 break; + case 42: +#line 295 "dhcp6_parser.yy" // lalr1.cc:859 + { + // map consisting of a shorter map followed by + // comma and string:value + ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); + } +#line 859 "dhcp6_parser.cc" // lalr1.cc:859 + break; + case 43: -#line 299 "dhcp6_parser.yy" // lalr1.cc:859 +#line 302 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); } -#line 858 "dhcp6_parser.cc" // lalr1.cc:859 +#line 868 "dhcp6_parser.cc" // lalr1.cc:859 break; case 44: -#line 302 "dhcp6_parser.yy" // lalr1.cc:859 +#line 305 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } -#line 866 "dhcp6_parser.cc" // lalr1.cc:859 +#line 876 "dhcp6_parser.cc" // lalr1.cc:859 break; case 47: -#line 310 "dhcp6_parser.yy" // lalr1.cc:859 +#line 313 "dhcp6_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 875 "dhcp6_parser.cc" // lalr1.cc:859 +#line 885 "dhcp6_parser.cc" // lalr1.cc:859 break; case 48: -#line 314 "dhcp6_parser.yy" // lalr1.cc:859 +#line 317 "dhcp6_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 884 "dhcp6_parser.cc" // lalr1.cc:859 +#line 894 "dhcp6_parser.cc" // lalr1.cc:859 break; case 49: -#line 321 "dhcp6_parser.yy" // lalr1.cc:859 +#line 324 "dhcp6_parser.yy" // lalr1.cc:859 { // List parsing about to start } -#line 892 "dhcp6_parser.cc" // lalr1.cc:859 +#line 902 "dhcp6_parser.cc" // lalr1.cc:859 break; case 50: -#line 323 "dhcp6_parser.yy" // lalr1.cc:859 +#line 326 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); } -#line 901 "dhcp6_parser.cc" // lalr1.cc:859 +#line 911 "dhcp6_parser.cc" // lalr1.cc:859 break; case 53: -#line 332 "dhcp6_parser.yy" // lalr1.cc:859 +#line 335 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 910 "dhcp6_parser.cc" // lalr1.cc:859 +#line 920 "dhcp6_parser.cc" // lalr1.cc:859 break; case 54: -#line 336 "dhcp6_parser.yy" // lalr1.cc:859 +#line 339 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 919 "dhcp6_parser.cc" // lalr1.cc:859 +#line 929 "dhcp6_parser.cc" // lalr1.cc:859 break; case 55: -#line 347 "dhcp6_parser.yy" // lalr1.cc:859 +#line 350 "dhcp6_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); error(yystack_[1].location, "got unexpected keyword \"" + keyword + "\" in " + where + " map."); } -#line 930 "dhcp6_parser.cc" // lalr1.cc:859 +#line 940 "dhcp6_parser.cc" // lalr1.cc:859 break; case 56: -#line 357 "dhcp6_parser.yy" // lalr1.cc:859 +#line 360 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 941 "dhcp6_parser.cc" // lalr1.cc:859 +#line 951 "dhcp6_parser.cc" // lalr1.cc:859 break; case 57: -#line 362 "dhcp6_parser.yy" // lalr1.cc:859 +#line 365 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -950,11 +960,11 @@ namespace isc { namespace dhcp { // Dhcp6 is required ctx.require("Dhcp6", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 954 "dhcp6_parser.cc" // lalr1.cc:859 +#line 964 "dhcp6_parser.cc" // lalr1.cc:859 break; case 66: -#line 385 "dhcp6_parser.yy" // lalr1.cc:859 +#line 388 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -963,688 +973,688 @@ namespace isc { namespace dhcp { ctx.stack_.push_back(m); ctx.enter(ctx.DHCP6); } -#line 967 "dhcp6_parser.cc" // lalr1.cc:859 +#line 977 "dhcp6_parser.cc" // lalr1.cc:859 break; case 67: -#line 392 "dhcp6_parser.yy" // lalr1.cc:859 +#line 395 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 977 "dhcp6_parser.cc" // lalr1.cc:859 +#line 987 "dhcp6_parser.cc" // lalr1.cc:859 break; case 68: -#line 400 "dhcp6_parser.yy" // lalr1.cc:859 +#line 403 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Dhcp6 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 987 "dhcp6_parser.cc" // lalr1.cc:859 +#line 997 "dhcp6_parser.cc" // lalr1.cc:859 break; case 69: -#line 404 "dhcp6_parser.yy" // lalr1.cc:859 +#line 407 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed } -#line 996 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1006 "dhcp6_parser.cc" // lalr1.cc:859 break; case 95: -#line 440 "dhcp6_parser.yy" // lalr1.cc:859 +#line 443 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("preferred-lifetime", prf); } -#line 1005 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1015 "dhcp6_parser.cc" // lalr1.cc:859 break; case 96: -#line 445 "dhcp6_parser.yy" // lalr1.cc:859 +#line 448 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); } -#line 1014 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1024 "dhcp6_parser.cc" // lalr1.cc:859 break; case 97: -#line 450 "dhcp6_parser.yy" // lalr1.cc:859 +#line 453 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); } -#line 1023 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1033 "dhcp6_parser.cc" // lalr1.cc:859 break; case 98: -#line 455 "dhcp6_parser.yy" // lalr1.cc:859 +#line 458 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); } -#line 1032 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1042 "dhcp6_parser.cc" // lalr1.cc:859 break; case 99: -#line 460 "dhcp6_parser.yy" // lalr1.cc:859 +#line 463 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); } -#line 1041 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1051 "dhcp6_parser.cc" // lalr1.cc:859 break; case 100: -#line 465 "dhcp6_parser.yy" // lalr1.cc:859 +#line 468 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); ctx.stack_.push_back(i); ctx.enter(ctx.INTERFACES_CONFIG); } -#line 1052 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1062 "dhcp6_parser.cc" // lalr1.cc:859 break; case 101: -#line 470 "dhcp6_parser.yy" // lalr1.cc:859 +#line 473 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1062 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1072 "dhcp6_parser.cc" // lalr1.cc:859 break; case 102: -#line 476 "dhcp6_parser.yy" // lalr1.cc:859 +#line 479 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1072 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1082 "dhcp6_parser.cc" // lalr1.cc:859 break; case 103: -#line 480 "dhcp6_parser.yy" // lalr1.cc:859 +#line 483 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed } -#line 1081 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1091 "dhcp6_parser.cc" // lalr1.cc:859 break; case 108: -#line 493 "dhcp6_parser.yy" // lalr1.cc:859 +#line 496 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1092 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1102 "dhcp6_parser.cc" // lalr1.cc:859 break; case 109: -#line 498 "dhcp6_parser.yy" // lalr1.cc:859 +#line 501 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1101 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1111 "dhcp6_parser.cc" // lalr1.cc:859 break; case 110: -#line 503 "dhcp6_parser.yy" // lalr1.cc:859 +#line 506 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); } -#line 1110 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1120 "dhcp6_parser.cc" // lalr1.cc:859 break; case 111: -#line 509 "dhcp6_parser.yy" // lalr1.cc:859 +#line 512 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.LEASE_DATABASE); } -#line 1121 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1131 "dhcp6_parser.cc" // lalr1.cc:859 break; case 112: -#line 514 "dhcp6_parser.yy" // lalr1.cc:859 +#line 517 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1132 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1142 "dhcp6_parser.cc" // lalr1.cc:859 break; case 113: -#line 521 "dhcp6_parser.yy" // lalr1.cc:859 +#line 524 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.HOSTS_DATABASE); } -#line 1143 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1153 "dhcp6_parser.cc" // lalr1.cc:859 break; case 114: -#line 526 "dhcp6_parser.yy" // lalr1.cc:859 +#line 529 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1154 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1164 "dhcp6_parser.cc" // lalr1.cc:859 break; case 130: -#line 552 "dhcp6_parser.yy" // lalr1.cc:859 +#line 555 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1162 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1172 "dhcp6_parser.cc" // lalr1.cc:859 break; case 131: -#line 554 "dhcp6_parser.yy" // lalr1.cc:859 +#line 557 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1171 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1181 "dhcp6_parser.cc" // lalr1.cc:859 break; case 132: -#line 559 "dhcp6_parser.yy" // lalr1.cc:859 +#line 562 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1177 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1187 "dhcp6_parser.cc" // lalr1.cc:859 break; case 133: -#line 560 "dhcp6_parser.yy" // lalr1.cc:859 +#line 563 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1183 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1193 "dhcp6_parser.cc" // lalr1.cc:859 break; case 134: -#line 561 "dhcp6_parser.yy" // lalr1.cc:859 +#line 564 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1189 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1199 "dhcp6_parser.cc" // lalr1.cc:859 break; case 135: -#line 562 "dhcp6_parser.yy" // lalr1.cc:859 +#line 565 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1195 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1205 "dhcp6_parser.cc" // lalr1.cc:859 break; case 136: -#line 565 "dhcp6_parser.yy" // lalr1.cc:859 +#line 568 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1203 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1213 "dhcp6_parser.cc" // lalr1.cc:859 break; case 137: -#line 567 "dhcp6_parser.yy" // lalr1.cc:859 +#line 570 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); ctx.leave(); } -#line 1213 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1223 "dhcp6_parser.cc" // lalr1.cc:859 break; case 138: -#line 573 "dhcp6_parser.yy" // lalr1.cc:859 +#line 576 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1221 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1231 "dhcp6_parser.cc" // lalr1.cc:859 break; case 139: -#line 575 "dhcp6_parser.yy" // lalr1.cc:859 +#line 578 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); ctx.leave(); } -#line 1231 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1241 "dhcp6_parser.cc" // lalr1.cc:859 break; case 140: -#line 581 "dhcp6_parser.yy" // lalr1.cc:859 +#line 584 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1239 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1249 "dhcp6_parser.cc" // lalr1.cc:859 break; case 141: -#line 583 "dhcp6_parser.yy" // lalr1.cc:859 +#line 586 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); ctx.leave(); } -#line 1249 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1259 "dhcp6_parser.cc" // lalr1.cc:859 break; case 142: -#line 589 "dhcp6_parser.yy" // lalr1.cc:859 +#line 592 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1258 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1268 "dhcp6_parser.cc" // lalr1.cc:859 break; case 143: -#line 594 "dhcp6_parser.yy" // lalr1.cc:859 +#line 597 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1266 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1276 "dhcp6_parser.cc" // lalr1.cc:859 break; case 144: -#line 596 "dhcp6_parser.yy" // lalr1.cc:859 +#line 599 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1276 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1286 "dhcp6_parser.cc" // lalr1.cc:859 break; case 145: -#line 602 "dhcp6_parser.yy" // lalr1.cc:859 +#line 605 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); } -#line 1285 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1295 "dhcp6_parser.cc" // lalr1.cc:859 break; case 146: -#line 607 "dhcp6_parser.yy" // lalr1.cc:859 +#line 610 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); } -#line 1294 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1304 "dhcp6_parser.cc" // lalr1.cc:859 break; case 147: -#line 612 "dhcp6_parser.yy" // lalr1.cc:859 +#line 615 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); } -#line 1303 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1313 "dhcp6_parser.cc" // lalr1.cc:859 break; case 148: -#line 617 "dhcp6_parser.yy" // lalr1.cc:859 +#line 620 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); } -#line 1312 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1322 "dhcp6_parser.cc" // lalr1.cc:859 break; case 149: -#line 622 "dhcp6_parser.yy" // lalr1.cc:859 +#line 625 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1320 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1330 "dhcp6_parser.cc" // lalr1.cc:859 break; case 150: -#line 624 "dhcp6_parser.yy" // lalr1.cc:859 +#line 627 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1330 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1340 "dhcp6_parser.cc" // lalr1.cc:859 break; case 151: -#line 630 "dhcp6_parser.yy" // lalr1.cc:859 +#line 633 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1338 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1348 "dhcp6_parser.cc" // lalr1.cc:859 break; case 152: -#line 632 "dhcp6_parser.yy" // lalr1.cc:859 +#line 635 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1348 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1358 "dhcp6_parser.cc" // lalr1.cc:859 break; case 153: -#line 639 "dhcp6_parser.yy" // lalr1.cc:859 +#line 642 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("mac-sources", l); ctx.stack_.push_back(l); ctx.enter(ctx.MAC_SOURCES); } -#line 1359 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1369 "dhcp6_parser.cc" // lalr1.cc:859 break; case 154: -#line 644 "dhcp6_parser.yy" // lalr1.cc:859 +#line 647 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1368 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1378 "dhcp6_parser.cc" // lalr1.cc:859 break; case 159: -#line 657 "dhcp6_parser.yy" // lalr1.cc:859 +#line 660 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1377 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1387 "dhcp6_parser.cc" // lalr1.cc:859 break; case 160: -#line 662 "dhcp6_parser.yy" // lalr1.cc:859 +#line 665 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1386 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1396 "dhcp6_parser.cc" // lalr1.cc:859 break; case 161: -#line 667 "dhcp6_parser.yy" // lalr1.cc:859 +#line 670 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); } -#line 1397 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1407 "dhcp6_parser.cc" // lalr1.cc:859 break; case 162: -#line 672 "dhcp6_parser.yy" // lalr1.cc:859 +#line 675 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1406 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1416 "dhcp6_parser.cc" // lalr1.cc:859 break; case 168: -#line 686 "dhcp6_parser.yy" // lalr1.cc:859 +#line 689 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1415 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1425 "dhcp6_parser.cc" // lalr1.cc:859 break; case 169: -#line 691 "dhcp6_parser.yy" // lalr1.cc:859 +#line 694 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1424 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1434 "dhcp6_parser.cc" // lalr1.cc:859 break; case 170: -#line 698 "dhcp6_parser.yy" // lalr1.cc:859 +#line 701 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay-supplied-options", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1435 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1445 "dhcp6_parser.cc" // lalr1.cc:859 break; case 171: -#line 703 "dhcp6_parser.yy" // lalr1.cc:859 +#line 706 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1444 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1454 "dhcp6_parser.cc" // lalr1.cc:859 break; case 172: -#line 708 "dhcp6_parser.yy" // lalr1.cc:859 +#line 711 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 1455 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1465 "dhcp6_parser.cc" // lalr1.cc:859 break; case 173: -#line 713 "dhcp6_parser.yy" // lalr1.cc:859 +#line 716 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1464 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1474 "dhcp6_parser.cc" // lalr1.cc:859 break; case 178: -#line 726 "dhcp6_parser.yy" // lalr1.cc:859 +#line 729 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1474 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1484 "dhcp6_parser.cc" // lalr1.cc:859 break; case 179: -#line 730 "dhcp6_parser.yy" // lalr1.cc:859 +#line 733 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1484 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1494 "dhcp6_parser.cc" // lalr1.cc:859 break; case 180: -#line 736 "dhcp6_parser.yy" // lalr1.cc:859 +#line 739 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1494 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1504 "dhcp6_parser.cc" // lalr1.cc:859 break; case 181: -#line 740 "dhcp6_parser.yy" // lalr1.cc:859 +#line 743 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1504 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1514 "dhcp6_parser.cc" // lalr1.cc:859 break; case 187: -#line 755 "dhcp6_parser.yy" // lalr1.cc:859 +#line 758 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1512 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1522 "dhcp6_parser.cc" // lalr1.cc:859 break; case 188: -#line 757 "dhcp6_parser.yy" // lalr1.cc:859 +#line 760 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1522 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1532 "dhcp6_parser.cc" // lalr1.cc:859 break; case 189: -#line 763 "dhcp6_parser.yy" // lalr1.cc:859 +#line 766 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1530 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1540 "dhcp6_parser.cc" // lalr1.cc:859 break; case 190: -#line 765 "dhcp6_parser.yy" // lalr1.cc:859 +#line 768 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1539 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1549 "dhcp6_parser.cc" // lalr1.cc:859 break; case 191: -#line 771 "dhcp6_parser.yy" // lalr1.cc:859 +#line 774 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.EXPIRED_LEASES_PROCESSING); } -#line 1550 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1560 "dhcp6_parser.cc" // lalr1.cc:859 break; case 192: -#line 776 "dhcp6_parser.yy" // lalr1.cc:859 +#line 779 "dhcp6_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1560 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1570 "dhcp6_parser.cc" // lalr1.cc:859 break; case 201: -#line 794 "dhcp6_parser.yy" // lalr1.cc:859 +#line 797 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); } -#line 1569 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1579 "dhcp6_parser.cc" // lalr1.cc:859 break; case 202: -#line 799 "dhcp6_parser.yy" // lalr1.cc:859 +#line 802 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); } -#line 1578 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1588 "dhcp6_parser.cc" // lalr1.cc:859 break; case 203: -#line 804 "dhcp6_parser.yy" // lalr1.cc:859 +#line 807 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); } -#line 1587 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1597 "dhcp6_parser.cc" // lalr1.cc:859 break; case 204: -#line 809 "dhcp6_parser.yy" // lalr1.cc:859 +#line 812 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); } -#line 1596 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1606 "dhcp6_parser.cc" // lalr1.cc:859 break; case 205: -#line 814 "dhcp6_parser.yy" // lalr1.cc:859 +#line 817 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); } -#line 1605 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1615 "dhcp6_parser.cc" // lalr1.cc:859 break; case 206: -#line 819 "dhcp6_parser.yy" // lalr1.cc:859 +#line 822 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); } -#line 1614 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1624 "dhcp6_parser.cc" // lalr1.cc:859 break; case 207: -#line 827 "dhcp6_parser.yy" // lalr1.cc:859 +#line 830 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet6", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET6); } -#line 1625 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1635 "dhcp6_parser.cc" // lalr1.cc:859 break; case 208: -#line 832 "dhcp6_parser.yy" // lalr1.cc:859 +#line 835 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1634 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1644 "dhcp6_parser.cc" // lalr1.cc:859 break; case 213: -#line 852 "dhcp6_parser.yy" // lalr1.cc:859 +#line 855 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1644 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1654 "dhcp6_parser.cc" // lalr1.cc:859 break; case 214: -#line 856 "dhcp6_parser.yy" // lalr1.cc:859 +#line 859 "dhcp6_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1666,241 +1676,241 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1670 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1680 "dhcp6_parser.cc" // lalr1.cc:859 break; case 215: -#line 878 "dhcp6_parser.yy" // lalr1.cc:859 +#line 881 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the subnet6 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1680 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1690 "dhcp6_parser.cc" // lalr1.cc:859 break; case 216: -#line 882 "dhcp6_parser.yy" // lalr1.cc:859 +#line 885 "dhcp6_parser.yy" // lalr1.cc:859 { // The subnet subnet6 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1690 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1700 "dhcp6_parser.cc" // lalr1.cc:859 break; case 237: -#line 914 "dhcp6_parser.yy" // lalr1.cc:859 +#line 917 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1698 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1708 "dhcp6_parser.cc" // lalr1.cc:859 break; case 238: -#line 916 "dhcp6_parser.yy" // lalr1.cc:859 +#line 919 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); } -#line 1708 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1718 "dhcp6_parser.cc" // lalr1.cc:859 break; case 239: -#line 922 "dhcp6_parser.yy" // lalr1.cc:859 +#line 925 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1716 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1726 "dhcp6_parser.cc" // lalr1.cc:859 break; case 240: -#line 924 "dhcp6_parser.yy" // lalr1.cc:859 +#line 927 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); ctx.leave(); } -#line 1726 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1736 "dhcp6_parser.cc" // lalr1.cc:859 break; case 241: -#line 930 "dhcp6_parser.yy" // lalr1.cc:859 +#line 933 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1734 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1744 "dhcp6_parser.cc" // lalr1.cc:859 break; case 242: -#line 932 "dhcp6_parser.yy" // lalr1.cc:859 +#line 935 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); ctx.leave(); } -#line 1744 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1754 "dhcp6_parser.cc" // lalr1.cc:859 break; case 243: -#line 938 "dhcp6_parser.yy" // lalr1.cc:859 +#line 941 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.CLIENT_CLASS); } -#line 1752 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1762 "dhcp6_parser.cc" // lalr1.cc:859 break; case 244: -#line 940 "dhcp6_parser.yy" // lalr1.cc:859 +#line 943 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); } -#line 1762 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1772 "dhcp6_parser.cc" // lalr1.cc:859 break; case 245: -#line 946 "dhcp6_parser.yy" // lalr1.cc:859 +#line 949 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1770 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1780 "dhcp6_parser.cc" // lalr1.cc:859 break; case 246: -#line 948 "dhcp6_parser.yy" // lalr1.cc:859 +#line 951 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1779 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1789 "dhcp6_parser.cc" // lalr1.cc:859 break; case 247: -#line 953 "dhcp6_parser.yy" // lalr1.cc:859 +#line 956 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1785 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1795 "dhcp6_parser.cc" // lalr1.cc:859 break; case 248: -#line 954 "dhcp6_parser.yy" // lalr1.cc:859 +#line 957 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1791 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1801 "dhcp6_parser.cc" // lalr1.cc:859 break; case 249: -#line 955 "dhcp6_parser.yy" // lalr1.cc:859 +#line 958 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1797 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1807 "dhcp6_parser.cc" // lalr1.cc:859 break; case 250: -#line 958 "dhcp6_parser.yy" // lalr1.cc:859 +#line 961 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1806 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1816 "dhcp6_parser.cc" // lalr1.cc:859 break; case 251: -#line 963 "dhcp6_parser.yy" // lalr1.cc:859 +#line 966 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1815 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1825 "dhcp6_parser.cc" // lalr1.cc:859 break; case 252: -#line 971 "dhcp6_parser.yy" // lalr1.cc:859 +#line 974 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1826 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1836 "dhcp6_parser.cc" // lalr1.cc:859 break; case 253: -#line 976 "dhcp6_parser.yy" // lalr1.cc:859 +#line 979 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1835 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1845 "dhcp6_parser.cc" // lalr1.cc:859 break; case 258: -#line 991 "dhcp6_parser.yy" // lalr1.cc:859 +#line 994 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1845 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1855 "dhcp6_parser.cc" // lalr1.cc:859 break; case 259: -#line 995 "dhcp6_parser.yy" // lalr1.cc:859 +#line 998 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1853 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1863 "dhcp6_parser.cc" // lalr1.cc:859 break; case 276: -#line 1023 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1026 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1864 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1874 "dhcp6_parser.cc" // lalr1.cc:859 break; case 277: -#line 1028 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1031 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1873 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1883 "dhcp6_parser.cc" // lalr1.cc:859 break; case 278: -#line 1036 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1039 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1882 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1892 "dhcp6_parser.cc" // lalr1.cc:859 break; case 279: -#line 1039 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1042 "dhcp6_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 1890 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1900 "dhcp6_parser.cc" // lalr1.cc:859 break; case 284: -#line 1055 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1058 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1900 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1910 "dhcp6_parser.cc" // lalr1.cc:859 break; case 285: -#line 1059 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1062 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1908,21 +1918,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1912 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1922 "dhcp6_parser.cc" // lalr1.cc:859 break; case 286: -#line 1070 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1073 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1922 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1932 "dhcp6_parser.cc" // lalr1.cc:859 break; case 287: -#line 1074 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1077 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1930,319 +1940,348 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1934 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1944 "dhcp6_parser.cc" // lalr1.cc:859 break; case 301: -#line 1104 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1107 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 1943 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1953 "dhcp6_parser.cc" // lalr1.cc:859 break; case 303: -#line 1111 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1114 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1951 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1961 "dhcp6_parser.cc" // lalr1.cc:859 break; case 304: -#line 1113 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1116 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 1961 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1971 "dhcp6_parser.cc" // lalr1.cc:859 break; case 305: -#line 1119 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1122 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1969 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1979 "dhcp6_parser.cc" // lalr1.cc:859 break; case 306: -#line 1121 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1124 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 1979 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1989 "dhcp6_parser.cc" // lalr1.cc:859 break; case 307: -#line 1127 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1130 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1987 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1997 "dhcp6_parser.cc" // lalr1.cc:859 break; case 308: -#line 1129 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1132 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 1997 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2007 "dhcp6_parser.cc" // lalr1.cc:859 break; case 310: -#line 1137 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1140 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2005 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2015 "dhcp6_parser.cc" // lalr1.cc:859 break; case 311: -#line 1139 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1142 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2015 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2025 "dhcp6_parser.cc" // lalr1.cc:859 break; case 312: -#line 1145 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1148 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2024 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2034 "dhcp6_parser.cc" // lalr1.cc:859 break; case 313: -#line 1154 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1157 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2035 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2045 "dhcp6_parser.cc" // lalr1.cc:859 break; case 314: -#line 1159 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1162 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2044 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2054 "dhcp6_parser.cc" // lalr1.cc:859 break; case 319: -#line 1178 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1181 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2054 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2064 "dhcp6_parser.cc" // lalr1.cc:859 break; case 320: -#line 1182 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1185 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2063 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2073 "dhcp6_parser.cc" // lalr1.cc:859 break; case 321: -#line 1190 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1193 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2073 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2083 "dhcp6_parser.cc" // lalr1.cc:859 break; case 322: -#line 1194 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1197 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2082 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2092 "dhcp6_parser.cc" // lalr1.cc:859 break; case 335: -#line 1225 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1228 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2090 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2100 "dhcp6_parser.cc" // lalr1.cc:859 break; case 336: -#line 1227 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1230 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2100 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2110 "dhcp6_parser.cc" // lalr1.cc:859 break; case 339: -#line 1237 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1240 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2109 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2119 "dhcp6_parser.cc" // lalr1.cc:859 break; case 340: -#line 1242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1245 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2118 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2128 "dhcp6_parser.cc" // lalr1.cc:859 break; case 341: -#line 1250 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1253 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2129 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2139 "dhcp6_parser.cc" // lalr1.cc:859 break; case 342: -#line 1255 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1258 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2138 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2148 "dhcp6_parser.cc" // lalr1.cc:859 break; case 347: -#line 1270 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1273 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2148 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2158 "dhcp6_parser.cc" // lalr1.cc:859 break; case 348: -#line 1274 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1277 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2158 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 break; case 349: -#line 1280 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1283 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2178 "dhcp6_parser.cc" // lalr1.cc:859 break; case 350: -#line 1284 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1287 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 2177 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 358: -#line 1300 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 2185 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2187 "dhcp6_parser.cc" // lalr1.cc:859 break; case 359: -#line 1302 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1304 "dhcp6_parser.yy" // lalr1.cc:859 { - ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("pool", pool); - ctx.leave(); + ctx.enter(ctx.NO_KEYWORD); } #line 2195 "dhcp6_parser.cc" // lalr1.cc:859 break; case 360: -#line 1308 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1306 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("pool", pool); + ctx.leave(); } -#line 2203 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2205 "dhcp6_parser.cc" // lalr1.cc:859 break; case 361: -#line 1310 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1312 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2213 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 362: +#line 1314 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2212 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2222 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 362: -#line 1318 "dhcp6_parser.yy" // lalr1.cc:859 + case 363: +#line 1319 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.KNOWN_CLIENTS); +} +#line 2230 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 364: +#line 1321 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2239 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 365: +#line 1327 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } +#line 2245 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 366: +#line 1328 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } +#line 2251 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 367: +#line 1334 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.PD_POOLS); } -#line 2223 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2262 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 363: -#line 1323 "dhcp6_parser.yy" // lalr1.cc:859 + case 368: +#line 1339 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2232 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2271 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 368: -#line 1338 "dhcp6_parser.yy" // lalr1.cc:859 + case 373: +#line 1354 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2242 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2281 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 369: -#line 1342 "dhcp6_parser.yy" // lalr1.cc:859 + case 374: +#line 1358 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2250,21 +2289,21 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2254 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2293 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 370: -#line 1350 "dhcp6_parser.yy" // lalr1.cc:859 + case 375: +#line 1366 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2264 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2303 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 371: -#line 1354 "dhcp6_parser.yy" // lalr1.cc:859 + case 376: +#line 1370 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2272,1028 +2311,1028 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2276 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2315 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 383: -#line 1377 "dhcp6_parser.yy" // lalr1.cc:859 + case 389: +#line 1394 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2284 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2323 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1379 "dhcp6_parser.yy" // lalr1.cc:859 + case 390: +#line 1396 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); ctx.leave(); } -#line 2294 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2333 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1385 "dhcp6_parser.yy" // lalr1.cc:859 + case 391: +#line 1402 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); } -#line 2303 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2342 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1390 "dhcp6_parser.yy" // lalr1.cc:859 + case 392: +#line 1407 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2311 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2350 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1392 "dhcp6_parser.yy" // lalr1.cc:859 + case 393: +#line 1409 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); ctx.leave(); } -#line 2321 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2360 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 388: -#line 1398 "dhcp6_parser.yy" // lalr1.cc:859 + case 394: +#line 1415 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); } -#line 2330 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2369 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 389: -#line 1403 "dhcp6_parser.yy" // lalr1.cc:859 + case 395: +#line 1420 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); } -#line 2339 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2378 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1411 "dhcp6_parser.yy" // lalr1.cc:859 + case 396: +#line 1428 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2350 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 391: -#line 1416 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2359 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 396: -#line 1429 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->add(m); - ctx.stack_.push_back(m); -} -#line 2369 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2389 "dhcp6_parser.cc" // lalr1.cc:859 break; case 397: #line 1433 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 2398 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 402: +#line 1446 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); +} +#line 2408 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 403: +#line 1450 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2378 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2417 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 398: -#line 1438 "dhcp6_parser.yy" // lalr1.cc:859 + case 404: +#line 1455 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2388 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2427 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 399: -#line 1442 "dhcp6_parser.yy" // lalr1.cc:859 + case 405: +#line 1459 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2397 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2436 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1467 "dhcp6_parser.yy" // lalr1.cc:859 + case 419: +#line 1484 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2408 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2447 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1472 "dhcp6_parser.yy" // lalr1.cc:859 + case 420: +#line 1489 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2417 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2456 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1477 "dhcp6_parser.yy" // lalr1.cc:859 + case 421: +#line 1494 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefixes", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2428 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2467 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1482 "dhcp6_parser.yy" // lalr1.cc:859 + case 422: +#line 1499 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2437 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2476 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1487 "dhcp6_parser.yy" // lalr1.cc:859 + case 423: +#line 1504 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2445 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2484 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1489 "dhcp6_parser.yy" // lalr1.cc:859 + case 424: +#line 1506 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2455 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2494 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 + case 425: +#line 1512 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2463 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2502 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1497 "dhcp6_parser.yy" // lalr1.cc:859 + case 426: +#line 1514 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2473 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2512 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1503 "dhcp6_parser.yy" // lalr1.cc:859 + case 427: +#line 1520 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2481 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2520 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1505 "dhcp6_parser.yy" // lalr1.cc:859 + case 428: +#line 1522 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2491 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2530 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1511 "dhcp6_parser.yy" // lalr1.cc:859 + case 429: +#line 1528 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2499 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2538 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1513 "dhcp6_parser.yy" // lalr1.cc:859 + case 430: +#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2509 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2548 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1519 "dhcp6_parser.yy" // lalr1.cc:859 + case 431: +#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2520 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2559 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1524 "dhcp6_parser.yy" // lalr1.cc:859 + case 432: +#line 1541 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2529 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2568 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1532 "dhcp6_parser.yy" // lalr1.cc:859 + case 433: +#line 1549 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); ctx.stack_.push_back(m); ctx.enter(ctx.RELAY); } -#line 2540 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2579 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1537 "dhcp6_parser.yy" // lalr1.cc:859 + case 434: +#line 1554 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2549 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2588 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1542 "dhcp6_parser.yy" // lalr1.cc:859 + case 435: +#line 1559 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2557 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2596 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1544 "dhcp6_parser.yy" // lalr1.cc:859 + case 436: +#line 1561 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2567 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2606 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1553 "dhcp6_parser.yy" // lalr1.cc:859 + case 437: +#line 1570 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2578 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2617 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1558 "dhcp6_parser.yy" // lalr1.cc:859 + case 438: +#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2587 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2626 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1567 "dhcp6_parser.yy" // lalr1.cc:859 + case 441: +#line 1584 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2597 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2636 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1571 "dhcp6_parser.yy" // lalr1.cc:859 + case 442: +#line 1588 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2607 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2646 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1593 "dhcp6_parser.yy" // lalr1.cc:859 + case 452: +#line 1610 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2615 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2654 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1595 "dhcp6_parser.yy" // lalr1.cc:859 + case 453: +#line 1612 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2625 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2664 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1604 "dhcp6_parser.yy" // lalr1.cc:859 + case 454: +#line 1621 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER_ID); } -#line 2636 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2675 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 449: -#line 1609 "dhcp6_parser.yy" // lalr1.cc:859 + case 455: +#line 1626 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2647 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 459: -#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.DUID_TYPE); -} -#line 2655 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 460: -#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2664 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 461: -#line 1636 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } -#line 2670 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 462: -#line 1637 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } -#line 2676 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 463: -#line 1638 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } -#line 2682 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 464: -#line 1641 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("htype", htype); -} -#line 2691 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2686 "dhcp6_parser.cc" // lalr1.cc:859 break; case 465: #line 1646 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ctx.enter(ctx.DUID_TYPE); } -#line 2699 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2694 "dhcp6_parser.cc" // lalr1.cc:859 break; case 466: #line 1648 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2703 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 467: +#line 1653 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } +#line 2709 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 468: +#line 1654 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } +#line 2715 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 469: +#line 1655 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } +#line 2721 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 470: +#line 1658 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("htype", htype); +} +#line 2730 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 471: +#line 1663 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2738 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 472: +#line 1665 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("identifier", id); ctx.leave(); } -#line 2709 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2748 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1654 "dhcp6_parser.yy" // lalr1.cc:859 + case 473: +#line 1671 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("time", time); } -#line 2718 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2757 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 + case 474: +#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enterprise-id", time); } -#line 2727 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2766 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1666 "dhcp6_parser.yy" // lalr1.cc:859 + case 475: +#line 1683 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2736 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2775 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 470: -#line 1673 "dhcp6_parser.yy" // lalr1.cc:859 + case 476: +#line 1690 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2747 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2786 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 471: -#line 1678 "dhcp6_parser.yy" // lalr1.cc:859 + case 477: +#line 1695 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2756 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2795 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 476: -#line 1691 "dhcp6_parser.yy" // lalr1.cc:859 + case 482: +#line 1708 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2764 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2803 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 477: -#line 1693 "dhcp6_parser.yy" // lalr1.cc:859 + case 483: +#line 1710 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2774 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2813 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 478: -#line 1699 "dhcp6_parser.yy" // lalr1.cc:859 + case 484: +#line 1716 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2782 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2821 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 479: -#line 1701 "dhcp6_parser.yy" // lalr1.cc:859 + case 485: +#line 1718 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2792 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2831 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 480: -#line 1709 "dhcp6_parser.yy" // lalr1.cc:859 + case 486: +#line 1726 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2803 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2842 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 481: -#line 1714 "dhcp6_parser.yy" // lalr1.cc:859 + case 487: +#line 1731 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2814 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2853 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 482: -#line 1721 "dhcp6_parser.yy" // lalr1.cc:859 + case 488: +#line 1738 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2824 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2863 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 483: -#line 1725 "dhcp6_parser.yy" // lalr1.cc:859 + case 489: +#line 1742 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2834 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2873 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 501: -#line 1752 "dhcp6_parser.yy" // lalr1.cc:859 + case 507: +#line 1769 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2843 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2882 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 502: -#line 1757 "dhcp6_parser.yy" // lalr1.cc:859 + case 508: +#line 1774 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2851 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2890 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1759 "dhcp6_parser.yy" // lalr1.cc:859 + case 509: +#line 1776 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2861 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2900 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1765 "dhcp6_parser.yy" // lalr1.cc:859 + case 510: +#line 1782 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2869 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2908 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1767 "dhcp6_parser.yy" // lalr1.cc:859 + case 511: +#line 1784 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2879 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2918 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1773 "dhcp6_parser.yy" // lalr1.cc:859 + case 512: +#line 1790 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2888 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2927 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1778 "dhcp6_parser.yy" // lalr1.cc:859 + case 513: +#line 1795 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2896 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2935 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1780 "dhcp6_parser.yy" // lalr1.cc:859 + case 514: +#line 1797 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2906 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2945 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1786 "dhcp6_parser.yy" // lalr1.cc:859 + case 515: +#line 1803 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2915 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2954 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1791 "dhcp6_parser.yy" // lalr1.cc:859 + case 516: +#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2924 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2963 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 + case 517: +#line 1813 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } -#line 2932 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2971 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1798 "dhcp6_parser.yy" // lalr1.cc:859 + case 518: +#line 1815 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2941 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2980 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1804 "dhcp6_parser.yy" // lalr1.cc:859 + case 519: +#line 1821 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2947 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2986 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1805 "dhcp6_parser.yy" // lalr1.cc:859 + case 520: +#line 1822 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 2953 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2992 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 + case 521: +#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } -#line 2961 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3000 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1810 "dhcp6_parser.yy" // lalr1.cc:859 + case 522: +#line 1827 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 2971 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3010 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1816 "dhcp6_parser.yy" // lalr1.cc:859 + case 523: +#line 1833 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 2980 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3019 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1821 "dhcp6_parser.yy" // lalr1.cc:859 + case 524: +#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 2989 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3028 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1826 "dhcp6_parser.yy" // lalr1.cc:859 + case 525: +#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 2998 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3037 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1831 "dhcp6_parser.yy" // lalr1.cc:859 + case 526: +#line 1848 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3006 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3045 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1833 "dhcp6_parser.yy" // lalr1.cc:859 + case 527: +#line 1850 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3015 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3054 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1839 "dhcp6_parser.yy" // lalr1.cc:859 + case 528: +#line 1856 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3023 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3062 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1842 "dhcp6_parser.yy" // lalr1.cc:859 + case 529: +#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3031 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3070 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1845 "dhcp6_parser.yy" // lalr1.cc:859 + case 530: +#line 1862 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3039 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3078 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1848 "dhcp6_parser.yy" // lalr1.cc:859 + case 531: +#line 1865 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3047 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3086 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1851 "dhcp6_parser.yy" // lalr1.cc:859 + case 532: +#line 1868 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3056 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3095 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1857 "dhcp6_parser.yy" // lalr1.cc:859 + case 533: +#line 1874 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3064 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3103 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 + case 534: +#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3074 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3113 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1867 "dhcp6_parser.yy" // lalr1.cc:859 + case 535: +#line 1884 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3082 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3121 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1869 "dhcp6_parser.yy" // lalr1.cc:859 + case 536: +#line 1886 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3091 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3130 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1874 "dhcp6_parser.yy" // lalr1.cc:859 + case 537: +#line 1891 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3099 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3138 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 + case 538: +#line 1893 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3108 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3147 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 + case 539: +#line 1898 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3116 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3155 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1883 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1900 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3125 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3164 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1894 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1911 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3136 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3175 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1899 "dhcp6_parser.yy" // lalr1.cc:859 + case 542: +#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3145 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3184 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 + case 546: +#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3156 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3195 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1921 "dhcp6_parser.yy" // lalr1.cc:859 + case 547: +#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3165 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3204 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 + case 550: +#line 1950 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3175 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3214 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1937 "dhcp6_parser.yy" // lalr1.cc:859 + case 551: +#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3183 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3222 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1952 "dhcp6_parser.yy" // lalr1.cc:859 + case 559: +#line 1969 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3192 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3231 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1957 "dhcp6_parser.yy" // lalr1.cc:859 + case 560: +#line 1974 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3200 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3239 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1959 "dhcp6_parser.yy" // lalr1.cc:859 + case 561: +#line 1976 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3210 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3249 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1965 "dhcp6_parser.yy" // lalr1.cc:859 + case 562: +#line 1982 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3221 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3260 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 557: -#line 1970 "dhcp6_parser.yy" // lalr1.cc:859 + case 563: +#line 1987 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3230 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3269 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 560: -#line 1979 "dhcp6_parser.yy" // lalr1.cc:859 + case 566: +#line 1996 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3240 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3279 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 561: -#line 1983 "dhcp6_parser.yy" // lalr1.cc:859 + case 567: +#line 2000 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3248 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3287 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 568: -#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 + case 574: +#line 2014 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3256 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3295 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 569: -#line 1999 "dhcp6_parser.yy" // lalr1.cc:859 + case 575: +#line 2016 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3266 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3305 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 570: -#line 2005 "dhcp6_parser.yy" // lalr1.cc:859 + case 576: +#line 2022 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3275 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3314 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 571: -#line 2010 "dhcp6_parser.yy" // lalr1.cc:859 + case 577: +#line 2027 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3284 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3323 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 572: -#line 2015 "dhcp6_parser.yy" // lalr1.cc:859 + case 578: +#line 2032 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3293 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3332 "dhcp6_parser.cc" // lalr1.cc:859 break; -#line 3297 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3336 "dhcp6_parser.cc" // lalr1.cc:859 default: break; } @@ -3548,108 +3587,108 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -701; + const short int Dhcp6Parser::yypact_ninf_ = -710; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 206, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, 32, 18, 57, 93, 101, 147, - 167, 168, 182, 184, 191, 211, 215, 217, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, 18, 58, 10, 22, 66, 169, - 63, 43, 55, 175, 64, 4, -49, 159, -701, 214, - 231, 259, 228, 241, -701, -701, -701, -701, -701, 274, - -701, 74, -701, -701, -701, -701, -701, -701, -701, -701, - -701, 293, 302, 322, 324, 337, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, 338, -701, -701, - -701, 134, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, 353, 145, -701, -701, - -701, -701, -701, -701, -701, -701, -701, 354, 355, -701, - -701, -701, -701, -701, -701, -701, -701, -701, 157, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, 185, -701, -701, - -701, -701, 356, -701, 357, 358, -701, -701, -701, -701, - 187, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, 359, 360, -701, -701, - -701, -701, -701, -701, -701, -701, 361, -701, -701, 362, - -701, -701, -701, 364, -701, -701, 363, 367, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, 368, - 370, -701, -701, -701, -701, 369, 372, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, 189, -701, -701, - -701, 374, -701, -701, 375, -701, 376, 377, -701, -701, - 378, 379, 380, -701, -701, -701, 196, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, 18, 18, -701, 225, 381, 382, 383, - 384, 385, -701, 10, -701, 386, 387, 388, 212, 244, - 245, 246, 247, 389, 390, 391, 396, 397, 398, 399, - 400, 401, 402, 403, 260, 407, 409, 22, -701, 410, - 261, 66, -701, 412, 413, 414, 415, 416, 417, 270, - 269, 420, 421, 422, 423, 169, -701, 424, 63, -701, - 425, 278, 427, 280, 281, 43, -701, 430, 431, 432, - 433, 434, 437, 438, -701, 55, -701, 439, 440, 296, - 441, 445, 446, 298, -701, 64, 447, 299, 300, -701, - 4, 451, 452, 3, -701, 303, 455, 457, 310, 459, - 312, 314, 461, 463, 315, 316, 317, 464, 468, 159, - -701, -701, -701, 469, 467, 470, 18, 18, 18, -701, - 471, 472, 474, -701, -701, -701, -701, -701, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, -701, - 488, 489, -701, 493, -701, -701, 494, 495, 496, 325, - 340, 341, -701, -701, 75, 350, 497, 498, -701, 365, - -701, 366, -701, 371, -701, -701, -701, 493, 493, 493, - 373, 392, 393, 394, -701, 395, 404, -701, 405, 406, - 408, -701, -701, 411, -701, -701, -701, 418, 18, -701, - -701, 419, 426, -701, 428, -701, -701, 1, 429, -701, - -701, -701, 27, 435, -701, 18, 22, 238, -701, -701, - -701, 66, 45, 45, 499, 500, 501, 502, -27, 18, - -14, 503, 504, 96, 60, 25, 159, -701, -701, 505, - 506, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, 507, 442, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, 202, -701, 205, -701, - -701, 213, -701, -701, -701, -701, 511, 514, 515, 516, - 517, -701, -701, -701, 229, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, 230, -701, - 519, 523, -701, -701, 521, 525, -701, -701, 524, 526, - -701, -701, 527, 528, -701, -701, -701, 256, -701, -701, - -701, 529, -701, -701, -701, 276, -701, -701, -701, -701, - 332, -701, -701, 530, 531, -701, 533, 534, 535, 536, - 537, 538, 232, -701, -701, -701, -701, -701, -701, -701, - -701, -701, 543, 544, 545, -701, -701, 240, -701, -701, - -701, -701, -701, -701, -701, -701, 242, -701, -701, -701, - 243, 436, -701, 546, 548, -701, -701, 547, 551, -701, - -701, 552, 557, -701, -701, 553, -701, 559, 238, -701, - -701, 560, 561, 562, 563, 323, 443, 352, 444, 448, - 564, 567, 45, -701, -701, 169, -701, 499, 64, -701, - 500, 4, -701, 501, 222, -701, 502, -27, -701, -701, - -14, -701, 12, 503, -701, -49, -701, 504, 449, 450, - 453, 454, 456, 458, 96, -701, 568, 569, 460, 462, - 465, 60, -701, 570, 571, 25, -701, -701, -701, 572, - 573, 63, -701, 505, 43, -701, 506, 55, -701, 507, - 576, -701, 577, -701, 313, 473, 475, 476, -701, -701, - -701, -701, -701, 490, 491, -701, 249, -701, 575, -701, - 580, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, 282, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, 581, 578, -701, -701, -701, - -701, 283, -701, -701, -701, -701, -701, -701, -701, -701, - 73, 492, -701, -701, -701, -701, 512, 513, -701, -701, - 520, 285, -701, 295, -701, 582, -701, 522, 584, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, 222, -701, 588, -701, 12, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, 333, -701, -701, 532, -701, 13, 584, -701, -701, - -701, 589, -701, -701, -701, 297, -701, -701, -701, -701, - -701, 590, 466, 591, 13, -701, 579, -701, 539, -701, - 592, -701, -701, 334, -701, -16, 592, -701, -701, 599, - 600, 603, 319, -701, -701, -701, -701, -701, -701, 605, - 508, 540, 541, -16, -701, 549, -701, -701, -701, -701, - -701 + 218, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, 55, 29, 61, 73, 75, 79, + 100, 108, 121, 129, 145, 157, 159, 164, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, 29, -3, 10, 26, 333, 156, + 154, 103, 12, 160, 71, 204, 40, 163, -710, 193, + 198, 203, 207, 238, -710, -710, -710, -710, -710, 230, + -710, 39, -710, -710, -710, -710, -710, -710, -710, -710, + -710, 247, 281, 302, 308, 316, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, 318, -710, -710, + -710, 48, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, 325, 97, -710, -710, + -710, -710, -710, -710, -710, -710, -710, 328, 344, -710, + -710, -710, -710, -710, -710, -710, -710, -710, 134, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, 136, -710, + -710, -710, -710, -710, 367, -710, 368, 369, -710, -710, + -710, -710, -710, 143, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, 245, + 284, -710, -710, -710, -710, -710, -710, -710, -710, 258, + -710, -710, 370, -710, -710, -710, 371, -710, -710, 291, + 373, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, 374, 375, -710, -710, -710, -710, 372, 378, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + 178, -710, -710, -710, 379, -710, -710, 380, -710, 381, + 382, -710, -710, 383, 384, 385, -710, -710, -710, 188, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, 29, 29, -710, 224, + 386, 387, 388, 389, 390, -710, 10, -710, 391, 392, + 393, 228, 244, 248, 251, 252, 395, 396, 397, 399, + 400, 403, 404, 405, 406, 407, 408, 259, 410, 411, + 26, -710, 412, 264, 333, -710, 413, 414, 415, 417, + 418, 419, 270, 269, 422, 423, 424, 425, 156, -710, + 426, 430, 154, -710, 431, 282, 433, 287, 288, 103, + -710, 434, 435, 436, 439, 442, 443, 444, -710, 12, + -710, 445, 446, 299, 450, 451, 452, 301, -710, 71, + 454, 303, 304, -710, 204, 457, 458, 263, -710, 310, + 460, 463, 314, 465, 319, 320, 466, 467, 321, 322, + 323, 468, 471, 163, -710, -710, -710, 472, 473, 474, + 29, 29, 29, -710, 475, 476, 477, -710, -710, -710, + -710, -710, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, -710, 491, 492, -710, 495, -710, -710, + 496, 497, 498, 341, 342, 350, -710, -710, -23, 353, + 502, 501, -710, 356, 293, -710, 357, -710, 358, -710, + -710, -710, 495, 495, 495, 359, 360, 361, 362, -710, + 363, 364, -710, 365, 366, 376, -710, -710, 377, -710, + -710, -710, 394, 29, -710, -710, 398, 401, -710, 402, + -710, -710, 231, 409, -710, -710, -710, 111, 416, -710, + 29, 26, 420, -710, -710, -710, 333, 49, 49, 513, + 515, 516, 517, -33, 29, -13, 518, 519, 168, 23, + 250, 163, -710, -710, 520, 521, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, 524, 448, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, 197, -710, 205, -710, -710, 206, + -710, -710, -710, -710, 530, 531, 532, 533, 534, -710, + -710, -710, 219, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, 222, -710, 535, 536, + -710, -710, 537, 539, -710, -710, 538, 542, -710, -710, + 540, 545, -710, -710, -710, 137, -710, -710, -710, 544, + -710, -710, -710, 174, -710, -710, -710, -710, 249, -710, + -710, 546, 550, -710, 552, 553, 554, 555, 556, 557, + 225, -710, -710, -710, -710, -710, -710, -710, -710, -710, + 558, 559, 560, -710, -710, 232, -710, -710, -710, -710, + -710, -710, -710, -710, 246, -710, -710, -710, 260, 421, + -710, 561, 562, -710, -710, 564, 563, -710, -710, 565, + 569, -710, -710, 567, -710, 572, 420, -710, -710, 573, + 574, 575, 576, 427, 428, 429, 432, 437, 578, 581, + 49, -710, -710, 156, -710, 513, 71, -710, 515, 204, + -710, 516, 70, -710, 517, -33, -710, -710, -13, -710, + 45, 518, -710, 40, -710, 519, 438, 440, 441, 447, + 449, 453, 168, -710, 582, 583, 455, 456, 459, 23, + -710, 585, 586, 250, -710, -710, -710, 587, 570, 154, + -710, 520, 103, -710, 521, 12, -710, 524, 592, -710, + 593, -710, 317, 461, 462, 464, -710, -710, -710, -710, + -710, 469, 470, -710, 261, -710, 589, -710, 591, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, 262, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, 594, 597, -710, -710, -710, -710, 283, + -710, -710, -710, -710, -710, -710, -710, -710, 243, 478, + -710, -710, -710, -710, 479, 493, -710, -710, 499, 285, + -710, 286, -710, 596, -710, 500, 598, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + 70, -710, 602, -710, 45, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, 295, + -710, -710, 505, -710, 42, 598, -710, -710, -710, 604, + -710, -710, -710, 292, -710, -710, -710, -710, -710, 607, + 494, 608, 42, -710, 611, -710, 508, -710, 612, -710, + -710, 324, -710, -82, 612, -710, -710, 614, 616, 617, + 294, -710, -710, -710, -710, -710, -710, 620, 506, 511, + 526, -82, -710, 528, -710, -710, -710, -710, -710 }; const unsigned short int @@ -3660,517 +3699,519 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, 56, 5, 68, 7, 102, 9, 215, 11, 349, 13, - 370, 15, 398, 17, 278, 19, 286, 21, 321, 23, - 180, 25, 482, 27, 45, 39, 0, 0, 0, 0, - 0, 0, 400, 0, 288, 323, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 535, 529, 531, 533, 0, + 375, 15, 404, 17, 278, 19, 286, 21, 321, 23, + 180, 25, 488, 27, 45, 39, 0, 0, 0, 0, + 0, 0, 406, 0, 288, 323, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 541, 535, 537, 539, 0, 65, 0, 58, 60, 62, 63, 64, 61, 100, 111, 113, 0, 0, 0, 0, 0, 207, 276, 313, 252, - 153, 170, 161, 431, 172, 191, 448, 0, 470, 480, + 153, 170, 161, 437, 172, 191, 454, 0, 476, 486, 94, 0, 70, 72, 73, 74, 75, 76, 79, 80, 81, 82, 84, 83, 88, 89, 77, 78, 86, 87, 85, 90, 91, 92, 93, 108, 0, 0, 104, 106, - 107, 341, 362, 360, 237, 239, 241, 0, 0, 245, - 243, 390, 427, 236, 219, 220, 221, 222, 0, 217, + 107, 341, 367, 361, 237, 239, 241, 0, 0, 245, + 243, 396, 433, 236, 219, 220, 221, 222, 0, 217, 226, 227, 228, 231, 233, 229, 230, 223, 224, 235, - 225, 232, 234, 358, 357, 355, 354, 0, 351, 353, - 356, 383, 0, 386, 0, 0, 382, 378, 377, 381, - 0, 372, 374, 375, 379, 380, 376, 425, 413, 415, - 417, 419, 421, 423, 412, 411, 0, 401, 402, 406, - 407, 404, 408, 409, 410, 405, 0, 303, 143, 0, - 307, 305, 310, 0, 299, 300, 0, 289, 290, 292, - 302, 293, 294, 295, 309, 296, 297, 298, 335, 0, - 0, 333, 334, 337, 338, 0, 324, 325, 327, 328, - 329, 330, 331, 332, 187, 189, 184, 0, 182, 185, - 186, 0, 502, 504, 0, 507, 0, 0, 511, 515, - 0, 0, 0, 520, 527, 500, 0, 484, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 44, 0, 0, 37, 0, 0, 0, 0, - 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, + 225, 232, 234, 359, 363, 358, 355, 354, 0, 351, + 353, 356, 357, 389, 0, 392, 0, 0, 388, 383, + 382, 386, 387, 0, 377, 379, 380, 384, 385, 381, + 431, 419, 421, 423, 425, 427, 429, 418, 417, 0, + 407, 408, 412, 413, 410, 414, 415, 416, 411, 0, + 303, 143, 0, 307, 305, 310, 0, 299, 300, 0, + 289, 290, 292, 302, 293, 294, 295, 309, 296, 297, + 298, 335, 0, 0, 333, 334, 337, 338, 0, 324, + 325, 327, 328, 329, 330, 331, 332, 187, 189, 184, + 0, 182, 185, 186, 0, 508, 510, 0, 513, 0, + 0, 517, 521, 0, 0, 0, 526, 533, 506, 0, + 490, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 44, 0, 0, 37, 0, + 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, - 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 216, 0, 0, 350, - 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 279, 0, 0, 0, - 0, 0, 0, 0, 287, 0, 0, 0, 0, 322, - 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 483, 48, 41, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 0, 95, 96, 97, 98, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, - 0, 0, 71, 0, 110, 105, 0, 0, 0, 0, - 0, 0, 250, 251, 0, 0, 0, 0, 218, 0, - 352, 0, 385, 0, 388, 389, 373, 0, 0, 0, - 0, 0, 0, 0, 403, 0, 0, 301, 0, 0, - 0, 312, 291, 0, 339, 340, 326, 0, 0, 183, - 501, 0, 0, 506, 0, 509, 510, 0, 0, 517, - 518, 519, 0, 0, 485, 0, 0, 0, 530, 532, - 534, 0, 0, 0, 209, 280, 315, 254, 0, 45, - 0, 0, 174, 0, 0, 0, 0, 49, 109, 343, - 364, 38, 361, 238, 240, 242, 247, 248, 249, 246, - 244, 392, 0, 359, 384, 387, 426, 414, 416, 418, - 420, 422, 424, 304, 144, 308, 306, 311, 336, 188, - 190, 503, 505, 508, 513, 514, 512, 516, 522, 523, - 524, 525, 526, 521, 528, 42, 0, 540, 0, 537, - 539, 0, 130, 136, 138, 140, 0, 0, 0, 0, - 0, 149, 151, 129, 0, 115, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 0, 213, - 0, 210, 211, 284, 0, 281, 282, 319, 0, 316, - 317, 258, 0, 255, 256, 159, 160, 0, 155, 157, - 158, 0, 168, 169, 165, 0, 163, 166, 167, 435, - 0, 433, 178, 0, 175, 176, 0, 0, 0, 0, - 0, 0, 0, 193, 195, 196, 197, 198, 199, 200, - 459, 465, 0, 0, 0, 458, 457, 0, 450, 452, - 455, 453, 454, 456, 476, 478, 0, 472, 474, 475, - 0, 51, 347, 0, 344, 345, 368, 0, 365, 366, - 396, 0, 393, 394, 429, 0, 67, 0, 0, 536, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112, 114, 0, 208, 0, 288, 277, - 0, 323, 314, 0, 0, 253, 0, 0, 154, 171, - 0, 162, 437, 0, 432, 0, 173, 0, 0, 0, - 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, - 0, 0, 449, 0, 0, 0, 471, 481, 53, 0, - 52, 0, 342, 0, 0, 363, 0, 400, 391, 0, - 0, 428, 0, 538, 0, 0, 0, 0, 142, 145, - 146, 147, 148, 0, 0, 116, 0, 212, 0, 283, - 0, 318, 275, 272, 274, 266, 267, 262, 263, 264, - 265, 271, 270, 273, 0, 260, 268, 269, 257, 156, - 164, 446, 444, 445, 443, 0, 438, 439, 441, 442, - 434, 0, 177, 201, 202, 203, 204, 205, 206, 194, - 0, 0, 464, 467, 468, 451, 0, 0, 473, 50, - 0, 0, 346, 0, 367, 0, 395, 0, 0, 132, - 133, 134, 135, 131, 137, 139, 141, 150, 152, 214, - 285, 320, 0, 259, 0, 436, 0, 179, 461, 462, - 463, 460, 466, 477, 479, 54, 348, 369, 397, 430, - 544, 0, 542, 261, 0, 440, 0, 0, 541, 447, - 556, 0, 554, 552, 548, 0, 546, 550, 551, 549, - 543, 0, 0, 0, 0, 545, 0, 553, 0, 547, - 0, 555, 560, 0, 558, 0, 0, 557, 568, 0, - 0, 0, 0, 562, 564, 565, 566, 567, 559, 0, - 0, 0, 0, 0, 561, 0, 570, 571, 572, 563, - 569 + 0, 69, 0, 0, 0, 103, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, + 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, + 376, 0, 0, 0, 0, 0, 0, 0, 405, 0, + 279, 0, 0, 0, 0, 0, 0, 0, 287, 0, + 0, 0, 0, 322, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 489, 48, 41, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 95, 96, 97, + 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 475, 0, 0, 71, 0, 110, 105, + 0, 0, 0, 0, 0, 0, 250, 251, 0, 0, + 0, 0, 218, 0, 0, 352, 0, 391, 0, 394, + 395, 378, 0, 0, 0, 0, 0, 0, 0, 409, + 0, 0, 301, 0, 0, 0, 312, 291, 0, 339, + 340, 326, 0, 0, 183, 507, 0, 0, 512, 0, + 515, 516, 0, 0, 523, 524, 525, 0, 0, 491, + 0, 0, 0, 536, 538, 540, 0, 0, 0, 209, + 280, 315, 254, 0, 45, 0, 0, 174, 0, 0, + 0, 0, 49, 109, 343, 369, 38, 362, 238, 240, + 242, 247, 248, 249, 246, 244, 398, 0, 360, 365, + 366, 364, 390, 393, 432, 420, 422, 424, 426, 428, + 430, 304, 144, 308, 306, 311, 336, 188, 190, 509, + 511, 514, 519, 520, 518, 522, 529, 528, 530, 531, + 532, 527, 534, 42, 0, 546, 0, 543, 545, 0, + 130, 136, 138, 140, 0, 0, 0, 0, 0, 149, + 151, 129, 0, 115, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 0, 213, 0, 210, + 211, 284, 0, 281, 282, 319, 0, 316, 317, 258, + 0, 255, 256, 159, 160, 0, 155, 157, 158, 0, + 168, 169, 165, 0, 163, 166, 167, 441, 0, 439, + 178, 0, 175, 176, 0, 0, 0, 0, 0, 0, + 0, 193, 195, 196, 197, 198, 199, 200, 465, 471, + 0, 0, 0, 464, 463, 0, 456, 458, 461, 459, + 460, 462, 482, 484, 0, 478, 480, 481, 0, 51, + 347, 0, 344, 345, 373, 0, 370, 371, 402, 0, + 399, 400, 435, 0, 67, 0, 0, 542, 101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 112, 114, 0, 208, 0, 288, 277, 0, 323, + 314, 0, 0, 253, 0, 0, 154, 171, 0, 162, + 443, 0, 438, 0, 173, 0, 0, 0, 0, 0, + 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, + 455, 0, 0, 0, 477, 487, 53, 0, 52, 0, + 342, 0, 0, 368, 0, 406, 397, 0, 0, 434, + 0, 544, 0, 0, 0, 0, 142, 145, 146, 147, + 148, 0, 0, 116, 0, 212, 0, 283, 0, 318, + 275, 272, 274, 266, 267, 262, 263, 264, 265, 271, + 270, 273, 0, 260, 268, 269, 257, 156, 164, 452, + 450, 451, 449, 0, 444, 445, 447, 448, 440, 0, + 177, 201, 202, 203, 204, 205, 206, 194, 0, 0, + 470, 473, 474, 457, 0, 0, 479, 50, 0, 0, + 346, 0, 372, 0, 401, 0, 0, 132, 133, 134, + 135, 131, 137, 139, 141, 150, 152, 214, 285, 320, + 0, 259, 0, 442, 0, 179, 467, 468, 469, 466, + 472, 483, 485, 54, 348, 374, 403, 436, 550, 0, + 548, 261, 0, 446, 0, 0, 547, 453, 562, 0, + 560, 558, 554, 0, 552, 556, 557, 555, 549, 0, + 0, 0, 0, 551, 0, 559, 0, 553, 0, 561, + 566, 0, 564, 0, 0, 563, 574, 0, 0, 0, + 0, 568, 570, 571, 572, 573, 565, 0, 0, 0, + 0, 0, 567, 0, 576, 577, 578, 569, 575 }; const short int Dhcp6Parser::yypgoto_[] = { - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -8, -701, 84, -701, -701, - -701, -701, -701, -701, 77, -701, -154, -701, -701, -701, - -66, -701, -701, -701, 272, -701, -701, -701, -701, 105, - 279, -68, -48, -47, -43, -701, -701, -701, -701, -701, - 102, 284, -701, -701, -701, -701, -701, -701, -701, 106, - -97, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -73, -701, -512, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -107, -507, -701, -701, -701, -701, - -109, -701, -701, -701, -701, -701, -701, -701, -701, -115, - -701, -701, -701, -112, 235, -701, -701, -701, -701, -701, - -701, -701, -114, -701, -701, -701, -701, -701, -701, -700, - -701, -701, -701, -88, -701, -701, -701, -84, 277, -701, - -701, -686, -701, -685, -701, -40, -701, -684, -701, -701, - -701, -683, -701, -701, -701, -701, -93, -701, -701, -228, - 565, -701, -701, -701, -701, -701, -85, -701, -701, -701, - -82, -701, 252, -701, -61, -701, -701, -701, -701, -701, - -56, -701, -701, -701, -701, -701, -54, -701, -701, -701, - -83, -701, -701, -701, -77, -701, 255, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -113, -701, - -701, -701, -108, 321, -701, -701, -42, -701, -701, -701, - -701, -701, -92, -701, -701, -701, -110, 292, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -94, - -701, -701, -701, -87, -701, 307, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -682, -701, -701, -701, -701, -701, -701, -46, -701, -701, - -701, -180, -701, -701, -701, -701, -701, -701, -63, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -64, -701, -701, -701, -701, -701, -701, -701, -701, - 163, 287, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -701, -701, -701, -701, -701, -701, - -701, -701, -701, -701, -4, -701, -701, -701, -190, -701, - -701, -205, -701, -701, -701, -701, -701, -701, -214, -701, - -701, -230, -701, -701, -701, -701, -701 + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, 11, -710, 88, -710, -710, + -710, -710, -710, -710, 44, -710, -130, -710, -710, -710, + -66, -710, -710, -710, 309, -710, -710, -710, -710, 115, + 289, -68, -48, -47, -44, -710, -710, -710, -710, -710, + 112, 290, -710, -710, -710, -710, -710, -710, -710, 109, + -90, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -73, -710, -517, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -102, -512, -710, -710, -710, -710, + -103, -710, -710, -710, -710, -710, -710, -710, -710, -109, + -710, -710, -710, -106, 241, -710, -710, -710, -710, -710, + -710, -710, -113, -710, -710, -710, -710, -710, -710, -709, + -710, -710, -710, -85, -710, -710, -710, -81, 312, -710, + -710, -708, -710, -703, -710, -43, -710, -702, -710, -710, + -710, -701, -710, -710, -710, -710, -93, -710, -710, -227, + 571, -710, -710, -710, -710, -710, -83, -710, -710, -710, + -77, -710, 298, -710, -61, -710, -710, -710, -710, -710, + -56, -710, -710, -710, -710, -710, -54, -710, -710, -710, + -80, -710, -710, -710, -79, -710, 277, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -99, -710, + -710, -710, -87, 329, -710, -710, -38, -710, -64, -710, + -710, -710, -710, -710, -710, -91, -710, -710, -710, -78, + 326, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -76, -710, -710, -710, -75, -710, 311, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -697, -710, -710, -710, -710, -710, -710, + -49, -710, -710, -710, -178, -710, -710, -710, -710, -710, + -710, -62, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -65, -710, -710, -710, -710, -710, + -710, -710, -710, 171, 297, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, + -710, -710, -710, -710, -710, -710, -710, -7, -710, -710, + -710, -191, -710, -710, -207, -710, -710, -710, -710, -710, + -710, -217, -710, -710, -230, -710, -710, -710, -710, -710 }; const short int Dhcp6Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 78, 37, 38, 65, 532, - 82, 83, 39, 64, 79, 80, 528, 681, 759, 760, - 120, 41, 66, 91, 92, 93, 307, 43, 67, 121, - 122, 123, 124, 125, 126, 127, 128, 315, 45, 68, - 147, 148, 149, 339, 150, 129, 316, 130, 317, 594, - 595, 596, 701, 853, 597, 702, 598, 703, 599, 704, - 600, 235, 378, 602, 603, 604, 605, 606, 710, 607, - 711, 131, 327, 627, 628, 629, 630, 132, 329, 635, - 636, 637, 638, 133, 328, 134, 331, 643, 644, 645, - 735, 61, 76, 267, 268, 269, 391, 270, 392, 135, - 332, 652, 653, 654, 655, 656, 657, 658, 659, 136, - 323, 610, 611, 612, 715, 47, 69, 168, 169, 170, - 346, 171, 347, 172, 348, 173, 352, 174, 351, 539, - 175, 176, 137, 326, 622, 623, 624, 724, 804, 805, - 138, 324, 55, 73, 614, 615, 616, 718, 57, 74, - 236, 237, 238, 239, 240, 241, 242, 377, 243, 381, - 244, 380, 245, 246, 382, 247, 139, 325, 618, 619, - 620, 721, 59, 75, 255, 256, 257, 258, 259, 386, - 260, 261, 262, 263, 178, 343, 683, 684, 685, 761, - 49, 70, 187, 188, 189, 357, 179, 345, 180, 344, - 687, 688, 689, 764, 51, 71, 200, 201, 202, 360, - 203, 204, 362, 205, 206, 181, 353, 691, 692, 693, - 767, 53, 72, 216, 217, 218, 219, 368, 220, 369, - 221, 370, 222, 371, 223, 372, 224, 373, 225, 367, - 182, 354, 695, 770, 140, 330, 640, 641, 732, 815, - 816, 817, 818, 819, 864, 141, 333, 667, 668, 669, - 746, 871, 670, 671, 747, 672, 673, 142, 143, 335, - 676, 677, 678, 753, 679, 754, 144, 336, 63, 77, - 286, 287, 288, 289, 396, 290, 397, 291, 292, 399, - 293, 294, 295, 402, 566, 296, 403, 297, 298, 299, - 300, 407, 573, 301, 408, 94, 309, 95, 310, 96, - 311, 97, 308, 578, 579, 580, 697, 881, 882, 886, - 895, 896, 897, 898, 903, 899, 901, 913, 914, 915, - 922, 923, 924, 929, 925, 926, 927 + 23, 24, 25, 26, 27, 78, 37, 38, 65, 537, + 82, 83, 39, 64, 79, 80, 533, 689, 767, 768, + 120, 41, 66, 91, 92, 93, 310, 43, 67, 121, + 122, 123, 124, 125, 126, 127, 128, 318, 45, 68, + 147, 148, 149, 342, 150, 129, 319, 130, 320, 602, + 603, 604, 709, 861, 605, 710, 606, 711, 607, 712, + 608, 238, 382, 610, 611, 612, 613, 614, 718, 615, + 719, 131, 330, 635, 636, 637, 638, 132, 332, 643, + 644, 645, 646, 133, 331, 134, 334, 651, 652, 653, + 743, 61, 76, 270, 271, 272, 395, 273, 396, 135, + 335, 660, 661, 662, 663, 664, 665, 666, 667, 136, + 326, 618, 619, 620, 723, 47, 69, 168, 169, 170, + 349, 171, 350, 172, 351, 173, 355, 174, 354, 544, + 175, 176, 137, 329, 630, 631, 632, 732, 812, 813, + 138, 327, 55, 73, 622, 623, 624, 726, 57, 74, + 239, 240, 241, 242, 243, 244, 245, 381, 246, 385, + 247, 384, 248, 249, 386, 250, 139, 328, 626, 627, + 628, 729, 59, 75, 258, 259, 260, 261, 262, 390, + 263, 264, 265, 266, 178, 346, 691, 692, 693, 769, + 49, 70, 188, 189, 190, 360, 179, 348, 192, 361, + 551, 180, 347, 695, 696, 697, 772, 51, 71, 203, + 204, 205, 364, 206, 207, 366, 208, 209, 181, 356, + 699, 700, 701, 775, 53, 72, 219, 220, 221, 222, + 372, 223, 373, 224, 374, 225, 375, 226, 376, 227, + 377, 228, 371, 182, 357, 703, 778, 140, 333, 648, + 649, 740, 823, 824, 825, 826, 827, 872, 141, 336, + 675, 676, 677, 754, 879, 678, 679, 755, 680, 681, + 142, 143, 338, 684, 685, 686, 761, 687, 762, 144, + 339, 63, 77, 289, 290, 291, 292, 400, 293, 401, + 294, 295, 403, 296, 297, 298, 406, 574, 299, 407, + 300, 301, 302, 303, 411, 581, 304, 412, 94, 312, + 95, 313, 96, 314, 97, 311, 586, 587, 588, 705, + 889, 890, 894, 903, 904, 905, 906, 911, 907, 909, + 921, 922, 923, 930, 931, 932, 937, 933, 934, 935 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 90, 164, 252, 163, 184, 196, 214, 36, 234, 251, - 266, 285, 666, 634, 253, 177, 186, 198, 215, 254, - 84, 165, 166, 29, 798, 30, 167, 31, 190, 199, - 185, 197, 28, 98, 264, 265, 99, 100, 799, 800, - 802, 803, 807, 228, 248, 229, 230, 249, 250, 625, - 108, 228, 228, 101, 102, 103, 104, 105, 106, 107, - 108, 582, 625, 632, 40, 633, 583, 584, 585, 586, - 587, 588, 589, 590, 591, 592, 660, 313, 145, 146, - 227, 108, 314, 811, 228, 587, 264, 265, 109, 110, - 111, 112, 113, 108, 191, 192, 193, 194, 195, 153, - 42, 108, 89, 228, 114, 229, 230, 115, 44, 231, - 232, 233, 183, 918, 116, 160, 919, 920, 921, 153, - 564, 565, 117, 118, 626, 207, 119, 674, 675, 208, - 209, 210, 211, 212, 213, 160, 85, 337, 536, 537, - 538, 890, 338, 891, 892, 86, 87, 88, 341, 568, - 569, 570, 571, 342, 46, 89, 661, 662, 663, 664, - 355, 89, 798, 89, 89, 356, 868, 869, 870, 32, - 33, 34, 35, 89, 48, 50, 799, 800, 802, 803, - 807, 572, 646, 647, 648, 649, 650, 651, 358, 52, - 365, 54, 393, 359, 89, 366, 89, 394, 56, 409, - 101, 102, 103, 104, 410, 337, 89, 108, 698, 81, - 696, 89, 107, 699, 89, 89, 341, 151, 58, 152, - 302, 700, 60, 634, 62, 153, 154, 155, 156, 157, - 158, 159, 712, 712, 303, 744, 305, 713, 714, 666, - 745, 160, 161, 751, 306, 755, 409, 90, 752, 162, - 756, 757, 355, 101, 102, 103, 104, 859, 106, 727, - 108, 228, 728, 304, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 312, 730, - 155, 156, 731, 158, 159, 862, 393, 164, 358, 163, - 863, 867, 184, 876, 160, 411, 412, 318, 365, 196, - 904, 177, 162, 877, 186, 905, 319, 165, 166, 214, - 89, 198, 167, 546, 547, 548, 190, 252, 185, 234, - 89, 215, 933, 199, 251, 197, 320, 934, 321, 253, - 849, 850, 851, 852, 254, 733, 887, 916, 734, 888, - 917, 322, 334, 285, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 340, 349, 350, - 361, 363, 364, 375, 423, 577, 379, 374, 383, 376, - 385, 384, 387, 89, 388, 390, 413, 389, 395, 398, - 400, 401, 404, 405, 406, 414, 415, 416, 417, 418, - 420, 421, 422, 428, 429, 430, 424, 425, 426, 427, - 431, 432, 433, 434, 435, 436, 437, 438, 508, 509, - 510, 440, 439, 441, 443, 444, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 459, 461, - 462, 463, 464, 465, 467, 468, 469, 470, 471, 601, - 601, 472, 473, 475, 476, 478, 593, 593, 477, 479, - 480, 483, 481, 484, 485, 487, 488, 490, 665, 491, - 285, 492, 493, 494, 495, 497, 496, 498, 502, 499, - 500, 501, 503, 505, 506, 778, 533, 507, 511, 512, - 560, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 534, 535, 523, 524, 525, 526, 575, 527, 529, - 530, 540, 541, 30, 780, 542, 609, 613, 617, 621, - 639, 642, 682, 686, 690, 705, 543, 544, 706, 707, - 708, 709, 545, 694, 549, 716, 717, 719, 720, 723, - 722, 726, 531, 725, 737, 729, 736, 738, 739, 740, - 741, 742, 743, 550, 551, 552, 553, 748, 749, 750, - 567, 763, 762, 765, 766, 554, 555, 556, 768, 557, - 769, 771, 558, 772, 774, 775, 776, 777, 783, 559, - 561, 784, 830, 831, 836, 837, 840, 562, 839, 563, - 847, 866, 848, 860, 910, 419, 574, 758, 861, 865, - 878, 880, 884, 902, 906, 908, 631, 779, 781, 912, - 782, 823, 824, 930, 931, 825, 826, 932, 827, 935, - 828, 576, 832, 581, 833, 785, 442, 834, 907, 608, - 809, 810, 822, 821, 854, 445, 855, 856, 489, 787, - 829, 786, 458, 808, 883, 789, 788, 482, 226, 601, - 791, 857, 858, 872, 790, 486, 593, 164, 252, 163, - 842, 797, 234, 841, 843, 251, 793, 466, 792, 813, - 253, 177, 936, 873, 874, 254, 812, 165, 166, 266, - 806, 875, 167, 879, 844, 846, 794, 795, 814, 460, - 845, 796, 474, 889, 801, 665, 885, 820, 835, 680, - 911, 838, 937, 938, 773, 184, 504, 900, 196, 909, - 940, 214, 928, 939, 0, 0, 0, 186, 0, 0, - 198, 0, 0, 215, 0, 0, 0, 0, 0, 190, - 0, 185, 199, 0, 197, 0, 0, 0, 0, 0, + 90, 164, 255, 163, 185, 198, 217, 202, 237, 254, + 269, 288, 674, 642, 256, 177, 187, 200, 218, 257, + 84, 165, 166, 806, 807, 167, 36, 186, 199, 808, + 810, 811, 191, 201, 29, 815, 30, 98, 31, 668, + 99, 100, 316, 541, 542, 543, 633, 317, 595, 926, + 108, 340, 927, 928, 929, 28, 341, 101, 102, 103, + 104, 105, 106, 107, 108, 590, 633, 640, 40, 641, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 42, 231, 44, 108, 231, 210, 46, 230, 231, 211, + 212, 213, 214, 215, 216, 109, 110, 111, 112, 113, + 344, 101, 102, 103, 104, 345, 106, 48, 108, 231, + 231, 114, 232, 233, 115, 50, 234, 235, 236, 819, + 634, 116, 669, 670, 671, 672, 267, 268, 52, 117, + 118, 155, 156, 119, 158, 159, 54, 358, 85, 362, + 735, 108, 359, 736, 363, 160, 369, 86, 87, 88, + 81, 370, 56, 162, 193, 194, 195, 196, 197, 153, + 184, 806, 807, 89, 58, 89, 60, 808, 810, 811, + 576, 62, 898, 815, 899, 900, 89, 738, 160, 89, + 739, 397, 32, 33, 34, 35, 398, 101, 102, 103, + 104, 413, 108, 89, 108, 89, 414, 107, 89, 305, + 340, 306, 89, 183, 151, 704, 152, 307, 706, 344, + 153, 184, 153, 707, 708, 308, 154, 155, 156, 157, + 158, 159, 720, 89, 89, 720, 642, 721, 752, 160, + 722, 160, 161, 753, 315, 759, 577, 578, 579, 162, + 760, 309, 674, 231, 251, 232, 233, 252, 253, 763, + 90, 321, 741, 378, 764, 742, 89, 654, 655, 656, + 657, 658, 659, 413, 358, 870, 380, 580, 765, 867, + 871, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 322, 397, 379, 362, 369, + 164, 875, 163, 884, 885, 912, 185, 941, 895, 388, + 913, 896, 942, 198, 177, 202, 323, 89, 187, 89, + 165, 166, 324, 217, 167, 200, 89, 415, 416, 186, + 325, 255, 337, 237, 191, 218, 199, 924, 254, 343, + 925, 201, 352, 256, 857, 858, 859, 860, 257, 876, + 877, 878, 554, 555, 556, 145, 146, 288, 353, 267, + 268, 549, 550, 572, 573, 682, 683, 89, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 365, 367, 368, 383, 387, 389, 417, 391, 392, + 393, 394, 427, 399, 402, 404, 405, 408, 409, 410, + 418, 419, 420, 421, 422, 424, 425, 426, 428, 432, + 433, 434, 429, 435, 436, 430, 431, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 447, 450, 451, 452, + 448, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 463, 513, 514, 515, 464, 466, 467, 468, 472, 473, + 474, 469, 470, 475, 609, 609, 476, 477, 478, 480, + 481, 601, 601, 482, 483, 484, 485, 486, 488, 489, + 490, 492, 493, 673, 496, 288, 495, 497, 498, 499, + 502, 503, 507, 500, 501, 508, 510, 504, 505, 506, + 511, 512, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 538, 539, 528, 529, 530, 531, + 532, 534, 535, 540, 568, 30, 545, 546, 547, 548, + 552, 553, 557, 558, 559, 560, 561, 562, 563, 564, + 617, 583, 621, 625, 629, 647, 650, 690, 694, 565, + 566, 698, 702, 575, 713, 714, 715, 716, 717, 725, + 536, 724, 728, 727, 730, 731, 733, 567, 734, 585, + 737, 569, 744, 745, 570, 571, 746, 747, 748, 749, + 750, 751, 756, 757, 758, 771, 774, 770, 639, 582, + 773, 776, 777, 848, 766, 779, 780, 782, 783, 784, + 785, 786, 791, 788, 787, 792, 838, 839, 789, 844, + 845, 790, 831, 847, 832, 833, 855, 868, 856, 869, + 874, 834, 873, 835, 886, 888, 892, 836, 910, 840, + 841, 914, 916, 842, 862, 863, 918, 864, 938, 920, + 939, 940, 865, 866, 943, 423, 584, 616, 589, 446, + 793, 880, 881, 817, 449, 818, 830, 829, 494, 837, + 795, 816, 794, 891, 229, 797, 882, 609, 915, 796, + 798, 799, 883, 887, 601, 164, 255, 163, 897, 805, + 237, 919, 944, 254, 801, 945, 800, 821, 256, 177, + 462, 491, 850, 257, 820, 165, 166, 269, 814, 167, + 946, 948, 849, 852, 802, 803, 822, 487, 804, 809, + 479, 465, 828, 673, 851, 471, 893, 843, 846, 781, + 853, 854, 688, 185, 908, 917, 198, 936, 202, 217, + 509, 947, 0, 0, 0, 187, 0, 0, 200, 0, + 0, 218, 0, 0, 0, 0, 186, 0, 0, 199, + 0, 191, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, - 0, 0, 0, 813, 793, 0, 792, 0, 0, 0, - 812, 0, 0, 0, 0, 0, 0, 0, 806, 0, - 0, 0, 814, 894, 794, 795, 0, 0, 0, 796, - 893, 0, 801, 0, 0, 0, 0, 0, 0, 0, - 0, 894, 0, 0, 0, 0, 0, 0, 893 + 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, + 0, 821, 801, 0, 800, 0, 0, 0, 820, 0, + 0, 0, 0, 0, 0, 0, 814, 0, 0, 0, + 822, 902, 802, 803, 0, 0, 804, 809, 901, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 902, + 0, 0, 0, 0, 0, 0, 901 }; const short int Dhcp6Parser::yycheck_[] = { - 66, 69, 75, 69, 70, 71, 72, 15, 74, 75, - 76, 77, 524, 520, 75, 69, 70, 71, 72, 75, - 10, 69, 69, 5, 724, 7, 69, 9, 70, 71, - 70, 71, 0, 11, 83, 84, 14, 15, 724, 724, - 724, 724, 724, 39, 40, 41, 42, 43, 44, 76, - 38, 39, 39, 31, 32, 33, 34, 35, 36, 37, - 38, 16, 76, 77, 7, 79, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 16, 3, 12, 13, - 16, 38, 8, 71, 39, 25, 83, 84, 66, 67, - 68, 69, 70, 38, 51, 52, 53, 54, 55, 56, - 7, 38, 151, 39, 82, 41, 42, 85, 7, 45, - 46, 47, 49, 129, 92, 72, 132, 133, 134, 56, - 119, 120, 100, 101, 151, 70, 104, 102, 103, 74, - 75, 76, 77, 78, 79, 72, 126, 3, 63, 64, - 65, 128, 8, 130, 131, 135, 136, 137, 3, 122, - 123, 124, 125, 8, 7, 151, 96, 97, 98, 99, - 3, 151, 862, 151, 151, 8, 93, 94, 95, 151, - 152, 153, 154, 151, 7, 7, 862, 862, 862, 862, - 862, 154, 86, 87, 88, 89, 90, 91, 3, 7, - 3, 7, 3, 8, 151, 8, 151, 8, 7, 3, - 31, 32, 33, 34, 8, 3, 151, 38, 3, 151, - 8, 151, 37, 8, 151, 151, 3, 48, 7, 50, - 6, 8, 7, 730, 7, 56, 57, 58, 59, 60, - 61, 62, 3, 3, 3, 3, 8, 8, 8, 751, - 8, 72, 73, 3, 3, 3, 3, 313, 8, 80, - 8, 8, 3, 31, 32, 33, 34, 8, 36, 3, - 38, 39, 6, 4, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 4, 3, - 58, 59, 6, 61, 62, 3, 3, 355, 3, 355, - 8, 8, 358, 8, 72, 303, 304, 4, 3, 365, - 3, 355, 80, 8, 358, 8, 4, 355, 355, 375, - 151, 365, 355, 467, 468, 469, 358, 390, 358, 385, - 151, 375, 3, 365, 390, 365, 4, 8, 4, 390, - 17, 18, 19, 20, 390, 3, 3, 3, 6, 6, - 6, 4, 4, 409, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 4, 4, 4, - 4, 4, 4, 3, 152, 127, 4, 8, 4, 8, - 3, 8, 4, 151, 4, 3, 151, 8, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 152, 152, 152, 152, - 4, 4, 4, 4, 4, 4, 4, 4, 416, 417, - 418, 4, 152, 4, 4, 154, 4, 4, 4, 4, - 4, 4, 152, 154, 4, 4, 4, 4, 4, 4, - 152, 4, 152, 152, 4, 4, 4, 4, 4, 512, - 513, 4, 4, 4, 4, 4, 512, 513, 152, 4, - 4, 4, 154, 154, 154, 4, 4, 154, 524, 4, - 526, 4, 152, 4, 152, 4, 152, 4, 4, 154, - 154, 154, 4, 4, 7, 152, 151, 7, 7, 7, - 488, 7, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 151, 151, 7, 7, 7, 7, 505, 5, 5, - 5, 151, 5, 7, 152, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 4, 151, 151, 4, 4, - 4, 4, 151, 81, 151, 6, 3, 6, 3, 3, - 6, 3, 448, 6, 3, 6, 6, 4, 4, 4, - 4, 4, 4, 151, 151, 151, 151, 4, 4, 4, - 121, 3, 6, 6, 3, 151, 151, 151, 6, 151, - 3, 8, 151, 4, 4, 4, 4, 4, 4, 151, - 151, 4, 4, 4, 4, 4, 3, 151, 6, 151, - 4, 3, 5, 8, 5, 313, 151, 151, 8, 8, - 8, 7, 4, 4, 4, 4, 519, 154, 154, 7, - 152, 152, 152, 4, 4, 152, 152, 4, 152, 4, - 152, 506, 152, 511, 152, 712, 337, 152, 152, 513, - 727, 730, 737, 735, 151, 341, 151, 151, 393, 717, - 744, 715, 355, 726, 862, 720, 718, 385, 73, 712, - 723, 151, 151, 151, 721, 390, 712, 715, 721, 715, - 763, 724, 718, 761, 764, 721, 724, 365, 724, 732, - 721, 715, 154, 151, 151, 721, 732, 715, 715, 735, - 724, 151, 715, 151, 766, 769, 724, 724, 732, 358, - 767, 724, 375, 151, 724, 751, 866, 733, 751, 526, - 151, 755, 152, 152, 698, 761, 409, 887, 764, 904, - 151, 767, 916, 933, -1, -1, -1, 761, -1, -1, - 764, -1, -1, 767, -1, -1, -1, -1, -1, 761, - -1, 761, 764, -1, 764, -1, -1, -1, -1, -1, + 66, 69, 75, 69, 70, 71, 72, 71, 74, 75, + 76, 77, 529, 525, 75, 69, 70, 71, 72, 75, + 10, 69, 69, 732, 732, 69, 15, 70, 71, 732, + 732, 732, 70, 71, 5, 732, 7, 11, 9, 16, + 14, 15, 3, 66, 67, 68, 79, 8, 25, 131, + 38, 3, 134, 135, 136, 0, 8, 31, 32, 33, + 34, 35, 36, 37, 38, 16, 79, 80, 7, 82, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 7, 39, 7, 38, 39, 73, 7, 16, 39, 77, + 78, 79, 80, 81, 82, 69, 70, 71, 72, 73, + 3, 31, 32, 33, 34, 8, 36, 7, 38, 39, + 39, 85, 41, 42, 88, 7, 45, 46, 47, 74, + 153, 95, 99, 100, 101, 102, 86, 87, 7, 103, + 104, 61, 62, 107, 64, 65, 7, 3, 128, 3, + 3, 38, 8, 6, 8, 75, 3, 137, 138, 139, + 153, 8, 7, 83, 51, 52, 53, 54, 55, 56, + 57, 870, 870, 153, 7, 153, 7, 870, 870, 870, + 59, 7, 130, 870, 132, 133, 153, 3, 75, 153, + 6, 3, 153, 154, 155, 156, 8, 31, 32, 33, + 34, 3, 38, 153, 38, 153, 8, 37, 153, 6, + 3, 3, 153, 49, 48, 8, 50, 4, 3, 3, + 56, 57, 56, 8, 8, 8, 60, 61, 62, 63, + 64, 65, 3, 153, 153, 3, 738, 8, 3, 75, + 8, 75, 76, 8, 4, 3, 125, 126, 127, 83, + 8, 3, 759, 39, 40, 41, 42, 43, 44, 3, + 316, 4, 3, 8, 8, 6, 153, 89, 90, 91, + 92, 93, 94, 3, 3, 3, 8, 156, 8, 8, + 8, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 4, 3, 3, 3, 3, + 358, 8, 358, 8, 8, 3, 362, 3, 3, 8, + 8, 6, 8, 369, 358, 369, 4, 153, 362, 153, + 358, 358, 4, 379, 358, 369, 153, 306, 307, 362, + 4, 394, 4, 389, 362, 379, 369, 3, 394, 4, + 6, 369, 4, 394, 17, 18, 19, 20, 394, 96, + 97, 98, 472, 473, 474, 12, 13, 413, 4, 86, + 87, 58, 59, 122, 123, 105, 106, 153, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 4, 4, 4, 4, 4, 3, 153, 4, 4, + 8, 3, 154, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 154, 4, + 4, 4, 154, 4, 4, 154, 154, 4, 4, 4, + 4, 4, 4, 154, 4, 4, 4, 4, 4, 4, + 156, 4, 4, 4, 154, 156, 4, 4, 4, 4, + 4, 420, 421, 422, 4, 4, 154, 4, 4, 4, + 4, 154, 154, 4, 517, 518, 4, 4, 4, 4, + 4, 517, 518, 154, 4, 4, 4, 156, 4, 156, + 156, 4, 4, 529, 4, 531, 156, 4, 154, 4, + 4, 4, 4, 154, 154, 4, 4, 156, 156, 156, + 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 153, 153, 7, 7, 7, 7, + 5, 5, 5, 153, 493, 7, 153, 5, 7, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 7, 510, 7, 7, 7, 7, 7, 7, 7, 153, + 153, 7, 84, 124, 4, 4, 4, 4, 4, 3, + 452, 6, 3, 6, 6, 3, 6, 153, 3, 129, + 6, 153, 6, 3, 153, 153, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 3, 3, 6, 524, 153, + 6, 6, 3, 3, 153, 8, 4, 4, 4, 4, + 4, 154, 4, 154, 156, 4, 4, 4, 156, 4, + 4, 154, 154, 6, 154, 154, 4, 8, 5, 8, + 3, 154, 8, 154, 8, 7, 4, 154, 4, 154, + 154, 4, 4, 154, 153, 153, 5, 153, 4, 7, + 4, 4, 153, 153, 4, 316, 511, 518, 516, 340, + 720, 153, 153, 735, 344, 738, 745, 743, 397, 752, + 725, 734, 723, 870, 73, 728, 153, 720, 154, 726, + 729, 731, 153, 153, 720, 723, 729, 723, 153, 732, + 726, 153, 156, 729, 732, 154, 732, 740, 729, 723, + 358, 394, 771, 729, 740, 723, 723, 743, 732, 723, + 154, 153, 769, 774, 732, 732, 740, 389, 732, 732, + 379, 362, 741, 759, 772, 369, 874, 759, 763, 706, + 775, 777, 531, 769, 895, 912, 772, 924, 772, 775, + 413, 941, -1, -1, -1, 769, -1, -1, 772, -1, + -1, 775, -1, -1, -1, -1, 769, -1, -1, 772, + -1, 769, -1, -1, 772, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 862, - -1, -1, -1, 866, 862, -1, 862, -1, -1, -1, - 866, -1, -1, -1, -1, -1, -1, -1, 862, -1, - -1, -1, 866, 886, 862, 862, -1, -1, -1, 862, - 886, -1, 862, -1, -1, -1, -1, -1, -1, -1, - -1, 904, -1, -1, -1, -1, -1, -1, 904 + -1, -1, -1, -1, -1, -1, -1, 870, -1, -1, + -1, 874, 870, -1, 870, -1, -1, -1, 874, -1, + -1, -1, -1, -1, -1, -1, 870, -1, -1, -1, + 874, 894, 870, 870, -1, -1, 870, 870, 894, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 912, + -1, -1, -1, -1, -1, -1, 912 }; const unsigned short int Dhcp6Parser::yystos_[] = { - 0, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 0, 5, - 7, 9, 151, 152, 153, 154, 170, 171, 172, 177, - 7, 186, 7, 192, 7, 203, 7, 280, 7, 355, - 7, 369, 7, 386, 7, 307, 7, 313, 7, 337, - 7, 256, 7, 443, 178, 173, 187, 193, 204, 281, - 356, 370, 387, 308, 314, 338, 257, 444, 170, 179, - 180, 151, 175, 176, 10, 126, 135, 136, 137, 151, - 185, 188, 189, 190, 470, 472, 474, 476, 11, 14, - 15, 31, 32, 33, 34, 35, 36, 37, 38, 66, - 67, 68, 69, 70, 82, 85, 92, 100, 101, 104, - 185, 194, 195, 196, 197, 198, 199, 200, 201, 210, - 212, 236, 242, 248, 250, 264, 274, 297, 305, 331, - 409, 420, 432, 433, 441, 12, 13, 205, 206, 207, - 209, 48, 50, 56, 57, 58, 59, 60, 61, 62, - 72, 73, 80, 185, 196, 197, 198, 199, 282, 283, - 284, 286, 288, 290, 292, 295, 296, 331, 349, 361, - 363, 380, 405, 49, 185, 290, 331, 357, 358, 359, - 361, 51, 52, 53, 54, 55, 185, 290, 331, 361, - 371, 372, 373, 375, 376, 378, 379, 70, 74, 75, - 76, 77, 78, 79, 185, 331, 388, 389, 390, 391, - 393, 395, 397, 399, 401, 403, 305, 16, 39, 41, - 42, 45, 46, 47, 185, 226, 315, 316, 317, 318, - 319, 320, 321, 323, 325, 327, 328, 330, 40, 43, - 44, 185, 226, 319, 325, 339, 340, 341, 342, 343, - 345, 346, 347, 348, 83, 84, 185, 258, 259, 260, - 262, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 185, 445, 446, 447, 448, - 450, 452, 453, 455, 456, 457, 460, 462, 463, 464, - 465, 468, 6, 3, 4, 8, 3, 191, 477, 471, - 473, 475, 4, 3, 8, 202, 211, 213, 4, 4, - 4, 4, 4, 275, 306, 332, 298, 237, 249, 243, - 410, 251, 265, 421, 4, 434, 442, 3, 8, 208, - 4, 3, 8, 350, 364, 362, 285, 287, 289, 4, - 4, 293, 291, 381, 406, 3, 8, 360, 3, 8, - 374, 4, 377, 4, 4, 3, 8, 404, 392, 394, - 396, 398, 400, 402, 8, 3, 8, 322, 227, 4, - 326, 324, 329, 4, 8, 3, 344, 4, 4, 8, - 3, 261, 263, 3, 8, 4, 449, 451, 4, 454, - 4, 4, 458, 461, 4, 4, 4, 466, 469, 3, - 8, 170, 170, 151, 4, 4, 4, 4, 4, 189, - 4, 4, 4, 152, 152, 152, 152, 152, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 152, - 4, 4, 195, 4, 154, 206, 4, 4, 4, 4, - 4, 4, 152, 154, 4, 4, 4, 4, 283, 4, - 358, 4, 152, 4, 152, 152, 372, 4, 4, 4, - 4, 4, 4, 4, 390, 4, 4, 152, 4, 4, - 4, 154, 317, 4, 154, 154, 341, 4, 4, 259, - 154, 4, 4, 152, 4, 152, 152, 4, 4, 154, - 154, 154, 4, 4, 446, 4, 7, 7, 170, 170, - 170, 7, 7, 7, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 7, 7, 7, 7, 5, 181, 5, - 5, 172, 174, 151, 151, 151, 63, 64, 65, 294, - 151, 5, 7, 151, 151, 151, 181, 181, 181, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 170, 151, 151, 151, 119, 120, 459, 121, 122, 123, - 124, 125, 154, 467, 151, 170, 194, 127, 478, 479, - 480, 205, 16, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 185, 214, 215, 216, 219, 221, 223, - 225, 226, 228, 229, 230, 231, 232, 234, 214, 7, - 276, 277, 278, 7, 309, 310, 311, 7, 333, 334, - 335, 7, 299, 300, 301, 76, 151, 238, 239, 240, - 241, 179, 77, 79, 240, 244, 245, 246, 247, 7, - 411, 412, 7, 252, 253, 254, 86, 87, 88, 89, - 90, 91, 266, 267, 268, 269, 270, 271, 272, 273, - 16, 96, 97, 98, 99, 185, 228, 422, 423, 424, - 427, 428, 430, 431, 102, 103, 435, 436, 437, 439, - 445, 182, 7, 351, 352, 353, 7, 365, 366, 367, - 7, 382, 383, 384, 81, 407, 8, 481, 3, 8, - 8, 217, 220, 222, 224, 4, 4, 4, 4, 4, - 233, 235, 3, 8, 8, 279, 6, 3, 312, 6, - 3, 336, 6, 3, 302, 6, 3, 3, 6, 6, - 3, 6, 413, 3, 6, 255, 6, 3, 4, 4, - 4, 4, 4, 4, 3, 8, 425, 429, 4, 4, - 4, 3, 8, 438, 440, 3, 8, 8, 151, 183, - 184, 354, 6, 3, 368, 6, 3, 385, 6, 3, - 408, 8, 4, 479, 4, 4, 4, 4, 152, 154, - 152, 154, 152, 4, 4, 215, 282, 278, 315, 311, - 339, 335, 185, 196, 197, 198, 199, 226, 274, 286, - 288, 290, 292, 296, 303, 304, 331, 405, 301, 239, - 245, 71, 185, 226, 331, 414, 415, 416, 417, 418, - 412, 258, 254, 152, 152, 152, 152, 152, 152, 267, - 4, 4, 152, 152, 152, 423, 4, 4, 436, 6, - 3, 357, 353, 371, 367, 388, 384, 4, 5, 17, - 18, 19, 20, 218, 151, 151, 151, 151, 151, 8, - 8, 8, 3, 8, 419, 8, 3, 8, 93, 94, - 95, 426, 151, 151, 151, 151, 8, 8, 8, 151, - 7, 482, 483, 304, 4, 416, 484, 3, 6, 151, - 128, 130, 131, 185, 226, 485, 486, 487, 488, 490, - 483, 491, 4, 489, 3, 8, 4, 152, 4, 486, - 5, 151, 7, 492, 493, 494, 3, 6, 129, 132, - 133, 134, 495, 496, 497, 499, 500, 501, 493, 498, - 4, 4, 4, 3, 8, 4, 154, 152, 152, 496, - 151 + 0, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 0, 5, + 7, 9, 153, 154, 155, 156, 172, 173, 174, 179, + 7, 188, 7, 194, 7, 205, 7, 282, 7, 357, + 7, 374, 7, 391, 7, 309, 7, 315, 7, 339, + 7, 258, 7, 448, 180, 175, 189, 195, 206, 283, + 358, 375, 392, 310, 316, 340, 259, 449, 172, 181, + 182, 153, 177, 178, 10, 128, 137, 138, 139, 153, + 187, 190, 191, 192, 475, 477, 479, 481, 11, 14, + 15, 31, 32, 33, 34, 35, 36, 37, 38, 69, + 70, 71, 72, 73, 85, 88, 95, 103, 104, 107, + 187, 196, 197, 198, 199, 200, 201, 202, 203, 212, + 214, 238, 244, 250, 252, 266, 276, 299, 307, 333, + 414, 425, 437, 438, 446, 12, 13, 207, 208, 209, + 211, 48, 50, 56, 60, 61, 62, 63, 64, 65, + 75, 76, 83, 187, 198, 199, 200, 201, 284, 285, + 286, 288, 290, 292, 294, 297, 298, 333, 351, 363, + 368, 385, 410, 49, 57, 187, 292, 333, 359, 360, + 361, 363, 365, 51, 52, 53, 54, 55, 187, 292, + 333, 363, 365, 376, 377, 378, 380, 381, 383, 384, + 73, 77, 78, 79, 80, 81, 82, 187, 333, 393, + 394, 395, 396, 398, 400, 402, 404, 406, 408, 307, + 16, 39, 41, 42, 45, 46, 47, 187, 228, 317, + 318, 319, 320, 321, 322, 323, 325, 327, 329, 330, + 332, 40, 43, 44, 187, 228, 321, 327, 341, 342, + 343, 344, 345, 347, 348, 349, 350, 86, 87, 187, + 260, 261, 262, 264, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 187, 450, + 451, 452, 453, 455, 457, 458, 460, 461, 462, 465, + 467, 468, 469, 470, 473, 6, 3, 4, 8, 3, + 193, 482, 476, 478, 480, 4, 3, 8, 204, 213, + 215, 4, 4, 4, 4, 4, 277, 308, 334, 300, + 239, 251, 245, 415, 253, 267, 426, 4, 439, 447, + 3, 8, 210, 4, 3, 8, 352, 369, 364, 287, + 289, 291, 4, 4, 295, 293, 386, 411, 3, 8, + 362, 366, 3, 8, 379, 4, 382, 4, 4, 3, + 8, 409, 397, 399, 401, 403, 405, 407, 8, 3, + 8, 324, 229, 4, 328, 326, 331, 4, 8, 3, + 346, 4, 4, 8, 3, 263, 265, 3, 8, 4, + 454, 456, 4, 459, 4, 4, 463, 466, 4, 4, + 4, 471, 474, 3, 8, 172, 172, 153, 4, 4, + 4, 4, 4, 191, 4, 4, 4, 154, 154, 154, + 154, 154, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 154, 4, 4, 197, 4, 156, 208, + 4, 4, 4, 4, 4, 4, 154, 156, 4, 4, + 4, 4, 285, 4, 4, 360, 4, 154, 4, 154, + 154, 377, 4, 4, 4, 4, 4, 4, 4, 395, + 4, 4, 154, 4, 4, 4, 156, 319, 4, 156, + 156, 343, 4, 4, 261, 156, 4, 4, 154, 4, + 154, 154, 4, 4, 156, 156, 156, 4, 4, 451, + 4, 7, 7, 172, 172, 172, 7, 7, 7, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, + 7, 7, 5, 183, 5, 5, 174, 176, 153, 153, + 153, 66, 67, 68, 296, 153, 5, 7, 153, 58, + 59, 367, 153, 153, 183, 183, 183, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 172, 153, + 153, 153, 122, 123, 464, 124, 59, 125, 126, 127, + 156, 472, 153, 172, 196, 129, 483, 484, 485, 207, + 16, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 187, 216, 217, 218, 221, 223, 225, 227, 228, + 230, 231, 232, 233, 234, 236, 216, 7, 278, 279, + 280, 7, 311, 312, 313, 7, 335, 336, 337, 7, + 301, 302, 303, 79, 153, 240, 241, 242, 243, 181, + 80, 82, 242, 246, 247, 248, 249, 7, 416, 417, + 7, 254, 255, 256, 89, 90, 91, 92, 93, 94, + 268, 269, 270, 271, 272, 273, 274, 275, 16, 99, + 100, 101, 102, 187, 230, 427, 428, 429, 432, 433, + 435, 436, 105, 106, 440, 441, 442, 444, 450, 184, + 7, 353, 354, 355, 7, 370, 371, 372, 7, 387, + 388, 389, 84, 412, 8, 486, 3, 8, 8, 219, + 222, 224, 226, 4, 4, 4, 4, 4, 235, 237, + 3, 8, 8, 281, 6, 3, 314, 6, 3, 338, + 6, 3, 304, 6, 3, 3, 6, 6, 3, 6, + 418, 3, 6, 257, 6, 3, 4, 4, 4, 4, + 4, 4, 3, 8, 430, 434, 4, 4, 4, 3, + 8, 443, 445, 3, 8, 8, 153, 185, 186, 356, + 6, 3, 373, 6, 3, 390, 6, 3, 413, 8, + 4, 484, 4, 4, 4, 4, 154, 156, 154, 156, + 154, 4, 4, 217, 284, 280, 317, 313, 341, 337, + 187, 198, 199, 200, 201, 228, 276, 288, 290, 292, + 294, 298, 305, 306, 333, 410, 303, 241, 247, 74, + 187, 228, 333, 419, 420, 421, 422, 423, 417, 260, + 256, 154, 154, 154, 154, 154, 154, 269, 4, 4, + 154, 154, 154, 428, 4, 4, 441, 6, 3, 359, + 355, 376, 372, 393, 389, 4, 5, 17, 18, 19, + 20, 220, 153, 153, 153, 153, 153, 8, 8, 8, + 3, 8, 424, 8, 3, 8, 96, 97, 98, 431, + 153, 153, 153, 153, 8, 8, 8, 153, 7, 487, + 488, 306, 4, 421, 489, 3, 6, 153, 130, 132, + 133, 187, 228, 490, 491, 492, 493, 495, 488, 496, + 4, 494, 3, 8, 4, 154, 4, 491, 5, 153, + 7, 497, 498, 499, 3, 6, 131, 134, 135, 136, + 500, 501, 502, 504, 505, 506, 498, 503, 4, 4, + 4, 3, 8, 4, 156, 154, 154, 501, 153 }; const unsigned short int Dhcp6Parser::yyr1_[] = { - 0, 155, 157, 156, 158, 156, 159, 156, 160, 156, - 161, 156, 162, 156, 163, 156, 164, 156, 165, 156, - 166, 156, 167, 156, 168, 156, 169, 156, 170, 170, - 170, 170, 170, 170, 170, 171, 173, 172, 174, 175, - 175, 176, 176, 178, 177, 179, 179, 180, 180, 182, - 181, 183, 183, 184, 184, 185, 187, 186, 188, 188, - 189, 189, 189, 189, 189, 189, 191, 190, 193, 192, - 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 196, 197, 198, 199, 200, - 202, 201, 204, 203, 205, 205, 206, 206, 208, 207, - 209, 211, 210, 213, 212, 214, 214, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 217, 216, 218, 218, 218, 218, 220, 219, 222, 221, - 224, 223, 225, 227, 226, 228, 229, 230, 231, 233, - 232, 235, 234, 237, 236, 238, 238, 239, 239, 240, - 241, 243, 242, 244, 244, 245, 245, 245, 246, 247, - 249, 248, 251, 250, 252, 252, 253, 253, 255, 254, - 257, 256, 258, 258, 258, 259, 259, 261, 260, 263, - 262, 265, 264, 266, 266, 267, 267, 267, 267, 267, - 267, 268, 269, 270, 271, 272, 273, 275, 274, 276, - 276, 277, 277, 279, 278, 281, 280, 282, 282, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 285, 284, 287, - 286, 289, 288, 291, 290, 293, 292, 294, 294, 294, - 295, 296, 298, 297, 299, 299, 300, 300, 302, 301, - 303, 303, 304, 304, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 306, 305, 308, 307, - 309, 309, 310, 310, 312, 311, 314, 313, 315, 315, - 316, 316, 317, 317, 317, 317, 317, 317, 317, 317, - 318, 319, 320, 322, 321, 324, 323, 326, 325, 327, - 329, 328, 330, 332, 331, 333, 333, 334, 334, 336, - 335, 338, 337, 339, 339, 340, 340, 341, 341, 341, - 341, 341, 341, 341, 342, 344, 343, 345, 346, 347, - 348, 350, 349, 351, 351, 352, 352, 354, 353, 356, - 355, 357, 357, 358, 358, 358, 358, 358, 360, 359, - 362, 361, 364, 363, 365, 365, 366, 366, 368, 367, - 370, 369, 371, 371, 372, 372, 372, 372, 372, 372, - 372, 372, 372, 374, 373, 375, 377, 376, 378, 379, - 381, 380, 382, 382, 383, 383, 385, 384, 387, 386, - 388, 388, 389, 389, 390, 390, 390, 390, 390, 390, - 390, 390, 390, 392, 391, 394, 393, 396, 395, 398, - 397, 400, 399, 402, 401, 404, 403, 406, 405, 408, - 407, 410, 409, 411, 411, 413, 412, 414, 414, 415, - 415, 416, 416, 416, 416, 417, 419, 418, 421, 420, - 422, 422, 423, 423, 423, 423, 423, 423, 423, 425, - 424, 426, 426, 426, 427, 429, 428, 430, 431, 432, - 434, 433, 435, 435, 436, 436, 438, 437, 440, 439, - 442, 441, 444, 443, 445, 445, 446, 446, 446, 446, - 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - 446, 447, 449, 448, 451, 450, 452, 454, 453, 455, - 456, 458, 457, 459, 459, 461, 460, 462, 463, 464, - 466, 465, 467, 467, 467, 467, 467, 469, 468, 471, - 470, 473, 472, 475, 474, 477, 476, 478, 478, 479, - 481, 480, 482, 482, 484, 483, 485, 485, 486, 486, - 486, 486, 486, 487, 489, 488, 491, 490, 492, 492, - 494, 493, 495, 495, 496, 496, 496, 496, 498, 497, - 499, 500, 501 + 0, 157, 159, 158, 160, 158, 161, 158, 162, 158, + 163, 158, 164, 158, 165, 158, 166, 158, 167, 158, + 168, 158, 169, 158, 170, 158, 171, 158, 172, 172, + 172, 172, 172, 172, 172, 173, 175, 174, 176, 177, + 177, 178, 178, 180, 179, 181, 181, 182, 182, 184, + 183, 185, 185, 186, 186, 187, 189, 188, 190, 190, + 191, 191, 191, 191, 191, 191, 193, 192, 195, 194, + 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 198, 199, 200, 201, 202, + 204, 203, 206, 205, 207, 207, 208, 208, 210, 209, + 211, 213, 212, 215, 214, 216, 216, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 219, 218, 220, 220, 220, 220, 222, 221, 224, 223, + 226, 225, 227, 229, 228, 230, 231, 232, 233, 235, + 234, 237, 236, 239, 238, 240, 240, 241, 241, 242, + 243, 245, 244, 246, 246, 247, 247, 247, 248, 249, + 251, 250, 253, 252, 254, 254, 255, 255, 257, 256, + 259, 258, 260, 260, 260, 261, 261, 263, 262, 265, + 264, 267, 266, 268, 268, 269, 269, 269, 269, 269, + 269, 270, 271, 272, 273, 274, 275, 277, 276, 278, + 278, 279, 279, 281, 280, 283, 282, 284, 284, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 287, 286, 289, + 288, 291, 290, 293, 292, 295, 294, 296, 296, 296, + 297, 298, 300, 299, 301, 301, 302, 302, 304, 303, + 305, 305, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 308, 307, 310, 309, + 311, 311, 312, 312, 314, 313, 316, 315, 317, 317, + 318, 318, 319, 319, 319, 319, 319, 319, 319, 319, + 320, 321, 322, 324, 323, 326, 325, 328, 327, 329, + 331, 330, 332, 334, 333, 335, 335, 336, 336, 338, + 337, 340, 339, 341, 341, 342, 342, 343, 343, 343, + 343, 343, 343, 343, 344, 346, 345, 347, 348, 349, + 350, 352, 351, 353, 353, 354, 354, 356, 355, 358, + 357, 359, 359, 360, 360, 360, 360, 360, 360, 362, + 361, 364, 363, 366, 365, 367, 367, 369, 368, 370, + 370, 371, 371, 373, 372, 375, 374, 376, 376, 377, + 377, 377, 377, 377, 377, 377, 377, 377, 377, 379, + 378, 380, 382, 381, 383, 384, 386, 385, 387, 387, + 388, 388, 390, 389, 392, 391, 393, 393, 394, 394, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 397, + 396, 399, 398, 401, 400, 403, 402, 405, 404, 407, + 406, 409, 408, 411, 410, 413, 412, 415, 414, 416, + 416, 418, 417, 419, 419, 420, 420, 421, 421, 421, + 421, 422, 424, 423, 426, 425, 427, 427, 428, 428, + 428, 428, 428, 428, 428, 430, 429, 431, 431, 431, + 432, 434, 433, 435, 436, 437, 439, 438, 440, 440, + 441, 441, 443, 442, 445, 444, 447, 446, 449, 448, + 450, 450, 451, 451, 451, 451, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 451, 451, 452, 454, 453, + 456, 455, 457, 459, 458, 460, 461, 463, 462, 464, + 464, 466, 465, 467, 468, 469, 471, 470, 472, 472, + 472, 472, 472, 474, 473, 476, 475, 478, 477, 480, + 479, 482, 481, 483, 483, 484, 486, 485, 487, 487, + 489, 488, 490, 490, 491, 491, 491, 491, 491, 492, + 494, 493, 496, 495, 497, 497, 499, 498, 500, 500, + 501, 501, 501, 501, 503, 502, 504, 505, 506 }; const unsigned char @@ -4211,29 +4252,29 @@ namespace isc { namespace dhcp { 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, - 4, 1, 3, 1, 1, 1, 1, 1, 0, 4, - 0, 4, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 4, 3, 0, 4, 3, 3, - 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, - 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 4, 1, 3, 1, 1, 1, 1, 1, 1, 0, + 4, 0, 4, 0, 4, 1, 1, 0, 6, 0, + 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 3, 0, 4, 3, 3, 0, 6, 0, 1, + 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, + 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, + 1, 1, 0, 4, 0, 6, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 1, 1, 1, + 3, 0, 4, 3, 3, 3, 0, 6, 1, 3, + 1, 1, 0, 4, 0, 4, 0, 6, 0, 4, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 4, + 0, 4, 3, 0, 4, 3, 3, 0, 4, 1, + 1, 0, 4, 3, 3, 3, 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, - 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 0, 4, 0, 6, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 0, - 4, 1, 1, 1, 3, 0, 4, 3, 3, 3, - 0, 6, 1, 3, 1, 1, 0, 4, 0, 4, - 0, 6, 0, 4, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 0, 4, 0, 4, 3, 0, 4, 3, - 3, 0, 4, 1, 1, 0, 4, 3, 3, 3, - 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 6, 1, 3, 1, - 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, - 1, 1, 1, 3, 0, 4, 0, 6, 1, 3, - 0, 4, 1, 3, 1, 1, 1, 1, 0, 4, - 3, 3, 3 + 4, 0, 6, 1, 3, 1, 0, 6, 1, 3, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 3, + 0, 4, 0, 6, 1, 3, 0, 4, 1, 3, + 1, 1, 1, 1, 0, 4, 3, 3, 3 }; @@ -4257,8 +4298,9 @@ namespace isc { namespace dhcp { "\"record-types\"", "\"encapsulate\"", "\"array\"", "\"pools\"", "\"pool\"", "\"pd-pools\"", "\"prefix\"", "\"prefix-len\"", "\"excluded-prefix\"", "\"excluded-prefix-len\"", "\"delegated-len\"", - "\"user-context\"", "\"subnet\"", "\"interface\"", "\"interface-id\"", - "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", + "\"user-context\"", "\"known-clients\"", "\"only\"", "\"never\"", + "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", + "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", "\"client-classes\"", "\"test\"", "\"client-class\"", "\"reservations\"", @@ -4277,27 +4319,27 @@ namespace isc { namespace dhcp { "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", "\"override-no-update\"", "\"override-client-update\"", "\"replace-client-name\"", "\"generated-prefix\"", "\"UDP\"", "\"TCP\"", - "\"JSON\"", "\"when-present\"", "\"never\"", "\"always\"", - "\"when-not-present\"", "\"Logging\"", "\"loggers\"", - "\"output_options\"", "\"output\"", "\"debuglevel\"", "\"severity\"", - "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", - "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", - "SUB_INTERFACES6", "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", - "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", - "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", - "\"constant string\"", "\"integer\"", "\"floating point\"", - "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", - "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", "value", - "sub_json", "map2", "$@14", "map_value", "map_content", "not_empty_map", - "list_generic", "$@15", "list_content", "not_empty_list", "list_strings", - "$@16", "list_strings_content", "not_empty_list_strings", - "unknown_map_entry", "syntax_map", "$@17", "global_objects", - "global_object", "dhcp6_object", "$@18", "sub_dhcp6", "$@19", - "global_params", "global_param", "preferred_lifetime", "valid_lifetime", - "renew_timer", "rebind_timer", "decline_probation_period", - "interfaces_config", "$@20", "sub_interfaces6", "$@21", - "interfaces_config_params", "interfaces_config_param", "interfaces_list", - "$@22", "re_detect", "lease_database", "$@23", "hosts_database", "$@24", + "\"JSON\"", "\"when-present\"", "\"always\"", "\"when-not-present\"", + "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", + "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", + "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", "\"Control-agent\"", + "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", "SUB_INTERFACES6", + "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", "SUB_RESERVATION", + "SUB_OPTION_DEFS", "SUB_OPTION_DEF", "SUB_OPTION_DATA", + "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", "\"constant string\"", + "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start", + "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", + "$@11", "$@12", "$@13", "value", "sub_json", "map2", "$@14", "map_value", + "map_content", "not_empty_map", "list_generic", "$@15", "list_content", + "not_empty_list", "list_strings", "$@16", "list_strings_content", + "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@17", + "global_objects", "global_object", "dhcp6_object", "$@18", "sub_dhcp6", + "$@19", "global_params", "global_param", "preferred_lifetime", + "valid_lifetime", "renew_timer", "rebind_timer", + "decline_probation_period", "interfaces_config", "$@20", + "sub_interfaces6", "$@21", "interfaces_config_params", + "interfaces_config_param", "interfaces_list", "$@22", "re_detect", + "lease_database", "$@23", "hosts_database", "$@24", "database_map_params", "database_map_param", "database_type", "$@25", "db_type", "user", "$@26", "password", "$@27", "host", "$@28", "port", "name", "$@29", "persist", "lfc_interval", "readonly", "connect_timeout", @@ -4336,38 +4378,39 @@ namespace isc { namespace dhcp { "option_data_always_send", "pools_list", "$@63", "pools_list_content", "not_empty_pools_list", "pool_list_entry", "$@64", "sub_pool6", "$@65", "pool_params", "pool_param", "pool_entry", "$@66", "user_context", - "$@67", "pd_pools_list", "$@68", "pd_pools_list_content", - "not_empty_pd_pools_list", "pd_pool_entry", "$@69", "sub_pd_pool", - "$@70", "pd_pool_params", "pd_pool_param", "pd_prefix", "$@71", - "pd_prefix_len", "excluded_prefix", "$@72", "excluded_prefix_len", - "pd_delegated_len", "reservations", "$@73", "reservations_list", - "not_empty_reservations_list", "reservation", "$@74", "sub_reservation", - "$@75", "reservation_params", "not_empty_reservation_params", - "reservation_param", "ip_addresses", "$@76", "prefixes", "$@77", "duid", - "$@78", "hw_address", "$@79", "hostname", "$@80", "flex_id_value", - "$@81", "reservation_client_classes", "$@82", "relay", "$@83", - "relay_map", "$@84", "client_classes", "$@85", "client_classes_list", - "client_class_entry", "$@86", "client_class_params", + "$@67", "known_clients", "$@68", "known_clients_value", "pd_pools_list", + "$@69", "pd_pools_list_content", "not_empty_pd_pools_list", + "pd_pool_entry", "$@70", "sub_pd_pool", "$@71", "pd_pool_params", + "pd_pool_param", "pd_prefix", "$@72", "pd_prefix_len", "excluded_prefix", + "$@73", "excluded_prefix_len", "pd_delegated_len", "reservations", + "$@74", "reservations_list", "not_empty_reservations_list", + "reservation", "$@75", "sub_reservation", "$@76", "reservation_params", + "not_empty_reservation_params", "reservation_param", "ip_addresses", + "$@77", "prefixes", "$@78", "duid", "$@79", "hw_address", "$@80", + "hostname", "$@81", "flex_id_value", "$@82", + "reservation_client_classes", "$@83", "relay", "$@84", "relay_map", + "$@85", "client_classes", "$@86", "client_classes_list", + "client_class_entry", "$@87", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@87", "server_id", "$@88", - "server_id_params", "server_id_param", "server_id_type", "$@89", - "duid_type", "htype", "identifier", "$@90", "time", "enterprise_id", - "dhcp4o6_port", "control_socket", "$@91", "control_socket_params", - "control_socket_param", "socket_type", "$@92", "socket_name", "$@93", - "dhcp_ddns", "$@94", "sub_dhcp_ddns", "$@95", "dhcp_ddns_params", - "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@96", - "server_ip", "$@97", "server_port", "sender_ip", "$@98", "sender_port", - "max_queue_size", "ncr_protocol", "$@99", "ncr_protocol_value", - "ncr_format", "$@100", "always_include_fqdn", "override_no_update", - "override_client_update", "replace_client_name", "$@101", - "replace_client_name_value", "generated_prefix", "$@102", - "dhcp4_json_object", "$@103", "dhcpddns_json_object", "$@104", - "control_agent_json_object", "$@105", "logging_object", "$@106", - "logging_params", "logging_param", "loggers", "$@107", "loggers_entries", - "logger_entry", "$@108", "logger_params", "logger_param", "debuglevel", - "severity", "$@109", "output_options_list", "$@110", - "output_options_list_content", "output_entry", "$@111", - "output_params_list", "output_params", "output", "$@112", "flush", + "client_class_name", "client_class_test", "$@88", "server_id", "$@89", + "server_id_params", "server_id_param", "server_id_type", "$@90", + "duid_type", "htype", "identifier", "$@91", "time", "enterprise_id", + "dhcp4o6_port", "control_socket", "$@92", "control_socket_params", + "control_socket_param", "socket_type", "$@93", "socket_name", "$@94", + "dhcp_ddns", "$@95", "sub_dhcp_ddns", "$@96", "dhcp_ddns_params", + "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@97", + "server_ip", "$@98", "server_port", "sender_ip", "$@99", "sender_port", + "max_queue_size", "ncr_protocol", "$@100", "ncr_protocol_value", + "ncr_format", "$@101", "always_include_fqdn", "override_no_update", + "override_client_update", "replace_client_name", "$@102", + "replace_client_name_value", "generated_prefix", "$@103", + "dhcp4_json_object", "$@104", "dhcpddns_json_object", "$@105", + "control_agent_json_object", "$@106", "logging_object", "$@107", + "logging_params", "logging_param", "loggers", "$@108", "loggers_entries", + "logger_entry", "$@109", "logger_params", "logger_param", "debuglevel", + "severity", "$@110", "output_options_list", "$@111", + "output_options_list_content", "output_entry", "$@112", + "output_params_list", "output_params", "output", "$@113", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4375,64 +4418,64 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp6Parser::yyrline_[] = { - 0, 236, 236, 236, 237, 237, 238, 238, 239, 239, - 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, - 245, 245, 246, 246, 247, 247, 248, 248, 256, 257, - 258, 259, 260, 261, 262, 265, 270, 270, 281, 284, - 285, 288, 292, 299, 299, 306, 307, 310, 314, 321, - 321, 328, 329, 332, 336, 347, 357, 357, 372, 373, - 377, 378, 379, 380, 381, 382, 385, 385, 400, 400, - 409, 410, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 440, 445, 450, 455, 460, - 465, 465, 476, 476, 485, 486, 489, 490, 493, 493, - 503, 509, 509, 521, 521, 533, 534, 537, 538, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 552, 552, 559, 560, 561, 562, 565, 565, 573, 573, - 581, 581, 589, 594, 594, 602, 607, 612, 617, 622, - 622, 630, 630, 639, 639, 649, 650, 653, 654, 657, - 662, 667, 667, 677, 678, 681, 682, 683, 686, 691, - 698, 698, 708, 708, 718, 719, 722, 723, 726, 726, - 736, 736, 746, 747, 748, 751, 752, 755, 755, 763, - 763, 771, 771, 782, 783, 786, 787, 788, 789, 790, - 791, 794, 799, 804, 809, 814, 819, 827, 827, 840, - 841, 844, 845, 852, 852, 878, 878, 889, 890, 894, - 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, - 905, 906, 907, 908, 909, 910, 911, 914, 914, 922, - 922, 930, 930, 938, 938, 946, 946, 953, 954, 955, - 958, 963, 971, 971, 982, 983, 987, 988, 991, 991, - 999, 1000, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1023, 1023, 1036, 1036, - 1045, 1046, 1049, 1050, 1055, 1055, 1070, 1070, 1084, 1085, - 1088, 1089, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, - 1102, 1104, 1109, 1111, 1111, 1119, 1119, 1127, 1127, 1135, - 1137, 1137, 1145, 1154, 1154, 1166, 1167, 1172, 1173, 1178, - 1178, 1190, 1190, 1202, 1203, 1208, 1209, 1214, 1215, 1216, - 1217, 1218, 1219, 1220, 1223, 1225, 1225, 1233, 1235, 1237, - 1242, 1250, 1250, 1262, 1263, 1266, 1267, 1270, 1270, 1280, - 1280, 1289, 1290, 1293, 1294, 1295, 1296, 1297, 1300, 1300, - 1308, 1308, 1318, 1318, 1330, 1331, 1334, 1335, 1338, 1338, - 1350, 1350, 1362, 1363, 1366, 1367, 1368, 1369, 1370, 1371, - 1372, 1373, 1374, 1377, 1377, 1385, 1390, 1390, 1398, 1403, - 1411, 1411, 1421, 1422, 1425, 1426, 1429, 1429, 1438, 1438, - 1447, 1448, 1451, 1452, 1456, 1457, 1458, 1459, 1460, 1461, - 1462, 1463, 1464, 1467, 1467, 1477, 1477, 1487, 1487, 1495, - 1495, 1503, 1503, 1511, 1511, 1519, 1519, 1532, 1532, 1542, - 1542, 1553, 1553, 1563, 1564, 1567, 1567, 1577, 1578, 1581, - 1582, 1585, 1586, 1587, 1588, 1591, 1593, 1593, 1604, 1604, - 1616, 1617, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1629, - 1629, 1636, 1637, 1638, 1641, 1646, 1646, 1654, 1659, 1666, - 1673, 1673, 1683, 1684, 1687, 1688, 1691, 1691, 1699, 1699, - 1709, 1709, 1721, 1721, 1731, 1732, 1735, 1736, 1737, 1738, - 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, - 1749, 1752, 1757, 1757, 1765, 1765, 1773, 1778, 1778, 1786, - 1791, 1796, 1796, 1804, 1805, 1808, 1808, 1816, 1821, 1826, - 1831, 1831, 1839, 1842, 1845, 1848, 1851, 1857, 1857, 1867, - 1867, 1874, 1874, 1881, 1881, 1894, 1894, 1907, 1908, 1912, - 1916, 1916, 1928, 1929, 1933, 1933, 1941, 1942, 1945, 1946, - 1947, 1948, 1949, 1952, 1957, 1957, 1965, 1965, 1975, 1976, - 1979, 1979, 1987, 1988, 1991, 1992, 1993, 1994, 1997, 1997, - 2005, 2010, 2015 + 0, 239, 239, 239, 240, 240, 241, 241, 242, 242, + 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, + 248, 248, 249, 249, 250, 250, 251, 251, 259, 260, + 261, 262, 263, 264, 265, 268, 273, 273, 284, 287, + 288, 291, 295, 302, 302, 309, 310, 313, 317, 324, + 324, 331, 332, 335, 339, 350, 360, 360, 375, 376, + 380, 381, 382, 383, 384, 385, 388, 388, 403, 403, + 412, 413, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 443, 448, 453, 458, 463, + 468, 468, 479, 479, 488, 489, 492, 493, 496, 496, + 506, 512, 512, 524, 524, 536, 537, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 555, 555, 562, 563, 564, 565, 568, 568, 576, 576, + 584, 584, 592, 597, 597, 605, 610, 615, 620, 625, + 625, 633, 633, 642, 642, 652, 653, 656, 657, 660, + 665, 670, 670, 680, 681, 684, 685, 686, 689, 694, + 701, 701, 711, 711, 721, 722, 725, 726, 729, 729, + 739, 739, 749, 750, 751, 754, 755, 758, 758, 766, + 766, 774, 774, 785, 786, 789, 790, 791, 792, 793, + 794, 797, 802, 807, 812, 817, 822, 830, 830, 843, + 844, 847, 848, 855, 855, 881, 881, 892, 893, 897, + 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 917, 917, 925, + 925, 933, 933, 941, 941, 949, 949, 956, 957, 958, + 961, 966, 974, 974, 985, 986, 990, 991, 994, 994, + 1002, 1003, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1026, 1026, 1039, 1039, + 1048, 1049, 1052, 1053, 1058, 1058, 1073, 1073, 1087, 1088, + 1091, 1092, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1105, 1107, 1112, 1114, 1114, 1122, 1122, 1130, 1130, 1138, + 1140, 1140, 1148, 1157, 1157, 1169, 1170, 1175, 1176, 1181, + 1181, 1193, 1193, 1205, 1206, 1211, 1212, 1217, 1218, 1219, + 1220, 1221, 1222, 1223, 1226, 1228, 1228, 1236, 1238, 1240, + 1245, 1253, 1253, 1265, 1266, 1269, 1270, 1273, 1273, 1283, + 1283, 1292, 1293, 1296, 1297, 1298, 1299, 1300, 1301, 1304, + 1304, 1312, 1312, 1319, 1319, 1327, 1328, 1334, 1334, 1346, + 1347, 1350, 1351, 1354, 1354, 1366, 1366, 1378, 1379, 1382, + 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1394, + 1394, 1402, 1407, 1407, 1415, 1420, 1428, 1428, 1438, 1439, + 1442, 1443, 1446, 1446, 1455, 1455, 1464, 1465, 1468, 1469, + 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1484, + 1484, 1494, 1494, 1504, 1504, 1512, 1512, 1520, 1520, 1528, + 1528, 1536, 1536, 1549, 1549, 1559, 1559, 1570, 1570, 1580, + 1581, 1584, 1584, 1594, 1595, 1598, 1599, 1602, 1603, 1604, + 1605, 1608, 1610, 1610, 1621, 1621, 1633, 1634, 1637, 1638, + 1639, 1640, 1641, 1642, 1643, 1646, 1646, 1653, 1654, 1655, + 1658, 1663, 1663, 1671, 1676, 1683, 1690, 1690, 1700, 1701, + 1704, 1705, 1708, 1708, 1716, 1716, 1726, 1726, 1738, 1738, + 1748, 1749, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, + 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1769, 1774, 1774, + 1782, 1782, 1790, 1795, 1795, 1803, 1808, 1813, 1813, 1821, + 1822, 1825, 1825, 1833, 1838, 1843, 1848, 1848, 1856, 1859, + 1862, 1865, 1868, 1874, 1874, 1884, 1884, 1891, 1891, 1898, + 1898, 1911, 1911, 1924, 1925, 1929, 1933, 1933, 1945, 1946, + 1950, 1950, 1958, 1959, 1962, 1963, 1964, 1965, 1966, 1969, + 1974, 1974, 1982, 1982, 1992, 1993, 1996, 1996, 2004, 2005, + 2008, 2009, 2010, 2011, 2014, 2014, 2022, 2027, 2032 }; // Print the state stack on the debug stream. @@ -4467,8 +4510,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4471 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2020 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4514 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2037 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index ebc67f6955..bf04e570c3 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -308,6 +308,7 @@ namespace isc { namespace dhcp { // map_value // db_type // hr_mode + // known_clients_value // duid_type // ncr_protocol_value // replace_client_name_value @@ -401,104 +402,106 @@ namespace isc { namespace dhcp { TOKEN_EXCLUDED_PREFIX_LEN = 309, TOKEN_DELEGATED_LEN = 310, TOKEN_USER_CONTEXT = 311, - TOKEN_SUBNET = 312, - TOKEN_INTERFACE = 313, - TOKEN_INTERFACE_ID = 314, - TOKEN_ID = 315, - TOKEN_RAPID_COMMIT = 316, - TOKEN_RESERVATION_MODE = 317, - TOKEN_DISABLED = 318, - TOKEN_OUT_OF_POOL = 319, - TOKEN_ALL = 320, - TOKEN_SHARED_NETWORKS = 321, - TOKEN_MAC_SOURCES = 322, - TOKEN_RELAY_SUPPLIED_OPTIONS = 323, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 324, - TOKEN_CLIENT_CLASSES = 325, - TOKEN_TEST = 326, - TOKEN_CLIENT_CLASS = 327, - TOKEN_RESERVATIONS = 328, - TOKEN_IP_ADDRESSES = 329, - TOKEN_PREFIXES = 330, - TOKEN_DUID = 331, - TOKEN_HW_ADDRESS = 332, - TOKEN_HOSTNAME = 333, - TOKEN_FLEX_ID = 334, - TOKEN_RELAY = 335, - TOKEN_IP_ADDRESS = 336, - TOKEN_HOOKS_LIBRARIES = 337, - TOKEN_LIBRARY = 338, - TOKEN_PARAMETERS = 339, - TOKEN_EXPIRED_LEASES_PROCESSING = 340, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 341, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 342, - TOKEN_HOLD_RECLAIMED_TIME = 343, - TOKEN_MAX_RECLAIM_LEASES = 344, - TOKEN_MAX_RECLAIM_TIME = 345, - TOKEN_UNWARNED_RECLAIM_CYCLES = 346, - TOKEN_SERVER_ID = 347, - TOKEN_LLT = 348, - TOKEN_EN = 349, - TOKEN_LL = 350, - TOKEN_IDENTIFIER = 351, - TOKEN_HTYPE = 352, - TOKEN_TIME = 353, - TOKEN_ENTERPRISE_ID = 354, - TOKEN_DHCP4O6_PORT = 355, - TOKEN_CONTROL_SOCKET = 356, - TOKEN_SOCKET_TYPE = 357, - TOKEN_SOCKET_NAME = 358, - TOKEN_DHCP_DDNS = 359, - TOKEN_ENABLE_UPDATES = 360, - TOKEN_QUALIFYING_SUFFIX = 361, - TOKEN_SERVER_IP = 362, - TOKEN_SERVER_PORT = 363, - TOKEN_SENDER_IP = 364, - TOKEN_SENDER_PORT = 365, - TOKEN_MAX_QUEUE_SIZE = 366, - TOKEN_NCR_PROTOCOL = 367, - TOKEN_NCR_FORMAT = 368, - TOKEN_ALWAYS_INCLUDE_FQDN = 369, - TOKEN_OVERRIDE_NO_UPDATE = 370, - TOKEN_OVERRIDE_CLIENT_UPDATE = 371, - TOKEN_REPLACE_CLIENT_NAME = 372, - TOKEN_GENERATED_PREFIX = 373, - TOKEN_UDP = 374, - TOKEN_TCP = 375, - TOKEN_JSON = 376, - TOKEN_WHEN_PRESENT = 377, - TOKEN_NEVER = 378, - TOKEN_ALWAYS = 379, - TOKEN_WHEN_NOT_PRESENT = 380, - TOKEN_LOGGING = 381, - TOKEN_LOGGERS = 382, - TOKEN_OUTPUT_OPTIONS = 383, - TOKEN_OUTPUT = 384, - TOKEN_DEBUGLEVEL = 385, - TOKEN_SEVERITY = 386, - TOKEN_FLUSH = 387, - TOKEN_MAXSIZE = 388, - TOKEN_MAXVER = 389, - TOKEN_DHCP4 = 390, - TOKEN_DHCPDDNS = 391, - TOKEN_CONTROL_AGENT = 392, - TOKEN_TOPLEVEL_JSON = 393, - TOKEN_TOPLEVEL_DHCP6 = 394, - TOKEN_SUB_DHCP6 = 395, - TOKEN_SUB_INTERFACES6 = 396, - TOKEN_SUB_SUBNET6 = 397, - TOKEN_SUB_POOL6 = 398, - TOKEN_SUB_PD_POOL = 399, - TOKEN_SUB_RESERVATION = 400, - TOKEN_SUB_OPTION_DEFS = 401, - TOKEN_SUB_OPTION_DEF = 402, - TOKEN_SUB_OPTION_DATA = 403, - TOKEN_SUB_HOOKS_LIBRARY = 404, - TOKEN_SUB_DHCP_DDNS = 405, - TOKEN_STRING = 406, - TOKEN_INTEGER = 407, - TOKEN_FLOAT = 408, - TOKEN_BOOLEAN = 409 + TOKEN_KNOWN_CLIENTS = 312, + TOKEN_ONLY = 313, + TOKEN_NEVER = 314, + TOKEN_SUBNET = 315, + TOKEN_INTERFACE = 316, + TOKEN_INTERFACE_ID = 317, + TOKEN_ID = 318, + TOKEN_RAPID_COMMIT = 319, + TOKEN_RESERVATION_MODE = 320, + TOKEN_DISABLED = 321, + TOKEN_OUT_OF_POOL = 322, + TOKEN_ALL = 323, + TOKEN_SHARED_NETWORKS = 324, + TOKEN_MAC_SOURCES = 325, + TOKEN_RELAY_SUPPLIED_OPTIONS = 326, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 327, + TOKEN_CLIENT_CLASSES = 328, + TOKEN_TEST = 329, + TOKEN_CLIENT_CLASS = 330, + TOKEN_RESERVATIONS = 331, + TOKEN_IP_ADDRESSES = 332, + TOKEN_PREFIXES = 333, + TOKEN_DUID = 334, + TOKEN_HW_ADDRESS = 335, + TOKEN_HOSTNAME = 336, + TOKEN_FLEX_ID = 337, + TOKEN_RELAY = 338, + TOKEN_IP_ADDRESS = 339, + TOKEN_HOOKS_LIBRARIES = 340, + TOKEN_LIBRARY = 341, + TOKEN_PARAMETERS = 342, + TOKEN_EXPIRED_LEASES_PROCESSING = 343, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 344, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 345, + TOKEN_HOLD_RECLAIMED_TIME = 346, + TOKEN_MAX_RECLAIM_LEASES = 347, + TOKEN_MAX_RECLAIM_TIME = 348, + TOKEN_UNWARNED_RECLAIM_CYCLES = 349, + TOKEN_SERVER_ID = 350, + TOKEN_LLT = 351, + TOKEN_EN = 352, + TOKEN_LL = 353, + TOKEN_IDENTIFIER = 354, + TOKEN_HTYPE = 355, + TOKEN_TIME = 356, + TOKEN_ENTERPRISE_ID = 357, + TOKEN_DHCP4O6_PORT = 358, + TOKEN_CONTROL_SOCKET = 359, + TOKEN_SOCKET_TYPE = 360, + TOKEN_SOCKET_NAME = 361, + TOKEN_DHCP_DDNS = 362, + TOKEN_ENABLE_UPDATES = 363, + TOKEN_QUALIFYING_SUFFIX = 364, + TOKEN_SERVER_IP = 365, + TOKEN_SERVER_PORT = 366, + TOKEN_SENDER_IP = 367, + TOKEN_SENDER_PORT = 368, + TOKEN_MAX_QUEUE_SIZE = 369, + TOKEN_NCR_PROTOCOL = 370, + TOKEN_NCR_FORMAT = 371, + TOKEN_ALWAYS_INCLUDE_FQDN = 372, + TOKEN_OVERRIDE_NO_UPDATE = 373, + TOKEN_OVERRIDE_CLIENT_UPDATE = 374, + TOKEN_REPLACE_CLIENT_NAME = 375, + TOKEN_GENERATED_PREFIX = 376, + TOKEN_UDP = 377, + TOKEN_TCP = 378, + TOKEN_JSON = 379, + TOKEN_WHEN_PRESENT = 380, + TOKEN_ALWAYS = 381, + TOKEN_WHEN_NOT_PRESENT = 382, + TOKEN_LOGGING = 383, + TOKEN_LOGGERS = 384, + TOKEN_OUTPUT_OPTIONS = 385, + TOKEN_OUTPUT = 386, + TOKEN_DEBUGLEVEL = 387, + TOKEN_SEVERITY = 388, + TOKEN_FLUSH = 389, + TOKEN_MAXSIZE = 390, + TOKEN_MAXVER = 391, + TOKEN_DHCP4 = 392, + TOKEN_DHCPDDNS = 393, + TOKEN_CONTROL_AGENT = 394, + TOKEN_TOPLEVEL_JSON = 395, + TOKEN_TOPLEVEL_DHCP6 = 396, + TOKEN_SUB_DHCP6 = 397, + TOKEN_SUB_INTERFACES6 = 398, + TOKEN_SUB_SUBNET6 = 399, + TOKEN_SUB_POOL6 = 400, + TOKEN_SUB_PD_POOL = 401, + TOKEN_SUB_RESERVATION = 402, + TOKEN_SUB_OPTION_DEFS = 403, + TOKEN_SUB_OPTION_DEF = 404, + TOKEN_SUB_OPTION_DATA = 405, + TOKEN_SUB_HOOKS_LIBRARY = 406, + TOKEN_SUB_DHCP_DDNS = 407, + TOKEN_STRING = 408, + TOKEN_INTEGER = 409, + TOKEN_FLOAT = 410, + TOKEN_BOOLEAN = 411 }; }; @@ -833,6 +836,18 @@ namespace isc { namespace dhcp { symbol_type make_USER_CONTEXT (const location_type& l); + static inline + symbol_type + make_KNOWN_CLIENTS (const location_type& l); + + static inline + symbol_type + make_ONLY (const location_type& l); + + static inline + symbol_type + make_NEVER (const location_type& l); + static inline symbol_type make_SUBNET (const location_type& l); @@ -1097,10 +1112,6 @@ namespace isc { namespace dhcp { symbol_type make_WHEN_PRESENT (const location_type& l); - static inline - symbol_type - make_NEVER (const location_type& l); - static inline symbol_type make_ALWAYS (const location_type& l); @@ -1430,12 +1441,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 838, ///< Last index in yytable_. - yynnts_ = 347, ///< Number of nonterminal symbols. + yylast_ = 846, ///< Last index in yytable_. + yynnts_ = 350, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 155 ///< Number of tokens. + yyntokens_ = 157 ///< Number of tokens. }; @@ -1492,9 +1503,10 @@ 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, 146, 147, 148, 149, 150, 151, 152, 153, 154 + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156 }; - const unsigned int user_token_number_max_ = 409; + const unsigned int user_token_number_max_ = 411; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1527,29 +1539,30 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 154: // "boolean" + case 156: // "boolean" value.copy< bool > (other.value); break; - case 153: // "floating point" + case 155: // "floating point" value.copy< double > (other.value); break; - case 152: // "integer" + case 154: // "integer" value.copy< int64_t > (other.value); break; - case 151: // "constant string" + case 153: // "constant string" value.copy< std::string > (other.value); break; @@ -1570,29 +1583,30 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 154: // "boolean" + case 156: // "boolean" value.copy< bool > (v); break; - case 153: // "floating point" + case 155: // "floating point" value.copy< double > (v); break; - case 152: // "integer" + case 154: // "integer" value.copy< int64_t > (v); break; - case 151: // "constant string" + case 153: // "constant string" value.copy< std::string > (v); break; @@ -1672,29 +1686,30 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 154: // "boolean" + case 156: // "boolean" value.template destroy< bool > (); break; - case 153: // "floating point" + case 155: // "floating point" value.template destroy< double > (); break; - case 152: // "integer" + case 154: // "integer" value.template destroy< int64_t > (); break; - case 151: // "constant string" + case 153: // "constant string" value.template destroy< std::string > (); break; @@ -1721,29 +1736,30 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 170: // value - case 174: // map_value - case 218: // db_type - case 294: // hr_mode - case 426: // duid_type - case 459: // ncr_protocol_value - case 467: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 296: // hr_mode + case 367: // known_clients_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 154: // "boolean" + case 156: // "boolean" value.move< bool > (s.value); break; - case 153: // "floating point" + case 155: // "floating point" value.move< double > (s.value); break; - case 152: // "integer" + case 154: // "integer" value.move< int64_t > (s.value); break; - case 151: // "constant string" + case 153: // "constant string" value.move< std::string > (s.value); break; @@ -1817,7 +1833,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409 + 405, 406, 407, 408, 409, 410, 411 }; return static_cast (yytoken_number_[type]); } @@ -2152,6 +2168,24 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_USER_CONTEXT, l); } + Dhcp6Parser::symbol_type + Dhcp6Parser::make_KNOWN_CLIENTS (const location_type& l) + { + return symbol_type (token::TOKEN_KNOWN_CLIENTS, l); + } + + Dhcp6Parser::symbol_type + Dhcp6Parser::make_ONLY (const location_type& l) + { + return symbol_type (token::TOKEN_ONLY, l); + } + + Dhcp6Parser::symbol_type + Dhcp6Parser::make_NEVER (const location_type& l) + { + return symbol_type (token::TOKEN_NEVER, l); + } + Dhcp6Parser::symbol_type Dhcp6Parser::make_SUBNET (const location_type& l) { @@ -2548,12 +2582,6 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_WHEN_PRESENT, l); } - Dhcp6Parser::symbol_type - Dhcp6Parser::make_NEVER (const location_type& l) - { - return symbol_type (token::TOKEN_NEVER, l); - } - Dhcp6Parser::symbol_type Dhcp6Parser::make_ALWAYS (const location_type& l) { @@ -2743,7 +2771,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2747 "dhcp6_parser.h" // lalr1.cc:377 +#line 2775 "dhcp6_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index ae485e22aa..a4c2b72f9b 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 3cf50f8471..474b341ca5 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index dbed07ff12..c57d21f6b2 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711032151 +// Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From d13cd03d7adc7d7924c06b00e68dcef7d3e5cef2 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 19 Nov 2017 12:55:04 +0100 Subject: [PATCH 13/52] [5425] typo --- src/bin/dhcp4/dhcp4_lexer.cc | 3 +++ src/bin/dhcp4/dhcp4_lexer.ll | 3 +++ src/bin/dhcp6/dhcp6_lexer.cc | 3 +++ src/bin/dhcp6/dhcp6_lexer.ll | 3 +++ 4 files changed, 12 insertions(+) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index af86d72cc8..f41ae18d13 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -2706,6 +2706,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); + } } \"only\" { @@ -2714,6 +2715,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); + } } \"never\" { @@ -2723,6 +2725,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("never", driver.loc_); + } } \"subnet\" { diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 1623ca910c..2434eb3cae 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -592,6 +592,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); + } } \"only\" { @@ -600,6 +601,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); + } } \"never\" { @@ -609,6 +611,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("never", driver.loc_); + } } \"subnet\" { diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index e53e3ddb70..f3e9271645 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -2398,6 +2398,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("never", driver.loc_); + } } (?i:\"never\") { @@ -3000,6 +3001,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); + } } \"only\" { @@ -3008,6 +3010,7 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); + } } \"subnet\" { diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index d29bdb376d..4808abeb27 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -368,6 +368,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("never", driver.loc_); + } } (?i:\"never\") { @@ -832,6 +833,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); + } } \"only\" { @@ -840,6 +842,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); + } } \"subnet\" { From c25dce8b6bf557504a45d8d83752407a74152f24 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 19 Nov 2017 11:56:06 +0000 Subject: [PATCH 14/52] [trac5425] regen flex --- src/bin/dhcp4/dhcp4_lexer.cc | 1872 +++++++++++++++---------------- src/bin/dhcp6/dhcp6_lexer.cc | 2042 +++++++++++++++++----------------- 2 files changed, 1975 insertions(+), 1939 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index f41ae18d13..d4bb974362 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 158 -#define YY_END_OF_BUFFER 159 +#define YY_NUM_RULES 161 +#define YY_END_OF_BUFFER 162 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,151 +700,152 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1298] = +static const flex_int16_t yy_accept[1307] = { 0, - 151, 151, 0, 0, 0, 0, 0, 0, 0, 0, - 159, 157, 10, 11, 157, 1, 151, 148, 151, 151, - 157, 150, 149, 157, 157, 157, 157, 157, 144, 145, - 157, 157, 157, 146, 147, 5, 5, 5, 157, 157, - 157, 10, 11, 0, 0, 140, 0, 0, 0, 0, + 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, + 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, + 160, 153, 152, 160, 160, 160, 160, 160, 147, 148, + 160, 160, 160, 149, 150, 5, 5, 5, 160, 160, + 160, 10, 11, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 151, 151, 0, 150, 151, 3, 2, 6, 0, 151, + 154, 154, 0, 153, 154, 3, 2, 6, 0, 154, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, - 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, + 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, - 154, 0, 153, 152, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 121, 0, 120, 0, 0, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 159, 157, 0, 156, 155, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 124, 0, 123, - 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 158, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 155, 152, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 78, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, + 125, 0, 0, 127, 0, 0, 0, 0, 0, 0, + 0, 66, 0, 0, 0, 0, 48, 0, 0, 0, + 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 54, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 76, 25, 0, 0, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 129, 0, 126, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, + 25, 0, 0, 30, 0, 0, 0, 0, 0, 0, - 125, 0, 0, 0, 88, 0, 0, 0, 0, 0, + 0, 0, 12, 132, 0, 129, 0, 128, 0, 0, + 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, - 0, 0, 0, 7, 0, 0, 127, 0, 0, 0, + 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, + 0, 7, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, + 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, - 66, 0, 0, 0, 71, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 0, 0, 0, 0, 37, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, + 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 69, + 0, 0, 0, 74, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 105, + 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, + 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 110, 0, 0, 108, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 85, 69, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 79, 0, 20, 0, 90, - 0, 0, 0, 0, 0, 0, 114, 0, 0, 0, - 45, 0, 0, 0, 0, 0, 92, 28, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 86, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 137, 46, 61, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 111, 0, 109, - 0, 104, 103, 0, 19, 0, 0, 0, 0, 0, - 123, 0, 0, 75, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 35, 0, 0, 0, 0, 113, - 0, 0, 0, 0, 0, 57, 41, 0, 86, 0, - 0, 77, 0, 0, 0, 0, 52, 0, 132, 0, - 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 0, 0, 0, 108, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + + 0, 0, 0, 0, 113, 0, 0, 111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 88, + 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 20, 0, 93, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 0, 45, + 0, 0, 0, 0, 0, 95, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, + 46, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 40, 0, 0, 0, 0, 114, 0, 112, 0, + 107, 106, 0, 19, 0, 0, 0, 0, 0, 126, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 104, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 0, 35, 0, 0, 0, 0, 116, 0, + 0, 0, 0, 0, 60, 41, 0, 89, 0, 0, + 80, 0, 0, 0, 0, 52, 0, 135, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 139, 74, 0, 38, 102, 0, 0, 135, - 106, 0, 0, 0, 0, 0, 0, 23, 0, 22, - 0, 112, 0, 0, 0, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 138, 44, 0, 133, 128, 0, 0, 14, 0, - - 0, 119, 0, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 107, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 98, 17, 0, 116, - 0, 0, 0, 115, 0, 0, 0, 97, 0, 0, - 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 95, 100, - 42, 0, 0, 0, 94, 0, 0, 0, 0, 0, - 0, 0, 64, 0, 0, 96, 0 + 0, 142, 77, 0, 38, 105, 0, 0, 138, 109, + 0, 0, 0, 0, 0, 0, 23, 0, 22, 0, + 115, 0, 0, 0, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 94, 0, 0, 139, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, + 141, 44, 0, 136, 131, 0, 0, 14, 0, 0, + 122, 0, 0, 0, 0, 102, 0, 0, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 101, 17, 0, 119, 0, + 0, 0, 118, 0, 0, 0, 100, 0, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 120, 0, 0, 0, 0, 0, 0, 98, 103, 42, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, + + 0, 67, 0, 0, 99, 0 } ; static const YY_CHAR yy_ec[256] = @@ -891,307 +892,309 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1310] = +static const flex_int16_t yy_base[1319] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1661, 1662, 32, 1657, 141, 0, 201, 1662, 206, 88, - 11, 213, 1662, 1639, 114, 25, 2, 6, 1662, 1662, - 73, 11, 17, 1662, 1662, 1662, 104, 1645, 1600, 0, - 1637, 107, 1652, 217, 247, 1662, 1596, 185, 1595, 1601, - 93, 58, 1593, 91, 211, 195, 14, 273, 195, 1592, - 181, 275, 202, 209, 1601, 66, 188, 11, 232, 219, - 296, 282, 207, 1584, 78, 301, 302, 296, 1603, 0, - 341, 357, 365, 371, 376, 1662, 0, 1662, 301, 379, - 223, 299, 196, 309, 322, 210, 1662, 1600, 1639, 1662, + 1669, 1670, 32, 1665, 141, 0, 201, 1670, 206, 88, + 11, 213, 1670, 1647, 114, 25, 2, 6, 1670, 1670, + 73, 11, 17, 1670, 1670, 1670, 104, 1653, 1608, 0, + 1645, 107, 1660, 217, 247, 1670, 1604, 185, 1603, 1609, + 93, 58, 1601, 91, 211, 195, 14, 273, 195, 1600, + 181, 275, 202, 209, 1609, 66, 188, 11, 232, 219, + 296, 284, 207, 1592, 78, 287, 324, 305, 1611, 0, + 339, 359, 367, 374, 379, 1670, 0, 1670, 301, 344, + 223, 295, 196, 336, 348, 210, 1670, 1608, 1647, 1670, - 283, 1662, 391, 1628, 295, 1586, 1596, 333, 344, 1591, - 341, 352, 362, 368, 374, 1634, 0, 442, 365, 1578, - 1580, 1576, 1584, 74, 1580, 1569, 1570, 89, 1586, 1569, - 1578, 1578, 363, 1569, 364, 1570, 355, 1615, 1619, 1561, - 1612, 1554, 1563, 1576, 1573, 1573, 1567, 351, 1560, 1553, - 1558, 1552, 378, 1563, 1548, 1547, 1561, 306, 1547, 372, - 1563, 357, 438, 1550, 364, 1561, 1558, 1559, 1557, 1539, - 1541, 376, 1533, 1550, 1542, 0, 407, 415, 412, 412, - 418, 413, 1541, 1662, 0, 1584, 418, 1531, 1534, 416, - 423, 1542, 446, 1585, 450, 1584, 442, 1583, 1662, 487, + 322, 1670, 392, 1636, 330, 1594, 1604, 351, 366, 1599, + 363, 370, 372, 379, 241, 1642, 0, 443, 376, 1586, + 1588, 1584, 1592, 74, 1588, 1577, 1578, 89, 1594, 1577, + 1586, 1586, 366, 1577, 353, 1578, 358, 1623, 1627, 1569, + 1620, 1562, 1571, 1584, 1581, 1581, 1575, 352, 1568, 1561, + 1566, 1560, 381, 1571, 1564, 1555, 1554, 1568, 364, 1554, + 382, 1570, 266, 439, 1557, 413, 1568, 1565, 1566, 1564, + 1546, 1548, 402, 1540, 1557, 1549, 0, 389, 380, 331, + 398, 392, 414, 1548, 1670, 0, 1591, 431, 1538, 1541, + 411, 424, 1549, 438, 1592, 447, 1591, 446, 1590, 1670, - 1582, 460, 1543, 1523, 1539, 1536, 1535, 422, 1576, 1570, - 1536, 1515, 1523, 1518, 1532, 1528, 1516, 1528, 1528, 1519, - 1503, 1507, 1520, 1520, 1512, 1502, 1520, 1662, 1515, 1518, - 1499, 1494, 1497, 1547, 1496, 1506, 1509, 465, 1505, 1493, - 1504, 1540, 1487, 1543, 1496, 481, 1486, 1502, 1483, 1482, - 1488, 1479, 1478, 1485, 1487, 1532, 1490, 1489, 1483, 274, - 1490, 1485, 1477, 1483, 1482, 1482, 1463, 1479, 1465, 1471, - 1478, 1466, 1459, 1473, 1514, 1475, 485, 1466, 480, 1662, - 1662, 481, 1662, 1662, 1453, 0, 455, 198, 1455, 499, - 491, 1509, 1462, 486, 1662, 1507, 1662, 1501, 534, 1662, + 490, 1589, 456, 1550, 1530, 1546, 1543, 1542, 436, 1583, + 1577, 1543, 1522, 1530, 1525, 1539, 1535, 1523, 1535, 1535, + 1526, 1510, 1514, 1527, 1527, 1519, 1509, 1527, 1670, 1522, + 1525, 1506, 1501, 1504, 1554, 1503, 1513, 1516, 460, 1512, + 1500, 1511, 1547, 454, 1494, 1550, 1487, 1502, 486, 1492, + 1508, 1489, 1488, 1494, 1485, 1484, 1491, 1493, 1538, 1496, + 1495, 1489, 311, 1496, 1491, 1483, 1489, 1488, 1488, 1469, + 1485, 1471, 1477, 1484, 1472, 1465, 1479, 1520, 1481, 419, + 1472, 482, 1670, 1670, 484, 1670, 1670, 1459, 0, 456, + 478, 1461, 504, 485, 1515, 1468, 488, 1670, 1513, 1670, - 483, 1443, 1499, 1445, 1451, 1501, 1458, 398, 1662, 1456, - 1498, 1453, 1450, 509, 1456, 1494, 1488, 1443, 1438, 1435, - 1484, 1443, 1432, 1481, 1429, 531, 1443, 1428, 1441, 1428, - 1429, 1437, 1432, 1439, 1434, 1430, 483, 1428, 1431, 1426, - 1422, 1470, 503, 1464, 1662, 1416, 1415, 1414, 1407, 1409, - 1413, 1402, 1415, 512, 1460, 1415, 1412, 1416, 1662, 1414, - 1403, 1403, 1415, 1397, 1389, 1390, 1411, 1393, 1442, 1404, - 1403, 1389, 1401, 1400, 1399, 1398, 1439, 1438, 1662, 1382, - 1381, 555, 1394, 1662, 1662, 1393, 0, 1382, 1374, 491, - 1379, 1430, 1429, 1387, 1427, 1662, 1375, 1425, 1662, 533, + 1507, 536, 1670, 485, 1449, 1505, 1451, 1457, 1507, 1464, + 479, 1670, 1462, 1504, 1459, 1456, 532, 1462, 1500, 1494, + 1449, 1444, 1441, 1490, 1449, 1438, 1487, 1435, 557, 1449, + 1434, 1447, 1434, 1435, 1443, 1438, 1445, 1440, 1436, 466, + 1434, 1437, 1432, 1428, 1476, 495, 508, 1470, 1670, 1474, + 1421, 1420, 1419, 1412, 1414, 1418, 1407, 1420, 536, 1465, + 1420, 1417, 1421, 1670, 1419, 1408, 1408, 1420, 1402, 1394, + 1395, 1416, 1398, 1447, 1409, 1408, 1394, 1406, 1405, 1404, + 1403, 1444, 1443, 1670, 1387, 1386, 559, 1399, 1670, 1670, + 1398, 0, 1387, 1379, 514, 1384, 1435, 1434, 1392, 1432, - 580, 507, 1424, 1380, 1376, 1364, 1662, 1380, 1379, 1366, - 1365, 1662, 1367, 1364, 523, 1362, 1364, 1662, 1372, 1369, - 1354, 1367, 1362, 561, 1369, 1351, 1400, 1662, 1349, 1365, - 1397, 1360, 1357, 1358, 1360, 1392, 1391, 1344, 1339, 1338, - 1387, 1333, 1348, 1326, 1333, 1338, 1386, 1662, 1333, 1329, - 1327, 1331, 1338, 1322, 1322, 1332, 1335, 1324, 1319, 1662, - 1374, 1662, 1318, 1329, 1366, 1313, 1318, 1327, 1321, 1325, - 1365, 1359, 1323, 1303, 1323, 1305, 1304, 1312, 1316, 1299, - 1355, 1297, 1662, 1662, 1302, 1300, 1662, 1311, 1345, 1307, - 0, 1291, 1308, 1346, 1296, 1662, 1662, 1293, 1662, 1299, + 1670, 1380, 1430, 1670, 534, 606, 533, 1429, 1385, 1381, + 1369, 1670, 1385, 1384, 1371, 1370, 1670, 1372, 1369, 509, + 1367, 1369, 1670, 1377, 1374, 1359, 1372, 1367, 566, 1374, + 1356, 1405, 1670, 1354, 1370, 1402, 1365, 1362, 1363, 1365, + 1397, 1396, 1349, 1344, 1343, 1392, 1338, 1353, 1331, 1338, + 1343, 1391, 1670, 1338, 1334, 1388, 1331, 1670, 1335, 1342, + 1326, 1326, 1336, 1339, 1328, 1323, 1670, 1378, 1670, 1322, + 1333, 1370, 1317, 1322, 1331, 1325, 1329, 1369, 1363, 1327, + 1307, 1327, 1309, 1308, 1316, 1320, 1303, 1359, 1301, 1670, + 1670, 1306, 1304, 1670, 1315, 1349, 1311, 0, 1295, 1312, - 1662, 533, 512, 565, 1662, 1296, 1284, 1335, 1282, 1281, - 1288, 1281, 1293, 1292, 1292, 1280, 1321, 1288, 1280, 1323, - 1269, 1285, 1284, 1662, 1269, 1266, 1280, 1272, 1278, 1269, - 1277, 1262, 1278, 1260, 1274, 1273, 1271, 1254, 1248, 1253, - 1268, 1265, 1266, 1263, 1304, 1261, 1662, 1247, 1249, 1258, - 1294, 1293, 1246, 532, 1255, 1238, 1239, 1236, 1662, 1250, - 1229, 1250, 1247, 1239, 1282, 1236, 1280, 1662, 1227, 1241, - 1244, 1225, 1275, 1274, 1221, 1272, 1271, 1662, 1266, 1232, - 1215, 1220, 1222, 1662, 1228, 1218, 1662, 1263, 1211, 1266, - 549, 529, 535, 1216, 1259, 561, 1258, 1257, 1256, 1210, + 1350, 1300, 1670, 1670, 1297, 1670, 1303, 1670, 542, 541, + 581, 1670, 1300, 1288, 1339, 1286, 1285, 1292, 1285, 1297, + 1296, 1296, 1284, 1325, 1292, 1284, 1327, 1273, 1289, 1288, + 1670, 1273, 1270, 1284, 1276, 1282, 1273, 1281, 1266, 1282, + 1264, 1278, 1277, 1275, 1258, 1252, 1257, 1272, 1269, 1270, + 1267, 1308, 1265, 1670, 1251, 1253, 1670, 1262, 1298, 1297, + 1250, 569, 1259, 1242, 1243, 1240, 1670, 1254, 1233, 1254, + 1251, 1243, 1286, 1240, 1284, 1670, 1231, 1245, 1248, 1229, + 1279, 1278, 1225, 1276, 1275, 1670, 14, 1237, 1220, 1225, + 1227, 1670, 1233, 1223, 1670, 1268, 1216, 1271, 543, 561, - 1200, 1253, 1206, 1216, 1250, 1213, 1207, 1194, 1202, 1245, - 1249, 1206, 1205, 1206, 1199, 1188, 1201, 1204, 1199, 1200, - 1197, 1196, 1188, 1198, 1193, 1234, 1233, 1183, 1173, 1181, - 1229, 1662, 1228, 1177, 1169, 1170, 1183, 1170, 1181, 1662, - 1169, 1178, 1177, 1177, 1217, 1160, 1169, 1162, 1173, 1150, - 1154, 1205, 1152, 1162, 1202, 1149, 1200, 556, 558, 1142, - 1152, 557, 1202, 1160, 1143, 1148, 1152, 1142, 1154, 1157, - 1194, 1662, 1188, 577, 1141, 1149, 1148, 1143, 1139, 1146, - 1129, 1132, 1128, 1145, 1140, 1128, 1124, 1131, 1125, 1177, - 1134, 1122, 1136, 1124, 1662, 1132, 1130, 1121, 1130, 1126, + 527, 1221, 1264, 542, 1263, 1262, 1261, 1215, 1205, 1258, + 1211, 1221, 1255, 1218, 1212, 1199, 1207, 1250, 1254, 1211, + 1210, 1211, 1204, 1193, 1206, 1209, 1204, 1205, 1202, 1201, + 1193, 1203, 1198, 1239, 1238, 1188, 1178, 1186, 1234, 1670, + 1233, 1182, 1174, 1175, 1188, 1175, 1186, 1670, 1174, 1183, + 1182, 1182, 1222, 1165, 1174, 1167, 1178, 1155, 1159, 1210, + 1157, 1167, 1207, 1154, 1205, 538, 552, 1147, 1157, 542, + 1670, 1207, 1165, 1148, 1153, 1157, 1147, 1159, 1162, 1199, + 1670, 1193, 562, 1146, 1154, 1153, 1148, 1144, 1151, 1134, + 1137, 1133, 1150, 1145, 1133, 1129, 1136, 1130, 1182, 1139, - 1167, 1109, 1109, 1122, 1107, 1162, 1115, 1103, 1104, 1662, - 1662, 1112, 1115, 94, 1662, 1662, 244, 393, 412, 574, - 463, 557, 527, 578, 537, 593, 1662, 540, 559, 563, - 558, 617, 578, 568, 564, 577, 588, 583, 584, 578, - 580, 582, 582, 584, 637, 596, 601, 578, 1662, 636, - 596, 586, 601, 602, 589, 603, 1662, 622, 630, 610, - 600, 647, 612, 616, 655, 610, 605, 606, 602, 611, - 606, 662, 621, 612, 1662, 614, 625, 610, 626, 620, - 665, 633, 618, 619, 1662, 638, 621, 678, 623, 1662, - 638, 643, 623, 642, 680, 640, 630, 648, 647, 633, + 1127, 1141, 1129, 1670, 1137, 1135, 1126, 1135, 1131, 1172, + 1114, 1114, 1127, 1112, 1167, 1120, 1108, 77, 1670, 1670, + 185, 240, 276, 1670, 1670, 317, 424, 464, 569, 497, + 590, 548, 597, 549, 609, 1670, 556, 561, 567, 562, + 620, 581, 571, 567, 580, 591, 586, 587, 581, 583, + 584, 584, 586, 639, 598, 603, 580, 1670, 638, 604, + 594, 609, 610, 597, 611, 1670, 630, 638, 618, 608, + 655, 620, 624, 663, 618, 613, 614, 610, 619, 614, + 670, 629, 620, 1670, 622, 633, 618, 634, 628, 673, + 641, 626, 627, 1670, 646, 629, 686, 631, 1670, 646, - 648, 640, 647, 637, 655, 640, 1662, 648, 654, 649, - 700, 1662, 651, 656, 650, 662, 656, 655, 657, 709, - 655, 655, 712, 658, 1662, 657, 665, 663, 662, 667, - 677, 678, 683, 722, 681, 697, 702, 676, 686, 677, - 729, 674, 1662, 681, 686, 693, 735, 736, 685, 1662, - 681, 684, 683, 703, 700, 705, 706, 692, 700, 709, - 689, 710, 750, 1662, 705, 754, 755, 705, 718, 720, - 709, 705, 712, 763, 712, 710, 728, 767, 719, 718, - 724, 722, 720, 773, 774, 770, 730, 1662, 735, 728, - 737, 725, 735, 731, 744, 1662, 727, 728, 1662, 729, + 651, 631, 650, 688, 648, 638, 656, 655, 641, 656, + 648, 655, 645, 663, 648, 1670, 656, 662, 657, 708, + 1670, 659, 664, 658, 670, 664, 663, 665, 717, 663, + 663, 720, 666, 1670, 665, 673, 671, 670, 675, 685, + 686, 691, 730, 689, 705, 710, 684, 694, 685, 737, + 682, 1670, 689, 694, 701, 743, 744, 693, 1670, 689, + 692, 691, 711, 708, 713, 714, 700, 708, 717, 697, + 718, 758, 1670, 713, 762, 763, 713, 726, 728, 717, + 713, 720, 771, 720, 718, 736, 775, 727, 726, 732, + 730, 728, 781, 782, 778, 738, 1670, 743, 736, 745, - 727, 746, 747, 748, 747, 731, 736, 754, 1662, 744, - 777, 768, 740, 799, 762, 1662, 745, 760, 752, 756, - 1662, 1662, 766, 801, 750, 803, 752, 810, 755, 766, - 758, 764, 760, 778, 779, 1662, 777, 1662, 780, 1662, - 764, 784, 774, 767, 780, 822, 1662, 779, 829, 830, - 1662, 831, 775, 781, 788, 830, 1662, 1662, 780, 780, - 783, 797, 784, 841, 800, 838, 792, 845, 795, 847, - 796, 849, 850, 811, 852, 796, 808, 813, 799, 829, - 858, 818, 1662, 810, 861, 810, 806, 822, 827, 809, - 867, 822, 827, 1662, 828, 821, 830, 831, 828, 818, + 733, 743, 739, 752, 1670, 735, 736, 1670, 737, 735, + 754, 755, 756, 755, 739, 744, 762, 1670, 752, 785, + 776, 748, 807, 770, 1670, 753, 768, 760, 764, 1670, + 1670, 774, 809, 758, 811, 760, 818, 763, 774, 766, + 772, 768, 786, 787, 1670, 785, 1670, 788, 1670, 772, + 792, 782, 775, 788, 830, 1670, 787, 837, 838, 1670, + 839, 783, 789, 796, 838, 1670, 1670, 788, 788, 791, + 805, 792, 849, 808, 846, 800, 853, 803, 855, 804, + 857, 858, 819, 860, 804, 816, 821, 807, 837, 866, + 826, 1670, 818, 869, 818, 814, 830, 835, 817, 875, - 820, 877, 826, 823, 824, 881, 877, 820, 835, 886, - 1662, 1662, 1662, 845, 837, 847, 832, 833, 893, 895, - 841, 897, 1662, 847, 849, 900, 843, 1662, 864, 1662, - 849, 1662, 1662, 856, 1662, 906, 857, 908, 909, 891, - 1662, 869, 870, 1662, 858, 857, 860, 860, 861, 857, - 1662, 879, 865, 866, 881, 881, 884, 884, 881, 886, - 1662, 878, 930, 889, 1662, 886, 892, 893, 890, 1662, - 882, 882, 888, 887, 898, 1662, 1662, 937, 1662, 886, - 892, 1662, 894, 896, 899, 910, 1662, 907, 1662, 904, - 1662, 927, 947, 953, 954, 898, 956, 957, 912, 906, + 830, 835, 1670, 836, 829, 838, 839, 836, 826, 828, + 885, 834, 831, 832, 889, 885, 828, 843, 894, 1670, + 1670, 1670, 853, 845, 855, 840, 841, 901, 903, 849, + 905, 1670, 855, 857, 908, 851, 1670, 872, 1670, 857, + 1670, 1670, 864, 1670, 914, 865, 916, 917, 899, 1670, + 877, 878, 1670, 866, 865, 868, 868, 869, 865, 1670, + 887, 873, 874, 889, 889, 892, 892, 889, 894, 1670, + 886, 938, 897, 1670, 894, 900, 901, 898, 1670, 890, + 890, 896, 895, 906, 1670, 1670, 945, 1670, 894, 900, + 1670, 902, 904, 907, 918, 1670, 915, 1670, 912, 1670, - 960, 961, 957, 922, 918, 960, 910, 915, 968, 926, - 1662, 970, 930, 972, 935, 924, 932, 976, 920, 938, - 937, 921, 977, 942, 943, 943, 930, 941, 988, 948, - 961, 948, 1662, 1662, 992, 1662, 1662, 941, 952, 1662, - 1662, 942, 991, 936, 941, 999, 949, 1662, 955, 1662, - 1002, 1662, 947, 962, 967, 1662, 1001, 969, 962, 971, - 959, 969, 1012, 1013, 1014, 965, 1662, 1016, 1017, 965, - 1662, 969, 1021, 967, 966, 1024, 979, 1662, 1021, 983, - 1662, 986, 1029, 990, 973, 975, 972, 988, 997, 1036, - 1662, 1662, 1662, 1032, 1662, 1662, 997, 1034, 1662, 988, + 935, 955, 961, 962, 906, 964, 965, 920, 914, 968, + 969, 965, 930, 926, 968, 918, 923, 976, 934, 1670, + 978, 938, 980, 943, 932, 940, 984, 928, 946, 945, + 929, 985, 950, 951, 951, 938, 949, 996, 956, 969, + 956, 1670, 1670, 1000, 1670, 1670, 949, 960, 1670, 1670, + 950, 999, 944, 949, 1007, 957, 1670, 963, 1670, 1010, + 1670, 955, 970, 975, 1670, 1009, 977, 970, 979, 967, + 977, 1020, 1021, 1022, 973, 1670, 1024, 1025, 973, 1670, + 977, 1029, 975, 974, 1032, 987, 1670, 1029, 991, 1670, + 994, 1037, 998, 981, 983, 980, 996, 1005, 1044, 1670, - 995, 1662, 992, 997, 1044, 989, 1662, 1004, 994, 1006, - 1049, 993, 1001, 1662, 1012, 1002, 1001, 1015, 1006, 1015, - 1017, 1662, 1059, 1060, 1020, 1062, 1662, 1058, 1022, 1003, - 1066, 1025, 1026, 1027, 1070, 1029, 1662, 1662, 1034, 1662, - 1016, 1074, 1035, 1662, 1021, 1021, 1023, 1662, 1028, 1023, - 1035, 1662, 1033, 1037, 1028, 1080, 1029, 1045, 1038, 1047, - 1038, 1045, 1032, 1047, 1094, 1053, 1040, 1056, 1047, 1061, - 1057, 1662, 1101, 1102, 1103, 1060, 1059, 1060, 1662, 1662, - 1662, 1107, 1051, 1067, 1662, 1105, 1056, 1055, 1057, 1068, - 1115, 1066, 1662, 1075, 1118, 1662, 1662, 1124, 1129, 1134, + 1670, 1670, 1040, 1670, 1670, 1005, 1042, 1670, 996, 1003, + 1670, 1000, 1005, 1052, 997, 1670, 1012, 1002, 1014, 1057, + 1001, 1009, 1670, 1020, 1010, 1009, 1023, 1014, 1023, 1025, + 1670, 1067, 1068, 1028, 1070, 1670, 1066, 1030, 1011, 1074, + 1033, 1034, 1035, 1078, 1037, 1670, 1670, 1042, 1670, 1024, + 1082, 1043, 1670, 1029, 1029, 1031, 1670, 1036, 1031, 1043, + 1670, 1041, 1045, 1036, 1088, 1037, 1053, 1046, 1055, 1046, + 1053, 1040, 1055, 1102, 1061, 1048, 1064, 1055, 1069, 1065, + 1670, 1109, 1110, 1111, 1068, 1067, 1068, 1670, 1670, 1670, + 1115, 1059, 1075, 1670, 1113, 1064, 1063, 1065, 1076, 1123, - 1139, 1144, 1149, 1154, 1157, 1131, 1136, 1138, 1151 + 1074, 1670, 1083, 1126, 1670, 1670, 1132, 1137, 1142, 1147, + 1152, 1157, 1162, 1165, 1139, 1144, 1146, 1159 } ; -static const flex_int16_t yy_def[1310] = +static const flex_int16_t yy_def[1319] = { 0, - 1298, 1298, 1299, 1299, 1298, 1298, 1298, 1298, 1298, 1298, - 1297, 1297, 1297, 1297, 1297, 1300, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, - 1297, 1297, 1297, 1302, 15, 1297, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1303, 45, 45, + 1307, 1307, 1308, 1308, 1307, 1307, 1307, 1307, 1307, 1307, + 1306, 1306, 1306, 1306, 1306, 1309, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1310, + 1306, 1306, 1306, 1311, 15, 1306, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1312, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1300, - 1297, 1297, 1297, 1297, 1297, 1297, 1304, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, 1297, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1309, + 1306, 1306, 1306, 1306, 1306, 1306, 1313, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1310, 1306, - 1302, 1297, 1297, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1305, 45, 1303, 45, 45, + 1311, 1306, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1314, 45, 1312, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1304, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1306, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1305, 1297, 1303, + 45, 45, 45, 45, 45, 45, 1313, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1315, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1314, 1306, + 1312, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1307, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 1297, 45, 1303, 1297, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1316, 45, + 45, 45, 45, 45, 45, 45, 45, 1306, 45, 1306, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 1312, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, - 45, 45, 45, 1297, 1297, 1297, 1308, 45, 45, 45, - 45, 45, 45, 45, 45, 1297, 45, 45, 1297, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 1306, + 1306, 1317, 45, 45, 45, 45, 45, 45, 45, 45, - 1303, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 1297, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 1306, 45, 45, 1306, 45, 1312, 45, 45, 45, 45, + 45, 1306, 45, 45, 45, 45, 1306, 45, 45, 45, + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1297, - 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1306, 45, 45, 45, 45, 1306, 45, 45, + 45, 45, 45, 45, 45, 45, 1306, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1297, 1297, 45, 45, 1297, 45, 45, 1297, - 1309, 45, 45, 45, 45, 1297, 1297, 45, 1297, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, + 1306, 45, 45, 1306, 45, 45, 1306, 1318, 45, 45, - 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + 45, 45, 1306, 1306, 45, 1306, 45, 1306, 45, 45, + 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, - 45, 45, 45, 1297, 45, 45, 1297, 45, 45, 45, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1306, 45, 45, 1306, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 45, 1306, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 45, 45, 1297, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, + 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1297, - 1297, 45, 45, 45, 1297, 1297, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 45, 45, 45, 1297, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1297, 45, 45, 45, 45, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1306, 1306, + 45, 45, 45, 1306, 1306, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1297, 45, 45, 45, 45, 45, 45, 1297, + 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, - 45, 45, 45, 45, 45, 1297, 45, 45, 1297, 45, - - 45, 45, 45, 45, 45, 45, 45, 45, 1297, 45, - 45, 45, 45, 45, 45, 1297, 45, 45, 45, 45, - 1297, 1297, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1297, 45, 1297, 45, 1297, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 1297, 45, 45, 45, 45, 45, 1297, 1297, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1297, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1297, 1297, 1297, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1297, 45, 45, 45, 45, 1297, 45, 1297, - 45, 1297, 1297, 45, 1297, 45, 45, 45, 45, 45, - 1297, 45, 45, 1297, 45, 45, 45, 45, 45, 45, - 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 1297, - 45, 45, 45, 45, 45, 1297, 1297, 45, 1297, 45, - 45, 1297, 45, 45, 45, 45, 1297, 45, 1297, 45, - 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1306, 45, 45, 45, 45, 45, 45, 1306, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, + + 45, 45, 45, 45, 1306, 45, 45, 1306, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, + 45, 45, 45, 45, 1306, 45, 45, 45, 45, 1306, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1306, 45, 1306, 45, 1306, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 1306, + 45, 45, 45, 45, 45, 1306, 1306, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, + 1306, 1306, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1306, 45, 45, 45, 45, 1306, 45, 1306, 45, + 1306, 1306, 45, 1306, 45, 45, 45, 45, 45, 1306, + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 1306, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, + 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 45, + 45, 45, 45, 45, 1306, 1306, 45, 1306, 45, 45, + 1306, 45, 45, 45, 45, 1306, 45, 1306, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1297, 1297, 45, 1297, 1297, 45, 45, 1297, - 1297, 45, 45, 45, 45, 45, 45, 1297, 45, 1297, - 45, 1297, 45, 45, 45, 1297, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1297, 45, 45, 45, - 1297, 45, 45, 45, 45, 45, 45, 1297, 45, 45, - 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1297, 1297, 1297, 45, 1297, 1297, 45, 45, 1297, 45, - - 45, 1297, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 45, 45, 1297, 45, 45, 45, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 1297, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1297, 1297, 45, 1297, - 45, 45, 45, 1297, 45, 45, 45, 1297, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1297, 45, 45, 45, 45, 45, 45, 1297, 1297, - 1297, 45, 45, 45, 1297, 45, 45, 45, 45, 45, - 45, 45, 1297, 45, 45, 1297, 0, 1297, 1297, 1297, + 45, 1306, 1306, 45, 1306, 1306, 45, 45, 1306, 1306, + 45, 45, 45, 45, 45, 45, 1306, 45, 1306, 45, + 1306, 45, 45, 45, 1306, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 45, 45, 45, 1306, + 45, 45, 45, 45, 45, 45, 1306, 45, 45, 1306, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297 + 1306, 1306, 45, 1306, 1306, 45, 45, 1306, 45, 45, + 1306, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, + 1306, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1306, 1306, 45, 1306, 45, + 45, 45, 1306, 45, 45, 45, 1306, 45, 45, 45, + 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1306, 45, 45, 45, 45, 45, 45, 1306, 1306, 1306, + 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, + + 45, 1306, 45, 45, 1306, 0, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306 } ; -static const flex_int16_t yy_nxt[1734] = +static const flex_int16_t yy_nxt[1742] = { 0, - 1297, 13, 14, 13, 1297, 15, 16, 1297, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 86, 1297, - 37, 14, 37, 87, 25, 26, 38, 1297, 1297, 27, + 1306, 13, 14, 13, 1306, 15, 16, 1306, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 86, 671, + 37, 14, 37, 87, 25, 26, 38, 1306, 672, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, 13, 14, 13, 13, 14, 13, 32, 40, 142, 13, @@ -1202,8 +1205,8 @@ static const flex_int16_t yy_nxt[1734] = 39, 85, 85, 85, 28, 42, 41, 42, 42, 29, 42, 30, 83, 108, 41, 111, 94, 25, 31, 109, - 207, 162, 89, 137, 89, 163, 32, 90, 90, 90, - 208, 138, 33, 212, 213, 83, 108, 796, 111, 34, + 208, 163, 89, 137, 89, 164, 32, 90, 90, 90, + 209, 138, 33, 213, 214, 83, 108, 802, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 45, 45, 45, 45, 48, 45, 49, 50, 45, 51, 45, 52, 53, @@ -1214,179 +1217,180 @@ static const flex_int16_t yy_nxt[1734] = 74, 75, 76, 77, 78, 79, 57, 45, 45, 45, 45, 45, 81, 105, 82, 82, 82, 81, 114, 84, 84, 84, 102, 105, 81, 83, 84, 84, 84, 108, - 83, 179, 122, 112, 139, 123, 390, 83, 124, 105, - 125, 114, 126, 113, 140, 179, 141, 132, 83, 119, - 158, 177, 108, 83, 159, 120, 112, 103, 133, 179, - 83, 45, 148, 135, 160, 390, 149, 45, 134, 45, - 45, 113, 45, 182, 45, 45, 45, 177, 117, 144, - 145, 45, 45, 146, 45, 45, 150, 797, 102, 147, + 83, 180, 122, 112, 139, 123, 803, 83, 124, 105, + 125, 114, 126, 113, 140, 180, 141, 132, 83, 119, + 159, 178, 108, 83, 160, 120, 112, 103, 133, 180, + 83, 45, 148, 135, 161, 198, 149, 45, 134, 45, + 45, 113, 45, 183, 45, 45, 45, 178, 117, 144, + 145, 45, 45, 146, 45, 45, 150, 804, 198, 147, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 90, 90, 90, 45, 127, 114, - 111, 45, 128, 103, 112, 129, 130, 178, 363, 45, - 154, 364, 187, 45, 113, 45, 118, 177, 131, 151, - 155, 152, 172, 153, 164, 156, 157, 112, 165, 170, - 178, 166, 173, 178, 85, 85, 85, 174, 167, 168, - 187, 190, 113, 180, 169, 83, 248, 249, 81, 171, - 82, 82, 82, 89, 191, 89, 181, 193, 90, 90, - 90, 83, 81, 194, 84, 84, 84, 190, 83, 85, - 85, 85, 90, 90, 90, 83, 101, 195, 197, 196, + 45, 45, 45, 45, 90, 90, 90, 45, 127, 805, + 111, 45, 128, 179, 258, 129, 130, 102, 114, 45, + 165, 259, 154, 45, 166, 45, 118, 167, 131, 151, + 155, 152, 156, 153, 168, 169, 112, 157, 158, 179, + 170, 173, 85, 85, 85, 284, 113, 90, 90, 90, + 806, 174, 103, 83, 178, 368, 175, 188, 369, 112, + 81, 171, 82, 82, 82, 89, 179, 89, 284, 191, + 90, 90, 90, 83, 113, 81, 83, 84, 84, 84, + 181, 172, 85, 85, 85, 188, 192, 101, 83, 194, - 83, 191, 187, 101, 83, 193, 218, 196, 219, 224, - 194, 221, 225, 237, 193, 255, 226, 238, 83, 201, - 266, 197, 256, 83, 267, 195, 196, 222, 268, 251, - 202, 101, 252, 253, 275, 101, 281, 281, 288, 101, - 279, 409, 193, 280, 243, 279, 280, 101, 257, 291, - 798, 101, 292, 101, 185, 200, 200, 200, 410, 281, - 284, 288, 200, 200, 200, 200, 200, 200, 279, 280, - 294, 298, 283, 282, 296, 337, 799, 291, 307, 292, - 288, 258, 259, 260, 308, 200, 200, 200, 200, 200, - 200, 347, 261, 294, 262, 381, 263, 296, 298, 264, + 222, 195, 182, 83, 101, 191, 83, 196, 283, 219, + 197, 220, 225, 188, 238, 226, 223, 194, 239, 227, + 283, 83, 282, 192, 251, 252, 83, 194, 195, 386, + 202, 282, 101, 197, 283, 196, 101, 197, 284, 254, + 101, 203, 255, 256, 294, 244, 286, 245, 101, 260, + 282, 291, 101, 295, 101, 186, 201, 201, 201, 285, + 278, 287, 297, 201, 201, 201, 201, 201, 201, 269, + 340, 299, 294, 270, 291, 301, 291, 271, 297, 387, + 295, 807, 261, 262, 263, 297, 201, 201, 201, 201, + 201, 201, 310, 264, 299, 265, 352, 266, 311, 304, - 299, 299, 299, 301, 384, 384, 388, 299, 299, 299, - 299, 299, 299, 392, 393, 395, 389, 460, 398, 415, - 802, 390, 394, 416, 494, 348, 338, 384, 385, 339, - 299, 299, 299, 299, 299, 299, 428, 640, 395, 349, - 494, 429, 442, 443, 592, 382, 398, 401, 401, 401, - 402, 449, 494, 674, 401, 401, 401, 401, 401, 401, - 487, 450, 502, 591, 503, 488, 524, 803, 504, 515, - 587, 525, 592, 461, 641, 593, 674, 401, 401, 401, - 401, 401, 401, 673, 516, 804, 675, 430, 805, 502, - 591, 503, 431, 45, 45, 45, 676, 806, 807, 808, + 267, 347, 301, 302, 302, 302, 389, 393, 389, 400, + 302, 302, 302, 302, 302, 302, 395, 394, 397, 398, + 403, 341, 414, 395, 342, 447, 448, 399, 808, 389, + 353, 390, 400, 302, 302, 302, 302, 302, 302, 415, + 403, 467, 420, 454, 354, 395, 421, 501, 403, 406, + 406, 406, 407, 455, 811, 522, 406, 406, 406, 406, + 406, 406, 433, 509, 494, 510, 501, 434, 456, 495, + 523, 531, 599, 600, 648, 501, 532, 682, 684, 406, + 406, 406, 406, 406, 406, 683, 595, 688, 685, 749, + 509, 601, 510, 689, 511, 768, 750, 468, 756, 599, - 45, 45, 45, 45, 45, 45, 679, 740, 742, 743, - 759, 673, 680, 747, 741, 809, 744, 800, 810, 748, - 811, 801, 812, 45, 45, 45, 45, 45, 45, 813, - 814, 815, 816, 817, 818, 819, 820, 821, 759, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, - 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 837, 860, 861, - 836, 862, 863, 864, 867, 868, 869, 870, 865, 871, - 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, + 812, 600, 751, 752, 757, 682, 813, 814, 683, 815, + 753, 649, 809, 435, 816, 817, 810, 818, 436, 45, + 45, 45, 819, 768, 820, 821, 45, 45, 45, 45, + 45, 45, 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 45, + 45, 45, 45, 45, 45, 839, 840, 841, 842, 843, + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 868, 846, 869, 870, 845, 871, + 872, 873, 876, 877, 878, 879, 874, 880, 881, 882, - 882, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 893, 883, 894, 895, 896, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, - 913, 912, 914, 915, 916, 917, 918, 919, 920, 866, - 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 936, 937, 911, 912, 938, - 940, 941, 942, 943, 939, 944, 945, 946, 947, 948, - 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, - 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 883, 884, 885, 886, 887, 888, 889, 890, 891, 893, + 894, 895, 896, 897, 898, 899, 900, 901, 902, 892, + 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, + 913, 914, 915, 916, 917, 918, 919, 920, 922, 921, + 923, 924, 925, 926, 927, 928, 929, 875, 930, 931, + 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, + 942, 943, 944, 945, 946, 920, 921, 947, 949, 950, + 951, 952, 948, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 980, 1003, 1004, 1005, 1006, 1007, - 981, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, - 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, - 1040, 1070, 1071, 1072, 1073, 1074, 1075, 1069, 1076, 1026, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 989, 1012, 1013, 1014, 1015, 1016, 990, 1017, + 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1036, 1037, 1038, + 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1049, 1079, - 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1045, 1085, - 1086, 1087, 1088, 1089, 1091, 1092, 1093, 1094, 1090, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1092, 1114, - 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, - 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, - 1155, 1156, 1157, 1131, 1158, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1080, 1081, 1082, 1083, 1084, 1078, 1085, 1035, 1086, 1087, + 1088, 1089, 1090, 1091, 1092, 1093, 1054, 1094, 1095, 1096, + 1097, 1098, 1100, 1101, 1102, 1103, 1099, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1120, 1121, 1122, 1101, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, + 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, + 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, - 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, - 1194, 1195, 1196, 1169, 1197, 1198, 1199, 1200, 1201, 1202, - 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, - 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, - 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, - 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, - 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, + 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, + 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, + 1205, 1178, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, + 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, + 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, - 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, - 1293, 1294, 1295, 1296, 12, 12, 12, 12, 12, 36, - 36, 36, 36, 36, 80, 286, 80, 80, 80, 99, - 387, 99, 491, 99, 101, 101, 101, 101, 101, 116, - 116, 116, 116, 116, 176, 101, 176, 176, 176, 198, - 198, 198, 795, 794, 793, 792, 791, 790, 789, 788, - 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, - 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, - 767, 766, 765, 764, 763, 762, 761, 760, 758, 757, + 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, + 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, + 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, + 1304, 1305, 12, 12, 12, 12, 12, 36, 36, 36, + 36, 36, 80, 289, 80, 80, 80, 99, 392, 99, + 498, 99, 101, 101, 101, 101, 101, 116, 116, 116, + 116, 116, 177, 101, 177, 177, 177, 199, 199, 199, + 801, 800, 799, 798, 797, 796, 795, 794, 793, 792, + 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, + 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, - 756, 755, 754, 753, 752, 751, 750, 749, 746, 745, - 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, - 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, - 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, - 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, - 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, - 689, 688, 687, 686, 685, 684, 683, 682, 681, 678, - 677, 672, 671, 670, 669, 668, 667, 666, 665, 664, - 663, 662, 661, 660, 659, 658, 657, 656, 655, 654, - 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, + 771, 770, 769, 767, 766, 765, 764, 763, 762, 761, + 760, 759, 758, 755, 754, 748, 747, 746, 745, 744, + 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, + 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, + 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, + 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, + 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, + 693, 692, 691, 690, 687, 686, 681, 680, 679, 678, + 677, 676, 675, 674, 673, 670, 669, 668, 667, 666, + 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, - 643, 642, 639, 638, 637, 636, 635, 634, 633, 632, - 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, - 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, - 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, - 601, 600, 599, 598, 597, 596, 595, 594, 590, 589, - 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, - 578, 577, 576, 575, 574, 573, 572, 571, 570, 569, - 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, - 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, - 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, + 655, 654, 653, 652, 651, 650, 647, 646, 645, 644, + 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, + 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, + 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, + 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, + 603, 602, 598, 597, 596, 595, 594, 593, 592, 591, + 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, + 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, + 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, + 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, - 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, - 528, 527, 526, 523, 522, 521, 520, 519, 518, 517, - 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, - 501, 500, 499, 498, 497, 496, 495, 493, 492, 490, - 489, 486, 485, 484, 483, 482, 481, 480, 479, 478, - 477, 476, 475, 474, 473, 472, 471, 470, 469, 468, - 467, 466, 465, 464, 463, 462, 459, 458, 457, 456, - 455, 454, 453, 452, 451, 448, 447, 446, 445, 444, - 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, - 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, + 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, + 540, 539, 538, 537, 536, 535, 534, 533, 530, 529, + 528, 527, 526, 525, 524, 521, 520, 519, 518, 517, + 516, 515, 514, 513, 512, 508, 507, 506, 505, 504, + 503, 502, 500, 499, 497, 496, 493, 492, 491, 490, + 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, + 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, + 469, 466, 465, 464, 463, 462, 461, 460, 459, 458, + 457, 453, 452, 451, 450, 449, 446, 445, 444, 443, + 442, 441, 440, 439, 438, 437, 432, 431, 430, 429, - 417, 414, 413, 412, 411, 408, 407, 406, 405, 404, - 403, 400, 399, 397, 396, 391, 386, 383, 380, 379, - 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, - 368, 367, 366, 365, 362, 361, 360, 359, 358, 357, - 356, 355, 354, 353, 352, 351, 350, 346, 345, 344, - 343, 342, 341, 340, 336, 335, 334, 333, 332, 331, + 428, 427, 426, 425, 424, 423, 422, 419, 418, 417, + 416, 413, 412, 411, 410, 409, 408, 405, 404, 402, + 401, 396, 391, 388, 385, 384, 383, 382, 381, 380, + 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, + 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, + 357, 356, 355, 351, 350, 349, 348, 346, 345, 344, + 343, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, - 310, 309, 306, 305, 304, 303, 302, 300, 199, 297, - 295, 293, 290, 289, 287, 285, 278, 277, 276, 274, + 320, 319, 318, 317, 316, 315, 314, 313, 312, 309, + 308, 307, 306, 305, 303, 200, 300, 298, 296, 293, - 273, 272, 271, 270, 269, 265, 254, 250, 247, 246, - 245, 244, 242, 241, 240, 239, 236, 235, 234, 233, - 232, 231, 230, 229, 228, 227, 223, 220, 217, 216, - 215, 214, 211, 210, 209, 206, 205, 204, 203, 199, - 192, 189, 188, 186, 184, 183, 175, 161, 136, 121, - 110, 107, 106, 104, 43, 100, 98, 97, 88, 43, - 1297, 11, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 292, 290, 288, 281, 280, 279, 277, 276, 275, 274, + 273, 272, 268, 257, 253, 250, 249, 248, 247, 246, + 243, 242, 241, 240, 237, 236, 235, 234, 233, 232, + 231, 230, 229, 228, 224, 221, 218, 217, 216, 215, + 212, 211, 210, 207, 206, 205, 204, 200, 193, 190, + 189, 187, 185, 184, 176, 162, 136, 121, 110, 107, + 106, 104, 43, 100, 98, 97, 88, 43, 1306, 11, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297 + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306 } ; -static const flex_int16_t yy_chk[1734] = +static const flex_int16_t yy_chk[1742] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 0, - 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 587, + 3, 3, 3, 21, 1, 1, 3, 0, 587, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, 6, 6, 6, 7, 7, 7, 1, 7, 68, 8, @@ -1398,7 +1402,7 @@ static const flex_int16_t yy_chk[1734] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 124, 75, 25, 66, 25, 75, 2, 25, 25, 25, - 124, 66, 2, 128, 128, 20, 51, 714, 54, 2, + 124, 66, 2, 128, 128, 20, 51, 718, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1409,172 +1413,173 @@ static const flex_int16_t yy_chk[1734] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 48, 17, 17, 17, 19, 56, 19, 19, 19, 44, 59, 22, 17, 22, 22, 22, 64, - 19, 93, 61, 55, 67, 61, 288, 22, 61, 48, + 19, 93, 61, 55, 67, 61, 721, 22, 61, 48, 61, 56, 61, 55, 67, 96, 67, 63, 17, 59, 73, 91, 64, 19, 73, 59, 55, 44, 63, 93, - 22, 45, 70, 64, 73, 288, 70, 45, 63, 45, + 22, 45, 70, 64, 73, 115, 70, 45, 63, 45, 45, 55, 45, 96, 45, 45, 45, 91, 58, 69, - 69, 45, 45, 69, 45, 58, 70, 717, 101, 69, + 69, 45, 45, 69, 45, 58, 70, 722, 115, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 58, 89, 89, 89, 58, 62, 78, - 71, 58, 62, 101, 77, 62, 62, 92, 260, 58, - 72, 260, 105, 58, 77, 58, 58, 94, 62, 71, - 72, 71, 78, 71, 76, 72, 72, 77, 76, 77, - 95, 76, 78, 92, 81, 81, 81, 78, 76, 76, - 105, 108, 77, 94, 76, 81, 158, 158, 82, 77, - 82, 82, 82, 83, 109, 83, 95, 111, 83, 83, - 83, 82, 84, 112, 84, 84, 84, 108, 81, 85, - 85, 85, 90, 90, 90, 84, 103, 113, 115, 114, + 45, 45, 45, 58, 89, 89, 89, 58, 62, 723, + 71, 58, 62, 92, 163, 62, 62, 101, 78, 58, + 76, 163, 72, 58, 76, 58, 58, 76, 62, 71, + 72, 71, 72, 71, 76, 76, 77, 72, 72, 92, + 76, 78, 81, 81, 81, 180, 77, 90, 90, 90, + 726, 78, 101, 81, 94, 263, 78, 105, 263, 77, + 82, 77, 82, 82, 82, 83, 95, 83, 180, 108, + 83, 83, 83, 82, 77, 84, 81, 84, 84, 84, + 94, 77, 85, 85, 85, 105, 109, 103, 84, 111, - 85, 109, 119, 103, 82, 111, 133, 172, 133, 137, - 112, 135, 137, 148, 153, 162, 137, 148, 84, 119, - 165, 115, 162, 85, 165, 113, 114, 135, 165, 160, - 119, 103, 160, 160, 172, 103, 179, 182, 187, 103, - 177, 308, 153, 178, 153, 180, 181, 103, 163, 190, - 718, 103, 191, 103, 103, 118, 118, 118, 308, 179, - 182, 187, 118, 118, 118, 118, 118, 118, 177, 178, - 193, 197, 181, 180, 195, 238, 719, 190, 208, 191, - 202, 163, 163, 163, 208, 118, 118, 118, 118, 118, - 118, 246, 163, 193, 163, 277, 163, 195, 197, 163, + 135, 112, 95, 85, 103, 108, 82, 113, 179, 133, + 114, 133, 137, 119, 148, 137, 135, 153, 148, 137, + 182, 84, 178, 109, 159, 159, 85, 111, 112, 280, + 119, 181, 103, 173, 179, 113, 103, 114, 183, 161, + 103, 119, 161, 161, 191, 153, 182, 153, 103, 164, + 178, 188, 103, 192, 103, 103, 118, 118, 118, 181, + 173, 183, 194, 118, 118, 118, 118, 118, 118, 166, + 239, 196, 191, 166, 188, 198, 203, 166, 244, 280, + 192, 727, 164, 164, 164, 194, 118, 118, 118, 118, + 118, 118, 209, 164, 196, 164, 249, 164, 209, 203, - 200, 200, 200, 202, 279, 282, 287, 200, 200, 200, - 200, 200, 200, 290, 290, 291, 287, 354, 294, 314, - 721, 301, 290, 314, 390, 246, 238, 279, 282, 238, - 200, 200, 200, 200, 200, 200, 326, 554, 291, 246, - 402, 326, 337, 337, 503, 277, 294, 299, 299, 299, - 301, 343, 390, 592, 299, 299, 299, 299, 299, 299, - 382, 343, 400, 502, 400, 382, 424, 722, 402, 415, - 504, 424, 503, 354, 554, 504, 592, 299, 299, 299, - 299, 299, 299, 591, 415, 723, 593, 326, 724, 400, - 502, 400, 326, 401, 401, 401, 593, 725, 726, 728, + 164, 244, 198, 201, 201, 201, 282, 290, 285, 294, + 201, 201, 201, 201, 201, 201, 291, 290, 293, 293, + 297, 239, 311, 304, 239, 340, 340, 293, 728, 282, + 249, 285, 294, 201, 201, 201, 201, 201, 201, 311, + 347, 359, 317, 346, 249, 291, 317, 395, 297, 302, + 302, 302, 304, 346, 730, 420, 302, 302, 302, 302, + 302, 302, 329, 405, 387, 405, 407, 329, 347, 387, + 420, 429, 509, 510, 562, 395, 429, 599, 601, 302, + 302, 302, 302, 302, 302, 600, 511, 604, 601, 666, + 405, 511, 405, 604, 407, 683, 666, 359, 670, 509, - 401, 401, 401, 401, 401, 401, 596, 658, 659, 659, - 674, 591, 596, 662, 658, 729, 659, 720, 730, 662, - 731, 720, 732, 401, 401, 401, 401, 401, 401, 733, - 734, 735, 736, 737, 738, 739, 740, 741, 674, 742, - 743, 744, 745, 746, 747, 748, 750, 751, 752, 753, - 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 776, 777, 778, 779, 780, 781, 782, 759, 783, 784, - 758, 786, 787, 788, 789, 791, 792, 793, 788, 794, - 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, + 731, 510, 667, 667, 670, 599, 732, 733, 600, 734, + 667, 562, 729, 329, 735, 737, 729, 738, 329, 406, + 406, 406, 739, 683, 740, 741, 406, 406, 406, 406, + 406, 406, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 755, 756, 757, 759, 406, + 406, 406, 406, 406, 406, 760, 761, 762, 763, 764, + 765, 767, 768, 769, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 785, 786, + 787, 788, 789, 790, 791, 768, 792, 793, 767, 795, + 796, 797, 798, 800, 801, 802, 797, 803, 804, 805, - 805, 806, 808, 809, 810, 811, 813, 814, 815, 816, - 817, 805, 818, 819, 820, 821, 822, 823, 824, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 838, 837, 839, 840, 841, 842, 844, 845, 846, 788, - 847, 848, 849, 851, 852, 853, 854, 855, 856, 857, - 858, 859, 860, 861, 862, 863, 865, 836, 837, 866, - 867, 868, 869, 870, 866, 871, 872, 873, 874, 875, - 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, - 886, 887, 889, 890, 891, 892, 893, 894, 895, 897, - 898, 900, 901, 902, 903, 904, 905, 906, 907, 908, + 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, + 817, 818, 819, 820, 822, 823, 824, 825, 826, 814, + 827, 828, 829, 830, 831, 832, 833, 835, 836, 837, + 838, 839, 840, 841, 842, 843, 844, 845, 847, 846, + 848, 849, 850, 851, 853, 854, 855, 797, 856, 857, + 858, 860, 861, 862, 863, 864, 865, 866, 867, 868, + 869, 870, 871, 872, 874, 845, 846, 875, 876, 877, + 878, 879, 875, 880, 881, 882, 883, 884, 885, 886, + 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, + 898, 899, 900, 901, 902, 903, 904, 906, 907, 909, - 910, 911, 912, 913, 914, 915, 917, 918, 919, 920, - 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, - 933, 934, 935, 937, 911, 939, 941, 942, 943, 944, - 912, 945, 946, 948, 949, 950, 952, 953, 954, 955, - 956, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 980, 1010, 1014, 1015, 1016, 1017, 1018, 1009, 1019, 966, + 910, 911, 912, 913, 914, 915, 916, 917, 919, 920, + 921, 922, 923, 924, 926, 927, 928, 929, 932, 933, + 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, + 944, 946, 920, 948, 950, 951, 952, 953, 921, 954, + 955, 957, 958, 959, 961, 962, 963, 964, 965, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 989, 1019, - 1020, 1021, 1022, 1024, 1025, 1026, 1027, 1029, 985, 1031, - 1034, 1036, 1037, 1038, 1039, 1040, 1042, 1043, 1038, 1045, - 1046, 1047, 1048, 1049, 1050, 1052, 1053, 1054, 1055, 1056, - 1057, 1058, 1059, 1060, 1062, 1063, 1064, 1066, 1040, 1067, - 1068, 1069, 1071, 1072, 1073, 1074, 1075, 1078, 1080, 1081, - 1083, 1084, 1085, 1086, 1088, 1090, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 1109, 1110, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1092, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1135, 1138, 1139, + 1023, 1024, 1025, 1026, 1027, 1018, 1028, 975, 1029, 1030, + 1031, 1033, 1034, 1035, 1036, 1038, 994, 1040, 1043, 1045, + 1046, 1047, 1048, 1049, 1051, 1052, 1047, 1054, 1055, 1056, + 1057, 1058, 1059, 1061, 1062, 1063, 1064, 1065, 1066, 1067, + 1068, 1069, 1071, 1072, 1073, 1075, 1049, 1076, 1077, 1078, + 1080, 1081, 1082, 1083, 1084, 1087, 1089, 1090, 1092, 1093, + 1094, 1095, 1097, 1099, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1121, 1122, 1123, 1124, 1125, 1126, 1127, + 1128, 1101, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1142, 1143, 1144, 1145, 1146, 1147, 1149, 1151, 1153, 1154, - 1155, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1168, 1169, 1131, 1170, 1172, 1173, 1174, 1175, 1176, - 1177, 1179, 1180, 1182, 1183, 1184, 1185, 1186, 1187, 1188, - 1189, 1190, 1194, 1197, 1198, 1200, 1201, 1203, 1204, 1205, - 1206, 1208, 1209, 1210, 1211, 1212, 1213, 1215, 1216, 1217, - 1218, 1219, 1220, 1221, 1223, 1224, 1225, 1226, 1228, 1229, - 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1239, 1241, 1242, - 1243, 1245, 1246, 1247, 1249, 1250, 1251, 1253, 1254, 1255, - 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, + 1137, 1138, 1139, 1140, 1141, 1144, 1147, 1148, 1151, 1152, + 1153, 1154, 1155, 1156, 1158, 1160, 1162, 1163, 1164, 1166, + 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1177, + 1178, 1140, 1179, 1181, 1182, 1183, 1184, 1185, 1186, 1188, + 1189, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, + 1203, 1206, 1207, 1209, 1210, 1212, 1213, 1214, 1215, 1217, + 1218, 1219, 1220, 1221, 1222, 1224, 1225, 1226, 1227, 1228, + 1229, 1230, 1232, 1233, 1234, 1235, 1237, 1238, 1239, 1240, + 1241, 1242, 1243, 1244, 1245, 1248, 1250, 1251, 1252, 1254, + 1255, 1256, 1258, 1259, 1260, 1262, 1263, 1264, 1265, 1266, - 1266, 1267, 1268, 1269, 1270, 1271, 1273, 1274, 1275, 1276, - 1277, 1278, 1282, 1283, 1284, 1286, 1287, 1288, 1289, 1290, - 1291, 1292, 1294, 1295, 1298, 1298, 1298, 1298, 1298, 1299, - 1299, 1299, 1299, 1299, 1300, 1306, 1300, 1300, 1300, 1301, - 1307, 1301, 1308, 1301, 1302, 1302, 1302, 1302, 1302, 1303, - 1303, 1303, 1303, 1303, 1304, 1309, 1304, 1304, 1304, 1305, - 1305, 1305, 713, 712, 709, 708, 707, 706, 705, 704, - 703, 702, 701, 700, 699, 698, 697, 696, 694, 693, - 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, - 682, 681, 680, 679, 678, 677, 676, 675, 673, 671, + 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, + 1277, 1278, 1279, 1280, 1282, 1283, 1284, 1285, 1286, 1287, + 1291, 1292, 1293, 1295, 1296, 1297, 1298, 1299, 1300, 1301, + 1303, 1304, 1307, 1307, 1307, 1307, 1307, 1308, 1308, 1308, + 1308, 1308, 1309, 1315, 1309, 1309, 1309, 1310, 1316, 1310, + 1317, 1310, 1311, 1311, 1311, 1311, 1311, 1312, 1312, 1312, + 1312, 1312, 1313, 1318, 1313, 1313, 1313, 1314, 1314, 1314, + 717, 716, 715, 714, 713, 712, 711, 710, 709, 708, + 707, 706, 705, 703, 702, 701, 700, 699, 698, 697, + 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, - 670, 669, 668, 667, 666, 665, 664, 663, 661, 660, - 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, - 647, 646, 645, 644, 643, 642, 641, 639, 638, 637, - 636, 635, 634, 633, 631, 630, 629, 628, 627, 626, - 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, - 605, 604, 603, 602, 601, 600, 599, 598, 597, 595, - 594, 590, 589, 588, 586, 585, 583, 582, 581, 580, - 579, 577, 576, 575, 574, 573, 572, 571, 570, 569, - 567, 566, 565, 564, 563, 562, 561, 560, 558, 557, + 686, 685, 684, 682, 680, 679, 678, 677, 676, 675, + 674, 673, 672, 669, 668, 665, 664, 663, 662, 661, + 660, 659, 658, 657, 656, 655, 654, 653, 652, 651, + 650, 649, 647, 646, 645, 644, 643, 642, 641, 639, + 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, + 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, + 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, + 608, 607, 606, 605, 603, 602, 598, 597, 596, 594, + 593, 591, 590, 589, 588, 585, 584, 583, 582, 581, + 580, 579, 578, 577, 575, 574, 573, 572, 571, 570, - 556, 555, 553, 552, 551, 550, 549, 548, 546, 545, - 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, - 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, - 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, - 513, 512, 511, 510, 509, 508, 507, 506, 500, 498, - 495, 494, 493, 492, 490, 489, 488, 486, 485, 482, - 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, - 471, 470, 469, 468, 467, 466, 465, 464, 463, 461, - 459, 458, 457, 456, 455, 454, 453, 452, 451, 450, - 449, 447, 446, 445, 444, 443, 442, 441, 440, 439, + 569, 568, 566, 565, 564, 563, 561, 560, 559, 558, + 556, 555, 553, 552, 551, 550, 549, 548, 547, 546, + 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, + 535, 534, 533, 532, 530, 529, 528, 527, 526, 525, + 524, 523, 522, 521, 520, 519, 518, 517, 516, 515, + 514, 513, 507, 505, 502, 501, 500, 499, 497, 496, + 495, 493, 492, 489, 488, 487, 486, 485, 484, 483, + 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, + 472, 471, 470, 468, 466, 465, 464, 463, 462, 461, + 460, 459, 457, 456, 455, 454, 452, 451, 450, 449, - 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, - 427, 426, 425, 423, 422, 421, 420, 419, 417, 416, - 414, 413, 411, 410, 409, 408, 406, 405, 404, 403, - 398, 397, 395, 394, 393, 392, 391, 389, 388, 386, - 383, 381, 380, 378, 377, 376, 375, 374, 373, 372, - 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, - 361, 360, 358, 357, 356, 355, 353, 352, 351, 350, - 349, 348, 347, 346, 344, 342, 341, 340, 339, 338, - 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, - 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, + 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, + 438, 437, 436, 435, 434, 432, 431, 430, 428, 427, + 426, 425, 424, 422, 421, 419, 418, 416, 415, 414, + 413, 411, 410, 409, 408, 403, 402, 400, 399, 398, + 397, 396, 394, 393, 391, 388, 386, 385, 383, 382, + 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, + 371, 370, 369, 368, 367, 366, 365, 363, 362, 361, + 360, 358, 357, 356, 355, 354, 353, 352, 351, 350, + 348, 345, 344, 343, 342, 341, 339, 338, 337, 336, + 335, 334, 333, 332, 331, 330, 328, 327, 326, 325, - 315, 313, 312, 311, 310, 307, 306, 305, 304, 303, - 302, 298, 296, 293, 292, 289, 285, 278, 276, 275, - 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, - 264, 263, 262, 261, 259, 258, 257, 256, 255, 254, - 253, 252, 251, 250, 249, 248, 247, 245, 244, 243, - 242, 241, 240, 239, 237, 236, 235, 234, 233, 232, - 231, 230, 229, 227, 226, 225, 224, 223, 222, 221, - 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, - 210, 209, 207, 206, 205, 204, 203, 201, 198, 196, - 194, 192, 189, 188, 186, 183, 175, 174, 173, 171, + 324, 323, 322, 321, 320, 319, 318, 316, 315, 314, + 313, 310, 309, 308, 307, 306, 305, 301, 299, 296, + 295, 292, 288, 281, 279, 278, 277, 276, 275, 274, + 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, + 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, + 252, 251, 250, 248, 247, 246, 245, 243, 242, 241, + 240, 238, 237, 236, 235, 234, 233, 232, 231, 230, + 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, + 218, 217, 216, 215, 214, 213, 212, 211, 210, 208, + 207, 206, 205, 204, 202, 199, 197, 195, 193, 190, - 170, 169, 168, 167, 166, 164, 161, 159, 157, 156, - 155, 154, 152, 151, 150, 149, 147, 146, 145, 144, - 143, 142, 141, 140, 139, 138, 136, 134, 132, 131, - 130, 129, 127, 126, 125, 123, 122, 121, 120, 116, - 110, 107, 106, 104, 99, 98, 79, 74, 65, 60, - 53, 50, 49, 47, 43, 41, 39, 38, 24, 14, - 11, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, + 189, 187, 184, 176, 175, 174, 172, 171, 170, 169, + 168, 167, 165, 162, 160, 158, 157, 156, 155, 154, + 152, 151, 150, 149, 147, 146, 145, 144, 143, 142, + 141, 140, 139, 138, 136, 134, 132, 131, 130, 129, + 127, 126, 125, 123, 122, 121, 120, 116, 110, 107, + 106, 104, 99, 98, 79, 74, 65, 60, 53, 50, + 49, 47, 43, 41, 39, 38, 24, 14, 11, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297 + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 1306 } ; static yy_state_type yy_last_accepting_state; @@ -1583,25 +1588,25 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[158] = +static const flex_int16_t yy_rule_linenum[161] = { 0, 143, 145, 147, 152, 153, 158, 159, 160, 172, 175, 180, 187, 196, 205, 214, 223, 233, 242, 251, 260, 269, 278, 287, 296, 305, 316, 325, 334, 343, 352, 362, 372, 382, 392, 402, 412, 422, 432, 442, 453, 464, 475, 484, 494, 503, 513, 528, 544, 553, 562, - 571, 580, 590, 624, 634, 643, 652, 661, 671, 680, - 689, 698, 707, 717, 726, 735, 744, 753, 762, 771, - 780, 789, 798, 807, 817, 829, 839, 848, 858, 868, - 878, 888, 898, 907, 917, 926, 935, 944, 953, 963, - 973, 983, 992, 1001, 1010, 1019, 1028, 1037, 1046, 1055, + 571, 580, 590, 599, 608, 618, 627, 637, 646, 655, + 664, 674, 683, 692, 701, 710, 720, 729, 738, 747, + 756, 765, 774, 783, 792, 801, 810, 820, 832, 842, + 851, 861, 871, 881, 891, 901, 910, 920, 929, 938, + 947, 956, 966, 976, 986, 995, 1004, 1013, 1022, 1031, - 1064, 1073, 1082, 1091, 1100, 1109, 1118, 1127, 1136, 1145, - 1154, 1163, 1172, 1181, 1190, 1199, 1208, 1217, 1226, 1235, - 1245, 1255, 1265, 1275, 1285, 1295, 1305, 1315, 1325, 1334, - 1343, 1352, 1361, 1370, 1379, 1388, 1399, 1412, 1425, 1440, - 1538, 1543, 1548, 1553, 1554, 1555, 1556, 1557, 1558, 1560, - 1578, 1591, 1596, 1600, 1602, 1604, 1606 + 1040, 1049, 1058, 1067, 1076, 1085, 1094, 1103, 1112, 1121, + 1130, 1139, 1148, 1157, 1166, 1175, 1184, 1193, 1202, 1211, + 1220, 1229, 1238, 1248, 1258, 1268, 1278, 1288, 1298, 1308, + 1318, 1328, 1337, 1346, 1355, 1364, 1373, 1382, 1391, 1402, + 1415, 1428, 1443, 1541, 1546, 1551, 1556, 1557, 1558, 1559, + 1560, 1561, 1563, 1581, 1594, 1599, 1603, 1605, 1607, 1609 } ; /* The intent behind this definition is that it'll catch @@ -1654,7 +1659,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg) -#line 1657 "dhcp4_lexer.cc" +#line 1662 "dhcp4_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1680,8 +1685,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1683 "dhcp4_lexer.cc" -#line 1684 "dhcp4_lexer.cc" +#line 1688 "dhcp4_lexer.cc" +#line 1689 "dhcp4_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2007,7 +2012,7 @@ YY_DECL } -#line 2010 "dhcp4_lexer.cc" +#line 2015 "dhcp4_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2036,13 +2041,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1298 ) + if ( yy_current_state >= 1307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1297 ); + while ( yy_current_state != 1306 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2061,13 +2066,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 158 ) + else if ( yy_act < 161 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 158 ) + else if ( yy_act == 161 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 159 ) + else if ( yy_act == 162 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2708,8 +2713,11 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); } } - -\"only\" { + YY_BREAK +case 54: +YY_RULE_SETUP +#line 599 "dhcp4_lexer.ll" +{ switch(driver.ctx_) { case isc::dhcp::Parser4Context::KNOWN_CLIENTS: return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); @@ -2717,8 +2725,11 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); } } - -\"never\" { + YY_BREAK +case 55: +YY_RULE_SETUP +#line 608 "dhcp4_lexer.ll" +{ switch(driver.ctx_) { case isc::dhcp::Parser4Context::KNOWN_CLIENTS: case isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME: @@ -2727,8 +2738,11 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING("never", driver.loc_); } } - -\"subnet\" { + YY_BREAK +case 56: +YY_RULE_SETUP +#line 618 "dhcp4_lexer.ll" +{ switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: return isc::dhcp::Dhcp4Parser::make_SUBNET(driver.loc_); @@ -2737,9 +2751,9 @@ YY_RULE_SETUP } } YY_BREAK -case 54: +case 57: YY_RULE_SETUP -#line 624 "dhcp4_lexer.ll" +#line 627 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2750,9 +2764,9 @@ YY_RULE_SETUP } } YY_BREAK -case 55: +case 58: YY_RULE_SETUP -#line 634 "dhcp4_lexer.ll" +#line 637 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2762,9 +2776,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 59: YY_RULE_SETUP -#line 643 "dhcp4_lexer.ll" +#line 646 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2774,9 +2788,9 @@ YY_RULE_SETUP } } YY_BREAK -case 57: +case 60: YY_RULE_SETUP -#line 652 "dhcp4_lexer.ll" +#line 655 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2786,9 +2800,9 @@ YY_RULE_SETUP } } YY_BREAK -case 58: +case 61: YY_RULE_SETUP -#line 661 "dhcp4_lexer.ll" +#line 664 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2799,9 +2813,9 @@ YY_RULE_SETUP } } YY_BREAK -case 59: +case 62: YY_RULE_SETUP -#line 671 "dhcp4_lexer.ll" +#line 674 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2811,9 +2825,9 @@ YY_RULE_SETUP } } YY_BREAK -case 60: +case 63: YY_RULE_SETUP -#line 680 "dhcp4_lexer.ll" +#line 683 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2823,9 +2837,9 @@ YY_RULE_SETUP } } YY_BREAK -case 61: +case 64: YY_RULE_SETUP -#line 689 "dhcp4_lexer.ll" +#line 692 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2835,9 +2849,9 @@ YY_RULE_SETUP } } YY_BREAK -case 62: +case 65: YY_RULE_SETUP -#line 698 "dhcp4_lexer.ll" +#line 701 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2847,9 +2861,9 @@ YY_RULE_SETUP } } YY_BREAK -case 63: +case 66: YY_RULE_SETUP -#line 707 "dhcp4_lexer.ll" +#line 710 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -2860,9 +2874,9 @@ YY_RULE_SETUP } } YY_BREAK -case 64: +case 67: YY_RULE_SETUP -#line 717 "dhcp4_lexer.ll" +#line 720 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2872,9 +2886,9 @@ YY_RULE_SETUP } } YY_BREAK -case 65: +case 68: YY_RULE_SETUP -#line 726 "dhcp4_lexer.ll" +#line 729 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -2884,9 +2898,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 69: YY_RULE_SETUP -#line 735 "dhcp4_lexer.ll" +#line 738 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGING: @@ -2896,9 +2910,9 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 70: YY_RULE_SETUP -#line 744 "dhcp4_lexer.ll" +#line 747 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2908,9 +2922,9 @@ YY_RULE_SETUP } } YY_BREAK -case 68: +case 71: YY_RULE_SETUP -#line 753 "dhcp4_lexer.ll" +#line 756 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2920,9 +2934,9 @@ YY_RULE_SETUP } } YY_BREAK -case 69: +case 72: YY_RULE_SETUP -#line 762 "dhcp4_lexer.ll" +#line 765 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2932,9 +2946,9 @@ YY_RULE_SETUP } } YY_BREAK -case 70: +case 73: YY_RULE_SETUP -#line 771 "dhcp4_lexer.ll" +#line 774 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2944,9 +2958,9 @@ YY_RULE_SETUP } } YY_BREAK -case 71: +case 74: YY_RULE_SETUP -#line 780 "dhcp4_lexer.ll" +#line 783 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2956,9 +2970,9 @@ YY_RULE_SETUP } } YY_BREAK -case 72: +case 75: YY_RULE_SETUP -#line 789 "dhcp4_lexer.ll" +#line 792 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2968,9 +2982,9 @@ YY_RULE_SETUP } } YY_BREAK -case 73: +case 76: YY_RULE_SETUP -#line 798 "dhcp4_lexer.ll" +#line 801 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2980,9 +2994,9 @@ YY_RULE_SETUP } } YY_BREAK -case 74: +case 77: YY_RULE_SETUP -#line 807 "dhcp4_lexer.ll" +#line 810 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2993,9 +3007,9 @@ YY_RULE_SETUP } } YY_BREAK -case 75: +case 78: YY_RULE_SETUP -#line 817 "dhcp4_lexer.ll" +#line 820 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3008,9 +3022,9 @@ YY_RULE_SETUP } } YY_BREAK -case 76: +case 79: YY_RULE_SETUP -#line 829 "dhcp4_lexer.ll" +#line 832 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -3021,9 +3035,9 @@ YY_RULE_SETUP } } YY_BREAK -case 77: +case 80: YY_RULE_SETUP -#line 839 "dhcp4_lexer.ll" +#line 842 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3033,9 +3047,9 @@ YY_RULE_SETUP } } YY_BREAK -case 78: +case 81: YY_RULE_SETUP -#line 848 "dhcp4_lexer.ll" +#line 851 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3046,9 +3060,9 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 82: YY_RULE_SETUP -#line 858 "dhcp4_lexer.ll" +#line 861 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3059,9 +3073,9 @@ YY_RULE_SETUP } } YY_BREAK -case 80: +case 83: YY_RULE_SETUP -#line 868 "dhcp4_lexer.ll" +#line 871 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3072,9 +3086,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 84: YY_RULE_SETUP -#line 878 "dhcp4_lexer.ll" +#line 881 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3085,9 +3099,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 85: YY_RULE_SETUP -#line 888 "dhcp4_lexer.ll" +#line 891 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3098,9 +3112,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 86: YY_RULE_SETUP -#line 898 "dhcp4_lexer.ll" +#line 901 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3110,9 +3124,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 87: YY_RULE_SETUP -#line 907 "dhcp4_lexer.ll" +#line 910 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3123,9 +3137,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 88: YY_RULE_SETUP -#line 917 "dhcp4_lexer.ll" +#line 920 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3135,9 +3149,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 89: YY_RULE_SETUP -#line 926 "dhcp4_lexer.ll" +#line 929 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3147,9 +3161,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 90: YY_RULE_SETUP -#line 935 "dhcp4_lexer.ll" +#line 938 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3159,9 +3173,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 91: YY_RULE_SETUP -#line 944 "dhcp4_lexer.ll" +#line 947 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3171,9 +3185,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 92: YY_RULE_SETUP -#line 953 "dhcp4_lexer.ll" +#line 956 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3184,9 +3198,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 93: YY_RULE_SETUP -#line 963 "dhcp4_lexer.ll" +#line 966 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3197,9 +3211,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 94: YY_RULE_SETUP -#line 973 "dhcp4_lexer.ll" +#line 976 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3209,9 +3223,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 95: YY_RULE_SETUP -#line 983 "dhcp4_lexer.ll" +#line 986 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3221,9 +3235,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 96: YY_RULE_SETUP -#line 992 "dhcp4_lexer.ll" +#line 995 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3233,9 +3247,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 97: YY_RULE_SETUP -#line 1001 "dhcp4_lexer.ll" +#line 1004 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3245,9 +3259,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 98: YY_RULE_SETUP -#line 1010 "dhcp4_lexer.ll" +#line 1013 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3257,9 +3271,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 99: YY_RULE_SETUP -#line 1019 "dhcp4_lexer.ll" +#line 1022 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3269,9 +3283,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 100: YY_RULE_SETUP -#line 1028 "dhcp4_lexer.ll" +#line 1031 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3281,9 +3295,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 101: YY_RULE_SETUP -#line 1037 "dhcp4_lexer.ll" +#line 1040 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3293,9 +3307,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 102: YY_RULE_SETUP -#line 1046 "dhcp4_lexer.ll" +#line 1049 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3305,9 +3319,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 103: YY_RULE_SETUP -#line 1055 "dhcp4_lexer.ll" +#line 1058 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3317,9 +3331,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 104: YY_RULE_SETUP -#line 1064 "dhcp4_lexer.ll" +#line 1067 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3329,9 +3343,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 105: YY_RULE_SETUP -#line 1073 "dhcp4_lexer.ll" +#line 1076 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3341,9 +3355,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 106: YY_RULE_SETUP -#line 1082 "dhcp4_lexer.ll" +#line 1085 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3353,9 +3367,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 107: YY_RULE_SETUP -#line 1091 "dhcp4_lexer.ll" +#line 1094 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3365,9 +3379,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 108: YY_RULE_SETUP -#line 1100 "dhcp4_lexer.ll" +#line 1103 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3377,9 +3391,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 109: YY_RULE_SETUP -#line 1109 "dhcp4_lexer.ll" +#line 1112 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3389,9 +3403,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 110: YY_RULE_SETUP -#line 1118 "dhcp4_lexer.ll" +#line 1121 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3401,9 +3415,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 111: YY_RULE_SETUP -#line 1127 "dhcp4_lexer.ll" +#line 1130 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3413,9 +3427,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 112: YY_RULE_SETUP -#line 1136 "dhcp4_lexer.ll" +#line 1139 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3425,9 +3439,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 113: YY_RULE_SETUP -#line 1145 "dhcp4_lexer.ll" +#line 1148 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3437,9 +3451,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 114: YY_RULE_SETUP -#line 1154 "dhcp4_lexer.ll" +#line 1157 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3449,9 +3463,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 115: YY_RULE_SETUP -#line 1163 "dhcp4_lexer.ll" +#line 1166 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3461,9 +3475,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 116: YY_RULE_SETUP -#line 1172 "dhcp4_lexer.ll" +#line 1175 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3473,9 +3487,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 117: YY_RULE_SETUP -#line 1181 "dhcp4_lexer.ll" +#line 1184 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3485,9 +3499,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 118: YY_RULE_SETUP -#line 1190 "dhcp4_lexer.ll" +#line 1193 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3497,9 +3511,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 119: YY_RULE_SETUP -#line 1199 "dhcp4_lexer.ll" +#line 1202 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3509,9 +3523,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 120: YY_RULE_SETUP -#line 1208 "dhcp4_lexer.ll" +#line 1211 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3521,9 +3535,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 121: YY_RULE_SETUP -#line 1217 "dhcp4_lexer.ll" +#line 1220 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3533,9 +3547,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 122: YY_RULE_SETUP -#line 1226 "dhcp4_lexer.ll" +#line 1229 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3545,9 +3559,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 123: YY_RULE_SETUP -#line 1235 "dhcp4_lexer.ll" +#line 1238 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3558,9 +3572,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 121: +case 124: YY_RULE_SETUP -#line 1245 "dhcp4_lexer.ll" +#line 1248 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3571,9 +3585,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 122: +case 125: YY_RULE_SETUP -#line 1255 "dhcp4_lexer.ll" +#line 1258 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3584,52 +3598,13 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 123: -YY_RULE_SETUP -#line 1265 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK -case 124: -YY_RULE_SETUP -#line 1275 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK -case 125: -YY_RULE_SETUP -#line 1285 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK case 126: YY_RULE_SETUP -#line 1295 "dhcp4_lexer.ll" +#line 1268 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); } std::string tmp(yytext+1); tmp.resize(tmp.size() - 1); @@ -3638,7 +3613,46 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1305 "dhcp4_lexer.ll" +#line 1278 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 128: +YY_RULE_SETUP +#line 1288 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 129: +YY_RULE_SETUP +#line 1298 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 130: +YY_RULE_SETUP +#line 1308 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3649,9 +3663,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 128: +case 131: YY_RULE_SETUP -#line 1315 "dhcp4_lexer.ll" +#line 1318 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3662,9 +3676,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 129: +case 132: YY_RULE_SETUP -#line 1325 "dhcp4_lexer.ll" +#line 1328 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3674,9 +3688,9 @@ YY_RULE_SETUP } } YY_BREAK -case 130: +case 133: YY_RULE_SETUP -#line 1334 "dhcp4_lexer.ll" +#line 1337 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3686,9 +3700,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 134: YY_RULE_SETUP -#line 1343 "dhcp4_lexer.ll" +#line 1346 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3698,9 +3712,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 135: YY_RULE_SETUP -#line 1352 "dhcp4_lexer.ll" +#line 1355 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3710,9 +3724,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 136: YY_RULE_SETUP -#line 1361 "dhcp4_lexer.ll" +#line 1364 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3722,9 +3736,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 137: YY_RULE_SETUP -#line 1370 "dhcp4_lexer.ll" +#line 1373 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3734,9 +3748,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 138: YY_RULE_SETUP -#line 1379 "dhcp4_lexer.ll" +#line 1382 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3746,9 +3760,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 139: YY_RULE_SETUP -#line 1388 "dhcp4_lexer.ll" +#line 1391 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3760,9 +3774,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 140: YY_RULE_SETUP -#line 1399 "dhcp4_lexer.ll" +#line 1402 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3776,9 +3790,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 141: YY_RULE_SETUP -#line 1412 "dhcp4_lexer.ll" +#line 1415 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3792,9 +3806,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 142: YY_RULE_SETUP -#line 1425 "dhcp4_lexer.ll" +#line 1428 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3808,9 +3822,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 143: YY_RULE_SETUP -#line 1440 "dhcp4_lexer.ll" +#line 1443 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3909,65 +3923,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 141: -/* rule 141 can match eol */ +case 144: +/* rule 144 can match eol */ YY_RULE_SETUP -#line 1538 "dhcp4_lexer.ll" +#line 1541 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 142: -/* rule 142 can match eol */ +case 145: +/* rule 145 can match eol */ YY_RULE_SETUP -#line 1543 "dhcp4_lexer.ll" +#line 1546 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 143: +case 146: YY_RULE_SETUP -#line 1548 "dhcp4_lexer.ll" +#line 1551 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 144: -YY_RULE_SETUP -#line 1553 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 145: -YY_RULE_SETUP -#line 1554 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 146: -YY_RULE_SETUP -#line 1555 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } - YY_BREAK case 147: YY_RULE_SETUP #line 1556 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } +{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP #line 1557 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } +{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP #line 1558 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } +{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP +#line 1559 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } + YY_BREAK +case 151: +YY_RULE_SETUP #line 1560 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } + YY_BREAK +case 152: +YY_RULE_SETUP +#line 1561 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } + YY_BREAK +case 153: +YY_RULE_SETUP +#line 1563 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3986,9 +4000,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 151: +case 154: YY_RULE_SETUP -#line 1578 "dhcp4_lexer.ll" +#line 1581 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4002,43 +4016,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 152: +case 155: YY_RULE_SETUP -#line 1591 "dhcp4_lexer.ll" +#line 1594 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 153: +case 156: YY_RULE_SETUP -#line 1596 "dhcp4_lexer.ll" +#line 1599 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 154: -YY_RULE_SETUP -#line 1600 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK -case 155: -YY_RULE_SETUP -#line 1602 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK -case 156: -YY_RULE_SETUP -#line 1604 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); - YY_BREAK case 157: YY_RULE_SETUP -#line 1606 "dhcp4_lexer.ll" +#line 1603 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); + YY_BREAK +case 158: +YY_RULE_SETUP +#line 1605 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK +case 159: +YY_RULE_SETUP +#line 1607 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 160: +YY_RULE_SETUP +#line 1609 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1608 "dhcp4_lexer.ll" +#line 1611 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4062,12 +4076,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 158: +case 161: YY_RULE_SETUP -#line 1631 "dhcp4_lexer.ll" +#line 1634 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4067 "dhcp4_lexer.cc" +#line 4084 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4386,7 +4400,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1298 ) + if ( yy_current_state >= 1307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4419,11 +4433,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1298 ) + if ( yy_current_state >= 1307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1297); + yy_is_jam = (yy_current_state == 1306); return yy_is_jam ? 0 : yy_current_state; } @@ -5172,7 +5186,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1631 "dhcp4_lexer.ll" +#line 1634 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index f3e9271645..cd5397d241 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 161 -#define YY_END_OF_BUFFER 162 +#define YY_NUM_RULES 164 +#define YY_END_OF_BUFFER 165 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,148 +700,149 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1277] = +static const flex_int16_t yy_accept[1288] = { 0, - 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, - 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, - 160, 153, 152, 160, 160, 160, 160, 160, 147, 148, - 160, 160, 160, 149, 150, 5, 5, 5, 160, 160, - 160, 10, 11, 0, 0, 143, 0, 0, 0, 0, + 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, + 165, 163, 10, 11, 163, 1, 157, 154, 157, 157, + 163, 156, 155, 163, 163, 163, 163, 163, 150, 151, + 163, 163, 163, 152, 153, 5, 5, 5, 163, 163, + 163, 10, 11, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 154, 154, - 0, 153, 154, 3, 2, 6, 0, 154, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 9, 0, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 157, + 157, 0, 156, 157, 3, 2, 6, 0, 157, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 122, 0, 0, 123, 0, - 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 125, 0, + 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, - 157, 0, 156, 155, 0, 0, 0, 0, 0, 0, - 0, 121, 0, 27, 0, 26, 0, 0, 86, 0, + 0, 0, 0, 0, 162, 160, 0, 159, 158, 0, + 0, 0, 0, 0, 0, 0, 124, 0, 0, 27, - 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, + 0, 26, 0, 0, 89, 0, 0, 0, 0, 0, + 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, + 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 158, 155, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, + 158, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 87, 0, 0, 0, 0, 66, 0, 0, 0, 0, - 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 75, 0, 50, + 0, 0, 0, 66, 0, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 0, 0, 76, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 102, 126, 42, 0, 47, 0, 0, 0, 0, - 0, 0, 140, 35, 0, 32, 0, 0, 0, 0, + 105, 129, 43, 0, 48, 0, 0, 0, 0, 0, - 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, - 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, + 0, 143, 36, 0, 33, 0, 32, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, + 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, - 0, 7, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, - 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 119, 92, 0, 0, 0, 96, - 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 0, 0, 0, 0, 141, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 69, 0, 0, - - 0, 105, 0, 0, 0, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 120, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 111, 98, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107, 124, 0, 37, 0, 116, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 63, 0, 0, - 0, 0, 118, 45, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, + 0, 0, 0, 45, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 0, 0, 0, 64, 85, 0, 0, + 0, 7, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, - 0, 0, 17, 15, 0, 138, 137, 0, 0, 0, - 0, 0, 29, 0, 101, 0, 0, 0, 0, 0, - 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 79, 0, 104, 0, 0, 52, 0, 0, - 0, 19, 0, 0, 0, 0, 0, 81, 59, 0, - 112, 0, 0, 0, 103, 0, 0, 76, 0, 142, - 0, 0, 0, 0, 0, 0, 0, 74, 0, 127, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, + 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 80, 0, 0, 0, 0, 0, 0, 94, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 122, 95, 0, 0, 0, + 99, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, + 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 49, 70, 0, + 0, 0, 108, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 123, 14, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 114, 101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 110, 127, 0, 38, 0, 119, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 64, 0, + 0, 0, 0, 121, 46, 0, 72, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, - 55, 136, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 40, 0, 39, 18, 0, 0, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, - 0, 53, 0, 72, 0, 0, 0, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 0, 34, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 133, 0, 0, 0, 0, - 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 91, 0, 0, 0, 65, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, + 0, 0, 0, 17, 15, 0, 141, 140, 0, 0, + 0, 0, 0, 29, 0, 104, 0, 0, 0, 0, + 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 107, 0, 0, 53, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 84, 60, + 0, 115, 0, 0, 0, 106, 0, 0, 77, 0, + 145, 0, 0, 0, 0, 0, 0, 0, 75, 0, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 0, 22, 56, 0, 0, 0, 0, 21, 0, 73, - 0, 0, 131, 0, 0, 0, 0, 24, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, + 0, 56, 139, 0, 12, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 40, 18, 0, 0, 96, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 54, 0, 73, 0, 0, 0, 0, 0, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 35, 0, 0, 0, 0, + 0, 25, 0, 0, 0, 0, 136, 0, 0, 0, + 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, + + 0, 0, 0, 37, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, - 0, 89, 0, 0, 0, 0, 0, 129, 134, 60, - 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 130, 0 + 135, 0, 22, 57, 0, 0, 0, 0, 21, 0, + 74, 0, 0, 134, 0, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 0, 92, 0, 0, 0, 0, 0, 132, 137, + 61, 0, 0, 0, 131, 0, 0, 0, 0, 0, + 0, 0, 93, 0, 0, 133, 0 } ; static const YY_CHAR yy_ec[256] = @@ -854,12 +855,12 @@ static const YY_CHAR yy_ec[256] = 14, 15, 14, 16, 14, 14, 14, 17, 5, 18, 5, 19, 20, 5, 21, 22, 23, 24, 25, 26, 5, 27, 5, 28, 5, 29, 5, 30, 31, 32, - 5, 33, 34, 35, 36, 5, 37, 5, 38, 5, - 39, 40, 41, 5, 42, 5, 43, 44, 45, 46, + 5, 33, 34, 35, 36, 37, 38, 5, 39, 5, + 40, 41, 42, 5, 43, 5, 44, 45, 46, 47, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 5, 70, 5, 5, 5, 5, 5, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 5, 71, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -876,687 +877,698 @@ static const YY_CHAR yy_ec[256] = 5, 5, 5, 5, 5 } ; -static const YY_CHAR yy_meta[71] = +static const YY_CHAR yy_meta[72] = { 0, 1, 1, 2, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, + 3, 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3 } ; -static const flex_int16_t yy_base[1289] = +static const flex_int16_t yy_base[1300] = { 0, - 0, 69, 19, 29, 40, 47, 51, 57, 86, 98, - 1629, 1630, 32, 1625, 139, 0, 198, 1630, 203, 206, - 11, 218, 1630, 1607, 98, 24, 2, 33, 1630, 1630, - 25, 56, 63, 1630, 1630, 1630, 101, 1613, 1569, 0, - 1605, 118, 1620, 34, 245, 1630, 23, 1565, 1571, 1590, - 90, 63, 182, 202, 91, 199, 271, 198, 73, 213, - 70, 203, 1572, 179, 229, 182, 265, 212, 278, 266, - 289, 1555, 294, 293, 315, 296, 1574, 0, 339, 353, - 365, 373, 376, 1630, 0, 1630, 356, 379, 213, 232, - 215, 329, 330, 281, 1630, 1571, 1609, 1630, 333, 1630, + 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, + 1651, 1652, 32, 1647, 141, 0, 201, 1652, 206, 88, + 11, 213, 1652, 1629, 114, 25, 2, 6, 1652, 1652, + 73, 11, 17, 1652, 1652, 1652, 104, 1635, 1590, 0, + 1627, 107, 1642, 217, 241, 1652, 185, 1586, 1592, 1612, + 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, + 269, 64, 231, 1593, 187, 75, 11, 274, 188, 290, + 278, 297, 1576, 195, 298, 317, 324, 1595, 0, 345, + 352, 373, 380, 358, 1652, 0, 1652, 267, 295, 296, + 324, 283, 325, 346, 340, 1652, 1592, 1631, 1652, 384, - 390, 340, 1558, 1568, 1606, 368, 368, 23, 1562, 370, - 282, 374, 379, 1604, 0, 440, 370, 1549, 1557, 362, - 1553, 1542, 1543, 365, 1559, 1542, 1551, 369, 371, 300, - 1545, 379, 1533, 1588, 242, 1536, 1586, 1529, 1538, 1551, - 1548, 1548, 1542, 171, 1535, 1528, 1533, 1527, 1522, 1537, - 1522, 1521, 1535, 68, 1570, 1520, 382, 1532, 1535, 1519, - 436, 357, 1533, 1530, 1531, 1529, 1511, 1516, 1512, 1504, - 1521, 1513, 0, 407, 415, 390, 411, 419, 402, 1512, - 1630, 0, 439, 1503, 1506, 1630, 417, 437, 1630, 1557, - 1513, 1555, 449, 1554, 445, 1553, 1630, 488, 1552, 455, + 1652, 385, 361, 1579, 1589, 1628, 368, 220, 249, 1583, + 366, 370, 371, 377, 304, 1626, 0, 436, 377, 1570, + 1578, 361, 1574, 1563, 1564, 365, 1580, 1563, 1572, 370, + 200, 373, 1566, 383, 1554, 1610, 406, 1557, 1608, 1550, + 1559, 1572, 1569, 1569, 1563, 272, 1556, 1549, 1554, 1548, + 382, 1559, 1552, 1543, 1542, 1556, 378, 1592, 1541, 405, + 1553, 1556, 1540, 433, 407, 1554, 1551, 1552, 1550, 1532, + 1537, 1533, 1525, 1542, 1534, 0, 431, 441, 428, 435, + 444, 446, 1533, 1652, 0, 454, 1524, 1527, 1652, 440, + 456, 1652, 1579, 1534, 462, 1577, 464, 1576, 461, 1575, - 1514, 1509, 1508, 415, 1548, 1542, 1509, 1488, 1496, 1502, - 1490, 1504, 1500, 1501, 1501, 1496, 1488, 1490, 1474, 1478, - 1491, 1491, 1483, 1473, 1476, 1490, 1630, 1476, 1484, 1487, - 1468, 1463, 1466, 1515, 1465, 1475, 1512, 459, 1474, 1462, - 1473, 1508, 1471, 1511, 1465, 400, 1455, 1471, 1452, 1454, - 1450, 1456, 1447, 1446, 1459, 1452, 1454, 1458, 1457, 1451, - 451, 1458, 1453, 1445, 1451, 1451, 1432, 1448, 1434, 1440, - 1447, 1435, 1428, 1442, 1441, 1444, 1426, 1434, 470, 1630, - 1630, 474, 1630, 1630, 1421, 0, 216, 1423, 491, 475, - 1476, 1630, 1430, 1630, 1474, 1630, 1468, 523, 1630, 451, + 1652, 505, 1574, 479, 1535, 1530, 1529, 444, 1570, 1564, + 1530, 1509, 1517, 1523, 1511, 1525, 1521, 1522, 1522, 1517, + 1509, 1511, 1495, 1499, 1512, 1512, 1504, 1494, 1497, 1511, + 1652, 1497, 1505, 1508, 1489, 1484, 1487, 1537, 1486, 1496, + 1534, 444, 1495, 1483, 1494, 1530, 486, 1534, 1471, 1486, + 445, 1476, 1492, 1473, 1475, 1471, 1477, 1468, 1467, 1480, + 1473, 1475, 1479, 1478, 1472, 80, 1479, 1474, 1466, 1472, + 1472, 1453, 1469, 1455, 1461, 1468, 1456, 1449, 1463, 1462, + 1465, 1447, 1455, 489, 1652, 1652, 490, 1652, 1652, 1442, + 0, 464, 1444, 501, 497, 1498, 1652, 1451, 472, 1652, - 1411, 1421, 1470, 1428, 481, 1630, 1426, 1467, 1423, 1420, - 1421, 514, 1425, 1462, 1413, 1408, 1405, 1401, 1403, 1451, - 1411, 1400, 1448, 1397, 544, 1410, 1410, 1393, 1394, 1407, - 1394, 1395, 1403, 1398, 1405, 1400, 1385, 467, 1394, 1397, - 1392, 1388, 1435, 482, 1380, 1630, 1382, 1381, 1374, 1376, - 1380, 1369, 1376, 1381, 513, 1425, 1381, 505, 1378, 1382, - 1380, 1369, 1369, 1381, 1363, 1355, 1356, 1377, 1359, 1371, - 1370, 1356, 1368, 1367, 1366, 1365, 1405, 1404, 1403, 1348, - 547, 1361, 1630, 1630, 1360, 0, 482, 1348, 1398, 1397, - 1356, 1395, 1630, 1344, 1630, 527, 592, 517, 1393, 1336, + 1496, 1652, 1490, 541, 1652, 500, 1432, 1442, 1492, 1449, + 480, 1652, 1447, 1489, 1444, 1441, 1442, 402, 1446, 1484, + 1434, 1429, 1426, 1422, 1424, 1473, 1432, 1421, 1470, 1418, + 536, 1431, 1431, 1414, 1415, 1428, 1415, 1416, 1424, 1419, + 1426, 1421, 1406, 475, 1415, 1418, 1413, 1409, 1457, 499, + 510, 1652, 1456, 1403, 1402, 1395, 1397, 1401, 1390, 1397, + 1402, 534, 1447, 1402, 521, 1399, 1403, 1401, 1390, 1390, + 1402, 1384, 1376, 1377, 1398, 1380, 1392, 1391, 1377, 1389, + 1388, 1387, 1386, 1427, 1426, 1425, 1369, 564, 1382, 1652, + 1652, 1381, 0, 510, 1369, 1420, 1419, 1377, 1417, 1652, - 1630, 1352, 1351, 1338, 1337, 1630, 1339, 1336, 1348, 1344, - 1332, 1334, 1630, 1340, 1325, 1327, 1338, 1336, 1331, 554, - 1338, 1320, 1368, 1630, 1318, 1334, 1365, 1369, 1328, 1322, - 1324, 1325, 1327, 1358, 1357, 1311, 1306, 1305, 1307, 1300, - 1315, 1293, 1300, 1305, 1352, 1630, 1300, 1296, 1349, 1298, - 1305, 1290, 1300, 1303, 1292, 1291, 1286, 1630, 1340, 1630, - 1285, 1284, 1277, 1294, 1330, 1278, 1283, 1292, 1286, 1290, - 566, 1324, 1289, 1269, 1272, 1271, 1279, 1283, 1266, 1321, - 1264, 1630, 1630, 1630, 1269, 1630, 1279, 1312, 1275, 0, - 1315, 1266, 1630, 1630, 1263, 1630, 1269, 497, 528, 569, + 1365, 1415, 1652, 544, 590, 545, 1414, 1356, 1652, 1372, + 1371, 1358, 1357, 1652, 1359, 1356, 1368, 1364, 1352, 1354, + 1652, 1360, 1345, 1347, 1358, 1356, 1351, 571, 1358, 1340, + 1389, 1652, 1338, 1354, 1386, 1390, 1348, 1342, 1344, 1345, + 1347, 1379, 1378, 1331, 1326, 1325, 1327, 1320, 1335, 1313, + 1320, 1325, 1373, 1652, 1320, 1316, 1370, 1652, 1318, 1325, + 1310, 1320, 1323, 1312, 1311, 1306, 1652, 1361, 1652, 1305, + 1304, 1297, 1314, 1351, 1298, 1303, 1312, 1306, 1310, 572, + 1345, 1309, 1289, 1292, 1291, 1299, 1303, 1286, 1342, 1284, + 1652, 1652, 1652, 1289, 1652, 1299, 1333, 1295, 0, 1336, - 1630, 1306, 1254, 1253, 1260, 1253, 1265, 1264, 1248, 1263, - 1292, 1260, 1295, 1242, 1244, 1256, 1256, 1255, 1630, 1240, - 1237, 1251, 1243, 1249, 1240, 1248, 1630, 1233, 1244, 1248, - 1230, 1244, 1243, 1241, 1224, 1218, 1223, 1220, 1235, 1236, - 1233, 1273, 1231, 1630, 1217, 1219, 1630, 1264, 1263, 22, - 1227, 1210, 1211, 1216, 1207, 1630, 1221, 1207, 573, 1199, - 1220, 1217, 1209, 1251, 1206, 1249, 1630, 1198, 1196, 1210, - 1213, 1244, 1243, 1191, 1241, 1240, 1630, 1234, 1202, 1191, - 1193, 1630, 1630, 1235, 1184, 1238, 527, 517, 512, 1198, - 1231, 1230, 1229, 1184, 1174, 1226, 1189, 1179, 1223, 1187, + 1286, 1652, 1652, 1283, 1652, 1289, 1652, 550, 558, 586, + 1652, 1327, 1274, 1273, 1280, 1273, 1285, 1284, 1268, 1283, + 1313, 1280, 1316, 1262, 1264, 1276, 1276, 1275, 1652, 1260, + 1257, 1271, 1263, 1269, 1260, 1268, 1652, 1253, 1264, 1268, + 1250, 1264, 1263, 1261, 1244, 1238, 1243, 1240, 1255, 1256, + 1253, 1294, 1251, 1652, 1237, 1239, 1652, 1285, 1284, 574, + 1247, 1230, 1231, 1236, 1227, 1652, 1241, 1227, 612, 1219, + 1240, 1237, 1229, 1272, 1226, 1270, 1652, 1218, 1216, 1230, + 1233, 1265, 1264, 1211, 1262, 1261, 1652, 578, 1223, 1212, + 1214, 1652, 1652, 1257, 1205, 1260, 564, 577, 548, 1219, - 1169, 1177, 1179, 1183, 1217, 1221, 1179, 1178, 1179, 1172, - 1161, 1174, 1177, 1172, 1167, 1172, 1169, 1168, 1160, 1170, - 1165, 1205, 1204, 1149, 1145, 1153, 1200, 1630, 1199, 1149, - 1141, 1156, 1143, 1630, 1143, 1152, 1151, 1151, 1135, 1189, - 1133, 1146, 1630, 1138, 1130, 1139, 1132, 1143, 1120, 1124, - 1174, 1122, 1120, 1131, 1170, 1118, 535, 536, 1112, 1122, - 520, 1171, 1130, 1119, 1123, 1130, 1166, 1630, 1160, 558, - 1114, 1122, 1114, 1105, 1108, 1104, 1121, 1116, 1104, 1115, - 1099, 1101, 1152, 1099, 1113, 1094, 1143, 1099, 1630, 1107, - 1105, 1096, 1105, 1101, 1141, 1084, 1084, 1097, 1096, 1081, + 1253, 1252, 1251, 1205, 1195, 1248, 1210, 1200, 1245, 1208, + 1190, 1198, 1200, 1204, 1239, 1243, 1200, 1199, 1200, 1193, + 1182, 1195, 1198, 1193, 1188, 1193, 1190, 1189, 1181, 1191, + 1186, 1227, 1226, 1170, 1166, 1174, 1222, 1652, 1221, 1170, + 1162, 1177, 1164, 1652, 1164, 1173, 1172, 1172, 1156, 1211, + 1154, 1167, 1652, 1159, 1151, 1160, 1153, 1164, 1141, 1145, + 1196, 1143, 1141, 1152, 1192, 1139, 569, 570, 1133, 1143, + 563, 1652, 1193, 1151, 1140, 1144, 1151, 1188, 1652, 1182, + 590, 1135, 1143, 1135, 1126, 1129, 1125, 1142, 1137, 1125, + 1136, 1120, 1122, 1174, 1120, 1134, 1115, 1165, 1120, 1652, - 1135, 1089, 1077, 1078, 1630, 1630, 1092, 1089, 1092, 1630, - 1630, 1091, 1076, 548, 1075, 1073, 9, 61, 129, 234, - 1630, 213, 280, 281, 355, 401, 404, 429, 575, 539, - 534, 530, 540, 544, 556, 551, 545, 547, 563, 553, - 605, 565, 579, 556, 1630, 613, 563, 578, 578, 1630, - 596, 604, 585, 575, 589, 582, 577, 584, 580, 589, - 584, 634, 640, 590, 1630, 602, 587, 603, 594, 606, - 601, 645, 614, 598, 599, 1630, 617, 600, 602, 657, - 603, 1630, 618, 623, 603, 622, 659, 620, 610, 628, - 612, 627, 619, 615, 633, 618, 1630, 1630, 626, 670, + 1128, 1126, 1117, 1126, 1122, 1163, 1105, 1105, 1118, 1117, + 1102, 1157, 1110, 1098, 1099, 1652, 1652, 1113, 1110, 1113, + 1652, 1652, 1112, 1097, 596, 1096, 1094, 9, 63, 120, + 235, 1652, 200, 216, 266, 416, 367, 452, 483, 553, + 508, 498, 527, 550, 574, 585, 580, 574, 583, 595, + 585, 639, 598, 603, 580, 1652, 638, 587, 602, 603, + 1652, 623, 631, 611, 601, 615, 609, 604, 605, 601, + 610, 605, 656, 662, 611, 1652, 623, 608, 624, 614, + 626, 620, 665, 633, 617, 619, 1652, 637, 621, 623, + 679, 624, 1652, 639, 644, 624, 643, 681, 641, 631, - 626, 1630, 634, 629, 679, 1630, 631, 636, 630, 632, - 644, 638, 636, 688, 635, 690, 691, 638, 1630, 637, - 645, 643, 642, 656, 657, 658, 673, 678, 653, 663, - 649, 656, 661, 668, 708, 709, 659, 663, 1630, 659, - 677, 674, 711, 663, 681, 682, 668, 676, 685, 665, - 686, 725, 726, 1630, 684, 730, 731, 682, 695, 697, - 681, 682, 689, 739, 689, 704, 742, 695, 699, 697, - 695, 747, 748, 701, 750, 746, 707, 1630, 712, 705, - 714, 708, 703, 713, 709, 1630, 704, 1630, 1630, 705, - 703, 722, 723, 724, 706, 711, 718, 750, 741, 714, + 649, 633, 648, 640, 636, 654, 639, 1652, 1652, 647, + 692, 647, 1652, 655, 650, 701, 1652, 652, 657, 651, + 653, 665, 659, 657, 710, 656, 712, 713, 659, 1652, + 658, 666, 664, 663, 677, 678, 679, 695, 700, 674, + 684, 670, 677, 682, 689, 730, 731, 680, 684, 1652, + 679, 698, 695, 733, 684, 702, 703, 689, 697, 706, + 686, 707, 747, 748, 1652, 703, 752, 753, 703, 716, + 718, 702, 703, 710, 761, 710, 725, 764, 716, 720, + 718, 716, 769, 770, 722, 772, 768, 728, 1652, 733, + 726, 735, 729, 724, 734, 730, 1652, 725, 1652, 1652, - 773, 719, 734, 726, 730, 1630, 1630, 740, 738, 724, - 725, 782, 738, 743, 730, 741, 733, 739, 735, 753, - 755, 1630, 1630, 753, 1630, 755, 1630, 740, 740, 761, - 751, 800, 756, 797, 1630, 755, 804, 1630, 805, 755, - 762, 803, 1630, 1630, 764, 1630, 755, 755, 758, 772, - 759, 770, 816, 776, 813, 819, 820, 770, 822, 823, - 785, 769, 781, 771, 800, 829, 790, 1630, 831, 781, - 777, 793, 798, 786, 837, 797, 1630, 799, 798, 800, - 793, 802, 803, 800, 790, 792, 848, 798, 850, 796, - 797, 853, 1630, 792, 808, 857, 1630, 1630, 808, 818, + 726, 724, 743, 744, 745, 727, 732, 739, 772, 763, + 735, 794, 740, 755, 747, 751, 1652, 1652, 761, 759, + 745, 746, 804, 759, 764, 751, 762, 754, 760, 756, + 774, 775, 1652, 1652, 774, 1652, 776, 1652, 761, 761, + 781, 772, 822, 777, 819, 1652, 776, 826, 1652, 827, + 776, 783, 825, 1652, 1652, 785, 1652, 776, 776, 779, + 793, 780, 791, 838, 797, 835, 841, 842, 791, 844, + 845, 806, 790, 802, 792, 822, 851, 811, 1652, 853, + 802, 798, 814, 819, 807, 859, 818, 1652, 820, 819, + 821, 814, 823, 824, 821, 811, 813, 870, 819, 872, - 803, 819, 805, 863, 865, 812, 867, 828, 1630, 820, - 822, 873, 1630, 1630, 820, 1630, 1630, 827, 876, 828, - 878, 860, 1630, 839, 1630, 826, 825, 828, 828, 829, - 886, 1630, 832, 888, 844, 835, 850, 850, 853, 853, - 850, 855, 1630, 847, 1630, 898, 858, 1630, 859, 861, - 858, 1630, 849, 855, 854, 866, 866, 1630, 1630, 904, - 1630, 870, 855, 861, 1630, 866, 877, 1630, 874, 1630, - 892, 912, 918, 863, 920, 921, 877, 1630, 923, 1630, - 864, 920, 886, 882, 923, 874, 879, 931, 890, 1630, - 933, 934, 898, 887, 937, 882, 899, 884, 899, 884, + 817, 818, 875, 1652, 813, 828, 879, 1652, 1652, 829, + 839, 824, 840, 826, 886, 887, 833, 889, 848, 1652, + 841, 843, 894, 1652, 1652, 841, 1652, 1652, 848, 898, + 849, 900, 882, 1652, 860, 1652, 847, 846, 849, 849, + 850, 908, 1652, 853, 910, 865, 856, 871, 871, 874, + 874, 871, 876, 1652, 868, 1652, 920, 879, 1652, 880, + 881, 879, 1652, 870, 876, 875, 887, 887, 1652, 1652, + 926, 1652, 891, 876, 882, 1652, 887, 898, 1652, 895, + 1652, 914, 934, 940, 884, 942, 943, 898, 1652, 945, + 1652, 885, 942, 907, 903, 945, 895, 900, 953, 911, - 939, 940, 906, 892, 903, 949, 921, 909, 1630, 952, - 1630, 1630, 902, 1630, 954, 903, 951, 897, 902, 960, - 911, 1630, 917, 1630, 1630, 908, 923, 1630, 960, 929, - 922, 923, 932, 919, 921, 931, 973, 925, 1630, 975, - 923, 1630, 928, 1630, 931, 926, 925, 982, 938, 1630, - 979, 942, 945, 987, 931, 933, 941, 931, 947, 941, - 957, 995, 1630, 991, 1630, 957, 993, 958, 949, 956, - 1630, 953, 958, 1004, 950, 1630, 954, 966, 967, 1009, - 954, 955, 963, 1630, 974, 964, 963, 966, 978, 969, - 978, 980, 1630, 1021, 982, 1023, 1024, 1630, 1020, 981, + 1652, 955, 956, 919, 908, 959, 903, 920, 905, 920, + 904, 961, 962, 927, 913, 924, 971, 943, 930, 1652, + 974, 1652, 1652, 923, 1652, 976, 924, 973, 918, 923, + 982, 932, 1652, 938, 1652, 1652, 929, 944, 1652, 982, + 950, 943, 944, 953, 940, 942, 952, 995, 946, 1652, + 997, 944, 1652, 948, 1652, 952, 947, 946, 1004, 959, + 1652, 1001, 963, 966, 1009, 952, 954, 962, 952, 968, + 962, 978, 1017, 1652, 1013, 1652, 978, 1015, 979, 970, + 977, 1652, 974, 979, 1026, 971, 1652, 975, 987, 988, + 1031, 975, 976, 984, 1652, 995, 985, 984, 987, 999, + + 990, 999, 1001, 1652, 1043, 1003, 1045, 1046, 1652, 1042, + 1002, 1007, 988, 1051, 1010, 1053, 1012, 1013, 1056, 1015, + 1652, 1020, 1652, 1652, 1002, 1008, 1061, 1022, 1652, 1008, + 1652, 1008, 1010, 1652, 1015, 1010, 1022, 1018, 1652, 1021, + 1025, 1016, 1068, 1017, 1033, 1026, 1021, 1036, 1027, 1034, + 1021, 1036, 1083, 1042, 1085, 1030, 1046, 1037, 1051, 1047, + 1652, 1091, 1652, 1092, 1093, 1050, 1049, 1050, 1652, 1652, + 1652, 1097, 1041, 1057, 1652, 1095, 1046, 1045, 1047, 1058, + 1105, 1056, 1652, 1065, 1108, 1652, 1652, 1114, 1119, 1124, + 1129, 1134, 1139, 1144, 1147, 1121, 1126, 1128, 1141 - 986, 967, 1029, 989, 1031, 991, 992, 1034, 994, 1630, - 999, 1630, 1630, 981, 987, 1039, 1001, 1630, 987, 1630, - 987, 989, 1630, 994, 989, 1001, 997, 1630, 1000, 1004, - 995, 1046, 996, 1012, 1005, 1000, 1015, 1006, 1013, 1000, - 1015, 1061, 1021, 1063, 1009, 1025, 1016, 1030, 1026, 1630, - 1069, 1630, 1070, 1071, 1029, 1028, 1029, 1630, 1630, 1630, - 1075, 1020, 1036, 1630, 1073, 1025, 1024, 1026, 1037, 1083, - 1035, 1630, 1044, 1086, 1630, 1630, 1092, 1097, 1102, 1107, - 1112, 1117, 1122, 1125, 1099, 1104, 1106, 1119 } ; -static const flex_int16_t yy_def[1289] = +static const flex_int16_t yy_def[1300] = { 0, - 1277, 1277, 1278, 1278, 1277, 1277, 1277, 1277, 1277, 1277, - 1276, 1276, 1276, 1276, 1276, 1279, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1280, - 1276, 1276, 1276, 1281, 15, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1282, 45, 45, 45, + 1288, 1288, 1289, 1289, 1288, 1288, 1288, 1288, 1288, 1288, + 1287, 1287, 1287, 1287, 1287, 1290, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1291, + 1287, 1287, 1287, 1292, 15, 1287, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1279, 1276, 1276, - 1276, 1276, 1276, 1276, 1283, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1280, 1276, 1281, 1276, + 45, 45, 45, 45, 45, 45, 45, 45, 1290, 1287, + 1287, 1287, 1287, 1287, 1287, 1294, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1291, 1287, 1292, - 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1284, 45, 1282, 45, 45, 45, 45, + 1287, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1295, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1283, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1285, 45, 45, 45, 1276, 45, 45, 1276, 45, - 45, 45, 45, 45, 45, 1284, 1276, 1282, 45, 45, + 45, 45, 45, 45, 45, 1294, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1296, 45, 45, 45, 1287, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 45, 1295, + + 1287, 1293, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1297, 45, 45, 45, 45, 45, 1287, 45, 45, 1287, + + 45, 1287, 45, 1293, 1287, 45, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, + 1287, 1287, 1298, 45, 45, 45, 45, 45, 45, 1287, + + 45, 45, 1287, 45, 1293, 45, 45, 45, 1287, 45, + 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1287, 45, 45, 45, 1287, 45, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1287, 1287, 1287, 45, 1287, 45, 45, 1287, 1299, 45, + + 45, 1287, 1287, 45, 1287, 45, 1287, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1287, 45, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 1287, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, + 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, + 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1286, 45, 45, 45, 45, - 45, 1276, 45, 1276, 45, 1276, 45, 1282, 1276, 45, - - 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 1276, 1276, 1287, 45, 45, 45, 45, - 45, 45, 1276, 45, 1276, 45, 1282, 45, 45, 45, - - 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1276, 1276, 1276, 45, 1276, 45, 45, 1276, 1288, - 45, 45, 1276, 1276, 45, 1276, 45, 45, 45, 45, - - 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1276, 45, 45, 1276, 45, 45, 45, - 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, - 45, 1276, 1276, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1287, 1287, 45, 45, 45, + 1287, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, - 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 1287, 1287, 45, + 45, 45, 1287, 45, 45, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, + 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 1287, 45, 1287, 1287, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1287, 1287, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1287, 1287, 45, 1287, 45, 1287, 45, 45, + 45, 45, 45, 45, 45, 1287, 45, 45, 1287, 45, + 45, 45, 45, 1287, 1287, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1276, 1276, 45, 45, 45, 1276, - 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1276, 45, 45, 45, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1276, 1276, 45, 45, + 45, 45, 45, 1287, 45, 45, 45, 1287, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, + 45, 45, 45, 1287, 1287, 45, 1287, 1287, 45, 45, + 45, 45, 45, 1287, 45, 1287, 45, 45, 45, 45, + 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1287, 45, 1287, 45, 45, 1287, 45, + 45, 45, 1287, 45, 45, 45, 45, 45, 1287, 1287, + 45, 1287, 45, 45, 45, 1287, 45, 45, 1287, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 1287, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1276, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, - 45, 45, 45, 45, 45, 1276, 45, 1276, 1276, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, + 45, 1287, 1287, 45, 1287, 45, 45, 45, 45, 45, + 45, 45, 1287, 45, 1287, 1287, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, + 45, 45, 1287, 45, 1287, 45, 45, 45, 45, 45, + 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1287, 45, 1287, 45, 45, 45, 45, + 45, 1287, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1276, 1276, 45, 45, 45, + 45, 45, 45, 1287, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1276, 1276, 45, 1276, 45, 1276, 45, 45, 45, - 45, 45, 45, 45, 1276, 45, 45, 1276, 45, 45, - 45, 45, 1276, 1276, 45, 1276, 45, 45, 45, 45, + 1287, 45, 1287, 1287, 45, 45, 45, 45, 1287, 45, + 1287, 45, 45, 1287, 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 45, - 45, 45, 45, 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 45, 45, 45, 1276, 1276, 45, 45, + 1287, 45, 1287, 45, 45, 45, 45, 45, 1287, 1287, + 1287, 45, 45, 45, 1287, 45, 45, 45, 45, 45, + 45, 45, 1287, 45, 45, 1287, 0, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287 - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 45, 45, 1276, 1276, 45, 1276, 1276, 45, 45, 45, - 45, 45, 1276, 45, 1276, 45, 45, 45, 45, 45, - 45, 1276, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 45, 1276, 45, 45, 1276, 45, 45, - 45, 1276, 45, 45, 45, 45, 45, 1276, 1276, 45, - 1276, 45, 45, 45, 1276, 45, 45, 1276, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 1276, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 1276, 1276, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 1276, 45, 1276, 1276, 45, 45, 1276, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1276, 45, - 45, 1276, 45, 1276, 45, 45, 45, 45, 45, 1276, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 45, 1276, 45, 45, 45, 45, 45, - 1276, 45, 45, 45, 45, 1276, 45, 45, 45, 45, - 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 45, 1276, 45, 45, 45, 45, 1276, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, - 45, 1276, 1276, 45, 45, 45, 45, 1276, 45, 1276, - 45, 45, 1276, 45, 45, 45, 45, 1276, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1276, - 45, 1276, 45, 45, 45, 45, 45, 1276, 1276, 1276, - 45, 45, 45, 1276, 45, 45, 45, 45, 45, 45, - 45, 1276, 45, 45, 1276, 0, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 } ; -static const flex_int16_t yy_nxt[1701] = +static const flex_int16_t yy_nxt[1724] = { 0, - 1276, 13, 14, 13, 1276, 15, 16, 1276, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 84, 795, - 37, 14, 37, 85, 25, 26, 38, 634, 189, 27, - 37, 14, 37, 42, 28, 42, 38, 90, 29, 100, - 30, 13, 14, 13, 89, 89, 25, 31, 13, 14, - 13, 102, 13, 14, 13, 32, 40, 190, 13, 14, - 13, 33, 40, 635, 90, 91, 89, 92, 34, 35, - 13, 14, 13, 101, 15, 16, 102, 17, 18, 19, - 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, - 39, 90, 91, 25, 26, 91, 107, 39, 27, 13, + 1287, 13, 14, 13, 1287, 15, 16, 1287, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 85, 806, + 37, 14, 37, 86, 25, 26, 38, 1287, 1287, 27, + 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, + 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, + 13, 14, 13, 13, 14, 13, 32, 40, 140, 13, + 14, 13, 33, 40, 115, 91, 92, 141, 90, 34, + 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, + 13, 108, 39, 90, 25, 26, 13, 14, 13, 27, - 14, 13, 42, 28, 42, 41, 87, 29, 87, 30, - 106, 88, 88, 88, 112, 25, 31, 41, 93, 42, - 796, 42, 94, 107, 32, 128, 119, 248, 249, 120, - 33, 121, 106, 122, 797, 129, 112, 34, 35, 44, - 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, - 45, 48, 49, 50, 51, 45, 52, 53, 45, 45, - 45, 45, 45, 54, 55, 56, 45, 45, 57, 45, - 45, 58, 45, 59, 60, 61, 62, 63, 64, 65, - 52, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 39, 84, 84, 84, 28, 42, 41, 42, 42, 29, + 42, 30, 82, 107, 41, 111, 93, 25, 31, 108, + 130, 137, 88, 807, 88, 808, 32, 89, 89, 89, + 131, 138, 33, 139, 371, 82, 107, 372, 111, 34, + 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 47, 45, 48, 49, 50, 51, 45, 52, 53, + 54, 45, 45, 45, 45, 55, 56, 45, 57, 45, + 45, 58, 45, 45, 59, 45, 60, 61, 62, 63, + 64, 65, 66, 52, 67, 68, 69, 70, 71, 72, - 75, 76, 77, 56, 45, 45, 45, 45, 45, 79, - 108, 80, 80, 80, 79, 237, 82, 82, 82, 83, - 83, 83, 81, 106, 110, 113, 102, 81, 138, 79, - 81, 82, 82, 82, 111, 132, 238, 139, 109, 798, - 133, 174, 81, 134, 81, 106, 110, 227, 113, 81, - 176, 117, 81, 387, 144, 123, 130, 118, 145, 124, - 175, 111, 125, 126, 81, 45, 174, 45, 45, 45, - 45, 799, 45, 45, 135, 127, 115, 176, 146, 45, - 45, 45, 387, 45, 136, 175, 137, 45, 228, 45, + 73, 74, 75, 76, 77, 78, 57, 45, 45, 45, + 45, 45, 80, 103, 81, 81, 81, 80, 109, 83, + 83, 83, 101, 114, 80, 82, 83, 83, 83, 121, + 82, 146, 122, 112, 123, 147, 124, 82, 163, 103, + 809, 103, 164, 113, 134, 221, 114, 110, 82, 135, + 191, 107, 136, 82, 192, 148, 112, 102, 222, 810, + 82, 45, 811, 45, 45, 45, 45, 119, 45, 45, + 45, 113, 117, 120, 107, 45, 45, 191, 45, 45, + 89, 89, 89, 193, 45, 132, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 140, 141, 150, 45, 142, 176, 193, 45, 112, - 147, 143, 148, 151, 149, 800, 45, 801, 152, 153, - 45, 154, 45, 116, 155, 156, 160, 110, 100, 162, - 161, 112, 163, 179, 193, 157, 219, 111, 158, 164, - 165, 170, 83, 83, 83, 166, 171, 174, 175, 110, - 802, 167, 220, 81, 79, 168, 80, 80, 80, 88, - 88, 88, 101, 87, 111, 87, 183, 81, 88, 88, - 88, 169, 177, 178, 79, 81, 82, 82, 82, 83, - 83, 83, 88, 88, 88, 99, 187, 81, 188, 81, + 45, 45, 45, 45, 45, 45, 45, 45, 89, 89, + 89, 45, 125, 812, 111, 45, 126, 241, 179, 127, + 128, 142, 143, 45, 177, 144, 152, 45, 199, 45, + 118, 145, 129, 149, 153, 150, 154, 151, 242, 112, + 157, 155, 156, 158, 159, 165, 179, 114, 166, 113, + 177, 199, 178, 177, 160, 167, 168, 161, 84, 84, + 84, 169, 112, 80, 170, 81, 81, 81, 171, 82, + 114, 84, 84, 84, 178, 179, 82, 113, 178, 180, + 173, 88, 82, 88, 172, 174, 89, 89, 89, 101, + 100, 80, 82, 83, 83, 83, 190, 100, 186, 82, - 81, 192, 99, 195, 183, 194, 183, 203, 208, 209, - 348, 214, 266, 215, 281, 217, 267, 204, 210, 81, - 268, 187, 81, 199, 188, 195, 281, 192, 218, 99, - 216, 194, 222, 99, 200, 223, 281, 99, 252, 224, - 279, 253, 254, 280, 279, 99, 258, 280, 284, 99, - 290, 99, 182, 198, 198, 198, 803, 349, 804, 287, - 198, 198, 198, 198, 198, 198, 291, 279, 280, 338, - 304, 282, 283, 295, 297, 287, 305, 290, 259, 260, - 261, 287, 198, 198, 198, 198, 198, 198, 387, 262, - 805, 263, 291, 264, 383, 295, 265, 300, 383, 392, + 181, 196, 195, 182, 82, 82, 197, 207, 198, 212, + 213, 231, 418, 218, 186, 219, 419, 208, 195, 214, + 223, 813, 190, 814, 102, 100, 186, 82, 196, 100, + 195, 203, 220, 100, 197, 198, 224, 226, 253, 254, + 227, 100, 204, 263, 228, 100, 247, 100, 185, 202, + 202, 202, 286, 232, 344, 355, 202, 202, 202, 202, + 202, 202, 257, 271, 284, 258, 259, 272, 284, 285, + 286, 273, 285, 295, 292, 286, 264, 265, 266, 202, + 202, 202, 202, 202, 202, 296, 299, 267, 301, 268, + 303, 269, 284, 289, 270, 285, 287, 292, 288, 292, - 297, 298, 298, 298, 364, 389, 390, 365, 298, 298, - 298, 298, 298, 298, 391, 491, 383, 398, 458, 339, - 384, 392, 340, 403, 410, 440, 441, 587, 411, 447, - 298, 298, 298, 298, 298, 298, 397, 397, 397, 448, - 404, 670, 491, 397, 397, 397, 397, 397, 397, 424, - 491, 462, 486, 587, 425, 463, 498, 487, 499, 519, - 588, 669, 671, 670, 520, 397, 397, 397, 397, 397, - 397, 567, 672, 459, 583, 743, 568, 500, 643, 589, - 806, 744, 498, 644, 499, 737, 739, 588, 669, 807, - 791, 752, 738, 740, 792, 808, 809, 810, 811, 426, + 310, 295, 394, 356, 402, 345, 311, 815, 346, 299, + 299, 301, 296, 390, 390, 396, 397, 303, 304, 304, + 304, 399, 306, 411, 398, 304, 304, 304, 304, 304, + 304, 394, 402, 351, 448, 449, 390, 391, 394, 467, + 412, 432, 402, 500, 399, 816, 433, 455, 304, 304, + 304, 304, 304, 304, 405, 405, 405, 456, 817, 818, + 819, 405, 405, 405, 405, 405, 405, 406, 471, 495, + 457, 500, 472, 508, 496, 509, 529, 577, 500, 644, + 597, 530, 578, 672, 405, 405, 405, 405, 405, 405, + 598, 593, 434, 673, 820, 468, 599, 435, 680, 682, + + 508, 681, 509, 45, 45, 45, 510, 597, 821, 683, + 45, 45, 45, 45, 45, 45, 645, 653, 598, 754, + 748, 750, 654, 763, 681, 755, 680, 749, 751, 822, + 823, 824, 825, 45, 45, 45, 45, 45, 45, 802, + 826, 827, 829, 803, 830, 831, 832, 833, 834, 835, + 836, 763, 837, 828, 838, 839, 840, 841, 842, 655, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 839, 861, + 862, 838, 863, 864, 865, 868, 869, 870, 871, 866, + 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, - 812, 813, 814, 815, 427, 45, 45, 45, 816, 818, - 819, 820, 45, 45, 45, 45, 45, 45, 752, 645, - 817, 821, 822, 823, 824, 825, 826, 827, 828, 829, - 830, 831, 832, 833, 45, 45, 45, 45, 45, 45, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 828, 844, 845, 827, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 857, 858, 859, 860, 855, 861, 862, - 863, 864, 865, 866, 867, 868, 869, 870, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 881, 871, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, - - 893, 894, 895, 896, 897, 898, 900, 899, 901, 902, - 903, 904, 905, 906, 907, 908, 909, 856, 910, 911, + 882, 893, 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 908, 909, 911, 910, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 898, 899, 924, 925, 927, 929, 930, 931, - 926, 932, 933, 934, 935, 936, 937, 938, 939, 940, - 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, - 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 928, 968, 969, + 867, 922, 923, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 909, 910, 936, 938, 940, + 941, 942, 937, 943, 944, 945, 946, 947, 948, 949, + 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 965, 986, 987, 988, - 989, 990, 966, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1022, 1050, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1051, - 1059, 1060, 1061, 1012, 1062, 1063, 1064, 1026, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, - 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 939, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 976, + 998, 999, 1000, 1001, 1002, 977, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1024, 1025, 1026, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, + 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1033, 1063, 1064, 1065, 1066, 1067, 1068, + 1062, 1069, 1070, 1071, 1072, 1073, 1023, 1074, 1075, 1076, - 1087, 1088, 1089, 1090, 1091, 1092, 1071, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, - 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1107, 1133, 1134, + 1037, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1082, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, - 1146, 1147, 1148, 1149, 1145, 1150, 1151, 1152, 1153, 1154, - 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, - 1165, 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, 1173, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1118, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1157, 1158, 1159, 1160, 1156, 1161, 1162, 1163, + 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, - 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, - 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, - 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, - 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, - 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, - 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, - 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, - 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, - 1274, 1275, 12, 12, 12, 12, 12, 36, 36, 36, + 1174, 1175, 1176, 1177, 1178, 1151, 1179, 1180, 1181, 1182, + 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, + 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 36, 36, 78, 286, 78, 78, 78, 97, 386, 97, - 490, 97, 99, 99, 99, 99, 99, 114, 114, 114, - 114, 114, 173, 99, 173, 173, 173, 196, 196, 196, - 794, 793, 790, 789, 788, 787, 786, 785, 784, 783, - 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, - 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, - 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, - 751, 750, 749, 748, 747, 746, 745, 742, 741, 736, - 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, - 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 12, 12, 12, 12, 12, 36, + 36, 36, 36, 36, 79, 291, 79, 79, 79, 98, + 393, 98, 499, 98, 100, 100, 100, 100, 100, 116, + 116, 116, 116, 116, 176, 100, 176, 176, 176, 200, + 200, 200, 805, 804, 801, 800, 799, 798, 797, 796, + 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, + 785, 784, 783, 782, 781, 780, 779, 778, 777, 776, + 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, + 765, 764, 762, 761, 760, 759, 758, 757, 756, 753, - 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, - 705, 704, 703, 702, 701, 700, 699, 698, 697, 696, - 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, - 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, - 675, 674, 673, 668, 667, 666, 665, 664, 663, 662, - 661, 660, 659, 658, 657, 656, 655, 654, 653, 652, - 651, 650, 649, 648, 647, 646, 642, 641, 640, 639, - 638, 637, 636, 633, 632, 631, 630, 629, 628, 627, - 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, - 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, + 752, 747, 746, 745, 744, 743, 742, 741, 740, 739, + 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, + 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, + 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, + 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, + 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, + 688, 687, 686, 685, 684, 679, 678, 677, 676, 675, + 674, 671, 670, 669, 668, 667, 666, 665, 664, 663, + 662, 661, 660, 659, 658, 657, 656, 652, 651, 650, + 649, 648, 647, 646, 643, 642, 641, 640, 639, 638, - 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, - 596, 595, 594, 593, 592, 591, 590, 586, 585, 584, - 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, - 573, 572, 571, 570, 569, 566, 565, 564, 563, 562, - 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, - 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, - 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, - 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, - 521, 518, 517, 516, 515, 514, 513, 512, 511, 510, - 509, 508, 507, 506, 505, 504, 503, 502, 501, 497, + 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, + 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, + 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, + 607, 606, 605, 604, 603, 602, 601, 600, 596, 595, + 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, + 584, 583, 582, 581, 580, 579, 576, 575, 574, 573, + 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, + 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, + 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, + 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, - 496, 495, 494, 493, 492, 489, 488, 485, 484, 483, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 472, 471, 470, 469, 468, 467, 466, 465, 464, 461, - 460, 457, 456, 455, 454, 453, 452, 451, 450, 449, - 446, 445, 444, 443, 442, 439, 438, 437, 436, 435, - 434, 433, 432, 431, 430, 429, 428, 423, 422, 421, - 420, 419, 418, 417, 416, 415, 414, 413, 412, 409, - 408, 407, 406, 405, 402, 401, 400, 399, 396, 395, - 394, 393, 388, 385, 382, 381, 380, 379, 378, 377, - 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, + 532, 531, 528, 527, 526, 525, 524, 523, 522, 521, + 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, + 507, 506, 505, 504, 503, 502, 501, 498, 497, 494, + 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, + 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, + 473, 470, 469, 466, 465, 464, 463, 462, 461, 460, + 459, 458, 454, 453, 452, 451, 450, 447, 446, 445, + 444, 443, 442, 441, 440, 439, 438, 437, 436, 431, + 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, + 420, 417, 416, 415, 414, 413, 410, 409, 408, 407, - 366, 363, 362, 361, 360, 359, 358, 357, 356, 355, - 354, 353, 352, 351, 350, 347, 346, 345, 344, 343, - 342, 341, 337, 336, 335, 334, 333, 332, 331, 330, - 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, - 319, 318, 317, 316, 315, 314, 313, 312, 311, 310, - 309, 308, 307, 306, 303, 302, 301, 299, 197, 296, - 294, 293, 292, 289, 288, 285, 278, 277, 276, 275, - 274, 273, 272, 271, 270, 269, 257, 256, 255, 251, - 250, 247, 246, 245, 244, 243, 242, 241, 240, 239, - 236, 235, 234, 233, 232, 231, 230, 229, 226, 225, + 404, 403, 401, 400, 395, 392, 389, 388, 387, 386, + 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, + 375, 374, 373, 370, 369, 368, 367, 366, 365, 364, + 363, 362, 361, 360, 359, 358, 357, 354, 353, 352, + 350, 349, 348, 347, 343, 342, 341, 340, 339, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 312, 309, 308, 307, 305, + 201, 302, 300, 298, 297, 294, 293, 290, 283, 282, + 281, 280, 279, 278, 277, 276, 275, 274, 262, 261, - 221, 213, 212, 211, 207, 206, 205, 202, 201, 197, - 191, 186, 185, 184, 181, 180, 172, 159, 131, 105, - 104, 103, 43, 98, 96, 95, 86, 43, 1276, 11, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 + 260, 256, 255, 252, 251, 250, 249, 248, 246, 245, + 244, 243, 240, 239, 238, 237, 236, 235, 234, 233, + 230, 229, 225, 217, 216, 215, 211, 210, 209, 206, + 205, 201, 194, 189, 188, 187, 184, 183, 175, 162, + 133, 106, 105, 104, 43, 99, 97, 96, 87, 43, + 1287, 11, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287 } ; -static const flex_int16_t yy_chk[1701] = +static const flex_int16_t yy_chk[1724] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 717, - 3, 3, 3, 21, 1, 1, 3, 550, 108, 1, - 4, 4, 4, 13, 1, 13, 4, 27, 1, 44, - 1, 5, 5, 5, 26, 31, 1, 1, 6, 6, - 6, 47, 7, 7, 7, 1, 7, 108, 8, 8, - 8, 1, 8, 550, 27, 28, 26, 31, 1, 1, - 2, 2, 2, 44, 2, 2, 47, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, - 5, 32, 28, 2, 2, 33, 52, 6, 2, 10, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 728, + 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, + 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, + 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, + 6, 6, 6, 7, 7, 7, 1, 7, 67, 8, + 8, 8, 1, 8, 57, 27, 28, 67, 26, 1, + 1, 2, 2, 2, 32, 2, 2, 33, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, + 9, 52, 5, 31, 2, 2, 10, 10, 10, 2, - 10, 10, 37, 2, 37, 9, 25, 2, 25, 2, - 51, 25, 25, 25, 55, 2, 2, 10, 32, 42, - 718, 42, 33, 52, 2, 61, 59, 154, 154, 59, - 2, 59, 51, 59, 719, 61, 55, 2, 2, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, + 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, + 62, 66, 25, 729, 25, 730, 2, 25, 25, 25, + 62, 66, 2, 66, 266, 20, 51, 266, 54, 2, + 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, - 53, 17, 17, 17, 19, 144, 19, 19, 19, 20, - 20, 20, 17, 62, 54, 56, 58, 19, 66, 22, - 20, 22, 22, 22, 54, 64, 144, 66, 53, 720, - 64, 89, 22, 64, 17, 62, 54, 135, 56, 19, - 91, 58, 20, 287, 68, 60, 62, 58, 68, 60, - 90, 54, 60, 60, 22, 45, 89, 45, 45, 45, - 45, 722, 45, 45, 65, 60, 57, 91, 68, 45, - 45, 45, 287, 57, 65, 90, 65, 45, 135, 45, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 17, 47, 17, 17, 17, 19, 53, 19, + 19, 19, 44, 56, 22, 17, 22, 22, 22, 60, + 19, 69, 60, 55, 60, 69, 60, 22, 74, 47, + 731, 59, 74, 55, 65, 131, 56, 53, 17, 65, + 108, 63, 65, 19, 109, 69, 55, 44, 131, 733, + 22, 45, 734, 45, 45, 45, 45, 59, 45, 45, + 45, 55, 58, 59, 63, 45, 45, 108, 45, 58, + 88, 88, 88, 109, 45, 63, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 57, 67, 67, 70, 57, 67, 94, 111, 57, 76, - 69, 67, 69, 70, 69, 723, 57, 724, 70, 70, - 57, 71, 57, 57, 71, 71, 73, 75, 99, 74, - 73, 76, 74, 94, 111, 71, 130, 75, 71, 74, - 74, 76, 79, 79, 79, 74, 76, 92, 93, 75, - 725, 75, 130, 79, 80, 75, 80, 80, 80, 87, - 87, 87, 99, 81, 75, 81, 102, 80, 81, 81, - 81, 75, 92, 93, 82, 79, 82, 82, 82, 83, - 83, 83, 88, 88, 88, 101, 106, 82, 107, 80, + 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, + 89, 58, 61, 735, 70, 58, 61, 146, 92, 61, + 61, 68, 68, 58, 90, 68, 71, 58, 115, 58, + 58, 68, 61, 70, 71, 70, 71, 70, 146, 76, + 72, 71, 71, 72, 72, 75, 92, 77, 75, 76, + 90, 115, 91, 93, 72, 75, 75, 72, 80, 80, + 80, 75, 76, 81, 76, 81, 81, 81, 76, 80, + 77, 84, 84, 84, 94, 95, 81, 76, 91, 93, + 77, 82, 84, 82, 76, 77, 82, 82, 82, 100, + 102, 83, 80, 83, 83, 83, 107, 102, 103, 81, - 83, 110, 101, 113, 102, 112, 117, 120, 124, 124, - 246, 128, 162, 128, 176, 129, 162, 120, 124, 82, - 162, 106, 83, 117, 107, 113, 179, 110, 129, 101, - 128, 112, 132, 101, 117, 132, 176, 101, 157, 132, - 174, 157, 157, 175, 177, 101, 161, 178, 179, 101, - 187, 101, 101, 116, 116, 116, 726, 246, 727, 183, - 116, 116, 116, 116, 116, 116, 188, 174, 175, 238, - 204, 177, 178, 193, 195, 200, 204, 187, 161, 161, - 161, 183, 116, 116, 116, 116, 116, 116, 300, 161, - 728, 161, 188, 161, 279, 193, 161, 200, 282, 290, + 94, 112, 111, 95, 83, 84, 113, 122, 114, 126, + 126, 137, 318, 130, 119, 130, 318, 122, 151, 126, + 132, 736, 107, 737, 100, 102, 103, 83, 112, 102, + 111, 119, 130, 102, 113, 114, 132, 134, 157, 157, + 134, 102, 119, 164, 134, 102, 151, 102, 102, 118, + 118, 118, 179, 137, 242, 251, 118, 118, 118, 118, + 118, 118, 160, 165, 177, 160, 160, 165, 180, 178, + 182, 165, 181, 190, 186, 179, 164, 164, 164, 118, + 118, 118, 118, 118, 118, 191, 195, 164, 197, 164, + 199, 164, 177, 182, 164, 178, 180, 186, 181, 204, - 195, 198, 198, 198, 261, 289, 289, 261, 198, 198, - 198, 198, 198, 198, 289, 387, 279, 300, 355, 238, - 282, 290, 238, 305, 312, 338, 338, 498, 312, 344, - 198, 198, 198, 198, 198, 198, 298, 298, 298, 344, - 305, 588, 387, 298, 298, 298, 298, 298, 298, 325, - 398, 358, 381, 498, 325, 358, 396, 381, 396, 420, - 499, 587, 589, 588, 420, 298, 298, 298, 298, 298, - 298, 471, 589, 355, 500, 661, 471, 398, 559, 500, - 729, 661, 396, 559, 396, 657, 658, 499, 587, 730, - 714, 670, 657, 658, 714, 731, 732, 733, 734, 325, + 208, 190, 292, 251, 299, 242, 208, 738, 242, 195, + 247, 197, 191, 284, 287, 294, 294, 199, 202, 202, + 202, 295, 204, 311, 294, 202, 202, 202, 202, 202, + 202, 292, 299, 247, 344, 344, 284, 287, 306, 362, + 311, 331, 351, 394, 295, 739, 331, 350, 202, 202, + 202, 202, 202, 202, 304, 304, 304, 350, 740, 741, + 742, 304, 304, 304, 304, 304, 304, 306, 365, 388, + 351, 394, 365, 404, 388, 404, 428, 480, 406, 560, + 508, 428, 480, 588, 304, 304, 304, 304, 304, 304, + 509, 510, 331, 588, 743, 362, 510, 331, 597, 599, - 735, 736, 737, 738, 325, 397, 397, 397, 739, 740, - 741, 742, 397, 397, 397, 397, 397, 397, 670, 559, - 739, 743, 744, 746, 747, 748, 749, 751, 752, 753, - 754, 755, 756, 757, 397, 397, 397, 397, 397, 397, - 758, 759, 760, 761, 762, 763, 764, 766, 767, 768, - 752, 769, 770, 751, 771, 772, 773, 774, 775, 777, - 778, 779, 780, 781, 783, 784, 785, 780, 786, 787, - 788, 789, 790, 791, 792, 793, 794, 795, 796, 799, - 800, 801, 803, 804, 805, 807, 808, 809, 795, 810, - 811, 812, 813, 814, 815, 816, 817, 818, 820, 821, + 404, 598, 404, 405, 405, 405, 406, 508, 744, 599, + 405, 405, 405, 405, 405, 405, 560, 569, 509, 671, + 667, 668, 569, 681, 598, 671, 597, 667, 668, 745, + 746, 747, 748, 405, 405, 405, 405, 405, 405, 725, + 749, 750, 751, 725, 752, 753, 754, 755, 757, 758, + 759, 681, 760, 750, 762, 763, 764, 765, 766, 569, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 777, + 778, 779, 780, 781, 782, 783, 784, 785, 763, 786, + 788, 762, 789, 790, 791, 792, 794, 795, 796, 791, + 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, - 822, 823, 824, 825, 826, 827, 829, 828, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 780, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 827, 828, 855, 856, 857, 858, 859, 860, - 856, 861, 862, 863, 864, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 877, 879, 880, - 881, 882, 883, 884, 885, 887, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 899, 900, 857, 901, 902, - 903, 904, 905, 908, 909, 910, 911, 912, 913, 914, - 915, 916, 917, 918, 919, 920, 898, 921, 924, 926, + 807, 810, 811, 812, 814, 815, 816, 818, 819, 820, + 806, 821, 822, 823, 824, 825, 826, 827, 828, 829, + 831, 832, 833, 834, 835, 836, 837, 838, 840, 839, + 841, 842, 843, 844, 845, 846, 847, 848, 849, 851, + 791, 852, 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 866, 838, 839, 867, 868, 869, + 870, 871, 867, 872, 873, 874, 875, 876, 877, 878, + 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, + 890, 891, 892, 893, 894, 895, 896, 898, 901, 902, + 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, - 928, 929, 899, 930, 931, 932, 933, 934, 936, 937, - 939, 940, 941, 942, 945, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 964, 965, 966, 967, 969, 970, 971, 972, - 973, 974, 975, 976, 978, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, 992, 994, - 965, 995, 996, 999, 1000, 1001, 1002, 1003, 1004, 995, - 1005, 1006, 1007, 955, 1008, 1010, 1011, 969, 1012, 1015, - 1018, 1019, 1020, 1021, 1022, 1024, 1026, 1027, 1028, 1029, - 1030, 1031, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, + 868, 913, 914, 915, 916, 919, 920, 921, 922, 923, + 924, 925, 926, 927, 928, 929, 930, 931, 932, 909, + 935, 937, 939, 940, 941, 910, 942, 943, 944, 945, + 947, 948, 950, 951, 952, 953, 956, 958, 959, 960, + 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, 980, 981, + 982, 983, 984, 985, 986, 987, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1005, 1006, 976, 1007, 1010, 1011, 1012, 1013, 1014, + 1006, 1015, 1016, 1017, 1018, 1019, 966, 1021, 1022, 1023, - 1041, 1042, 1044, 1046, 1047, 1049, 1022, 1050, 1051, 1053, - 1054, 1055, 1056, 1057, 1060, 1062, 1063, 1064, 1066, 1067, - 1069, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1079, 1081, - 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1091, 1092, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1071, 1100, 1101, - 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1110, 1113, 1115, - 1116, 1117, 1118, 1119, 1115, 1120, 1121, 1123, 1126, 1127, - 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1140, 1141, 1107, 1143, 1145, 1146, 1147, 1148, 1149, 1151, - 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, + 980, 1026, 1029, 1030, 1031, 1032, 1033, 1035, 1037, 1038, + 1039, 1040, 1041, 1042, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1055, 1057, 1058, 1060, 1061, 1033, + 1062, 1064, 1065, 1066, 1067, 1068, 1071, 1073, 1074, 1075, + 1077, 1078, 1080, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 1090, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, + 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1082, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1121, + 1124, 1126, 1127, 1128, 1129, 1130, 1126, 1131, 1132, 1134, + 1137, 1138, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, - 1162, 1164, 1166, 1167, 1168, 1169, 1170, 1172, 1173, 1174, - 1175, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1185, 1186, - 1187, 1188, 1189, 1190, 1191, 1192, 1194, 1195, 1196, 1197, - 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, - 1209, 1211, 1214, 1215, 1216, 1217, 1219, 1221, 1222, 1224, - 1225, 1226, 1227, 1229, 1230, 1231, 1232, 1233, 1234, 1235, - 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, - 1246, 1247, 1248, 1249, 1251, 1253, 1254, 1255, 1256, 1257, - 1261, 1262, 1263, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1273, 1274, 1277, 1277, 1277, 1277, 1277, 1278, 1278, 1278, + 1148, 1149, 1151, 1152, 1154, 1118, 1156, 1157, 1158, 1159, + 1160, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, + 1171, 1172, 1173, 1175, 1177, 1178, 1179, 1180, 1181, 1183, + 1184, 1185, 1186, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1205, 1206, + 1207, 1208, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, + 1218, 1219, 1220, 1222, 1225, 1226, 1227, 1228, 1230, 1232, + 1233, 1235, 1236, 1237, 1238, 1240, 1241, 1242, 1243, 1244, + 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, + 1255, 1256, 1257, 1258, 1259, 1260, 1262, 1264, 1265, 1266, - 1278, 1278, 1279, 1285, 1279, 1279, 1279, 1280, 1286, 1280, - 1287, 1280, 1281, 1281, 1281, 1281, 1281, 1282, 1282, 1282, - 1282, 1282, 1283, 1288, 1283, 1283, 1283, 1284, 1284, 1284, - 716, 715, 713, 712, 709, 708, 707, 704, 703, 702, - 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, - 691, 690, 688, 687, 686, 685, 684, 683, 682, 681, - 680, 679, 678, 677, 676, 675, 674, 673, 672, 671, - 669, 667, 666, 665, 664, 663, 662, 660, 659, 656, - 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, - 645, 644, 642, 641, 640, 639, 638, 637, 636, 635, + 1267, 1268, 1272, 1273, 1274, 1276, 1277, 1278, 1279, 1280, + 1281, 1282, 1284, 1285, 1288, 1288, 1288, 1288, 1288, 1289, + 1289, 1289, 1289, 1289, 1290, 1296, 1290, 1290, 1290, 1291, + 1297, 1291, 1298, 1291, 1292, 1292, 1292, 1292, 1292, 1293, + 1293, 1293, 1293, 1293, 1294, 1299, 1294, 1294, 1294, 1295, + 1295, 1295, 727, 726, 724, 723, 720, 719, 718, 715, + 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, + 704, 703, 702, 701, 699, 698, 697, 696, 695, 694, + 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, + 683, 682, 680, 678, 677, 676, 675, 674, 673, 670, - 633, 632, 631, 630, 629, 627, 626, 625, 624, 623, - 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, - 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, - 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, - 592, 591, 590, 586, 585, 584, 581, 580, 579, 578, - 576, 575, 574, 573, 572, 571, 570, 569, 568, 566, - 565, 564, 563, 562, 561, 560, 558, 557, 555, 554, - 553, 552, 551, 549, 548, 546, 545, 543, 542, 541, - 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, - 530, 529, 528, 526, 525, 524, 523, 522, 521, 520, + 669, 666, 665, 664, 663, 662, 661, 660, 659, 658, + 657, 656, 655, 654, 652, 651, 650, 649, 648, 647, + 646, 645, 643, 642, 641, 640, 639, 637, 636, 635, + 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, + 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, + 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, + 604, 603, 602, 601, 600, 596, 595, 594, 591, 590, + 589, 586, 585, 584, 583, 582, 581, 580, 579, 578, + 576, 575, 574, 573, 572, 571, 570, 568, 567, 565, + 564, 563, 562, 561, 559, 558, 556, 555, 553, 552, - 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, - 508, 507, 506, 505, 504, 503, 502, 497, 495, 492, - 491, 489, 488, 487, 485, 481, 480, 479, 478, 477, - 476, 475, 474, 473, 472, 470, 469, 468, 467, 466, - 465, 464, 463, 462, 461, 459, 457, 456, 455, 454, - 453, 452, 451, 450, 449, 448, 447, 445, 444, 443, - 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, - 432, 431, 430, 429, 428, 427, 426, 425, 423, 422, - 421, 419, 418, 417, 416, 415, 414, 412, 411, 410, - 409, 408, 407, 405, 404, 403, 402, 400, 399, 394, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 539, 538, 536, 535, 534, 533, 532, 531, + 530, 528, 527, 526, 525, 524, 523, 522, 521, 520, + 519, 518, 517, 516, 515, 514, 513, 512, 506, 504, + 501, 500, 498, 497, 496, 494, 490, 489, 488, 487, + 486, 485, 484, 483, 482, 481, 479, 478, 477, 476, + 475, 474, 473, 472, 471, 470, 468, 466, 465, 464, + 463, 462, 461, 460, 459, 457, 456, 455, 453, 452, + 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 431, - 392, 391, 390, 389, 388, 385, 382, 380, 379, 378, - 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, - 367, 366, 365, 364, 363, 362, 361, 360, 359, 357, - 356, 354, 353, 352, 351, 350, 349, 348, 347, 345, - 343, 342, 341, 340, 339, 337, 336, 335, 334, 333, - 332, 331, 330, 329, 328, 327, 326, 324, 323, 322, - 321, 320, 319, 318, 317, 316, 315, 314, 313, 311, - 310, 309, 308, 307, 304, 303, 302, 301, 297, 295, - 293, 291, 288, 285, 278, 277, 276, 275, 274, 273, - 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, + 430, 429, 427, 426, 425, 424, 423, 422, 420, 419, + 418, 417, 416, 415, 413, 412, 411, 410, 408, 407, + 402, 401, 399, 398, 397, 396, 395, 392, 389, 387, + 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, + 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, + 366, 364, 363, 361, 360, 359, 358, 357, 356, 355, + 354, 353, 349, 348, 347, 346, 345, 343, 342, 341, + 340, 339, 338, 337, 336, 335, 334, 333, 332, 330, + 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, + 319, 317, 316, 315, 314, 313, 310, 309, 308, 307, - 262, 260, 259, 258, 257, 256, 255, 254, 253, 252, - 251, 250, 249, 248, 247, 245, 244, 243, 242, 241, - 240, 239, 237, 236, 235, 234, 233, 232, 231, 230, - 229, 228, 226, 225, 224, 223, 222, 221, 220, 219, - 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, - 208, 207, 206, 205, 203, 202, 201, 199, 196, 194, - 192, 191, 190, 185, 184, 180, 172, 171, 170, 169, - 168, 167, 166, 165, 164, 163, 160, 159, 158, 156, - 155, 153, 152, 151, 150, 149, 148, 147, 146, 145, - 143, 142, 141, 140, 139, 138, 137, 136, 134, 133, + 303, 301, 298, 296, 293, 290, 283, 282, 281, 280, + 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, + 269, 268, 267, 265, 264, 263, 262, 261, 260, 259, + 258, 257, 256, 255, 254, 253, 252, 250, 249, 248, + 246, 245, 244, 243, 241, 240, 239, 238, 237, 236, + 235, 234, 233, 232, 230, 229, 228, 227, 226, 225, + 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, + 214, 213, 212, 211, 210, 209, 207, 206, 205, 203, + 200, 198, 196, 194, 193, 188, 187, 183, 175, 174, + 173, 172, 171, 170, 169, 168, 167, 166, 163, 162, - 131, 127, 126, 125, 123, 122, 121, 119, 118, 114, - 109, 105, 104, 103, 97, 96, 77, 72, 63, 50, - 49, 48, 43, 41, 39, 38, 24, 14, 11, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, - 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276 + 161, 159, 158, 156, 155, 154, 153, 152, 150, 149, + 148, 147, 145, 144, 143, 142, 141, 140, 139, 138, + 136, 135, 133, 129, 128, 127, 125, 124, 123, 121, + 120, 116, 110, 106, 105, 104, 98, 97, 78, 73, + 64, 50, 49, 48, 43, 41, 39, 38, 24, 14, + 11, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 1287, 1287, 1287 } ; static yy_state_type yy_last_accepting_state; @@ -1565,25 +1577,26 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[161] = +static const flex_int16_t yy_rule_linenum[164] = { 0, 145, 147, 149, 154, 155, 160, 161, 162, 174, 177, 182, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 325, 335, 345, 355, - 365, 384, 394, 404, 414, 423, 432, 441, 450, 459, - 468, 477, 489, 498, 507, 516, 525, 535, 545, 555, - 565, 576, 586, 596, 606, 616, 627, 638, 649, 660, - 669, 679, 688, 697, 713, 729, 738, 747, 756, 765, - 774, 783, 792, 801, 810, 819, 830, 855, 865, 875, - 884, 894, 904, 913, 922, 931, 940, 950, 959, 968, - 977, 986, 995, 1004, 1013, 1022, 1031, 1041, 1050, 1059, + 365, 375, 385, 395, 405, 415, 424, 433, 442, 451, + 460, 469, 478, 490, 499, 508, 517, 526, 536, 546, + 556, 566, 577, 587, 597, 607, 617, 628, 639, 650, + 661, 670, 680, 689, 698, 714, 730, 739, 748, 757, + 766, 775, 784, 793, 802, 811, 820, 831, 840, 849, + 858, 868, 878, 887, 897, 907, 916, 925, 934, 943, + 953, 962, 971, 980, 989, 998, 1007, 1016, 1025, 1034, - 1069, 1082, 1092, 1101, 1110, 1119, 1130, 1140, 1149, 1159, - 1169, 1178, 1187, 1196, 1205, 1215, 1224, 1234, 1243, 1252, - 1261, 1270, 1279, 1288, 1297, 1306, 1315, 1324, 1333, 1342, - 1351, 1360, 1369, 1378, 1387, 1396, 1405, 1414, 1423, 1432, - 1441, 1450, 1460, 1558, 1563, 1568, 1573, 1574, 1575, 1576, - 1577, 1578, 1580, 1598, 1611, 1616, 1620, 1622, 1624, 1626 + 1044, 1053, 1062, 1072, 1085, 1095, 1104, 1113, 1122, 1133, + 1143, 1152, 1162, 1172, 1181, 1190, 1199, 1208, 1218, 1227, + 1237, 1246, 1255, 1264, 1273, 1282, 1291, 1300, 1309, 1318, + 1327, 1336, 1345, 1354, 1363, 1372, 1381, 1390, 1399, 1408, + 1417, 1426, 1435, 1444, 1453, 1463, 1561, 1566, 1571, 1576, + 1577, 1578, 1579, 1580, 1581, 1583, 1601, 1614, 1619, 1623, + 1625, 1627, 1629 } ; /* The intent behind this definition is that it'll catch @@ -1636,7 +1649,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg) -#line 1639 "dhcp6_lexer.cc" +#line 1652 "dhcp6_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1662,8 +1675,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1665 "dhcp6_lexer.cc" -#line 1666 "dhcp6_lexer.cc" +#line 1678 "dhcp6_lexer.cc" +#line 1679 "dhcp6_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -1991,7 +2004,7 @@ YY_DECL } -#line 1994 "dhcp6_lexer.cc" +#line 2007 "dhcp6_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2020,13 +2033,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1277 ) + if ( yy_current_state >= 1288 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1276 ); + while ( yy_current_state != 1287 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2045,13 +2058,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 161 ) + else if ( yy_act < 164 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 161 ) + else if ( yy_act == 164 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 162 ) + else if ( yy_act == 165 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2400,20 +2413,10 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING("never", driver.loc_); } } - -(?i:\"never\") { - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_); -} YY_BREAK case 32: YY_RULE_SETUP -#line 384 "dhcp6_lexer.ll" +#line 375 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2426,7 +2429,20 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 394 "dhcp6_lexer.ll" +#line 385 "dhcp6_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 34: +YY_RULE_SETUP +#line 395 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2437,9 +2453,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 34: +case 35: YY_RULE_SETUP -#line 404 "dhcp6_lexer.ll" +#line 405 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2450,9 +2466,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 35: +case 36: YY_RULE_SETUP -#line 414 "dhcp6_lexer.ll" +#line 415 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -2462,9 +2478,9 @@ YY_RULE_SETUP } } YY_BREAK -case 36: +case 37: YY_RULE_SETUP -#line 423 "dhcp6_lexer.ll" +#line 424 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2474,9 +2490,9 @@ YY_RULE_SETUP } } YY_BREAK -case 37: +case 38: YY_RULE_SETUP -#line 432 "dhcp6_lexer.ll" +#line 433 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2486,9 +2502,9 @@ YY_RULE_SETUP } } YY_BREAK -case 38: +case 39: YY_RULE_SETUP -#line 441 "dhcp6_lexer.ll" +#line 442 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2498,9 +2514,9 @@ YY_RULE_SETUP } } YY_BREAK -case 39: +case 40: YY_RULE_SETUP -#line 450 "dhcp6_lexer.ll" +#line 451 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2510,9 +2526,9 @@ YY_RULE_SETUP } } YY_BREAK -case 40: +case 41: YY_RULE_SETUP -#line 459 "dhcp6_lexer.ll" +#line 460 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2522,9 +2538,9 @@ YY_RULE_SETUP } } YY_BREAK -case 41: +case 42: YY_RULE_SETUP -#line 468 "dhcp6_lexer.ll" +#line 469 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOSTS_DATABASE: @@ -2534,9 +2550,9 @@ YY_RULE_SETUP } } YY_BREAK -case 42: +case 43: YY_RULE_SETUP -#line 477 "dhcp6_lexer.ll" +#line 478 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2549,9 +2565,9 @@ YY_RULE_SETUP } } YY_BREAK -case 43: +case 44: YY_RULE_SETUP -#line 489 "dhcp6_lexer.ll" +#line 490 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2561,9 +2577,9 @@ YY_RULE_SETUP } } YY_BREAK -case 44: +case 45: YY_RULE_SETUP -#line 498 "dhcp6_lexer.ll" +#line 499 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2573,9 +2589,9 @@ YY_RULE_SETUP } } YY_BREAK -case 45: +case 46: YY_RULE_SETUP -#line 507 "dhcp6_lexer.ll" +#line 508 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2585,9 +2601,9 @@ YY_RULE_SETUP } } YY_BREAK -case 46: +case 47: YY_RULE_SETUP -#line 516 "dhcp6_lexer.ll" +#line 517 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2597,9 +2613,9 @@ YY_RULE_SETUP } } YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 525 "dhcp6_lexer.ll" +#line 526 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2610,9 +2626,9 @@ YY_RULE_SETUP } } YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 535 "dhcp6_lexer.ll" +#line 536 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2623,9 +2639,9 @@ YY_RULE_SETUP } } YY_BREAK -case 49: +case 50: YY_RULE_SETUP -#line 545 "dhcp6_lexer.ll" +#line 546 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2636,9 +2652,9 @@ YY_RULE_SETUP } } YY_BREAK -case 50: +case 51: YY_RULE_SETUP -#line 555 "dhcp6_lexer.ll" +#line 556 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2649,9 +2665,9 @@ YY_RULE_SETUP } } YY_BREAK -case 51: +case 52: YY_RULE_SETUP -#line 565 "dhcp6_lexer.ll" +#line 566 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2663,9 +2679,9 @@ YY_RULE_SETUP } } YY_BREAK -case 52: +case 53: YY_RULE_SETUP -#line 576 "dhcp6_lexer.ll" +#line 577 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2676,9 +2692,9 @@ YY_RULE_SETUP } } YY_BREAK -case 53: +case 54: YY_RULE_SETUP -#line 586 "dhcp6_lexer.ll" +#line 587 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2689,9 +2705,9 @@ YY_RULE_SETUP } } YY_BREAK -case 54: +case 55: YY_RULE_SETUP -#line 596 "dhcp6_lexer.ll" +#line 597 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2702,9 +2718,9 @@ YY_RULE_SETUP } } YY_BREAK -case 55: +case 56: YY_RULE_SETUP -#line 606 "dhcp6_lexer.ll" +#line 607 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2715,9 +2731,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 57: YY_RULE_SETUP -#line 616 "dhcp6_lexer.ll" +#line 617 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2729,9 +2745,9 @@ YY_RULE_SETUP } } YY_BREAK -case 57: +case 58: YY_RULE_SETUP -#line 627 "dhcp6_lexer.ll" +#line 628 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2743,9 +2759,9 @@ YY_RULE_SETUP } } YY_BREAK -case 58: +case 59: YY_RULE_SETUP -#line 638 "dhcp6_lexer.ll" +#line 639 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2757,9 +2773,9 @@ YY_RULE_SETUP } } YY_BREAK -case 59: +case 60: YY_RULE_SETUP -#line 649 "dhcp6_lexer.ll" +#line 650 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2771,9 +2787,9 @@ YY_RULE_SETUP } } YY_BREAK -case 60: +case 61: YY_RULE_SETUP -#line 660 "dhcp6_lexer.ll" +#line 661 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2783,9 +2799,9 @@ YY_RULE_SETUP } } YY_BREAK -case 61: +case 62: YY_RULE_SETUP -#line 669 "dhcp6_lexer.ll" +#line 670 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2796,9 +2812,9 @@ YY_RULE_SETUP } } YY_BREAK -case 62: +case 63: YY_RULE_SETUP -#line 679 "dhcp6_lexer.ll" +#line 680 "dhcp6_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2808,9 +2824,9 @@ YY_RULE_SETUP } } YY_BREAK -case 63: +case 64: YY_RULE_SETUP -#line 688 "dhcp6_lexer.ll" +#line 689 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2820,9 +2836,9 @@ YY_RULE_SETUP } } YY_BREAK -case 64: +case 65: YY_RULE_SETUP -#line 697 "dhcp6_lexer.ll" +#line 698 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2839,9 +2855,9 @@ YY_RULE_SETUP } } YY_BREAK -case 65: +case 66: YY_RULE_SETUP -#line 713 "dhcp6_lexer.ll" +#line 714 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2858,9 +2874,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 67: YY_RULE_SETUP -#line 729 "dhcp6_lexer.ll" +#line 730 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2870,9 +2886,9 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 68: YY_RULE_SETUP -#line 738 "dhcp6_lexer.ll" +#line 739 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2882,9 +2898,9 @@ YY_RULE_SETUP } } YY_BREAK -case 68: +case 69: YY_RULE_SETUP -#line 747 "dhcp6_lexer.ll" +#line 748 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2894,9 +2910,9 @@ YY_RULE_SETUP } } YY_BREAK -case 69: +case 70: YY_RULE_SETUP -#line 756 "dhcp6_lexer.ll" +#line 757 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2906,9 +2922,9 @@ YY_RULE_SETUP } } YY_BREAK -case 70: +case 71: YY_RULE_SETUP -#line 765 "dhcp6_lexer.ll" +#line 766 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2918,9 +2934,9 @@ YY_RULE_SETUP } } YY_BREAK -case 71: +case 72: YY_RULE_SETUP -#line 774 "dhcp6_lexer.ll" +#line 775 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2930,9 +2946,9 @@ YY_RULE_SETUP } } YY_BREAK -case 72: +case 73: YY_RULE_SETUP -#line 783 "dhcp6_lexer.ll" +#line 784 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2942,9 +2958,9 @@ YY_RULE_SETUP } } YY_BREAK -case 73: +case 74: YY_RULE_SETUP -#line 792 "dhcp6_lexer.ll" +#line 793 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2954,9 +2970,9 @@ YY_RULE_SETUP } } YY_BREAK -case 74: +case 75: YY_RULE_SETUP -#line 801 "dhcp6_lexer.ll" +#line 802 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2966,9 +2982,9 @@ YY_RULE_SETUP } } YY_BREAK -case 75: +case 76: YY_RULE_SETUP -#line 810 "dhcp6_lexer.ll" +#line 811 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -2978,9 +2994,9 @@ YY_RULE_SETUP } } YY_BREAK -case 76: +case 77: YY_RULE_SETUP -#line 819 "dhcp6_lexer.ll" +#line 820 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -2992,9 +3008,9 @@ YY_RULE_SETUP } } YY_BREAK -case 77: +case 78: YY_RULE_SETUP -#line 830 "dhcp6_lexer.ll" +#line 831 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3003,8 +3019,11 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); } } - -\"only\" { + YY_BREAK +case 79: +YY_RULE_SETUP +#line 840 "dhcp6_lexer.ll" +{ switch(driver.ctx_) { case isc::dhcp::Parser6Context::KNOWN_CLIENTS: return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); @@ -3012,8 +3031,11 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); } } - -\"subnet\" { + YY_BREAK +case 80: +YY_RULE_SETUP +#line 849 "dhcp6_lexer.ll" +{ switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: return isc::dhcp::Dhcp6Parser::make_SUBNET(driver.loc_); @@ -3022,9 +3044,9 @@ YY_RULE_SETUP } } YY_BREAK -case 78: +case 81: YY_RULE_SETUP -#line 855 "dhcp6_lexer.ll" +#line 858 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3035,9 +3057,9 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 82: YY_RULE_SETUP -#line 865 "dhcp6_lexer.ll" +#line 868 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3048,9 +3070,9 @@ YY_RULE_SETUP } } YY_BREAK -case 80: +case 83: YY_RULE_SETUP -#line 875 "dhcp6_lexer.ll" +#line 878 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3060,9 +3082,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 84: YY_RULE_SETUP -#line 884 "dhcp6_lexer.ll" +#line 887 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3073,9 +3095,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 85: YY_RULE_SETUP -#line 894 "dhcp6_lexer.ll" +#line 897 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3086,9 +3108,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 86: YY_RULE_SETUP -#line 904 "dhcp6_lexer.ll" +#line 907 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3098,9 +3120,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 87: YY_RULE_SETUP -#line 913 "dhcp6_lexer.ll" +#line 916 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3110,9 +3132,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 88: YY_RULE_SETUP -#line 922 "dhcp6_lexer.ll" +#line 925 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3122,9 +3144,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 89: YY_RULE_SETUP -#line 931 "dhcp6_lexer.ll" +#line 934 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3134,9 +3156,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 90: YY_RULE_SETUP -#line 940 "dhcp6_lexer.ll" +#line 943 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3147,9 +3169,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 91: YY_RULE_SETUP -#line 950 "dhcp6_lexer.ll" +#line 953 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3159,9 +3181,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 92: YY_RULE_SETUP -#line 959 "dhcp6_lexer.ll" +#line 962 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3171,9 +3193,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 93: YY_RULE_SETUP -#line 968 "dhcp6_lexer.ll" +#line 971 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3183,9 +3205,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 94: YY_RULE_SETUP -#line 977 "dhcp6_lexer.ll" +#line 980 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3195,9 +3217,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 95: YY_RULE_SETUP -#line 986 "dhcp6_lexer.ll" +#line 989 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3207,9 +3229,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 96: YY_RULE_SETUP -#line 995 "dhcp6_lexer.ll" +#line 998 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3219,9 +3241,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 97: YY_RULE_SETUP -#line 1004 "dhcp6_lexer.ll" +#line 1007 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3231,9 +3253,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 98: YY_RULE_SETUP -#line 1013 "dhcp6_lexer.ll" +#line 1016 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3243,9 +3265,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 99: YY_RULE_SETUP -#line 1022 "dhcp6_lexer.ll" +#line 1025 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3255,9 +3277,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 100: YY_RULE_SETUP -#line 1031 "dhcp6_lexer.ll" +#line 1034 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3267,9 +3289,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 101: YY_RULE_SETUP -#line 1041 "dhcp6_lexer.ll" +#line 1044 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3279,9 +3301,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 102: YY_RULE_SETUP -#line 1050 "dhcp6_lexer.ll" +#line 1053 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3291,9 +3313,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 103: YY_RULE_SETUP -#line 1059 "dhcp6_lexer.ll" +#line 1062 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3304,9 +3326,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 104: YY_RULE_SETUP -#line 1069 "dhcp6_lexer.ll" +#line 1072 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3320,9 +3342,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 105: YY_RULE_SETUP -#line 1082 "dhcp6_lexer.ll" +#line 1085 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3333,9 +3355,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 106: YY_RULE_SETUP -#line 1092 "dhcp6_lexer.ll" +#line 1095 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3345,9 +3367,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 107: YY_RULE_SETUP -#line 1101 "dhcp6_lexer.ll" +#line 1104 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3357,9 +3379,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 108: YY_RULE_SETUP -#line 1110 "dhcp6_lexer.ll" +#line 1113 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3369,9 +3391,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 109: YY_RULE_SETUP -#line 1119 "dhcp6_lexer.ll" +#line 1122 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3383,9 +3405,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 110: YY_RULE_SETUP -#line 1130 "dhcp6_lexer.ll" +#line 1133 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3396,9 +3418,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 111: YY_RULE_SETUP -#line 1140 "dhcp6_lexer.ll" +#line 1143 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3408,9 +3430,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 112: YY_RULE_SETUP -#line 1149 "dhcp6_lexer.ll" +#line 1152 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3421,9 +3443,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 113: YY_RULE_SETUP -#line 1159 "dhcp6_lexer.ll" +#line 1162 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3434,9 +3456,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 114: YY_RULE_SETUP -#line 1169 "dhcp6_lexer.ll" +#line 1172 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3446,9 +3468,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 115: YY_RULE_SETUP -#line 1178 "dhcp6_lexer.ll" +#line 1181 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3458,9 +3480,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 116: YY_RULE_SETUP -#line 1187 "dhcp6_lexer.ll" +#line 1190 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3470,9 +3492,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 117: YY_RULE_SETUP -#line 1196 "dhcp6_lexer.ll" +#line 1199 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3482,9 +3504,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 118: YY_RULE_SETUP -#line 1205 "dhcp6_lexer.ll" +#line 1208 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3495,9 +3517,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 119: YY_RULE_SETUP -#line 1215 "dhcp6_lexer.ll" +#line 1218 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3507,9 +3529,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 120: YY_RULE_SETUP -#line 1224 "dhcp6_lexer.ll" +#line 1227 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3519,9 +3541,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 121: YY_RULE_SETUP -#line 1234 "dhcp6_lexer.ll" +#line 1237 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3531,9 +3553,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 122: YY_RULE_SETUP -#line 1243 "dhcp6_lexer.ll" +#line 1246 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3543,9 +3565,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 123: YY_RULE_SETUP -#line 1252 "dhcp6_lexer.ll" +#line 1255 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3555,9 +3577,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 124: YY_RULE_SETUP -#line 1261 "dhcp6_lexer.ll" +#line 1264 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3567,9 +3589,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 125: YY_RULE_SETUP -#line 1270 "dhcp6_lexer.ll" +#line 1273 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3579,9 +3601,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 126: YY_RULE_SETUP -#line 1279 "dhcp6_lexer.ll" +#line 1282 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3591,9 +3613,9 @@ YY_RULE_SETUP } } YY_BREAK -case 124: +case 127: YY_RULE_SETUP -#line 1288 "dhcp6_lexer.ll" +#line 1291 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3603,9 +3625,9 @@ YY_RULE_SETUP } } YY_BREAK -case 125: +case 128: YY_RULE_SETUP -#line 1297 "dhcp6_lexer.ll" +#line 1300 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3615,9 +3637,9 @@ YY_RULE_SETUP } } YY_BREAK -case 126: +case 129: YY_RULE_SETUP -#line 1306 "dhcp6_lexer.ll" +#line 1309 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3627,9 +3649,9 @@ YY_RULE_SETUP } } YY_BREAK -case 127: +case 130: YY_RULE_SETUP -#line 1315 "dhcp6_lexer.ll" +#line 1318 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3639,9 +3661,9 @@ YY_RULE_SETUP } } YY_BREAK -case 128: +case 131: YY_RULE_SETUP -#line 1324 "dhcp6_lexer.ll" +#line 1327 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3651,9 +3673,9 @@ YY_RULE_SETUP } } YY_BREAK -case 129: +case 132: YY_RULE_SETUP -#line 1333 "dhcp6_lexer.ll" +#line 1336 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3663,9 +3685,9 @@ YY_RULE_SETUP } } YY_BREAK -case 130: +case 133: YY_RULE_SETUP -#line 1342 "dhcp6_lexer.ll" +#line 1345 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3675,9 +3697,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 134: YY_RULE_SETUP -#line 1351 "dhcp6_lexer.ll" +#line 1354 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3687,9 +3709,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 135: YY_RULE_SETUP -#line 1360 "dhcp6_lexer.ll" +#line 1363 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3699,9 +3721,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 136: YY_RULE_SETUP -#line 1369 "dhcp6_lexer.ll" +#line 1372 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3711,9 +3733,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 137: YY_RULE_SETUP -#line 1378 "dhcp6_lexer.ll" +#line 1381 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3723,9 +3745,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 138: YY_RULE_SETUP -#line 1387 "dhcp6_lexer.ll" +#line 1390 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3735,9 +3757,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 139: YY_RULE_SETUP -#line 1396 "dhcp6_lexer.ll" +#line 1399 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3747,9 +3769,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 140: YY_RULE_SETUP -#line 1405 "dhcp6_lexer.ll" +#line 1408 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3759,9 +3781,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 141: YY_RULE_SETUP -#line 1414 "dhcp6_lexer.ll" +#line 1417 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3771,9 +3793,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 142: YY_RULE_SETUP -#line 1423 "dhcp6_lexer.ll" +#line 1426 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3783,9 +3805,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 143: YY_RULE_SETUP -#line 1432 "dhcp6_lexer.ll" +#line 1435 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3795,9 +3817,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 144: YY_RULE_SETUP -#line 1441 "dhcp6_lexer.ll" +#line 1444 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3807,9 +3829,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 145: YY_RULE_SETUP -#line 1450 "dhcp6_lexer.ll" +#line 1453 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3819,9 +3841,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 146: YY_RULE_SETUP -#line 1460 "dhcp6_lexer.ll" +#line 1463 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3920,65 +3942,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 144: -/* rule 144 can match eol */ +case 147: +/* rule 147 can match eol */ YY_RULE_SETUP -#line 1558 "dhcp6_lexer.ll" +#line 1561 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 145: -/* rule 145 can match eol */ +case 148: +/* rule 148 can match eol */ YY_RULE_SETUP -#line 1563 "dhcp6_lexer.ll" +#line 1566 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 146: +case 149: YY_RULE_SETUP -#line 1568 "dhcp6_lexer.ll" +#line 1571 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 147: -YY_RULE_SETUP -#line 1573 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 148: -YY_RULE_SETUP -#line 1574 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 149: -YY_RULE_SETUP -#line 1575 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } - YY_BREAK case 150: YY_RULE_SETUP #line 1576 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } +{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP #line 1577 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } +{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP #line 1578 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } +{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP +#line 1579 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } + YY_BREAK +case 154: +YY_RULE_SETUP #line 1580 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 1581 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } + YY_BREAK +case 156: +YY_RULE_SETUP +#line 1583 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3997,9 +4019,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 154: +case 157: YY_RULE_SETUP -#line 1598 "dhcp6_lexer.ll" +#line 1601 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4013,43 +4035,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 155: +case 158: YY_RULE_SETUP -#line 1611 "dhcp6_lexer.ll" +#line 1614 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 156: +case 159: YY_RULE_SETUP -#line 1616 "dhcp6_lexer.ll" +#line 1619 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 157: -YY_RULE_SETUP -#line 1620 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK -case 158: -YY_RULE_SETUP -#line 1622 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK -case 159: -YY_RULE_SETUP -#line 1624 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); - YY_BREAK case 160: YY_RULE_SETUP -#line 1626 "dhcp6_lexer.ll" +#line 1623 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); + YY_BREAK +case 161: +YY_RULE_SETUP +#line 1625 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK +case 162: +YY_RULE_SETUP +#line 1627 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 163: +YY_RULE_SETUP +#line 1629 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1628 "dhcp6_lexer.ll" +#line 1631 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4073,12 +4095,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 161: +case 164: YY_RULE_SETUP -#line 1651 "dhcp6_lexer.ll" +#line 1654 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4078 "dhcp6_lexer.cc" +#line 4103 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4397,7 +4419,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1277 ) + if ( yy_current_state >= 1288 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4430,11 +4452,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1277 ) + if ( yy_current_state >= 1288 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1276); + yy_is_jam = (yy_current_state == 1287); return yy_is_jam ? 0 : yy_current_state; } @@ -5183,7 +5205,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1651 "dhcp6_lexer.ll" +#line 1654 "dhcp6_lexer.ll" using namespace isc::dhcp; From 3f877a825ad0835128ab0b41f55d0ff945afbf1b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 20 Nov 2017 00:27:46 +0100 Subject: [PATCH 15/52] [5425] Added basic support (alloc engine todo) --- doc/examples/kea4/advanced.json | 21 +++++++++++++ doc/examples/kea6/advanced.json | 23 +++++++++++++- doc/guide/dhcp4-srv.xml | 9 ++++++ doc/guide/dhcp6-srv.xml | 9 ++++++ src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 31 ++++++++++++++++++- src/lib/dhcpsrv/parsers/dhcp_parsers.h | 1 + src/lib/dhcpsrv/pool.cc | 8 +++++ src/lib/dhcpsrv/pool.h | 20 ++++++++++++ src/lib/dhcpsrv/subnet.cc | 14 +++++++++ .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 4 ++- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 8 +++-- src/lib/dhcpsrv/tests/pool_unittest.cc | 30 +++++++++++++++++- 12 files changed, 172 insertions(+), 6 deletions(-) diff --git a/doc/examples/kea4/advanced.json b/doc/examples/kea4/advanced.json index 327047bcd2..34b062e269 100644 --- a/doc/examples/kea4/advanced.json +++ b/doc/examples/kea4/advanced.json @@ -137,6 +137,27 @@ "relay": { "ip-address": "192.168.1.1" } + }, + { + // This subnet is divided in two pools for unknown and + // known (i.e. which have a reservation) clients. + "pools": [ + { + "pool": "192.0.8.100 - 192.0.8.200", + "known-clients": "never" + }, + { + "pool": "192.0.9.100 - 192.0.9.200", + "known-clients": "only" + } + ], + "subnet": "192.0.8.0/23", + "reservations": [ + { "hw-address": "00:00:00:11:22:33" }, + { "hw-address": "00:00:00:44:55:66" }, + { "hw-address": "00:00:00:77:88:99" }, + { "hw-address": "00:00:00:aa:bb:cc" } + ] } ] }, diff --git a/doc/examples/kea6/advanced.json b/doc/examples/kea6/advanced.json index a8e67ee973..7a6a50a152 100644 --- a/doc/examples/kea6/advanced.json +++ b/doc/examples/kea6/advanced.json @@ -133,7 +133,28 @@ // and another is when there is a shared subnet scenario. "relay": { "ip-address": "3000::1" - } + }, + }, + { + // This subnet is divided in two pools for unknown and + // known (i.e. which have a reservation) clients. + "pools": [ + { + "pool": "2001:db8:8::/64", + "known-clients": "never" + }, + { + "pool": "2001:db8:9::/64", + "known-clients": "only" + } + ], + "subnet": "2001:db8:8::/46", + "reservations": [ + { "hw-address": "00:00:00:11:22:33" }, + { "hw-address": "00:00:00:44:55:66" }, + { "hw-address": "00:00:00:77:88:99" }, + { "hw-address": "00:00:00:aa:bb:cc" } + ] } ] }, diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index bdd58cf015..34f2fd9e81 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2090,6 +2090,15 @@ It is merely echoed by the server at the pool level, see . + + In a similar way a pool can be constrained to serve only known clients, + i.e. clients which have a reservation, using + "known-clients": "only", or only unknown clients + with "known-clients": "never". One can assign + addresses to registered clients without giving a different address per + reservations, for instance when there is not enough available addresses. + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index a577843c37..1ac0cf5aac 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1950,6 +1950,15 @@ should include options from the isc option space: linkend="classification-pools"/>. + + In a similar way a pool can be constrained to serve only known clients, + i.e. clients which have a reservation, using + "known-clients": "only", or only unknown clients + with "known-clients": "never". One can assign + prefixes to registered clients without giving a different prefix per + reservations, forinstance when there is not enough available prefixes. + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 4499cbe4aa..a384dbf135 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -387,6 +387,19 @@ PoolParser::parse(PoolStoragePtr pools, pool->allowClientClass(cclass); } } + + // Known-clients. + ConstElementPtr known_clients = pool_structure->get("known-clients"); + if (known_clients) { + string kc = known_clients->stringValue(); + if (kc == "only") { + pool->setKnownClients(Pool::SERVE_KNOWN); + } else if (kc == "never") { + pool->setKnownClients(Pool::SERVE_UNKNOWN); + } else + isc_throw(DhcpConfigError, "invalid known-clients value: " << kc + << " (" << known_clients->getPosition() << ")"); + } } //****************************** Pool4Parser ************************* @@ -861,6 +874,11 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { client_class_ = client_class; } + ConstElementPtr known_clients = pd_pool_->get("known-clients"); + if (known_clients) { + known_clients_ = known_clients; + } + // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. try { @@ -884,7 +902,6 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { pool_->setContext(user_context_); } - if (client_class_) { string cclass = client_class_->stringValue(); if (!cclass.empty()) { @@ -892,6 +909,18 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { } } + if (known_clients_) { + string kc = known_clients_->stringValue(); + if (kc == "only") { + pool_->setKnownClients(Pool::SERVE_KNOWN); + } else if (kc == "never") { + pool_->setKnownClients(Pool::SERVE_UNKNOWN); + } else + isc_throw(isc::dhcp::DhcpConfigError, + "invalid known-clients value: " << kc + << " (" << known_clients_->getPosition() << ")"); + } + // Add the local pool to the external storage ptr. pools->push_back(pool_); } diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.h b/src/lib/dhcpsrv/parsers/dhcp_parsers.h index e195cd4bad..adabdb7732 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.h +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.h @@ -655,6 +655,7 @@ private: isc::data::ConstElementPtr client_class_; + isc::data::ConstElementPtr known_clients_; }; /// @brief Parser for a list of prefix delegation pools. diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 3e41426eac..da3258f2b9 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -19,6 +19,7 @@ Pool::Pool(Lease::Type type, const isc::asiolink::IOAddress& first, const isc::asiolink::IOAddress& last) :id_(getNextID()), first_(first), last_(last), type_(type), capacity_(0), cfg_option_(new CfgOption()), white_list_(), + known_clients_(SERVE_BOTH), last_allocated_(first), last_allocated_valid_(false) { } @@ -121,6 +122,13 @@ Pool::toElement() const { map->set("client-class", Element::create(*cclasses.cbegin())); } + // Set known-clients + KnownClients kc = getKnownClients(); + if (kc != SERVE_BOTH) { + map->set("known-clients", + Element::create(kc == SERVE_KNOWN ? "only" : "never")); + } + return (map); } diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index 5254ea5ca5..d74022ac33 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -28,6 +28,13 @@ namespace dhcp { class Pool { public: + /// @brief Value of known clients + typedef enum { + SERVE_BOTH = 0, ///< the pool serves both known and unknown clients + SERVE_KNOWN = 1, ///< the pool serves only known clients + SERVE_UNKNOWN = 2 ///< the pool never serves known clients + } KnownClients; + /// @note: /// PoolType enum was removed. Please use Lease::Type instead @@ -133,6 +140,16 @@ public: return (white_list_); } + /// @brief Returns the value of known clients + KnownClients getKnownClients() const { + return (known_clients_); + } + + /// @brief Sets the value of known clients + void setKnownClients(KnownClients known_clients) { + known_clients_ = known_clients; + } + /// @brief returns the last address that was tried from this pool /// /// @return address/prefix that was last tried from this pool @@ -222,6 +239,9 @@ protected: /// @ref Network::white_list_ ClientClasses white_list_; + /// @brief Value of known clients + KnownClients known_clients_; + /// @brief Pointer to the user context (may be NULL) data::ConstElementPtr user_context_; diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index a07a9c47c0..8585264aa9 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -742,6 +742,13 @@ Subnet6::toElement() const { } else if (!cclasses.empty()) { pool_map->set("client-class", Element::create(*cclasses.cbegin())); } + // Set known-clients + Pool::KnownClients kc = (*pool)->getKnownClients(); + if (kc != Pool::SERVE_BOTH) { + pool_map->set("known-clients", + Element::create(kc == Pool::SERVE_KNOWN ? + "only" : "never")); + } // Push on the pool list pool_list->add(pool_map); } @@ -804,6 +811,13 @@ Subnet6::toElement() const { } else if (!cclasses.empty()) { pool_map->set("client-class", Element::create(*cclasses.cbegin())); } + // Set known-clients + Pool::KnownClients kc = pdpool->getKnownClients(); + if (kc != Pool::SERVE_BOTH) { + pool_map->set("known-clients", + Element::create(kc == Pool::SERVE_KNOWN ? + "only" : "never")); + } // Push on the pool list pdpool_list->add(pool_map); } diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index 0e5e0c59ed..c97c7bee84 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -813,6 +813,7 @@ TEST(CfgSubnets4Test, unparsePool) { Pool4Ptr pool1(new Pool4(IOAddress("192.0.2.1"), IOAddress("192.0.2.10"))); Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); pool2->allowClientClass("bar"); + pool2->setKnownClients(Pool::SERVE_KNOWN); subnet->addPool(pool1); subnet->addPool(pool2); @@ -843,7 +844,8 @@ TEST(CfgSubnets4Test, unparsePool) { " },{\n" " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\",\n" - " \"client-class\": \"bar\"\n" + " \"client-class\": \"bar\",\n" + " \"known-clients\": \"only\"\n" " }\n" " ]\n" "} ]\n"; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index df09f3301f..d12cada956 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -504,6 +504,7 @@ TEST(CfgSubnets6Test, unparsePool) { IOAddress("2001:db8:1::199"))); Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); pool2->allowClientClass("bar"); + pool2->setKnownClients(Pool::SERVE_UNKNOWN); subnet->addPool(pool1); subnet->addPool(pool2); @@ -528,7 +529,8 @@ TEST(CfgSubnets6Test, unparsePool) { " },{\n" " \"pool\": \"2001:db8:1:1::/64\",\n" " \"option-data\": [ ],\n" - " \"client-class\": \"bar\"\n" + " \"client-class\": \"bar\",\n" + " \"known-clients\": \"never\"\n" " }\n" " ],\n" " \"pd-pools\": [ ],\n" @@ -550,6 +552,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { Pool6Ptr pdpool2(new Pool6(IOAddress("2001:db8:3::"), 48, 56, IOAddress("2001:db8:3::"), 64)); pdpool2->allowClientClass("bar"); + pdpool2->setKnownClients(Pool::SERVE_KNOWN); subnet->addPool(pdpool1); subnet->addPool(pdpool2); @@ -581,7 +584,8 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"excluded-prefix\": \"2001:db8:3::\",\n" " \"excluded-prefix-len\": 64,\n" " \"option-data\": [ ],\n" - " \"client-class\": \"bar\"\n" + " \"client-class\": \"bar\",\n" + " \"known-clients\": \"only\"\n" " }\n" " ],\n" " \"option-data\": [ ]\n" diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index 5662f6a5ce..d720c2b023 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -268,6 +268,20 @@ TEST(Pool4Test, clientClasses) { EXPECT_TRUE(pool->clientSupported(bar_class)); } +// This test checks that handling for known-clients is valid. +TEST(Pool4Test, knownClients) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This pool serves everybody by default. + EXPECT_EQ(Pool::SERVE_BOTH, pool->getKnownClients()); + + // Set it to only known clients. + pool->setKnownClients(Pool::SERVE_KNOWN); + EXPECT_EQ(Pool::SERVE_KNOWN,pool->getKnownClients()); +} + // This test checks that handling for last allocated address/prefix is valid. TEST(Pool4Test, lastAllocated) { // Create a pool. @@ -638,7 +652,7 @@ TEST(Pool6Test, clientClass) { TEST(Pool6Test, clientClasses) { // Create a pool. Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), - IOAddress("2001:db8::2")); + IOAddress("2001:db8::2")); // This client does not belong to any class. isc::dhcp::ClientClasses no_class; @@ -672,6 +686,20 @@ TEST(Pool6Test, clientClasses) { EXPECT_TRUE(pool.clientSupported(bar_class)); } +// This test checks that handling for known-clients is valid. +TEST(Pool6Test, knownClients) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This pool serves everybody by default. + EXPECT_EQ(Pool::SERVE_BOTH, pool.getKnownClients()); + + // Set it to only known clients. + pool.setKnownClients(Pool::SERVE_KNOWN); + EXPECT_EQ(Pool::SERVE_KNOWN,pool.getKnownClients()); +} + // This test checks that handling for last allocated address/prefix is valid. TEST(Pool6Test, lastAllocated) { // Create a pool. From a02ee970c7bf7be5f3ca7f9325b0a5ac7af238b3 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 20 Nov 2017 00:36:05 +0100 Subject: [PATCH 16/52] [5425] typo --- doc/examples/kea6/advanced.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/examples/kea6/advanced.json b/doc/examples/kea6/advanced.json index 7a6a50a152..85fa54c7d2 100644 --- a/doc/examples/kea6/advanced.json +++ b/doc/examples/kea6/advanced.json @@ -133,7 +133,7 @@ // and another is when there is a shared subnet scenario. "relay": { "ip-address": "3000::1" - }, + } }, { // This subnet is divided in two pools for unknown and From 9663c46dc31098a262e29d67b35cdbd421170f5b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 20 Nov 2017 15:46:58 +0100 Subject: [PATCH 17/52] [5425] Checkpoint: alloc done, new tests todo --- src/bin/dhcp4/tests/config_parser_unittest.cc | 40 +- src/bin/dhcp6/tests/config_parser_unittest.cc | 80 ++-- src/lib/dhcpsrv/alloc_engine.cc | 34 +- src/lib/dhcpsrv/alloc_engine.h | 8 +- src/lib/dhcpsrv/pool.cc | 34 +- src/lib/dhcpsrv/pool.h | 5 +- src/lib/dhcpsrv/subnet.cc | 23 +- src/lib/dhcpsrv/subnet.h | 21 +- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 10 +- .../dhcpsrv/tests/alloc_engine6_unittest.cc | 395 +++++++++++++----- src/lib/dhcpsrv/tests/alloc_engine_utils.h | 2 + src/lib/dhcpsrv/tests/pool_unittest.cc | 56 +-- src/lib/dhcpsrv/tests/subnet_unittest.cc | 56 +-- 13 files changed, 508 insertions(+), 256 deletions(-) diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index dcc3bf2377..c2cdcbbe5c 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -4144,47 +4144,47 @@ TEST_F(Dhcp4ParserTest, classifyPools) { // everyone). ClientClasses classes; classes.insert("alpha"); - EXPECT_TRUE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pools[3], which allows // everyone). classes.clear(); classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_TRUE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows // everyone). classes.clear(); classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_TRUE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); } // This test verifies that the host reservations can be specified for diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index b29fd5840f..27f4edc129 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -4181,47 +4181,47 @@ TEST_F(Dhcp6ParserTest, classifyPools) { // everyone). ClientClasses classes; classes.insert("alpha"); - EXPECT_TRUE (pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_TRUE (pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pool[3], which allows // everyone). classes.clear(); classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_TRUE (pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows // everyone). classes.clear(); classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_TRUE (pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); } // Goal of this test is to verify that multiple pdpools can be configured @@ -4279,47 +4279,47 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) { // everyone). ClientClasses classes; classes.insert("alpha"); - EXPECT_TRUE (pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_TRUE (pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pool[3], which allows // everyone). classes.clear(); classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_TRUE (pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows // everyone). classes.clear(); classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_TRUE (pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); } // This test checks the ability of the server to parse a configuration diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index d608de1b28..7e8015fc1c 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -158,6 +158,7 @@ AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress& isc::asiolink::IOAddress AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, + bool known_client, const DuidPtr&, const IOAddress&) { @@ -183,7 +184,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, PoolCollection::const_iterator first = pools.end(); PoolPtr first_pool; for (it = pools.begin(); it != pools.end(); ++it) { - if (!(*it)->clientSupported(client_classes)) { + if (!(*it)->clientSupported(client_classes, known_client)) { continue; } if (first == pools.end()) { @@ -212,7 +213,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // Trying next pool if (retrying) { for (; it != pools.end(); ++it) { - if ((*it)->clientSupported(client_classes)) { + if ((*it)->clientSupported(client_classes, known_client)) { break; } } @@ -271,7 +272,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // Let's rewind to the beginning. for (it = first; it != pools.end(); ++it) { - if ((*it)->clientSupported(client_classes)) { + if ((*it)->clientSupported(client_classes, known_client)) { (*it)->setLastAllocated((*it)->getFirstAddress()); (*it)->resetLastAllocated(); } @@ -293,6 +294,7 @@ AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::HashedAllocator::pickAddress(const SubnetPtr&, const ClientClasses&, + bool known_client, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Hashed allocator is not implemented"); @@ -307,6 +309,7 @@ AllocEngine::RandomAllocator::RandomAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::RandomAllocator::pickAddress(const SubnetPtr&, const ClientClasses&, + bool known_client, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Random allocator is not implemented"); @@ -447,7 +450,8 @@ inAllowedPool(AllocEngine::ClientContext6& ctx, const Lease::Type& lease_type, } } else { if (current_subnet->inPool(lease_type, address, - ctx.query_->getClasses())) { + ctx.query_->getClasses(), + !ctx.hosts_.empty())) { return (true); } } @@ -752,10 +756,12 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // check if the hint is in pool and is available // This is equivalent of subnet->inPool(hint), but returns the pool pool = boost::dynamic_pointer_cast - (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), hint)); + (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), + !ctx.hosts_.empty(), hint)); // check if the pool is allowed - if (pool && !pool->clientSupported(ctx.query_->getClasses())) { + if (pool && !pool->clientSupported(ctx.query_->getClasses(), + !ctx.hosts_.empty())) { pool.reset(); } @@ -857,7 +863,8 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // - we exhaust number of tries uint64_t possible_attempts = subnet->getPoolCapacity(ctx.currentIA().type_, - ctx.query_->getClasses()); + ctx.query_->getClasses(), + !ctx.hosts_.empty()); // Try next subnet if there is no chance to get something if (possible_attempts == 0) { subnet = subnet->getNextSubnet(original_subnet); @@ -871,6 +878,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { IOAddress candidate = allocator->pickAddress(subnet, ctx.query_->getClasses(), + !ctx.hosts_.empty(), ctx.duid_, hint); @@ -889,7 +897,10 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { uint8_t prefix_len = 128; if (ctx.currentIA().type_ == Lease::TYPE_PD) { pool = boost::dynamic_pointer_cast( - subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), candidate)); + subnet->getPool(ctx.currentIA().type_, + ctx.query_->getClasses(), + !ctx.hosts_.empty(), + candidate)); if (pool) { prefix_len = pool->getLength(); } @@ -2626,7 +2637,8 @@ inAllowedPool(AllocEngine::ClientContext4& ctx, const IOAddress& address) { while (current_subnet) { if (current_subnet->inPool(Lease::TYPE_V4, address, - ctx.query_->getClasses())) { + ctx.query_->getClasses(), + !ctx.hosts_.empty())) { // We found a subnet that this address belongs to, so it // seems that this subnet is the good candidate for allocation. // Let's update the selected subnet. @@ -3354,7 +3366,8 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { uint64_t possible_attempts = subnet->getPoolCapacity(Lease::TYPE_V4, - ctx.query_->getClasses()); + ctx.query_->getClasses(), + !ctx.hosts_.empty()); uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); // Skip trying if there is no chance to get something if (possible_attempts == 0) { @@ -3364,6 +3377,7 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { for (uint64_t i = 0; i < max_attempts; ++i) { IOAddress candidate = allocator->pickAddress(subnet, ctx.query_->getClasses(), + !ctx.hosts_.empty(), client_id, ctx.requested_address_); // If address is not reserved for another client, try to allocate it. diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index af5c44da21..251db83e3b 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -83,7 +83,7 @@ protected: /// /// @param subnet next address will be returned from pool of that subnet /// @param client_classes list of classes client belongs to - + /// @param known_client client has a reservation /// @param duid Client's DUID /// @param hint client's hint /// @@ -91,6 +91,7 @@ protected: virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, + bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint) = 0; @@ -133,12 +134,14 @@ protected: /// /// @param subnet next address will be returned from pool of that subnet /// @param client_classes list of classes client belongs to + /// @param known_client client has a reservation /// @param duid Client's DUID (ignored) /// @param hint client's hint (ignored) /// @return the next address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, + bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); protected: @@ -188,12 +191,14 @@ protected: /// /// @param subnet an address will be picked from pool of that subnet /// @param client_classes list of classes client belongs to + /// @param known_client client has a reservation /// @param duid Client's DUID /// @param hint a hint (last address that was picked) /// @return selected address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, + bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; @@ -219,6 +224,7 @@ protected: virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, + bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index da3258f2b9..9e6aca6389 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -27,21 +27,39 @@ bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { return (first_.smallerEqual(addr) && addr.smallerEqual(last_)); } -bool Pool::clientSupported(const ClientClasses& classes) const { +bool Pool::clientSupported(const ClientClasses& classes, + bool known_client) const { + bool match = false; if (white_list_.empty()) { // There is no class defined for this pool, so we do // support everyone. - return (true); - } + match = true; + } else { - for (ClientClasses::const_iterator it = white_list_.begin(); - it != white_list_.end(); ++it) { - if (classes.contains(*it)) { - return (true); + for (ClientClasses::const_iterator it = white_list_.begin(); + it != white_list_.end(); ++it) { + if (classes.contains(*it)) { + match = true; + break; + } } } - return (false); + if (!match) { + return (false); + } + + switch (known_clients_) { + case SERVE_BOTH: + return (true); + case SERVE_KNOWN: + return (known_client); + case SERVE_UNKNOWN: + return (!known_client); + default: + // Saninity check for an impossible condition + isc_throw(BadValue, "Invalid value of known clients"); + } } void Pool::allowClientClass(const ClientClass& class_name) { diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index d74022ac33..d4fb980364 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -121,8 +121,11 @@ public: /// is known to be improved. /// /// @param client_classes list of all classes the client belongs to + /// @param known_client true if the client is known, i.e. has a + /// reservation /// @return true if client can be supported, false otherwise - bool clientSupported(const ClientClasses& client_classes) const; + bool clientSupported(const ClientClasses& client_classes, + bool known_client) const; /// @brief Adds class class_name to the list of supported classes /// diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 8585264aa9..31d285c7ed 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -136,15 +136,16 @@ Subnet::getPoolCapacity(Lease::Type type) const { uint64_t Subnet::getPoolCapacity(Lease::Type type, - const ClientClasses& client_classes) const { + const ClientClasses& client_classes, + bool known_client) const { switch (type) { case Lease::TYPE_V4: case Lease::TYPE_NA: - return sumPoolCapacity(pools_, client_classes); + return sumPoolCapacity(pools_, client_classes, known_client); case Lease::TYPE_TA: - return sumPoolCapacity(pools_ta_, client_classes); + return sumPoolCapacity(pools_ta_, client_classes, known_client); case Lease::TYPE_PD: - return sumPoolCapacity(pools_pd_, client_classes); + return sumPoolCapacity(pools_pd_, client_classes, known_client); default: isc_throw(BadValue, "Unsupported pool type: " << static_cast(type)); @@ -171,10 +172,11 @@ Subnet::sumPoolCapacity(const PoolCollection& pools) const { uint64_t Subnet::sumPoolCapacity(const PoolCollection& pools, - const ClientClasses& client_classes) const { + const ClientClasses& client_classes, + bool known_client) const { uint64_t sum = 0; for (PoolCollection::const_iterator p = pools.begin(); p != pools.end(); ++p) { - if (!(*p)->clientSupported(client_classes)) { + if (!(*p)->clientSupported(client_classes, known_client)) { continue; } uint64_t x = (*p)->getCapacity(); @@ -370,6 +372,7 @@ const PoolPtr Subnet::getPool(Lease::Type type, const isc::asiolink::IOAddress& const PoolPtr Subnet::getPool(Lease::Type type, const ClientClasses& client_classes, + bool known_client, const isc::asiolink::IOAddress& hint) const { // check if the type is valid (and throw if it isn't) checkType(type); @@ -385,7 +388,8 @@ const PoolPtr Subnet::getPool(Lease::Type type, if (ub != pools.begin()) { --ub; - if ((*ub)->inRange(hint) && (*ub)->clientSupported(client_classes)) { + if ((*ub)->inRange(hint) && + (*ub)->clientSupported(client_classes, known_client)) { candidate = *ub; } } @@ -478,7 +482,8 @@ Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const { bool Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr, - const ClientClasses& client_classes) const { + const ClientClasses& client_classes, + bool known_client) const { // Let's start with checking if it even belongs to that subnet. if ((type != Lease::TYPE_PD) && !inRange(addr)) { @@ -489,7 +494,7 @@ Subnet::inPool(Lease::Type type, for (PoolCollection::const_iterator pool = pools.begin(); pool != pools.end(); ++pool) { - if (!(*pool)->clientSupported(client_classes)) { + if (!(*pool)->clientSupported(client_classes, known_client)) { continue; } if ((*pool)->inRange(addr)) { diff --git a/src/lib/dhcpsrv/subnet.h b/src/lib/dhcpsrv/subnet.h index dacdad8d05..5aa3640b7b 100644 --- a/src/lib/dhcpsrv/subnet.h +++ b/src/lib/dhcpsrv/subnet.h @@ -56,16 +56,18 @@ public: /// @brief checks if the specified address is in allowed pools /// - /// This takes also into account client classes + /// This takes also into account client classes and known client /// /// @param type type of pools to iterate over /// @param addr this address will be checked if it belongs to any pools in /// that subnet /// @param client_classes client class list which must be allowed + /// @param known_client true if the client is known, i.e. has a reservation /// @return true if the address is in any of the allowed pools bool inPool(Lease::Type type, const isc::asiolink::IOAddress& addr, - const ClientClasses& client_classes) const; + const ClientClasses& client_classes, + bool known_client) const; /// @brief returns the last address that was tried from this subnet /// @@ -157,13 +159,15 @@ public: /// @brief Returns a pool that specified address belongs to with classes /// - /// Variant using only pools allowing given classes + /// Variant using only pools allowing given classes and known clients /// /// @param type pool type that the pool is looked for /// @param client_classes client class list which must be allowed + /// @param known_client true if the client is known, i.e. has a reservation /// @param addr address that the returned pool should cover (optional) const PoolPtr getPool(Lease::Type type, const ClientClasses& client_classes, + bool known_client, const isc::asiolink::IOAddress& addr) const; /// @brief Returns a pool without any address specified @@ -194,12 +198,15 @@ public: uint64_t getPoolCapacity(Lease::Type type) const; /// @brief Returns the number of possible leases for specified lease type - /// allowed for a client which belongs to classes. + /// allowed for a client which belongs to classes and matches known + /// clients constraint. /// /// @param type type of the lease /// @param client_classes List of classes the client belongs to. + /// @param known_client true if the client is known, i.e. has a reservation uint64_t getPoolCapacity(Lease::Type type, - const ClientClasses& client_classes) const; + const ClientClasses& client_classes, + bool known_client) const; /// @brief Returns textual representation of the subnet (e.g. /// "2001:db8::/64") @@ -335,9 +342,11 @@ protected: /// @brief returns a sum of possible leases in all pools allowing classes /// @param pools list of pools /// @param client_classes list of classes + /// @param known_client true if the client is known, i.e. has a reservation /// @return sum of possible/allowed leases uint64_t sumPoolCapacity(const PoolCollection& pools, - const ClientClasses& client_classes) const; + const ClientClasses& client_classes, + bool known_client) const; /// @brief Checks if the specified pool overlaps with an existing pool. /// diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index 3e1a370580..66329452a2 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -326,7 +326,8 @@ TEST_F(AllocEngine4Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, + known_client_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); } @@ -349,10 +350,11 @@ TEST_F(AllocEngine4Test, IterativeAllocator_class) { cc_.insert("bar"); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, + known_client_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, known_client_)); } } @@ -382,7 +384,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator_manyPools4) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); // One way to easily verify that the iterative allocator really works is diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index e96ebbd37b..09dd38f7cf 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -189,7 +189,8 @@ TEST_F(AllocEngine6Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); + IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, + duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); } } @@ -211,9 +212,10 @@ TEST_F(AllocEngine6Test, IterativeAllocator_class) { cc_.insert("bar"); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); + IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, + duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, known_client_)); } } @@ -233,23 +235,43 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { subnet_->addPool(pool3); // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // The second pool is easy - only one address here - EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::100", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::105", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { @@ -274,23 +296,43 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { cc_.insert("foo"); // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // The second pool is easy - only one address here - EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::100", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::105", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { @@ -311,22 +353,40 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { subnet_->addPool(pool3); // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // The second pool is skipped // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::105", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { @@ -347,41 +407,85 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Second pool (just one lease here) - EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool - EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ(exp.str(), + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } - EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2:ff::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { @@ -408,41 +512,85 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Second pool (just one lease here) - EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool - EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ(exp.str(), + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } - EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2:ff::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { @@ -465,40 +613,82 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // The second pool is skipped // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool - EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ(exp.str(), + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } - EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2:ff::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); } // This test verifies that the iterative allocator can step over addresses @@ -506,7 +696,8 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); // Let's pick the first address - IOAddress addr1 = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("2001:db8:1::10")); + IOAddress addr1 = alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("2001:db8:1::10")); // Check that we can indeed pick the first address from the pool EXPECT_EQ("2001:db8:1::10", addr1.toText()); @@ -596,7 +787,8 @@ TEST_F(AllocEngine6Test, IterativeAllocator_manyPools6) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_, + duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); // One way to easily verify that the iterative allocator really works is @@ -634,8 +826,9 @@ TEST_F(AllocEngine6Test, smallPool6) { IOAddress addr("2001:db8:1::ad"); // Create a subnet with a pool that has one address. - initSubnet(IOAddress("2001:db8:1::"), addr, addr); - + initSubnet(IOAddress("2001:db8:1::"), + addr, addr); + // Initialize FQDN for a lease. initFqdn("myhost.example.com", true, true); diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index eeed469755..1d20f0fc69 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -411,6 +411,7 @@ public: bool fqdn_rev_; ///< Perform reverse update for a lease. LeaseMgrFactory factory_; ///< pointer to LeaseMgr factory ClientClasses cc_; ///< client classes + bool known_client_; ///< client has a reservation }; /// @brief Used in Allocation Engine tests for IPv4 @@ -513,6 +514,7 @@ public: LeaseMgrFactory factory_; ///< Pointer to LeaseMgr factory AllocEngine::ClientContext4 ctx_; ///< Context information passed to various ClientClasses cc_; ///< Client classes + bool known_client_; ///< client has a reservation ///< allocation engine functions. }; diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index d720c2b023..bc54a7ed0b 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -215,19 +215,19 @@ TEST(Pool4Test, clientClass) { // No class restrictions defined, any client should be supported EXPECT_EQ(0, pool->getClientClasses().size()); - EXPECT_TRUE(pool->clientSupported(no_class)); - EXPECT_TRUE(pool->clientSupported(foo_class)); - EXPECT_TRUE(pool->clientSupported(bar_class)); - EXPECT_TRUE(pool->clientSupported(three_classes)); + EXPECT_TRUE(pool->clientSupported(no_class, false)); + EXPECT_TRUE(pool->clientSupported(foo_class, false)); + EXPECT_TRUE(pool->clientSupported(bar_class, false)); + EXPECT_TRUE(pool->clientSupported(three_classes, false)); // Let's allow only clients belonging to "bar" class. pool->allowClientClass("bar"); EXPECT_EQ(1, pool->getClientClasses().size()); - EXPECT_FALSE(pool->clientSupported(no_class)); - EXPECT_FALSE(pool->clientSupported(foo_class)); - EXPECT_TRUE(pool->clientSupported(bar_class)); - EXPECT_TRUE(pool->clientSupported(three_classes)); + EXPECT_FALSE(pool->clientSupported(no_class, false)); + EXPECT_FALSE(pool->clientSupported(foo_class, false)); + EXPECT_TRUE(pool->clientSupported(bar_class, false)); + EXPECT_TRUE(pool->clientSupported(three_classes, false)); } // This test checks that handling for multiple client-classes is valid. @@ -249,9 +249,9 @@ TEST(Pool4Test, clientClasses) { // No class restrictions defined, any client should be supported EXPECT_EQ(0, pool->getClientClasses().size()); - EXPECT_TRUE(pool->clientSupported(no_class)); - EXPECT_TRUE(pool->clientSupported(foo_class)); - EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(no_class, false)); + EXPECT_TRUE(pool->clientSupported(foo_class, false)); + EXPECT_TRUE(pool->clientSupported(bar_class, false)); // Let's allow clients belonging to "bar" or "foo" class. pool->allowClientClass("bar"); @@ -259,13 +259,13 @@ TEST(Pool4Test, clientClasses) { EXPECT_EQ(2, pool->getClientClasses().size()); // Class-less clients are to be rejected. - EXPECT_FALSE(pool->clientSupported(no_class)); + EXPECT_FALSE(pool->clientSupported(no_class, false)); // Clients in foo class should be accepted. - EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(foo_class, false)); // Clients in bar class should be accepted as well. - EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(bar_class, false)); } // This test checks that handling for known-clients is valid. @@ -633,19 +633,19 @@ TEST(Pool6Test, clientClass) { // No class restrictions defined, any client should be supported EXPECT_EQ(0, pool.getClientClasses().size()); - EXPECT_TRUE(pool.clientSupported(no_class)); - EXPECT_TRUE(pool.clientSupported(foo_class)); - EXPECT_TRUE(pool.clientSupported(bar_class)); - EXPECT_TRUE(pool.clientSupported(three_classes)); + EXPECT_TRUE(pool.clientSupported(no_class, false)); + EXPECT_TRUE(pool.clientSupported(foo_class, false)); + EXPECT_TRUE(pool.clientSupported(bar_class, false)); + EXPECT_TRUE(pool.clientSupported(three_classes, false)); // Let's allow only clients belonging to "bar" class. pool.allowClientClass("bar"); EXPECT_EQ(1, pool.getClientClasses().size()); - EXPECT_FALSE(pool.clientSupported(no_class)); - EXPECT_FALSE(pool.clientSupported(foo_class)); - EXPECT_TRUE(pool.clientSupported(bar_class)); - EXPECT_TRUE(pool.clientSupported(three_classes)); + EXPECT_FALSE(pool.clientSupported(no_class, false)); + EXPECT_FALSE(pool.clientSupported(foo_class, false)); + EXPECT_TRUE(pool.clientSupported(bar_class, false)); + EXPECT_TRUE(pool.clientSupported(three_classes, false)); } // This test checks that handling for multiple client-classes is valid. @@ -667,9 +667,9 @@ TEST(Pool6Test, clientClasses) { // No class restrictions defined, any client should be supported EXPECT_EQ(0, pool.getClientClasses().size()); - EXPECT_TRUE(pool.clientSupported(no_class)); - EXPECT_TRUE(pool.clientSupported(foo_class)); - EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(no_class, false)); + EXPECT_TRUE(pool.clientSupported(foo_class, false)); + EXPECT_TRUE(pool.clientSupported(bar_class, false)); // Let's allow clients belonging to "bar" or "foo" class. pool.allowClientClass("bar"); @@ -677,13 +677,13 @@ TEST(Pool6Test, clientClasses) { EXPECT_EQ(2, pool.getClientClasses().size()); // Class-less clients are to be rejected. - EXPECT_FALSE(pool.clientSupported(no_class)); + EXPECT_FALSE(pool.clientSupported(no_class, false)); // Clients in foo class should be accepted. - EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(foo_class, false)); // Clients in bar class should be accepted as well. - EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(bar_class, false)); } // This test checks that handling for known-clients is valid. diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index 4226bc2eea..8da02897ae 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -235,34 +235,34 @@ TEST(Subnet4Test, pool4InSubnet4) { three_classes.insert("baz"); // If we provide a hint, we should get a pool that this hint belongs to - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, IOAddress("192.1.2.201"))); EXPECT_EQ(mypool, pool4); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, IOAddress("192.1.2.129"))); EXPECT_EQ(mypool, pool2); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, IOAddress("192.1.2.64"))); EXPECT_EQ(mypool, pool1); // Specify addresses which don't belong to any existing pools. - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false, IOAddress("192.1.2.210"))); EXPECT_FALSE(mypool); // Pool3 requires a member of bar - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, IOAddress("192.1.2.195"))); EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, false, IOAddress("192.1.2.195"))); EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, false, IOAddress("192.1.2.195"))); EXPECT_EQ(mypool, pool3); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false, IOAddress("192.1.2.195"))); EXPECT_EQ(mypool, pool3); } @@ -319,10 +319,10 @@ TEST(Subnet4Test, getCapacity) { pool3->allowClientClass("bar"); // Pool3 requires a member of bar - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class)); - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class)); - EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class)); - EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, false)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class, false)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes, false)); } // Checks that it is not allowed to add invalid pools. @@ -541,24 +541,24 @@ TEST(Subnet4Test, inRangeinPool) { // This client does not belong to any class. isc::dhcp::ClientClasses no_class; - EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class, false)); // This client belongs to foo only isc::dhcp::ClientClasses foo_class; foo_class.insert("foo"); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class, false)); // This client belongs to bar only. I like that client. isc::dhcp::ClientClasses bar_class; bar_class.insert("bar"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class, false)); // This client belongs to foo, bar and baz classes. isc::dhcp::ClientClasses three_classes; three_classes.insert("foo"); three_classes.insert("bar"); three_classes.insert("baz"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false)); } // This test checks if the toText() method returns text representation @@ -781,13 +781,13 @@ TEST(Subnet6Test, Pool6getCapacity) { // Pool3 requires a member of bar EXPECT_EQ(uint64_t(4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, no_class)); + subnet->getPoolCapacity(Lease::TYPE_NA, no_class, false)); EXPECT_EQ(uint64_t(4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, foo_class)); + subnet->getPoolCapacity(Lease::TYPE_NA, foo_class, false)); EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, bar_class)); + subnet->getPoolCapacity(Lease::TYPE_NA, bar_class, false)); EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, three_classes)); + subnet->getPoolCapacity(Lease::TYPE_NA, three_classes, false)); // This is 2^64 prefixes. We're overflown uint64_t. PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64)); @@ -891,16 +891,16 @@ TEST(Subnet6Test, Pool6InSubnet6) { pool3->allowClientClass("bar"); // Pool3 requires a member of bar - mypool = subnet->getPool(Lease::TYPE_NA, no_class, + mypool = subnet->getPool(Lease::TYPE_NA, no_class, false, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, foo_class, + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, false, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, bar_class, + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, false, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); - mypool = subnet->getPool(Lease::TYPE_NA, three_classes, + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); } @@ -1396,24 +1396,24 @@ TEST(Subnet6Test, inRangeinPool) { // This client does not belong to any class. isc::dhcp::ClientClasses no_class; - EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class, false)); // This client belongs to foo only isc::dhcp::ClientClasses foo_class; foo_class.insert("foo"); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class, false)); // This client belongs to bar only. I like that client. isc::dhcp::ClientClasses bar_class; bar_class.insert("bar"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class, false)); // This client belongs to foo, bar and baz classes. isc::dhcp::ClientClasses three_classes; three_classes.insert("foo"); three_classes.insert("bar"); three_classes.insert("baz"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false)); } // This test verifies that inRange() and inPool() methods work properly From 43410fdf07f1acd2e074cad93cae6877a214614a Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 20 Nov 2017 20:59:17 +0100 Subject: [PATCH 18/52] [5425] Checkpoint: still a few new tests to add --- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 114 +++++++- .../dhcpsrv/tests/alloc_engine6_unittest.cc | 244 ++++++++++++++++++ 2 files changed, 351 insertions(+), 7 deletions(-) diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index 66329452a2..d0f3600d04 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -358,6 +358,32 @@ TEST_F(AllocEngine4Test, IterativeAllocator_class) { } } +// This test verifies that the allocator picks addresses that belong to the +// pool using unknown clients +TEST_F(AllocEngine4Test, IterativeAllocator_unknown) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); + + // Restrict pool_ to known clients. Add a second pool for unknown clients. + pool_->setKnownClients(Pool::SERVE_KNOWN); + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.200"), + IOAddress("192.0.2.209"))); + pool->setKnownClients(Pool::SERVE_UNKNOWN); + subnet_->addPool(pool); + + // Clients are unknown + known_client_ = false; + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, + known_client_, clientid_, + IOAddress("0.0.0.0")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, known_client_)); + EXPECT_FALSE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, !known_client_)); + } +} + // This test verifies that the iterative allocator really walks over all addresses // in all pools in specified subnet. It also must not pick the same address twice // unless it runs out of pool space and must start over. @@ -717,8 +743,8 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkClassification) { // This test verifies that the server can offer an address from a // different subnet than orginally selected, when the address pool in -// the first subnet requires another class. -TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolClassification) { +// the first subnet requires host reservations. +TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolKnown) { // Try to offer address from subnet1. There is one address available // so it should be offerred. @@ -731,11 +757,11 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolClassification) { EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); // Apply restrictions on the pool1. This should be only assigned - // to clients belonging to cable-modem class. - pool1_->allowClientClass("cable-modem"); + // to clients which have a reservation. + pool1_->setKnownClients(Pool::SERVE_KNOWN); // The allocation engine should determine that the pool1 is not - // available for the client not belonging to the cable-modem class. + // available for the client without a reservation. // Instead, it should offer an address from subnet2 that belongs // to the same shared network. ctx.subnet_ = subnet1_; @@ -743,9 +769,14 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolClassification) { ASSERT_TRUE(lease); EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); - // Assign cable-modem class and try again. This time, we should + // Add a host reservation and try again. This time, we should // offer an address from the pool1. - ctx.query_->addClass(ClientClass("cable-modem")); + HostPtr host(new Host(&hwaddr_->hwaddr_[0], hwaddr_->hwaddr_.size(), + Host::IDENT_HWADDR, subnet1_->getID(), + SubnetID(0), IOAddress::IPV4_ZERO_ADDRESS(), "foo")); + CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); + CfgMgr::instance().commit(); + AllocEngine::findReservation(ctx); ctx.subnet_ = subnet1_; lease = engine_.allocateLease4(ctx); @@ -1004,6 +1035,75 @@ TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolClassification) { EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); } +// This test verifies that the server can assign an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires host reservations. +TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolKnown) { + // Try to offer address from subnet1. There is one address available + // so it should be offerred. + AllocEngine::ClientContext4 + ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), + false, false, "host.example.com.", false); + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + Lease4Ptr lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Apply restrictions on the pool1. This should be only assigned + // to clients which have a reservation. + pool1_->setKnownClients(Pool::SERVE_KNOWN); + + // The allocation engine should determine that the pool1 is not + // available for the client without a reservation. + // Instead, it should assign an address from subnet2 that belongs + // to the same shared network. + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Add a host reservation and try again. This time, we should + // offer an address from the pool1. + HostPtr host(new Host(&hwaddr_->hwaddr_[0], hwaddr_->hwaddr_.size(), + Host::IDENT_HWADDR, subnet1_->getID(), + SubnetID(0), IOAddress::IPV4_ZERO_ADDRESS(), "foo")); + CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); + CfgMgr::instance().commit(); + AllocEngine::findReservation(ctx); + + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Let's now remove the client host reservation and try + // to renew the address. The engine should determine that the + // client doesn't have access to the pool1 anymore and + // assign an address from unrestricted pool. +#if 0 + CfgMgr::instance().getStagingCfg()->getCfgHosts()->del4(SubnetID(0), + Host::IDENT_HWADDR, + &hwaddr_->hwaddr_[0], + hwaddr_->hwaddr_.size()); + CfgMgr::instance().commit(); + AllocEngine::findReservation(ctx); +#else + // del4 is not always implemented + ctx.hosts_.clear(); +#endif + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); +} + // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong (DHCPREQUEST case). diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 09dd38f7cf..2b833ec8da 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -219,6 +219,31 @@ TEST_F(AllocEngine6Test, IterativeAllocator_class) { } } +// This test verifies that the allocator picks addresses that belong to the +// pool not requiring reservations +TEST_F(AllocEngine6Test, IterativeAllocator_unknown) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); + + // Restrict pool_ to known clients. Add a second pool for unknown clients. + pool_->setKnownClients(Pool::SERVE_KNOWN); + Pool6Ptr pool(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::109"))); + pool->setKnownClients(Pool::SERVE_UNKNOWN); + subnet_->addPool(pool); + + // Clients are unknown + known_client_ = false; + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, + duid_, IOAddress("::")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, known_client_)); + EXPECT_FALSE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, !known_client_)); + } +} + TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); @@ -389,6 +414,66 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { IOAddress("::")).toText()); } +TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepKnown) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); + + subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool + + Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + IOAddress("2001:db8:1::5"))); + Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::100"))); + Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), + IOAddress("2001:db8:1::106"))); + // The pool1 serves everybody, pool2 known clients, pool3 unknown clients. + // Set pool1 and pool3 but not pool2 in foo class + pool1->setKnownClients(Pool::SERVE_BOTH); + pool2->setKnownClients(Pool::SERVE_KNOWN); + pool3->setKnownClients(Pool::SERVE_UNKNOWN); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients have no reservation + known_client_ = false; + + // Let's check the first pool (5 addresses here) + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + + // The second pool is skipped + + // This is the third and last pool, with 2 addresses in it + EXPECT_EQ("2001:db8:1::105", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + + // We iterated over all addresses and reached to the end of the last pool. + // Let's wrap around and start from the beginning + EXPECT_EQ("2001:db8:1::1", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); +} + TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); @@ -691,6 +776,109 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { IOAddress("::")).toText()); } +TEST_F(AllocEngine6Test, IterativeAllocatorPrefixKnown) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); + + subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); + + Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); + Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); + Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); + // Set pool2 in foo + pool1->setKnownClients(Pool::SERVE_BOTH); + pool2->setKnownClients(Pool::SERVE_UNKNOWN); + pool3->setKnownClients(Pool::SERVE_KNOWN); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients have reservations + known_client_ = true; + + // We have a 2001:db8::/48 subnet that has 3 pools defined in it: + // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) + // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) + // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) + + // First pool check (Let's check over all 16 leases) + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + + // The second pool is skipped + + // Third pool (256 leases, let's check first and last explicitly and the + // rest over in a pool + EXPECT_EQ("2001:db8:2::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + for (int i = 1; i < 255; i++) { + stringstream exp; + exp << "2001:db8:2:" << hex << i << dec << "::"; + EXPECT_EQ(exp.str(), + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + + } + EXPECT_EQ("2001:db8:2:ff::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + + // Ok, we've iterated over all prefixes in all pools. We now wrap around. + // We're looping over now (iterating over first pool again) + EXPECT_EQ("2001:db8::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", + alloc.pickAddress(subnet_, cc_, known_client_, duid_, + IOAddress("::")).toText()); +} + // This test verifies that the iterative allocator can step over addresses TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); @@ -2647,6 +2835,62 @@ TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolClassification) { EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); } +// This test verifies that the server can offer an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires a reservation. +TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolKnown) { + // Try to offer address from subnet1. There is an address available so + // it should be offerred. + Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); + AllocEngine::ClientContext6 ctx(subnet1_, duid_, false, false, "", true, + query); + ctx.currentIA().iaid_ = iaid_; + + Lease6Ptr lease; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet1_->inRange(lease->addr_)); + + // Apply restrictions on the pool1. This should be only assigned + // to clients with have a reservation. + pool1_->setKnownClients(Pool::SERVE_KNOWN); + + // The allocation engine should determine that the pool1 is not + // available for the client without a reservation. + // Instead, it should offer an address from subnet2 that belongs + // to the same shared network. + AllocEngine::ClientContext6 ctx2(subnet1_, duid_, false, false, "", true, + query); + ctx2.currentIA().iaid_ = iaid_; + ctx2.query_ = query; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx2))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet2_->inRange(lease->addr_)); + + AllocEngine::ClientContext6 ctx3(subnet1_, duid_, false, false, "", true, + query); + ctx3.currentIA().iaid_ = iaid_; + ctx3.query_ = query; + + AllocEngine::ClientContext6 ctx4(subnet1_, duid_, false, false, "", true, + query); + ctx4.currentIA().iaid_ = iaid_; + ctx4.query_ = query; + + // Add a host reservation and try again. This time, we should + // offer an address from the pool1_. + HostPtr host(new Host(&duid_->getDuid()[0], duid_->getDuid().size(), + Host::IDENT_DUID, SubnetID(0), subnet1_->getID(), + IOAddress::IPV4_ZERO_ADDRESS(), "foo")); + CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); + CfgMgr::instance().commit(); + AllocEngine::findReservation(ctx4); + + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx4))); + ASSERT_TRUE(lease); + EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); +} + // This test verifies that the client is offerred a reserved address // even if this address belongs to another subnet within the same // shared network. From 13a8becc1b8cc6751a43fbae75a37c61f4988b3f Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 20 Nov 2017 23:27:07 +0100 Subject: [PATCH 19/52] [5425] Added final (?) tests --- src/bin/dhcp4/tests/config_parser_unittest.cc | 28 +- src/bin/dhcp4/tests/dhcp4_srv_unittest.cc | 51 ++ src/bin/dhcp4/tests/get_config_unittest.cc | 701 +++++++++++++----- src/bin/dhcp6/dhcp6_lexer.cc | 1 + src/bin/dhcp6/dhcp6_lexer.ll | 1 + src/bin/dhcp6/tests/classify_unittests.cc | 87 +++ src/bin/dhcp6/tests/config_parser_unittest.cc | 84 ++- src/bin/dhcp6/tests/get_config_unittest.cc | 8 + src/lib/dhcpsrv/tests/subnet_unittest.cc | 93 ++- 9 files changed, 838 insertions(+), 216 deletions(-) diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index c2cdcbbe5c..cb4088ab07 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -4112,11 +4112,13 @@ TEST_F(Dhcp4ParserTest, classifyPools) { " }," " {" " \"pool\": \"192.0.3.101 - 192.0.3.150\", " - " \"client-class\": \"beta\" " + " \"client-class\": \"beta\", " + " \"known-clients\": \"never\" " " }," " {" " \"pool\": \"192.0.4.101 - 192.0.4.150\", " - " \"client-class\": \"gamma\" " + " \"client-class\": \"gamma\", " + " \"known-clients\": \"only\" " " }," " {" " \"pool\": \"192.0.5.101 - 192.0.5.150\" " @@ -4145,9 +4147,13 @@ TEST_F(Dhcp4ParserTest, classifyPools) { ClientClasses classes; classes.insert("alpha"); EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pools[3], which allows @@ -4155,9 +4161,13 @@ TEST_F(Dhcp4ParserTest, classifyPools) { classes.clear(); classes.insert("beta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows @@ -4165,26 +4175,38 @@ TEST_F(Dhcp4ParserTest, classifyPools) { classes.clear(); classes.insert("gamma"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(2)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); } // This test verifies that the host reservations can be specified for diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index f650d33867..d2cd09f099 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -2387,6 +2387,57 @@ TEST_F(Dhcpv4SrvTest, clientPoolClassify) { EXPECT_FALSE(offer->getYiaddr().isV4Zero()); } +// Checks if the known-clients field is indeed used for pool selection. +TEST_F(Dhcpv4SrvTest, clientPoolKnown) { + IfaceMgrTestConfig test_config(true); + IfaceMgr::instance().openSockets4(); + + NakedDhcpv4Srv srv(0); + + // This test configures 2 pools. + string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ " + "{ \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"known-clients\": \"only\" }, " + " { \"pool\": \"192.0.3.1 - 192.0.3.100\", " + " \"known-clients\": \"never\" } ], " + " \"subnet\": \"192.0.0.0/16\" } " + "]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp4Server(srv, json)); + + CfgMgr::instance().commit(); + + // check if returned status is OK + ASSERT_TRUE(status); + comment_ = config::parseAnswer(rcode_, status); + ASSERT_EQ(0, rcode_); + + // Create a simple packet + Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234)); + dis->setRemoteAddr(IOAddress("192.0.2.1")); + dis->setCiaddr(IOAddress("192.0.2.1")); + dis->setIface("eth0"); + OptionPtr clientid = generateClientId(); + dis->addOption(clientid); + + // First pool requires reservation so the second will be used + Pkt4Ptr offer = srv.processDiscover(dis); + ASSERT_TRUE(offer); + EXPECT_EQ(DHCPOFFER, offer->getType()); + EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText()); +} + // Verifies last resort option 43 is backward compatible TEST_F(Dhcpv4SrvTest, option43LastResort) { IfaceMgrTestConfig test_config(true); diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 5ee6aca358..95e2c00464 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -1158,6 +1158,85 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" +" \"client-class\": \"alpha\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.2.0/24\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.3.101 - 192.0.3.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.3.0/24\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.4.101 - 192.0.4.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.4.0/24\"\n" +" },\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.5.101 - 192.0.5.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.5.0/24\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet4\": [\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"known-clients\": \"never\",\n" +" \"pool\": \"192.0.3.101 - 192.0.3.150\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"known-clients\": \"only\",\n" +" \"pool\": \"192.0.4.101 - 192.0.4.150\"\n" +" },\n" +" {\n" +" \"pool\": \"192.0.5.101 - 192.0.5.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.0.0/16\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet4\": [\n" +" {\n" " \"id\": 123,\n" " \"pools\": [\n" " {\n" @@ -1247,7 +1326,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1288,7 +1367,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"rebind-timer\": 2000,\n" " \"renew-timer\": 1000,\n" @@ -1330,30 +1409,30 @@ const char* EXTRACTED_CONFIGS[] = { " }\n" " ],\n" " \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 47 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 48 +"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" " },\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 49 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1368,7 +1447,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 50 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1387,7 +1466,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1407,7 +1486,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1427,7 +1506,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 53 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1448,7 +1527,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 54 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1468,7 +1547,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 53 + // CONFIGURATION 55 "{\n" " \"client-classes\": [\n" " {\n" @@ -1498,7 +1577,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 54 + // CONFIGURATION 56 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1517,7 +1596,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 55 + // CONFIGURATION 57 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1537,7 +1616,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 56 + // CONFIGURATION 58 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1561,7 +1640,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 57 + // CONFIGURATION 59 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -4893,6 +4972,244 @@ const char* UNPARSED_CONFIGS[] = { " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"\",\n" " \"boot-file-name\": \"\",\n" +" \"client-class\": \"alpha\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"client-class\": \"beta\",\n" +" \"id\": 2,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.3.101-192.0.3.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.3.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"client-class\": \"gamma\",\n" +" \"id\": 3,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.4.101-192.0.4.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.4.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 4,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.5.101-192.0.5.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.5.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"known-clients\": \"never\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.3.101-192.0.3.150\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"known-clients\": \"only\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.4.101-192.0.4.150\"\n" +" },\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.5.101-192.0.5.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.0.0/16\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" " \"id\": 123,\n" " \"match-client-id\": true,\n" " \"next-server\": \"0.0.0.0\",\n" @@ -5071,7 +5388,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5171,7 +5488,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5318,96 +5635,10 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" -" \"decline-probation-period\": 12345,\n" +" \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5470,12 +5701,12 @@ const char* UNPARSED_CONFIGS[] = { " \"dhcp4o6-port\": 0,\n" " \"echo-client-id\": true,\n" " \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 35,\n" -" \"hold-reclaimed-time\": 1800,\n" -" \"max-reclaim-leases\": 50,\n" -" \"max-reclaim-time\": 100,\n" -" \"reclaim-timer-wait-time\": 20,\n" -" \"unwarned-reclaim-cycles\": 10\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" " },\n" " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" @@ -5493,7 +5724,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 48 "{\n" -" \"decline-probation-period\": 86400,\n" +" \"decline-probation-period\": 12345,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5532,34 +5763,7 @@ const char* UNPARSED_CONFIGS[] = { " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" " \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.1-192.0.2.100\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 49 "{\n" @@ -5583,12 +5787,12 @@ const char* UNPARSED_CONFIGS[] = { " \"dhcp4o6-port\": 0,\n" " \"echo-client-id\": true,\n" " \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" +" \"flush-reclaimed-timer-wait-time\": 35,\n" +" \"hold-reclaimed-time\": 1800,\n" +" \"max-reclaim-leases\": 50,\n" +" \"max-reclaim-time\": 100,\n" +" \"reclaim-timer-wait-time\": 20,\n" +" \"unwarned-reclaim-cycles\": 10\n" " },\n" " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" @@ -5602,34 +5806,7 @@ const char* UNPARSED_CONFIGS[] = { " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" " \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"2001:db8::123/45\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.1-192.0.2.100\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 50 "{\n" @@ -5674,7 +5851,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet4\": [\n" " {\n" -" \"4o6-interface\": \"ethX\",\n" +" \"4o6-interface\": \"\",\n" " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"\",\n" " \"boot-file-name\": \"\",\n" @@ -5744,6 +5921,146 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet4\": [\n" " {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"2001:db8::123/45\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 52 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"ethX\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 53 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" " \"4o6-interface\": \"ethX\",\n" " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"2001:db8::543/21\",\n" @@ -5771,7 +6088,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 54 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5841,7 +6158,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 53 + // CONFIGURATION 55 "{\n" " \"client-classes\": [\n" " {\n" @@ -5937,7 +6254,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 54 + // CONFIGURATION 56 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6007,7 +6324,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 55 + // CONFIGURATION 57 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6078,7 +6395,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 56 + // CONFIGURATION 58 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6153,7 +6470,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 57 + // CONFIGURATION 59 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index cd5397d241..52b3cc4701 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -3014,6 +3014,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 4808abeb27..fba59d48e0 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -830,6 +830,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"known-clients\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 7a81310f92..d8967e8ffe 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -735,6 +735,93 @@ TEST_F(ClassifyTest, clientClassifyPool) { EXPECT_TRUE(ia_na3->getOption(D6O_IAADDR)); } +// Checks if the known-clients field is indeed used for pool selection. +TEST_F(ClassifyTest, clientKnownPool) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // This test configures 2 pools. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"client-classes\": [ " + " { " + " \"name\": \"foo\" " + " }, " + " { " + " \"name\": \"bar\" " + " } " + "], " + "\"subnet6\": [ " + " { \"pools\": [ " + " { " + " \"pool\": \"2001:db8:1::/64\", " + " \"known-clients\": \"only\" " + " }, " + " { " + " \"pool\": \"2001:db8:2::/64\", " + " \"known-clients\": \"never\" " + " } " + " ], " + " \"subnet\": \"2001:db8:2::/40\", " + " \"reservations\": [ " + " { \"duid\": \"01:02:03:04\", \"hostname\": \"foo\" } ] " + " } " + "], " + "\"valid-lifetime\": 4000 }"; + + ASSERT_NO_THROW(configure(config)); + + OptionPtr clientid1 = generateClientId(); + Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); + query1->setRemoteAddr(IOAddress("2001:db8:1::3")); + query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + query1->addOption(clientid1); + query1->setIface("eth1"); + + // First pool requires reservation so the second will be used + srv.classifyPacket(query1); + Pkt6Ptr response1 = srv.processSolicit(query1); + ASSERT_TRUE(response1); + OptionPtr ia_na1 = response1->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na1); + EXPECT_FALSE(ia_na1->getOption(D6O_STATUS_CODE)); + OptionPtr iaaddr1 = ia_na1->getOption(D6O_IAADDR); + ASSERT_TRUE(iaaddr1); + boost::shared_ptr addr1 = + boost::dynamic_pointer_cast(iaaddr1); + ASSERT_TRUE(addr1); + EXPECT_EQ("2001:db8:2::", addr1->getAddress().toText()); + + // Try with DUID 01:02:03:04 + uint8_t duid[] = { 0x01, 0x02, 0x03, 0x04 }; + OptionBuffer buf(duid, duid + sizeof(duid)); + OptionPtr clientid2(new Option(Option::V6, D6O_CLIENTID, buf)); + Pkt6Ptr query2 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 2345)); + query2->setRemoteAddr(IOAddress("2001:db8:1::3")); + query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + query2->addOption(clientid2); + query2->setIface("eth1"); + + // Now the first pool will be used + srv.classifyPacket(query2); + Pkt6Ptr response2 = srv.processSolicit(query2); + ASSERT_TRUE(response2); + OptionPtr ia_na2 = response2->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na2); + EXPECT_FALSE(ia_na2->getOption(D6O_STATUS_CODE)); + OptionPtr iaaddr2 = ia_na2->getOption(D6O_IAADDR); + ASSERT_TRUE(iaaddr2); + boost::shared_ptr addr2 = + boost::dynamic_pointer_cast(iaaddr2); + ASSERT_TRUE(addr2); + EXPECT_EQ("2001:db8:1::", addr2->getAddress().toText()); +} + // Tests whether a packet with custom vendor-class (not erouter or docsis) // is classified properly. TEST_F(ClassifyTest, vendorClientClassification2) { diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 27f4edc129..21c209604b 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -4149,11 +4149,13 @@ TEST_F(Dhcp6ParserTest, classifyPools) { " }," " {" " \"pool\": \"2001:db8:2::/80\", " - " \"client-class\": \"beta\" " + " \"client-class\": \"beta\", " + " \"known-clients\": \"never\" " " }," " {" " \"pool\": \"2001:db8:3::/80\", " - " \"client-class\": \"gamma\" " + " \"client-class\": \"gamma\", " + " \"known-clients\": \"only\" " " }," " {" " \"pool\": \"2001:db8:4::/80\" " @@ -4181,10 +4183,14 @@ TEST_F(Dhcp6ParserTest, classifyPools) { // everyone). ClientClasses classes; classes.insert("alpha"); - EXPECT_TRUE (pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pool[3], which allows @@ -4192,9 +4198,13 @@ TEST_F(Dhcp6ParserTest, classifyPools) { classes.clear(); classes.insert("beta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows @@ -4202,26 +4212,38 @@ TEST_F(Dhcp6ParserTest, classifyPools) { classes.clear(); classes.insert("gamma"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); } // Goal of this test is to verify that multiple pdpools can be configured @@ -4243,13 +4265,15 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) { " \"prefix-len\": 48, " " \"delegated-len\": 64, " " \"prefix\": \"2001:db8:2::\", " - " \"client-class\": \"beta\" " + " \"client-class\": \"beta\", " + " \"known-clients\": \"never\" " " }," " {" " \"prefix-len\": 48, " " \"delegated-len\": 64, " " \"prefix\": \"2001:db8:3::\", " - " \"client-class\": \"gamma\" " + " \"client-class\": \"gamma\", " + " \"known-clients\": \"only\" " " }," " {" " \"prefix-len\": 48, " @@ -4279,10 +4303,14 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) { // everyone). ClientClasses classes; classes.insert("alpha"); - EXPECT_TRUE (pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to beta class is supported in pool[1] // and not supported in any other pool (except pool[3], which allows @@ -4290,9 +4318,13 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) { classes.clear(); classes.insert("beta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to gamma class is supported in pool[2] // and not supported in any other pool (except pool[3], which allows @@ -4300,26 +4332,38 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) { classes.clear(); classes.insert("gamma"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Let's check if client belonging to some other class (not mentioned in // the config) is supported only in pool[3], which allows everyone. classes.clear(); classes.insert("delta"); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); // Finally, let's check class-less client. He should be allowed only in // the last pool, which does not have any class restrictions. classes.clear(); EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE (pools.at(3)->clientSupported(classes, false)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); } // This test checks the ability of the server to parse a configuration diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index 22f8b4d971..05996adee3 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -1002,10 +1002,12 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " {\n" " \"client-class\": \"beta\",\n" +" \"known-clients\": \"never\",\n" " \"pool\": \"2001:db8:2::/80\"\n" " },\n" " {\n" " \"client-class\": \"gamma\",\n" +" \"known-clients\": \"only\",\n" " \"pool\": \"2001:db8:3::/80\"\n" " },\n" " {\n" @@ -1037,12 +1039,14 @@ const char* EXTRACTED_CONFIGS[] = { " {\n" " \"client-class\": \"beta\",\n" " \"delegated-len\": 64,\n" +" \"known-clients\": \"never\",\n" " \"prefix\": \"2001:db8:2::\",\n" " \"prefix-len\": 48\n" " },\n" " {\n" " \"client-class\": \"gamma\",\n" " \"delegated-len\": 64,\n" +" \"known-clients\": \"only\",\n" " \"prefix\": \"2001:db8:3::\",\n" " \"prefix-len\": 48\n" " },\n" @@ -4454,11 +4458,13 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " {\n" " \"client-class\": \"beta\",\n" +" \"known-clients\": \"never\",\n" " \"option-data\": [ ],\n" " \"pool\": \"2001:db8:2::/80\"\n" " },\n" " {\n" " \"client-class\": \"gamma\",\n" +" \"known-clients\": \"only\",\n" " \"option-data\": [ ],\n" " \"pool\": \"2001:db8:3::/80\"\n" " },\n" @@ -4546,6 +4552,7 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"client-class\": \"beta\",\n" " \"delegated-len\": 64,\n" +" \"known-clients\": \"never\",\n" " \"option-data\": [ ],\n" " \"prefix\": \"2001:db8:2::\",\n" " \"prefix-len\": 48\n" @@ -4553,6 +4560,7 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"client-class\": \"gamma\",\n" " \"delegated-len\": 64,\n" +" \"known-clients\": \"only\",\n" " \"option-data\": [ ],\n" " \"prefix\": \"2001:db8:3::\",\n" " \"prefix-len\": 48\n" diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index 8da02897ae..272600088d 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -265,6 +265,44 @@ TEST(Subnet4Test, pool4InSubnet4) { ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false, IOAddress("192.1.2.195"))); EXPECT_EQ(mypool, pool3); + + // And now known clients + EXPECT_EQ(Pool::SERVE_BOTH, pool1->getKnownClients()); + pool2->setKnownClients(Pool::SERVE_KNOWN); + pool3->setKnownClients(Pool::SERVE_UNKNOWN); + pool4->setKnownClients(Pool::SERVE_UNKNOWN); + + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + IOAddress("192.1.2.64"))); + EXPECT_EQ(mypool, pool1); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, + IOAddress("192.1.2.64"))); + EXPECT_EQ(mypool, pool1); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + IOAddress("192.1.2.129"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, + IOAddress("192.1.2.129"))); + + EXPECT_EQ(mypool, pool2); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, false, + IOAddress("192.1.2.195"))); + EXPECT_EQ(mypool, pool3); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, true, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + IOAddress("192.1.2.201"))); + EXPECT_EQ(mypool, pool4); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, + IOAddress("192.1.2.201"))); + EXPECT_FALSE(mypool); } // Check if it's possible to get specified number of possible leases for @@ -323,6 +361,16 @@ TEST(Subnet4Test, getCapacity) { EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class, false)); EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false)); EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes, false)); + + // And now known clients + EXPECT_EQ(Pool::SERVE_BOTH, pool1->getKnownClients()); + pool2->setKnownClients(Pool::SERVE_KNOWN); + pool3->setKnownClients(Pool::SERVE_UNKNOWN); + + EXPECT_EQ(132, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, false)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, true)); + EXPECT_EQ(136, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, true)); } // Checks that it is not allowed to add invalid pools. @@ -559,6 +607,11 @@ TEST(Subnet4Test, inRangeinPool) { three_classes.insert("bar"); three_classes.insert("baz"); EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false)); + + // Add known clients + pool1->setKnownClients(Pool::SERVE_UNKNOWN); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, true)); } // This test checks if the toText() method returns text representation @@ -789,6 +842,13 @@ TEST(Subnet6Test, Pool6getCapacity) { EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), subnet->getPoolCapacity(Lease::TYPE_NA, three_classes, false)); + // Add known clients + pool2->setKnownClients(Pool::SERVE_KNOWN); + EXPECT_EQ(uint64_t(65536), + subnet->getPoolCapacity(Lease::TYPE_NA, no_class, false)); + EXPECT_EQ(uint64_t(4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, no_class, true)); + // This is 2^64 prefixes. We're overflown uint64_t. PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64)); subnet->addPool(pool4); @@ -799,7 +859,6 @@ TEST(Subnet6Test, Pool6getCapacity) { subnet->addPool(pool5); EXPECT_EQ(std::numeric_limits::max(), subnet->getPoolCapacity(Lease::TYPE_NA)); - } // Test checks whether the number of prefixes available in the pools are @@ -903,6 +962,33 @@ TEST(Subnet6Test, Pool6InSubnet6) { mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); + + // Add know cients + pool3->setKnownClients(Pool::SERVE_UNKNOWN); + mypool = subnet->getPool(Lease::TYPE_NA, no_class, false, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, no_class, true, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, false, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, true, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, false, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, true, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, true, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); } // Check if Subnet6 supports different types of pools properly. @@ -1414,6 +1500,11 @@ TEST(Subnet6Test, inRangeinPool) { three_classes.insert("bar"); three_classes.insert("baz"); EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false)); + + // Add known clients + pool1->setKnownClients(Pool::SERVE_KNOWN); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, true)); } // This test verifies that inRange() and inPool() methods work properly From 288cb7276ca03e23bb46e225be1abe6ddc2d027b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 23 Nov 2017 22:20:13 +0100 Subject: [PATCH 20/52] [5374] Replaced unfinished white list by a simple(r) value --- src/bin/dhcp4/tests/config_parser_unittest.cc | 13 +-- src/bin/dhcp6/tests/config_parser_unittest.cc | 14 +--- src/lib/dhcpsrv/network.cc | 22 ++--- src/lib/dhcpsrv/network.h | 27 ++---- src/lib/dhcpsrv/pool.cc | 26 ++---- src/lib/dhcpsrv/pool.h | 18 ++-- src/lib/dhcpsrv/subnet.cc | 18 ++-- src/lib/dhcpsrv/tests/pool_unittest.cc | 84 +------------------ .../tests/shared_network_parser_unittest.cc | 8 +- src/lib/dhcpsrv/tests/subnet_unittest.cc | 84 +------------------ 10 files changed, 54 insertions(+), 260 deletions(-) diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index cb4088ab07..c53fbb3cd2 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -5682,8 +5682,7 @@ TEST_F(Dhcp4ParserTest, sharedNetworksDeriveClientClass) { SharedNetwork4Ptr net = nets->at(0); ASSERT_TRUE(net); - auto classes = net->getClientClasses(); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", net->getClientClass()); // The first shared network has two subnets. const Subnet4Collection * subs = net->getAllSubnets(); @@ -5694,15 +5693,12 @@ TEST_F(Dhcp4ParserTest, sharedNetworksDeriveClientClass) { // shared-network level. Subnet4Ptr s = checkSubnet(*subs, "192.0.1.0/24", 1, 2, 4); ASSERT_TRUE(s); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", s->getClientClass()); // For the second subnet, the values are overridden on subnet level. // The value should not be inherited. s = checkSubnet(*subs, "192.0.2.0/24", 1, 2, 4); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.contains("beta")); // beta defined on subnet level - EXPECT_FALSE(classes.contains("alpha")); // alpha defined on shared-network level + EXPECT_EQ("beta", s->getClientClass()); // beta defined on subnet level // Ok, now check the second shared network. It doesn't have anything defined // on shared-network or subnet level, so everything should have default @@ -5715,8 +5711,7 @@ TEST_F(Dhcp4ParserTest, sharedNetworksDeriveClientClass) { EXPECT_EQ(1, subs->size()); s = checkSubnet(*subs, "192.0.3.0/24", 1, 2, 4); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.empty()); + EXPECT_TRUE(s->getClientClass().empty()); } } diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 21c209604b..61c0342002 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -6146,9 +6146,7 @@ TEST_F(Dhcp6ParserTest, sharedNetworksDeriveClientClass) { // Let's check the first one. SharedNetwork6Ptr net = nets->at(0); ASSERT_TRUE(net); - - auto classes = net->getClientClasses(); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", net->getClientClass()); const Subnet6Collection * subs = net->getAllSubnets(); ASSERT_TRUE(subs); @@ -6158,16 +6156,13 @@ TEST_F(Dhcp6ParserTest, sharedNetworksDeriveClientClass) { // shared-network level. Subnet6Ptr s = checkSubnet(*subs, "2001:db1::/48", 900, 1800, 3600, 7200); ASSERT_TRUE(s); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", s->getClientClass()); // For the second subnet, the values are overridden on subnet level. // The value should not be inherited. s = checkSubnet(*subs, "2001:db2::/48", 900, 1800, 3600, 7200); ASSERT_TRUE(s); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.contains("beta")); // beta defined on subnet level - EXPECT_FALSE(classes.contains("alpha")); // alpha defined on shared-network level + EXPECT_EQ("beta", s->getClientClass()); // beta defined on subnet level // Ok, now check the second shared network. It doesn't have // anything defined on shared-network or subnet level, so @@ -6181,8 +6176,7 @@ TEST_F(Dhcp6ParserTest, sharedNetworksDeriveClientClass) { // This subnet should derive its renew-timer from global scope. s = checkSubnet(*subs, "2001:db3::/48", 900, 1800, 3600, 7200); - classes = s->getClientClasses(); - EXPECT_TRUE(classes.empty()); + EXPECT_TRUE(s->getClientClass().empty()); } // Tests if rapid-commit is derived properly. diff --git a/src/lib/dhcpsrv/network.cc b/src/lib/dhcpsrv/network.cc index 46b7aabb41..1297f2d38f 100644 --- a/src/lib/dhcpsrv/network.cc +++ b/src/lib/dhcpsrv/network.cc @@ -22,25 +22,18 @@ Network::RelayInfo::RelayInfo(const isc::asiolink::IOAddress& addr) bool Network::clientSupported(const isc::dhcp::ClientClasses& classes) const { - if (white_list_.empty()) { + if (client_class_.empty()) { // There is no class defined for this network, so we do // support everyone. return (true); } - for (ClientClasses::const_iterator it = white_list_.begin(); - it != white_list_.end(); ++it) { - if (classes.contains(*it)) { - return (true); - } - } - - return (false); + return (classes.contains(client_class_)); } void Network::allowClientClass(const isc::dhcp::ClientClass& class_name) { - white_list_.insert(class_name); + client_class_ = class_name; } ElementPtr @@ -60,12 +53,9 @@ Network::toElement() const { map->set("relay", relay); // Set client-class - const ClientClasses& cclasses = getClientClasses(); - if (cclasses.size() > 1) { - isc_throw(ToElementError, "client-class has too many items: " - << cclasses.size()); - } else if (!cclasses.empty()) { - map->set("client-class", Element::create(*cclasses.cbegin())); + const ClientClass& cclass = getClientClass(); + if (!cclass.empty()) { + map->set("client-class", Element::create(cclass)); } // Set renew-timer diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index 3909441a64..ab4a8d687f 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -88,7 +88,7 @@ public: /// @brief Constructor. Network() : iface_name_(), relay_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()), - white_list_(), t1_(0), t2_(0), valid_(0), + client_class_(""), t1_(0), t2_(0), valid_(0), host_reservation_mode_(HR_ALL), cfg_option_(new CfgOption()) { } @@ -159,31 +159,27 @@ public: /// it is supported. On the other hand, client belonging to classes /// "foobar" and "zyxxy" is not supported. /// - /// @todo: Currently the logic is simple: client is supported if it belongs - /// to any class mentioned in white_list_. We will eventually need a - /// way to specify more fancy logic (e.g. to meet all classes, not just - /// any) + /// @note: changed the planned white and black lists idea to a simple + /// client class name. /// /// @param client_classes list of all classes the client belongs to /// @return true if client can be supported, false otherwise virtual bool clientSupported(const isc::dhcp::ClientClasses& client_classes) const; - /// @brief Adds class class_name to the list of supported classes - /// - /// Also see explanation note in @ref white_list_. + /// @brief Sets the supported class to class class_name /// /// @param class_name client class to be supported by this subnet void allowClientClass(const isc::dhcp::ClientClass& class_name); - /// @brief returns the client class white list + /// @brief returns the client class /// /// @note The returned reference is only valid as long as the object /// returned it is valid. /// - /// @return client classes @ref white_list_ - const isc::dhcp::ClientClasses& getClientClasses() const { - return (white_list_); + /// @return client class @ref client_class_ + const isc::dhcp::ClientClass& getClientClass() const { + return (client_class_); } /// @brief Return valid-lifetime for addresses in that prefix @@ -275,12 +271,7 @@ protected: /// If defined, only clients belonging to that class will be allowed to use /// this particular network. The default value for this is an empty list, /// which means that any client is allowed, regardless of its class. - /// - /// @todo This is just a single list of allowed classes. We'll also need - /// to add a black-list (only classes on the list are rejected, the rest - /// are allowed). Implementing this will require more fancy parser logic, - /// so it may be a while until we support this. - ClientClasses white_list_; + ClientClass client_class_; /// @brief a Triplet (min/default/max) holding allowed renew timer values Triplet t1_; diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 9e6aca6389..89cbd607df 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -18,7 +18,7 @@ namespace dhcp { Pool::Pool(Lease::Type type, const isc::asiolink::IOAddress& first, const isc::asiolink::IOAddress& last) :id_(getNextID()), first_(first), last_(last), type_(type), - capacity_(0), cfg_option_(new CfgOption()), white_list_(), + capacity_(0), cfg_option_(new CfgOption()), client_class_(""), known_clients_(SERVE_BOTH), last_allocated_(first), last_allocated_valid_(false) { } @@ -30,19 +30,12 @@ bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { bool Pool::clientSupported(const ClientClasses& classes, bool known_client) const { bool match = false; - if (white_list_.empty()) { + if (client_class_.empty()) { // There is no class defined for this pool, so we do // support everyone. match = true; - } else { - - for (ClientClasses::const_iterator it = white_list_.begin(); - it != white_list_.end(); ++it) { - if (classes.contains(*it)) { - match = true; - break; - } - } + } else if (classes.contains(client_class_)) { + match = true; } if (!match) { @@ -63,7 +56,7 @@ bool Pool::clientSupported(const ClientClasses& classes, } void Pool::allowClientClass(const ClientClass& class_name) { - white_list_.insert(class_name); + client_class_ = class_name; } std::string @@ -132,12 +125,9 @@ Pool::toElement() const { map->set("option-data", opts->toElement()); // Set client-class - const ClientClasses& cclasses = getClientClasses(); - if (cclasses.size() > 1) { - isc_throw(ToElementError, "client-class has too many items: " - << cclasses.size()); - } else if (!cclasses.empty()) { - map->set("client-class", Element::create(*cclasses.cbegin())); + const ClientClass& cclass = getClientClass(); + if (!cclass.empty()) { + map->set("client-class", Element::create(cclass)); } // Set known-clients diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index d4fb980364..7ef00d59d5 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -117,9 +117,6 @@ public: /// @Checks whether this pool supports client that belongs to /// specified classes. /// - /// @todo: currently doing the same than network which - /// is known to be improved. - /// /// @param client_classes list of all classes the client belongs to /// @param known_client true if the client is known, i.e. has a /// reservation @@ -127,20 +124,19 @@ public: bool clientSupported(const ClientClasses& client_classes, bool known_client) const; - /// @brief Adds class class_name to the list of supported classes + /// @brief Sets the supported class to class class_name /// /// @param class_name client class to be supported by this pool void allowClientClass(const ClientClass& class_name); - /// @brief returns the client class white list + /// @brief returns the client class /// - /// @note Currently white list is empty or has one element /// @note The returned reference is only valid as long as the object /// returned is valid. /// - /// @return client classes @ref white_list_ - const ClientClasses& getClientClasses() const { - return (white_list_); + /// @return client class @ref client_class_ + const ClientClass& getClientClass() const { + return (client_class_); } /// @brief Returns the value of known clients @@ -239,8 +235,8 @@ protected: /// @brief Optional definition of a client class /// - /// @ref Network::white_list_ - ClientClasses white_list_; + /// @ref Network::client_class_ + ClientClass client_class_; /// @brief Value of known clients KnownClients known_clients_; diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 31d285c7ed..3b44a6707a 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -740,12 +740,9 @@ Subnet6::toElement() const { ConstCfgOptionPtr opts = (*pool)->getCfgOption(); pool_map->set("option-data", opts->toElement()); // Set client-class - const ClientClasses& cclasses = (*pool)->getClientClasses(); - if (cclasses.size() > 1) { - isc_throw(ToElementError, "client-class has too many items: " - << cclasses.size()); - } else if (!cclasses.empty()) { - pool_map->set("client-class", Element::create(*cclasses.cbegin())); + const ClientClass& cclass = (*pool)->getClientClass(); + if (!cclass.empty()) { + pool_map->set("client-class", Element::create(cclass)); } // Set known-clients Pool::KnownClients kc = (*pool)->getKnownClients(); @@ -809,12 +806,9 @@ Subnet6::toElement() const { ConstCfgOptionPtr opts = pdpool->getCfgOption(); pool_map->set("option-data", opts->toElement()); // Set client-class - const ClientClasses& cclasses = pdpool->getClientClasses(); - if (cclasses.size() > 1) { - isc_throw(ToElementError, "client-class has too many items: " - << cclasses.size()); - } else if (!cclasses.empty()) { - pool_map->set("client-class", Element::create(*cclasses.cbegin())); + const ClientClass& cclass = pdpool->getClientClass(); + if (!cclass.empty()) { + pool_map->set("client-class", Element::create(cclass)); } // Set known-clients Pool::KnownClients kc = pdpool->getKnownClients(); diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index bc54a7ed0b..d1b8b462b6 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -214,7 +214,7 @@ TEST(Pool4Test, clientClass) { three_classes.insert("baz"); // No class restrictions defined, any client should be supported - EXPECT_EQ(0, pool->getClientClasses().size()); + EXPECT_TRUE(pool->getClientClass().empty()); EXPECT_TRUE(pool->clientSupported(no_class, false)); EXPECT_TRUE(pool->clientSupported(foo_class, false)); EXPECT_TRUE(pool->clientSupported(bar_class, false)); @@ -222,7 +222,7 @@ TEST(Pool4Test, clientClass) { // Let's allow only clients belonging to "bar" class. pool->allowClientClass("bar"); - EXPECT_EQ(1, pool->getClientClasses().size()); + EXPECT_EQ("bar", pool->getClientClass()); EXPECT_FALSE(pool->clientSupported(no_class, false)); EXPECT_FALSE(pool->clientSupported(foo_class, false)); @@ -230,44 +230,6 @@ TEST(Pool4Test, clientClass) { EXPECT_TRUE(pool->clientSupported(three_classes, false)); } -// This test checks that handling for multiple client-classes is valid. -TEST(Pool4Test, clientClasses) { - // Create a pool. - Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), - IOAddress("192.0.2.255"))); - - // This client does not belong to any class. - isc::dhcp::ClientClasses no_class; - - // This client belongs to foo only. - isc::dhcp::ClientClasses foo_class; - foo_class.insert("foo"); - - // This client belongs to bar only. I like that client. - isc::dhcp::ClientClasses bar_class; - bar_class.insert("bar"); - - // No class restrictions defined, any client should be supported - EXPECT_EQ(0, pool->getClientClasses().size()); - EXPECT_TRUE(pool->clientSupported(no_class, false)); - EXPECT_TRUE(pool->clientSupported(foo_class, false)); - EXPECT_TRUE(pool->clientSupported(bar_class, false)); - - // Let's allow clients belonging to "bar" or "foo" class. - pool->allowClientClass("bar"); - pool->allowClientClass("foo"); - EXPECT_EQ(2, pool->getClientClasses().size()); - - // Class-less clients are to be rejected. - EXPECT_FALSE(pool->clientSupported(no_class, false)); - - // Clients in foo class should be accepted. - EXPECT_TRUE(pool->clientSupported(foo_class, false)); - - // Clients in bar class should be accepted as well. - EXPECT_TRUE(pool->clientSupported(bar_class, false)); -} - // This test checks that handling for known-clients is valid. TEST(Pool4Test, knownClients) { // Create a pool. @@ -632,7 +594,7 @@ TEST(Pool6Test, clientClass) { three_classes.insert("baz"); // No class restrictions defined, any client should be supported - EXPECT_EQ(0, pool.getClientClasses().size()); + EXPECT_TRUE(pool.getClientClass().empty()); EXPECT_TRUE(pool.clientSupported(no_class, false)); EXPECT_TRUE(pool.clientSupported(foo_class, false)); EXPECT_TRUE(pool.clientSupported(bar_class, false)); @@ -640,7 +602,7 @@ TEST(Pool6Test, clientClass) { // Let's allow only clients belonging to "bar" class. pool.allowClientClass("bar"); - EXPECT_EQ(1, pool.getClientClasses().size()); + EXPECT_EQ("bar", pool.getClientClass()); EXPECT_FALSE(pool.clientSupported(no_class, false)); EXPECT_FALSE(pool.clientSupported(foo_class, false)); @@ -648,44 +610,6 @@ TEST(Pool6Test, clientClass) { EXPECT_TRUE(pool.clientSupported(three_classes, false)); } -// This test checks that handling for multiple client-classes is valid. -TEST(Pool6Test, clientClasses) { - // Create a pool. - Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), - IOAddress("2001:db8::2")); - - // This client does not belong to any class. - isc::dhcp::ClientClasses no_class; - - // This client belongs to foo only. - isc::dhcp::ClientClasses foo_class; - foo_class.insert("foo"); - - // This client belongs to bar only. I like that client. - isc::dhcp::ClientClasses bar_class; - bar_class.insert("bar"); - - // No class restrictions defined, any client should be supported - EXPECT_EQ(0, pool.getClientClasses().size()); - EXPECT_TRUE(pool.clientSupported(no_class, false)); - EXPECT_TRUE(pool.clientSupported(foo_class, false)); - EXPECT_TRUE(pool.clientSupported(bar_class, false)); - - // Let's allow clients belonging to "bar" or "foo" class. - pool.allowClientClass("bar"); - pool.allowClientClass("foo"); - EXPECT_EQ(2, pool.getClientClasses().size()); - - // Class-less clients are to be rejected. - EXPECT_FALSE(pool.clientSupported(no_class, false)); - - // Clients in foo class should be accepted. - EXPECT_TRUE(pool.clientSupported(foo_class, false)); - - // Clients in bar class should be accepted as well. - EXPECT_TRUE(pool.clientSupported(bar_class, false)); -} - // This test checks that handling for known-clients is valid. TEST(Pool6Test, knownClients) { // Create a pool. diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index 03329f87e3..10a60ddb97 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -159,9 +159,7 @@ TEST_F(SharedNetwork4ParserTest, clientClassMatchClientId) { network = parser.parse(config_element); ASSERT_TRUE(network); - const ClientClasses classes = network->getClientClasses(); - ASSERT_EQ(1, classes.size()); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", network->getClientClass()); EXPECT_FALSE(network->getMatchClientId()); } @@ -278,9 +276,7 @@ TEST_F(SharedNetwork6ParserTest, clientClass) { network = parser.parse(config_element); ASSERT_TRUE(network); - const ClientClasses classes = network->getClientClasses(); - ASSERT_EQ(1, classes.size()); - EXPECT_TRUE(classes.contains("alpha")); + EXPECT_EQ("alpha", network->getClientClass()); } } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index 272600088d..a53107ca53 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -469,7 +469,7 @@ TEST(Subnet4Test, clientClasses) { four_classes.insert("network"); // No class restrictions defined, any client should be supported - EXPECT_EQ(0, subnet->getClientClasses().size()); + EXPECT_TRUE(subnet->getClientClass().empty()); EXPECT_TRUE(subnet->clientSupported(no_class)); EXPECT_TRUE(subnet->clientSupported(foo_class)); EXPECT_TRUE(subnet->clientSupported(bar_class)); @@ -477,7 +477,7 @@ TEST(Subnet4Test, clientClasses) { // Let's allow only clients belonging to "bar" class. subnet->allowClientClass("bar"); - EXPECT_EQ(1, subnet->getClientClasses().size()); + EXPECT_EQ("bar", subnet->getClientClass()); EXPECT_FALSE(subnet->clientSupported(no_class)); EXPECT_FALSE(subnet->clientSupported(foo_class)); @@ -499,44 +499,6 @@ TEST(Subnet4Test, clientClasses) { EXPECT_TRUE(subnet->clientSupported(four_classes)); } -// Tests whether Subnet4 object is able to store and process properly -// information about allowed client classes (multiple classes allowed). -TEST(Subnet4Test, clientClassesMultiple) { - // Create the V4 subnet. - Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 8, 1, 2, 3)); - - // This client does not belong to any class. - isc::dhcp::ClientClasses no_class; - - // This client belongs to foo only. - isc::dhcp::ClientClasses foo_class; - foo_class.insert("foo"); - - // This client belongs to bar only. I like that client. - isc::dhcp::ClientClasses bar_class; - bar_class.insert("bar"); - - // No class restrictions defined, any client should be supported - EXPECT_EQ(0, subnet->getClientClasses().size()); - EXPECT_TRUE(subnet->clientSupported(no_class)); - EXPECT_TRUE(subnet->clientSupported(foo_class)); - EXPECT_TRUE(subnet->clientSupported(bar_class)); - - // Let's allow clients belonging to "bar" or "foo" class. - subnet->allowClientClass("bar"); - subnet->allowClientClass("foo"); - EXPECT_EQ(2, subnet->getClientClasses().size()); - - // Class-less clients are to be rejected. - EXPECT_FALSE(subnet->clientSupported(no_class)); - - // Clients in foo class should be accepted. - EXPECT_TRUE(subnet->clientSupported(foo_class)); - - // Clients in bar class should be accepted as well. - EXPECT_TRUE(subnet->clientSupported(bar_class)); -} - TEST(Subnet4Test, addInvalidOption) { // Create the V4 subnet. Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 8, 1, 2, 3)); @@ -1093,7 +1055,7 @@ TEST(Subnet6Test, clientClasses) { four_classes.insert("network"); // No class restrictions defined, any client should be supported - EXPECT_EQ(0, subnet->getClientClasses().size()); + EXPECT_TRUE(subnet->getClientClass().empty()); EXPECT_TRUE(subnet->clientSupported(no_class)); EXPECT_TRUE(subnet->clientSupported(foo_class)); EXPECT_TRUE(subnet->clientSupported(bar_class)); @@ -1101,7 +1063,7 @@ TEST(Subnet6Test, clientClasses) { // Let's allow only clients belonging to "bar" class. subnet->allowClientClass("bar"); - EXPECT_EQ(1, subnet->getClientClasses().size()); + EXPECT_EQ("bar", subnet->getClientClass()); EXPECT_FALSE(subnet->clientSupported(no_class)); EXPECT_FALSE(subnet->clientSupported(foo_class)); @@ -1123,44 +1085,6 @@ TEST(Subnet6Test, clientClasses) { EXPECT_TRUE(subnet->clientSupported(four_classes)); } -// Tests whether Subnet6 object is able to store and process properly -// information about allowed client class (multiple classes allowed). -TEST(Subnet6Test, clientClassesMultiple) { - // Create the V6 subnet. - Subnet6Ptr subnet(new Subnet6(IOAddress("2001:db8:1::"), 56, 1, 2, 3, 4)); - - // This client does not belong to any class. - isc::dhcp::ClientClasses no_class; - - // This client belongs to foo only. - isc::dhcp::ClientClasses foo_class; - foo_class.insert("foo"); - - // This client belongs to bar only. I like that client. - isc::dhcp::ClientClasses bar_class; - bar_class.insert("bar"); - - // No class restrictions defined, any client should be supported - EXPECT_EQ(0, subnet->getClientClasses().size()); - EXPECT_TRUE(subnet->clientSupported(no_class)); - EXPECT_TRUE(subnet->clientSupported(foo_class)); - EXPECT_TRUE(subnet->clientSupported(bar_class)); - - // Let's allow only clients belonging to "foo" or "bar" class. - subnet->allowClientClass("foo"); - subnet->allowClientClass("bar"); - EXPECT_EQ(2, subnet->getClientClasses().size()); - - // Class-less clients are to be rejected. - EXPECT_FALSE(subnet->clientSupported(no_class)); - - // Clients in foo class should be accepted. - EXPECT_TRUE(subnet->clientSupported(foo_class)); - - // Clients in bar class should be accepted as well. - EXPECT_TRUE(subnet->clientSupported(bar_class)); -} - // Checks that it is not allowed to add invalid pools. TEST(Subnet6Test, pool6Checks) { From 4edac2d90ede7b4cb8676e515943551760084ffb Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 01:07:17 +0100 Subject: [PATCH 21/52] [5374] Updated ClientClasses definition --- src/bin/dhcp4/dhcp4_srv.cc | 26 +++---- src/bin/dhcp6/dhcp6_srv.cc | 18 ++--- src/lib/dhcp/classify.cc | 9 +-- src/lib/dhcp/classify.h | 74 +++++++++++++++---- src/lib/dhcp/pkt.cc | 6 +- src/lib/dhcp/tests/classify_unittest.cc | 12 +-- src/lib/dhcpsrv/host.cc | 16 ++-- .../generic_host_data_source_unittest.cc | 2 +- .../tests/host_reservation_parser_unittest.cc | 8 +- src/lib/dhcpsrv/tests/host_unittest.cc | 3 +- 10 files changed, 108 insertions(+), 66 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 8912441fa4..39550c1b1c 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -159,10 +159,9 @@ Dhcpv4Exchange::Dhcpv4Exchange(const AllocEnginePtr& alloc_engine, const ClientClasses& classes = query_->getClasses(); if (!classes.empty()) { - std::string joined_classes = boost::algorithm::join(classes, ", "); LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_ASSIGNED) .arg(query_->getLabel()) - .arg(joined_classes); + .arg(classes.toText()); } }; @@ -381,9 +380,10 @@ Dhcpv4Exchange::setHostIdentifiers() { void Dhcpv4Exchange::setReservedClientClasses() { if (context_->currentHost() && query_) { - BOOST_FOREACH(const std::string& client_class, - context_->currentHost()->getClientClasses4()) { - query_->addClass(client_class); + const ClientClasses& classes = context_->currentHost()->getClientClasses4(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + query_->addClass(*cclass); } } } @@ -1199,8 +1199,8 @@ Dhcpv4Srv::buildCfgOptionList(Dhcpv4Exchange& ex) { // Each class in the incoming packet const ClientClasses& classes = ex.getQuery()->getClasses(); - for (ClientClasses::const_iterator cclass = classes.begin(); - cclass != classes.end(); ++cclass) { + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { // Find the client class definition for this class const ClientClassDefPtr& ccdef = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->findClass(*cclass); @@ -2249,8 +2249,8 @@ Dhcpv4Srv::setFixedFields(Dhcpv4Exchange& ex) { // Now we need to iterate over the classes assigned to the // query packet and find corresponding class definitions for it. - for (ClientClasses::const_iterator name = classes.begin(); - name != classes.end(); ++name) { + for (ClientClasses::const_iterator name = classes.cbegin(); + name != classes.cend(); ++name) { ClientClassDefMap::const_iterator cl = defs->find(*name); if (cl == defs->end()) { @@ -2960,8 +2960,8 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { // Note getClientClassDictionary() cannot be null const ClientClassDefMapPtr& defs_ptr = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->getClasses(); - for (ClientClassDefMap::const_iterator it = defs_ptr->begin(); - it != defs_ptr->end(); ++it) { + for (ClientClassDefMap::const_iterator it = defs_ptr->cbegin(); + it != defs_ptr->cend(); ++it) { // Note second cannot be null const ExpressionPtr& expr_ptr = it->second->getMatchExpr(); // Nothing to do without an expression to evaluate @@ -3003,8 +3003,8 @@ Dhcpv4Srv::deferredUnpack(Pkt4Ptr& query) OptionDefinitionPtr def; // Iterate on client classes const ClientClasses& classes = query->getClasses(); - for (ClientClasses::const_iterator cclass = classes.begin(); - cclass != classes.end(); ++cclass) { + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { // Get the client class definition for this class const ClientClassDefPtr& ccdef = CfgMgr::instance().getCurrentCfg()-> diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index a0aa2cb111..0416883276 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -896,8 +896,8 @@ Dhcpv6Srv::buildCfgOptionList(const Pkt6Ptr& question, // Each class in the incoming packet const ClientClasses& classes = question->getClasses(); - for (ClientClasses::const_iterator cclass = classes.begin(); - cclass != classes.end(); ++cclass) { + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { // Find the client class definition for this class const ClientClassDefPtr& ccdef = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->findClass(*cclass); @@ -3087,8 +3087,8 @@ void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { // Note getClientClassDictionary() cannot be null const ClientClassDefMapPtr& defs_ptr = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->getClasses(); - for (ClientClassDefMap::const_iterator it = defs_ptr->begin(); - it != defs_ptr->end(); ++it) { + for (ClientClassDefMap::const_iterator it = defs_ptr->cbegin(); + it != defs_ptr->cend(); ++it) { // Note second cannot be null const ExpressionPtr& expr_ptr = it->second->getMatchExpr(); // Nothing to do without an expression to evaluate @@ -3127,18 +3127,18 @@ void Dhcpv6Srv::setReservedClientClasses(const Pkt6Ptr& pkt, const AllocEngine::ClientContext6& ctx) { if (ctx.currentHost() && pkt) { - BOOST_FOREACH(const std::string& client_class, - ctx.currentHost()->getClientClasses6()) { - pkt->addClass(client_class); + const ClientClasses& classes = ctx.currentHost()->getClientClasses6(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + pkt->addClass(*cclass); } } const ClientClasses& classes = pkt->getClasses(); if (!classes.empty()) { - std::string joined_classes = boost::algorithm::join(classes, ", "); LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_ASSIGNED) .arg(pkt->getLabel()) - .arg(joined_classes); + .arg(classes.toText()); } } diff --git a/src/lib/dhcp/classify.cc b/src/lib/dhcp/classify.cc index 95fc5dd08b..e234598e94 100644 --- a/src/lib/dhcp/classify.cc +++ b/src/lib/dhcp/classify.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -17,7 +17,7 @@ namespace isc { namespace dhcp { ClientClasses::ClientClasses(const std::string& class_names) - : std::set() { + : list_(), set_() { std::vector split_text; boost::split(split_text, class_names, boost::is_any_of(","), boost::algorithm::token_compress_off); @@ -33,8 +33,8 @@ ClientClasses::ClientClasses(const std::string& class_names) std::string ClientClasses::toText(const std::string& separator) const { std::stringstream s; - for (const_iterator class_it = begin(); class_it != end(); ++class_it) { - if (class_it != begin()) { + for (const_iterator class_it = cbegin(); class_it != cend(); ++class_it) { + if (class_it != cbegin()) { s << separator; } s << *class_it; @@ -44,4 +44,3 @@ ClientClasses::toText(const std::string& separator) const { } // end of namespace isc::dhcp } // end of namespace isc - diff --git a/src/lib/dhcp/classify.h b/src/lib/dhcp/classify.h index 174930c348..14614313fc 100644 --- a/src/lib/dhcp/classify.h +++ b/src/lib/dhcp/classify.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -7,8 +7,10 @@ #ifndef CLASSIFY_H #define CLASSIFY_H -#include #include +#include +#include +#include /// @file classify.h /// @@ -36,34 +38,67 @@ namespace dhcp { /// @brief Container for storing client class names /// - /// Depending on how you look at it, this is either a little more than just - /// a set of strings or a client classifier that performs access control. - /// For now, it is a simple access list that may contain zero or more - /// class names. It is expected to grow in complexity once support for - /// client classes becomes more feature rich. - /// - /// Note: This class is derived from std::set which may not have Doxygen - /// documentation. See http://www.cplusplus.com/reference/set/set/. - class ClientClasses : public std::set { + /// Both a list to iterate on it in insert order and unordered + /// set of names for existence. + class ClientClasses { public: + /// @brief Type of iterators + typedef std::list::const_iterator const_iterator; + /// @brief Default constructor. - ClientClasses() : std::set() { + ClientClasses() : list_(), set_() { } /// @brief Constructor from comma separated values. /// /// @param class_names A string containing a client classes separated /// with commas. The class names are trimmed before insertion to the set. - ClientClasses(const std::string& class_names); + ClientClasses(const ClientClass& class_names); + + /// @brief Insert an element. + /// + /// @param class_name The name of the class to insert + void insert(const ClientClass& class_name) { + list_.push_back(class_name); + set_.insert(class_name); + } + + /// @brief Check if classes is empty. + bool empty() const { + return (list_.empty()); + } + + /// @brief Returns the number of classes. + /// + /// @note; in C++ 11 list size complexity is constant so + /// there is no advantage to use the set part. + size_t size() const { + return (list_.size()); + } + + /// @brief Iterator to the first element. + const_iterator cbegin() const { + return (list_.cbegin()); + } + + /// @brief Iterator to the past the end element. + const_iterator cend() const { + return (list_.cend()); + } /// @brief returns if class x belongs to the defined classes /// /// @param x client class to be checked /// @return true if x belongs to the classes - bool - contains(const ClientClass& x) const { - return (find(x) != end()); + bool contains(const ClientClass& x) const { + return (set_.count(x) != 0); + } + + /// @brief Clears containers. + void clear() { + list_.clear(); + set_.clear(); } /// @brief Returns all class names as text @@ -72,6 +107,13 @@ namespace dhcp { /// default separator comprises comma sign followed by space /// character. std::string toText(const std::string& separator = ", ") const; + + private: + /// @brief List/ordered part + std::list list_; + + /// @brief Set/unordered part + std::unordered_set set_; }; }; diff --git a/src/lib/dhcp/pkt.cc b/src/lib/dhcp/pkt.cc index bfee10e0e4..ac633f078c 100644 --- a/src/lib/dhcp/pkt.cc +++ b/src/lib/dhcp/pkt.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -93,12 +93,12 @@ Pkt::delOption(uint16_t type) { bool Pkt::inClass(const std::string& client_class) { - return (classes_.find(client_class) != classes_.end()); + return (classes_.contains(client_class)); } void Pkt::addClass(const std::string& client_class) { - if (classes_.find(client_class) == classes_.end()) { + if (!classes_.contains(client_class)) { classes_.insert(client_class); } } diff --git a/src/lib/dhcp/tests/classify_unittest.cc b/src/lib/dhcp/tests/classify_unittest.cc index 215551eb06..14e9d58443 100644 --- a/src/lib/dhcp/tests/classify_unittest.cc +++ b/src/lib/dhcp/tests/classify_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -86,8 +86,8 @@ TEST(ClassifyTest, ClientClassesIterator) { bool seenbeta = false; bool seengamma = false; bool seendelta = false; - for (ClientClasses::const_iterator it = classes.begin(); - it != classes.end(); ++it) { + for (ClientClasses::const_iterator it = classes.cbegin(); + it != classes.cend(); ++it) { ++count; if (*it == "alpha") { seenalpha = true; @@ -124,10 +124,10 @@ TEST(ClassifyTest, ClientClassesToText) { classes.insert("gamma"); EXPECT_EQ("alpha, gamma", classes.toText()); - // Insert third class and make sure they get ordered alphabetically. + // Insert third class and make sure they get ordered in insert order. classes.insert("beta"); - EXPECT_EQ("alpha, beta, gamma", classes.toText()); + EXPECT_EQ("alpha, gamma, beta", classes.toText()); // Check non-standard separator. - EXPECT_EQ("alpha.beta.gamma", classes.toText(".")); + EXPECT_EQ("alpha.gamma.beta", classes.toText(".")); } diff --git a/src/lib/dhcpsrv/host.cc b/src/lib/dhcpsrv/host.cc index 573047bdaf..5e9295a1f4 100644 --- a/src/lib/dhcpsrv/host.cc +++ b/src/lib/dhcpsrv/host.cc @@ -451,7 +451,7 @@ Host::toElement4() const { const ClientClasses& cclasses = getClientClasses4(); ElementPtr classes = Element::createList(); for (ClientClasses::const_iterator cclass = cclasses.cbegin(); - cclass != cclasses.end(); ++cclass) { + cclass != cclasses.cend(); ++cclass) { classes->add(Element::create(*cclass)); } map->set("client-classes", classes); @@ -508,7 +508,7 @@ Host::toElement6() const { const ClientClasses& cclasses = getClientClasses6(); ElementPtr classes = Element::createList(); for (ClientClasses::const_iterator cclass = cclasses.cbegin(); - cclass != cclasses.end(); ++cclass) { + cclass != cclasses.cend(); ++cclass) { classes->add(Element::create(*cclass)); } map->set("client-classes", classes); @@ -568,18 +568,18 @@ Host::toText() const { } // Add DHCPv4 client classes. - for (ClientClasses::const_iterator cclass = dhcp4_client_classes_.begin(); - cclass != dhcp4_client_classes_.end(); ++cclass) { + for (ClientClasses::const_iterator cclass = dhcp4_client_classes_.cbegin(); + cclass != dhcp4_client_classes_.cend(); ++cclass) { s << " dhcp4_class" - << std::distance(dhcp4_client_classes_.begin(), cclass) + << std::distance(dhcp4_client_classes_.cbegin(), cclass) << "=" << *cclass; } // Add DHCPv6 client classes. - for (ClientClasses::const_iterator cclass = dhcp6_client_classes_.begin(); - cclass != dhcp6_client_classes_.end(); ++cclass) { + for (ClientClasses::const_iterator cclass = dhcp6_client_classes_.cbegin(); + cclass != dhcp6_client_classes_.cend(); ++cclass) { s << " dhcp6_class" - << std::distance(dhcp6_client_classes_.begin(), cclass) + << std::distance(dhcp6_client_classes_.cbegin(), cclass) << "=" << *cclass; } diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc index 75e46c14b4..78491996c0 100644 --- a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc @@ -333,7 +333,7 @@ GenericHostDataSourceTest::compareReservations6(IPv6ResrvRange resrv1, void GenericHostDataSourceTest::compareClientClasses(const ClientClasses& classes1, const ClientClasses& classes2) { - EXPECT_TRUE(std::equal(classes1.begin(), classes1.end(), classes2.begin())); + EXPECT_TRUE(std::equal(classes1.cbegin(), classes1.cend(), classes2.cbegin())); } void diff --git a/src/lib/dhcpsrv/tests/host_reservation_parser_unittest.cc b/src/lib/dhcpsrv/tests/host_reservation_parser_unittest.cc index 5d5934a6ff..7f8681b23d 100644 --- a/src/lib/dhcpsrv/tests/host_reservation_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_reservation_parser_unittest.cc @@ -410,8 +410,8 @@ TEST_F(HostReservationParserTest, dhcp4ClientClasses) { const ClientClasses& classes = hosts[0]->getClientClasses4(); ASSERT_EQ(2, classes.size()); - EXPECT_EQ(1, classes.count("foo")); - EXPECT_EQ(1, classes.count("bar")); + EXPECT_TRUE(classes.contains("foo")); + EXPECT_TRUE(classes.contains("bar")); CfgMgr::instance().setFamily(AF_INET); CfgHostsSubnet cfg_subnet(cfg_hosts, SubnetID(10)); @@ -881,8 +881,8 @@ TEST_F(HostReservationParserTest, dhcp6ClientClasses) { const ClientClasses& classes = hosts[0]->getClientClasses6(); ASSERT_EQ(2, classes.size()); - EXPECT_EQ(1, classes.count("foo")); - EXPECT_EQ(1, classes.count("bar")); + EXPECT_TRUE(classes.contains("foo")); + EXPECT_TRUE(classes.contains("bar")); // lower duid value boost::algorithm::to_lower(config); diff --git a/src/lib/dhcpsrv/tests/host_unittest.cc b/src/lib/dhcpsrv/tests/host_unittest.cc index fad37178ec..bf08403111 100644 --- a/src/lib/dhcpsrv/tests/host_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_unittest.cc @@ -1000,13 +1000,14 @@ TEST_F(HostTest, toText) { host->addClientClass6("hub"); host->addClientClass6("device"); + // Note that now classes are in insert order. EXPECT_EQ("duid=1112131415 hostname=myhost ipv4_reservation=(no)" " siaddr=(no)" " sname=(empty)" " file=(empty)" " ipv6_reservations=(none)" " dhcp4_class0=modem dhcp4_class1=router" - " dhcp6_class0=device dhcp6_class1=hub", + " dhcp6_class0=hub dhcp6_class1=device", host->toText()); } From 0af25b87112b02bfd5ea824de9e20125b438a236 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 09:21:20 +0100 Subject: [PATCH 22/52] [5374] Checkpoint: added member token, syntax and tests todo --- .../parsers/client_class_def_parser.cc | 41 +++++++++++++++++-- .../dhcpsrv/parsers/client_class_def_parser.h | 23 ++++++++++- src/lib/eval/eval.dox | 7 ++++ src/lib/eval/eval_context.cc | 17 ++++++-- src/lib/eval/eval_context.h | 21 +++++++++- src/lib/eval/eval_messages.mes | 6 +++ src/lib/eval/tests/token_unittest.cc | 30 ++++++++++++++ src/lib/eval/token.cc | 14 +++++++ src/lib/eval/token.h | 24 +++++++++++ 9 files changed, 175 insertions(+), 8 deletions(-) diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc index 5829393342..6f1cfa1927 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc @@ -18,6 +18,7 @@ #include #include +#include using namespace isc::data; using namespace isc::asiolink; @@ -35,7 +36,8 @@ namespace dhcp { void ExpressionParser::parse(ExpressionPtr& expression, ConstElementPtr expression_cfg, - uint16_t family) { + uint16_t family, + std::function check_known) { if (expression_cfg->getType() != Element::string) { isc_throw(DhcpConfigError, "expression [" << expression_cfg->str() << "] must be a string, at (" @@ -47,7 +49,8 @@ ExpressionParser::parse(ExpressionPtr& expression, std::string value; expression_cfg->getValue(value); try { - EvalContext eval_ctx(family == AF_INET ? Option::V4 : Option::V6); + EvalContext eval_ctx(family == AF_INET ? Option::V4 : Option::V6, + check_known); eval_ctx.parseString(value); expression.reset(new Expression()); *expression = eval_ctx.expression; @@ -80,7 +83,9 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, std::string test; if (test_cfg) { ExpressionParser parser; - parser.parse(match_expr, test_cfg, family); + using std::placeholders::_1; + auto check_known = std::bind(isClientClassKnown, class_dictionary, _1); + parser.parse(match_expr, test_cfg, family, check_known); test = test_cfg->stringValue(); } @@ -190,6 +195,36 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, } } +std::list +ClientClassDefParser::builtinPrefixes = { + "VENDOR_CLASS_", "AFTER_", "EXTERNAL_" +}; + +bool +ClientClassDefParser::isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class) { + // First check built-in prefixes + for (std::list::const_iterator bt = builtinPrefixes.cbegin(); + bt != builtinPrefixes.cend(); ++bt) { + if (client_class.size() <= bt->size()) { + continue; + } + auto mis = std::mismatch(bt->cbegin(), bt->cend(), client_class.cbegin()); + if (mis.first == bt->cend()) { + return true; + } + } + + // Second check already defined, i.e. in the dictionary + ClientClassDefPtr def = class_dictionary->findClass(client_class); + if (def) { + return (true); + } + + // Unknown... + return (false); +} + // ****************** ClientClassDefListParser ************************ ClientClassDictionaryPtr diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.h b/src/lib/dhcpsrv/parsers/client_class_def_parser.h index 576ca4d63c..95a0a592c6 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.h +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.h @@ -9,7 +9,10 @@ #include #include +#include #include +#include +#include /// @file client_class_def_parser.h /// @@ -64,10 +67,14 @@ public: /// @param expression variable in which to store the new expression /// @param expression_cfg the configuration entry to be parsed. /// @param family the address family of the expression. + /// @param check_known a closure to check if a client class is known. /// /// @throw DhcpConfigError if parsing was unsuccessful. void parse(ExpressionPtr& expression, - isc::data::ConstElementPtr expression_cfg, uint16_t family); + isc::data::ConstElementPtr expression_cfg, + uint16_t family, + std::function check_known = + isc::eval::EvalContext::acceptAll); }; /// @brief Parser for a single client class definition. @@ -87,6 +94,20 @@ public: /// @throw DhcpConfigError if parsing was unsuccessful. void parse(ClientClassDictionaryPtr& class_dictionary, isc::data::ConstElementPtr client_class_def, uint16_t family); + + /// @brief List of built-in client class prefixes + /// i.e. VENDOR_CLASS_, AFTER_ and EXTERNAL_. + static std::list builtinPrefixes; + + /// @brief Check if a client class name is already known, + /// i.e. beginning by a built-in prefix or in the dictionary, + /// + /// @param class_dictionary A class dictionary where to look for. + /// @param client_class A client class name to look for. + /// @return true if known or built-in, false if not. + static bool + isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class); }; /// @brief Defines a pointer to a ClientClassDefParser diff --git a/src/lib/eval/eval.dox b/src/lib/eval/eval.dox index 80e7c61078..db29baa9aa 100644 --- a/src/lib/eval/eval.dox +++ b/src/lib/eval/eval.dox @@ -21,6 +21,13 @@ tokens that are stored in Reverse Polish Notation in EvalContext::expression. + Parameters to the @ref isc::eval::EvalContext class constructor are + the universe to choose between DHCPv4 and DHCPv6 for dependent expressions, + and a closure which checks if a client class is already known used + by the parser to accept only already known or built-in client + class names in client class membership expressions. This closure defaults + to accept all client class names. + Internally, the parser code is generated by flex and bison. These two tools convert lexer.ll and parser.yy files into a number of .cc and .hh files. To avoid a build of Kea depending on the presence of flex and bison, the diff --git a/src/lib/eval/eval_context.cc b/src/lib/eval/eval_context.cc index 562a67481b..72570dffb0 100644 --- a/src/lib/eval/eval_context.cc +++ b/src/lib/eval/eval_context.cc @@ -16,9 +16,10 @@ #include #include -EvalContext::EvalContext(const Option::Universe& option_universe) - : trace_scanning_(false), trace_parsing_(false), - option_universe_(option_universe) +EvalContext::EvalContext(const Option::Universe& option_universe, + std::function check_known) + : trace_scanning_(false), trace_parsing_(false), + option_universe_(option_universe), check_known_(check_known) { } @@ -26,6 +27,11 @@ EvalContext::~EvalContext() { } +bool +EvalContext::acceptAll(const ClientClass&) { + return (true); +} + bool EvalContext::parseString(const std::string& str, ParserType type) { @@ -183,6 +189,11 @@ EvalContext::fromUint32(const uint32_t integer) { return (tmp); } +bool +EvalContext::isClientClassKnown(const ClientClass& client_class) { + return (check_known_(client_class)); +} + void EvalContext::fatal (const std::string& what) { diff --git a/src/lib/eval/eval_context.h b/src/lib/eval/eval_context.h index e2eb816bc5..7690db1504 100644 --- a/src/lib/eval/eval_context.h +++ b/src/lib/eval/eval_context.h @@ -47,11 +47,21 @@ public: /// @param option_universe Option universe: DHCPv4 or DHCPv6. This is used /// by the parser to determine which option definitions set should be used /// to map option names to option codes. - EvalContext(const Option::Universe& option_universe); + /// @param check_known A closure called to check if a client class + /// used for membership is already known. If it is not the parser + /// will fail: only backward or built-in references are accepted. + EvalContext(const Option::Universe& option_universe, + std::function check_known = acceptAll); /// @brief destructor virtual ~EvalContext(); + /// @brief Accept all client class names + /// + /// @param client_class (unused) + /// @return true + static bool acceptAll(const ClientClass& client_class); + /// @brief Parsed expression (output tokens are stored here) isc::dhcp::Expression expression; @@ -169,6 +179,12 @@ public: return (option_universe_); } + /// @brief Check if a client class is already known + /// + /// @param client_class the client class name to check + /// @return true if the client class is known, false if not + bool isClientClassKnown(const ClientClass& client_class); + private: /// @brief Flag determining scanner debugging. bool trace_scanning_; @@ -182,6 +198,9 @@ public: /// set should be used to map option name to option code. Option::Universe option_universe_; + /// @brief Closure to check if a client class is already known + std::function check_known_; + }; }; // end of isc::eval namespace diff --git a/src/lib/eval/eval_messages.mes b/src/lib/eval/eval_messages.mes index 2a43435ec2..c70b7aeb3f 100644 --- a/src/lib/eval/eval_messages.mes +++ b/src/lib/eval/eval_messages.mes @@ -53,6 +53,12 @@ This debug message indicates that the given binary string is being pushed onto the value stack. This represents either an IPv4 or IPv6 address. The string is displayed in hex. +# For use with TokenMember + +% EVAL_DEBUG_MEMBER Checking membership of '%1', pushing result %2 +This debug message indicates that the membership of the packet for +the client class was checked. + # For use with TokenNot % EVAL_DEBUG_NOT Popping %1 pushing %2 diff --git a/src/lib/eval/tests/token_unittest.cc b/src/lib/eval/tests/token_unittest.cc index f9fee2ccff..f74c13d3b5 100644 --- a/src/lib/eval/tests/token_unittest.cc +++ b/src/lib/eval/tests/token_unittest.cc @@ -2193,6 +2193,36 @@ TEST_F(TokenTest, operatorOrTrue) { EXPECT_TRUE(checkFile()); } +// This test verifies client class membership +TEST_F(TokenTest, member) { + + ASSERT_NO_THROW(t_.reset(new TokenMember("foo"))); + + EXPECT_NO_THROW(t_->evaluate(*pkt4_, values_)); + + // the packet has no classes so false was left on the stack + ASSERT_EQ(1, values_.size()); + EXPECT_EQ("false", values_.top()); + values_.pop(); + + // Add bar and retry + pkt4_->addClass("bar"); + EXPECT_NO_THROW(t_->evaluate(*pkt4_, values_)); + + // the packet has a class but it is not foo + ASSERT_EQ(1, values_.size()); + EXPECT_EQ("false", values_.top()); + values_.pop(); + + // Add foo and retry + pkt4_->addClass("foo"); + EXPECT_NO_THROW(t_->evaluate(*pkt4_, values_)); + + // Now the packet is in the foo class + ASSERT_EQ(1, values_.size()); + EXPECT_EQ("true", values_.top()); +} + // This test verifies if expression vendor[4491].exists works properly in DHCPv4. TEST_F(TokenTest, vendor4SpecificVendorExists) { // Case 1: no option, should evaluate to false diff --git a/src/lib/eval/token.cc b/src/lib/eval/token.cc index 6356cffd34..8968a15e42 100644 --- a/src/lib/eval/token.cc +++ b/src/lib/eval/token.cc @@ -706,6 +706,20 @@ TokenOr::evaluate(Pkt& /*pkt*/, ValueStack& values) { .arg('\'' + values.top() + '\''); } +void +TokenMember::evaluate(Pkt& pkt, ValueStack& values) { + if (pkt.inClass(client_class_)) { + values.push("true"); + } else { + values.push("false"); + } + + // Log what we pushed + LOG_DEBUG(eval_logger, EVAL_DBG_STACK, EVAL_DEBUG_MEMBER) + .arg(client_class_) + .arg('\'' + values.top() + '\''); +} + TokenVendor::TokenVendor(Option::Universe u, uint32_t vendor_id, RepresentationType repr, uint16_t option_code) :TokenOption(option_code, repr), universe_(u), vendor_id_(vendor_id), diff --git a/src/lib/eval/token.h b/src/lib/eval/token.h index 08c267e5b5..630a11cd10 100644 --- a/src/lib/eval/token.h +++ b/src/lib/eval/token.h @@ -800,6 +800,30 @@ public: void evaluate(Pkt& pkt, ValueStack& values); }; +/// @brief Token that represents client class membership +/// +/// For example "not member('foo')" is the complement of class foo +class TokenMember : public Token { +public: + /// @brief Constructor + /// + /// @param client_class client class name + TokenMember(const std::string& client_class) + :client_class_(client_class){ + } + + /// @brief Token evaluation (check if client_class_ was added to + /// packet client classes) + /// + /// @param pkt the class name will be check from this packet's client classes + /// @param values true (if found) or false (if not found) will be pushed here + void evaluate(Pkt& pkt, ValueStack& values); + +protected: + /// @brief The client class name + ClientClass client_class_; +}; + /// @brief Token that represents vendor options in DHCPv4 and DHCPv6. /// /// It covers vendor independent vendor information option (125, DHCPv4) From 114607aefa384b53b4dfd6ebfd549435c77b174b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 09:32:35 +0100 Subject: [PATCH 23/52] [5374] Updated flex/bison --- src/lib/eval/lexer.ll | 1 + src/lib/eval/parser.yy | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/lib/eval/lexer.ll b/src/lib/eval/lexer.ll index b7447ea2bc..d990b013eb 100644 --- a/src/lib/eval/lexer.ll +++ b/src/lib/eval/lexer.ll @@ -204,6 +204,7 @@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a-fA-F:.]* "not" return isc::eval::EvalParser::make_NOT(loc); "and" return isc::eval::EvalParser::make_AND(loc); "or" return isc::eval::EvalParser::make_OR(loc); +"member" return isc::eval::EvalParser::make_MEMBER(loc); "." return isc::eval::EvalParser::make_DOT(loc); "(" return isc::eval::EvalParser::make_LPAREN(loc); ")" return isc::eval::EvalParser::make_RPAREN(loc); diff --git a/src/lib/eval/parser.yy b/src/lib/eval/parser.yy index 96f8c52668..a201d5aaad 100644 --- a/src/lib/eval/parser.yy +++ b/src/lib/eval/parser.yy @@ -47,6 +47,7 @@ using namespace isc::eval; OPTION "option" RELAY4 "relay4" RELAY6 "relay6" + MEMBER "member" PEERADDR "peeraddr" LINKADDR "linkaddr" LBRACKET "[" @@ -212,6 +213,21 @@ bool_expr : "(" bool_expr ")" TokenPtr exist(new TokenVendor(ctx.getUniverse(), $3, TokenOption::EXISTS, $8)); ctx.expression.push_back(exist); } + | MEMBER "(" STRING ")" + { + // Expression member('foo') + // + // This token will check if the packet is a member of + // the specified client class. + // To avoid loops at evaluation only already known and + // built-in classes are allowed. + std::string cc = $3; + if (!ctx.isClientClassKnown(cc)) { + error(@3, "Unknown client class '" + cc + "'"); + } + TokenPtr member(new TokenMember(cc)); + ctx.expression.push_back(member) + } ; string_expr : STRING From eac1e80838cff7fc6f5967056e3178c669e7e786 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 08:34:02 +0000 Subject: [PATCH 24/52] [trac5374] regen flex/bison --- src/lib/eval/lexer.cc | 335 +++++++++--------- src/lib/eval/location.hh | 2 +- src/lib/eval/parser.cc | 740 ++++++++++++++++++++------------------- src/lib/eval/parser.h | 219 ++++++------ src/lib/eval/position.hh | 2 +- src/lib/eval/stack.hh | 2 +- 6 files changed, 671 insertions(+), 629 deletions(-) diff --git a/src/lib/eval/lexer.cc b/src/lib/eval/lexer.cc index 52e6438dba..d5e871c95a 100644 --- a/src/lib/eval/lexer.cc +++ b/src/lib/eval/lexer.cc @@ -710,8 +710,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 52 -#define YY_END_OF_BUFFER 53 +#define YY_NUM_RULES 53 +#define YY_END_OF_BUFFER 54 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -719,42 +719,42 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_acclist[285] = +static const flex_int16_t yy_acclist[291] = { 0, - 53, 51, 52, 1, 51, 52, 2, 52, 51, 52, - 45, 51, 52, 46, 51, 52, 50, 51, 52, 49, - 51, 52, 51, 52, 44, 51, 52, 5, 51, 52, - 5, 51, 52, 51, 52, 51, 52, 51, 52,16390, - 51, 52,16390, 47, 51, 52, 48, 51, 52, 51, - 52,16390, 51, 52,16390, 51, 52,16390, 51, 52, - 16390, 51, 52,16390, 51, 52,16390, 51, 52,16390, - 51, 52,16390, 51, 52,16390, 51, 52,16390, 51, - 52,16390, 51, 52,16390, 51, 52,16390, 51, 52, - 16390, 51, 52,16390, 51, 52,16390, 51, 52,16390, + 54, 52, 53, 1, 52, 53, 2, 53, 52, 53, + 46, 52, 53, 47, 52, 53, 51, 52, 53, 50, + 52, 53, 52, 53, 45, 52, 53, 5, 52, 53, + 5, 52, 53, 52, 53, 52, 53, 52, 53,16390, + 52, 53,16390, 48, 52, 53, 49, 52, 53, 52, + 53,16390, 52, 53,16390, 52, 53,16390, 52, 53, + 16390, 52, 53,16390, 52, 53,16390, 52, 53,16390, + 52, 53,16390, 52, 53,16390, 52, 53,16390, 52, + 53,16390, 52, 53,16390, 52, 53,16390, 52, 53, + 16390, 52, 53,16390, 52, 53,16390, 52, 53,16390, 1, 2, 3, 5, 5, 7, 8,16390,16390, 8198, 16390,16390,16390,16390,16390,16390,16390,16390,16390,16390, - 16390,16390,16390,16390,16390,16390,16390,16390,16390, 43, 16390,16390,16390,16390,16390,16390,16390,16390,16390,16390, - 16390, 4, 7, 38,16390, 42,16390,16390,16390,16390, - 20,16390,16390,16390,16390, 15,16390,16390,16390,16390, - 16390, 21,16390,16390, 23,16390,16390, 41,16390,16390, - 16390, 17,16390,16390,16390, 19,16390,16390,16390,16390, - 16390,16390,16390,16390, 35,16390,16390,16390,16390, 24, - 16390,16390,16390,16390,16390,16390,16390,16390, 22,16390, + 43,16390,16390,16390,16390,16390,16390,16390,16390,16390, + 16390,16390, 4, 7, 38,16390, 42,16390,16390,16390, + 16390, 20,16390,16390,16390,16390, 15,16390,16390,16390, + 16390,16390, 21,16390,16390, 23,16390,16390,16390, 41, + 16390,16390,16390, 17,16390,16390,16390, 19,16390,16390, + 16390,16390,16390,16390,16390,16390, 35,16390,16390,16390, + 16390, 24,16390,16390,16390,16390,16390,16390,16390,16390, - 30,16390,16390,16390,16390, 14,16390,16390,16390,16390, - 16390,16390,16390,16390,16390, 25,16390, 18,16390,16390, - 16390,16390,16390,16390,16390,16390,16390,16390,16390,16390, - 26,16390, 39,16390,16390, 16,16390, 27,16390, 40, - 16390,16390,16390, 9,16390,16390, 10,16390, 11,16390, - 29,16390,16390,16390, 33,16390, 28,16390, 7,16390, - 16390, 31,16390,16390,16390, 32,16390,16390, 13,16390, - 12,16390,16390,16390,16390, 37,16390,16390, 36,16390, - 16390,16390, 34,16390 + 16390, 22,16390, 30,16390,16390,16390,16390, 14,16390, + 16390,16390,16390,16390,16390,16390,16390,16390, 25,16390, + 18,16390,16390,16390,16390,16390,16390,16390,16390,16390, + 16390,16390,16390,16390, 26,16390, 39,16390,16390, 16, + 16390, 27,16390, 40,16390,16390, 44,16390,16390, 9, + 16390,16390, 10,16390, 11,16390, 29,16390,16390,16390, + 33,16390, 28,16390, 7,16390,16390, 31,16390,16390, + 16390, 32,16390,16390, 13,16390, 12,16390,16390,16390, + 16390, 37,16390,16390, 36,16390,16390,16390, 34,16390 } ; -static const flex_int16_t yy_accept[203] = +static const flex_int16_t yy_accept[208] = { 0, 1, 1, 1, 2, 4, 7, 9, 11, 14, 17, 20, 23, 25, 28, 31, 34, 36, 38, 41, 44, @@ -763,22 +763,22 @@ static const flex_int16_t yy_accept[203] = 103, 103, 104, 105, 105, 106, 106, 106, 106, 106, 107, 108, 108, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 142, 143, 144, - 146, 148, 149, 150, 151, 153, 154, 155, 156, 158, + 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 143, 144, + 145, 147, 149, 150, 151, 152, 154, 155, 156, 157, - 159, 160, 161, 162, 164, 165, 167, 168, 170, 171, - 172, 174, 175, 176, 178, 179, 180, 181, 182, 183, - 183, 184, 185, 187, 188, 189, 190, 192, 193, 194, - 195, 196, 197, 198, 199, 201, 203, 204, 205, 206, - 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, - 218, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 231, 233, 235, 236, 238, 240, 242, - 243, 244, 246, 247, 249, 251, 253, 254, 255, 257, - 259, 260, 261, 262, 264, 265, 266, 268, 268, 269, - 271, 273, 274, 275, 276, 278, 279, 281, 282, 283, + 159, 160, 161, 162, 163, 165, 166, 168, 169, 170, + 172, 173, 174, 176, 177, 178, 180, 181, 182, 183, + 184, 185, 185, 186, 187, 189, 190, 191, 192, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 204, 206, + 207, 208, 209, 211, 212, 213, 214, 214, 215, 216, + 217, 218, 219, 221, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 235, 237, 239, + 240, 242, 244, 246, 247, 249, 250, 252, 253, 255, + 257, 259, 260, 261, 263, 265, 266, 267, 268, 270, + 271, 272, 274, 274, 275, 277, 279, 280, 281, 282, - 285, 285 + 284, 285, 287, 288, 289, 291, 291 } ; static const YY_CHAR yy_ec[256] = @@ -822,104 +822,107 @@ static const YY_CHAR yy_meta[45] = 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[207] = +static const flex_int16_t yy_base[212] = { 0, - 0, 0, 314, 315, 311, 309, 307, 315, 315, 315, - 315, 34, 315, 39, 36, 295, 293, 81, 115, 315, - 315, 24, 37, 37, 26, 277, 45, 279, 43, 48, - 270, 43, 59, 278, 106, 50, 277, 272, 300, 298, - 296, 315, 122, 137, 112, 284, 283, 0, 282, 0, - 315, 143, 150, 0, 0, 315, 263, 269, 271, 258, - 252, 251, 250, 258, 265, 244, 259, 241, 74, 249, - 248, 257, 252, 240, 239, 0, 251, 237, 243, 252, - 249, 249, 229, 248, 235, 246, 146, 0, 0, 0, - 0, 242, 242, 243, 0, 238, 225, 237, 0, 227, + 0, 0, 319, 320, 316, 314, 312, 320, 320, 320, + 320, 34, 320, 39, 36, 300, 298, 81, 115, 320, + 320, 24, 37, 37, 26, 282, 45, 284, 43, 48, + 275, 43, 59, 283, 106, 50, 282, 277, 305, 303, + 301, 320, 122, 137, 112, 289, 288, 0, 287, 0, + 320, 143, 150, 0, 0, 320, 268, 274, 276, 263, + 257, 256, 255, 263, 270, 249, 264, 246, 74, 254, + 253, 262, 252, 256, 244, 243, 0, 255, 241, 247, + 256, 253, 253, 233, 252, 239, 250, 146, 0, 0, + 0, 0, 246, 246, 247, 0, 242, 229, 241, 0, - 224, 235, 226, 0, 226, 0, 217, 0, 225, 217, - 148, 231, 227, 0, 213, 211, 215, 223, 222, 154, - 221, 223, 0, 207, 204, 217, 0, 215, 214, 201, - 216, 194, 201, 213, 0, 0, 191, 208, 193, 0, - 193, 195, 204, 162, 191, 188, 190, 187, 187, 0, - 0, 197, 197, 185, 186, 184, 156, 169, 168, 174, - 165, 164, 166, 0, 0, 163, 0, 0, 0, 174, - 172, 0, 172, 0, 0, 0, 166, 170, 186, 0, - 170, 163, 155, 0, 154, 156, 0, 183, 151, 0, - 0, 160, 155, 160, 0, 140, 0, 115, 50, 0, + 231, 228, 239, 230, 0, 230, 0, 237, 220, 0, + 228, 220, 148, 234, 230, 0, 216, 214, 218, 226, + 225, 154, 224, 226, 0, 210, 207, 220, 0, 218, + 217, 204, 219, 214, 196, 203, 215, 0, 0, 193, + 210, 195, 0, 195, 197, 206, 162, 193, 190, 192, + 189, 189, 0, 0, 199, 199, 186, 186, 187, 195, + 156, 172, 169, 175, 167, 165, 166, 0, 0, 164, + 0, 0, 0, 175, 0, 173, 0, 173, 0, 0, + 0, 167, 171, 187, 0, 170, 164, 156, 0, 155, + 157, 0, 183, 152, 0, 0, 161, 156, 161, 0, - 315, 208, 210, 212, 71, 215 + 164, 0, 124, 115, 0, 320, 208, 210, 212, 85, + 215 } ; -static const flex_int16_t yy_def[207] = +static const flex_int16_t yy_def[212] = { 0, - 201, 1, 201, 201, 201, 201, 202, 201, 201, 201, - 201, 201, 201, 201, 14, 203, 201, 201, 18, 201, - 201, 18, 18, 18, 18, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 201, 201, - 202, 201, 201, 201, 14, 203, 204, 205, 203, 206, - 201, 201, 19, 18, 19, 201, 19, 19, 19, 19, + 206, 1, 206, 206, 206, 206, 207, 206, 206, 206, + 206, 206, 206, 206, 14, 208, 206, 206, 18, 206, + 206, 18, 18, 18, 18, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 206, 206, + 207, 206, 206, 206, 14, 208, 209, 210, 208, 211, + 206, 206, 19, 18, 19, 206, 19, 19, 19, 19, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 201, 205, 206, 19, + 19, 19, 19, 19, 19, 19, 19, 206, 210, 211, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 201, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 206, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 201, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 206, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 201, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 206, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 201, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 206, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 0, 201, 201, 201, 201, 201 + 19, 19, 19, 19, 19, 0, 206, 206, 206, 206, + 206 } ; -static const flex_int16_t yy_nxt[360] = +static const flex_int16_t yy_nxt[365] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 16, 17, 18, 19, 19, 20, 21, 4, 22, 18, 23, 24, 25, 18, 26, 27, 28, 19, 29, 30, 31, 32, 33, 34, 35, 36, 19, 37, 19, 38, 43, 43, 43, 43, 44, 45, - 45, 45, 45, 46, 201, 47, 57, 48, 58, 61, + 45, 45, 45, 46, 206, 47, 57, 48, 58, 61, 63, 47, 47, 47, 47, 47, 47, 59, 64, 70, - 72, 66, 60, 71, 88, 62, 83, 67, 201, 75, - 76, 48, 52, 52, 68, 77, 73, 84, 200, 53, - 78, 54, 54, 54, 54, 46, 102, 54, 55, 55, + 72, 66, 60, 71, 73, 62, 84, 67, 206, 76, + 77, 48, 52, 52, 68, 78, 74, 85, 89, 53, + 79, 54, 54, 54, 54, 46, 103, 54, 55, 55, - 103, 56, 53, 54, 54, 54, 54, 54, 54, 55, + 104, 56, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 201, - 201, 55, 43, 43, 43, 43, 80, 55, 55, 55, - 55, 55, 55, 81, 52, 52, 82, 87, 87, 87, - 87, 201, 201, 199, 201, 120, 87, 87, 87, 87, - 135, 136, 198, 56, 144, 144, 144, 144, 174, 175, - 201, 163, 144, 144, 144, 144, 181, 181, 181, 181, - 181, 181, 181, 181, 201, 201, 197, 196, 195, 194, - 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 206, + 206, 55, 43, 43, 43, 43, 81, 55, 55, 55, + 55, 55, 55, 82, 52, 52, 83, 88, 88, 88, + 88, 206, 206, 205, 206, 122, 88, 88, 88, 88, + 138, 139, 204, 56, 147, 147, 147, 147, 179, 180, + 206, 167, 147, 147, 147, 147, 186, 186, 186, 186, + 186, 186, 186, 186, 206, 206, 203, 202, 201, 200, + 199, 197, 196, 195, 194, 193, 192, 191, 190, 189, - 182, 180, 179, 201, 178, 177, 176, 193, 41, 173, - 41, 41, 41, 49, 49, 47, 47, 89, 89, 89, - 172, 171, 170, 169, 168, 167, 166, 165, 164, 162, - 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, - 151, 150, 149, 148, 147, 146, 145, 143, 142, 141, - 140, 139, 138, 137, 134, 133, 132, 131, 130, 129, - 128, 127, 126, 125, 124, 123, 122, 121, 119, 118, - 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, - 107, 106, 105, 104, 101, 100, 99, 98, 97, 96, - 95, 94, 93, 92, 91, 90, 50, 46, 50, 42, + 188, 187, 185, 206, 184, 183, 182, 198, 41, 181, + 41, 41, 41, 49, 49, 47, 47, 90, 90, 90, + 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, + 168, 166, 165, 164, 163, 162, 161, 160, 159, 158, + 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, + 146, 145, 144, 143, 142, 141, 140, 137, 136, 135, + 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, + 124, 123, 121, 120, 119, 118, 117, 116, 115, 114, + 113, 112, 111, 110, 109, 108, 107, 106, 105, 102, + 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, - 40, 39, 86, 85, 79, 74, 69, 65, 51, 50, - 42, 40, 39, 201, 3, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201 + 91, 50, 46, 50, 42, 40, 39, 87, 86, 80, + 75, 69, 65, 51, 50, 42, 40, 39, 206, 3, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206 } ; -static const flex_int16_t yy_chk[360] = +static const flex_int16_t yy_chk[365] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -928,8 +931,8 @@ static const flex_int16_t yy_chk[360] = 1, 1, 1, 1, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 15, 14, 22, 14, 22, 24, 25, 14, 14, 14, 14, 14, 14, 23, 25, 29, - 30, 27, 23, 29, 205, 24, 36, 27, 15, 32, - 32, 14, 18, 18, 27, 33, 30, 36, 199, 18, + 30, 27, 23, 29, 30, 24, 36, 27, 15, 32, + 32, 14, 18, 18, 27, 33, 30, 36, 210, 18, 33, 18, 18, 18, 18, 18, 69, 18, 18, 18, 69, 18, 18, 18, 18, 18, 18, 18, 18, 18, @@ -937,49 +940,50 @@ static const flex_int16_t yy_chk[360] = 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 45, 19, 43, 43, 43, 43, 35, 19, 19, 19, 19, 19, 19, 35, 52, 52, 35, 44, 44, 44, - 44, 53, 53, 198, 45, 87, 87, 87, 87, 87, - 111, 111, 196, 52, 120, 120, 120, 120, 157, 157, - 53, 144, 144, 144, 144, 144, 163, 163, 163, 163, - 181, 181, 181, 181, 188, 188, 194, 193, 192, 189, - 186, 185, 183, 182, 179, 178, 177, 173, 171, 170, + 44, 53, 53, 204, 45, 88, 88, 88, 88, 88, + 113, 113, 203, 52, 122, 122, 122, 122, 161, 161, + 53, 147, 147, 147, 147, 147, 167, 167, 167, 167, + 186, 186, 186, 186, 193, 193, 201, 199, 198, 197, + 194, 191, 190, 188, 187, 184, 183, 182, 178, 176, - 166, 162, 161, 188, 160, 159, 158, 188, 202, 156, - 202, 202, 202, 203, 203, 204, 204, 206, 206, 206, - 155, 154, 153, 152, 149, 148, 147, 146, 145, 143, - 142, 141, 139, 138, 137, 134, 133, 132, 131, 130, - 129, 128, 126, 125, 124, 122, 121, 119, 118, 117, - 116, 115, 113, 112, 110, 109, 107, 105, 103, 102, - 101, 100, 98, 97, 96, 94, 93, 92, 86, 85, - 84, 83, 82, 81, 80, 79, 78, 77, 75, 74, - 73, 72, 71, 70, 68, 67, 66, 65, 64, 63, - 62, 61, 60, 59, 58, 57, 49, 47, 46, 41, + 174, 170, 166, 193, 165, 164, 163, 193, 207, 162, + 207, 207, 207, 208, 208, 209, 209, 211, 211, 211, + 160, 159, 158, 157, 156, 155, 152, 151, 150, 149, + 148, 146, 145, 144, 142, 141, 140, 137, 136, 135, + 134, 133, 132, 131, 130, 128, 127, 126, 124, 123, + 121, 120, 119, 118, 117, 115, 114, 112, 111, 109, + 108, 106, 104, 103, 102, 101, 99, 98, 97, 95, + 94, 93, 87, 86, 85, 84, 83, 82, 81, 80, + 79, 78, 76, 75, 74, 73, 72, 71, 70, 68, + 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, - 40, 39, 38, 37, 34, 31, 28, 26, 17, 16, - 7, 6, 5, 3, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 201, 201, 201 + 57, 49, 47, 46, 41, 40, 39, 38, 37, 34, + 31, 28, 26, 17, 16, 7, 6, 5, 3, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206 } ; /* Table of booleans, true if rule could match eol. */ -static const flex_int32_t yy_rule_can_match_eol[53] = +static const flex_int32_t yy_rule_can_match_eol[54] = { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[52] = +static const flex_int16_t yy_rule_linenum[53] = { 0, 106, 111, 117, 127, 133, 151, 158, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215 + 215, 216 } ; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; @@ -1045,7 +1049,7 @@ namespace { /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::eval::EvalContext::fatal(msg) -#line 1048 "lexer.cc" +#line 1052 "lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1070,8 +1074,8 @@ namespace { by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION loc.columns(evalleng); -#line 1073 "lexer.cc" -#line 1074 "lexer.cc" +#line 1077 "lexer.cc" +#line 1078 "lexer.cc" #define INITIAL 0 @@ -1376,7 +1380,7 @@ YY_DECL -#line 1379 "lexer.cc" +#line 1383 "lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1404,14 +1408,14 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 202 ) + if ( yy_current_state >= 207 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 201 ); + while ( yy_current_state != 206 ); yy_find_action: /* %% [10.0] code to find the action number goes here */ @@ -1474,13 +1478,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 52 ) + else if ( yy_act < 53 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 52 ) + else if ( yy_act == 53 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 53 ) + else if ( yy_act == 54 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -1761,53 +1765,58 @@ return isc::eval::EvalParser::make_OR(loc); case 44: YY_RULE_SETUP #line 208 "lexer.ll" -return isc::eval::EvalParser::make_DOT(loc); +return isc::eval::EvalParser::make_MEMBER(loc); YY_BREAK case 45: YY_RULE_SETUP #line 209 "lexer.ll" -return isc::eval::EvalParser::make_LPAREN(loc); +return isc::eval::EvalParser::make_DOT(loc); YY_BREAK case 46: YY_RULE_SETUP #line 210 "lexer.ll" -return isc::eval::EvalParser::make_RPAREN(loc); +return isc::eval::EvalParser::make_LPAREN(loc); YY_BREAK case 47: YY_RULE_SETUP #line 211 "lexer.ll" -return isc::eval::EvalParser::make_LBRACKET(loc); +return isc::eval::EvalParser::make_RPAREN(loc); YY_BREAK case 48: YY_RULE_SETUP #line 212 "lexer.ll" -return isc::eval::EvalParser::make_RBRACKET(loc); +return isc::eval::EvalParser::make_LBRACKET(loc); YY_BREAK case 49: YY_RULE_SETUP #line 213 "lexer.ll" -return isc::eval::EvalParser::make_COMA(loc); +return isc::eval::EvalParser::make_RBRACKET(loc); YY_BREAK case 50: YY_RULE_SETUP #line 214 "lexer.ll" -return isc::eval::EvalParser::make_ANY(loc); +return isc::eval::EvalParser::make_COMA(loc); YY_BREAK case 51: YY_RULE_SETUP #line 215 "lexer.ll" -driver.error (loc, "Invalid character: " + std::string(evaltext)); - YY_BREAK -case YY_STATE_EOF(INITIAL): -#line 216 "lexer.ll" -return isc::eval::EvalParser::make_END(loc); +return isc::eval::EvalParser::make_ANY(loc); YY_BREAK case 52: YY_RULE_SETUP +#line 216 "lexer.ll" +driver.error (loc, "Invalid character: " + std::string(evaltext)); + YY_BREAK +case YY_STATE_EOF(INITIAL): #line 217 "lexer.ll" +return isc::eval::EvalParser::make_END(loc); + YY_BREAK +case 53: +YY_RULE_SETUP +#line 218 "lexer.ll" ECHO; YY_BREAK -#line 1810 "lexer.cc" +#line 1819 "lexer.cc" case YY_END_OF_BUFFER: { @@ -2093,7 +2102,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 202 ) + if ( yy_current_state >= 207 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -2121,11 +2130,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 202 ) + if ( yy_current_state >= 207 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 201); + yy_is_jam = (yy_current_state == 206); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; @@ -2891,7 +2900,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 217 "lexer.ll" +#line 218 "lexer.ll" using namespace isc::eval; diff --git a/src/lib/eval/location.hh b/src/lib/eval/location.hh index 6f14287ee0..afce8e45e7 100644 --- a/src/lib/eval/location.hh +++ b/src/lib/eval/location.hh @@ -1,4 +1,4 @@ -// Generated 201710061616 +// Generated 201711240833 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/lib/eval/parser.cc b/src/lib/eval/parser.cc index 3d95cddcea..7714ed42b9 100644 --- a/src/lib/eval/parser.cc +++ b/src/lib/eval/parser.cc @@ -253,44 +253,44 @@ namespace isc { namespace eval { { switch (that.type_get ()) { - case 60: // option_repr_type + case 61: // option_repr_type value.move< TokenOption::RepresentationType > (that.value); break; - case 64: // pkt4_field + case 65: // pkt4_field value.move< TokenPkt4::FieldType > (that.value); break; - case 65: // pkt6_field + case 66: // pkt6_field value.move< TokenPkt6::FieldType > (that.value); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.move< TokenPkt::MetadataType > (that.value); break; - case 66: // relay6_field + case 67: // relay6_field value.move< TokenRelay6Field::FieldType > (that.value); break; - case 61: // nest_level + case 62: // nest_level value.move< int8_t > (that.value); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.move< std::string > (that.value); break; - case 59: // option_code + case 60: // option_code value.move< uint16_t > (that.value); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.move< uint32_t > (that.value); break; @@ -309,44 +309,44 @@ namespace isc { namespace eval { state = that.state; switch (that.type_get ()) { - case 60: // option_repr_type + case 61: // option_repr_type value.copy< TokenOption::RepresentationType > (that.value); break; - case 64: // pkt4_field + case 65: // pkt4_field value.copy< TokenPkt4::FieldType > (that.value); break; - case 65: // pkt6_field + case 66: // pkt6_field value.copy< TokenPkt6::FieldType > (that.value); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.copy< TokenPkt::MetadataType > (that.value); break; - case 66: // relay6_field + case 67: // relay6_field value.copy< TokenRelay6Field::FieldType > (that.value); break; - case 61: // nest_level + case 62: // nest_level value.copy< int8_t > (that.value); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.copy< std::string > (that.value); break; - case 59: // option_code + case 60: // option_code value.copy< uint16_t > (that.value); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.copy< uint32_t > (that.value); break; @@ -386,100 +386,100 @@ namespace isc { namespace eval { << yysym.location << ": "; switch (yytype) { - case 48: // "constant string" + case 49: // "constant string" -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 394 "parser.cc" // lalr1.cc:636 break; - case 49: // "integer" + case 50: // "integer" -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 401 "parser.cc" // lalr1.cc:636 break; - case 50: // "constant hexstring" + case 51: // "constant hexstring" -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 408 "parser.cc" // lalr1.cc:636 break; - case 51: // "option name" + case 52: // "option name" -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 415 "parser.cc" // lalr1.cc:636 break; - case 52: // "ip address" + case 53: // "ip address" -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 422 "parser.cc" // lalr1.cc:636 break; - case 58: // integer_expr + case 59: // integer_expr -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< uint32_t > (); } #line 429 "parser.cc" // lalr1.cc:636 break; - case 59: // option_code + case 60: // option_code -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< uint16_t > (); } #line 436 "parser.cc" // lalr1.cc:636 break; - case 60: // option_repr_type + case 61: // option_repr_type -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenOption::RepresentationType > (); } #line 443 "parser.cc" // lalr1.cc:636 break; - case 61: // nest_level + case 62: // nest_level -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int8_t > (); } #line 450 "parser.cc" // lalr1.cc:636 break; - case 62: // pkt_metadata + case 63: // pkt_metadata -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenPkt::MetadataType > (); } #line 457 "parser.cc" // lalr1.cc:636 break; - case 63: // enterprise_id + case 64: // enterprise_id -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< uint32_t > (); } #line 464 "parser.cc" // lalr1.cc:636 break; - case 64: // pkt4_field + case 65: // pkt4_field -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenPkt4::FieldType > (); } #line 471 "parser.cc" // lalr1.cc:636 break; - case 65: // pkt6_field + case 66: // pkt6_field -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenPkt6::FieldType > (); } #line 478 "parser.cc" // lalr1.cc:636 break; - case 66: // relay6_field + case 67: // relay6_field -#line 109 "parser.yy" // lalr1.cc:636 +#line 110 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenRelay6Field::FieldType > (); } #line 485 "parser.cc" // lalr1.cc:636 break; @@ -681,44 +681,44 @@ namespace isc { namespace eval { when using variants. */ switch (yyr1_[yyn]) { - case 60: // option_repr_type + case 61: // option_repr_type yylhs.value.build< TokenOption::RepresentationType > (); break; - case 64: // pkt4_field + case 65: // pkt4_field yylhs.value.build< TokenPkt4::FieldType > (); break; - case 65: // pkt6_field + case 66: // pkt6_field yylhs.value.build< TokenPkt6::FieldType > (); break; - case 62: // pkt_metadata + case 63: // pkt_metadata yylhs.value.build< TokenPkt::MetadataType > (); break; - case 66: // relay6_field + case 67: // relay6_field yylhs.value.build< TokenRelay6Field::FieldType > (); break; - case 61: // nest_level + case 62: // nest_level yylhs.value.build< int8_t > (); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" yylhs.value.build< std::string > (); break; - case 59: // option_code + case 60: // option_code yylhs.value.build< uint16_t > (); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id yylhs.value.build< uint32_t > (); break; @@ -740,7 +740,7 @@ namespace isc { namespace eval { switch (yyn) { case 6: -#line 129 "parser.yy" // lalr1.cc:859 +#line 130 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenNot()); ctx.expression.push_back(neg); @@ -749,7 +749,7 @@ namespace isc { namespace eval { break; case 7: -#line 134 "parser.yy" // lalr1.cc:859 +#line 135 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenAnd()); ctx.expression.push_back(neg); @@ -758,7 +758,7 @@ namespace isc { namespace eval { break; case 8: -#line 139 "parser.yy" // lalr1.cc:859 +#line 140 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenOr()); ctx.expression.push_back(neg); @@ -767,7 +767,7 @@ namespace isc { namespace eval { break; case 9: -#line 144 "parser.yy" // lalr1.cc:859 +#line 145 "parser.yy" // lalr1.cc:859 { TokenPtr eq(new TokenEqual()); ctx.expression.push_back(eq); @@ -776,7 +776,7 @@ namespace isc { namespace eval { break; case 10: -#line 149 "parser.yy" // lalr1.cc:859 +#line 150 "parser.yy" // lalr1.cc:859 { TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), TokenOption::EXISTS)); ctx.expression.push_back(opt); @@ -785,7 +785,7 @@ namespace isc { namespace eval { break; case 11: -#line 154 "parser.yy" // lalr1.cc:859 +#line 155 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V4: @@ -809,7 +809,7 @@ namespace isc { namespace eval { break; case 12: -#line 174 "parser.yy" // lalr1.cc:859 +#line 175 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V6: @@ -827,7 +827,7 @@ namespace isc { namespace eval { break; case 13: -#line 188 "parser.yy" // lalr1.cc:859 +#line 189 "parser.yy" // lalr1.cc:859 { // Expression: vendor-class[1234].exists // @@ -840,7 +840,7 @@ namespace isc { namespace eval { break; case 14: -#line 197 "parser.yy" // lalr1.cc:859 +#line 198 "parser.yy" // lalr1.cc:859 { // Expression: vendor[1234].exists // @@ -853,7 +853,7 @@ namespace isc { namespace eval { break; case 15: -#line 206 "parser.yy" // lalr1.cc:859 +#line 207 "parser.yy" // lalr1.cc:859 { // Expression vendor[1234].option[123].exists // @@ -867,43 +867,62 @@ namespace isc { namespace eval { break; case 16: -#line 218 "parser.yy" // lalr1.cc:859 +#line 217 "parser.yy" // lalr1.cc:859 + { + // Expression member('foo') + // + // This token will check if the packet is a member of + // the specified client class. + // To avoid loops at evaluation only already known and + // built-in classes are allowed. + std::string cc = yystack_[1].value.as< std::string > (); + if (!ctx.isClientClassKnown(cc)) { + error(yystack_[1].location, "Unknown client class '" + cc + "'"); + } + TokenPtr member(new TokenMember(cc)); + ctx.expression.push_back(member) + } +#line 886 "parser.cc" // lalr1.cc:859 + break; + + case 17: +#line 234 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } -#line 876 "parser.cc" // lalr1.cc:859 +#line 895 "parser.cc" // lalr1.cc:859 break; - case 17: -#line 223 "parser.yy" // lalr1.cc:859 + case 18: +#line 239 "parser.yy" // lalr1.cc:859 { TokenPtr hex(new TokenHexString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(hex); } -#line 885 "parser.cc" // lalr1.cc:859 +#line 904 "parser.cc" // lalr1.cc:859 break; - case 18: -#line 228 "parser.yy" // lalr1.cc:859 + case 19: +#line 244 "parser.yy" // lalr1.cc:859 { TokenPtr ip(new TokenIpAddress(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(ip); } -#line 894 "parser.cc" // lalr1.cc:859 +#line 913 "parser.cc" // lalr1.cc:859 break; - case 19: -#line 233 "parser.yy" // lalr1.cc:859 + case 20: +#line 249 "parser.yy" // lalr1.cc:859 { TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), yystack_[0].value.as< TokenOption::RepresentationType > ())); ctx.expression.push_back(opt); } -#line 903 "parser.cc" // lalr1.cc:859 +#line 922 "parser.cc" // lalr1.cc:859 break; - case 20: -#line 238 "parser.yy" // lalr1.cc:859 + case 21: +#line 254 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V4: @@ -923,11 +942,11 @@ namespace isc { namespace eval { error(yystack_[5].location, "relay4 can only be used in DHCPv4."); } } -#line 927 "parser.cc" // lalr1.cc:859 +#line 946 "parser.cc" // lalr1.cc:859 break; - case 21: -#line 259 "parser.yy" // lalr1.cc:859 + case 22: +#line 275 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V6: @@ -941,20 +960,20 @@ namespace isc { namespace eval { error(yystack_[10].location, "relay6 can only be used in DHCPv6."); } } -#line 945 "parser.cc" // lalr1.cc:859 +#line 964 "parser.cc" // lalr1.cc:859 break; - case 22: -#line 274 "parser.yy" // lalr1.cc:859 + case 23: +#line 290 "parser.yy" // lalr1.cc:859 { TokenPtr pkt_metadata(new TokenPkt(yystack_[0].value.as< TokenPkt::MetadataType > ())); ctx.expression.push_back(pkt_metadata); } -#line 954 "parser.cc" // lalr1.cc:859 +#line 973 "parser.cc" // lalr1.cc:859 break; - case 23: -#line 279 "parser.yy" // lalr1.cc:859 + case 24: +#line 295 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V4: @@ -968,11 +987,11 @@ namespace isc { namespace eval { error(yystack_[2].location, "pkt4 can only be used in DHCPv4."); } } -#line 972 "parser.cc" // lalr1.cc:859 +#line 991 "parser.cc" // lalr1.cc:859 break; - case 24: -#line 293 "parser.yy" // lalr1.cc:859 + case 25: +#line 309 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V6: @@ -986,11 +1005,11 @@ namespace isc { namespace eval { error(yystack_[2].location, "pkt6 can only be used in DHCPv6."); } } -#line 990 "parser.cc" // lalr1.cc:859 +#line 1009 "parser.cc" // lalr1.cc:859 break; - case 25: -#line 307 "parser.yy" // lalr1.cc:859 + case 26: +#line 323 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V6: @@ -1004,38 +1023,38 @@ namespace isc { namespace eval { error(yystack_[5].location, "relay6 can only be used in DHCPv6."); } } -#line 1008 "parser.cc" // lalr1.cc:859 +#line 1027 "parser.cc" // lalr1.cc:859 break; - case 26: -#line 322 "parser.yy" // lalr1.cc:859 + case 27: +#line 338 "parser.yy" // lalr1.cc:859 { TokenPtr sub(new TokenSubstring()); ctx.expression.push_back(sub); } -#line 1017 "parser.cc" // lalr1.cc:859 +#line 1036 "parser.cc" // lalr1.cc:859 break; - case 27: -#line 327 "parser.yy" // lalr1.cc:859 + case 28: +#line 343 "parser.yy" // lalr1.cc:859 { TokenPtr conc(new TokenConcat()); ctx.expression.push_back(conc); } -#line 1026 "parser.cc" // lalr1.cc:859 +#line 1045 "parser.cc" // lalr1.cc:859 break; - case 28: -#line 332 "parser.yy" // lalr1.cc:859 + case 29: +#line 348 "parser.yy" // lalr1.cc:859 { TokenPtr cond(new TokenIfElse()); ctx.expression.push_back(cond); } -#line 1035 "parser.cc" // lalr1.cc:859 +#line 1054 "parser.cc" // lalr1.cc:859 break; - case 29: -#line 337 "parser.yy" // lalr1.cc:859 + case 30: +#line 353 "parser.yy" // lalr1.cc:859 { // expression: vendor.enterprise // @@ -1044,11 +1063,11 @@ namespace isc { namespace eval { TokenPtr vendor(new TokenVendor(ctx.getUniverse(), 0, TokenVendor::ENTERPRISE_ID)); ctx.expression.push_back(vendor); } -#line 1048 "parser.cc" // lalr1.cc:859 +#line 1067 "parser.cc" // lalr1.cc:859 break; - case 30: -#line 346 "parser.yy" // lalr1.cc:859 + case 31: +#line 362 "parser.yy" // lalr1.cc:859 { // expression: vendor-class.enterprise // @@ -1058,11 +1077,11 @@ namespace isc { namespace eval { TokenVendor::ENTERPRISE_ID)); ctx.expression.push_back(vendor); } -#line 1062 "parser.cc" // lalr1.cc:859 +#line 1081 "parser.cc" // lalr1.cc:859 break; - case 31: -#line 356 "parser.yy" // lalr1.cc:859 + case 32: +#line 372 "parser.yy" // lalr1.cc:859 { // This token will search for vendor option with // specified enterprise-id. If found, will search @@ -1071,11 +1090,11 @@ namespace isc { namespace eval { TokenPtr opt(new TokenVendor(ctx.getUniverse(), yystack_[8].value.as< uint32_t > (), yystack_[0].value.as< TokenOption::RepresentationType > (), yystack_[3].value.as< uint16_t > ())); ctx.expression.push_back(opt); } -#line 1075 "parser.cc" // lalr1.cc:859 +#line 1094 "parser.cc" // lalr1.cc:859 break; - case 32: -#line 365 "parser.yy" // lalr1.cc:859 + case 33: +#line 381 "parser.yy" // lalr1.cc:859 { // expression: vendor-class[1234].data // @@ -1088,11 +1107,11 @@ namespace isc { namespace eval { TokenVendor::DATA, 0)); ctx.expression.push_back(vendor_class); } -#line 1092 "parser.cc" // lalr1.cc:859 +#line 1111 "parser.cc" // lalr1.cc:859 break; - case 33: -#line 378 "parser.yy" // lalr1.cc:859 + case 34: +#line 394 "parser.yy" // lalr1.cc:859 { // expression: vendor-class[1234].data[5] // @@ -1105,247 +1124,247 @@ namespace isc { namespace eval { TokenVendor::DATA, index)); ctx.expression.push_back(vendor_class); } -#line 1109 "parser.cc" // lalr1.cc:859 +#line 1128 "parser.cc" // lalr1.cc:859 break; - case 34: -#line 391 "parser.yy" // lalr1.cc:859 + case 35: +#line 407 "parser.yy" // lalr1.cc:859 { TokenPtr integer(new TokenInteger(yystack_[0].value.as< uint32_t > ())); ctx.expression.push_back(integer); } -#line 1118 "parser.cc" // lalr1.cc:859 - break; - - case 35: -#line 398 "parser.yy" // lalr1.cc:859 - { - yylhs.value.as< uint32_t > () = ctx.convertUint32(yystack_[0].value.as< std::string > (), yystack_[0].location); - } -#line 1126 "parser.cc" // lalr1.cc:859 +#line 1137 "parser.cc" // lalr1.cc:859 break; case 36: -#line 404 "parser.yy" // lalr1.cc:859 +#line 414 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< uint16_t > () = ctx.convertOptionCode(yystack_[0].value.as< std::string > (), yystack_[0].location); + yylhs.value.as< uint32_t > () = ctx.convertUint32(yystack_[0].value.as< std::string > (), yystack_[0].location); } -#line 1134 "parser.cc" // lalr1.cc:859 +#line 1145 "parser.cc" // lalr1.cc:859 break; case 37: -#line 408 "parser.yy" // lalr1.cc:859 +#line 420 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< uint16_t > () = ctx.convertOptionName(yystack_[0].value.as< std::string > (), yystack_[0].location); + yylhs.value.as< uint16_t > () = ctx.convertOptionCode(yystack_[0].value.as< std::string > (), yystack_[0].location); } -#line 1142 "parser.cc" // lalr1.cc:859 +#line 1153 "parser.cc" // lalr1.cc:859 break; case 38: -#line 414 "parser.yy" // lalr1.cc:859 +#line 424 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::TEXTUAL; - } -#line 1150 "parser.cc" // lalr1.cc:859 + yylhs.value.as< uint16_t > () = ctx.convertOptionName(yystack_[0].value.as< std::string > (), yystack_[0].location); + } +#line 1161 "parser.cc" // lalr1.cc:859 break; case 39: -#line 418 "parser.yy" // lalr1.cc:859 +#line 430 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::HEXADECIMAL; + yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::TEXTUAL; } -#line 1158 "parser.cc" // lalr1.cc:859 +#line 1169 "parser.cc" // lalr1.cc:859 break; case 40: -#line 424 "parser.yy" // lalr1.cc:859 +#line 434 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< int8_t > () = ctx.convertNestLevelNumber(yystack_[0].value.as< std::string > (), yystack_[0].location); - } -#line 1166 "parser.cc" // lalr1.cc:859 + yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::HEXADECIMAL; + } +#line 1177 "parser.cc" // lalr1.cc:859 break; case 41: -#line 433 "parser.yy" // lalr1.cc:859 +#line 440 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::IFACE; - } -#line 1174 "parser.cc" // lalr1.cc:859 + yylhs.value.as< int8_t > () = ctx.convertNestLevelNumber(yystack_[0].value.as< std::string > (), yystack_[0].location); + } +#line 1185 "parser.cc" // lalr1.cc:859 break; case 42: -#line 437 "parser.yy" // lalr1.cc:859 +#line 449 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::SRC; + yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::IFACE; } -#line 1182 "parser.cc" // lalr1.cc:859 +#line 1193 "parser.cc" // lalr1.cc:859 break; case 43: -#line 441 "parser.yy" // lalr1.cc:859 +#line 453 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::DST; + yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::SRC; } -#line 1190 "parser.cc" // lalr1.cc:859 +#line 1201 "parser.cc" // lalr1.cc:859 break; case 44: -#line 445 "parser.yy" // lalr1.cc:859 +#line 457 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::LEN; + yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::DST; } -#line 1198 "parser.cc" // lalr1.cc:859 +#line 1209 "parser.cc" // lalr1.cc:859 break; case 45: -#line 451 "parser.yy" // lalr1.cc:859 +#line 461 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< uint32_t > () = ctx.convertUint32(yystack_[0].value.as< std::string > (), yystack_[0].location); - } -#line 1206 "parser.cc" // lalr1.cc:859 + yylhs.value.as< TokenPkt::MetadataType > () = TokenPkt::LEN; + } +#line 1217 "parser.cc" // lalr1.cc:859 break; case 46: -#line 455 "parser.yy" // lalr1.cc:859 +#line 467 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< uint32_t > () = 0; + yylhs.value.as< uint32_t > () = ctx.convertUint32(yystack_[0].value.as< std::string > (), yystack_[0].location); } -#line 1214 "parser.cc" // lalr1.cc:859 +#line 1225 "parser.cc" // lalr1.cc:859 break; case 47: -#line 461 "parser.yy" // lalr1.cc:859 +#line 471 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::CHADDR; - } -#line 1222 "parser.cc" // lalr1.cc:859 + yylhs.value.as< uint32_t > () = 0; + } +#line 1233 "parser.cc" // lalr1.cc:859 break; case 48: -#line 465 "parser.yy" // lalr1.cc:859 +#line 477 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::HLEN; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::CHADDR; } -#line 1230 "parser.cc" // lalr1.cc:859 +#line 1241 "parser.cc" // lalr1.cc:859 break; case 49: -#line 469 "parser.yy" // lalr1.cc:859 +#line 481 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::HTYPE; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::HLEN; } -#line 1238 "parser.cc" // lalr1.cc:859 +#line 1249 "parser.cc" // lalr1.cc:859 break; case 50: -#line 473 "parser.yy" // lalr1.cc:859 +#line 485 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::CIADDR; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::HTYPE; } -#line 1246 "parser.cc" // lalr1.cc:859 +#line 1257 "parser.cc" // lalr1.cc:859 break; case 51: -#line 477 "parser.yy" // lalr1.cc:859 +#line 489 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::GIADDR; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::CIADDR; } -#line 1254 "parser.cc" // lalr1.cc:859 +#line 1265 "parser.cc" // lalr1.cc:859 break; case 52: -#line 481 "parser.yy" // lalr1.cc:859 +#line 493 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::YIADDR; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::GIADDR; } -#line 1262 "parser.cc" // lalr1.cc:859 +#line 1273 "parser.cc" // lalr1.cc:859 break; case 53: -#line 485 "parser.yy" // lalr1.cc:859 +#line 497 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::SIADDR; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::YIADDR; } -#line 1270 "parser.cc" // lalr1.cc:859 +#line 1281 "parser.cc" // lalr1.cc:859 break; case 54: -#line 489 "parser.yy" // lalr1.cc:859 +#line 501 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::MSGTYPE; - } -#line 1278 "parser.cc" // lalr1.cc:859 + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::SIADDR; + } +#line 1289 "parser.cc" // lalr1.cc:859 break; case 55: -#line 493 "parser.yy" // lalr1.cc:859 +#line 505 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::TRANSID; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::MSGTYPE; } -#line 1286 "parser.cc" // lalr1.cc:859 +#line 1297 "parser.cc" // lalr1.cc:859 break; case 56: -#line 499 "parser.yy" // lalr1.cc:859 +#line 509 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt6::FieldType > () = TokenPkt6::MSGTYPE; + yylhs.value.as< TokenPkt4::FieldType > () = TokenPkt4::TRANSID; } -#line 1294 "parser.cc" // lalr1.cc:859 +#line 1305 "parser.cc" // lalr1.cc:859 break; case 57: -#line 503 "parser.yy" // lalr1.cc:859 +#line 515 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenPkt6::FieldType > () = TokenPkt6::TRANSID; + yylhs.value.as< TokenPkt6::FieldType > () = TokenPkt6::MSGTYPE; } -#line 1302 "parser.cc" // lalr1.cc:859 +#line 1313 "parser.cc" // lalr1.cc:859 break; case 58: -#line 509 "parser.yy" // lalr1.cc:859 +#line 519 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenRelay6Field::FieldType > () = TokenRelay6Field::PEERADDR; - } -#line 1310 "parser.cc" // lalr1.cc:859 + yylhs.value.as< TokenPkt6::FieldType > () = TokenPkt6::TRANSID; + } +#line 1321 "parser.cc" // lalr1.cc:859 break; case 59: -#line 513 "parser.yy" // lalr1.cc:859 +#line 525 "parser.yy" // lalr1.cc:859 { - yylhs.value.as< TokenRelay6Field::FieldType > () = TokenRelay6Field::LINKADDR; + yylhs.value.as< TokenRelay6Field::FieldType > () = TokenRelay6Field::PEERADDR; } -#line 1318 "parser.cc" // lalr1.cc:859 +#line 1329 "parser.cc" // lalr1.cc:859 break; case 60: -#line 519 "parser.yy" // lalr1.cc:859 +#line 529 "parser.yy" // lalr1.cc:859 + { + yylhs.value.as< TokenRelay6Field::FieldType > () = TokenRelay6Field::LINKADDR; + } +#line 1337 "parser.cc" // lalr1.cc:859 + break; + + case 61: +#line 535 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } -#line 1327 "parser.cc" // lalr1.cc:859 +#line 1346 "parser.cc" // lalr1.cc:859 break; - case 61: -#line 526 "parser.yy" // lalr1.cc:859 + case 62: +#line 542 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } -#line 1336 "parser.cc" // lalr1.cc:859 +#line 1355 "parser.cc" // lalr1.cc:859 break; - case 62: -#line 531 "parser.yy" // lalr1.cc:859 + case 63: +#line 547 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString("all")); ctx.expression.push_back(str); } -#line 1345 "parser.cc" // lalr1.cc:859 +#line 1364 "parser.cc" // lalr1.cc:859 break; -#line 1349 "parser.cc" // lalr1.cc:859 +#line 1368 "parser.cc" // lalr1.cc:859 default: break; } @@ -1600,163 +1619,165 @@ namespace isc { namespace eval { } - const signed char EvalParser::yypact_ninf_ = -110; + const signed char EvalParser::yypact_ninf_ = -114; const signed char EvalParser::yytable_ninf_ = -1; const short int EvalParser::yypact_[] = { - 32, 39, 87, 29, 39, 39, 40, 51, 76, 30, - 44, 92, 102, 111, 106, 90, 94, -110, -110, -110, - -110, -110, 67, 35, -110, 104, 116, 117, 97, 105, - -110, -110, 27, -110, -37, -37, 83, 47, -4, 87, - 87, 39, 46, -36, 88, -36, 93, 39, 39, 87, - -37, -37, 83, -36, -36, -110, -110, -110, 125, 126, - -110, 127, -110, -110, -110, -110, -110, -110, -110, -110, - -110, -110, -110, -110, -110, -110, -110, 108, 110, -3, - -110, -110, -110, -110, -110, 129, -110, 131, -110, -110, - 141, -110, 133, 134, 135, 136, 137, 138, 139, 140, - 112, 87, 87, 142, 143, 144, 146, 147, 148, 149, - 22, 65, 6, -110, 118, 153, 132, -14, 1, 109, - 109, 54, 122, 159, -110, -110, -110, -110, -110, -110, - 155, -110, -110, -110, -28, -110, 87, -110, 156, 157, - -110, 158, 160, -37, -110, -110, 169, 171, 128, -37, - -37, -37, 161, -110, -110, 163, 164, 165, 166, 167, - -110, 168, 170, 172, 75, 84, 109, 109, -110, -110, - -110, -110 + 18, 25, 72, 32, 25, 25, 14, 26, 37, 70, + 80, 84, 99, 105, 110, 100, 33, 90, -114, -114, + -114, -114, -114, 38, 116, -114, 101, 121, 122, 117, + 118, -114, -114, 73, -114, -38, -38, 89, 91, 47, + 59, 72, 72, 25, 20, -31, 95, -31, 96, 25, + 25, 72, -38, -38, 89, -31, -31, -114, -114, -114, + 127, 128, -114, 129, 142, -114, -114, -114, -114, -114, + -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, + 112, 113, -3, -114, -114, -114, -114, -114, 131, -114, + 134, -114, -114, 145, -114, 136, 137, 138, 139, 140, + 141, 143, 144, -114, 107, 72, 72, 146, 147, 148, + 149, 150, 151, 152, 5, 76, 13, -114, 123, 158, + 135, -14, 1, 66, 66, 29, 125, 163, -114, -114, + -114, -114, -114, -114, 159, -114, -114, -114, -30, -114, + 72, -114, 160, 161, -114, 162, 164, -38, -114, -114, + 169, 174, 130, -38, -38, -38, 165, -114, -114, 166, + 167, 168, 170, 171, -114, 172, 173, 175, 108, 111, + 66, 66, -114, -114, -114, -114 }; const unsigned char EvalParser::yydefact_[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 35, 17, - 18, 2, 4, 0, 34, 0, 0, 0, 0, 0, - 3, 1, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 36, + 18, 19, 2, 4, 0, 35, 0, 0, 0, 0, + 0, 3, 1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 36, 37, 0, 0, - 40, 0, 41, 42, 43, 44, 22, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 23, 0, 0, 0, - 56, 57, 24, 46, 45, 0, 30, 0, 29, 7, - 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 39, 10, 19, 11, 20, - 0, 58, 59, 25, 0, 27, 0, 13, 32, 0, - 14, 0, 0, 0, 62, 61, 0, 0, 0, 0, - 0, 0, 0, 26, 28, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 12, 21, - 15, 31 + 0, 0, 0, 0, 0, 0, 0, 5, 37, 38, + 0, 0, 41, 0, 0, 42, 43, 44, 45, 23, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 24, + 0, 0, 0, 57, 58, 25, 47, 46, 0, 31, + 0, 30, 7, 8, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 39, 40, + 10, 20, 11, 21, 0, 59, 60, 26, 0, 28, + 0, 13, 33, 0, 14, 0, 0, 0, 63, 62, + 0, 0, 0, 0, 0, 0, 0, 27, 29, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 12, 22, 15, 32 }; const short int EvalParser::yypgoto_[] = { - -110, -110, -110, 4, -2, -110, -34, -109, 130, -110, - 8, -110, -110, -110, -110, -110 + -114, -114, -114, 4, -2, -114, -35, -113, 133, -114, + -40, -114, -114, -114, -114, -114 }; const short int EvalParser::yydefgoto_[] = { - -1, 3, 21, 22, 23, 24, 58, 127, 61, 66, - 85, 76, 82, 133, 114, 146 + -1, 3, 22, 23, 24, 25, 60, 131, 63, 69, + 88, 79, 85, 137, 118, 150 }; const unsigned char EvalParser::yytable_[] = { - 30, 59, 129, 47, 48, 137, 144, 83, 32, 33, - 139, 129, 56, 84, 57, 130, 92, 93, 131, 132, - 140, 145, 67, 68, 69, 70, 71, 72, 73, 31, - 138, 55, 102, 47, 48, 74, 75, 77, 78, 124, - 125, 126, 4, 49, 5, 79, 37, 91, 6, 7, - 8, 89, 90, 87, 34, 169, 171, 169, 171, 9, - 38, 95, 96, 141, 10, 35, 131, 132, 62, 63, - 64, 65, 11, 47, 48, 12, 13, 14, 1, 2, - 15, 16, 124, 125, 128, 80, 81, 17, 18, 19, - 36, 20, 124, 125, 168, 39, 25, 26, 27, 115, - 116, 124, 125, 170, 43, 40, 44, 9, 45, 152, - 46, 53, 10, 44, 41, 156, 157, 158, 50, 54, - 11, 46, 42, 12, 13, 14, 124, 125, 28, 29, - 51, 52, 60, 86, 147, 17, 18, 19, 88, 20, - 97, 98, 99, 100, 103, 101, 104, 47, 105, 106, - 107, 108, 109, 134, 110, 111, 112, 135, 117, 118, - 119, 113, 120, 121, 122, 123, 138, 136, 142, 143, - 148, 149, 150, 153, 151, 154, 159, 155, 160, 161, - 162, 163, 94, 164, 165, 0, 166, 0, 167 + 31, 61, 133, 49, 50, 148, 141, 90, 33, 34, + 143, 133, 58, 86, 59, 98, 99, 95, 96, 87, + 149, 144, 134, 128, 129, 130, 135, 136, 4, 35, + 5, 142, 32, 106, 6, 7, 8, 9, 145, 80, + 81, 36, 135, 136, 49, 50, 10, 82, 45, 94, + 46, 11, 37, 92, 93, 173, 175, 173, 175, 12, + 83, 84, 13, 14, 15, 1, 2, 16, 17, 65, + 66, 67, 68, 38, 18, 19, 20, 57, 21, 49, + 50, 26, 27, 28, 128, 129, 70, 71, 72, 73, + 74, 75, 76, 10, 128, 129, 132, 39, 11, 77, + 78, 40, 41, 119, 120, 47, 12, 48, 42, 13, + 14, 15, 156, 43, 29, 30, 52, 44, 160, 161, + 162, 18, 19, 20, 51, 21, 128, 129, 172, 128, + 129, 174, 55, 56, 46, 48, 53, 54, 151, 62, + 64, 89, 91, 100, 101, 102, 103, 107, 104, 105, + 108, 49, 109, 110, 111, 112, 113, 117, 114, 138, + 115, 116, 139, 121, 122, 123, 124, 125, 126, 127, + 142, 140, 146, 157, 147, 152, 153, 154, 158, 155, + 159, 163, 164, 165, 166, 0, 167, 97, 168, 169, + 170, 0, 171 }; const short int EvalParser::yycheck_[] = { - 2, 35, 111, 6, 7, 19, 34, 43, 4, 5, - 9, 120, 49, 49, 51, 9, 50, 51, 12, 13, - 19, 49, 26, 27, 28, 29, 30, 31, 32, 0, - 44, 4, 35, 6, 7, 39, 40, 39, 40, 17, - 18, 19, 3, 8, 5, 41, 16, 49, 9, 10, - 11, 47, 48, 45, 14, 164, 165, 166, 167, 20, - 16, 53, 54, 9, 25, 14, 12, 13, 21, 22, - 23, 24, 33, 6, 7, 36, 37, 38, 46, 47, - 41, 42, 17, 18, 19, 39, 40, 48, 49, 50, - 14, 52, 17, 18, 19, 3, 9, 10, 11, 101, - 102, 17, 18, 19, 14, 3, 16, 20, 14, 143, - 16, 14, 25, 16, 3, 149, 150, 151, 14, 14, - 33, 16, 16, 36, 37, 38, 17, 18, 41, 42, - 14, 14, 49, 45, 136, 48, 49, 50, 45, 52, - 15, 15, 15, 35, 15, 35, 15, 6, 15, 15, - 15, 15, 15, 35, 16, 16, 16, 4, 16, 16, - 16, 49, 16, 16, 16, 16, 44, 35, 9, 14, - 14, 14, 14, 4, 14, 4, 15, 49, 15, 15, - 15, 15, 52, 16, 16, -1, 16, -1, 16 + 2, 36, 115, 6, 7, 35, 20, 47, 4, 5, + 9, 124, 50, 44, 52, 55, 56, 52, 53, 50, + 50, 20, 9, 18, 19, 20, 13, 14, 3, 15, + 5, 45, 0, 36, 9, 10, 11, 12, 9, 41, + 42, 15, 13, 14, 6, 7, 21, 43, 15, 51, + 17, 26, 15, 49, 50, 168, 169, 170, 171, 34, + 40, 41, 37, 38, 39, 47, 48, 42, 43, 22, + 23, 24, 25, 3, 49, 50, 51, 4, 53, 6, + 7, 9, 10, 11, 18, 19, 27, 28, 29, 30, + 31, 32, 33, 21, 18, 19, 20, 17, 26, 40, + 41, 17, 3, 105, 106, 15, 34, 17, 3, 37, + 38, 39, 147, 3, 42, 43, 15, 17, 153, 154, + 155, 49, 50, 51, 8, 53, 18, 19, 20, 18, + 19, 20, 15, 15, 17, 17, 15, 15, 140, 50, + 49, 46, 46, 16, 16, 16, 4, 16, 36, 36, + 16, 6, 16, 16, 16, 16, 16, 50, 17, 36, + 17, 17, 4, 17, 17, 17, 17, 17, 17, 17, + 45, 36, 9, 4, 15, 15, 15, 15, 4, 15, + 50, 16, 16, 16, 16, -1, 16, 54, 17, 17, + 17, -1, 17 }; const unsigned char EvalParser::yystos_[] = { - 0, 46, 47, 54, 3, 5, 9, 10, 11, 20, - 25, 33, 36, 37, 38, 41, 42, 48, 49, 50, - 52, 55, 56, 57, 58, 9, 10, 11, 41, 42, - 57, 0, 56, 56, 14, 14, 14, 16, 16, 3, - 3, 3, 16, 14, 16, 14, 16, 6, 7, 8, - 14, 14, 14, 14, 14, 4, 49, 51, 59, 59, - 49, 61, 21, 22, 23, 24, 62, 26, 27, 28, - 29, 30, 31, 32, 39, 40, 64, 57, 57, 56, - 39, 40, 65, 43, 49, 63, 45, 63, 45, 56, - 56, 57, 59, 59, 61, 63, 63, 15, 15, 15, - 35, 35, 35, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 49, 67, 57, 57, 16, 16, 16, - 16, 16, 16, 16, 17, 18, 19, 60, 19, 60, - 9, 12, 13, 66, 35, 4, 35, 19, 44, 9, - 19, 9, 9, 14, 34, 49, 68, 57, 14, 14, - 14, 14, 59, 4, 4, 49, 59, 59, 59, 15, - 15, 15, 15, 15, 16, 16, 16, 16, 19, 60, - 19, 60 + 0, 47, 48, 55, 3, 5, 9, 10, 11, 12, + 21, 26, 34, 37, 38, 39, 42, 43, 49, 50, + 51, 53, 56, 57, 58, 59, 9, 10, 11, 42, + 43, 58, 0, 57, 57, 15, 15, 15, 3, 17, + 17, 3, 3, 3, 17, 15, 17, 15, 17, 6, + 7, 8, 15, 15, 15, 15, 15, 4, 50, 52, + 60, 60, 50, 62, 49, 22, 23, 24, 25, 63, + 27, 28, 29, 30, 31, 32, 33, 40, 41, 65, + 58, 58, 57, 40, 41, 66, 44, 50, 64, 46, + 64, 46, 57, 57, 58, 60, 60, 62, 64, 64, + 16, 16, 16, 4, 36, 36, 36, 16, 16, 16, + 16, 16, 16, 16, 17, 17, 17, 50, 68, 58, + 58, 17, 17, 17, 17, 17, 17, 17, 18, 19, + 20, 61, 20, 61, 9, 13, 14, 67, 36, 4, + 36, 20, 45, 9, 20, 9, 9, 15, 35, 50, + 69, 58, 15, 15, 15, 15, 60, 4, 4, 50, + 60, 60, 60, 16, 16, 16, 16, 16, 17, 17, + 17, 17, 20, 61, 20, 61 }; const unsigned char EvalParser::yyr1_[] = { - 0, 53, 54, 54, 55, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 58, 59, 59, 60, 60, - 61, 62, 62, 62, 62, 63, 63, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 65, 65, 66, 66, - 67, 68, 68 + 0, 54, 55, 55, 56, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 59, 60, 60, 61, + 61, 62, 63, 63, 63, 63, 64, 64, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 66, 66, 67, + 67, 68, 69, 69 }; const unsigned char EvalParser::yyr2_[] = { 0, 2, 2, 2, 1, 3, 2, 3, 3, 3, - 6, 6, 11, 6, 6, 11, 1, 1, 1, 6, - 6, 11, 3, 3, 3, 6, 8, 6, 8, 3, - 3, 11, 6, 9, 1, 1, 1, 1, 1, 1, + 6, 6, 11, 6, 6, 11, 4, 1, 1, 1, + 6, 6, 11, 3, 3, 3, 6, 8, 6, 8, + 3, 3, 11, 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1 + 1, 1, 1, 1 }; @@ -1768,31 +1789,32 @@ namespace isc { namespace eval { { "\"end of file\"", "error", "$undefined", "\"(\"", "\")\"", "\"not\"", "\"and\"", "\"or\"", "\"==\"", "\"option\"", "\"relay4\"", "\"relay6\"", - "\"peeraddr\"", "\"linkaddr\"", "\"[\"", "\"]\"", "\".\"", "\"text\"", - "\"hex\"", "\"exists\"", "\"pkt\"", "\"iface\"", "\"src\"", "\"dst\"", - "\"len\"", "\"pkt4\"", "\"mac\"", "\"hlen\"", "\"htype\"", "\"ciaddr\"", - "\"giaddr\"", "\"yiaddr\"", "\"siaddr\"", "\"substring\"", "\"all\"", - "\",\"", "\"concat\"", "\"ifelse\"", "\"pkt6\"", "\"msgtype\"", - "\"transid\"", "\"vendor-class\"", "\"vendor\"", "\"*\"", "\"data\"", - "\"enterprise\"", "\"top-level bool\"", "\"top-level string\"", - "\"constant string\"", "\"integer\"", "\"constant hexstring\"", - "\"option name\"", "\"ip address\"", "$accept", "start", "expression", - "bool_expr", "string_expr", "integer_expr", "option_code", - "option_repr_type", "nest_level", "pkt_metadata", "enterprise_id", - "pkt4_field", "pkt6_field", "relay6_field", "start_expr", "length_expr", YY_NULLPTR + "\"member\"", "\"peeraddr\"", "\"linkaddr\"", "\"[\"", "\"]\"", "\".\"", + "\"text\"", "\"hex\"", "\"exists\"", "\"pkt\"", "\"iface\"", "\"src\"", + "\"dst\"", "\"len\"", "\"pkt4\"", "\"mac\"", "\"hlen\"", "\"htype\"", + "\"ciaddr\"", "\"giaddr\"", "\"yiaddr\"", "\"siaddr\"", "\"substring\"", + "\"all\"", "\",\"", "\"concat\"", "\"ifelse\"", "\"pkt6\"", + "\"msgtype\"", "\"transid\"", "\"vendor-class\"", "\"vendor\"", "\"*\"", + "\"data\"", "\"enterprise\"", "\"top-level bool\"", + "\"top-level string\"", "\"constant string\"", "\"integer\"", + "\"constant hexstring\"", "\"option name\"", "\"ip address\"", "$accept", + "start", "expression", "bool_expr", "string_expr", "integer_expr", + "option_code", "option_repr_type", "nest_level", "pkt_metadata", + "enterprise_id", "pkt4_field", "pkt6_field", "relay6_field", + "start_expr", "length_expr", YY_NULLPTR }; #if EVALDEBUG const unsigned short int EvalParser::yyrline_[] = { - 0, 118, 118, 119, 124, 127, 128, 133, 138, 143, - 148, 153, 173, 187, 196, 205, 217, 222, 227, 232, - 237, 258, 273, 278, 292, 306, 321, 326, 331, 336, - 345, 355, 364, 377, 390, 397, 403, 407, 413, 417, - 423, 432, 436, 440, 444, 450, 454, 460, 464, 468, - 472, 476, 480, 484, 488, 492, 498, 502, 508, 512, - 518, 525, 530 + 0, 119, 119, 120, 125, 128, 129, 134, 139, 144, + 149, 154, 174, 188, 197, 206, 216, 233, 238, 243, + 248, 253, 274, 289, 294, 308, 322, 337, 342, 347, + 352, 361, 371, 380, 393, 406, 413, 419, 423, 429, + 433, 439, 448, 452, 456, 460, 466, 470, 476, 480, + 484, 488, 492, 496, 500, 504, 508, 514, 518, 524, + 528, 534, 541, 546 }; // Print the state stack on the debug stream. @@ -1827,8 +1849,8 @@ namespace isc { namespace eval { #line 14 "parser.yy" // lalr1.cc:1167 } } // isc::eval -#line 1831 "parser.cc" // lalr1.cc:1167 -#line 537 "parser.yy" // lalr1.cc:1168 +#line 1853 "parser.cc" // lalr1.cc:1167 +#line 553 "parser.yy" // lalr1.cc:1168 void isc::eval::EvalParser::error(const location_type& loc, diff --git a/src/lib/eval/parser.h b/src/lib/eval/parser.h index 5f2042f2bf..7b8614a2ad 100644 --- a/src/lib/eval/parser.h +++ b/src/lib/eval/parser.h @@ -366,47 +366,48 @@ namespace isc { namespace eval { TOKEN_OPTION = 264, TOKEN_RELAY4 = 265, TOKEN_RELAY6 = 266, - TOKEN_PEERADDR = 267, - TOKEN_LINKADDR = 268, - TOKEN_LBRACKET = 269, - TOKEN_RBRACKET = 270, - TOKEN_DOT = 271, - TOKEN_TEXT = 272, - TOKEN_HEX = 273, - TOKEN_EXISTS = 274, - TOKEN_PKT = 275, - TOKEN_IFACE = 276, - TOKEN_SRC = 277, - TOKEN_DST = 278, - TOKEN_LEN = 279, - TOKEN_PKT4 = 280, - TOKEN_CHADDR = 281, - TOKEN_HLEN = 282, - TOKEN_HTYPE = 283, - TOKEN_CIADDR = 284, - TOKEN_GIADDR = 285, - TOKEN_YIADDR = 286, - TOKEN_SIADDR = 287, - TOKEN_SUBSTRING = 288, - TOKEN_ALL = 289, - TOKEN_COMA = 290, - TOKEN_CONCAT = 291, - TOKEN_IFELSE = 292, - TOKEN_PKT6 = 293, - TOKEN_MSGTYPE = 294, - TOKEN_TRANSID = 295, - TOKEN_VENDOR_CLASS = 296, - TOKEN_VENDOR = 297, - TOKEN_ANY = 298, - TOKEN_DATA = 299, - TOKEN_ENTERPRISE = 300, - TOKEN_TOPLEVEL_BOOL = 301, - TOKEN_TOPLEVEL_STRING = 302, - TOKEN_STRING = 303, - TOKEN_INTEGER = 304, - TOKEN_HEXSTRING = 305, - TOKEN_OPTION_NAME = 306, - TOKEN_IP_ADDRESS = 307 + TOKEN_MEMBER = 267, + TOKEN_PEERADDR = 268, + TOKEN_LINKADDR = 269, + TOKEN_LBRACKET = 270, + TOKEN_RBRACKET = 271, + TOKEN_DOT = 272, + TOKEN_TEXT = 273, + TOKEN_HEX = 274, + TOKEN_EXISTS = 275, + TOKEN_PKT = 276, + TOKEN_IFACE = 277, + TOKEN_SRC = 278, + TOKEN_DST = 279, + TOKEN_LEN = 280, + TOKEN_PKT4 = 281, + TOKEN_CHADDR = 282, + TOKEN_HLEN = 283, + TOKEN_HTYPE = 284, + TOKEN_CIADDR = 285, + TOKEN_GIADDR = 286, + TOKEN_YIADDR = 287, + TOKEN_SIADDR = 288, + TOKEN_SUBSTRING = 289, + TOKEN_ALL = 290, + TOKEN_COMA = 291, + TOKEN_CONCAT = 292, + TOKEN_IFELSE = 293, + TOKEN_PKT6 = 294, + TOKEN_MSGTYPE = 295, + TOKEN_TRANSID = 296, + TOKEN_VENDOR_CLASS = 297, + TOKEN_VENDOR = 298, + TOKEN_ANY = 299, + TOKEN_DATA = 300, + TOKEN_ENTERPRISE = 301, + TOKEN_TOPLEVEL_BOOL = 302, + TOKEN_TOPLEVEL_STRING = 303, + TOKEN_STRING = 304, + TOKEN_INTEGER = 305, + TOKEN_HEXSTRING = 306, + TOKEN_OPTION_NAME = 307, + TOKEN_IP_ADDRESS = 308 }; }; @@ -569,6 +570,10 @@ namespace isc { namespace eval { symbol_type make_RELAY6 (const location_type& l); + static inline + symbol_type + make_MEMBER (const location_type& l); + static inline symbol_type make_PEERADDR (const location_type& l); @@ -938,12 +943,12 @@ namespace isc { namespace eval { enum { yyeof_ = 0, - yylast_ = 188, ///< Last index in yytable_. + yylast_ = 192, ///< Last index in yytable_. yynnts_ = 16, ///< Number of nonterminal symbols. - yyfinal_ = 31, ///< Termination state number. + yyfinal_ = 32, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 53 ///< Number of tokens. + yyntokens_ = 54 ///< Number of tokens. }; @@ -990,9 +995,9 @@ namespace isc { namespace eval { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52 + 45, 46, 47, 48, 49, 50, 51, 52, 53 }; - const unsigned int user_token_number_max_ = 307; + const unsigned int user_token_number_max_ = 308; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1025,44 +1030,44 @@ namespace isc { namespace eval { { switch (other.type_get ()) { - case 60: // option_repr_type + case 61: // option_repr_type value.copy< TokenOption::RepresentationType > (other.value); break; - case 64: // pkt4_field + case 65: // pkt4_field value.copy< TokenPkt4::FieldType > (other.value); break; - case 65: // pkt6_field + case 66: // pkt6_field value.copy< TokenPkt6::FieldType > (other.value); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.copy< TokenPkt::MetadataType > (other.value); break; - case 66: // relay6_field + case 67: // relay6_field value.copy< TokenRelay6Field::FieldType > (other.value); break; - case 61: // nest_level + case 62: // nest_level value.copy< int8_t > (other.value); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.copy< std::string > (other.value); break; - case 59: // option_code + case 60: // option_code value.copy< uint16_t > (other.value); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.copy< uint32_t > (other.value); break; @@ -1083,44 +1088,44 @@ namespace isc { namespace eval { (void) v; switch (this->type_get ()) { - case 60: // option_repr_type + case 61: // option_repr_type value.copy< TokenOption::RepresentationType > (v); break; - case 64: // pkt4_field + case 65: // pkt4_field value.copy< TokenPkt4::FieldType > (v); break; - case 65: // pkt6_field + case 66: // pkt6_field value.copy< TokenPkt6::FieldType > (v); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.copy< TokenPkt::MetadataType > (v); break; - case 66: // relay6_field + case 67: // relay6_field value.copy< TokenRelay6Field::FieldType > (v); break; - case 61: // nest_level + case 62: // nest_level value.copy< int8_t > (v); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.copy< std::string > (v); break; - case 59: // option_code + case 60: // option_code value.copy< uint16_t > (v); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.copy< uint32_t > (v); break; @@ -1228,44 +1233,44 @@ namespace isc { namespace eval { // Type destructor. switch (yytype) { - case 60: // option_repr_type + case 61: // option_repr_type value.template destroy< TokenOption::RepresentationType > (); break; - case 64: // pkt4_field + case 65: // pkt4_field value.template destroy< TokenPkt4::FieldType > (); break; - case 65: // pkt6_field + case 66: // pkt6_field value.template destroy< TokenPkt6::FieldType > (); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.template destroy< TokenPkt::MetadataType > (); break; - case 66: // relay6_field + case 67: // relay6_field value.template destroy< TokenRelay6Field::FieldType > (); break; - case 61: // nest_level + case 62: // nest_level value.template destroy< int8_t > (); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.template destroy< std::string > (); break; - case 59: // option_code + case 60: // option_code value.template destroy< uint16_t > (); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.template destroy< uint32_t > (); break; @@ -1292,44 +1297,44 @@ namespace isc { namespace eval { super_type::move(s); switch (this->type_get ()) { - case 60: // option_repr_type + case 61: // option_repr_type value.move< TokenOption::RepresentationType > (s.value); break; - case 64: // pkt4_field + case 65: // pkt4_field value.move< TokenPkt4::FieldType > (s.value); break; - case 65: // pkt6_field + case 66: // pkt6_field value.move< TokenPkt6::FieldType > (s.value); break; - case 62: // pkt_metadata + case 63: // pkt_metadata value.move< TokenPkt::MetadataType > (s.value); break; - case 66: // relay6_field + case 67: // relay6_field value.move< TokenRelay6Field::FieldType > (s.value); break; - case 61: // nest_level + case 62: // nest_level value.move< int8_t > (s.value); break; - case 48: // "constant string" - case 49: // "integer" - case 50: // "constant hexstring" - case 51: // "option name" - case 52: // "ip address" + case 49: // "constant string" + case 50: // "integer" + case 51: // "constant hexstring" + case 52: // "option name" + case 53: // "ip address" value.move< std::string > (s.value); break; - case 59: // option_code + case 60: // option_code value.move< uint16_t > (s.value); break; - case 58: // integer_expr - case 63: // enterprise_id + case 59: // integer_expr + case 64: // enterprise_id value.move< uint32_t > (s.value); break; @@ -1393,7 +1398,7 @@ namespace isc { namespace eval { 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307 + 305, 306, 307, 308 }; return static_cast (yytoken_number_[type]); } @@ -1458,6 +1463,12 @@ namespace isc { namespace eval { return symbol_type (token::TOKEN_RELAY6, l); } + EvalParser::symbol_type + EvalParser::make_MEMBER (const location_type& l) + { + return symbol_type (token::TOKEN_MEMBER, l); + } + EvalParser::symbol_type EvalParser::make_PEERADDR (const location_type& l) { @@ -1707,7 +1718,7 @@ namespace isc { namespace eval { #line 14 "parser.yy" // lalr1.cc:377 } } // isc::eval -#line 1711 "parser.h" // lalr1.cc:377 +#line 1722 "parser.h" // lalr1.cc:377 diff --git a/src/lib/eval/position.hh b/src/lib/eval/position.hh index 29b1748dfa..8292fb4f0e 100644 --- a/src/lib/eval/position.hh +++ b/src/lib/eval/position.hh @@ -1,4 +1,4 @@ -// Generated 201710061616 +// Generated 201711240833 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/lib/eval/stack.hh b/src/lib/eval/stack.hh index fc91799529..cc15969074 100644 --- a/src/lib/eval/stack.hh +++ b/src/lib/eval/stack.hh @@ -1,4 +1,4 @@ -// Generated 201710061616 +// Generated 201711240833 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 90e7147bf3c5662a02dfff49c2a40694b9b5ffaa Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 18:39:44 +0100 Subject: [PATCH 25/52] [5374] checkpoint (todo doc and dhcp6 tests) --- src/bin/dhcp4/dhcp4_srv.cc | 34 ++--- src/bin/dhcp4/tests/classify_unittest.cc | 130 ++++++++++++++++++ src/bin/dhcp6/dhcp6_srv.cc | 21 +-- src/lib/dhcpsrv/client_class_def.cc | 48 ++++--- src/lib/dhcpsrv/client_class_def.h | 21 ++- .../tests/client_class_def_parser_unittest.cc | 60 +++++++- .../tests/client_class_def_unittest.cc | 6 +- src/lib/eval/parser.cc | 2 +- src/lib/eval/parser.yy | 2 +- src/lib/eval/tests/context_unittest.cc | 78 ++++++++++- src/lib/eval/token.h | 10 ++ 11 files changed, 349 insertions(+), 63 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 39550c1b1c..09f1eab576 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -2244,16 +2244,17 @@ Dhcpv4Srv::setFixedFields(Dhcpv4Exchange& ex) { if (!classes.empty()) { // Let's get class definitions - const ClientClassDefMapPtr& defs = CfgMgr::instance().getCurrentCfg()-> - getClientClassDictionary()->getClasses(); + const ClientClassDictionaryPtr& dict = + CfgMgr::instance().getCurrentCfg()->getClientClassDictionary(); + const ClientClassDefListPtr& defs = dict->getClasses(); // Now we need to iterate over the classes assigned to the // query packet and find corresponding class definitions for it. for (ClientClasses::const_iterator name = classes.cbegin(); name != classes.cend(); ++name) { - ClientClassDefMap::const_iterator cl = defs->find(*name); - if (cl == defs->end()) { + ClientClassDefPtr cl = dict->findClass(*name); + if (!cl) { // Let's skip classes that don't have definitions. Currently // these are automatic classes VENDOR_CLASS_something, but there // may be other classes assigned under other circumstances, e.g. @@ -2261,12 +2262,12 @@ Dhcpv4Srv::setFixedFields(Dhcpv4Exchange& ex) { continue; } - IOAddress next_server = cl->second->getNextServer(); + IOAddress next_server = cl->getNextServer(); if (!next_server.isV4Zero()) { response->setSiaddr(next_server); } - const string& sname = cl->second->getSname(); + const string& sname = cl->getSname(); if (!sname.empty()) { // Converting string to (const uint8_t*, size_t len) format is // tricky. reinterpret_cast is not the most elegant solution, @@ -2277,7 +2278,7 @@ Dhcpv4Srv::setFixedFields(Dhcpv4Exchange& ex) { sname.size()); } - const string& filename = cl->second->getFilename(); + const string& filename = cl->getFilename(); if (!filename.empty()) { // Converting string to (const uint8_t*, size_t len) format is // tricky. reinterpret_cast is not the most elegant solution, @@ -2958,12 +2959,13 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { // Run match expressions // Note getClientClassDictionary() cannot be null - const ClientClassDefMapPtr& defs_ptr = CfgMgr::instance().getCurrentCfg()-> - getClientClassDictionary()->getClasses(); - for (ClientClassDefMap::const_iterator it = defs_ptr->cbegin(); + const ClientClassDictionaryPtr& dict = + CfgMgr::instance().getCurrentCfg()->getClientClassDictionary(); + const ClientClassDefListPtr& defs_ptr = dict->getClasses(); + for (ClientClassDefList::const_iterator it = defs_ptr->cbegin(); it != defs_ptr->cend(); ++it) { // Note second cannot be null - const ExpressionPtr& expr_ptr = it->second->getMatchExpr(); + const ExpressionPtr& expr_ptr = (*it)->getMatchExpr(); // Nothing to do without an expression to evaluate if (!expr_ptr) { continue; @@ -2974,22 +2976,22 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { bool status = evaluateBool(*expr_ptr, *pkt); if (status) { LOG_INFO(options4_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(status); // Matching: add the class - pkt->addClass(it->first); + pkt->addClass((*it)->getName()); } else { LOG_DEBUG(options4_logger, DBG_DHCP4_DETAIL, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(status); } } catch (const Exception& ex) { LOG_ERROR(options4_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(ex.what()); } catch (...) { LOG_ERROR(options4_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg("get exception?"); } } diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 377590f022..3f48b2013c 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -43,6 +43,17 @@ namespace { /// also reserved for the host using HW address /// 'aa:bb:cc:dd:ee:ff' /// - Subnet of 10.0.0.0/24 with a single address pool +/// +/// - Configuration 2: +/// - Used for testing client class combination +/// - 1 subnet: 10.0.0.0/24 +/// - 1 pool: 10.0.0.10-10.0.0.100 +/// - the following classes defined: +/// not (option[93].hex == 0x0009) +/// not member(), next-server set to 1.2.3.4 +/// option[93].hex == 0x0006 +/// option[93].hex == 0x0001 +/// or member(), set boot-file-name to pxelinux.0 const char* CONFIGS[] = { // Configuration 0 "{ \"interfaces-config\": {" @@ -118,6 +129,41 @@ const char* CONFIGS[] = { " }" " ]" " } ]" + "}", + + // Configuration 2 + "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + "{" + " \"name\": \"not-pxe1\"," + " \"test\": \"not (option[93].hex == 0x0009)\"" + "}," + "{" + " \"name\": \"pxe1\"," + " \"test\": \"not member('not-pxe1')\"," + " \"next-server\": \"1.2.3.4\"" + "}," + "{" + " \"name\": \"pxe3\"," + " \"test\": \"option[93].hex == 0x0006\"" + "}," + "{" + " \"name\": \"pxe4\"," + " \"test\": \"option[93].hex == 0x0001\"" + "}," + "{" + " \"name\": \"pxe34\"," + " \"test\": \"member('pxe3') or member('pxe4')\"," + " \"boot-file-name\": \"pxelinux.0\"" + "}]," + "\"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\", " + " \"id\": 1," + " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]" + " } ]" "}" }; @@ -376,5 +422,89 @@ TEST_F(ClassifyTest, clientClassesInHostReservations) { EXPECT_EQ("10.0.0.201", client.config_.dns_servers_[0].toText()); } +// This test checks that an incoming DISCOVER that does not match any classes +// will get the fixed fields empty. +TEST_F(ClassifyTest, fixedFieldsDiscoverNoClasses2) { + testFixedFields(CONFIGS[2], DHCPDISCOVER, OptionPtr(), "0.0.0.0", "", ""); +} +// This test checks that an incoming REQUEST that does not match any classes +// will get the fixed fields empty. +TEST_F(ClassifyTest, fixedFieldsRequestNoClasses2) { + testFixedFields(CONFIGS[2], DHCPREQUEST, OptionPtr(), "0.0.0.0", "", ""); +} +// This test checks that an incoming INFORM that does not match any classes +// will get the fixed fields empty. +TEST_F(ClassifyTest, fixedFieldsInformNoClasses2) { + testFixedFields(CONFIGS[2], DHCPINFORM, OptionPtr(), "0.0.0.0", "", ""); +} + + +// This test checks that an incoming DISCOVER that does match a class that has +// next-server specified will result in a response that has the next-server set. +TEST_F(ClassifyTest, fixedFieldsDiscoverNextServer2) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[2], DHCPDISCOVER, pxe, "1.2.3.4", "", ""); +} +// This test checks that an incoming REQUEST that does match a class that has +// next-server specified will result in a response that has the next-server set. +TEST_F(ClassifyTest, fixedFieldsRequestNextServer2) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[2], DHCPREQUEST, pxe, "1.2.3.4", "", ""); +} +// This test checks that an incoming INFORM that does match a class that has +// next-server specified will result in a response that has the next-server set. +TEST_F(ClassifyTest, fixedFieldsInformNextServer2) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[2], DHCPINFORM, pxe, "1.2.3.4", "", ""); +} + + +// This test checks that an incoming DISCOVER that does match a class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsDiscoverFile21) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[2], DHCPDISCOVER, pxe, "0.0.0.0", "", "pxelinux.0"); +} +// This test checks that an incoming REQUEST that does match a class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsRequestFile21) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[2], DHCPREQUEST, pxe, "0.0.0.0", "", "pxelinux.0"); +} +// This test checks that an incoming INFORM that does match a class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsInformFile21) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[2], DHCPDISCOVER, pxe, "0.0.0.0", "", "pxelinux.0"); +} + + +// This test checks that an incoming DISCOVER that does match a different class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsDiscoverFile22) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[2], DHCPDISCOVER, pxe, "0.0.0.0", "", "pxelinux.0"); +} +// This test checks that an incoming REQUEST that does match a different class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsRequestFile22) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[2], DHCPREQUEST, pxe, "0.0.0.0", "", "pxelinux.0"); +} +// This test checks that an incoming INFORM that does match a different class that has +// boot-file-name specified will result in a response that has the filename field set. +TEST_F(ClassifyTest, fixedFieldsInformFile22) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[2], DHCPINFORM, pxe, "0.0.0.0", "", "pxelinux.0"); +} } // end of anonymous namespace diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 0416883276..628b5c49d5 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -3085,12 +3085,13 @@ void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { // Run match expressions // Note getClientClassDictionary() cannot be null - const ClientClassDefMapPtr& defs_ptr = CfgMgr::instance().getCurrentCfg()-> - getClientClassDictionary()->getClasses(); - for (ClientClassDefMap::const_iterator it = defs_ptr->cbegin(); + const ClientClassDictionaryPtr& dict = + CfgMgr::instance().getCurrentCfg()->getClientClassDictionary(); + const ClientClassDefListPtr& defs_ptr = dict->getClasses(); + for (ClientClassDefList::const_iterator it = defs_ptr->cbegin(); it != defs_ptr->cend(); ++it) { // Note second cannot be null - const ExpressionPtr& expr_ptr = it->second->getMatchExpr(); + const ExpressionPtr& expr_ptr = (*it)->getMatchExpr(); // Nothing to do without an expression to evaluate if (!expr_ptr) { continue; @@ -3101,23 +3102,23 @@ void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { bool status = evaluateBool(*expr_ptr, *pkt); if (status) { LOG_INFO(dhcp6_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(status); // Matching: add the class - pkt->addClass(it->first); - classes += it->first + " "; + pkt->addClass((*it)->getName()); + classes += (*it)->getName() + " "; } else { LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(status); } } catch (const Exception& ex) { LOG_ERROR(dhcp6_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg(ex.what()); } catch (...) { LOG_ERROR(dhcp6_logger, EVAL_RESULT) - .arg(it->first) + .arg((*it)->getName()) .arg("get exception?"); } } diff --git a/src/lib/dhcpsrv/client_class_def.cc b/src/lib/dhcpsrv/client_class_def.cc index d07de4b717..d6e5dfe657 100644 --- a/src/lib/dhcpsrv/client_class_def.cc +++ b/src/lib/dhcpsrv/client_class_def.cc @@ -165,13 +165,13 @@ std::ostream& operator<<(std::ostream& os, const ClientClassDef& x) { //********** ClientClassDictionary ******************// ClientClassDictionary::ClientClassDictionary() - : classes_(new ClientClassDefMap()) { + : map_(new ClientClassDefMap()), list_(new ClientClassDefList()) { } ClientClassDictionary::ClientClassDictionary(const ClientClassDictionary& rhs) - : classes_(new ClientClassDefMap()) { - BOOST_FOREACH(ClientClassMapPair cclass, *(rhs.classes_)) { - ClientClassDefPtr copy(new ClientClassDef(*(cclass.second))); + : map_(new ClientClassDefMap()), list_(new ClientClassDefList()) { + BOOST_FOREACH(ClientClassDefPtr cclass, *(rhs.list_)) { + ClientClassDefPtr copy(new ClientClassDef(*cclass)); addClass(copy); } } @@ -209,13 +209,14 @@ ClientClassDictionary::addClass(ClientClassDefPtr& class_def) { << class_def->getName() << " has already been defined"); } - (*classes_)[class_def->getName()] = class_def; + list_->push_back(class_def); + (*map_)[class_def->getName()] = class_def; } ClientClassDefPtr ClientClassDictionary::findClass(const std::string& name) const { - ClientClassDefMap::iterator it = classes_->find(name); - if (it != classes_->end()) { + ClientClassDefMap::iterator it = map_->find(name); + if (it != map_->end()) { return (*it).second; } @@ -224,26 +225,33 @@ ClientClassDictionary::findClass(const std::string& name) const { void ClientClassDictionary::removeClass(const std::string& name) { - classes_->erase(name); + for (ClientClassDefList::const_iterator this_class = list_->cbegin(); + this_class != list_->cend(); ++this_class) { + if ((*this_class)->getName() == name) { + list_->erase(this_class); + break; + } + } + map_->erase(name); } -const ClientClassDefMapPtr& +const ClientClassDefListPtr& ClientClassDictionary::getClasses() const { - return (classes_); + return (list_); } bool ClientClassDictionary::equals(const ClientClassDictionary& other) const { - if (classes_->size() != other.classes_->size()) { + if (list_->size() != other.list_->size()) { return (false); } - ClientClassDefMap::iterator this_class = classes_->begin(); - ClientClassDefMap::iterator other_class = other.classes_->begin(); - while (this_class != classes_->end() && - other_class != other.classes_->end()) { - if (!(*this_class).second || !(*other_class).second || - (*(*this_class).second) != (*(*other_class).second)) { + ClientClassDefList::const_iterator this_class = list_->cbegin(); + ClientClassDefList::const_iterator other_class = other.list_->cbegin(); + while (this_class != list_->cend() && + other_class != other.list_->cend()) { + if (!*this_class || !*other_class || + **this_class != **other_class) { return false; } @@ -258,9 +266,9 @@ ElementPtr ClientClassDictionary::toElement() const { ElementPtr result = Element::createList(); // Iterate on the map - for (ClientClassDefMap::iterator this_class = classes_->begin(); - this_class != classes_->end(); ++this_class) { - result->add(this_class->second->toElement()); + for (ClientClassDefList::const_iterator this_class = list_->begin(); + this_class != list_->cend(); ++this_class) { + result->add((*this_class)->toElement()); } return (result); } diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index 1167aa012a..63313ec790 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -14,6 +14,8 @@ #include #include +#include +#include /// @file client_class_def.h /// @@ -209,13 +211,16 @@ private: typedef boost::shared_ptr ClientClassDefPtr; /// @brief Defines a map of ClientClassDef's, keyed by the class name. -typedef std::map ClientClassDefMap; +typedef std::unordered_map ClientClassDefMap; /// @brief Defines a pointer to a ClientClassDefMap typedef boost::shared_ptr ClientClassDefMapPtr; -/// @brief Defines a pair for working with ClientClassMap -typedef std::pair ClientClassMapPair; +/// @brief Defines a list of ClientClassDefPtr's, using insert order. +typedef std::list ClientClassDefList; + +/// @brief Defines a pointer to a ClientClassDefList +typedef boost::shared_ptr ClientClassDefListPtr; /// @brief Maintains a list of ClientClassDef's class ClientClassDictionary : public isc::data::CfgToElement { @@ -274,10 +279,10 @@ public: /// @param name the name of the class to remove void removeClass(const std::string& name); - /// @brief Fetches the dictionary's map of classes + /// @brief Fetches the dictionary's list of classes /// - /// @return ClientClassDefMapPtr to the map of classes - const ClientClassDefMapPtr& getClasses() const; + /// @return ClientClassDefListPtr to the list of classes + const ClientClassDefListPtr& getClasses() const; /// @brief Compares two @c ClientClassDictionary objects for equality. /// @@ -312,8 +317,10 @@ public: private: /// @brief Map of the class definitions - ClientClassDefMapPtr classes_; + ClientClassDefMapPtr map_; + /// @brief List of the class definitions + ClientClassDefListPtr list_; }; /// @brief Defines a pointer to a ClientClassDictionary diff --git a/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc b/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc index 5083400c50..474c551f25 100644 --- a/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc @@ -117,10 +117,10 @@ protected: parser.parse(dictionary, config_element, family); // If we didn't throw, then return the first and only class - ClientClassDefMapPtr classes = dictionary->getClasses(); - ClientClassDefMap::iterator it = classes->begin(); - if (it != classes->end()) { - return (*it).second; + ClientClassDefListPtr classes = dictionary->getClasses(); + ClientClassDefList::const_iterator it = classes->cbegin(); + if (it != classes->cend()) { + return (*it); } // Return NULL if for some reason the class doesn't exist. @@ -885,5 +885,57 @@ TEST_F(ClientClassDefParserTest, filenameBogus) { EXPECT_THROW(parseClientClassDef(cfg_too_long, AF_INET), DhcpConfigError); } +// Verifies that backward and built-in dependencies will parse. +TEST_F(ClientClassDefListParserTest, dependentList) { + std::string cfg_text = + "[ \n" + " { \n" + " \"name\": \"one\", \n" + " \"test\": \"member('VENDOR_CLASS_foo')\" \n" + " }, \n" + " { \n" + " \"name\": \"two\" \n" + " }, \n" + " { \n" + " \"name\": \"three\", \n" + " \"test\": \"member('two')\" \n" + " } \n" + "] \n"; + + // Parsing the list should succeed. + ClientClassDictionaryPtr dictionary; + ASSERT_NO_THROW(dictionary = parseClientClassDefList(cfg_text, AF_INET)); + ASSERT_TRUE(dictionary); + + // We should have three classes in the dictionary. + EXPECT_EQ(3, dictionary->getClasses()->size()); + + // Make sure we can find all three. + ClientClassDefPtr cclass; + ASSERT_NO_THROW(cclass = dictionary->findClass("one")); + ASSERT_TRUE(cclass); + EXPECT_EQ("one", cclass->getName()); + + ASSERT_NO_THROW(cclass = dictionary->findClass("two")); + ASSERT_TRUE(cclass); + EXPECT_EQ("two", cclass->getName()); + + ASSERT_NO_THROW(cclass = dictionary->findClass("three")); + ASSERT_TRUE(cclass); + EXPECT_EQ("three", cclass->getName()); +} + +// Verifies that forward dependencies will not parse. +TEST_F(ClientClassDefListParserTest, dependentForwardError) { + std::string cfg_text = + "[ \n" + " { \n" + " \"name\": \"one\", \n" + " \"test\": \"member('foo')\" \n" + " } \n" + "] \n"; + + EXPECT_THROW(parseClientClassDefList(cfg_text, AF_INET6), DhcpConfigError); +} } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc index d7dd3ae58e..a8e740e8d0 100644 --- a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc +++ b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc @@ -218,9 +218,9 @@ TEST(ClientClassDictionary, basics) { // Verify constructor doesn't throw ASSERT_NO_THROW(dictionary.reset(new ClientClassDictionary())); - // Verify we can fetch a pointer the map of classes and + // Verify we can fetch a pointer the list of classes and // that we start with no classes defined - const ClientClassDefMapPtr classes = dictionary->getClasses(); + const ClientClassDefListPtr classes = dictionary->getClasses(); ASSERT_TRUE(classes); EXPECT_EQ(0, classes->size()); @@ -297,7 +297,7 @@ TEST(ClientClassDictionary, copyAndEquality) { // Copy constructor should succeed. ASSERT_NO_THROW(dictionary2.reset(new ClientClassDictionary(*dictionary))); - // Allocated class map pointers should not be equal + // Allocated class list pointers should not be equal EXPECT_NE(dictionary->getClasses().get(), dictionary2->getClasses().get()); // Equality tools should reflect that the dictionaries are equal. diff --git a/src/lib/eval/parser.cc b/src/lib/eval/parser.cc index 7714ed42b9..5e65909e5e 100644 --- a/src/lib/eval/parser.cc +++ b/src/lib/eval/parser.cc @@ -880,7 +880,7 @@ namespace isc { namespace eval { error(yystack_[1].location, "Unknown client class '" + cc + "'"); } TokenPtr member(new TokenMember(cc)); - ctx.expression.push_back(member) + ctx.expression.push_back(member); } #line 886 "parser.cc" // lalr1.cc:859 break; diff --git a/src/lib/eval/parser.yy b/src/lib/eval/parser.yy index a201d5aaad..b7d52a9af5 100644 --- a/src/lib/eval/parser.yy +++ b/src/lib/eval/parser.yy @@ -226,7 +226,7 @@ bool_expr : "(" bool_expr ")" error(@3, "Unknown client class '" + cc + "'"); } TokenPtr member(new TokenMember(cc)); - ctx.expression.push_back(member) + ctx.expression.push_back(member); } ; diff --git a/src/lib/eval/tests/context_unittest.cc b/src/lib/eval/tests/context_unittest.cc index fffc27f979..f4a6d71334 100644 --- a/src/lib/eval/tests/context_unittest.cc +++ b/src/lib/eval/tests/context_unittest.cc @@ -390,6 +390,54 @@ public: checkTokenRelay6Field(eval.expression.at(0), exp_level, exp_type); } + /// @brief checks if the given token is a TokenMember with the + /// correct client class name. + /// @param token token to be checked + /// @param expected_client_class expected client class name + void checkTokenMember(const TokenPtr& token, + const std::string& expected_client_class) { + ASSERT_TRUE(token); + boost::shared_ptr member = + boost::dynamic_pointer_cast(token); + ASSERT_TRUE(member); + + EXPECT_EQ(expected_client_class, member->getClientClass()); + } + + /// @rief This tests attempts to parse the expression then checks + /// if the number of tokens is correct and the TokenMember is as + /// expected. + /// + /// @param expr expression to be parsed + /// @param check_known closure checking if the client class is known + /// @param exp_client_class expected client class name to be parsed + /// @param exp_tokens expected number of tokens + void testMember(const std::string& expr, + std::function check_known, + const std::string& exp_client_class, + int exp_tokens) { + EvalContext eval(Option::V6, check_known); + + // parse the expression + try { + parsed_ = eval.parseString(expr); + } + catch (const EvalParseError& ex) { + FAIL() <<"Exception thrown: " << ex.what(); + return; + } + + // Parsing should succeed and return a token. + EXPECT_TRUE(parsed_); + + // There should be the expected number of tokens. + ASSERT_EQ(exp_tokens, eval.expression.size()); + + // checked that the first token is TokenRelay6Field and that + // is has the correct attributes + checkTokenMember(eval.expression.at(0), exp_client_class); + } + /// @brief checks if the given token is a substring operator void checkTokenSubstring(const TokenPtr& token) { ASSERT_TRUE(token); @@ -1071,6 +1119,31 @@ TEST_F(EvalContextTest, relay6FieldError) { ":1.8: Nest level invalid for DHCPv4 packets"); } +// Tests parsing of member with known class +TEST_F(EvalContextTest, member) { + auto check_known = [](const ClientClass& cc) { return (cc == "foo"); }; + testMember("member('foo')", check_known, "foo", 1); +} + +// Test parsing of member with unknown class +TEST_F(EvalContextTest, memberError) { + auto check_known = [](const ClientClass& cc) { return (cc == "foo"); }; + EvalContext eval(Option::V6, check_known); + parsed_ = false; + try { + parsed_ = eval.parseString("member('bar')"); + FAIL() << "Expected EvalParseError but nothing was raised"; + } + catch (const EvalParseError& ex) { + EXPECT_EQ(":1.8-12: Unknown client class 'bar'", + std::string(ex.what())); + EXPECT_FALSE(parsed_); + } + catch (...) { + FAIL() << "Expected EvalParseError but something else was raised"; + } +} + // Test parsing of logical operators TEST_F(EvalContextTest, logicalOps) { // option.exists @@ -1249,11 +1322,11 @@ TEST_F(EvalContextTest, scanErrors) { // Typo should be handled as well. checkError("subtring", ":1.1: Invalid character: s"); - checkError("foo", ":1.1: Invalid character: f"); checkError(" bar", ":1.2: Invalid character: b"); checkError("relay[12].hex == 'foo'", ":1.1: Invalid character: r"); checkError("pkt4.ziaddr", ":1.6: Invalid character: z"); + checkError("members('foo'", ":1.7: Invalid character: s"); } // Tests some scanner/parser error cases @@ -1428,6 +1501,9 @@ TEST_F(EvalContextTest, typeErrors) { "expecting \",\""); checkError("ifelse('foo'=='bar','foo','bar'=='bar')", ":1.32-33: syntax error, unexpected ==, expecting )"); + + // Member uses quotes around the client class name. + checkError("member(foo)", ":1.8: Invalid character: f"); } diff --git a/src/lib/eval/token.h b/src/lib/eval/token.h index 630a11cd10..330bc60dfb 100644 --- a/src/lib/eval/token.h +++ b/src/lib/eval/token.h @@ -819,6 +819,16 @@ public: /// @param values true (if found) or false (if not found) will be pushed here void evaluate(Pkt& pkt, ValueStack& values); + /// @brief Returns client class name + /// + /// This method is used in testing to determine if the parser had + /// instantiated TokenMember with correct parameters. + /// + /// @return client class name the token expects to check membership. + const ClientClass& getClientClass() const { + return (client_class_); + } + protected: /// @brief The client class name ClientClass client_class_; From a08498ada38eb6f1ca81d3fb05b2d15249eb80fb Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 24 Nov 2017 19:47:00 +0100 Subject: [PATCH 26/52] [5374] Final updates --- doc/guide/classify.xml | 23 ++++ src/bin/dhcp4/tests/get_config_unittest.cc | 4 +- src/bin/dhcp6/tests/classify_unittests.cc | 132 +++++++++++++++++++++ src/bin/dhcp6/tests/get_config_unittest.cc | 4 +- 4 files changed, 159 insertions(+), 4 deletions(-) diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index bd5ab03907..49fd96d01f 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -61,6 +61,13 @@ + + + Beginning with 1.4 client classes follow now the insertion order + (vs. alphabetical order in previous versions). + + + When determining which options to include in the response the server will examine the union of options from all of the assigned classes. In the case two or more @@ -223,6 +230,13 @@ If the option with given code is present in the packet "true" else "false" + + Client class membership + member('foobar') + 'true' + If the packet belongs to the given client class + "true" else "false" + DHCPv4 relay agent sub-option relay4[123].hex @@ -472,6 +486,15 @@ in the incoming packet. It can be used with empty options. + + "member('foobar')" checks if the packet belongs to the client + class "foobar". To avoid dependency loops the configuration file + parser checks if client classes were already defined or are + built-in, i.e., beginning by "VENDOR_CLASS_", + "AFTER__" (for the to come "after" hook) and + "EXTERNAL_". + + "relay4[code].hex" attempts to extract the value of the sub-option "code" from the option inserted as the DHCPv4 Relay Agent Information diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 95e2c00464..16f9473a4d 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -6171,7 +6171,7 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " {\n" " \"boot-file-name\": \"\",\n" -" \"name\": \"three\",\n" +" \"name\": \"two\",\n" " \"next-server\": \"0.0.0.0\",\n" " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" @@ -6179,7 +6179,7 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " {\n" " \"boot-file-name\": \"\",\n" -" \"name\": \"two\",\n" +" \"name\": \"three\",\n" " \"next-server\": \"0.0.0.0\",\n" " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index d8967e8ffe..99058ac014 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -992,5 +992,137 @@ TEST_F(ClassifyTest, clientClassesInHostReservations) { "2001:db8:1::100")); } +// Check classification using membership expressions. +TEST_F(ClassifyTest, member) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // The router class matches incoming packets with foo in a host-name + // option (code 1234) and sets an ipv6-forwarding option in the response. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ] }, " + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"valid-lifetime\": 4000, " + "\"option-def\": [ " + "{ \"name\": \"host-name\"," + " \"code\": 1234," + " \"type\": \"string\" }," + "{ \"name\": \"ipv6-forwarding\"," + " \"code\": 2345," + " \"type\": \"boolean\" }]," + "\"subnet6\": [ " + "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " + " \"subnet\": \"2001:db8:1::/48\", " + " \"interface\": \"eth1\" } ]," + "\"client-classes\": [ " + "{ \"name\": \"not-foo\", " + " \"test\": \"not (option[host-name].text == 'foo')\"" + "}," + "{ \"name\": \"foo\", " + " \"option-data\": [" + " { \"name\": \"ipv6-forwarding\", " + " \"data\": \"true\" } ], " + " \"test\": \"not member('not-foo')\"" + "}," + "{ \"name\": \"bar\", " + " \"test\": \"option[host-name].text == 'bar'\"" + "}," + "{ \"name\": \"baz\", " + " \"test\": \"option[host-name].text == 'baz'\"" + "}," + "{ \"name\": \"barz\", " + " \"option-data\": [" + " { \"name\": \"ipv6-forwarding\", " + " \"data\": \"false\" } ], " + " \"test\": \"member('bar') or member('baz')\" } ] }"; + + ASSERT_NO_THROW(configure(config)); + + // Create packets with enough to select the subnet + OptionPtr clientid = generateClientId(); + Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234)); + query1->setRemoteAddr(IOAddress("fe80::abcd")); + query1->addOption(clientid); + query1->setIface("eth1"); + query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234)); + query2->setRemoteAddr(IOAddress("fe80::abcd")); + query2->addOption(clientid); + query2->setIface("eth1"); + query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234)); + query3->setRemoteAddr(IOAddress("fe80::abcd")); + query3->addOption(clientid); + query3->setIface("eth1"); + query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000)); + + // Create and add an ORO option to queries + OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); + ASSERT_TRUE(oro); + oro->addValue(2345); + query1->addOption(oro); + query2->addOption(oro); + query3->addOption(oro); + + // Create and add a host-name option to the first and last queries + OptionStringPtr hostname1(new OptionString(Option::V6, 1234, "foo")); + ASSERT_TRUE(hostname1); + query1->addOption(hostname1); + OptionStringPtr hostname3(new OptionString(Option::V6, 1234, "baz")); + ASSERT_TRUE(hostname3); + query3->addOption(hostname3); + + // Classify packets + srv.classifyPacket(query1); + srv.classifyPacket(query2); + srv.classifyPacket(query3); + + // Check classes + EXPECT_FALSE(query1->inClass("not-foo")); + EXPECT_TRUE(query1->inClass("foo")); + EXPECT_FALSE(query1->inClass("bar")); + EXPECT_FALSE(query1->inClass("baz")); + EXPECT_FALSE(query1->inClass("barz")); + + EXPECT_TRUE(query2->inClass("not-foo")); + EXPECT_FALSE(query2->inClass("foo")); + EXPECT_FALSE(query2->inClass("bar")); + EXPECT_FALSE(query2->inClass("baz")); + EXPECT_FALSE(query2->inClass("barz")); + + EXPECT_TRUE(query3->inClass("not-foo")); + EXPECT_FALSE(query3->inClass("foo")); + EXPECT_FALSE(query3->inClass("bar")); + EXPECT_TRUE(query3->inClass("baz")); + EXPECT_TRUE(query3->inClass("barz")); + + // Process queries + Pkt6Ptr response1 = srv.processSolicit(query1); + Pkt6Ptr response2 = srv.processSolicit(query2); + Pkt6Ptr response3 = srv.processSolicit(query3); + + // Classification processing should add an ip-forwarding option + OptionPtr opt1 = response1->getOption(2345); + EXPECT_TRUE(opt1); + OptionCustomPtr ipf1 = + boost::dynamic_pointer_cast(opt1); + ASSERT_TRUE(ipf1); + EXPECT_TRUE(ipf1->readBoolean()); + + // But not the second query which was not classified + OptionPtr opt2 = response2->getOption(2345); + EXPECT_FALSE(opt2); + + // The third has the option but with another value + OptionPtr opt3 = response3->getOption(2345); + EXPECT_TRUE(opt3); + OptionCustomPtr ipf3 = + boost::dynamic_pointer_cast(opt3); + ASSERT_TRUE(ipf3); + EXPECT_FALSE(ipf3->readBoolean()); +} } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index 05996adee3..403bbb79d8 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -5467,11 +5467,11 @@ const char* UNPARSED_CONFIGS[] = { " \"option-data\": [ ]\n" " },\n" " {\n" -" \"name\": \"three\",\n" +" \"name\": \"two\",\n" " \"option-data\": [ ]\n" " },\n" " {\n" -" \"name\": \"two\",\n" +" \"name\": \"three\",\n" " \"option-data\": [ ]\n" " }\n" " ],\n" From 033b5a941e24765b8cdeea354f43d47975d38fb6 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 02:59:59 +0100 Subject: [PATCH 27/52] [5374] Checkpoint before updting syntax --- src/bin/dhcp4/dhcp4_lexer.ll | 23 +++- src/bin/dhcp4/dhcp4_parser.yy | 23 +++- src/bin/dhcp4/dhcp4_srv.cc | 109 +++++++++++++++++- src/bin/dhcp4/dhcp4_srv.h | 12 ++ src/bin/dhcp4/parser_context.cc | 2 - src/bin/dhcp4/parser_context.h | 3 - src/bin/dhcp6/dhcp6_lexer.ll | 21 ++++ src/bin/dhcp6/dhcp6_parser.yy | 24 +++- src/bin/dhcp6/dhcp6_srv.cc | 100 ++++++++++++++++ src/bin/dhcp6/dhcp6_srv.h | 13 +++ src/bin/dhcp6/parser_context.cc | 2 - src/bin/dhcp6/parser_context.h | 3 - src/lib/dhcp/pkt.cc | 7 +- src/lib/dhcp/pkt.h | 20 +++- src/lib/dhcp/tests/pkt4_unittest.cc | 32 ++++- src/lib/dhcp/tests/pkt6_unittest.cc | 32 ++++- src/lib/dhcpsrv/client_class_def.cc | 23 +++- src/lib/dhcpsrv/client_class_def.h | 16 ++- src/lib/dhcpsrv/network.cc | 23 ++++ src/lib/dhcpsrv/network.h | 16 ++- .../parsers/client_class_def_parser.cc | 8 +- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 61 ++++++++++ .../dhcpsrv/parsers/shared_network_parser.cc | 28 +++++ src/lib/dhcpsrv/pool.cc | 15 ++- src/lib/dhcpsrv/pool.h | 19 +++ src/lib/dhcpsrv/subnet.cc | 100 +--------------- .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 9 +- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 14 ++- .../tests/client_class_def_unittest.cc | 35 ++++-- src/lib/dhcpsrv/tests/pool_unittest.cc | 58 ++++++++++ .../tests/shared_network_parser_unittest.cc | 55 +++++++++ .../dhcpsrv/tests/shared_network_unittest.cc | 5 + src/lib/dhcpsrv/tests/srv_config_unittest.cc | 9 +- src/lib/dhcpsrv/tests/subnet_unittest.cc | 4 +- 34 files changed, 769 insertions(+), 155 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 2434eb3cae..23ae511629 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -517,7 +517,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::RESERVATIONS: case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: return isc::dhcp::Dhcp4Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("option-data", driver.loc_); @@ -531,7 +530,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser4Context::OPTION_DEF: case isc::dhcp::Parser4Context::OPTION_DATA: case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::LOGGERS: return isc::dhcp::Dhcp4Parser::make_NAME(driver.loc_); @@ -816,6 +814,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"eval-client-classes\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: + case isc::dhcp::Parser4Context::SHARED_NETWORK: + return isc::dhcp::Dhcp4Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + } +} + \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -831,13 +840,21 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"test\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: return isc::dhcp::Dhcp4Parser::make_TEST(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("test", driver.loc_); } } +\"eval-on-demand\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::CLIENT_CLASSES: + return isc::dhcp::Dhcp4Parser::make_EVAL_ON_DEMAND(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-on-demand", driver.loc_); + } +} + \"reservations\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 247a240855..2b83ced450 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -126,7 +126,9 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" + EVAL_CLIENT_CLASSES "eval-client-classes" TEST "test" + EVAL_ON_DEMAND "eval-on-demand" CLIENT_CLASS "client-class" RESERVATIONS "reservations" @@ -912,6 +914,7 @@ subnet4_param: valid_lifetime | id | rapid_commit | client_class + | eval_client_classes | reservations | reservation_mode | relay @@ -975,13 +978,23 @@ interface_id: INTERFACE_ID { }; client_class: CLIENT_CLASS { - ctx.enter(ctx.CLIENT_CLASS); + ctx.enter(ctx.NO_KEYWORD); } COLON STRING { ElementPtr cls(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); }; +eval_client_classes: EVAL_CLIENT_CLASSES { + ElementPtr c(new ListElement(ctx.loc2pos(@1))); + ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.push_back(c); + ctx.enter(ctx.NO_KEYWORD); +} COLON list_strings { + ctx.stack_.pop_back(); + ctx.leave(); +}; + reservation_mode: RESERVATION_MODE { ctx.enter(ctx.RESERVATION_MODE); } COLON hr_mode { @@ -1051,6 +1064,7 @@ shared_network_param: name | relay | reservation_mode | client_class + | eval_client_classes | valid_lifetime | unknown_map_entry ; @@ -1333,6 +1347,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class + | eval_client_classes | user_context | known_clients | unknown_map_entry @@ -1576,6 +1591,7 @@ not_empty_client_class_params: client_class_param client_class_param: client_class_name | client_class_test + | eval_on_demand | option_def_list | option_data_list | next_server @@ -1594,6 +1610,11 @@ client_class_test: TEST { ctx.leave(); }; +eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { + ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("eval-on-demand"); +}; + // --- end of client classes --------------------------------- // was server-id but in is DHCPv6-only diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 09f1eab576..e5f39d21bb 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -2325,11 +2325,13 @@ Dhcpv4Srv::processDiscover(Pkt4Ptr& discover) { return (Pkt4Ptr()); } - // Assign reserved classes. - ex.setReservedClientClasses(); - // Adding any other options makes sense only when we got the lease. if (!ex.getResponse()->getYiaddr().isV4Zero()) { + // Assign reserved classes. + ex.setReservedClientClasses(); + // Late classification + lateClassify(ex); + buildCfgOptionList(ex); appendRequestedOptions(ex); appendRequestedVendorOptions(ex); @@ -2380,11 +2382,13 @@ Dhcpv4Srv::processRequest(Pkt4Ptr& request) { return (Pkt4Ptr()); } - // Assign reserved classes. - ex.setReservedClientClasses(); - // Adding any other options makes sense only when we got the lease. if (!ex.getResponse()->getYiaddr().isV4Zero()) { + // Assign reserved classes. + ex.setReservedClientClasses(); + // Late classification + lateClassify(ex); + buildCfgOptionList(ex); appendRequestedOptions(ex); appendRequestedVendorOptions(ex); @@ -2668,6 +2672,7 @@ Dhcpv4Srv::processInform(Pkt4Ptr& inform) { Pkt4Ptr ack = ex.getResponse(); ex.setReservedClientClasses(); + lateClassify(ex); buildCfgOptionList(ex); appendRequestedOptions(ex); @@ -2970,6 +2975,10 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { if (!expr_ptr) { continue; } + // Not the right time if on demand + if ((*it)->getOnDemand()) { + continue; + } // Evaluate the expression which can return false (no match), // true (match) or raise an exception (error) try { @@ -2997,6 +3006,94 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { } } +void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { + // First collect on-demand classes + Pkt4Ptr query = ex.getQuery(); + ClientClasses classes = query->getClasses(true); + Subnet4Ptr subnet = ex.getContext()->subnet_; + + if (subnet) { + // Begin by the shared-network + SharedNetwork4Ptr network; + subnet->getSharedNetwork(network); + if (network) { + const ClientClasses& to_add = network->getOnDemandClasses(); + for (ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + } + + // Followed by the subnet + const ClientClasses& to_add = subnet->getOnDemandClasses(); + for(ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + + // And finish by the pool + Pkt4Ptr resp = ex.getResponse(); + IOAddress addr = IOAddress::IPV4_ZERO_ADDRESS(); + if (resp) { + addr = resp->getYiaddr(); + } + if (!addr.isV4Zero()) { + PoolPtr pool = subnet->getPool(Lease::TYPE_V4, addr, false); + if (pool) { + const ClientClasses& to_add = pool->getOnDemandClasses(); + for (ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + } + } + + // host reservation??? + } + + // Run match expressions + // Note getClientClassDictionary() cannot be null + const ClientClassDictionaryPtr& dict = + CfgMgr::instance().getCurrentCfg()->getClientClassDictionary(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + const ClientClassDefPtr class_def = dict->findClass(*cclass); + // Todo: log unknown classes + if (!class_def) { + continue; + } + const ExpressionPtr& expr_ptr = class_def->getMatchExpr(); + // Nothing to do without an expression to evaluate + if (!expr_ptr) { + continue; + } + // Evaluate the expression which can return false (no match), + // true (match) or raise an exception (error) + try { + bool status = evaluateBool(*expr_ptr, *query); + if (status) { + LOG_INFO(options4_logger, EVAL_RESULT) + .arg(*cclass) + .arg(status); + // Matching: add the class + query->addClass(*cclass); + } else { + LOG_DEBUG(options4_logger, DBG_DHCP4_DETAIL, EVAL_RESULT) + .arg(*cclass) + .arg(status); + } + } catch (const Exception& ex) { + LOG_ERROR(options4_logger, EVAL_RESULT) + .arg(*cclass) + .arg(ex.what()); + } catch (...) { + LOG_ERROR(options4_logger, EVAL_RESULT) + .arg(*cclass) + .arg("get exception?"); + } + } +} + void Dhcpv4Srv::deferredUnpack(Pkt4Ptr& query) { diff --git a/src/bin/dhcp4/dhcp4_srv.h b/src/bin/dhcp4/dhcp4_srv.h index 2fa90f127e..536ef263da 100644 --- a/src/bin/dhcp4/dhcp4_srv.h +++ b/src/bin/dhcp4/dhcp4_srv.h @@ -803,6 +803,18 @@ protected: /// @param pkt packet to be classified void classifyPacket(const Pkt4Ptr& pkt); + /// @brief Assigns incoming packet to zero or more classes (late pass). + /// + /// @note This late classification evaluates all classes which + /// were marked for this deferred/on-demand pass. Classes are + /// collected in the reversed order than output option processing. + /// + /// @note The eval-on-demand flag is related because it avoids + /// double evaluation (which is not forbidden). + /// + /// @param ex The exchange holding needed informations. + void lateClassify(Dhcpv4Exchange& ex); + /// @brief Perform deferred option unpacking. /// /// @note Options 43 and 224-254 are processed after classification. diff --git a/src/bin/dhcp4/parser_context.cc b/src/bin/dhcp4/parser_context.cc index bbafcc2f2e..dca316b398 100644 --- a/src/bin/dhcp4/parser_context.cc +++ b/src/bin/dhcp4/parser_context.cc @@ -180,8 +180,6 @@ Parser4Context::contextName() return ("reservations"); case RELAY: return ("relay"); - case CLIENT_CLASS: - return ("client-class"); case LOGGERS: return ("loggers"); case OUTPUT_OPTIONS: diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index 83e1f0a13a..4b112c651f 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -273,9 +273,6 @@ public: /// Used while parsing Dhcp4/subnet4relay structures. RELAY, - /// Used while parsing Dhcp4/client-classes structures. - CLIENT_CLASS, - /// Used while parsing Logging/loggers structures. LOGGERS, diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index fba59d48e0..0ea4191f49 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1069,6 +1069,18 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"eval-client-classes\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: + case isc::dhcp::Parser6Context::SHARED_NETWORK: + return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + } +} + \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -1092,6 +1104,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"eval-on-demand\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::CLIENT_CLASSES: + return isc::dhcp::Dhcp6Parser::make_EVAL_ON_DEMAND(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("eval-on-demand", driver.loc_); + } +} + \"reservations\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 34c346503d..0747d12c48 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -119,7 +119,9 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" + EVAL_CLIENT_CLASSES "eval-client-classes" TEST "test" + EVAL_ON_DEMAND "eval-on-demand" CLIENT_CLASS "client-class" RESERVATIONS "reservations" @@ -907,6 +909,7 @@ subnet6_param: preferred_lifetime | id | rapid_commit | client_class + | eval_client_classes | reservations | reservation_mode | relay @@ -939,13 +942,23 @@ interface_id: INTERFACE_ID { }; client_class: CLIENT_CLASS { - ctx.enter(ctx.CLIENT_CLASS); + ctx.enter(ctx.NO_KEYWORD); } COLON STRING { ElementPtr cls(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); }; ++eval_client_classes: EVAL_CLIENT_CLASSES { + ElementPtr c(new ListElement(ctx.loc2pos(@1))); + ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.push_back(c); + ctx.enter(ctx.NO_KEYWORD); +} COLON list_strings { + ctx.stack_.pop_back(); + ctx.leave(); +}; + reservation_mode: RESERVATION_MODE { ctx.enter(ctx.RESERVATION_MODE); } COLON hr_mode { @@ -1013,6 +1026,7 @@ shared_network_param: name | relay | reservation_mode | client_class + | eval_client_classes | preferred_lifetime | rapid_commit | valid_lifetime @@ -1296,6 +1310,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class + | eval_client_classes | user_context | known_clients | unknown_map_entry @@ -1384,6 +1399,7 @@ pd_pool_param: pd_prefix | pd_delegated_len | option_data_list | client_class + | eval_client_classes | excluded_prefix | excluded_prefix_len | user_context @@ -1601,6 +1617,7 @@ not_empty_client_class_params: client_class_param client_class_param: client_class_name | client_class_test + | eval_on_demand | option_data_list | unknown_map_entry ; @@ -1615,6 +1632,11 @@ client_class_test: TEST { ctx.leave(); }; +eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { + ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("eval-on-demand"); +}; + // --- end of client classes --------------------------------- // --- server-id --------------------------------------------- diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 628b5c49d5..18cbcb03fe 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -2489,6 +2489,7 @@ Dhcpv6Srv::processSolicit(const Pkt6Ptr& solicit) { assignLeases(solicit, response, ctx); setReservedClientClasses(solicit, ctx); + lateClassify(solicit, ctx); copyClientOptions(solicit, response); CfgOptionList co_list; @@ -2523,6 +2524,7 @@ Dhcpv6Srv::processRequest(const Pkt6Ptr& request) { assignLeases(request, reply, ctx); setReservedClientClasses(request, ctx); + lateClassify(request, ctx); copyClientOptions(request, reply); CfgOptionList co_list; @@ -2553,6 +2555,7 @@ Dhcpv6Srv::processRenew(const Pkt6Ptr& renew) { extendLeases(renew, reply, ctx); setReservedClientClasses(renew, ctx); + lateClassify(renew, ctx); copyClientOptions(renew, reply); CfgOptionList co_list; @@ -2583,6 +2586,7 @@ Dhcpv6Srv::processRebind(const Pkt6Ptr& rebind) { extendLeases(rebind, reply, ctx); setReservedClientClasses(rebind, ctx); + lateClassify(rebind, ctx); copyClientOptions(rebind, reply); CfgOptionList co_list; @@ -2607,6 +2611,7 @@ Dhcpv6Srv::processConfirm(const Pkt6Ptr& confirm) { AllocEngine::ClientContext6 ctx; initContext(confirm, ctx); setReservedClientClasses(confirm, ctx); + lateClassify(confirm, ctx); // Get IA_NAs from the Confirm. If there are none, the message is // invalid and must be discarded. There is nothing more to do. @@ -2700,6 +2705,7 @@ Dhcpv6Srv::processRelease(const Pkt6Ptr& release) { AllocEngine::ClientContext6 ctx; initContext(release, ctx); setReservedClientClasses(release, ctx); + lateClassify(release, ctx); Pkt6Ptr reply(new Pkt6(DHCPV6_REPLY, release->getTransid())); @@ -2729,6 +2735,7 @@ Dhcpv6Srv::processDecline(const Pkt6Ptr& decline) { AllocEngine::ClientContext6 ctx; initContext(decline, ctx); setReservedClientClasses(decline, ctx); + lateClassify(decline, ctx); // Copy client options (client-id, also relay information if present) copyClientOptions(decline, reply); @@ -3010,6 +3017,7 @@ Dhcpv6Srv::processInfRequest(const Pkt6Ptr& inf_request) { AllocEngine::ClientContext6 ctx; initContext(inf_request, ctx); setReservedClientClasses(inf_request, ctx); + lateClassify(inf_request, ctx); // Create a Reply packet, with the same trans-id as the client's. Pkt6Ptr reply(new Pkt6(DHCPV6_REPLY, inf_request->getTransid())); @@ -3096,6 +3104,10 @@ void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { if (!expr_ptr) { continue; } + // Not the right time if on demand + if ((*it)->getOnDemand()) { + continue; + } // Evaluate the expression which can return false (no match), // true (match) or raise an exception (error) try { @@ -3143,6 +3155,94 @@ Dhcpv6Srv::setReservedClientClasses(const Pkt6Ptr& pkt, } } +void +Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { + // First collect on-demand classes + ClientClasses classes = pkt->getClasses(true); + Subnet6Ptr subnet = ctx.subnet_; + + if (subnet) { + // Begin by the shared-network + SharedNetwork6Ptr network; + subnet->getSharedNetwork(network); + if (network) { + const ClientClasses& to_add = network->getOnDemandClasses(); + for (ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + } + + // Followed by the subnet + const ClientClasses& to_add = subnet->getOnDemandClasses(); + for(ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + + // And finish by pools + BOOST_FOREACH(const AllocEngine::ResourceType& resource, + ctx.allocated_resources_) { + PoolPtr pool = ctx.subnet_->getPool(resource.second == 128 ? + Lease::TYPE_NA : + Lease::TYPE_PD, + resource.first, + false); + if (pool) { + const ClientClasses& to_add = pool->getOnDemandClasses(); + for (ClientClasses::const_iterator cclass = to_add.cbegin(); + cclass != to_add.cend(); ++cclass) { + classes.insert(*cclass); + } + } + } + + // host reservation??? + } + + // Run match expressions + // Note getClientClassDictionary() cannot be null + const ClientClassDictionaryPtr& dict = + CfgMgr::instance().getCurrentCfg()->getClientClassDictionary(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + const ClientClassDefPtr class_def = dict->findClass(*cclass); + // Todo: log unknown classes + if (!class_def) { + continue; + } + const ExpressionPtr& expr_ptr = class_def->getMatchExpr(); + // Nothing to do without an expression to evaluate + if (!expr_ptr) { + continue; + } + // Evaluate the expression which can return false (no match), + // true (match) or raise an exception (error) + try { + bool status = evaluateBool(*expr_ptr, *pkt); + if (status) { + LOG_INFO(dhcp6_logger, EVAL_RESULT) + .arg(*cclass) + .arg(status); + // Matching: add the class + pkt->addClass(*cclass); + } else { + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, EVAL_RESULT) + .arg(*cclass) + .arg(status); + } + } catch (const Exception& ex) { + LOG_ERROR(dhcp6_logger, EVAL_RESULT) + .arg(*cclass) + .arg(ex.what()); + } catch (...) { + LOG_ERROR(dhcp6_logger, EVAL_RESULT) + .arg(*cclass) + .arg("get exception?"); + } + } +} + void Dhcpv6Srv::updateReservedFqdn(const AllocEngine::ClientContext6& ctx, const Pkt6Ptr& answer) { diff --git a/src/bin/dhcp6/dhcp6_srv.h b/src/bin/dhcp6/dhcp6_srv.h index ed7a103005..a63691f8ce 100644 --- a/src/bin/dhcp6/dhcp6_srv.h +++ b/src/bin/dhcp6/dhcp6_srv.h @@ -649,6 +649,19 @@ protected: void setReservedClientClasses(const Pkt6Ptr& pkt, const AllocEngine::ClientContext6& ctx); + /// @brief Assigns incoming packet to zero or more classes (late pass). + /// + /// @note This late classification evaluates all classes which + /// were marked for this deferred/on-demand pass. Classes are + /// collected in the reversed order than output option processing. + /// + /// @note The eval-on-demand flag is related because it avoids + /// double evaluation (which is not forbidden). + /// + /// @param pkt packet to be classified + /// @param ctx allocation context where to get informations + void lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx); + /// @brief Attempts to get a MAC/hardware address using configured sources /// /// Tries to extract MAC/hardware address information from the packet diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index 1ff28141ea..5bd52e4b10 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -182,8 +182,6 @@ Parser6Context::contextName() return ("reservations"); case RELAY: return ("relay"); - case CLIENT_CLASS: - return ("client-class"); case LOGGERS: return ("loggers"); case OUTPUT_OPTIONS: diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 568cd995b5..e6a1388318 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -279,9 +279,6 @@ public: /// Used while parsing Dhcp6/subnet6/relay structures. RELAY, - /// Used while parsing Dhcp6/client-classes structures. - CLIENT_CLASS, - /// Used while parsing Logging/loggers structures. LOGGERS, diff --git a/src/lib/dhcp/pkt.cc b/src/lib/dhcp/pkt.cc index ac633f078c..a6261802d5 100644 --- a/src/lib/dhcp/pkt.cc +++ b/src/lib/dhcp/pkt.cc @@ -97,9 +97,10 @@ Pkt::inClass(const std::string& client_class) { } void -Pkt::addClass(const std::string& client_class) { - if (!classes_.contains(client_class)) { - classes_.insert(client_class); +Pkt::addClass(const std::string& client_class, bool deferred) { + ClientClasses& classes = !deferred ? classes_ : on_demand_classes_; + if (!classes.contains(client_class)) { + classes.insert(client_class); } } diff --git a/src/lib/dhcp/pkt.h b/src/lib/dhcp/pkt.h index 078584b1d1..bde7a8500e 100644 --- a/src/lib/dhcp/pkt.h +++ b/src/lib/dhcp/pkt.h @@ -285,13 +285,19 @@ public: /// so I decided to stick with addClass(). /// /// @param client_class name of the class to be added - void addClass(const isc::dhcp::ClientClass& client_class); + /// @param deferred the class is marked for late evaluation + void addClass(const isc::dhcp::ClientClass& client_class, + bool deferred = false); /// @brief Returns the class set /// /// @note This should be used only to iterate over the class set. - /// @return - const ClientClasses& getClasses() const { return (classes_); } + /// @param deferred return classes or to be evaluated classes. + /// @return if deferred is false (the default) the claases the + /// packet belongs to else the classes which will be evaluated later. + const ClientClasses& getClasses(bool deferred = false) const { + return (!deferred ? classes_ : on_demand_classes_); + } /// @brief Unparsed data (in received packets). /// @@ -579,6 +585,14 @@ public: /// @ref addClass should be used to operate on this field. ClientClasses classes_; + /// @brief Classes which will be evaluated later. + /// + /// The comment on @ref classes_ applies here. + /// + /// Before output option processing these classes will be evaluated + /// and if evaluation status is true added to the previous collection. + ClientClasses on_demand_classes_; + /// @brief Collection of options present in this message. /// /// @warning This public member is accessed by derived diff --git a/src/lib/dhcp/tests/pkt4_unittest.cc b/src/lib/dhcp/tests/pkt4_unittest.cc index d02c2cb28e..3939662911 100644 --- a/src/lib/dhcp/tests/pkt4_unittest.cc +++ b/src/lib/dhcp/tests/pkt4_unittest.cc @@ -916,13 +916,13 @@ TEST_F(Pkt4Test, clientClasses) { // Default values (do not belong to any class) EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_EROUTER)); EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_MODEM)); - EXPECT_TRUE(pkt.classes_.empty()); + EXPECT_TRUE(pkt.getClasses().empty()); // Add to the first class pkt.addClass(DOCSIS3_CLASS_EROUTER); EXPECT_TRUE(pkt.inClass(DOCSIS3_CLASS_EROUTER)); EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_MODEM)); - ASSERT_FALSE(pkt.classes_.empty()); + ASSERT_FALSE(pkt.getClasses().empty()); // Add to a second class pkt.addClass(DOCSIS3_CLASS_MODEM); @@ -938,6 +938,34 @@ TEST_F(Pkt4Test, clientClasses) { EXPECT_TRUE(pkt.inClass("foo")); } +// Tests whether a packet can be marked to evaluate later a class and +// after check if a given class is in the collection +TEST_F(Pkt4Test, deferredClientClasses) { + Pkt4 pkt(DHCPOFFER, 1234); + + // Default values (do not belong to any class) + EXPECT_TRUE(pkt.getClasses(true).empty()); + + // Add to the first class + pkt.addClass(DOCSIS3_CLASS_EROUTER, true); + EXPECT_EQ(1, pkt.getClasses(true).size()); + + // Add to a second class + pkt.addClass(DOCSIS3_CLASS_MODEM, true); + EXPECT_EQ(2, pkt.getClasses(true).size()); + EXPECT_TRUE(pkt.getClasses(true).contains(DOCSIS3_CLASS_EROUTER)); + EXPECT_TRUE(pkt.getClasses(true).contains(DOCSIS3_CLASS_MODEM)); + EXPECT_FALSE(pkt.getClasses(true).contains("foo")); + + // Check that it's ok to add to the same class repeatedly + EXPECT_NO_THROW(pkt.addClass("foo", true)); + EXPECT_NO_THROW(pkt.addClass("foo", true)); + EXPECT_NO_THROW(pkt.addClass("foo", true)); + + // Check that the packet belongs to 'foo' + EXPECT_TRUE(pkt.getClasses(true).contains("foo")); +} + // Tests whether MAC can be obtained and that MAC sources are not // confused. TEST_F(Pkt4Test, getMAC) { diff --git a/src/lib/dhcp/tests/pkt6_unittest.cc b/src/lib/dhcp/tests/pkt6_unittest.cc index f45b937c81..adb84dbb05 100644 --- a/src/lib/dhcp/tests/pkt6_unittest.cc +++ b/src/lib/dhcp/tests/pkt6_unittest.cc @@ -1089,13 +1089,13 @@ TEST_F(Pkt6Test, clientClasses) { // Default values (do not belong to any class) EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_EROUTER)); EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_MODEM)); - EXPECT_TRUE(pkt.classes_.empty()); + EXPECT_TRUE(pkt.getClasses().empty()); // Add to the first class pkt.addClass(DOCSIS3_CLASS_EROUTER); EXPECT_TRUE(pkt.inClass(DOCSIS3_CLASS_EROUTER)); EXPECT_FALSE(pkt.inClass(DOCSIS3_CLASS_MODEM)); - ASSERT_FALSE(pkt.classes_.empty()); + ASSERT_FALSE(pkt.getClasses().empty()); // Add to a second class pkt.addClass(DOCSIS3_CLASS_MODEM); @@ -1111,6 +1111,34 @@ TEST_F(Pkt6Test, clientClasses) { EXPECT_TRUE(pkt.inClass("foo")); } +// Tests whether a packet can be marked to evaluate later a class and +// after check if a given class is in the collection +TEST_F(Pkt6Test, deferredClientClasses) { + Pkt6 pkt(DHCPV6_ADVERTISE, 1234); + + // Default values (do not belong to any class) + EXPECT_TRUE(pkt.getClasses(true).empty()); + + // Add to the first class + pkt.addClass(DOCSIS3_CLASS_EROUTER, true); + EXPECT_EQ(1, pkt.getClasses(true).size()); + + // Add to a second class + pkt.addClass(DOCSIS3_CLASS_MODEM, true); + EXPECT_EQ(2, pkt.getClasses(true).size()); + EXPECT_TRUE(pkt.getClasses(true).contains(DOCSIS3_CLASS_EROUTER)); + EXPECT_TRUE(pkt.getClasses(true).contains(DOCSIS3_CLASS_MODEM)); + EXPECT_FALSE(pkt.getClasses(true).contains("foo")); + + // Check that it's ok to add to the same class repeatedly + EXPECT_NO_THROW(pkt.addClass("foo", true)); + EXPECT_NO_THROW(pkt.addClass("foo", true)); + EXPECT_NO_THROW(pkt.addClass("foo", true)); + + // Check that the packet belongs to 'foo' + EXPECT_TRUE(pkt.getClasses(true).contains("foo")); +} + // Tests whether MAC can be obtained and that MAC sources are not // confused. TEST_F(Pkt6Test, getMAC) { diff --git a/src/lib/dhcpsrv/client_class_def.cc b/src/lib/dhcpsrv/client_class_def.cc index d6e5dfe657..9b5b153704 100644 --- a/src/lib/dhcpsrv/client_class_def.cc +++ b/src/lib/dhcpsrv/client_class_def.cc @@ -18,7 +18,8 @@ namespace dhcp { ClientClassDef::ClientClassDef(const std::string& name, const ExpressionPtr& match_expr, const CfgOptionPtr& cfg_option) - : name_(name), match_expr_(match_expr), cfg_option_(cfg_option), + : name_(name), match_expr_(match_expr), on_demand_(false), + cfg_option_(cfg_option), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()) { // Name can't be blank @@ -37,7 +38,7 @@ ClientClassDef::ClientClassDef(const std::string& name, ClientClassDef::ClientClassDef(const ClientClassDef& rhs) : name_(rhs.name_), match_expr_(ExpressionPtr()), - cfg_option_(new CfgOption()), + on_demand_(false), cfg_option_(new CfgOption()), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()) { if (rhs.match_expr_) { @@ -53,6 +54,7 @@ ClientClassDef::ClientClassDef(const ClientClassDef& rhs) rhs.cfg_option_->copyTo(*cfg_option_); } + on_demand_ = rhs.on_demand_; next_server_ = rhs.next_server_; sname_ = rhs.sname_; filename_ = rhs.filename_; @@ -91,6 +93,16 @@ ClientClassDef::setTest(const std::string& test) { test_ = test; } +bool +ClientClassDef::getOnDemand() const { + return (on_demand_); +} + +void +ClientClassDef::setOnDemand(bool on_demand) { + on_demand_ = on_demand; +} + const CfgOptionDefPtr& ClientClassDef::getCfgOptionDef() const { return (cfg_option_def_); @@ -123,6 +135,7 @@ ClientClassDef::equals(const ClientClassDef& other) const { ((!cfg_option_def_ && !other.cfg_option_def_) || (cfg_option_def_ && other.cfg_option_def_ && (*cfg_option_def_ == *other.cfg_option_def_))) && + (on_demand_ == other.on_demand_) && (next_server_ == other.next_server_) && (sname_ == other.sname_) && (filename_ == other.filename_)); @@ -138,6 +151,10 @@ ClientClassDef:: toElement() const { if (!test_.empty()) { result->set("test", Element::create(test_)); } + // Set eval-on-demand + if (on_demand_) { + result->set("eval-on-demand", Element::create(on_demand_)); + } // Set option-def (used only by DHCPv4) if (cfg_option_def_ && (family == AF_INET)) { result->set("option-def", cfg_option_def_->toElement()); @@ -183,6 +200,7 @@ void ClientClassDictionary::addClass(const std::string& name, const ExpressionPtr& match_expr, const std::string& test, + bool on_demand, const CfgOptionPtr& cfg_option, CfgOptionDefPtr cfg_option_def, asiolink::IOAddress next_server, @@ -190,6 +208,7 @@ ClientClassDictionary::addClass(const std::string& name, const std::string& filename) { ClientClassDefPtr cclass(new ClientClassDef(name, match_expr, cfg_option)); cclass->setTest(test); + cclass->setOnDemand(on_demand); cclass->setCfgOptionDef(cfg_option_def); cclass->setNextServer(next_server); cclass->setSname(sname); diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index 63313ec790..d12d2b6f80 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -82,6 +82,12 @@ public: /// @param test the original expression to assign the class void setTest(const std::string& test); + /// @brief Fetches the on demand flag + bool getOnDemand() const; + + /// @brief Sets the on demand flag + void setOnDemand(bool on_demand); + /// @brief Fetches the class's option definitions const CfgOptionDefPtr& getCfgOptionDef() const; @@ -182,6 +188,12 @@ private: /// this class. std::string test_; + /// @brief The on demand flag: when false (the defaul) membership + /// is determined during classification so is for instance + /// available for subnet selection, when true membership is evaluated + /// only if asked for and is usable only for option configuration. + bool on_demand_; + /// @brief The option definition configuration for this class CfgOptionDefPtr cfg_option_def_; @@ -239,6 +251,7 @@ public: /// @param name Name to assign to this class /// @param match_expr Expression the class will use to determine membership /// @param test Original version of match_expr + /// @param on_demand Original value of the on demand flag /// @param options Collection of options members should be given /// @param defs Option definitions (optional) /// @param next_server next-server value for this class (optional) @@ -249,7 +262,8 @@ public: /// dictionary. See @ref dhcp::ClientClassDef::ClientClassDef() for /// others. void addClass(const std::string& name, const ExpressionPtr& match_expr, - const std::string& test, const CfgOptionPtr& options, + const std::string& test, bool on_demand, + const CfgOptionPtr& options, CfgOptionDefPtr defs = CfgOptionDefPtr(), asiolink::IOAddress next_server = asiolink::IOAddress("0.0.0.0"), const std::string& sname = std::string(), diff --git a/src/lib/dhcpsrv/network.cc b/src/lib/dhcpsrv/network.cc index 1297f2d38f..9ba52a8598 100644 --- a/src/lib/dhcpsrv/network.cc +++ b/src/lib/dhcpsrv/network.cc @@ -36,6 +36,18 @@ Network::allowClientClass(const isc::dhcp::ClientClass& class_name) { client_class_ = class_name; } +void +Network::deferClientClass(const isc::dhcp::ClientClass& class_name) { + if (!on_demand_classes_.contains(class_name)) { + on_demand_classes_.insert(class_name); + } +} + +const ClientClasses& +Network::getOnDemandClasses() const { + return (on_demand_classes_); +} + ElementPtr Network::toElement() const { ElementPtr map = Element::createMap(); @@ -58,6 +70,17 @@ Network::toElement() const { map->set("client-class", Element::create(cclass)); } + // Set eval-client-classes + const ClientClasses& classes = getOnDemandClasses(); + if (!classes.empty()) { + ElementPtr class_list = Element::createList(); + for (ClientClasses::const_iterator it = classes.cbegin(); + it != classes.cend(); ++it) { + class_list->add(Element::create(*it)); + } + map->set("eval-client-classes", class_list); + } + // Set renew-timer map->set("renew-timer", Element::create(static_cast diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index ab4a8d687f..b34eb6e424 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -169,9 +169,17 @@ public: /// @brief Sets the supported class to class class_name /// - /// @param class_name client class to be supported by this subnet + /// @param class_name client class to be supported by this network void allowClientClass(const isc::dhcp::ClientClass& class_name); + /// @brief Adds class class_name to classes to be evaluated later + /// + /// @param class_name client class to be evaluated later + void deferClientClass(const isc::dhcp::ClientClass& class_name); + + /// @brief Returns classes which will be evaluated later + const isc::dhcp::ClientClasses& getOnDemandClasses() const; + /// @brief returns the client class /// /// @note The returned reference is only valid as long as the object @@ -273,6 +281,12 @@ protected: /// which means that any client is allowed, regardless of its class. ClientClass client_class_; + /// @brief On demand classes + /// + /// If the network is selected these classes will be added to the + /// incoming packet and evaluated later. + ClientClasses on_demand_classes_; + /// @brief a Triplet (min/default/max) holding allowed renew timer values Triplet t1_; diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc index 6f1cfa1927..e0d11ec957 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc @@ -132,6 +132,12 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, opts_parser.parse(options, option_data); } + // Let's try to parse the eval-on-demand flag + bool on_demand = false; + if (class_def_cfg->contains("eval-on-demand")) { + on_demand = getBoolean(class_def_cfg, "eval-on-demand"); + } + // Let's try to parse the next-server field IOAddress next_server("0.0.0.0"); if (class_def_cfg->contains("next-server")) { @@ -187,7 +193,7 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, // Add the client class definition try { - class_dictionary->addClass(name, match_expr, test, options, + class_dictionary->addClass(name, match_expr, test, on_demand, options, defs, next_server, sname, filename); } catch (const std::exception& ex) { isc_throw(DhcpConfigError, "Can't add class: " << ex.what() diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index a384dbf135..3c549c520e 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -388,6 +388,21 @@ PoolParser::parse(PoolStoragePtr pools, } } + // Try setting up on demand client classes. + ConstElementPtr class_list = pool_structure->get("eval-client-classes"); + if (class_list) { + const std::vector& classes = class_list->listValue(); + for (auto cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + pool->deferClientClass((*cclass)->stringValue()); + } + } + // Known-clients. ConstElementPtr known_clients = pool_structure->get("known-clients"); if (known_clients) { @@ -709,6 +724,21 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params, subnet4->allowClientClass(client_class); } + // Try setting up on demand client classes. + ConstElementPtr class_list = params->get("eval-client-classes"); + if (class_list) { + const std::vector& classes = class_list->listValue(); + for (auto cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + subnet4->deferClientClass((*cclass)->stringValue()); + } + } + // 4o6 specific parameter: 4o6-interface. If not explicitly specified, // it will have the default value of "". string iface4o6 = getString(params, "4o6-interface"); @@ -879,6 +909,8 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { known_clients_ = known_clients; } + ConstElementPtr class_list = pd_pool_->get("eval-client-classes"); + // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. try { @@ -921,6 +953,20 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { << " (" << known_clients_->getPosition() << ")"); } + if (class_list) { + const std::vector& classes = class_list->listValue(); + for (auto cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + pool_->deferClientClass((*cclass)->stringValue()); + } + } + + // Add the local pool to the external storage ptr. pools->push_back(pool_); } @@ -1095,6 +1141,21 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params, subnet6->allowClientClass(client_class); } + // Try setting up on demand client classes. + ConstElementPtr class_list = params->get("eval-client-classes"); + if (class_list) { + const std::vector& classes = class_list->listValue(); + for (auto cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + subnet6->deferClientClass((*cclass)->stringValue()); + } + } + /// client-class processing is now generic and handled in the common /// code (see isc::data::SubnetConfigParser::createSubnet) diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 65f201e439..91c104fdef 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -70,6 +70,20 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { } } + if (shared_network_data->contains("eval-client-classes")) { + const std::vector& class_list = + shared_network_data->get("eval-client-classes")->listValue(); + for (auto cclass = class_list.cbegin(); + cclass != class_list.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + shared_network->deferClientClass((*cclass)->stringValue()); + } + } + } catch (const DhcpConfigError&) { // Position was already added throw; @@ -111,6 +125,20 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { } } + if (shared_network_data->contains("eval-client-classes")) { + const std::vector& class_list = + shared_network_data->get("eval-client-classes")->listValue(); + for (auto cclass = class_list.cbegin(); + cclass != class_list.cend(); ++cclass) { + if (((*cclass)->getType() != Element::string) || + (*cclass)->stringValue().empty()) { + isc_throw(DhcpConfigError, "invalid class name (" + << (*cclass)->getPosition() << ")"); + } + shared_network->deferClientClass((*cclass)->stringValue()); + } + } + if (shared_network_data->contains("subnet6")) { auto json = shared_network_data->get("subnet6"); diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 89cbd607df..b632949d7d 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -137,6 +137,17 @@ Pool::toElement() const { Element::create(kc == SERVE_KNOWN ? "only" : "never")); } + // Set eval-client-classes + const ClientClasses& classes = getOnDemandClasses(); + if (!classes.empty()) { + ElementPtr class_list =Element::createList(); + for (ClientClasses::const_iterator it = classes.cbegin(); + it != classes.cend(); ++it) { + class_list->add(Element::create(*it)); + } + map->set("eval-client-classes", class_list); + } + return (map); } @@ -359,6 +370,7 @@ Pool6::toElement() const { isc_throw(ToElementError, "invalid prefix range " << prefix.toText() << "-" << last.toText()); } + map->set("prefix-len", Element::create(prefix_len)); // Set delegated-len uint8_t len = getLength(); @@ -373,9 +385,6 @@ Pool6::toElement() const { uint8_t xlen = xopt->getExcludedPrefixLength(); map->set("excluded-prefix-len", Element::create(static_cast(xlen))); - } else { - map->set("excluded-prefix", Element::create(std::string("::"))); - map->set("excluded-prefix-len", Element::create(0)); } break; diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index 7ef00d59d5..df0cc5fce0 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -149,6 +149,20 @@ public: known_clients_ = known_clients; } + /// @brief Adds class class_name to classes to be evaluated later + /// + /// @param class_name client class to be evaluated later + void deferClientClass(const ClientClass& class_name) { + if (!on_demand_classes_.contains(class_name)) { + on_demand_classes_.insert(class_name); + } + } + + /// @brief Returns classes which will be evaluated later + const ClientClasses& getOnDemandClasses() const { + return (on_demand_classes_); + } + /// @brief returns the last address that was tried from this pool /// /// @return address/prefix that was last tried from this pool @@ -241,6 +255,11 @@ protected: /// @brief Value of known clients KnownClients known_clients_; + /// @brief On demand classes + /// + /// @ref isc::dhcp::Network::on_demand_classes + ClientClasses on_demand_classes_; + /// @brief Pointer to the user context (may be NULL) data::ConstElementPtr user_context_; diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 3b44a6707a..841592f789 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -717,108 +717,18 @@ Subnet6::toElement() const { ElementPtr pool_list = Element::createList(); for (PoolCollection::const_iterator pool = pools.cbegin(); pool != pools.cend(); ++pool) { - // Prepare the map for a pool (@todo move this code to pool.cc) - ElementPtr pool_map = Element::createMap(); - // Set pool - const IOAddress& first = (*pool)->getFirstAddress(); - const IOAddress& last = (*pool)->getLastAddress(); - std::string range = first.toText() + "-" + last.toText(); - // Try to output a prefix (vs a range) - int prefix_len = prefixLengthFromRange(first, last); - if (prefix_len >= 0) { - std::ostringstream oss; - oss << first.toText() << "/" << prefix_len; - range = oss.str(); - } - pool_map->set("pool", Element::create(range)); - // Set user-context - ConstElementPtr context = (*pool)->getContext(); - if (!isNull(context)) { - pool_map->set("user-context", context); - } - // Set pool options - ConstCfgOptionPtr opts = (*pool)->getCfgOption(); - pool_map->set("option-data", opts->toElement()); - // Set client-class - const ClientClass& cclass = (*pool)->getClientClass(); - if (!cclass.empty()) { - pool_map->set("client-class", Element::create(cclass)); - } - // Set known-clients - Pool::KnownClients kc = (*pool)->getKnownClients(); - if (kc != Pool::SERVE_BOTH) { - pool_map->set("known-clients", - Element::create(kc == Pool::SERVE_KNOWN ? - "only" : "never")); - } - // Push on the pool list - pool_list->add(pool_map); + // Add the elementized pool to the list + pool_list->add((*pool)->toElement()); } map->set("pools", pool_list); + // Set pd-pools const PoolCollection& pdpools = getPools(Lease::TYPE_PD); ElementPtr pdpool_list = Element::createList(); for (PoolCollection::const_iterator pool = pdpools.cbegin(); pool != pdpools.cend(); ++pool) { - // Get it as a Pool6 (@todo move this code to pool.cc) - const Pool6* pdpool = dynamic_cast(pool->get()); - if (!pdpool) { - isc_throw(ToElementError, "invalid pd-pool pointer"); - } - // Prepare the map for a pd-pool - ElementPtr pool_map = Element::createMap(); - // Set prefix - const IOAddress& prefix = pdpool->getFirstAddress(); - pool_map->set("prefix", Element::create(prefix.toText())); - // Set prefix-len (get it from min - max) - const IOAddress& last = pdpool->getLastAddress(); - int prefix_len = prefixLengthFromRange(prefix, last); - if (prefix_len < 0) { - // The pool is bad: give up - isc_throw(ToElementError, "invalid prefix range " - << prefix.toText() << "-" << last.toText()); - } - pool_map->set("prefix-len", Element::create(prefix_len)); - // Set delegated-len - uint8_t len = pdpool->getLength(); - pool_map->set("delegated-len", - Element::create(static_cast(len))); - - // Set excluded prefix - const Option6PDExcludePtr& xopt = - pdpool->getPrefixExcludeOption(); - if (xopt) { - const IOAddress& xprefix = - xopt->getExcludedPrefix(prefix, len); - pool_map->set("excluded-prefix", - Element::create(xprefix.toText())); - uint8_t xlen = xopt->getExcludedPrefixLength(); - pool_map->set("excluded-prefix-len", - Element::create(static_cast(xlen))); - } - - // Set user-context - ConstElementPtr context = pdpool->getContext(); - if (!isNull(context)) { - pool_map->set("user-context", context); - } - // Set pool options - ConstCfgOptionPtr opts = pdpool->getCfgOption(); - pool_map->set("option-data", opts->toElement()); - // Set client-class - const ClientClass& cclass = pdpool->getClientClass(); - if (!cclass.empty()) { - pool_map->set("client-class", Element::create(cclass)); - } - // Set known-clients - Pool::KnownClients kc = pdpool->getKnownClients(); - if (kc != Pool::SERVE_BOTH) { - pool_map->set("known-clients", - Element::create(kc == Pool::SERVE_KNOWN ? - "only" : "never")); - } - // Push on the pool list - pdpool_list->add(pool_map); + // Add the elementized pool to the list + pdpool_list->add((*pool)->toElement()); } map->set("pd-pools", pdpool_list); diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index c97c7bee84..3acfe13070 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -739,6 +739,8 @@ TEST(CfgSubnets4Test, unparseSubnet) { subnet2->setIface("lo"); subnet2->setRelayInfo(IOAddress("10.0.0.1")); subnet3->setIface("eth1"); + subnet3->deferClientClass("foo"); + subnet3->deferClientClass("bar"); cfg.add(subnet1); cfg.add(subnet2); @@ -799,7 +801,8 @@ TEST(CfgSubnets4Test, unparseSubnet) { " \"4o6-subnet\": \"\",\n" " \"reservation-mode\": \"all\",\n" " \"option-data\": [ ],\n" - " \"pools\": [ ]\n" + " \"pools\": [ ]\n," + " \"eval-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -814,6 +817,7 @@ TEST(CfgSubnets4Test, unparsePool) { Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); pool2->allowClientClass("bar"); pool2->setKnownClients(Pool::SERVE_KNOWN); + pool2->deferClientClass("foo"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -845,7 +849,8 @@ TEST(CfgSubnets4Test, unparsePool) { " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\",\n" " \"client-class\": \"bar\",\n" - " \"known-clients\": \"only\"\n" + " \"known-clients\": \"only\",\n" + " \"eval-client-classes\": [ \"foo\" ]\n" " }\n" " ]\n" "} ]\n"; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index d12cada956..bedaff84e8 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -438,6 +438,8 @@ TEST(CfgSubnets6Test, unparseSubnet) { subnet2->setIface("lo"); subnet2->setRelayInfo(IOAddress("2001:db8:ff::2")); subnet3->setIface("eth1"); + subnet3->deferClientClass("foo"); + subnet3->deferClientClass("bar"); cfg.add(subnet1); cfg.add(subnet2); @@ -487,7 +489,8 @@ TEST(CfgSubnets6Test, unparseSubnet) { " \"reservation-mode\": \"all\",\n" " \"pools\": [ ],\n" " \"pd-pools\": [ ],\n" - " \"option-data\": [ ]\n" + " \"option-data\": [ ],\n" + " \"eval-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -505,6 +508,7 @@ TEST(CfgSubnets6Test, unparsePool) { Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); pool2->allowClientClass("bar"); pool2->setKnownClients(Pool::SERVE_UNKNOWN); + pool2->deferClientClass("foo"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -530,7 +534,8 @@ TEST(CfgSubnets6Test, unparsePool) { " \"pool\": \"2001:db8:1:1::/64\",\n" " \"option-data\": [ ],\n" " \"client-class\": \"bar\",\n" - " \"known-clients\": \"never\"\n" + " \"known-clients\": \"never\",\n" + " \"eval-client-classes\": [ \"foo\" ]\n" " }\n" " ],\n" " \"pd-pools\": [ ],\n" @@ -551,9 +556,11 @@ TEST(CfgSubnets6Test, unparsePdPool) { IOAddress("2001:db8:2::"), 48, 64)); Pool6Ptr pdpool2(new Pool6(IOAddress("2001:db8:3::"), 48, 56, IOAddress("2001:db8:3::"), 64)); + pdpool1->deferClientClass("bar"); pdpool2->allowClientClass("bar"); pdpool2->setKnownClients(Pool::SERVE_KNOWN); + subnet->addPool(pdpool1); subnet->addPool(pdpool2); cfg.add(subnet); @@ -576,7 +583,8 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"prefix\": \"2001:db8:2::\",\n" " \"prefix-len\": 48,\n" " \"delegated-len\": 64,\n" - " \"option-data\": [ ]\n" + " \"option-data\": [ ],\n" + " \"eval-client-classes\": [ \"bar\" ]\n" " },{\n" " \"prefix\": \"2001:db8:3::\",\n" " \"prefix-len\": 48,\n" diff --git a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc index a8e740e8d0..816d100c96 100644 --- a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc +++ b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc @@ -142,6 +142,13 @@ TEST(ClientClassDef, copyAndEquality) { EXPECT_TRUE(*cclass == *cclass2); EXPECT_FALSE(*cclass != *cclass2); + // Verify the on_demand flag is enough to make classes not equal. + EXPECT_FALSE(cclass->getOnDemand()); + cclass2->setOnDemand(true); + EXPECT_TRUE(cclass2->getOnDemand()); + EXPECT_FALSE(*cclass == *cclass2); + EXPECT_TRUE(*cclass != *cclass2); + // Make a class that differs from the first class only by name and // verify that the equality tools reflect that the classes are not equal. ASSERT_NO_THROW(cclass2.reset(new ClientClassDef("class_two", expr, @@ -226,15 +233,16 @@ TEST(ClientClassDictionary, basics) { // Verify that we can add classes with both addClass variants // First addClass(name, expression, cfg_option) - ASSERT_NO_THROW(dictionary->addClass("cc1", expr, "", cfg_option)); - ASSERT_NO_THROW(dictionary->addClass("cc2", expr, "", cfg_option)); + ASSERT_NO_THROW(dictionary->addClass("cc1", expr, "", false, cfg_option)); + ASSERT_NO_THROW(dictionary->addClass("cc2", expr, "", false, cfg_option)); // Verify duplicate add attempt throws - ASSERT_THROW(dictionary->addClass("cc2", expr, "", cfg_option), + ASSERT_THROW(dictionary->addClass("cc2", expr, "", false, cfg_option), DuplicateClientClassDef); // Verify that you cannot add a class with no name. - ASSERT_THROW(dictionary->addClass("", expr, "", cfg_option), BadValue); + ASSERT_THROW(dictionary->addClass("", expr, "", false, cfg_option), + BadValue); // Now with addClass(class pointer) ASSERT_NO_THROW(cclass.reset(new ClientClassDef("cc3", expr, cfg_option))); @@ -290,9 +298,9 @@ TEST(ClientClassDictionary, copyAndEquality) { CfgOptionPtr options; dictionary.reset(new ClientClassDictionary()); - ASSERT_NO_THROW(dictionary->addClass("one", expr, "", options)); - ASSERT_NO_THROW(dictionary->addClass("two", expr, "", options)); - ASSERT_NO_THROW(dictionary->addClass("three", expr, "", options)); + ASSERT_NO_THROW(dictionary->addClass("one", expr, "", false, options)); + ASSERT_NO_THROW(dictionary->addClass("two", expr, "", false, options)); + ASSERT_NO_THROW(dictionary->addClass("three", expr, "", false, options)); // Copy constructor should succeed. ASSERT_NO_THROW(dictionary2.reset(new ClientClassDictionary(*dictionary))); @@ -338,6 +346,7 @@ TEST(ClientClassDef, fixedFieldsDefaults) { ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); // Let's checks that it doesn't return any nonsense + EXPECT_FALSE(cclass->getOnDemand()); EXPECT_FALSE(cclass->getCfgOptionDef()); string empty; ASSERT_EQ(IOAddress("0.0.0.0"), cclass->getNextServer()); @@ -360,6 +369,7 @@ TEST(ClientClassDef, fixedFieldsBasics) { // Verify we can create a class with a name, expression, and no cfg_option ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); + cclass->setOnDemand(true); string sname = "This is a very long string that can be a server name"; string filename = "this-is-a-slightly-longish-name-of-a-file.txt"; @@ -369,7 +379,8 @@ TEST(ClientClassDef, fixedFieldsBasics) { cclass->setFilename(filename); // Let's checks that it doesn't return any nonsense - ASSERT_EQ(IOAddress("1.2.3.4"), cclass->getNextServer()); + EXPECT_TRUE(cclass->getOnDemand()); + EXPECT_EQ(IOAddress("1.2.3.4"), cclass->getNextServer()); EXPECT_EQ(sname, cclass->getSname()); EXPECT_EQ(filename, cclass->getFilename()); } @@ -386,6 +397,7 @@ TEST(ClientClassDef, unparseDef) { ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); std::string test = "option[12].text == 'foo'"; cclass->setTest(test); + cclass->setOnDemand(true); std::string next_server = "1.2.3.4"; cclass->setNextServer(IOAddress(next_server)); std::string sname = "my-server.example.com"; @@ -397,6 +409,7 @@ TEST(ClientClassDef, unparseDef) { std::string expected = "{\n" "\"name\": \"" + name + "\",\n" "\"test\": \"" + test + "\",\n" + "\"eval-on-demand\": true,\n" "\"next-server\": \"" + next_server + "\",\n" "\"server-hostname\": \"" + sname + "\",\n" "\"boot-file-name\": \"" + filename + "\",\n" @@ -413,9 +426,9 @@ TEST(ClientClassDictionary, unparseDict) { // Get a client class dictionary and fill it dictionary.reset(new ClientClassDictionary()); - ASSERT_NO_THROW(dictionary->addClass("one", expr, "", options)); - ASSERT_NO_THROW(dictionary->addClass("two", expr, "", options)); - ASSERT_NO_THROW(dictionary->addClass("three", expr, "", options)); + ASSERT_NO_THROW(dictionary->addClass("one", expr, "", false, options)); + ASSERT_NO_THROW(dictionary->addClass("two", expr, "", false, options)); + ASSERT_NO_THROW(dictionary->addClass("three", expr, "", false, options)); // Unparse it auto add_defaults = diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index d1b8b462b6..ce2a1a8565 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -244,6 +244,35 @@ TEST(Pool4Test, knownClients) { EXPECT_EQ(Pool::SERVE_KNOWN,pool->getKnownClients()); } +// This test checks that handling for eval-client-classes is valid. +TEST(Pool4Test, onDemandClasses) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This client starts with no deferred classes. + EXPECT_TRUE(pool->getOnDemandClasses().empty()); + + // Add the first class + pool->deferClientClass("router"); + EXPECT_EQ(1, pool->getOnDemandClasses().size()); + + // Add a second class + pool->deferClientClass("modem"); + EXPECT_EQ(2, pool->getOnDemandClasses().size()); + EXPECT_TRUE(pool->getOnDemandClasses().contains("router")); + EXPECT_TRUE(pool->getOnDemandClasses().contains("modem")); + EXPECT_FALSE(pool->getOnDemandClasses().contains("foo")); + + // Check that it's ok to add the same class repeatedly + EXPECT_NO_THROW(pool->deferClientClass("foo")); + EXPECT_NO_THROW(pool->deferClientClass("foo")); + EXPECT_NO_THROW(pool->deferClientClass("foo")); + + // Check that 'foo' is marked for late evaluation + EXPECT_TRUE(pool->getOnDemandClasses().contains("foo")); +} + // This test checks that handling for last allocated address/prefix is valid. TEST(Pool4Test, lastAllocated) { // Create a pool. @@ -624,6 +653,35 @@ TEST(Pool6Test, knownClients) { EXPECT_EQ(Pool::SERVE_KNOWN,pool.getKnownClients()); } +// This test checks that handling for eval-client-classes is valid. +TEST(Pool6Test, onDemandClasses) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This client starts with no deferred classes. + EXPECT_TRUE(pool.getOnDemandClasses().empty()); + + // Add the first class + pool.deferClientClass("router"); + EXPECT_EQ(1, pool.getOnDemandClasses().size()); + + // Add a second class + pool.deferClientClass("modem"); + EXPECT_EQ(2, pool.getOnDemandClasses().size()); + EXPECT_TRUE(pool.getOnDemandClasses().contains("router")); + EXPECT_TRUE(pool.getOnDemandClasses().contains("modem")); + EXPECT_FALSE(pool.getOnDemandClasses().contains("foo")); + + // Check that it's ok to add the same class repeatedly + EXPECT_NO_THROW(pool.deferClientClass("foo")); + EXPECT_NO_THROW(pool.deferClientClass("foo")); + EXPECT_NO_THROW(pool.deferClientClass("foo")); + + // Check that 'foo' is marked for late evaluation + EXPECT_TRUE(pool.getOnDemandClasses().contains("foo")); +} + // This test checks that handling for last allocated address/prefix is valid. TEST(Pool6Test, lastAllocated) { // Create a pool. diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index 10a60ddb97..dee9300e6a 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -52,6 +52,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," + " \"eval-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -72,6 +73,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," + " \"eval-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -192,6 +194,7 @@ public: " \"preferred-lifetime\": 300," " \"valid-lifetime\": 400," " \"client-class\": \"\"," + " \"eval-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -207,6 +210,7 @@ public: " \"preferred-lifetime\": 30," " \"valid-lifetime\": 40," " \"client-class\": \"\"," + " \"eval-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -279,4 +283,55 @@ TEST_F(SharedNetwork6ParserTest, clientClass) { EXPECT_EQ("alpha", network->getClientClass()); } +// This test verifies that it's possible to specify eval-client-classes +// on shared-network level. +TEST_F(SharedNetwork6ParserTest, evalClientClasses) { + std::string config = getWorkingConfig(); + ElementPtr config_element = Element::fromJSON(config); + + ElementPtr class_list = Element::createList(); + class_list->add(Element::create("alpha")); + class_list->add(Element::create("beta")); + config_element->set("eval-client-classes", class_list); + + // Parse configuration specified above. + SharedNetwork6Parser parser; + SharedNetwork6Ptr network; + network = parser.parse(config_element); + ASSERT_TRUE(network); + + const ClientClasses& classes = network->getOnDemandClasses(); + EXPECT_EQ(2, classes.size()); + EXPECT_EQ("alpha, beta", classes.toText()); +} + +// This test verifies that bad eval-client-classes configs raise +// expected errors. +TEST_F(SharedNetwork6ParserTest, badEvalClientClasses) { + std::string config = getWorkingConfig(); + ElementPtr config_element = Element::fromJSON(config); + + // Element of the list must be strings. + ElementPtr class_list = Element::createList(); + class_list->add(Element::create("alpha")); + class_list->add(Element::create(1234)); + config_element->set("eval-client-classes", class_list); + + // Parse configuration specified above. + SharedNetwork6Parser parser; + SharedNetwork6Ptr network; + EXPECT_THROW(network = parser.parse(config_element), DhcpConfigError); + + // Empty class name is forbidden. + class_list = Element::createList(); + class_list->add(Element::create("alpha")); + class_list->add(Element::create("")); + EXPECT_THROW(network = parser.parse(config_element), DhcpConfigError); + + // And of course the list must be a list even the parser can only + // trigger the previous error case... + class_list = Element::createMap(); + EXPECT_THROW(network = parser.parse(config_element), DhcpConfigError); +} + } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/shared_network_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_unittest.cc index 63508ec44e..58df64673e 100644 --- a/src/lib/dhcpsrv/tests/shared_network_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_unittest.cc @@ -195,6 +195,8 @@ TEST(SharedNetwork4Test, unparse) { network->setValid(200); network->setMatchClientId(false); + network->deferClientClass("foo"); + // Add several subnets. Subnet4Ptr subnet1(new Subnet4(IOAddress("10.0.0.0"), 8, 10, 20, 30, SubnetID(1))); @@ -256,6 +258,7 @@ TEST(SharedNetwork4Test, unparse) { " \"valid-lifetime\": 30\n" " }\n" " ],\n" + " \"eval-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 200\n" "}\n"; @@ -479,6 +482,7 @@ TEST(SharedNetwork6Test, unparse) { network->setPreferred(200); network->setValid(300); network->setRapidCommit(true); + network->deferClientClass("foo"); // Add several subnets. Subnet6Ptr subnet1(new Subnet6(IOAddress("2001:db8:1::"), 64, 10, 20, 30, @@ -534,6 +538,7 @@ TEST(SharedNetwork6Test, unparse) { " \"valid-lifetime\": 40\n" " }\n" " ],\n" + " \"eval-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 300\n" "}\n"; diff --git a/src/lib/dhcpsrv/tests/srv_config_unittest.cc b/src/lib/dhcpsrv/tests/srv_config_unittest.cc index acf7806e59..b38a9783f9 100644 --- a/src/lib/dhcpsrv/tests/srv_config_unittest.cc +++ b/src/lib/dhcpsrv/tests/srv_config_unittest.cc @@ -65,9 +65,12 @@ public: } // Build our reference dictionary of client classes - ref_dictionary_->addClass("cc1", ExpressionPtr(), "", CfgOptionPtr()); - ref_dictionary_->addClass("cc2", ExpressionPtr(), "", CfgOptionPtr()); - ref_dictionary_->addClass("cc3", ExpressionPtr(), "", CfgOptionPtr()); + ref_dictionary_->addClass("cc1", ExpressionPtr(), + "", false, CfgOptionPtr()); + ref_dictionary_->addClass("cc2", ExpressionPtr(), + "", false, CfgOptionPtr()); + ref_dictionary_->addClass("cc3", ExpressionPtr(), + "", false, CfgOptionPtr()); } diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index a53107ca53..ef34893d7b 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -440,7 +440,7 @@ TEST(Subnet4Test, pool4Checks) { // Tests whether Subnet4 object is able to store and process properly // information about allowed client class (a single class). -TEST(Subnet4Test, clientClasses) { +TEST(Subnet4Test, clientClass) { // Create the V4 subnet. Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 8, 1, 2, 3)); @@ -1026,7 +1026,7 @@ TEST(Subnet6Test, poolTypes) { // Tests whether Subnet6 object is able to store and process properly // information about allowed client class (a single class). -TEST(Subnet6Test, clientClasses) { +TEST(Subnet6Test, clientClass) { // Create the V6 subnet. Subnet6Ptr subnet(new Subnet6(IOAddress("2001:db8:1::"), 56, 1, 2, 3, 4)); From a05c060612b60c127c6fda1711695ca65209b50a Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 02:04:20 +0000 Subject: [PATCH 28/52] [trac5374] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 1835 ++++++++++----------- src/bin/dhcp4/dhcp4_parser.cc | 2856 +++++++++++++++++---------------- src/bin/dhcp4/dhcp4_parser.h | 286 ++-- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 1671 +++++++++---------- src/bin/dhcp6/dhcp6_parser.yy | 2 +- src/bin/dhcp6/location.hh | 3 + src/bin/dhcp6/position.hh | 3 + src/bin/dhcp6/stack.hh | 3 + src/lib/eval/location.hh | 2 +- src/lib/eval/position.hh | 2 +- src/lib/eval/stack.hh | 2 +- 14 files changed, 3409 insertions(+), 3262 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index d4bb974362..d821e46454 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 161 -#define YY_END_OF_BUFFER 162 +#define YY_NUM_RULES 163 +#define YY_END_OF_BUFFER 164 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,152 +700,155 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1307] = +static const flex_int16_t yy_accept[1336] = { 0, - 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, - 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, - 160, 153, 152, 160, 160, 160, 160, 160, 147, 148, - 160, 160, 160, 149, 150, 5, 5, 5, 160, 160, - 160, 10, 11, 0, 0, 143, 0, 0, 0, 0, + 156, 156, 0, 0, 0, 0, 0, 0, 0, 0, + 164, 162, 10, 11, 162, 1, 156, 153, 156, 156, + 162, 155, 154, 162, 162, 162, 162, 162, 149, 150, + 162, 162, 162, 151, 152, 5, 5, 5, 162, 162, + 162, 10, 11, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 154, 154, 0, 153, 154, 3, 2, 6, 0, 154, + 156, 156, 0, 155, 156, 3, 2, 6, 0, 156, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, + 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 159, 157, 0, 156, 155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 124, 0, 123, - - 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, - 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 158, 155, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125, 0, 0, 127, 0, 0, 0, 0, 0, 0, - 0, 66, 0, 0, 0, 0, 48, 0, 0, 0, - 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 47, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 0, 0, 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 25, 0, 0, 30, 0, 0, 0, 0, 0, 0, + 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 161, 159, 0, 158, 157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, - 0, 0, 12, 132, 0, 129, 0, 128, 0, 0, - 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 125, 0, 0, 65, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, - 0, 7, 0, 0, 130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 160, 157, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 127, 0, 0, 129, 0, 0, 0, + 0, 0, 0, 0, 66, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80, 25, 0, 0, 30, 0, 0, + + 0, 0, 0, 0, 0, 0, 12, 134, 0, 131, + 0, 130, 0, 0, 0, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 7, 0, 0, + + 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, - 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 69, + 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98, 69, 0, 0, 0, 74, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 0, 0, 0, 0, 37, 0, + + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, + 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 0, 115, 0, + 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 139, 0, 0, 0, 0, 0, 0, 86, 0, + 0, 0, 0, 90, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 0, 0, 0, 0, 0, 0, 108, 0, + 84, 0, 20, 0, 95, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 0, 45, 0, 0, 0, 0, + 0, 97, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 113, 0, 0, 111, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 88, - 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 0, 20, 0, 93, 0, - 0, 0, 0, 0, 0, 117, 0, 0, 0, 45, - 0, 0, 0, 0, 0, 95, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, - 46, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 40, 0, 0, 0, 0, 114, 0, 112, 0, - 107, 106, 0, 19, 0, 0, 0, 0, 0, 126, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 104, + 0, 0, 0, 0, 0, 0, 0, 142, 46, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, + 0, 0, 0, 0, 116, 0, 114, 0, 109, 108, + 0, 19, 0, 0, 0, 0, 0, 128, 0, 0, + 79, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 35, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 60, 41, 0, 89, 0, 0, - 80, 0, 0, 0, 0, 52, 0, 135, 0, 134, + 0, 0, 0, 35, 0, 0, 0, 0, 118, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 60, 41, 0, 91, 0, 0, + 82, 0, 0, 0, 0, 52, 0, 137, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 142, 77, 0, 38, 105, 0, 0, 138, 109, - 0, 0, 0, 0, 0, 0, 23, 0, 22, 0, - 115, 0, 0, 0, 70, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 0, 0, 36, - 0, 0, 0, 0, 0, 0, 94, 0, 0, 139, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, + 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 144, 77, 0, 38, 107, 0, 0, + 140, 111, 0, 81, 0, 0, 0, 0, 0, 0, + 23, 0, 22, 0, 117, 0, 0, 0, 70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, - 141, 44, 0, 136, 131, 0, 0, 14, 0, 0, - 122, 0, 0, 0, 0, 102, 0, 0, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 110, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101, 17, 0, 119, 0, - 0, 0, 118, 0, 0, 0, 100, 0, 0, 0, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, + 0, 96, 0, 0, 141, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 143, 44, 0, 138, 133, + 0, 0, 14, 0, 0, 0, 124, 0, 0, 0, + 0, 104, 0, 0, 0, 0, 0, 0, 61, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 103, 17, 0, 121, 0, 0, 0, + 120, 0, 78, 0, 0, 102, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 0, 0, 0, 0, 0, 0, 98, 103, 42, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, - 0, 67, 0, 0, 99, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, + 0, 0, 0, 0, 0, 0, 100, 105, 42, 0, + 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, + 67, 0, 0, 101, 0 } ; static const YY_CHAR yy_ec[256] = @@ -892,321 +895,327 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1319] = +static const flex_int16_t yy_base[1348] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1669, 1670, 32, 1665, 141, 0, 201, 1670, 206, 88, - 11, 213, 1670, 1647, 114, 25, 2, 6, 1670, 1670, - 73, 11, 17, 1670, 1670, 1670, 104, 1653, 1608, 0, - 1645, 107, 1660, 217, 247, 1670, 1604, 185, 1603, 1609, - 93, 58, 1601, 91, 211, 195, 14, 273, 195, 1600, - 181, 275, 202, 209, 1609, 66, 188, 11, 232, 219, - 296, 284, 207, 1592, 78, 287, 324, 305, 1611, 0, - 339, 359, 367, 374, 379, 1670, 0, 1670, 301, 344, - 223, 295, 196, 336, 348, 210, 1670, 1608, 1647, 1670, + 1698, 1699, 32, 1694, 141, 0, 201, 1699, 206, 88, + 11, 213, 1699, 1676, 114, 25, 2, 6, 1699, 1699, + 73, 11, 17, 1699, 1699, 1699, 104, 1682, 1637, 0, + 1674, 107, 1689, 217, 247, 1699, 1633, 185, 1632, 1638, + 93, 58, 1630, 91, 211, 195, 14, 273, 195, 1629, + 181, 275, 202, 209, 1638, 66, 188, 11, 232, 272, + 299, 289, 207, 1621, 78, 307, 326, 305, 1640, 0, + 354, 361, 369, 376, 381, 1699, 0, 1699, 273, 317, + 208, 223, 196, 286, 306, 210, 1699, 1637, 1676, 1699, - 322, 1670, 392, 1636, 330, 1594, 1604, 351, 366, 1599, - 363, 370, 372, 379, 241, 1642, 0, 443, 376, 1586, - 1588, 1584, 1592, 74, 1588, 1577, 1578, 89, 1594, 1577, - 1586, 1586, 366, 1577, 353, 1578, 358, 1623, 1627, 1569, - 1620, 1562, 1571, 1584, 1581, 1581, 1575, 352, 1568, 1561, - 1566, 1560, 381, 1571, 1564, 1555, 1554, 1568, 364, 1554, - 382, 1570, 266, 439, 1557, 413, 1568, 1565, 1566, 1564, - 1546, 1548, 402, 1540, 1557, 1549, 0, 389, 380, 331, - 398, 392, 414, 1548, 1670, 0, 1591, 431, 1538, 1541, - 411, 424, 1549, 438, 1592, 447, 1591, 446, 1590, 1670, + 315, 1699, 376, 1665, 360, 1623, 1633, 352, 286, 1628, + 362, 361, 364, 371, 383, 1671, 0, 427, 380, 1615, + 1617, 1613, 1621, 74, 1617, 1606, 1607, 89, 1623, 1606, + 1615, 1615, 366, 1621, 1605, 368, 1606, 302, 1651, 1655, + 1597, 1648, 1590, 1599, 1612, 1609, 1609, 1603, 348, 1596, + 1589, 1594, 1588, 397, 1599, 1592, 1583, 1582, 1596, 343, + 1582, 361, 1598, 379, 433, 1585, 398, 1596, 1593, 1594, + 1592, 1574, 1576, 422, 1568, 1585, 1577, 0, 422, 428, + 388, 424, 432, 422, 1576, 1699, 0, 1619, 445, 1566, + 1569, 431, 437, 1577, 443, 1620, 455, 1619, 439, 1618, - 490, 1589, 456, 1550, 1530, 1546, 1543, 1542, 436, 1583, - 1577, 1543, 1522, 1530, 1525, 1539, 1535, 1523, 1535, 1535, - 1526, 1510, 1514, 1527, 1527, 1519, 1509, 1527, 1670, 1522, - 1525, 1506, 1501, 1504, 1554, 1503, 1513, 1516, 460, 1512, - 1500, 1511, 1547, 454, 1494, 1550, 1487, 1502, 486, 1492, - 1508, 1489, 1488, 1494, 1485, 1484, 1491, 1493, 1538, 1496, - 1495, 1489, 311, 1496, 1491, 1483, 1489, 1488, 1488, 1469, - 1485, 1471, 1477, 1484, 1472, 1465, 1479, 1520, 1481, 419, - 1472, 482, 1670, 1670, 484, 1670, 1670, 1459, 0, 456, - 478, 1461, 504, 485, 1515, 1468, 488, 1670, 1513, 1670, + 1699, 490, 1617, 464, 1578, 1558, 1574, 1571, 1570, 444, + 1611, 1605, 1571, 1550, 1558, 1553, 1567, 1563, 1551, 1563, + 1563, 1551, 1553, 1537, 1541, 1554, 1554, 1546, 1536, 1554, + 1699, 1549, 1552, 1533, 1528, 1531, 1581, 1530, 1540, 1543, + 486, 1539, 1527, 1538, 1574, 473, 1521, 1577, 1514, 1529, + 488, 1519, 1535, 1516, 1515, 1521, 1512, 1511, 1518, 1520, + 1565, 1523, 1522, 1516, 270, 1523, 1518, 1510, 1516, 1515, + 1515, 1496, 1512, 1498, 1504, 1511, 1499, 1492, 1506, 1547, + 1508, 449, 1499, 475, 1699, 1699, 477, 1699, 1699, 1486, + 0, 457, 478, 1488, 516, 493, 1542, 1495, 489, 1699, - 1507, 536, 1670, 485, 1449, 1505, 1451, 1457, 1507, 1464, - 479, 1670, 1462, 1504, 1459, 1456, 532, 1462, 1500, 1494, - 1449, 1444, 1441, 1490, 1449, 1438, 1487, 1435, 557, 1449, - 1434, 1447, 1434, 1435, 1443, 1438, 1445, 1440, 1436, 466, - 1434, 1437, 1432, 1428, 1476, 495, 508, 1470, 1670, 1474, - 1421, 1420, 1419, 1412, 1414, 1418, 1407, 1420, 536, 1465, - 1420, 1417, 1421, 1670, 1419, 1408, 1408, 1420, 1402, 1394, - 1395, 1416, 1398, 1447, 1409, 1408, 1394, 1406, 1405, 1404, - 1403, 1444, 1443, 1670, 1387, 1386, 559, 1399, 1670, 1670, - 1398, 0, 1387, 1379, 514, 1384, 1435, 1434, 1392, 1432, + 1540, 1699, 1534, 538, 1699, 481, 1476, 1532, 1478, 1484, + 1534, 1491, 482, 1699, 1489, 1531, 1486, 1483, 513, 1489, + 1527, 1521, 1476, 1471, 1518, 1467, 1516, 1475, 1464, 1513, + 1461, 559, 1475, 1460, 1473, 1460, 1461, 1469, 1464, 1471, + 1466, 1462, 469, 1460, 1463, 1458, 1454, 1502, 496, 511, + 1496, 1699, 1500, 1447, 1446, 1445, 1438, 1440, 1444, 1433, + 1446, 536, 1491, 1446, 1443, 1447, 1699, 1445, 1434, 1434, + 1446, 1428, 1420, 1421, 1442, 1424, 1473, 1435, 1434, 1420, + 1432, 1431, 1430, 1429, 1470, 1469, 1699, 1413, 1412, 560, + 1425, 1699, 1699, 1424, 0, 1413, 1405, 533, 1410, 1461, - 1670, 1380, 1430, 1670, 534, 606, 533, 1429, 1385, 1381, - 1369, 1670, 1385, 1384, 1371, 1370, 1670, 1372, 1369, 509, - 1367, 1369, 1670, 1377, 1374, 1359, 1372, 1367, 566, 1374, - 1356, 1405, 1670, 1354, 1370, 1402, 1365, 1362, 1363, 1365, - 1397, 1396, 1349, 1344, 1343, 1392, 1338, 1353, 1331, 1338, - 1343, 1391, 1670, 1338, 1334, 1388, 1331, 1670, 1335, 1342, - 1326, 1326, 1336, 1339, 1328, 1323, 1670, 1378, 1670, 1322, - 1333, 1370, 1317, 1322, 1331, 1325, 1329, 1369, 1363, 1327, - 1307, 1327, 1309, 1308, 1316, 1320, 1303, 1359, 1301, 1670, - 1670, 1306, 1304, 1670, 1315, 1349, 1311, 0, 1295, 1312, + 1460, 1418, 1458, 1699, 1406, 1456, 1699, 543, 608, 534, + 1455, 1411, 1407, 1395, 1699, 1411, 1410, 1397, 1396, 1699, + 1398, 1395, 527, 1393, 1395, 1699, 1403, 1400, 1385, 511, + 1398, 1393, 570, 1400, 1382, 1431, 1699, 1380, 1396, 1428, + 1391, 1388, 1389, 1391, 1423, 1422, 1375, 1370, 1369, 1418, + 1364, 1379, 1357, 1364, 1369, 1417, 1699, 1364, 1360, 1414, + 1357, 1699, 1361, 1368, 1352, 1352, 1362, 1365, 1354, 1349, + 1699, 1404, 1699, 1348, 1359, 1396, 1343, 1348, 1357, 1351, + 1355, 1395, 1389, 1353, 1333, 1353, 1335, 1334, 1342, 1346, + 1329, 1385, 1327, 1699, 1699, 1332, 1330, 1699, 1341, 1375, - 1350, 1300, 1670, 1670, 1297, 1670, 1303, 1670, 542, 541, - 581, 1670, 1300, 1288, 1339, 1286, 1285, 1292, 1285, 1297, - 1296, 1296, 1284, 1325, 1292, 1284, 1327, 1273, 1289, 1288, - 1670, 1273, 1270, 1284, 1276, 1282, 1273, 1281, 1266, 1282, - 1264, 1278, 1277, 1275, 1258, 1252, 1257, 1272, 1269, 1270, - 1267, 1308, 1265, 1670, 1251, 1253, 1670, 1262, 1298, 1297, - 1250, 569, 1259, 1242, 1243, 1240, 1670, 1254, 1233, 1254, - 1251, 1243, 1286, 1240, 1284, 1670, 1231, 1245, 1248, 1229, - 1279, 1278, 1225, 1276, 1275, 1670, 14, 1237, 1220, 1225, - 1227, 1670, 1233, 1223, 1670, 1268, 1216, 1271, 543, 561, + 1337, 0, 1321, 1338, 1376, 1326, 1699, 1699, 1323, 1699, + 1329, 1699, 546, 545, 582, 1699, 1326, 1314, 1365, 1312, + 1311, 1318, 1311, 1323, 1322, 1322, 1310, 1351, 1318, 1310, + 1353, 1299, 1307, 1304, 1313, 1312, 1699, 1297, 1294, 1308, + 1300, 1306, 1297, 1305, 1290, 1306, 1288, 1302, 1301, 1299, + 1282, 1276, 1281, 1296, 1293, 1294, 1291, 1332, 1289, 1699, + 1275, 1277, 1699, 1286, 1322, 1321, 1274, 574, 1283, 1266, + 1267, 1264, 1699, 1278, 1257, 1278, 1275, 1267, 1310, 1264, + 1308, 1699, 1255, 1269, 1272, 1253, 1303, 1302, 1249, 1300, + 1299, 1699, 14, 1261, 1244, 1249, 1251, 1699, 1257, 1247, - 527, 1221, 1264, 542, 1263, 1262, 1261, 1215, 1205, 1258, - 1211, 1221, 1255, 1218, 1212, 1199, 1207, 1250, 1254, 1211, - 1210, 1211, 1204, 1193, 1206, 1209, 1204, 1205, 1202, 1201, - 1193, 1203, 1198, 1239, 1238, 1188, 1178, 1186, 1234, 1670, - 1233, 1182, 1174, 1175, 1188, 1175, 1186, 1670, 1174, 1183, - 1182, 1182, 1222, 1165, 1174, 1167, 1178, 1155, 1159, 1210, - 1157, 1167, 1207, 1154, 1205, 538, 552, 1147, 1157, 542, - 1670, 1207, 1165, 1148, 1153, 1157, 1147, 1159, 1162, 1199, - 1670, 1193, 562, 1146, 1154, 1153, 1148, 1144, 1151, 1134, - 1137, 1133, 1150, 1145, 1133, 1129, 1136, 1130, 1182, 1139, + 1699, 1292, 1240, 1295, 544, 565, 539, 1245, 1288, 551, + 1287, 1286, 1285, 1239, 1229, 1282, 1235, 1245, 1279, 1242, + 1236, 1223, 1231, 1233, 1273, 1272, 1276, 1233, 1232, 1233, + 1226, 1215, 1228, 1231, 1226, 1227, 1224, 1223, 1215, 1225, + 1220, 1261, 1260, 1210, 1200, 1208, 1256, 1699, 1255, 1204, + 1196, 1197, 1210, 1197, 1208, 1699, 1196, 1205, 1204, 1204, + 1244, 1187, 1196, 1189, 1200, 1177, 1181, 1232, 1179, 1189, + 1229, 1176, 1227, 540, 559, 1169, 1179, 551, 1699, 1229, + 1187, 1170, 1175, 1179, 1169, 1181, 1184, 1221, 1699, 1215, + 575, 1168, 1176, 1175, 1170, 1166, 1173, 1156, 1159, 1155, - 1127, 1141, 1129, 1670, 1137, 1135, 1126, 1135, 1131, 1172, - 1114, 1114, 1127, 1112, 1167, 1120, 1108, 77, 1670, 1670, - 185, 240, 276, 1670, 1670, 317, 424, 464, 569, 497, - 590, 548, 597, 549, 609, 1670, 556, 561, 567, 562, - 620, 581, 571, 567, 580, 591, 586, 587, 581, 583, - 584, 584, 586, 639, 598, 603, 580, 1670, 638, 604, - 594, 609, 610, 597, 611, 1670, 630, 638, 618, 608, - 655, 620, 624, 663, 618, 613, 614, 610, 619, 614, - 670, 629, 620, 1670, 622, 633, 618, 634, 628, 673, - 641, 626, 627, 1670, 646, 629, 686, 631, 1670, 646, + 1172, 1167, 1155, 1151, 1158, 1152, 1204, 1161, 1149, 1163, + 1158, 1158, 1149, 1699, 1157, 1155, 1146, 1155, 90, 260, + 279, 288, 315, 352, 476, 475, 493, 497, 1699, 1699, + 542, 557, 568, 1699, 1699, 571, 561, 555, 591, 567, + 615, 568, 617, 575, 632, 1699, 580, 584, 586, 580, + 638, 593, 583, 579, 592, 603, 598, 599, 599, 601, + 602, 602, 604, 657, 616, 621, 598, 1699, 656, 616, + 606, 621, 622, 609, 623, 1699, 642, 650, 630, 620, + 667, 632, 636, 675, 630, 625, 626, 622, 631, 626, + 682, 641, 632, 1699, 634, 645, 630, 637, 647, 648, - 651, 631, 650, 688, 648, 638, 656, 655, 641, 656, - 648, 655, 645, 663, 648, 1670, 656, 662, 657, 708, - 1670, 659, 664, 658, 670, 664, 663, 665, 717, 663, - 663, 720, 666, 1670, 665, 673, 671, 670, 675, 685, - 686, 691, 730, 689, 705, 710, 684, 694, 685, 737, - 682, 1670, 689, 694, 701, 743, 744, 693, 1670, 689, - 692, 691, 711, 708, 713, 714, 700, 708, 717, 697, - 718, 758, 1670, 713, 762, 763, 713, 726, 728, 717, - 713, 720, 771, 720, 718, 736, 775, 727, 726, 732, - 730, 728, 781, 782, 778, 738, 1670, 743, 736, 745, + 642, 688, 656, 641, 642, 1699, 660, 643, 700, 645, + 1699, 660, 665, 645, 664, 702, 662, 652, 670, 669, + 655, 670, 662, 669, 659, 677, 662, 1699, 670, 676, + 671, 722, 1699, 673, 678, 672, 684, 678, 677, 679, + 731, 677, 677, 734, 680, 1699, 679, 687, 685, 684, + 689, 699, 700, 705, 744, 703, 719, 724, 698, 708, + 699, 751, 696, 1699, 703, 708, 715, 757, 758, 707, + 1699, 703, 706, 705, 725, 722, 708, 716, 729, 730, + 716, 724, 733, 713, 734, 776, 1699, 731, 778, 779, + 729, 742, 744, 733, 729, 736, 787, 736, 734, 752, - 733, 743, 739, 752, 1670, 735, 736, 1670, 737, 735, - 754, 755, 756, 755, 739, 744, 762, 1670, 752, 785, - 776, 748, 807, 770, 1670, 753, 768, 760, 764, 1670, - 1670, 774, 809, 758, 811, 760, 818, 763, 774, 766, - 772, 768, 786, 787, 1670, 785, 1670, 788, 1670, 772, - 792, 782, 775, 788, 830, 1670, 787, 837, 838, 1670, - 839, 783, 789, 796, 838, 1670, 1670, 788, 788, 791, - 805, 792, 849, 808, 846, 800, 853, 803, 855, 804, - 857, 858, 819, 860, 804, 816, 821, 807, 837, 866, - 826, 1670, 818, 869, 818, 814, 830, 835, 817, 875, + 791, 743, 742, 748, 746, 744, 797, 798, 794, 754, + 1699, 759, 752, 761, 749, 759, 755, 768, 1699, 751, + 752, 1699, 753, 751, 770, 771, 772, 771, 755, 760, + 778, 1699, 768, 801, 792, 764, 823, 786, 1699, 769, + 784, 776, 780, 1699, 1699, 790, 825, 774, 827, 776, + 834, 830, 798, 781, 792, 784, 790, 786, 804, 806, + 1699, 804, 1699, 806, 1699, 790, 810, 801, 794, 806, + 848, 1699, 805, 855, 856, 1699, 857, 801, 807, 814, + 856, 1699, 1699, 806, 806, 809, 823, 810, 867, 826, + 864, 818, 871, 821, 873, 822, 875, 876, 837, 878, - 830, 835, 1670, 836, 829, 838, 839, 836, 826, 828, - 885, 834, 831, 832, 889, 885, 828, 843, 894, 1670, - 1670, 1670, 853, 845, 855, 840, 841, 901, 903, 849, - 905, 1670, 855, 857, 908, 851, 1670, 872, 1670, 857, - 1670, 1670, 864, 1670, 914, 865, 916, 917, 899, 1670, - 877, 878, 1670, 866, 865, 868, 868, 869, 865, 1670, - 887, 873, 874, 889, 889, 892, 892, 889, 894, 1670, - 886, 938, 897, 1670, 894, 900, 901, 898, 1670, 890, - 890, 896, 895, 906, 1670, 1670, 945, 1670, 894, 900, - 1670, 902, 904, 907, 918, 1670, 915, 1670, 912, 1670, + 822, 834, 839, 825, 855, 884, 844, 1699, 836, 887, + 836, 832, 848, 853, 835, 893, 848, 853, 1699, 856, + 846, 856, 849, 858, 859, 856, 846, 848, 905, 854, + 851, 852, 909, 905, 849, 864, 914, 1699, 1699, 1699, + 873, 865, 875, 860, 861, 922, 923, 869, 925, 1699, + 875, 877, 928, 872, 1699, 893, 1699, 877, 1699, 1699, + 884, 1699, 934, 885, 936, 937, 919, 1699, 897, 898, + 1699, 886, 885, 888, 888, 889, 885, 1699, 907, 893, + 901, 910, 896, 911, 911, 914, 914, 911, 916, 1699, + 908, 960, 920, 1699, 917, 922, 923, 920, 1699, 912, - 935, 955, 961, 962, 906, 964, 965, 920, 914, 968, - 969, 965, 930, 926, 968, 918, 923, 976, 934, 1670, - 978, 938, 980, 943, 932, 940, 984, 928, 946, 945, - 929, 985, 950, 951, 951, 938, 949, 996, 956, 969, - 956, 1670, 1670, 1000, 1670, 1670, 949, 960, 1670, 1670, - 950, 999, 944, 949, 1007, 957, 1670, 963, 1670, 1010, - 1670, 955, 970, 975, 1670, 1009, 977, 970, 979, 967, - 977, 1020, 1021, 1022, 973, 1670, 1024, 1025, 973, 1670, - 977, 1029, 975, 974, 1032, 987, 1670, 1029, 991, 1670, - 994, 1037, 998, 981, 983, 980, 996, 1005, 1044, 1670, + 912, 918, 917, 928, 1699, 1699, 967, 1699, 916, 922, + 1699, 924, 926, 929, 940, 1699, 937, 1699, 934, 1699, + 957, 977, 983, 984, 928, 986, 987, 942, 936, 990, + 991, 954, 993, 989, 954, 950, 992, 942, 947, 1000, + 958, 1699, 1002, 962, 1004, 967, 956, 964, 1009, 953, + 970, 969, 953, 1009, 974, 975, 975, 962, 973, 1020, + 980, 993, 980, 1699, 1699, 1024, 1699, 1699, 973, 984, + 1699, 1699, 971, 1699, 975, 1024, 969, 974, 1032, 982, + 1699, 988, 1699, 1035, 1699, 980, 995, 1000, 1699, 1034, + 1002, 995, 1004, 992, 1002, 1045, 1046, 1047, 998, 1699, - 1670, 1670, 1040, 1670, 1670, 1005, 1042, 1670, 996, 1003, - 1670, 1000, 1005, 1052, 997, 1670, 1012, 1002, 1014, 1057, - 1001, 1009, 1670, 1020, 1010, 1009, 1023, 1014, 1023, 1025, - 1670, 1067, 1068, 1028, 1070, 1670, 1066, 1030, 1011, 1074, - 1033, 1034, 1035, 1078, 1037, 1670, 1670, 1042, 1670, 1024, - 1082, 1043, 1670, 1029, 1029, 1031, 1670, 1036, 1031, 1043, - 1670, 1041, 1045, 1036, 1088, 1037, 1053, 1046, 1055, 1046, - 1053, 1040, 1055, 1102, 1061, 1048, 1064, 1055, 1069, 1065, - 1670, 1109, 1110, 1111, 1068, 1067, 1068, 1670, 1670, 1670, - 1115, 1059, 1075, 1670, 1113, 1064, 1063, 1065, 1076, 1123, + 1049, 1051, 998, 1699, 1002, 1054, 999, 1001, 1000, 1058, + 1013, 1699, 1055, 1017, 1699, 1020, 1063, 1024, 1007, 1009, + 1006, 1022, 1031, 1070, 1699, 1699, 1699, 1066, 1699, 1699, + 1031, 1068, 1699, 1032, 1023, 1030, 1699, 1027, 1032, 1079, + 1024, 1699, 1039, 1029, 1041, 1084, 1028, 1036, 1699, 1047, + 1037, 1036, 1034, 1051, 1042, 1051, 1053, 1699, 1095, 1096, + 1056, 1098, 1699, 1094, 1058, 1039, 1102, 1061, 1104, 1063, + 1064, 1107, 1066, 1699, 1699, 1071, 1699, 1053, 1111, 1072, + 1699, 1058, 1699, 1058, 1060, 1699, 1065, 1060, 1072, 1699, + 1070, 1074, 1065, 1117, 1066, 1082, 1075, 1084, 1075, 1082, - 1074, 1670, 1083, 1126, 1670, 1670, 1132, 1137, 1142, 1147, - 1152, 1157, 1162, 1165, 1139, 1144, 1146, 1159 + 1069, 1084, 1131, 1090, 1077, 1093, 1084, 1098, 1094, 1699, + 1138, 1139, 1140, 1097, 1096, 1097, 1699, 1699, 1699, 1144, + 1088, 1104, 1699, 1142, 1093, 1092, 1094, 1105, 1152, 1103, + 1699, 1112, 1155, 1699, 1699, 1161, 1166, 1171, 1176, 1181, + 1186, 1191, 1194, 1168, 1173, 1175, 1188 } ; -static const flex_int16_t yy_def[1319] = +static const flex_int16_t yy_def[1348] = { 0, - 1307, 1307, 1308, 1308, 1307, 1307, 1307, 1307, 1307, 1307, - 1306, 1306, 1306, 1306, 1306, 1309, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1310, - 1306, 1306, 1306, 1311, 15, 1306, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1312, 45, 45, + 1336, 1336, 1337, 1337, 1336, 1336, 1336, 1336, 1336, 1336, + 1335, 1335, 1335, 1335, 1335, 1338, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1339, + 1335, 1335, 1335, 1340, 15, 1335, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1341, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1309, - 1306, 1306, 1306, 1306, 1306, 1306, 1313, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1310, 1306, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1338, + 1335, 1335, 1335, 1335, 1335, 1335, 1342, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1339, 1335, - 1311, 1306, 1306, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1314, 45, 1312, 45, 45, + 1340, 1335, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1343, 45, 1341, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1313, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1315, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1314, 1306, + 45, 45, 45, 45, 45, 45, 45, 1342, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1344, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1343, - 1312, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1335, 1341, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1306, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1316, 45, - 45, 45, 45, 45, 45, 45, 45, 1306, 45, 1306, + 45, 45, 45, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1345, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 1312, 1306, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 1341, 1335, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 1306, - 1306, 1317, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, + 45, 1335, 1335, 1335, 1346, 45, 45, 45, 45, 45, - 1306, 45, 45, 1306, 45, 1312, 45, 45, 45, 45, - 45, 1306, 45, 45, 45, 45, 1306, 45, 45, 45, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 45, 45, 1335, 45, 1341, 45, + 45, 45, 45, 45, 1335, 45, 45, 45, 45, 1335, + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1306, 45, 45, 45, 45, 1306, 45, 45, - 45, 45, 45, 45, 45, 45, 1306, 45, 1306, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 1335, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 1306, 45, 45, 1306, 45, 45, 1306, 1318, 45, 45, + 45, 45, 45, 1335, 1335, 45, 45, 1335, 45, 45, - 45, 45, 1306, 1306, 45, 1306, 45, 1306, 45, 45, - 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, + 1335, 1347, 45, 45, 45, 45, 1335, 1335, 45, 1335, + 45, 1335, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, + 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 1335, 45, 45, + + 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 1306, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, - 45, 1306, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1335, 1335, + 45, 45, 45, 1335, 1335, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, + 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, + 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, + 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1306, 1306, - 45, 45, 45, 1306, 1306, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, + 1335, 45, 45, 45, 45, 45, 45, 45, 1335, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 1335, 45, + 45, 45, 45, 1335, 1335, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1335, 45, 1335, 45, 1335, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 1335, 45, 45, 45, 45, + 45, 1335, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 45, 45, 45, 45, 45, 45, 1306, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1306, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 1335, 1335, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, + 45, 45, 45, 45, 1335, 45, 1335, 45, 1335, 1335, + 45, 1335, 45, 45, 45, 45, 45, 1335, 45, 45, + 1335, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, + 45, 45, 45, 1335, 45, 45, 45, 45, 1335, 45, - 45, 45, 45, 45, 1306, 45, 45, 1306, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1306, 45, 45, - 45, 45, 45, 45, 1306, 45, 45, 45, 45, 1306, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1306, 45, 1306, 45, 1306, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 1306, - 45, 45, 45, 45, 45, 1306, 1306, 45, 45, 45, + 45, 45, 45, 45, 1335, 1335, 45, 1335, 45, 45, + 1335, 45, 45, 45, 45, 1335, 45, 1335, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 1335, 45, 1335, 1335, 45, 45, + 1335, 1335, 45, 1335, 45, 45, 45, 45, 45, 45, + 1335, 45, 1335, 45, 1335, 45, 45, 45, 1335, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 1306, 1306, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 45, 45, 45, 45, 1306, 45, 1306, 45, - 1306, 1306, 45, 1306, 45, 45, 45, 45, 45, 1306, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 1306, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 45, 45, 45, 1306, 45, 45, 45, 45, 1306, 45, - 45, 45, 45, 45, 1306, 1306, 45, 1306, 45, 45, - 1306, 45, 45, 45, 45, 1306, 45, 1306, 45, 1306, + 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, + 45, 1335, 45, 45, 1335, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1335, 1335, 1335, 45, 1335, 1335, + 45, 45, 1335, 45, 45, 45, 1335, 45, 45, 45, + 45, 1335, 45, 45, 45, 45, 45, 45, 1335, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, + 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1335, 1335, 45, 1335, 45, 45, 45, + 1335, 45, 1335, 45, 45, 1335, 45, 45, 45, 1335, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1306, 1306, 45, 1306, 1306, 45, 45, 1306, 1306, - 45, 45, 45, 45, 45, 45, 1306, 45, 1306, 45, - 1306, 45, 45, 45, 1306, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 45, 45, 45, 1306, - 45, 45, 45, 45, 45, 45, 1306, 45, 45, 1306, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1306, - - 1306, 1306, 45, 1306, 1306, 45, 45, 1306, 45, 45, - 1306, 45, 45, 45, 45, 1306, 45, 45, 45, 45, - 45, 45, 1306, 45, 45, 45, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 1306, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1306, 1306, 45, 1306, 45, - 45, 45, 1306, 45, 45, 45, 1306, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1306, 45, 45, 45, 45, 45, 45, 1306, 1306, 1306, - 45, 45, 45, 1306, 45, 45, 45, 45, 45, 45, - - 45, 1306, 45, 45, 1306, 0, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306 + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, + 45, 45, 45, 45, 45, 45, 1335, 1335, 1335, 45, + 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, + 1335, 45, 45, 1335, 0, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335 } ; -static const flex_int16_t yy_nxt[1742] = +static const flex_int16_t yy_nxt[1771] = { 0, - 1306, 13, 14, 13, 1306, 15, 16, 1306, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 86, 671, - 37, 14, 37, 87, 25, 26, 38, 1306, 672, 27, + 1335, 13, 14, 13, 1335, 15, 16, 1335, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 86, 679, + 37, 14, 37, 87, 25, 26, 38, 1335, 680, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, - 13, 14, 13, 13, 14, 13, 32, 40, 142, 13, - 14, 13, 33, 40, 115, 92, 93, 143, 91, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 143, 13, + 14, 13, 33, 40, 115, 92, 93, 144, 91, 34, 35, 13, 14, 13, 95, 15, 16, 96, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 109, 39, 91, 25, 26, 13, 14, 13, 27, 39, 85, 85, 85, 28, 42, 41, 42, 42, 29, 42, 30, 83, 108, 41, 111, 94, 25, 31, 109, - 208, 163, 89, 137, 89, 164, 32, 90, 90, 90, - 209, 138, 33, 213, 214, 83, 108, 802, 111, 34, + 209, 164, 89, 138, 89, 165, 32, 90, 90, 90, + 210, 139, 33, 214, 215, 83, 108, 805, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 45, 45, 45, 45, 48, 45, 49, 50, 45, 51, 45, 52, 53, @@ -1217,97 +1226,97 @@ static const flex_int16_t yy_nxt[1742] = 74, 75, 76, 77, 78, 79, 57, 45, 45, 45, 45, 45, 81, 105, 82, 82, 82, 81, 114, 84, 84, 84, 102, 105, 81, 83, 84, 84, 84, 108, - 83, 180, 122, 112, 139, 123, 803, 83, 124, 105, - 125, 114, 126, 113, 140, 180, 141, 132, 83, 119, - 159, 178, 108, 83, 160, 120, 112, 103, 133, 180, - 83, 45, 148, 135, 161, 198, 149, 45, 134, 45, - 45, 113, 45, 183, 45, 45, 45, 178, 117, 144, - 145, 45, 45, 146, 45, 45, 150, 804, 198, 147, + 83, 181, 122, 112, 140, 123, 179, 83, 124, 105, + 125, 114, 126, 113, 141, 181, 142, 132, 83, 119, + 160, 180, 108, 83, 161, 120, 112, 103, 133, 181, + 83, 45, 179, 136, 162, 806, 134, 45, 135, 45, + 45, 113, 45, 184, 45, 45, 45, 180, 117, 145, + 146, 45, 45, 147, 45, 45, 90, 90, 90, 148, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 90, 90, 90, 45, 127, 805, - 111, 45, 128, 179, 258, 129, 130, 102, 114, 45, - 165, 259, 154, 45, 166, 45, 118, 167, 131, 151, - 155, 152, 156, 153, 168, 169, 112, 157, 158, 179, - 170, 173, 85, 85, 85, 284, 113, 90, 90, 90, - 806, 174, 103, 83, 178, 368, 175, 188, 369, 112, - 81, 171, 82, 82, 82, 89, 179, 89, 284, 191, - 90, 90, 90, 83, 113, 81, 83, 84, 84, 84, - 181, 172, 85, 85, 85, 188, 192, 101, 83, 194, + 45, 45, 45, 45, 179, 149, 193, 45, 127, 150, + 102, 45, 128, 111, 371, 129, 130, 372, 114, 45, + 90, 90, 90, 45, 180, 45, 118, 155, 131, 151, + 182, 807, 152, 193, 153, 156, 154, 157, 112, 808, + 166, 174, 158, 159, 167, 103, 227, 168, 113, 228, + 183, 175, 809, 229, 169, 170, 176, 85, 85, 85, + 171, 112, 81, 172, 82, 82, 82, 89, 83, 89, + 192, 101, 90, 90, 90, 83, 113, 81, 101, 84, + 84, 84, 196, 173, 85, 85, 85, 189, 195, 197, - 222, 195, 182, 83, 101, 191, 83, 196, 283, 219, - 197, 220, 225, 188, 238, 226, 223, 194, 239, 227, - 283, 83, 282, 192, 251, 252, 83, 194, 195, 386, - 202, 282, 101, 197, 283, 196, 101, 197, 284, 254, - 101, 203, 255, 256, 294, 244, 286, 245, 101, 260, - 282, 291, 101, 295, 101, 186, 201, 201, 201, 285, - 278, 287, 297, 201, 201, 201, 201, 201, 201, 269, - 340, 299, 294, 270, 291, 301, 291, 271, 297, 387, - 295, 807, 261, 262, 263, 297, 201, 201, 201, 201, - 201, 201, 310, 264, 299, 265, 352, 266, 311, 304, + 83, 83, 198, 253, 254, 83, 192, 199, 83, 220, + 240, 221, 286, 810, 241, 224, 101, 189, 256, 196, + 101, 257, 258, 83, 101, 189, 195, 197, 83, 198, + 199, 225, 101, 195, 203, 286, 101, 260, 101, 187, + 202, 202, 202, 262, 261, 204, 286, 202, 202, 202, + 202, 202, 202, 198, 271, 284, 285, 284, 272, 389, + 285, 246, 273, 247, 296, 293, 297, 299, 303, 289, + 202, 202, 202, 202, 202, 202, 263, 264, 265, 301, + 280, 811, 285, 284, 293, 287, 288, 266, 293, 267, + 299, 268, 296, 297, 269, 303, 343, 299, 355, 392, - 267, 347, 301, 302, 302, 302, 389, 393, 389, 400, - 302, 302, 302, 302, 302, 302, 395, 394, 397, 398, - 403, 341, 414, 395, 342, 447, 448, 399, 808, 389, - 353, 390, 400, 302, 302, 302, 302, 302, 302, 415, - 403, 467, 420, 454, 354, 395, 421, 501, 403, 406, - 406, 406, 407, 455, 811, 522, 406, 406, 406, 406, - 406, 406, 433, 509, 494, 510, 501, 434, 456, 495, - 523, 531, 599, 600, 648, 501, 532, 682, 684, 406, - 406, 406, 406, 406, 406, 683, 595, 688, 685, 749, - 509, 601, 510, 689, 511, 768, 750, 468, 756, 599, + 312, 392, 301, 304, 304, 304, 313, 306, 396, 390, + 304, 304, 304, 304, 304, 304, 398, 403, 397, 398, + 350, 406, 392, 423, 393, 417, 812, 424, 451, 452, + 400, 401, 356, 304, 304, 304, 304, 304, 304, 402, + 403, 471, 418, 406, 458, 398, 357, 344, 410, 406, + 345, 409, 409, 409, 459, 813, 533, 814, 409, 409, + 409, 409, 409, 409, 437, 498, 505, 505, 534, 438, + 499, 460, 513, 526, 514, 537, 605, 606, 690, 656, + 538, 409, 409, 409, 409, 409, 409, 601, 527, 691, + 692, 759, 607, 815, 505, 515, 696, 472, 760, 513, - 812, 600, 751, 752, 757, 682, 813, 814, 683, 815, - 753, 649, 809, 435, 816, 817, 810, 818, 436, 45, - 45, 45, 819, 768, 820, 821, 45, 45, 45, 45, - 45, 45, 822, 823, 824, 825, 826, 827, 828, 829, - 830, 831, 832, 833, 834, 835, 836, 837, 838, 45, - 45, 45, 45, 45, 45, 839, 840, 841, 842, 843, + 693, 514, 697, 605, 816, 606, 690, 766, 778, 761, + 762, 817, 691, 767, 818, 439, 657, 763, 819, 820, + 440, 45, 45, 45, 823, 824, 825, 826, 45, 45, + 45, 45, 45, 45, 821, 827, 778, 828, 822, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 45, 45, 45, 45, 45, 45, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 865, 866, 867, 868, 846, 869, 870, 845, 871, - 872, 873, 876, 877, 878, 879, 874, 880, 881, 882, + 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, + 874, 875, 876, 877, 878, 879, 880, 858, 881, 882, - 883, 884, 885, 886, 887, 888, 889, 890, 891, 893, - 894, 895, 896, 897, 898, 899, 900, 901, 902, 892, - 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, - 913, 914, 915, 916, 917, 918, 919, 920, 922, 921, - 923, 924, 925, 926, 927, 928, 929, 875, 930, 931, - 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, - 942, 943, 944, 945, 946, 920, 921, 947, 949, 950, - 951, 952, 948, 953, 954, 955, 956, 957, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 857, 883, 884, 885, 886, 887, 890, 891, 892, 893, + 888, 894, 895, 896, 897, 898, 899, 900, 901, 902, + 903, 904, 905, 907, 908, 909, 910, 911, 912, 913, + 914, 915, 916, 906, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, + 933, 934, 936, 935, 937, 938, 939, 940, 941, 942, + 943, 889, 944, 945, 946, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, 960, 934, + 935, 961, 962, 963, 965, 966, 967, 968, 964, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 989, 1012, 1013, 1014, 1015, 1016, 990, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1036, 1037, 1038, - 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1055, 1056, 1057, 1058, 1059, - 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, - 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1049, 1079, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1005, 1028, + 1029, 1030, 1031, 1032, 1006, 1033, 1034, 1035, 1036, 1037, + 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, + 1069, 1070, 1071, 1073, 1074, 1075, 1076, 1077, 1078, 1079, - 1080, 1081, 1082, 1083, 1084, 1078, 1085, 1035, 1086, 1087, - 1088, 1089, 1090, 1091, 1092, 1093, 1054, 1094, 1095, 1096, - 1097, 1098, 1100, 1101, 1102, 1103, 1099, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1120, 1121, 1122, 1101, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, + 1090, 1091, 1092, 1093, 1094, 1095, 1067, 1096, 1097, 1099, + 1100, 1101, 1102, 1103, 1104, 1053, 1098, 1105, 1106, 1107, + 1108, 1109, 1110, 1111, 1072, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1120, 1121, 1122, 1123, 1119, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, + 1137, 1138, 1139, 1140, 1141, 1142, 1121, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, - 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, - 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, + 1186, 1187, 1188, 1162, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, - 1205, 1178, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, - 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, + 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, + 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, + 1225, 1226, 1227, 1228, 1229, 1202, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, @@ -1316,81 +1325,83 @@ static const flex_int16_t yy_nxt[1742] = 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, - 1304, 1305, 12, 12, 12, 12, 12, 36, 36, 36, - 36, 36, 80, 289, 80, 80, 80, 99, 392, 99, - 498, 99, 101, 101, 101, 101, 101, 116, 116, 116, - 116, 116, 177, 101, 177, 177, 177, 199, 199, 199, - 801, 800, 799, 798, 797, 796, 795, 794, 793, 792, - 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, - 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, + 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, + 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, + 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, + 1334, 12, 12, 12, 12, 12, 36, 36, 36, 36, + 36, 80, 291, 80, 80, 80, 99, 395, 99, 502, + 99, 101, 101, 101, 101, 101, 116, 116, 116, 116, + 116, 178, 101, 178, 178, 178, 200, 200, 200, 804, - 771, 770, 769, 767, 766, 765, 764, 763, 762, 761, - 760, 759, 758, 755, 754, 748, 747, 746, 745, 744, - 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, - 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, - 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, - 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, - 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, - 693, 692, 691, 690, 687, 686, 681, 680, 679, 678, - 677, 676, 675, 674, 673, 670, 669, 668, 667, 666, - 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, + 803, 802, 801, 800, 799, 798, 797, 796, 795, 794, + 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, + 783, 782, 781, 780, 779, 777, 776, 775, 774, 773, + 772, 771, 770, 769, 768, 765, 764, 758, 757, 756, + 755, 754, 753, 752, 751, 750, 749, 748, 747, 746, + 745, 744, 743, 742, 741, 740, 739, 738, 737, 736, + 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, + 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, + 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, + 705, 704, 703, 702, 701, 700, 699, 698, 695, 694, - 655, 654, 653, 652, 651, 650, 647, 646, 645, 644, - 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, - 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, - 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, - 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, - 603, 602, 598, 597, 596, 595, 594, 593, 592, 591, - 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, - 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, - 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, - 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, + 689, 688, 687, 686, 685, 684, 683, 682, 681, 678, + 677, 676, 675, 674, 673, 672, 671, 670, 669, 668, + 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, + 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, + 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, + 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, + 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, + 615, 614, 613, 612, 611, 610, 609, 608, 604, 603, + 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, + 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, - 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, - 540, 539, 538, 537, 536, 535, 534, 533, 530, 529, - 528, 527, 526, 525, 524, 521, 520, 519, 518, 517, - 516, 515, 514, 513, 512, 508, 507, 506, 505, 504, - 503, 502, 500, 499, 497, 496, 493, 492, 491, 490, + 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, + 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, + 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, + 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, + 542, 541, 540, 539, 536, 535, 532, 531, 530, 529, + 528, 525, 524, 523, 522, 521, 520, 519, 518, 517, + 516, 512, 511, 510, 509, 508, 507, 506, 504, 503, + 501, 500, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, - 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, - 469, 466, 465, 464, 463, 462, 461, 460, 459, 458, - 457, 453, 452, 451, 450, 449, 446, 445, 444, 443, - 442, 441, 440, 439, 438, 437, 432, 431, 430, 429, + 479, 478, 477, 476, 475, 474, 473, 470, 469, 468, - 428, 427, 426, 425, 424, 423, 422, 419, 418, 417, - 416, 413, 412, 411, 410, 409, 408, 405, 404, 402, - 401, 396, 391, 388, 385, 384, 383, 382, 381, 380, - 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, + 467, 466, 465, 464, 463, 462, 461, 457, 456, 455, + 454, 453, 450, 449, 448, 447, 446, 445, 444, 443, + 442, 441, 436, 435, 434, 433, 432, 431, 430, 429, + 428, 427, 426, 425, 422, 421, 420, 419, 416, 415, + 414, 413, 412, 411, 408, 407, 405, 404, 399, 394, + 391, 388, 387, 386, 385, 384, 383, 382, 381, 380, + 379, 378, 377, 376, 375, 374, 373, 370, 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, - 357, 356, 355, 351, 350, 349, 348, 346, 345, 344, - 343, 339, 338, 337, 336, 335, 334, 333, 332, 331, + 354, 353, 352, 351, 349, 348, 347, 346, 342, 341, + 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, + 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 319, 318, 317, 316, 315, 314, 313, 312, 309, - 308, 307, 306, 305, 303, 200, 300, 298, 296, 293, + 320, 319, 318, 317, 316, 315, 314, 311, 310, 309, + 308, 307, 305, 201, 302, 300, 298, 295, 294, 292, + 290, 283, 282, 281, 279, 278, 277, 276, 275, 274, + 270, 259, 255, 252, 251, 250, 249, 248, 245, 244, + 243, 242, 239, 238, 237, 236, 235, 234, 233, 232, + 231, 230, 226, 223, 222, 219, 218, 217, 216, 213, + 212, 211, 208, 207, 206, 205, 201, 194, 191, 190, + 188, 186, 185, 177, 163, 137, 121, 110, 107, 106, + 104, 43, 100, 98, 97, 88, 43, 1335, 11, 1335, - 292, 290, 288, 281, 280, 279, 277, 276, 275, 274, - 273, 272, 268, 257, 253, 250, 249, 248, 247, 246, - 243, 242, 241, 240, 237, 236, 235, 234, 233, 232, - 231, 230, 229, 228, 224, 221, 218, 217, 216, 215, - 212, 211, 210, 207, 206, 205, 204, 200, 193, 190, - 189, 187, 185, 184, 176, 162, 136, 121, 110, 107, - 106, 104, 43, 100, 98, 97, 88, 43, 1306, 11, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306 + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335 } ; -static const flex_int16_t yy_chk[1742] = +static const flex_int16_t yy_chk[1771] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 587, - 3, 3, 3, 21, 1, 1, 3, 0, 587, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 593, + 3, 3, 3, 21, 1, 1, 3, 0, 593, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, 6, 6, 6, 7, 7, 7, 1, 7, 68, 8, @@ -1402,7 +1413,7 @@ static const flex_int16_t yy_chk[1742] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 124, 75, 25, 66, 25, 75, 2, 25, 25, 25, - 124, 66, 2, 128, 128, 20, 51, 718, 54, 2, + 124, 66, 2, 128, 128, 20, 51, 719, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1413,173 +1424,175 @@ static const flex_int16_t yy_chk[1742] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 48, 17, 17, 17, 19, 56, 19, 19, 19, 44, 59, 22, 17, 22, 22, 22, 64, - 19, 93, 61, 55, 67, 61, 721, 22, 61, 48, + 19, 93, 61, 55, 67, 61, 91, 22, 61, 48, 61, 56, 61, 55, 67, 96, 67, 63, 17, 59, - 73, 91, 64, 19, 73, 59, 55, 44, 63, 93, - 22, 45, 70, 64, 73, 115, 70, 45, 63, 45, - 45, 55, 45, 96, 45, 45, 45, 91, 58, 69, - 69, 45, 45, 69, 45, 58, 70, 722, 115, 69, + 73, 92, 64, 19, 73, 59, 55, 44, 63, 93, + 22, 45, 91, 64, 73, 720, 63, 45, 63, 45, + 45, 55, 45, 96, 45, 45, 45, 92, 58, 69, + 69, 45, 45, 69, 45, 58, 89, 89, 89, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 58, 89, 89, 89, 58, 62, 723, - 71, 58, 62, 92, 163, 62, 62, 101, 78, 58, - 76, 163, 72, 58, 76, 58, 58, 76, 62, 71, - 72, 71, 72, 71, 76, 76, 77, 72, 72, 92, - 76, 78, 81, 81, 81, 180, 77, 90, 90, 90, - 726, 78, 101, 81, 94, 263, 78, 105, 263, 77, - 82, 77, 82, 82, 82, 83, 95, 83, 180, 108, - 83, 83, 83, 82, 77, 84, 81, 84, 84, 84, - 94, 77, 85, 85, 85, 105, 109, 103, 84, 111, + 45, 45, 45, 58, 94, 70, 109, 58, 62, 70, + 101, 58, 62, 71, 265, 62, 62, 265, 78, 58, + 90, 90, 90, 58, 95, 58, 58, 72, 62, 70, + 94, 721, 71, 109, 71, 72, 71, 72, 77, 722, + 76, 78, 72, 72, 76, 101, 138, 76, 77, 138, + 95, 78, 723, 138, 76, 76, 78, 81, 81, 81, + 76, 77, 82, 77, 82, 82, 82, 83, 81, 83, + 108, 103, 83, 83, 83, 82, 77, 84, 103, 84, + 84, 84, 112, 77, 85, 85, 85, 105, 111, 113, - 135, 112, 95, 85, 103, 108, 82, 113, 179, 133, - 114, 133, 137, 119, 148, 137, 135, 153, 148, 137, - 182, 84, 178, 109, 159, 159, 85, 111, 112, 280, - 119, 181, 103, 173, 179, 113, 103, 114, 183, 161, - 103, 119, 161, 161, 191, 153, 182, 153, 103, 164, - 178, 188, 103, 192, 103, 103, 118, 118, 118, 181, - 173, 183, 194, 118, 118, 118, 118, 118, 118, 166, - 239, 196, 191, 166, 188, 198, 203, 166, 244, 280, - 192, 727, 164, 164, 164, 194, 118, 118, 118, 118, - 118, 118, 209, 164, 196, 164, 249, 164, 209, 203, + 84, 81, 114, 160, 160, 85, 108, 115, 82, 133, + 149, 133, 181, 724, 149, 136, 103, 119, 162, 112, + 103, 162, 162, 84, 103, 105, 111, 113, 85, 114, + 115, 136, 103, 154, 119, 181, 103, 164, 103, 103, + 118, 118, 118, 165, 164, 119, 184, 118, 118, 118, + 118, 118, 118, 174, 167, 179, 180, 182, 167, 282, + 183, 154, 167, 154, 192, 189, 193, 195, 199, 184, + 118, 118, 118, 118, 118, 118, 165, 165, 165, 197, + 174, 725, 180, 179, 204, 182, 183, 165, 189, 165, + 195, 165, 192, 193, 165, 199, 241, 246, 251, 284, - 164, 244, 198, 201, 201, 201, 282, 290, 285, 294, - 201, 201, 201, 201, 201, 201, 291, 290, 293, 293, - 297, 239, 311, 304, 239, 340, 340, 293, 728, 282, - 249, 285, 294, 201, 201, 201, 201, 201, 201, 311, - 347, 359, 317, 346, 249, 291, 317, 395, 297, 302, - 302, 302, 304, 346, 730, 420, 302, 302, 302, 302, - 302, 302, 329, 405, 387, 405, 407, 329, 347, 387, - 420, 429, 509, 510, 562, 395, 429, 599, 601, 302, - 302, 302, 302, 302, 302, 600, 511, 604, 601, 666, - 405, 511, 405, 604, 407, 683, 666, 359, 670, 509, + 210, 287, 197, 202, 202, 202, 210, 204, 292, 282, + 202, 202, 202, 202, 202, 202, 293, 296, 292, 306, + 246, 299, 284, 319, 287, 313, 726, 319, 343, 343, + 295, 295, 251, 202, 202, 202, 202, 202, 202, 295, + 296, 362, 313, 350, 349, 293, 251, 241, 306, 299, + 241, 304, 304, 304, 349, 727, 430, 728, 304, 304, + 304, 304, 304, 304, 332, 390, 398, 410, 430, 332, + 390, 350, 408, 423, 408, 433, 513, 514, 605, 568, + 433, 304, 304, 304, 304, 304, 304, 515, 423, 606, + 607, 674, 515, 731, 398, 410, 610, 362, 674, 408, - 731, 510, 667, 667, 670, 599, 732, 733, 600, 734, - 667, 562, 729, 329, 735, 737, 729, 738, 329, 406, - 406, 406, 739, 683, 740, 741, 406, 406, 406, 406, - 406, 406, 742, 743, 744, 745, 746, 747, 748, 749, - 750, 751, 752, 753, 754, 755, 756, 757, 759, 406, - 406, 406, 406, 406, 406, 760, 761, 762, 763, 764, - 765, 767, 768, 769, 770, 771, 772, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 783, 785, 786, - 787, 788, 789, 790, 791, 768, 792, 793, 767, 795, - 796, 797, 798, 800, 801, 802, 797, 803, 804, 805, + 607, 408, 610, 513, 732, 514, 605, 678, 691, 675, + 675, 733, 606, 678, 736, 332, 568, 675, 737, 738, + 332, 409, 409, 409, 740, 741, 742, 743, 409, 409, + 409, 409, 409, 409, 739, 744, 691, 745, 739, 747, + 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 409, 409, 409, 409, 409, 409, 759, 760, 761, + 762, 763, 764, 765, 766, 767, 769, 770, 771, 772, + 773, 774, 775, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, + 795, 796, 797, 798, 799, 800, 801, 778, 802, 803, - 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, - 817, 818, 819, 820, 822, 823, 824, 825, 826, 814, - 827, 828, 829, 830, 831, 832, 833, 835, 836, 837, - 838, 839, 840, 841, 842, 843, 844, 845, 847, 846, - 848, 849, 850, 851, 853, 854, 855, 797, 856, 857, - 858, 860, 861, 862, 863, 864, 865, 866, 867, 868, - 869, 870, 871, 872, 874, 845, 846, 875, 876, 877, - 878, 879, 875, 880, 881, 882, 883, 884, 885, 886, - 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, - 898, 899, 900, 901, 902, 903, 904, 906, 907, 909, + 777, 804, 805, 807, 808, 809, 810, 812, 813, 814, + 809, 815, 816, 817, 818, 819, 820, 821, 822, 823, + 824, 825, 826, 827, 829, 830, 831, 832, 834, 835, + 836, 837, 838, 826, 839, 840, 841, 842, 843, 844, + 845, 847, 848, 849, 850, 851, 852, 853, 854, 855, + 856, 857, 859, 858, 860, 861, 862, 863, 865, 866, + 867, 809, 868, 869, 870, 872, 873, 874, 875, 876, + 877, 878, 879, 880, 881, 882, 883, 884, 885, 857, + 858, 886, 888, 889, 890, 891, 892, 893, 889, 894, + 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, - 910, 911, 912, 913, 914, 915, 916, 917, 919, 920, - 921, 922, 923, 924, 926, 927, 928, 929, 932, 933, - 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, - 944, 946, 920, 948, 950, 951, 952, 953, 921, 954, - 955, 957, 958, 959, 961, 962, 963, 964, 965, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 989, 1019, + 905, 906, 907, 908, 909, 910, 912, 913, 914, 915, + 916, 917, 918, 920, 921, 923, 924, 925, 926, 927, + 928, 929, 930, 931, 933, 934, 935, 936, 937, 938, + 940, 941, 942, 943, 946, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, 934, 960, + 962, 964, 966, 967, 935, 968, 969, 970, 971, 973, + 974, 975, 977, 978, 979, 980, 981, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1023, 1024, 1025, 1026, 1027, 1018, 1028, 975, 1029, 1030, - 1031, 1033, 1034, 1035, 1036, 1038, 994, 1040, 1043, 1045, - 1046, 1047, 1048, 1049, 1051, 1052, 1047, 1054, 1055, 1056, - 1057, 1058, 1059, 1061, 1062, 1063, 1064, 1065, 1066, 1067, - 1068, 1069, 1071, 1072, 1073, 1075, 1049, 1076, 1077, 1078, - 1080, 1081, 1082, 1083, 1084, 1087, 1089, 1090, 1092, 1093, - 1094, 1095, 1097, 1099, 1101, 1102, 1103, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1121, 1122, 1123, 1124, 1125, 1126, 1127, - 1128, 1101, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, + 1018, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1005, 1035, 1036, 1037, + 1041, 1042, 1043, 1044, 1045, 991, 1036, 1046, 1047, 1048, + 1049, 1051, 1052, 1053, 1010, 1054, 1056, 1058, 1061, 1063, + 1064, 1065, 1066, 1067, 1069, 1070, 1065, 1072, 1073, 1074, + 1075, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1091, 1092, 1067, 1093, 1095, 1096, + 1097, 1098, 1100, 1101, 1102, 1103, 1104, 1107, 1109, 1110, + 1112, 1113, 1114, 1115, 1117, 1119, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1137, 1138, 1139, 1140, 1141, 1144, 1147, 1148, 1151, 1152, - 1153, 1154, 1155, 1156, 1158, 1160, 1162, 1163, 1164, 1166, - 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1177, - 1178, 1140, 1179, 1181, 1182, 1183, 1184, 1185, 1186, 1188, - 1189, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1203, 1206, 1207, 1209, 1210, 1212, 1213, 1214, 1215, 1217, - 1218, 1219, 1220, 1221, 1222, 1224, 1225, 1226, 1227, 1228, - 1229, 1230, 1232, 1233, 1234, 1235, 1237, 1238, 1239, 1240, - 1241, 1242, 1243, 1244, 1245, 1248, 1250, 1251, 1252, 1254, - 1255, 1256, 1258, 1259, 1260, 1262, 1263, 1264, 1265, 1266, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, 1145, + 1146, 1147, 1148, 1121, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1166, + 1169, 1170, 1173, 1175, 1176, 1177, 1178, 1179, 1180, 1182, + 1184, 1186, 1187, 1188, 1190, 1191, 1192, 1193, 1194, 1195, + 1196, 1197, 1198, 1199, 1201, 1162, 1202, 1203, 1205, 1206, + 1207, 1208, 1209, 1210, 1211, 1213, 1214, 1216, 1217, 1218, + 1219, 1220, 1221, 1222, 1223, 1224, 1228, 1231, 1232, 1234, + 1235, 1236, 1238, 1239, 1240, 1241, 1243, 1244, 1245, 1246, + 1247, 1248, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, - 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, - 1277, 1278, 1279, 1280, 1282, 1283, 1284, 1285, 1286, 1287, - 1291, 1292, 1293, 1295, 1296, 1297, 1298, 1299, 1300, 1301, - 1303, 1304, 1307, 1307, 1307, 1307, 1307, 1308, 1308, 1308, - 1308, 1308, 1309, 1315, 1309, 1309, 1309, 1310, 1316, 1310, - 1317, 1310, 1311, 1311, 1311, 1311, 1311, 1312, 1312, 1312, - 1312, 1312, 1313, 1318, 1313, 1313, 1313, 1314, 1314, 1314, - 717, 716, 715, 714, 713, 712, 711, 710, 709, 708, - 707, 706, 705, 703, 702, 701, 700, 699, 698, 697, - 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, + 1259, 1260, 1261, 1262, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1276, 1278, 1279, 1280, 1282, 1284, + 1285, 1287, 1288, 1289, 1291, 1292, 1293, 1294, 1295, 1296, + 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1308, 1309, 1311, 1312, 1313, 1314, 1315, 1316, 1320, + 1321, 1322, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1332, + 1333, 1336, 1336, 1336, 1336, 1336, 1337, 1337, 1337, 1337, + 1337, 1338, 1344, 1338, 1338, 1338, 1339, 1345, 1339, 1346, + 1339, 1340, 1340, 1340, 1340, 1340, 1341, 1341, 1341, 1341, + 1341, 1342, 1347, 1342, 1342, 1342, 1343, 1343, 1343, 718, - 686, 685, 684, 682, 680, 679, 678, 677, 676, 675, - 674, 673, 672, 669, 668, 665, 664, 663, 662, 661, - 660, 659, 658, 657, 656, 655, 654, 653, 652, 651, - 650, 649, 647, 646, 645, 644, 643, 642, 641, 639, + 717, 716, 715, 713, 712, 711, 710, 709, 708, 707, + 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, + 696, 695, 694, 693, 692, 690, 688, 687, 686, 685, + 684, 683, 682, 681, 680, 677, 676, 673, 672, 671, + 670, 669, 668, 667, 666, 665, 664, 663, 662, 661, + 660, 659, 658, 657, 655, 654, 653, 652, 651, 650, + 649, 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, - 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, - 608, 607, 606, 605, 603, 602, 598, 597, 596, 594, - 593, 591, 590, 589, 588, 585, 584, 583, 582, 581, - 580, 579, 578, 577, 575, 574, 573, 572, 571, 570, + 618, 617, 616, 615, 614, 613, 612, 611, 609, 608, - 569, 568, 566, 565, 564, 563, 561, 560, 559, 558, - 556, 555, 553, 552, 551, 550, 549, 548, 547, 546, - 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, - 535, 534, 533, 532, 530, 529, 528, 527, 526, 525, - 524, 523, 522, 521, 520, 519, 518, 517, 516, 515, - 514, 513, 507, 505, 502, 501, 500, 499, 497, 496, - 495, 493, 492, 489, 488, 487, 486, 485, 484, 483, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 472, 471, 470, 468, 466, 465, 464, 463, 462, 461, - 460, 459, 457, 456, 455, 454, 452, 451, 450, 449, + 604, 603, 602, 600, 599, 597, 596, 595, 594, 591, + 590, 589, 588, 587, 586, 585, 584, 583, 581, 580, + 579, 578, 577, 576, 575, 574, 572, 571, 570, 569, + 567, 566, 565, 564, 562, 561, 559, 558, 557, 556, + 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, + 545, 544, 543, 542, 541, 540, 539, 538, 536, 535, + 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, + 524, 523, 522, 521, 520, 519, 518, 517, 511, 509, + 506, 505, 504, 503, 501, 500, 499, 497, 496, 493, + 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, + 482, 481, 480, 479, 478, 477, 476, 475, 474, 472, + 470, 469, 468, 467, 466, 465, 464, 463, 461, 460, + 459, 458, 456, 455, 454, 453, 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 434, 432, 431, 430, 428, 427, - 426, 425, 424, 422, 421, 419, 418, 416, 415, 414, - 413, 411, 410, 409, 408, 403, 402, 400, 399, 398, - 397, 396, 394, 393, 391, 388, 386, 385, 383, 382, - 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, - 371, 370, 369, 368, 367, 366, 365, 363, 362, 361, - 360, 358, 357, 356, 355, 354, 353, 352, 351, 350, - 348, 345, 344, 343, 342, 341, 339, 338, 337, 336, - 335, 334, 333, 332, 331, 330, 328, 327, 326, 325, + 438, 436, 435, 434, 432, 431, 429, 428, 427, 425, + 424, 422, 421, 419, 418, 417, 416, 414, 413, 412, + 411, 406, 405, 403, 402, 401, 400, 399, 397, 396, + 394, 391, 389, 388, 386, 385, 384, 383, 382, 381, + 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, + 370, 369, 368, 366, 365, 364, 363, 361, 360, 359, - 324, 323, 322, 321, 320, 319, 318, 316, 315, 314, - 313, 310, 309, 308, 307, 306, 305, 301, 299, 296, - 295, 292, 288, 281, 279, 278, 277, 276, 275, 274, - 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, - 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, - 252, 251, 250, 248, 247, 246, 245, 243, 242, 241, - 240, 238, 237, 236, 235, 234, 233, 232, 231, 230, - 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, - 218, 217, 216, 215, 214, 213, 212, 211, 210, 208, - 207, 206, 205, 204, 202, 199, 197, 195, 193, 190, + 358, 357, 356, 355, 354, 353, 351, 348, 347, 346, + 345, 344, 342, 341, 340, 339, 338, 337, 336, 335, + 334, 333, 331, 330, 329, 328, 327, 326, 325, 324, + 323, 322, 321, 320, 318, 317, 316, 315, 312, 311, + 310, 309, 308, 307, 303, 301, 298, 297, 294, 290, + 283, 281, 280, 279, 278, 277, 276, 275, 274, 273, + 272, 271, 270, 269, 268, 267, 266, 264, 263, 262, + 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, + 250, 249, 248, 247, 245, 244, 243, 242, 240, 239, + 238, 237, 236, 235, 234, 233, 232, 230, 229, 228, - 189, 187, 184, 176, 175, 174, 172, 171, 170, 169, - 168, 167, 165, 162, 160, 158, 157, 156, 155, 154, - 152, 151, 150, 149, 147, 146, 145, 144, 143, 142, - 141, 140, 139, 138, 136, 134, 132, 131, 130, 129, - 127, 126, 125, 123, 122, 121, 120, 116, 110, 107, - 106, 104, 99, 98, 79, 74, 65, 60, 53, 50, - 49, 47, 43, 41, 39, 38, 24, 14, 11, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, + 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, + 217, 216, 215, 214, 213, 212, 211, 209, 208, 207, + 206, 205, 203, 200, 198, 196, 194, 191, 190, 188, + 185, 177, 176, 175, 173, 172, 171, 170, 169, 168, + 166, 163, 161, 159, 158, 157, 156, 155, 153, 152, + 151, 150, 148, 147, 146, 145, 144, 143, 142, 141, + 140, 139, 137, 135, 134, 132, 131, 130, 129, 127, + 126, 125, 123, 122, 121, 120, 116, 110, 107, 106, + 104, 99, 98, 79, 74, 65, 60, 53, 50, 49, + 47, 43, 41, 39, 38, 24, 14, 11, 1335, 1335, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1306 + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, + 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335 } ; static yy_state_type yy_last_accepting_state; @@ -1588,25 +1601,26 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[161] = +static const flex_int16_t yy_rule_linenum[163] = { 0, 143, 145, 147, 152, 153, 158, 159, 160, 172, 175, 180, 187, 196, 205, 214, 223, 233, 242, 251, 260, 269, 278, 287, 296, 305, 316, 325, 334, 343, 352, 362, 372, 382, 392, 402, 412, 422, 432, 442, 453, - 464, 475, 484, 494, 503, 513, 528, 544, 553, 562, - 571, 580, 590, 599, 608, 618, 627, 637, 646, 655, - 664, 674, 683, 692, 701, 710, 720, 729, 738, 747, - 756, 765, 774, 783, 792, 801, 810, 820, 832, 842, - 851, 861, 871, 881, 891, 901, 910, 920, 929, 938, - 947, 956, 966, 976, 986, 995, 1004, 1013, 1022, 1031, + 464, 475, 484, 494, 503, 513, 527, 542, 551, 560, + 569, 578, 588, 597, 606, 616, 625, 635, 644, 653, + 662, 672, 681, 690, 699, 708, 718, 727, 736, 745, + 754, 763, 772, 781, 790, 799, 808, 818, 829, 841, + 850, 859, 868, 878, 888, 898, 908, 918, 927, 937, + 946, 955, 964, 973, 983, 993, 1003, 1012, 1021, 1030, - 1040, 1049, 1058, 1067, 1076, 1085, 1094, 1103, 1112, 1121, - 1130, 1139, 1148, 1157, 1166, 1175, 1184, 1193, 1202, 1211, - 1220, 1229, 1238, 1248, 1258, 1268, 1278, 1288, 1298, 1308, - 1318, 1328, 1337, 1346, 1355, 1364, 1373, 1382, 1391, 1402, - 1415, 1428, 1443, 1541, 1546, 1551, 1556, 1557, 1558, 1559, - 1560, 1561, 1563, 1581, 1594, 1599, 1603, 1605, 1607, 1609 + 1039, 1048, 1057, 1066, 1075, 1084, 1093, 1102, 1111, 1120, + 1129, 1138, 1147, 1156, 1165, 1174, 1183, 1192, 1201, 1210, + 1219, 1228, 1237, 1246, 1255, 1265, 1275, 1285, 1295, 1305, + 1315, 1325, 1335, 1345, 1354, 1363, 1372, 1381, 1390, 1399, + 1408, 1419, 1432, 1445, 1460, 1558, 1563, 1568, 1573, 1574, + 1575, 1576, 1577, 1578, 1580, 1598, 1611, 1616, 1620, 1622, + 1624, 1626 } ; /* The intent behind this definition is that it'll catch @@ -1659,7 +1673,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg) -#line 1662 "dhcp4_lexer.cc" +#line 1676 "dhcp4_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1685,8 +1699,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1688 "dhcp4_lexer.cc" -#line 1689 "dhcp4_lexer.cc" +#line 1702 "dhcp4_lexer.cc" +#line 1703 "dhcp4_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2012,7 +2026,7 @@ YY_DECL } -#line 2015 "dhcp4_lexer.cc" +#line 2029 "dhcp4_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2041,13 +2055,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1307 ) + if ( yy_current_state >= 1336 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1306 ); + while ( yy_current_state != 1335 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2066,13 +2080,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 161 ) + else if ( yy_act < 163 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 161 ) + else if ( yy_act == 163 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 162 ) + else if ( yy_act == 164 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2615,7 +2629,6 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::RESERVATIONS: case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: return isc::dhcp::Dhcp4Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("option-data", driver.loc_); @@ -2624,7 +2637,7 @@ YY_RULE_SETUP YY_BREAK case 47: YY_RULE_SETUP -#line 528 "dhcp4_lexer.ll" +#line 527 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2632,7 +2645,6 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::OPTION_DEF: case isc::dhcp::Parser4Context::OPTION_DATA: case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::LOGGERS: return isc::dhcp::Dhcp4Parser::make_NAME(driver.loc_); @@ -2643,7 +2655,7 @@ YY_RULE_SETUP YY_BREAK case 48: YY_RULE_SETUP -#line 544 "dhcp4_lexer.ll" +#line 542 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -2655,7 +2667,7 @@ YY_RULE_SETUP YY_BREAK case 49: YY_RULE_SETUP -#line 553 "dhcp4_lexer.ll" +#line 551 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -2667,7 +2679,7 @@ YY_RULE_SETUP YY_BREAK case 50: YY_RULE_SETUP -#line 562 "dhcp4_lexer.ll" +#line 560 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2679,7 +2691,7 @@ YY_RULE_SETUP YY_BREAK case 51: YY_RULE_SETUP -#line 571 "dhcp4_lexer.ll" +#line 569 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::POOLS: @@ -2691,7 +2703,7 @@ YY_RULE_SETUP YY_BREAK case 52: YY_RULE_SETUP -#line 580 "dhcp4_lexer.ll" +#line 578 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2704,7 +2716,7 @@ YY_RULE_SETUP YY_BREAK case 53: YY_RULE_SETUP -#line 590 "dhcp4_lexer.ll" +#line 588 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::POOLS: @@ -2716,7 +2728,7 @@ YY_RULE_SETUP YY_BREAK case 54: YY_RULE_SETUP -#line 599 "dhcp4_lexer.ll" +#line 597 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::KNOWN_CLIENTS: @@ -2728,7 +2740,7 @@ YY_RULE_SETUP YY_BREAK case 55: YY_RULE_SETUP -#line 608 "dhcp4_lexer.ll" +#line 606 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::KNOWN_CLIENTS: @@ -2741,7 +2753,7 @@ YY_RULE_SETUP YY_BREAK case 56: YY_RULE_SETUP -#line 618 "dhcp4_lexer.ll" +#line 616 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2753,7 +2765,7 @@ YY_RULE_SETUP YY_BREAK case 57: YY_RULE_SETUP -#line 627 "dhcp4_lexer.ll" +#line 625 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2766,7 +2778,7 @@ YY_RULE_SETUP YY_BREAK case 58: YY_RULE_SETUP -#line 637 "dhcp4_lexer.ll" +#line 635 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2778,7 +2790,7 @@ YY_RULE_SETUP YY_BREAK case 59: YY_RULE_SETUP -#line 646 "dhcp4_lexer.ll" +#line 644 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2790,7 +2802,7 @@ YY_RULE_SETUP YY_BREAK case 60: YY_RULE_SETUP -#line 655 "dhcp4_lexer.ll" +#line 653 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2802,7 +2814,7 @@ YY_RULE_SETUP YY_BREAK case 61: YY_RULE_SETUP -#line 664 "dhcp4_lexer.ll" +#line 662 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2815,7 +2827,7 @@ YY_RULE_SETUP YY_BREAK case 62: YY_RULE_SETUP -#line 674 "dhcp4_lexer.ll" +#line 672 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2827,7 +2839,7 @@ YY_RULE_SETUP YY_BREAK case 63: YY_RULE_SETUP -#line 683 "dhcp4_lexer.ll" +#line 681 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2839,7 +2851,7 @@ YY_RULE_SETUP YY_BREAK case 64: YY_RULE_SETUP -#line 692 "dhcp4_lexer.ll" +#line 690 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2851,7 +2863,7 @@ YY_RULE_SETUP YY_BREAK case 65: YY_RULE_SETUP -#line 701 "dhcp4_lexer.ll" +#line 699 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2863,7 +2875,7 @@ YY_RULE_SETUP YY_BREAK case 66: YY_RULE_SETUP -#line 710 "dhcp4_lexer.ll" +#line 708 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -2876,7 +2888,7 @@ YY_RULE_SETUP YY_BREAK case 67: YY_RULE_SETUP -#line 720 "dhcp4_lexer.ll" +#line 718 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2888,7 +2900,7 @@ YY_RULE_SETUP YY_BREAK case 68: YY_RULE_SETUP -#line 729 "dhcp4_lexer.ll" +#line 727 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -2900,7 +2912,7 @@ YY_RULE_SETUP YY_BREAK case 69: YY_RULE_SETUP -#line 738 "dhcp4_lexer.ll" +#line 736 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGING: @@ -2912,7 +2924,7 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 747 "dhcp4_lexer.ll" +#line 745 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2924,7 +2936,7 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 756 "dhcp4_lexer.ll" +#line 754 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2936,7 +2948,7 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 765 "dhcp4_lexer.ll" +#line 763 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2948,7 +2960,7 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 774 "dhcp4_lexer.ll" +#line 772 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2960,7 +2972,7 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 783 "dhcp4_lexer.ll" +#line 781 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2972,7 +2984,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 792 "dhcp4_lexer.ll" +#line 790 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2984,7 +2996,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 801 "dhcp4_lexer.ll" +#line 799 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2996,7 +3008,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 810 "dhcp4_lexer.ll" +#line 808 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3009,7 +3021,21 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 820 "dhcp4_lexer.ll" +#line 818 "dhcp4_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: + case isc::dhcp::Parser4Context::SHARED_NETWORK: + return isc::dhcp::Dhcp4Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + } +} + YY_BREAK +case 79: +YY_RULE_SETUP +#line 829 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3022,22 +3048,33 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 80: YY_RULE_SETUP -#line 832 "dhcp4_lexer.ll" +#line 841 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: - case isc::dhcp::Parser4Context::CLIENT_CLASS: return isc::dhcp::Dhcp4Parser::make_TEST(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("test", driver.loc_); } } YY_BREAK -case 80: +case 81: YY_RULE_SETUP -#line 842 "dhcp4_lexer.ll" +#line 850 "dhcp4_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::CLIENT_CLASSES: + return isc::dhcp::Dhcp4Parser::make_EVAL_ON_DEMAND(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-on-demand", driver.loc_); + } +} + YY_BREAK +case 82: +YY_RULE_SETUP +#line 859 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3047,9 +3084,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 83: YY_RULE_SETUP -#line 851 "dhcp4_lexer.ll" +#line 868 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3060,9 +3097,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 84: YY_RULE_SETUP -#line 861 "dhcp4_lexer.ll" +#line 878 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3073,9 +3110,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 85: YY_RULE_SETUP -#line 871 "dhcp4_lexer.ll" +#line 888 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3086,9 +3123,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 86: YY_RULE_SETUP -#line 881 "dhcp4_lexer.ll" +#line 898 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3099,9 +3136,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 87: YY_RULE_SETUP -#line 891 "dhcp4_lexer.ll" +#line 908 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3112,9 +3149,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 88: YY_RULE_SETUP -#line 901 "dhcp4_lexer.ll" +#line 918 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3124,9 +3161,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 89: YY_RULE_SETUP -#line 910 "dhcp4_lexer.ll" +#line 927 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3137,9 +3174,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 90: YY_RULE_SETUP -#line 920 "dhcp4_lexer.ll" +#line 937 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3149,9 +3186,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 91: YY_RULE_SETUP -#line 929 "dhcp4_lexer.ll" +#line 946 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3161,9 +3198,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 92: YY_RULE_SETUP -#line 938 "dhcp4_lexer.ll" +#line 955 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3173,9 +3210,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 93: YY_RULE_SETUP -#line 947 "dhcp4_lexer.ll" +#line 964 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3185,9 +3222,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 94: YY_RULE_SETUP -#line 956 "dhcp4_lexer.ll" +#line 973 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3198,9 +3235,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 95: YY_RULE_SETUP -#line 966 "dhcp4_lexer.ll" +#line 983 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3211,9 +3248,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 96: YY_RULE_SETUP -#line 976 "dhcp4_lexer.ll" +#line 993 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3223,9 +3260,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 97: YY_RULE_SETUP -#line 986 "dhcp4_lexer.ll" +#line 1003 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3235,9 +3272,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 98: YY_RULE_SETUP -#line 995 "dhcp4_lexer.ll" +#line 1012 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3247,9 +3284,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 99: YY_RULE_SETUP -#line 1004 "dhcp4_lexer.ll" +#line 1021 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3259,9 +3296,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 100: YY_RULE_SETUP -#line 1013 "dhcp4_lexer.ll" +#line 1030 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3271,9 +3308,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 101: YY_RULE_SETUP -#line 1022 "dhcp4_lexer.ll" +#line 1039 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3283,9 +3320,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 102: YY_RULE_SETUP -#line 1031 "dhcp4_lexer.ll" +#line 1048 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3295,9 +3332,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 103: YY_RULE_SETUP -#line 1040 "dhcp4_lexer.ll" +#line 1057 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3307,9 +3344,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 104: YY_RULE_SETUP -#line 1049 "dhcp4_lexer.ll" +#line 1066 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3319,9 +3356,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 105: YY_RULE_SETUP -#line 1058 "dhcp4_lexer.ll" +#line 1075 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3331,9 +3368,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 106: YY_RULE_SETUP -#line 1067 "dhcp4_lexer.ll" +#line 1084 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3343,9 +3380,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 107: YY_RULE_SETUP -#line 1076 "dhcp4_lexer.ll" +#line 1093 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3355,9 +3392,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 108: YY_RULE_SETUP -#line 1085 "dhcp4_lexer.ll" +#line 1102 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3367,9 +3404,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 109: YY_RULE_SETUP -#line 1094 "dhcp4_lexer.ll" +#line 1111 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3379,9 +3416,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 110: YY_RULE_SETUP -#line 1103 "dhcp4_lexer.ll" +#line 1120 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3391,9 +3428,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 111: YY_RULE_SETUP -#line 1112 "dhcp4_lexer.ll" +#line 1129 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3403,9 +3440,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 112: YY_RULE_SETUP -#line 1121 "dhcp4_lexer.ll" +#line 1138 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3415,9 +3452,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 113: YY_RULE_SETUP -#line 1130 "dhcp4_lexer.ll" +#line 1147 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3427,9 +3464,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 114: YY_RULE_SETUP -#line 1139 "dhcp4_lexer.ll" +#line 1156 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3439,9 +3476,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 115: YY_RULE_SETUP -#line 1148 "dhcp4_lexer.ll" +#line 1165 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3451,9 +3488,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 116: YY_RULE_SETUP -#line 1157 "dhcp4_lexer.ll" +#line 1174 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3463,9 +3500,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 117: YY_RULE_SETUP -#line 1166 "dhcp4_lexer.ll" +#line 1183 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3475,9 +3512,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 118: YY_RULE_SETUP -#line 1175 "dhcp4_lexer.ll" +#line 1192 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3487,9 +3524,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 119: YY_RULE_SETUP -#line 1184 "dhcp4_lexer.ll" +#line 1201 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3499,9 +3536,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 120: YY_RULE_SETUP -#line 1193 "dhcp4_lexer.ll" +#line 1210 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3511,9 +3548,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 121: YY_RULE_SETUP -#line 1202 "dhcp4_lexer.ll" +#line 1219 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3523,9 +3560,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 122: YY_RULE_SETUP -#line 1211 "dhcp4_lexer.ll" +#line 1228 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3535,9 +3572,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 123: YY_RULE_SETUP -#line 1220 "dhcp4_lexer.ll" +#line 1237 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3547,9 +3584,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 124: YY_RULE_SETUP -#line 1229 "dhcp4_lexer.ll" +#line 1246 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3559,9 +3596,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 125: YY_RULE_SETUP -#line 1238 "dhcp4_lexer.ll" +#line 1255 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3572,9 +3609,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 124: +case 126: YY_RULE_SETUP -#line 1248 "dhcp4_lexer.ll" +#line 1265 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3585,9 +3622,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 125: +case 127: YY_RULE_SETUP -#line 1258 "dhcp4_lexer.ll" +#line 1275 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3598,39 +3635,13 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 126: -YY_RULE_SETUP -#line 1268 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK -case 127: -YY_RULE_SETUP -#line 1278 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK case 128: YY_RULE_SETUP -#line 1288 "dhcp4_lexer.ll" +#line 1285 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); } std::string tmp(yytext+1); tmp.resize(tmp.size() - 1); @@ -3639,7 +3650,20 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1298 "dhcp4_lexer.ll" +#line 1295 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 130: +YY_RULE_SETUP +#line 1305 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3650,9 +3674,22 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 130: +case 131: YY_RULE_SETUP -#line 1308 "dhcp4_lexer.ll" +#line 1315 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 132: +YY_RULE_SETUP +#line 1325 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3663,9 +3700,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 131: +case 133: YY_RULE_SETUP -#line 1318 "dhcp4_lexer.ll" +#line 1335 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3676,9 +3713,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 132: +case 134: YY_RULE_SETUP -#line 1328 "dhcp4_lexer.ll" +#line 1345 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3688,9 +3725,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 135: YY_RULE_SETUP -#line 1337 "dhcp4_lexer.ll" +#line 1354 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3700,9 +3737,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 136: YY_RULE_SETUP -#line 1346 "dhcp4_lexer.ll" +#line 1363 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3712,9 +3749,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 137: YY_RULE_SETUP -#line 1355 "dhcp4_lexer.ll" +#line 1372 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3724,9 +3761,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 138: YY_RULE_SETUP -#line 1364 "dhcp4_lexer.ll" +#line 1381 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3736,9 +3773,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 139: YY_RULE_SETUP -#line 1373 "dhcp4_lexer.ll" +#line 1390 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3748,9 +3785,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 140: YY_RULE_SETUP -#line 1382 "dhcp4_lexer.ll" +#line 1399 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3760,9 +3797,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 141: YY_RULE_SETUP -#line 1391 "dhcp4_lexer.ll" +#line 1408 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3774,9 +3811,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 142: YY_RULE_SETUP -#line 1402 "dhcp4_lexer.ll" +#line 1419 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3790,9 +3827,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 143: YY_RULE_SETUP -#line 1415 "dhcp4_lexer.ll" +#line 1432 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3806,9 +3843,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 144: YY_RULE_SETUP -#line 1428 "dhcp4_lexer.ll" +#line 1445 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3822,9 +3859,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 145: YY_RULE_SETUP -#line 1443 "dhcp4_lexer.ll" +#line 1460 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3923,65 +3960,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 144: -/* rule 144 can match eol */ +case 146: +/* rule 146 can match eol */ YY_RULE_SETUP -#line 1541 "dhcp4_lexer.ll" +#line 1558 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 145: -/* rule 145 can match eol */ +case 147: +/* rule 147 can match eol */ YY_RULE_SETUP -#line 1546 "dhcp4_lexer.ll" +#line 1563 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 146: +case 148: YY_RULE_SETUP -#line 1551 "dhcp4_lexer.ll" +#line 1568 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 147: -YY_RULE_SETUP -#line 1556 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 148: -YY_RULE_SETUP -#line 1557 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } - YY_BREAK case 149: YY_RULE_SETUP -#line 1558 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1573 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1559 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1574 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1560 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } +#line 1575 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1561 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } +#line 1576 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1563 "dhcp4_lexer.ll" +#line 1577 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } + YY_BREAK +case 154: +YY_RULE_SETUP +#line 1578 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 1580 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4000,9 +4037,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 154: +case 156: YY_RULE_SETUP -#line 1581 "dhcp4_lexer.ll" +#line 1598 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4016,43 +4053,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 155: +case 157: YY_RULE_SETUP -#line 1594 "dhcp4_lexer.ll" +#line 1611 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 156: +case 158: YY_RULE_SETUP -#line 1599 "dhcp4_lexer.ll" +#line 1616 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 157: -YY_RULE_SETUP -#line 1603 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK -case 158: -YY_RULE_SETUP -#line 1605 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK case 159: YY_RULE_SETUP -#line 1607 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); +#line 1620 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1609 "dhcp4_lexer.ll" +#line 1622 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK +case 161: +YY_RULE_SETUP +#line 1624 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 162: +YY_RULE_SETUP +#line 1626 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1611 "dhcp4_lexer.ll" +#line 1628 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4076,12 +4113,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 161: +case 163: YY_RULE_SETUP -#line 1634 "dhcp4_lexer.ll" +#line 1651 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4084 "dhcp4_lexer.cc" +#line 4121 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4400,7 +4437,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1307 ) + if ( yy_current_state >= 1336 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4433,11 +4470,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1307 ) + if ( yy_current_state >= 1336 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1306); + yy_is_jam = (yy_current_state == 1335); return yy_is_jam ? 0 : yy_current_state; } @@ -5186,7 +5223,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1634 "dhcp4_lexer.ll" +#line 1651 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index 2ba542bbe0..d69aa47e56 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -253,31 +253,31 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 151: // "boolean" + case 153: // "boolean" value.move< bool > (that.value); break; - case 150: // "floating point" + case 152: // "floating point" value.move< double > (that.value); break; - case 149: // "integer" + case 151: // "integer" value.move< int64_t > (that.value); break; - case 148: // "constant string" + case 150: // "constant string" value.move< std::string > (that.value); break; @@ -296,31 +296,31 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 151: // "boolean" + case 153: // "boolean" value.copy< bool > (that.value); break; - case 150: // "floating point" + case 152: // "floating point" value.copy< double > (that.value); break; - case 149: // "integer" + case 151: // "integer" value.copy< int64_t > (that.value); break; - case 148: // "constant string" + case 150: // "constant string" value.copy< std::string > (that.value); break; @@ -360,93 +360,93 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 148: // "constant string" + case 150: // "constant string" -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 368 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 149: // "integer" + case 151: // "integer" -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } #line 375 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 150: // "floating point" + case 152: // "floating point" -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } #line 382 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 151: // "boolean" + case 153: // "boolean" -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } #line 389 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 166: // value + case 168: // value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 396 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 170: // map_value + case 172: // map_value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 403 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 208: // socket_type + case 210: // socket_type -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 410 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 211: // outbound_interface_value + case 213: // outbound_interface_value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 417 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 221: // db_type + case 223: // db_type -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 424 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 298: // hr_mode + case 302: // hr_mode -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 431 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 369: // known_clients_value + case 373: // known_clients_value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 438 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 445: // ncr_protocol_value + case 450: // ncr_protocol_value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 445 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 453: // replace_client_name_value + case 458: // replace_client_name_value -#line 227 "dhcp4_parser.yy" // lalr1.cc:636 +#line 229 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 452 "dhcp4_parser.cc" // lalr1.cc:636 break; @@ -648,31 +648,31 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 151: // "boolean" + case 153: // "boolean" yylhs.value.build< bool > (); break; - case 150: // "floating point" + case 152: // "floating point" yylhs.value.build< double > (); break; - case 149: // "integer" + case 151: // "integer" yylhs.value.build< int64_t > (); break; - case 148: // "constant string" + case 150: // "constant string" yylhs.value.build< std::string > (); break; @@ -694,121 +694,121 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 236 "dhcp4_parser.yy" // lalr1.cc:859 +#line 238 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } #line 700 "dhcp4_parser.cc" // lalr1.cc:859 break; case 4: -#line 237 "dhcp4_parser.yy" // lalr1.cc:859 +#line 239 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } #line 706 "dhcp4_parser.cc" // lalr1.cc:859 break; case 6: -#line 238 "dhcp4_parser.yy" // lalr1.cc:859 +#line 240 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } #line 712 "dhcp4_parser.cc" // lalr1.cc:859 break; case 8: -#line 239 "dhcp4_parser.yy" // lalr1.cc:859 +#line 241 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } #line 718 "dhcp4_parser.cc" // lalr1.cc:859 break; case 10: -#line 240 "dhcp4_parser.yy" // lalr1.cc:859 +#line 242 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET4; } #line 724 "dhcp4_parser.cc" // lalr1.cc:859 break; case 12: -#line 241 "dhcp4_parser.yy" // lalr1.cc:859 +#line 243 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } #line 730 "dhcp4_parser.cc" // lalr1.cc:859 break; case 14: -#line 242 "dhcp4_parser.yy" // lalr1.cc:859 +#line 244 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } #line 736 "dhcp4_parser.cc" // lalr1.cc:859 break; case 16: -#line 243 "dhcp4_parser.yy" // lalr1.cc:859 +#line 245 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } #line 742 "dhcp4_parser.cc" // lalr1.cc:859 break; case 18: -#line 244 "dhcp4_parser.yy" // lalr1.cc:859 +#line 246 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } #line 748 "dhcp4_parser.cc" // lalr1.cc:859 break; case 20: -#line 245 "dhcp4_parser.yy" // lalr1.cc:859 +#line 247 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } #line 754 "dhcp4_parser.cc" // lalr1.cc:859 break; case 22: -#line 246 "dhcp4_parser.yy" // lalr1.cc:859 +#line 248 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } #line 760 "dhcp4_parser.cc" // lalr1.cc:859 break; case 24: -#line 247 "dhcp4_parser.yy" // lalr1.cc:859 +#line 249 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } #line 766 "dhcp4_parser.cc" // lalr1.cc:859 break; case 26: -#line 255 "dhcp4_parser.yy" // lalr1.cc:859 +#line 257 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } #line 772 "dhcp4_parser.cc" // lalr1.cc:859 break; case 27: -#line 256 "dhcp4_parser.yy" // lalr1.cc:859 +#line 258 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } #line 778 "dhcp4_parser.cc" // lalr1.cc:859 break; case 28: -#line 257 "dhcp4_parser.yy" // lalr1.cc:859 +#line 259 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } #line 784 "dhcp4_parser.cc" // lalr1.cc:859 break; case 29: -#line 258 "dhcp4_parser.yy" // lalr1.cc:859 +#line 260 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } #line 790 "dhcp4_parser.cc" // lalr1.cc:859 break; case 30: -#line 259 "dhcp4_parser.yy" // lalr1.cc:859 +#line 261 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } #line 796 "dhcp4_parser.cc" // lalr1.cc:859 break; case 31: -#line 260 "dhcp4_parser.yy" // lalr1.cc:859 +#line 262 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 802 "dhcp4_parser.cc" // lalr1.cc:859 break; case 32: -#line 261 "dhcp4_parser.yy" // lalr1.cc:859 +#line 263 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 808 "dhcp4_parser.cc" // lalr1.cc:859 break; case 33: -#line 264 "dhcp4_parser.yy" // lalr1.cc:859 +#line 266 "dhcp4_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); @@ -817,7 +817,7 @@ namespace isc { namespace dhcp { break; case 34: -#line 269 "dhcp4_parser.yy" // lalr1.cc:859 +#line 271 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -828,7 +828,7 @@ namespace isc { namespace dhcp { break; case 35: -#line 274 "dhcp4_parser.yy" // lalr1.cc:859 +#line 276 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -838,13 +838,13 @@ namespace isc { namespace dhcp { break; case 36: -#line 280 "dhcp4_parser.yy" // lalr1.cc:859 +#line 282 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 844 "dhcp4_parser.cc" // lalr1.cc:859 break; case 39: -#line 287 "dhcp4_parser.yy" // lalr1.cc:859 +#line 289 "dhcp4_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); @@ -853,7 +853,7 @@ namespace isc { namespace dhcp { break; case 40: -#line 291 "dhcp4_parser.yy" // lalr1.cc:859 +#line 293 "dhcp4_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value @@ -863,7 +863,7 @@ namespace isc { namespace dhcp { break; case 41: -#line 298 "dhcp4_parser.yy" // lalr1.cc:859 +#line 300 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); @@ -872,7 +872,7 @@ namespace isc { namespace dhcp { break; case 42: -#line 301 "dhcp4_parser.yy" // lalr1.cc:859 +#line 303 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } @@ -880,7 +880,7 @@ namespace isc { namespace dhcp { break; case 45: -#line 309 "dhcp4_parser.yy" // lalr1.cc:859 +#line 311 "dhcp4_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -889,7 +889,7 @@ namespace isc { namespace dhcp { break; case 46: -#line 313 "dhcp4_parser.yy" // lalr1.cc:859 +#line 315 "dhcp4_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -898,7 +898,7 @@ namespace isc { namespace dhcp { break; case 47: -#line 320 "dhcp4_parser.yy" // lalr1.cc:859 +#line 322 "dhcp4_parser.yy" // lalr1.cc:859 { // List parsing about to start } @@ -906,7 +906,7 @@ namespace isc { namespace dhcp { break; case 48: -#line 322 "dhcp4_parser.yy" // lalr1.cc:859 +#line 324 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); @@ -915,7 +915,7 @@ namespace isc { namespace dhcp { break; case 51: -#line 331 "dhcp4_parser.yy" // lalr1.cc:859 +#line 333 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -924,7 +924,7 @@ namespace isc { namespace dhcp { break; case 52: -#line 335 "dhcp4_parser.yy" // lalr1.cc:859 +#line 337 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -933,7 +933,7 @@ namespace isc { namespace dhcp { break; case 53: -#line 346 "dhcp4_parser.yy" // lalr1.cc:859 +#line 348 "dhcp4_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); @@ -944,7 +944,7 @@ namespace isc { namespace dhcp { break; case 54: -#line 356 "dhcp4_parser.yy" // lalr1.cc:859 +#line 358 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -955,7 +955,7 @@ namespace isc { namespace dhcp { break; case 55: -#line 361 "dhcp4_parser.yy" // lalr1.cc:859 +#line 363 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -968,7 +968,7 @@ namespace isc { namespace dhcp { break; case 64: -#line 385 "dhcp4_parser.yy" // lalr1.cc:859 +#line 387 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -981,7 +981,7 @@ namespace isc { namespace dhcp { break; case 65: -#line 392 "dhcp4_parser.yy" // lalr1.cc:859 +#line 394 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); @@ -991,7 +991,7 @@ namespace isc { namespace dhcp { break; case 66: -#line 400 "dhcp4_parser.yy" // lalr1.cc:859 +#line 402 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Dhcp4 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1001,7 +1001,7 @@ namespace isc { namespace dhcp { break; case 67: -#line 404 "dhcp4_parser.yy" // lalr1.cc:859 +#line 406 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed @@ -1010,7 +1010,7 @@ namespace isc { namespace dhcp { break; case 94: -#line 441 "dhcp4_parser.yy" // lalr1.cc:859 +#line 443 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); @@ -1019,7 +1019,7 @@ namespace isc { namespace dhcp { break; case 95: -#line 446 "dhcp4_parser.yy" // lalr1.cc:859 +#line 448 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); @@ -1028,7 +1028,7 @@ namespace isc { namespace dhcp { break; case 96: -#line 451 "dhcp4_parser.yy" // lalr1.cc:859 +#line 453 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); @@ -1037,7 +1037,7 @@ namespace isc { namespace dhcp { break; case 97: -#line 456 "dhcp4_parser.yy" // lalr1.cc:859 +#line 458 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); @@ -1046,7 +1046,7 @@ namespace isc { namespace dhcp { break; case 98: -#line 461 "dhcp4_parser.yy" // lalr1.cc:859 +#line 463 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("echo-client-id", echo); @@ -1055,7 +1055,7 @@ namespace isc { namespace dhcp { break; case 99: -#line 466 "dhcp4_parser.yy" // lalr1.cc:859 +#line 468 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("match-client-id", match); @@ -1064,7 +1064,7 @@ namespace isc { namespace dhcp { break; case 100: -#line 472 "dhcp4_parser.yy" // lalr1.cc:859 +#line 474 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); @@ -1075,7 +1075,7 @@ namespace isc { namespace dhcp { break; case 101: -#line 477 "dhcp4_parser.yy" // lalr1.cc:859 +#line 479 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); @@ -1085,7 +1085,7 @@ namespace isc { namespace dhcp { break; case 108: -#line 493 "dhcp4_parser.yy" // lalr1.cc:859 +#line 495 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1095,7 +1095,7 @@ namespace isc { namespace dhcp { break; case 109: -#line 497 "dhcp4_parser.yy" // lalr1.cc:859 +#line 499 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed @@ -1104,7 +1104,7 @@ namespace isc { namespace dhcp { break; case 110: -#line 502 "dhcp4_parser.yy" // lalr1.cc:859 +#line 504 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); @@ -1115,7 +1115,7 @@ namespace isc { namespace dhcp { break; case 111: -#line 507 "dhcp4_parser.yy" // lalr1.cc:859 +#line 509 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1124,7 +1124,7 @@ namespace isc { namespace dhcp { break; case 112: -#line 512 "dhcp4_parser.yy" // lalr1.cc:859 +#line 514 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DHCP_SOCKET_TYPE); } @@ -1132,7 +1132,7 @@ namespace isc { namespace dhcp { break; case 113: -#line 514 "dhcp4_parser.yy" // lalr1.cc:859 +#line 516 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1141,19 +1141,19 @@ namespace isc { namespace dhcp { break; case 114: -#line 519 "dhcp4_parser.yy" // lalr1.cc:859 +#line 521 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); } #line 1147 "dhcp4_parser.cc" // lalr1.cc:859 break; case 115: -#line 520 "dhcp4_parser.yy" // lalr1.cc:859 +#line 522 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); } #line 1153 "dhcp4_parser.cc" // lalr1.cc:859 break; case 116: -#line 523 "dhcp4_parser.yy" // lalr1.cc:859 +#line 525 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.OUTBOUND_INTERFACE); } @@ -1161,7 +1161,7 @@ namespace isc { namespace dhcp { break; case 117: -#line 525 "dhcp4_parser.yy" // lalr1.cc:859 +#line 527 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1170,7 +1170,7 @@ namespace isc { namespace dhcp { break; case 118: -#line 530 "dhcp4_parser.yy" // lalr1.cc:859 +#line 532 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location))); } @@ -1178,7 +1178,7 @@ namespace isc { namespace dhcp { break; case 119: -#line 532 "dhcp4_parser.yy" // lalr1.cc:859 +#line 534 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location))); } @@ -1186,7 +1186,7 @@ namespace isc { namespace dhcp { break; case 120: -#line 536 "dhcp4_parser.yy" // lalr1.cc:859 +#line 538 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); @@ -1195,7 +1195,7 @@ namespace isc { namespace dhcp { break; case 121: -#line 542 "dhcp4_parser.yy" // lalr1.cc:859 +#line 544 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); @@ -1206,7 +1206,7 @@ namespace isc { namespace dhcp { break; case 122: -#line 547 "dhcp4_parser.yy" // lalr1.cc:859 +#line 549 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1217,7 +1217,7 @@ namespace isc { namespace dhcp { break; case 123: -#line 554 "dhcp4_parser.yy" // lalr1.cc:859 +#line 556 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); @@ -1228,7 +1228,7 @@ namespace isc { namespace dhcp { break; case 124: -#line 559 "dhcp4_parser.yy" // lalr1.cc:859 +#line 561 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1239,7 +1239,7 @@ namespace isc { namespace dhcp { break; case 140: -#line 585 "dhcp4_parser.yy" // lalr1.cc:859 +#line 587 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } @@ -1247,7 +1247,7 @@ namespace isc { namespace dhcp { break; case 141: -#line 587 "dhcp4_parser.yy" // lalr1.cc:859 +#line 589 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1256,31 +1256,31 @@ namespace isc { namespace dhcp { break; case 142: -#line 592 "dhcp4_parser.yy" // lalr1.cc:859 +#line 594 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } #line 1262 "dhcp4_parser.cc" // lalr1.cc:859 break; case 143: -#line 593 "dhcp4_parser.yy" // lalr1.cc:859 +#line 595 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } #line 1268 "dhcp4_parser.cc" // lalr1.cc:859 break; case 144: -#line 594 "dhcp4_parser.yy" // lalr1.cc:859 +#line 596 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } #line 1274 "dhcp4_parser.cc" // lalr1.cc:859 break; case 145: -#line 595 "dhcp4_parser.yy" // lalr1.cc:859 +#line 597 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } #line 1280 "dhcp4_parser.cc" // lalr1.cc:859 break; case 146: -#line 598 "dhcp4_parser.yy" // lalr1.cc:859 +#line 600 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1288,7 +1288,7 @@ namespace isc { namespace dhcp { break; case 147: -#line 600 "dhcp4_parser.yy" // lalr1.cc:859 +#line 602 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); @@ -1298,7 +1298,7 @@ namespace isc { namespace dhcp { break; case 148: -#line 606 "dhcp4_parser.yy" // lalr1.cc:859 +#line 608 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1306,7 +1306,7 @@ namespace isc { namespace dhcp { break; case 149: -#line 608 "dhcp4_parser.yy" // lalr1.cc:859 +#line 610 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); @@ -1316,7 +1316,7 @@ namespace isc { namespace dhcp { break; case 150: -#line 614 "dhcp4_parser.yy" // lalr1.cc:859 +#line 616 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1324,7 +1324,7 @@ namespace isc { namespace dhcp { break; case 151: -#line 616 "dhcp4_parser.yy" // lalr1.cc:859 +#line 618 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); @@ -1334,7 +1334,7 @@ namespace isc { namespace dhcp { break; case 152: -#line 622 "dhcp4_parser.yy" // lalr1.cc:859 +#line 624 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); @@ -1343,7 +1343,7 @@ namespace isc { namespace dhcp { break; case 153: -#line 627 "dhcp4_parser.yy" // lalr1.cc:859 +#line 629 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1351,7 +1351,7 @@ namespace isc { namespace dhcp { break; case 154: -#line 629 "dhcp4_parser.yy" // lalr1.cc:859 +#line 631 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); @@ -1361,7 +1361,7 @@ namespace isc { namespace dhcp { break; case 155: -#line 635 "dhcp4_parser.yy" // lalr1.cc:859 +#line 637 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); @@ -1370,7 +1370,7 @@ namespace isc { namespace dhcp { break; case 156: -#line 640 "dhcp4_parser.yy" // lalr1.cc:859 +#line 642 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); @@ -1379,7 +1379,7 @@ namespace isc { namespace dhcp { break; case 157: -#line 645 "dhcp4_parser.yy" // lalr1.cc:859 +#line 647 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); @@ -1388,7 +1388,7 @@ namespace isc { namespace dhcp { break; case 158: -#line 650 "dhcp4_parser.yy" // lalr1.cc:859 +#line 652 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); @@ -1397,7 +1397,7 @@ namespace isc { namespace dhcp { break; case 159: -#line 655 "dhcp4_parser.yy" // lalr1.cc:859 +#line 657 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1405,7 +1405,7 @@ namespace isc { namespace dhcp { break; case 160: -#line 657 "dhcp4_parser.yy" // lalr1.cc:859 +#line 659 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); @@ -1415,7 +1415,7 @@ namespace isc { namespace dhcp { break; case 161: -#line 663 "dhcp4_parser.yy" // lalr1.cc:859 +#line 665 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1423,7 +1423,7 @@ namespace isc { namespace dhcp { break; case 162: -#line 665 "dhcp4_parser.yy" // lalr1.cc:859 +#line 667 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); @@ -1433,7 +1433,7 @@ namespace isc { namespace dhcp { break; case 163: -#line 672 "dhcp4_parser.yy" // lalr1.cc:859 +#line 674 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); @@ -1444,7 +1444,7 @@ namespace isc { namespace dhcp { break; case 164: -#line 677 "dhcp4_parser.yy" // lalr1.cc:859 +#line 679 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1453,7 +1453,7 @@ namespace isc { namespace dhcp { break; case 172: -#line 693 "dhcp4_parser.yy" // lalr1.cc:859 +#line 695 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); @@ -1462,7 +1462,7 @@ namespace isc { namespace dhcp { break; case 173: -#line 698 "dhcp4_parser.yy" // lalr1.cc:859 +#line 700 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); @@ -1471,7 +1471,7 @@ namespace isc { namespace dhcp { break; case 174: -#line 703 "dhcp4_parser.yy" // lalr1.cc:859 +#line 705 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(circuit); @@ -1480,7 +1480,7 @@ namespace isc { namespace dhcp { break; case 175: -#line 708 "dhcp4_parser.yy" // lalr1.cc:859 +#line 710 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(client); @@ -1489,7 +1489,7 @@ namespace isc { namespace dhcp { break; case 176: -#line 713 "dhcp4_parser.yy" // lalr1.cc:859 +#line 715 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); @@ -1498,7 +1498,7 @@ namespace isc { namespace dhcp { break; case 177: -#line 718 "dhcp4_parser.yy" // lalr1.cc:859 +#line 720 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); @@ -1509,7 +1509,7 @@ namespace isc { namespace dhcp { break; case 178: -#line 723 "dhcp4_parser.yy" // lalr1.cc:859 +#line 725 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1518,7 +1518,7 @@ namespace isc { namespace dhcp { break; case 183: -#line 736 "dhcp4_parser.yy" // lalr1.cc:859 +#line 738 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -1528,7 +1528,7 @@ namespace isc { namespace dhcp { break; case 184: -#line 740 "dhcp4_parser.yy" // lalr1.cc:859 +#line 742 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1538,7 +1538,7 @@ namespace isc { namespace dhcp { break; case 185: -#line 746 "dhcp4_parser.yy" // lalr1.cc:859 +#line 748 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1548,7 +1548,7 @@ namespace isc { namespace dhcp { break; case 186: -#line 750 "dhcp4_parser.yy" // lalr1.cc:859 +#line 752 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1558,7 +1558,7 @@ namespace isc { namespace dhcp { break; case 192: -#line 765 "dhcp4_parser.yy" // lalr1.cc:859 +#line 767 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1566,7 +1566,7 @@ namespace isc { namespace dhcp { break; case 193: -#line 767 "dhcp4_parser.yy" // lalr1.cc:859 +#line 769 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); @@ -1576,7 +1576,7 @@ namespace isc { namespace dhcp { break; case 194: -#line 773 "dhcp4_parser.yy" // lalr1.cc:859 +#line 775 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1584,7 +1584,7 @@ namespace isc { namespace dhcp { break; case 195: -#line 775 "dhcp4_parser.yy" // lalr1.cc:859 +#line 777 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1593,7 +1593,7 @@ namespace isc { namespace dhcp { break; case 196: -#line 781 "dhcp4_parser.yy" // lalr1.cc:859 +#line 783 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); @@ -1604,7 +1604,7 @@ namespace isc { namespace dhcp { break; case 197: -#line 786 "dhcp4_parser.yy" // lalr1.cc:859 +#line 788 "dhcp4_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); @@ -1614,7 +1614,7 @@ namespace isc { namespace dhcp { break; case 206: -#line 804 "dhcp4_parser.yy" // lalr1.cc:859 +#line 806 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); @@ -1623,7 +1623,7 @@ namespace isc { namespace dhcp { break; case 207: -#line 809 "dhcp4_parser.yy" // lalr1.cc:859 +#line 811 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); @@ -1632,7 +1632,7 @@ namespace isc { namespace dhcp { break; case 208: -#line 814 "dhcp4_parser.yy" // lalr1.cc:859 +#line 816 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); @@ -1641,7 +1641,7 @@ namespace isc { namespace dhcp { break; case 209: -#line 819 "dhcp4_parser.yy" // lalr1.cc:859 +#line 821 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); @@ -1650,7 +1650,7 @@ namespace isc { namespace dhcp { break; case 210: -#line 824 "dhcp4_parser.yy" // lalr1.cc:859 +#line 826 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); @@ -1659,7 +1659,7 @@ namespace isc { namespace dhcp { break; case 211: -#line 829 "dhcp4_parser.yy" // lalr1.cc:859 +#line 831 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); @@ -1668,7 +1668,7 @@ namespace isc { namespace dhcp { break; case 212: -#line 837 "dhcp4_parser.yy" // lalr1.cc:859 +#line 839 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet4", l); @@ -1679,7 +1679,7 @@ namespace isc { namespace dhcp { break; case 213: -#line 842 "dhcp4_parser.yy" // lalr1.cc:859 +#line 844 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1688,7 +1688,7 @@ namespace isc { namespace dhcp { break; case 218: -#line 862 "dhcp4_parser.yy" // lalr1.cc:859 +#line 864 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -1698,7 +1698,7 @@ namespace isc { namespace dhcp { break; case 219: -#line 866 "dhcp4_parser.yy" // lalr1.cc:859 +#line 868 "dhcp4_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1724,7 +1724,7 @@ namespace isc { namespace dhcp { break; case 220: -#line 888 "dhcp4_parser.yy" // lalr1.cc:859 +#line 890 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the subnet4 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1734,7 +1734,7 @@ namespace isc { namespace dhcp { break; case 221: -#line 892 "dhcp4_parser.yy" // lalr1.cc:859 +#line 894 "dhcp4_parser.yy" // lalr1.cc:859 { // The subnet subnet4 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1743,16 +1743,16 @@ namespace isc { namespace dhcp { #line 1744 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 247: -#line 929 "dhcp4_parser.yy" // lalr1.cc:859 + case 248: +#line 932 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1752 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 248: -#line 931 "dhcp4_parser.yy" // lalr1.cc:859 + case 249: +#line 934 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); @@ -1761,16 +1761,16 @@ namespace isc { namespace dhcp { #line 1762 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 249: -#line 937 "dhcp4_parser.yy" // lalr1.cc:859 + case 250: +#line 940 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1770 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 250: -#line 939 "dhcp4_parser.yy" // lalr1.cc:859 + case 251: +#line 942 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface", iface); @@ -1779,16 +1779,16 @@ namespace isc { namespace dhcp { #line 1780 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 251: -#line 945 "dhcp4_parser.yy" // lalr1.cc:859 + case 252: +#line 948 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1788 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 252: -#line 947 "dhcp4_parser.yy" // lalr1.cc:859 + case 253: +#line 950 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface-id", iface); @@ -1797,16 +1797,16 @@ namespace isc { namespace dhcp { #line 1798 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 253: -#line 953 "dhcp4_parser.yy" // lalr1.cc:859 + case 254: +#line 956 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1806 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 254: -#line 955 "dhcp4_parser.yy" // lalr1.cc:859 + case 255: +#line 958 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-subnet", iface); @@ -1815,16 +1815,16 @@ namespace isc { namespace dhcp { #line 1816 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 255: -#line 961 "dhcp4_parser.yy" // lalr1.cc:859 + case 256: +#line 964 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1824 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 256: -#line 963 "dhcp4_parser.yy" // lalr1.cc:859 + case 257: +#line 966 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); @@ -1833,16 +1833,16 @@ namespace isc { namespace dhcp { #line 1834 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 257: -#line 969 "dhcp4_parser.yy" // lalr1.cc:859 + case 258: +#line 972 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1842 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 258: -#line 971 "dhcp4_parser.yy" // lalr1.cc:859 + case 259: +#line 974 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); @@ -1851,16 +1851,16 @@ namespace isc { namespace dhcp { #line 1852 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 259: -#line 977 "dhcp4_parser.yy" // lalr1.cc:859 + case 260: +#line 980 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.CLIENT_CLASS); + ctx.enter(ctx.NO_KEYWORD); } #line 1860 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 260: -#line 979 "dhcp4_parser.yy" // lalr1.cc:859 + case 261: +#line 982 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); @@ -1869,146 +1869,166 @@ namespace isc { namespace dhcp { #line 1870 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 261: -#line 985 "dhcp4_parser.yy" // lalr1.cc:859 + case 262: +#line 988 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.push_back(c); + ctx.enter(ctx.NO_KEYWORD); +} +#line 1881 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 263: +#line 993 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 1890 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 264: +#line 998 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1878 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1898 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 262: -#line 987 "dhcp4_parser.yy" // lalr1.cc:859 + case 265: +#line 1000 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1887 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 263: -#line 992 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1893 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 264: -#line 993 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1899 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 265: -#line 994 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1905 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1907 "dhcp4_parser.cc" // lalr1.cc:859 break; case 266: -#line 997 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1005 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } +#line 1913 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 267: +#line 1006 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } +#line 1919 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 268: +#line 1007 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } +#line 1925 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 269: +#line 1010 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1914 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1934 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 267: -#line 1002 "dhcp4_parser.yy" // lalr1.cc:859 + case 270: +#line 1015 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1923 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1943 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 268: -#line 1009 "dhcp4_parser.yy" // lalr1.cc:859 + case 271: +#line 1022 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1934 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1954 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 269: -#line 1014 "dhcp4_parser.yy" // lalr1.cc:859 + case 272: +#line 1027 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1943 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1963 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 274: -#line 1029 "dhcp4_parser.yy" // lalr1.cc:859 + case 277: +#line 1042 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1953 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1973 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 275: -#line 1033 "dhcp4_parser.yy" // lalr1.cc:859 + case 278: +#line 1046 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1961 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1981 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 293: -#line 1062 "dhcp4_parser.yy" // lalr1.cc:859 + case 297: +#line 1076 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1972 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1992 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 294: -#line 1067 "dhcp4_parser.yy" // lalr1.cc:859 + case 298: +#line 1081 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1981 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2001 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 295: -#line 1075 "dhcp4_parser.yy" // lalr1.cc:859 + case 299: +#line 1089 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1990 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2010 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 296: -#line 1078 "dhcp4_parser.yy" // lalr1.cc:859 + case 300: +#line 1092 "dhcp4_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 1998 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2018 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 301: -#line 1094 "dhcp4_parser.yy" // lalr1.cc:859 + case 305: +#line 1108 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2008 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2028 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 302: -#line 1098 "dhcp4_parser.yy" // lalr1.cc:859 + case 306: +#line 1112 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2016,21 +2036,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2020 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2040 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 303: -#line 1109 "dhcp4_parser.yy" // lalr1.cc:859 + case 307: +#line 1123 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2030 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2050 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 304: -#line 1113 "dhcp4_parser.yy" // lalr1.cc:859 + case 308: +#line 1127 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2038,588 +2058,568 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2042 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2062 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 318: -#line 1143 "dhcp4_parser.yy" // lalr1.cc:859 + case 322: +#line 1157 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 2051 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2071 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 320: -#line 1150 "dhcp4_parser.yy" // lalr1.cc:859 + case 324: +#line 1164 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2059 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2079 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 321: -#line 1152 "dhcp4_parser.yy" // lalr1.cc:859 + case 325: +#line 1166 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 2069 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2089 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 322: -#line 1158 "dhcp4_parser.yy" // lalr1.cc:859 + case 326: +#line 1172 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2077 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2097 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 323: -#line 1160 "dhcp4_parser.yy" // lalr1.cc:859 + case 327: +#line 1174 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 2087 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2107 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 324: -#line 1166 "dhcp4_parser.yy" // lalr1.cc:859 + case 328: +#line 1180 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2095 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2115 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 325: -#line 1168 "dhcp4_parser.yy" // lalr1.cc:859 + case 329: +#line 1182 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2105 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2125 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 327: -#line 1176 "dhcp4_parser.yy" // lalr1.cc:859 + case 331: +#line 1190 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2113 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2133 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 328: -#line 1178 "dhcp4_parser.yy" // lalr1.cc:859 + case 332: +#line 1192 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2123 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2143 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 329: -#line 1184 "dhcp4_parser.yy" // lalr1.cc:859 + case 333: +#line 1198 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2132 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2152 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 330: -#line 1193 "dhcp4_parser.yy" // lalr1.cc:859 + case 334: +#line 1207 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2143 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2163 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 331: -#line 1198 "dhcp4_parser.yy" // lalr1.cc:859 + case 335: +#line 1212 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2152 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2172 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 336: -#line 1217 "dhcp4_parser.yy" // lalr1.cc:859 + case 340: +#line 1231 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2162 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2182 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 337: -#line 1221 "dhcp4_parser.yy" // lalr1.cc:859 + case 341: +#line 1235 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2171 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2191 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 338: -#line 1229 "dhcp4_parser.yy" // lalr1.cc:859 + case 342: +#line 1243 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2181 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2201 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 339: -#line 1233 "dhcp4_parser.yy" // lalr1.cc:859 + case 343: +#line 1247 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2190 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2210 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 352: -#line 1264 "dhcp4_parser.yy" // lalr1.cc:859 + case 356: +#line 1278 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2198 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2218 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 353: -#line 1266 "dhcp4_parser.yy" // lalr1.cc:859 + case 357: +#line 1280 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2208 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2228 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 356: -#line 1276 "dhcp4_parser.yy" // lalr1.cc:859 + case 360: +#line 1290 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2217 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2237 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 357: -#line 1281 "dhcp4_parser.yy" // lalr1.cc:859 + case 361: +#line 1295 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2226 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2246 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 358: -#line 1289 "dhcp4_parser.yy" // lalr1.cc:859 + case 362: +#line 1303 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2237 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2257 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 359: -#line 1294 "dhcp4_parser.yy" // lalr1.cc:859 + case 363: +#line 1308 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2246 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 364: -#line 1309 "dhcp4_parser.yy" // lalr1.cc:859 + case 368: +#line 1323 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2256 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 365: -#line 1313 "dhcp4_parser.yy" // lalr1.cc:859 + case 369: +#line 1327 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2286 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 366: -#line 1319 "dhcp4_parser.yy" // lalr1.cc:859 + case 370: +#line 1333 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2296 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 367: -#line 1323 "dhcp4_parser.yy" // lalr1.cc:859 + case 371: +#line 1337 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2286 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2306 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 376: -#line 1341 "dhcp4_parser.yy" // lalr1.cc:859 + case 381: +#line 1356 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2294 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2314 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 377: -#line 1343 "dhcp4_parser.yy" // lalr1.cc:859 + case 382: +#line 1358 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); ctx.leave(); } -#line 2304 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2324 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1349 "dhcp4_parser.yy" // lalr1.cc:859 + case 383: +#line 1364 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2312 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2332 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1351 "dhcp4_parser.yy" // lalr1.cc:859 + case 384: +#line 1366 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2321 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2341 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 380: -#line 1356 "dhcp4_parser.yy" // lalr1.cc:859 + case 385: +#line 1371 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.KNOWN_CLIENTS); } -#line 2329 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2349 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 381: -#line 1358 "dhcp4_parser.yy" // lalr1.cc:859 + case 386: +#line 1373 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2338 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2358 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 382: -#line 1364 "dhcp4_parser.yy" // lalr1.cc:859 + case 387: +#line 1379 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } -#line 2344 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2364 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 383: -#line 1365 "dhcp4_parser.yy" // lalr1.cc:859 + case 388: +#line 1380 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 2350 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2370 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1371 "dhcp4_parser.yy" // lalr1.cc:859 + case 389: +#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2361 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2381 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1376 "dhcp4_parser.yy" // lalr1.cc:859 + case 390: +#line 1391 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2370 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2390 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1389 "dhcp4_parser.yy" // lalr1.cc:859 + case 395: +#line 1404 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2380 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2400 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 391: -#line 1393 "dhcp4_parser.yy" // lalr1.cc:859 + case 396: +#line 1408 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2389 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2409 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 392: -#line 1398 "dhcp4_parser.yy" // lalr1.cc:859 + case 397: +#line 1413 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2399 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2419 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 393: -#line 1402 "dhcp4_parser.yy" // lalr1.cc:859 + case 398: +#line 1417 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2408 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2428 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 411: -#line 1431 "dhcp4_parser.yy" // lalr1.cc:859 + case 416: +#line 1446 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2416 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2436 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 412: -#line 1433 "dhcp4_parser.yy" // lalr1.cc:859 + case 417: +#line 1448 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); ctx.leave(); } -#line 2426 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2446 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1439 "dhcp4_parser.yy" // lalr1.cc:859 + case 418: +#line 1454 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2434 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2454 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1441 "dhcp4_parser.yy" // lalr1.cc:859 + case 419: +#line 1456 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); ctx.leave(); } -#line 2444 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2464 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 + case 420: +#line 1462 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2452 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2472 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1449 "dhcp4_parser.yy" // lalr1.cc:859 + case 421: +#line 1464 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); ctx.leave(); } -#line 2462 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2482 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1455 "dhcp4_parser.yy" // lalr1.cc:859 + case 422: +#line 1470 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2470 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2490 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1457 "dhcp4_parser.yy" // lalr1.cc:859 + case 423: +#line 1472 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); ctx.leave(); } -#line 2480 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2500 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1463 "dhcp4_parser.yy" // lalr1.cc:859 + case 424: +#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2488 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2508 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1465 "dhcp4_parser.yy" // lalr1.cc:859 + case 425: +#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2498 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2518 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1471 "dhcp4_parser.yy" // lalr1.cc:859 + case 426: +#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2506 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2526 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1473 "dhcp4_parser.yy" // lalr1.cc:859 + case 427: +#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2516 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2536 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1479 "dhcp4_parser.yy" // lalr1.cc:859 + case 428: +#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2524 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2544 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1481 "dhcp4_parser.yy" // lalr1.cc:859 + case 429: +#line 1496 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); ctx.leave(); } -#line 2534 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2554 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1487 "dhcp4_parser.yy" // lalr1.cc:859 + case 430: +#line 1502 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2542 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2562 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1489 "dhcp4_parser.yy" // lalr1.cc:859 + case 431: +#line 1504 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); ctx.leave(); } -#line 2552 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2572 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1495 "dhcp4_parser.yy" // lalr1.cc:859 + case 432: +#line 1510 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2560 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2580 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1497 "dhcp4_parser.yy" // lalr1.cc:859 + case 433: +#line 1512 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2570 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2590 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1503 "dhcp4_parser.yy" // lalr1.cc:859 + case 434: +#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2578 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2598 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1505 "dhcp4_parser.yy" // lalr1.cc:859 + case 435: +#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2588 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2608 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1511 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1526 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2599 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 432: -#line 1516 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2608 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 433: -#line 1524 "dhcp4_parser.yy" // lalr1.cc:859 - { - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("relay", m); - ctx.stack_.push_back(m); - ctx.enter(ctx.RELAY); -} #line 2619 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1529 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1531 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2627,650 +2627,679 @@ namespace isc { namespace dhcp { #line 2628 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 + case 438: +#line 1539 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("relay", m); + ctx.stack_.push_back(m); + ctx.enter(ctx.RELAY); +} +#line 2639 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 439: +#line 1544 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 2648 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 440: +#line 1549 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2636 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2656 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1536 "dhcp4_parser.yy" // lalr1.cc:859 + case 441: +#line 1551 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2646 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2666 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1545 "dhcp4_parser.yy" // lalr1.cc:859 + case 442: +#line 1560 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2657 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2677 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1550 "dhcp4_parser.yy" // lalr1.cc:859 + case 443: +#line 1565 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2666 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2686 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1559 "dhcp4_parser.yy" // lalr1.cc:859 + case 446: +#line 1574 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2676 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2696 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1563 "dhcp4_parser.yy" // lalr1.cc:859 + case 447: +#line 1578 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2686 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2706 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 456: -#line 1589 "dhcp4_parser.yy" // lalr1.cc:859 + case 462: +#line 1605 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2694 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2714 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 457: -#line 1591 "dhcp4_parser.yy" // lalr1.cc:859 + case 463: +#line 1607 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2704 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2724 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 458: -#line 1601 "dhcp4_parser.yy" // lalr1.cc:859 + case 464: +#line 1613 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("eval-on-demand"); +} +#line 2733 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 465: +#line 1622 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2713 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2742 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 459: -#line 1608 "dhcp4_parser.yy" // lalr1.cc:859 + case 466: +#line 1629 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2724 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 460: -#line 1613 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2733 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 465: -#line 1626 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 2741 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 466: -#line 1628 "dhcp4_parser.yy" // lalr1.cc:859 - { - ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("socket-type", stype); - ctx.leave(); -} -#line 2751 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2753 "dhcp4_parser.cc" // lalr1.cc:859 break; case 467: #line 1634 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ctx.stack_.pop_back(); + ctx.leave(); } -#line 2759 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2762 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1636 "dhcp4_parser.yy" // lalr1.cc:859 + case 472: +#line 1647 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2770 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 473: +#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("socket-type", stype); + ctx.leave(); +} +#line 2780 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 474: +#line 1655 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2788 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 475: +#line 1657 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2769 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2798 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1644 "dhcp4_parser.yy" // lalr1.cc:859 + case 476: +#line 1665 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2780 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2809 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 470: -#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 + case 477: +#line 1670 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2791 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2820 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 471: -#line 1656 "dhcp4_parser.yy" // lalr1.cc:859 + case 478: +#line 1677 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2801 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2830 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 472: -#line 1660 "dhcp4_parser.yy" // lalr1.cc:859 + case 479: +#line 1681 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2811 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2840 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1687 "dhcp4_parser.yy" // lalr1.cc:859 + case 497: +#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2820 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2849 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 + case 498: +#line 1713 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2828 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2857 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 492: -#line 1694 "dhcp4_parser.yy" // lalr1.cc:859 + case 499: +#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2838 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2867 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 493: -#line 1700 "dhcp4_parser.yy" // lalr1.cc:859 + case 500: +#line 1721 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2846 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2875 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 494: -#line 1702 "dhcp4_parser.yy" // lalr1.cc:859 + case 501: +#line 1723 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2856 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2885 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 495: -#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 + case 502: +#line 1729 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2865 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2894 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 496: -#line 1713 "dhcp4_parser.yy" // lalr1.cc:859 + case 503: +#line 1734 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2873 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2902 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 497: -#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 + case 504: +#line 1736 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2883 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2912 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 498: -#line 1721 "dhcp4_parser.yy" // lalr1.cc:859 + case 505: +#line 1742 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2892 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2921 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 499: -#line 1726 "dhcp4_parser.yy" // lalr1.cc:859 + case 506: +#line 1747 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2901 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 500: -#line 1731 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NCR_PROTOCOL); -} -#line 2909 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 501: -#line 1733 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2918 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 502: -#line 1739 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2924 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 503: -#line 1740 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 2930 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1743 "dhcp4_parser.yy" // lalr1.cc:859 + case 507: +#line 1752 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NCR_FORMAT); + ctx.enter(ctx.NCR_PROTOCOL); } #line 2938 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 + case 508: +#line 1754 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2947 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 509: +#line 1760 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } +#line 2953 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 510: +#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } +#line 2959 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 511: +#line 1764 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NCR_FORMAT); +} +#line 2967 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 512: +#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 2948 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2977 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1751 "dhcp4_parser.yy" // lalr1.cc:859 + case 513: +#line 1772 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 2957 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2986 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1756 "dhcp4_parser.yy" // lalr1.cc:859 + case 514: +#line 1777 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 2966 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2995 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 + case 515: +#line 1782 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 2975 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3004 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 + case 516: +#line 1787 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 2983 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3012 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1768 "dhcp4_parser.yy" // lalr1.cc:859 + case 517: +#line 1789 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2992 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3021 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1774 "dhcp4_parser.yy" // lalr1.cc:859 + case 518: +#line 1795 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3000 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3029 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1777 "dhcp4_parser.yy" // lalr1.cc:859 + case 519: +#line 1798 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3008 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3037 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1780 "dhcp4_parser.yy" // lalr1.cc:859 + case 520: +#line 1801 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3016 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3045 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1783 "dhcp4_parser.yy" // lalr1.cc:859 + case 521: +#line 1804 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3024 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3053 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 + case 522: +#line 1807 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3033 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3062 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1792 "dhcp4_parser.yy" // lalr1.cc:859 + case 523: +#line 1813 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3041 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3070 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1794 "dhcp4_parser.yy" // lalr1.cc:859 + case 524: +#line 1815 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3051 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3080 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1802 "dhcp4_parser.yy" // lalr1.cc:859 + case 525: +#line 1823 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3059 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3088 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1804 "dhcp4_parser.yy" // lalr1.cc:859 + case 526: +#line 1825 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3068 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3097 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1809 "dhcp4_parser.yy" // lalr1.cc:859 + case 527: +#line 1830 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3076 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3105 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1811 "dhcp4_parser.yy" // lalr1.cc:859 + case 528: +#line 1832 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3085 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3114 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1816 "dhcp4_parser.yy" // lalr1.cc:859 + case 529: +#line 1837 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3093 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3122 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1818 "dhcp4_parser.yy" // lalr1.cc:859 + case 530: +#line 1839 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3102 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3131 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1828 "dhcp4_parser.yy" // lalr1.cc:859 + case 531: +#line 1849 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3113 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3142 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1833 "dhcp4_parser.yy" // lalr1.cc:859 + case 532: +#line 1854 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3122 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3151 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1850 "dhcp4_parser.yy" // lalr1.cc:859 + case 536: +#line 1871 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3133 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3162 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 + case 537: +#line 1876 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3142 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3171 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1867 "dhcp4_parser.yy" // lalr1.cc:859 + case 540: +#line 1888 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3152 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3181 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1871 "dhcp4_parser.yy" // lalr1.cc:859 + case 541: +#line 1892 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3160 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3189 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1886 "dhcp4_parser.yy" // lalr1.cc:859 + case 549: +#line 1907 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3169 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3198 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1891 "dhcp4_parser.yy" // lalr1.cc:859 + case 550: +#line 1912 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3177 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3206 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1893 "dhcp4_parser.yy" // lalr1.cc:859 + case 551: +#line 1914 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3187 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3216 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1899 "dhcp4_parser.yy" // lalr1.cc:859 + case 552: +#line 1920 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3198 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3227 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1904 "dhcp4_parser.yy" // lalr1.cc:859 + case 553: +#line 1925 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3207 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3236 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 549: -#line 1913 "dhcp4_parser.yy" // lalr1.cc:859 + case 556: +#line 1934 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3217 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 550: -#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); -} -#line 3225 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3246 "dhcp4_parser.cc" // lalr1.cc:859 break; case 557: -#line 1931 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1938 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); +} +#line 3254 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 564: +#line 1952 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3233 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3262 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 558: -#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 + case 565: +#line 1954 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3243 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3272 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 559: -#line 1939 "dhcp4_parser.yy" // lalr1.cc:859 + case 566: +#line 1960 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3252 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3281 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 560: -#line 1944 "dhcp4_parser.yy" // lalr1.cc:859 + case 567: +#line 1965 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3261 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3290 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 561: -#line 1949 "dhcp4_parser.yy" // lalr1.cc:859 + case 568: +#line 1970 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3270 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3299 "dhcp4_parser.cc" // lalr1.cc:859 break; -#line 3274 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3303 "dhcp4_parser.cc" // lalr1.cc:859 default: break; } @@ -3525,104 +3554,105 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -703; + const short int Dhcp4Parser::yypact_ninf_ = -702; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 126, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, 30, 22, 21, 37, 51, 76, 102, - 112, 116, 124, 141, 152, 167, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - 22, -67, -8, 28, 91, 113, -4, 127, 150, 87, - 43, -36, 171, -703, 209, 199, 217, 211, 235, -703, - -703, -703, -703, -703, 247, -703, 35, -703, -703, -703, - -703, -703, -703, -703, 270, 294, -703, -703, -703, -703, - -703, 296, 304, 306, 307, -703, -703, -703, -703, -703, - -703, -703, -703, 310, -703, -703, -703, 54, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, 326, 72, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - 332, 349, -703, -703, -703, -703, -703, -703, -703, -703, - -703, 74, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, 105, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, 250, 289, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, 315, -703, -703, 350, -703, - -703, -703, 351, -703, -703, 348, 354, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, 355, 356, - -703, -703, -703, -703, 353, 359, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, 135, -703, -703, -703, - 360, -703, -703, 361, -703, 362, 363, -703, -703, 367, - 368, 369, -703, -703, -703, 184, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, 22, 22, -703, 210, 370, 371, 372, 373, - 374, -703, -8, -703, 375, 212, 229, 377, 378, 379, - 380, 381, 237, 238, 239, 240, 386, 387, 388, 389, - 390, 391, 392, 393, 251, 394, 395, 28, -703, 397, - 398, 399, 253, 91, -703, 401, 402, 403, 404, 405, - 406, 407, 408, 264, 263, 411, 412, 413, 414, 113, - -703, 415, 416, -4, -703, 417, 418, 419, 420, 421, - 422, 423, 424, -703, 127, -703, 425, 426, 282, 428, - 429, 430, 284, -703, 87, 432, 286, 292, -703, 43, - 434, 435, 10, -703, 293, 436, 438, 299, 441, 300, - 301, 447, 448, 305, 308, 309, 451, 453, 171, -703, - -703, -703, 457, 455, 456, 22, 22, 22, -703, 458, - -703, -703, 320, 321, 322, 459, 460, -703, -703, -703, - -703, 466, 467, 468, 469, 470, 471, 472, 473, -703, - 474, 475, -703, 478, 151, 162, -703, -703, 331, 337, - 338, 479, 480, 340, 341, 342, -703, -703, -7, 343, - 487, 486, -703, 346, 122, -703, 478, 347, 352, 357, - 358, 364, 365, 366, -703, 376, 382, -703, 383, 384, - 385, -703, -703, 396, -703, -703, -703, 400, 22, -703, - -703, 409, 410, -703, 427, -703, -703, 5, 431, -703, - -703, -703, 85, 433, -703, 22, 28, 437, -703, -703, - -703, 91, -703, -703, -703, 193, 193, 489, 490, 491, - 492, 159, 494, 495, 208, 249, 171, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, 496, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, 497, - 439, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, 195, -703, 196, -703, - -703, 214, -703, -703, -703, -703, 503, 504, 505, 506, - 507, -703, -703, -703, 215, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, 244, -703, - 509, 513, -703, -703, 511, 515, -703, -703, 514, 516, - -703, -703, 517, 518, -703, -703, -703, -703, -703, -703, - 8, -703, -703, -703, -703, -703, -703, -703, 39, -703, - -703, 519, 523, -703, 525, 530, 531, 532, 533, 534, - 245, -703, -703, -703, -703, -703, -703, -703, -703, -703, - 246, -703, -703, -703, 287, 440, -703, 521, 536, -703, - -703, 535, 537, -703, -703, 538, -703, 539, 437, -703, - -703, 541, 543, 545, 546, 329, 442, 443, 444, 445, - 548, 549, 193, -703, -703, 113, -703, 489, 87, -703, - 490, 43, -703, 491, 42, -703, 492, 159, -703, 145, - 494, -703, -36, -703, 495, 449, 450, 452, 454, 461, - 462, 208, -703, 550, 551, 249, -703, -703, -703, 553, - 557, -4, -703, 496, 127, -703, 497, 552, -703, 556, - -703, 319, 464, 465, 476, -703, -703, -703, -703, -703, - 477, 481, -703, 288, -703, 555, -703, 558, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, 291, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, 559, 561, -703, -703, - -703, -703, 318, -703, -703, -703, -703, -703, -703, -703, - -703, 482, 483, -703, -703, 484, 330, -703, 560, -703, - 488, 562, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, 42, -703, 566, -703, 145, - -703, -703, -703, -703, -703, -703, -703, -703, 114, -703, - -703, 493, -703, 111, 562, -703, -703, -703, 567, -703, - -703, -703, 334, -703, -703, -703, -703, -703, 568, 485, - 569, 111, -703, 571, -703, 500, -703, 570, -703, -703, - 254, -703, -40, 570, -703, -703, 574, 575, 576, 336, - -703, -703, -703, -703, -703, -703, 578, 446, 502, 510, - -40, -703, 508, -703, -703, -703, -703, -703 + 120, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, 29, 21, 24, 26, 35, 59, 84, + 93, 95, 97, 110, 125, 135, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + 21, -10, 2, 28, 186, 39, 157, 73, 100, 136, + 193, -58, 244, -702, 150, 166, 173, 199, 213, -702, + -702, -702, -702, -702, 251, -702, 72, -702, -702, -702, + -702, -702, -702, -702, 267, 268, -702, -702, -702, -702, + -702, 269, 298, 304, 305, -702, -702, -702, -702, -702, + -702, -702, -702, 314, -702, -702, -702, 90, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, 321, 91, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + 328, 329, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, 111, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, 133, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, 209, 232, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, 292, -702, + -702, 333, -702, -702, -702, 335, -702, -702, 332, 249, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, 340, 343, -702, -702, -702, -702, 341, 345, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, 141, + -702, -702, -702, 365, -702, -702, 369, -702, 370, 371, + -702, -702, 372, 373, 374, -702, -702, -702, 184, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, 21, 21, -702, 229, 376, + 377, 378, 379, 380, -702, 2, -702, 381, 233, 234, + 384, 385, 386, 387, 388, 242, 245, 246, 247, 391, + 395, 396, 397, 398, 399, 400, 401, 255, 403, 404, + 28, -702, 405, 406, 407, 259, 186, -702, 409, 410, + 411, 412, 413, 414, 415, 416, 270, 271, 418, 419, + 421, 422, 423, 39, -702, 424, 425, 157, -702, 426, + 427, 428, 429, 430, 431, 432, 433, -702, 73, -702, + 434, 435, 290, 436, 438, 439, 293, -702, 136, 441, + 294, 297, -702, 193, 444, 445, -35, -702, 300, 450, + 451, 306, 452, 309, 311, 459, 460, 312, 313, 315, + 463, 466, 244, -702, -702, -702, 467, 465, 468, 21, + 21, 21, -702, 469, -702, -702, 323, 324, 327, 471, + 472, -702, -702, -702, -702, 475, 476, 477, 478, 479, + 480, 481, 482, -702, 483, 484, -702, 487, 62, 67, + -702, -702, 338, 344, 346, 488, 490, 348, 349, 350, + -702, -702, 51, 487, 351, 497, 496, -702, 354, 119, + -702, 487, 355, 356, 357, 358, 359, 360, 361, -702, + 362, 363, -702, 364, 366, 367, -702, -702, 368, -702, + -702, -702, 375, 21, -702, -702, 382, 383, -702, 389, + -702, -702, 12, 393, -702, -702, -702, 117, 390, -702, + 21, 28, 392, -702, -702, -702, 186, -702, -702, -702, + 192, 192, 513, 514, 515, 516, 198, 517, 519, 179, + 96, 244, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, 520, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, 521, 440, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, 201, -702, 207, -702, -702, 210, -702, -702, + -702, -702, 491, 525, 526, 530, 531, -702, -702, -702, + 235, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, 285, -702, 532, 533, -702, -702, + 535, 534, -702, -702, 536, 540, -702, -702, 538, 542, + -702, -702, -702, -702, -702, -702, 40, -702, -702, -702, + -702, -702, -702, -702, 41, -702, -702, 541, 543, -702, + 544, 545, 546, 547, 548, 549, 286, -702, -702, -702, + -702, -702, -702, -702, -702, -702, 287, -702, -702, -702, + 288, 408, -702, 550, 551, -702, -702, 553, 552, -702, + -702, 554, -702, 556, 392, -702, -702, 557, 559, 560, + 561, 336, 417, 420, 437, 442, 562, 563, 192, -702, + -702, 39, -702, 513, 136, -702, 514, 193, -702, 515, + 124, -702, 516, 198, -702, 131, 517, -702, -58, -702, + 519, 443, 446, 447, 448, 449, 453, 179, -702, 564, + 565, 96, -702, -702, -702, 566, 570, 157, -702, 520, + 73, -702, 521, 571, -702, 569, -702, 337, 455, 456, + 457, -702, -702, -702, -702, -702, 458, 461, -702, 289, + -702, 568, -702, 572, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, 295, -702, -702, -702, + -702, -702, -702, -702, -702, -702, 573, -702, -702, -702, + -702, -702, -702, -702, 574, 575, -702, -702, -702, -702, + -702, 296, -702, -702, -702, -702, -702, -702, -702, -702, + 462, 464, -702, -702, 470, 303, -702, 576, -702, 473, + 578, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, 124, -702, 577, 474, -702, 131, + -702, -702, -702, -702, -702, -702, -702, -702, 231, -702, + -702, 485, -702, -702, -15, 578, -702, -702, -702, 579, + -702, -702, -702, 307, -702, -702, -702, -702, -702, 582, + 486, 583, -15, -702, 584, -702, 492, -702, 581, -702, + -702, 248, -702, -65, 581, -702, -702, 587, 588, 591, + 319, -702, -702, -702, -702, -702, -702, 592, 494, 489, + 493, -65, -702, 495, -702, -702, -702, -702, -702 }; const unsigned short int @@ -3632,503 +3662,507 @@ namespace isc { namespace dhcp { 20, 22, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 34, 30, 29, 26, 27, 28, 33, 3, 31, 32, 54, 5, - 66, 7, 108, 9, 220, 11, 366, 13, 392, 15, - 295, 17, 303, 19, 338, 21, 185, 23, 471, 25, - 43, 37, 0, 0, 0, 0, 0, 394, 0, 305, - 340, 0, 0, 45, 0, 44, 0, 0, 38, 64, - 524, 518, 520, 522, 0, 63, 0, 56, 58, 60, - 61, 62, 59, 100, 0, 0, 411, 413, 415, 121, - 123, 0, 0, 0, 0, 212, 293, 330, 268, 163, - 437, 177, 196, 0, 459, 469, 93, 0, 68, 70, + 66, 7, 108, 9, 220, 11, 370, 13, 397, 15, + 299, 17, 307, 19, 342, 21, 185, 23, 478, 25, + 43, 37, 0, 0, 0, 0, 0, 399, 0, 309, + 344, 0, 0, 45, 0, 44, 0, 0, 38, 64, + 531, 525, 527, 529, 0, 63, 0, 56, 58, 60, + 61, 62, 59, 100, 0, 0, 416, 418, 420, 121, + 123, 0, 0, 0, 0, 212, 297, 334, 271, 163, + 442, 177, 196, 0, 466, 476, 93, 0, 68, 70, 71, 72, 73, 88, 89, 76, 77, 78, 79, 83, 84, 74, 75, 81, 82, 90, 91, 92, 80, 85, 86, 87, 110, 112, 116, 0, 0, 102, 104, 105, - 106, 107, 249, 251, 253, 358, 378, 247, 255, 257, - 0, 0, 261, 259, 384, 433, 246, 224, 225, 226, - 238, 0, 222, 229, 242, 243, 244, 230, 231, 234, - 236, 232, 233, 227, 228, 245, 235, 239, 240, 241, - 237, 376, 380, 375, 372, 371, 0, 368, 370, 373, - 374, 431, 419, 421, 425, 423, 429, 427, 417, 410, - 406, 0, 395, 396, 407, 408, 409, 403, 398, 404, - 400, 401, 402, 405, 399, 0, 320, 153, 0, 324, - 322, 327, 0, 316, 317, 0, 306, 307, 309, 319, - 310, 311, 312, 326, 313, 314, 315, 352, 0, 0, - 350, 351, 354, 355, 0, 341, 342, 344, 345, 346, - 347, 348, 349, 192, 194, 189, 0, 187, 190, 191, - 0, 491, 493, 0, 496, 0, 0, 500, 504, 0, - 0, 0, 509, 516, 489, 0, 473, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 42, 0, 0, 35, 0, 0, 0, 0, 0, - 0, 53, 0, 55, 0, 0, 0, 0, 0, 0, + 106, 107, 250, 252, 254, 362, 383, 248, 256, 258, + 0, 0, 264, 262, 260, 389, 438, 247, 224, 225, + 226, 239, 0, 222, 229, 243, 244, 245, 230, 231, + 234, 235, 237, 232, 233, 227, 228, 246, 236, 240, + 241, 242, 238, 381, 385, 380, 376, 377, 375, 0, + 372, 374, 378, 379, 436, 424, 426, 430, 428, 434, + 432, 422, 415, 411, 0, 400, 401, 412, 413, 414, + 408, 403, 409, 405, 406, 407, 410, 404, 0, 324, + 153, 0, 328, 326, 331, 0, 320, 321, 0, 310, + 311, 313, 323, 314, 315, 316, 330, 317, 318, 319, + 356, 0, 0, 354, 355, 358, 359, 0, 345, 346, + 348, 349, 350, 351, 352, 353, 192, 194, 189, 0, + 187, 190, 191, 0, 498, 500, 0, 503, 0, 0, + 507, 511, 0, 0, 0, 516, 523, 496, 0, 480, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 42, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 53, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 367, 0, 0, 0, 0, 0, - 0, 0, 0, 393, 0, 296, 0, 0, 0, 0, - 0, 0, 0, 304, 0, 0, 0, 0, 339, 0, - 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, - 46, 39, 0, 0, 0, 0, 0, 0, 57, 0, - 98, 99, 0, 0, 0, 0, 0, 94, 95, 96, - 97, 0, 0, 0, 0, 0, 0, 0, 0, 458, - 0, 0, 69, 0, 0, 0, 120, 103, 0, 0, - 0, 0, 0, 0, 0, 0, 266, 267, 0, 0, - 0, 0, 223, 0, 0, 369, 0, 0, 0, 0, - 0, 0, 0, 0, 397, 0, 0, 318, 0, 0, - 0, 329, 308, 0, 356, 357, 343, 0, 0, 188, - 490, 0, 0, 495, 0, 498, 499, 0, 0, 506, - 507, 508, 0, 0, 474, 0, 0, 0, 519, 521, - 523, 0, 412, 414, 416, 0, 0, 214, 297, 332, - 270, 0, 0, 179, 0, 0, 0, 47, 111, 114, - 115, 113, 118, 119, 117, 250, 252, 254, 360, 36, - 379, 248, 256, 258, 263, 264, 265, 262, 260, 386, - 0, 377, 382, 383, 381, 432, 420, 422, 426, 424, - 430, 428, 418, 321, 154, 325, 323, 328, 353, 193, - 195, 492, 494, 497, 502, 503, 501, 505, 512, 511, - 513, 514, 515, 510, 517, 40, 0, 529, 0, 526, - 528, 0, 140, 146, 148, 150, 0, 0, 0, 0, - 0, 159, 161, 139, 0, 125, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 0, 218, - 0, 215, 216, 301, 0, 298, 299, 336, 0, 333, - 334, 274, 0, 271, 272, 172, 173, 174, 175, 176, - 0, 165, 167, 168, 169, 170, 171, 441, 0, 439, - 183, 0, 180, 181, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 201, 202, 203, 204, 205, 465, 467, - 0, 461, 463, 464, 0, 49, 364, 0, 361, 362, - 390, 0, 387, 388, 435, 0, 65, 0, 0, 525, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 122, 124, 0, 213, 0, 305, 294, - 0, 340, 331, 0, 0, 269, 0, 0, 164, 443, - 0, 438, 0, 178, 0, 0, 0, 0, 0, 0, - 0, 0, 197, 0, 0, 0, 460, 470, 51, 0, - 50, 0, 359, 0, 394, 385, 0, 0, 434, 0, - 527, 0, 0, 0, 0, 152, 155, 156, 157, 158, - 0, 0, 126, 0, 217, 0, 300, 0, 335, 292, - 291, 281, 282, 284, 278, 279, 280, 290, 289, 0, - 276, 283, 285, 286, 287, 288, 273, 166, 456, 454, - 455, 449, 450, 451, 452, 453, 0, 444, 445, 447, - 448, 440, 0, 182, 206, 207, 208, 209, 210, 211, - 199, 0, 0, 462, 48, 0, 0, 363, 0, 389, - 0, 0, 142, 143, 144, 145, 141, 147, 149, 151, - 160, 162, 219, 302, 337, 0, 275, 0, 442, 0, - 184, 466, 468, 52, 365, 391, 436, 533, 0, 531, - 277, 0, 446, 0, 0, 530, 457, 545, 0, 543, - 541, 537, 0, 535, 539, 540, 538, 532, 0, 0, - 0, 0, 534, 0, 542, 0, 536, 0, 544, 549, - 0, 547, 0, 0, 546, 557, 0, 0, 0, 0, - 551, 553, 554, 555, 556, 548, 0, 0, 0, 0, - 0, 550, 0, 559, 560, 561, 552, 558 + 0, 67, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 371, 0, + 0, 0, 0, 0, 0, 0, 0, 398, 0, 300, + 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, + 0, 0, 343, 0, 0, 0, 0, 186, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 479, 46, 39, 0, 0, 0, 0, + 0, 0, 57, 0, 98, 99, 0, 0, 0, 0, + 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 465, 0, 0, 69, 0, 0, 0, + 120, 103, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 270, 0, 0, 0, 0, 0, 223, 0, 0, + 373, 0, 0, 0, 0, 0, 0, 0, 0, 402, + 0, 0, 322, 0, 0, 0, 333, 312, 0, 360, + 361, 347, 0, 0, 188, 497, 0, 0, 502, 0, + 505, 506, 0, 0, 513, 514, 515, 0, 0, 481, + 0, 0, 0, 526, 528, 530, 0, 417, 419, 421, + 0, 0, 214, 301, 336, 273, 0, 0, 179, 0, + 0, 0, 47, 111, 114, 115, 113, 118, 119, 117, + 251, 253, 255, 364, 36, 384, 249, 257, 259, 266, + 267, 268, 265, 263, 261, 391, 0, 382, 387, 388, + 386, 437, 425, 427, 431, 429, 435, 433, 423, 325, + 154, 329, 327, 332, 357, 193, 195, 499, 501, 504, + 509, 510, 508, 512, 519, 518, 520, 521, 522, 517, + 524, 40, 0, 536, 0, 533, 535, 0, 140, 146, + 148, 150, 0, 0, 0, 0, 0, 159, 161, 139, + 0, 125, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 0, 218, 0, 215, 216, 305, + 0, 302, 303, 340, 0, 337, 338, 277, 0, 274, + 275, 172, 173, 174, 175, 176, 0, 165, 167, 168, + 169, 170, 171, 446, 0, 444, 183, 0, 180, 181, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 201, + 202, 203, 204, 205, 472, 474, 0, 468, 470, 471, + 0, 49, 368, 0, 365, 366, 395, 0, 392, 393, + 440, 0, 65, 0, 0, 532, 101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, + 124, 0, 213, 0, 309, 298, 0, 344, 335, 0, + 0, 272, 0, 0, 164, 448, 0, 443, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 0, 467, 477, 51, 0, 50, 0, 363, 0, + 399, 390, 0, 0, 439, 0, 534, 0, 0, 0, + 0, 152, 155, 156, 157, 158, 0, 0, 126, 0, + 217, 0, 304, 0, 339, 296, 295, 284, 285, 287, + 281, 282, 283, 293, 294, 292, 0, 279, 286, 288, + 289, 290, 291, 276, 166, 462, 0, 460, 461, 455, + 456, 457, 458, 459, 0, 449, 450, 452, 453, 454, + 445, 0, 182, 206, 207, 208, 209, 210, 211, 199, + 0, 0, 469, 48, 0, 0, 367, 0, 394, 0, + 0, 142, 143, 144, 145, 141, 147, 149, 151, 160, + 162, 219, 306, 341, 0, 278, 0, 0, 447, 0, + 184, 473, 475, 52, 369, 396, 441, 540, 0, 538, + 280, 0, 464, 451, 0, 0, 537, 463, 552, 0, + 550, 548, 544, 0, 542, 546, 547, 545, 539, 0, + 0, 0, 0, 541, 0, 549, 0, 543, 0, 551, + 556, 0, 554, 0, 0, 553, 564, 0, 0, 0, + 0, 558, 560, 561, 562, 563, 555, 0, 0, 0, + 0, 0, 557, 0, 566, 567, 568, 559, 565 }; const short int Dhcp4Parser::yypgoto_[] = { - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -47, -703, 70, -703, -703, -703, - -703, -703, -703, -703, -703, 99, -703, -703, -703, -62, - -703, -703, -703, 230, -703, -703, -703, -703, 68, 248, - -30, -25, -24, -703, -703, -19, -703, -703, 73, 243, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, 67, -115, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -69, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -128, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -134, -703, -703, -703, -131, 204, -703, -703, -703, -703, - -703, -703, -703, -129, -703, -703, -703, -703, -703, -703, - -702, -703, -703, -703, -107, -703, -703, -703, -101, 255, - -703, -703, -703, -703, -703, -703, -703, -703, -682, -703, - -703, -703, -48, -703, -681, -703, -703, -703, -703, -703, - -703, -703, -703, -111, -703, -703, -229, -49, -703, -703, - -703, -703, -703, -103, -703, -703, -703, -100, -703, 225, - -703, -64, -703, -703, -703, -703, -703, -44, -703, -703, - -703, -703, -703, -50, -703, -703, -703, -98, -703, -703, - -703, -95, -703, 228, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -125, -703, -703, -703, -122, - 257, -703, -703, -45, -703, -703, -703, -703, -703, -703, - -703, -703, -124, -703, -703, -703, -123, -703, 252, -43, - -703, -42, -703, -31, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -677, -703, -703, -703, -703, -703, -703, -97, -703, - -703, -703, -212, -703, -703, -703, -703, -703, -703, -703, - -96, -703, -703, -703, -703, -703, -703, -703, -703, 109, - 220, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -703, -703, -703, -703, -703, -703, -703, - -703, -703, -703, -51, -703, -703, -703, -216, -703, -703, - -227, -703, -703, -703, -703, -703, -703, -230, -703, -703, - -246, -703, -703, -703, -703, -703 + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -49, -702, 101, -702, -702, -702, + -702, -702, -702, -702, -702, -406, -702, -702, -702, -62, + -702, -702, -702, 264, -702, -702, -702, -702, 92, 261, + -51, -40, -27, -702, -702, -25, -702, -702, 86, 263, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, 89, -95, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -69, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -108, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -114, -702, -702, -702, -111, 222, -702, -702, -702, -702, + -702, -702, -702, -118, -702, -702, -702, -702, -702, -702, + -701, -702, -702, -702, -92, -702, -702, -702, -89, 262, + -702, -702, -702, -702, -702, -702, -702, -702, -679, -702, + -702, -702, -46, -702, -21, -702, -665, -702, -702, -702, + -702, -702, -702, -702, -702, -98, -702, -702, -218, -66, + -702, -702, -702, -702, -702, -88, -702, -702, -702, -85, + -702, 243, -702, -64, -702, -702, -702, -702, -702, -52, + -702, -702, -702, -702, -702, -50, -702, -702, -702, -87, + -702, -702, -702, -84, -702, 237, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -115, -702, -702, + -702, -109, 274, -702, -702, -53, -702, -702, -702, -702, + -702, -702, -702, -702, -116, -702, -702, -702, -107, -702, + 272, -44, -702, -43, -702, -33, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -664, -702, -702, -702, -702, -702, -702, + -72, -702, -702, -702, -192, -702, -702, -702, -702, -702, + -702, -702, -702, -79, -702, -702, -702, -702, -702, -702, + -702, -702, 142, 252, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, -702, -22, -702, -702, -702, + -186, -702, -702, -199, -702, -702, -702, -702, -702, -702, + -205, -702, -702, -221, -702, -702, -702, -702, -702 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 34, 35, 36, 61, 540, 77, - 78, 37, 60, 74, 75, 528, 675, 739, 740, 116, - 39, 62, 86, 87, 88, 306, 41, 63, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 314, 146, 147, - 43, 64, 148, 339, 149, 340, 531, 150, 341, 534, - 151, 126, 320, 127, 321, 604, 605, 606, 691, 826, - 607, 692, 608, 693, 609, 694, 610, 234, 377, 612, - 613, 614, 615, 616, 700, 617, 701, 128, 330, 640, - 641, 642, 643, 644, 645, 646, 129, 332, 651, 652, - 653, 722, 57, 71, 266, 267, 268, 390, 269, 391, - 130, 333, 660, 661, 662, 663, 664, 665, 666, 667, - 131, 326, 620, 621, 622, 705, 45, 65, 171, 172, - 173, 350, 174, 345, 175, 346, 176, 347, 177, 351, - 178, 352, 179, 356, 180, 355, 547, 181, 182, 132, - 329, 632, 633, 634, 714, 779, 780, 133, 327, 51, - 68, 624, 625, 626, 708, 53, 69, 235, 236, 237, - 238, 239, 240, 241, 376, 242, 380, 243, 379, 244, - 245, 381, 246, 134, 328, 628, 629, 630, 711, 55, - 70, 254, 255, 256, 257, 258, 385, 259, 260, 261, - 262, 184, 348, 677, 678, 679, 741, 47, 66, 196, - 197, 198, 361, 185, 349, 200, 362, 554, 186, 357, - 681, 682, 683, 744, 49, 67, 211, 212, 213, 135, - 317, 136, 318, 137, 319, 217, 372, 218, 366, 219, - 367, 220, 369, 221, 368, 222, 371, 223, 370, 224, - 365, 190, 358, 685, 747, 138, 331, 648, 649, 719, - 796, 797, 798, 799, 800, 837, 139, 140, 335, 670, - 671, 672, 733, 673, 734, 141, 336, 59, 72, 285, - 286, 287, 288, 395, 289, 396, 290, 291, 398, 292, - 293, 294, 401, 576, 295, 402, 296, 297, 298, 299, - 406, 583, 300, 407, 89, 308, 90, 309, 91, 310, - 92, 307, 588, 589, 590, 687, 848, 849, 853, 862, - 863, 864, 865, 870, 866, 868, 880, 881, 882, 889, - 890, 891, 896, 892, 893, 894 + 22, 23, 24, 25, 34, 35, 36, 61, 545, 77, + 78, 37, 60, 74, 75, 533, 681, 745, 746, 116, + 39, 62, 86, 87, 88, 309, 41, 63, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 317, 146, 147, + 43, 64, 148, 342, 149, 343, 536, 150, 344, 539, + 151, 126, 323, 127, 324, 610, 611, 612, 697, 835, + 613, 698, 614, 699, 615, 700, 616, 237, 381, 618, + 619, 620, 621, 622, 706, 623, 707, 128, 333, 646, + 647, 648, 649, 650, 651, 652, 129, 335, 657, 658, + 659, 728, 57, 71, 269, 270, 271, 394, 272, 395, + 130, 336, 666, 667, 668, 669, 670, 671, 672, 673, + 131, 329, 626, 627, 628, 711, 45, 65, 172, 173, + 174, 353, 175, 348, 176, 349, 177, 350, 178, 354, + 179, 355, 180, 360, 181, 359, 182, 358, 552, 183, + 184, 132, 332, 638, 639, 640, 720, 786, 787, 133, + 330, 51, 68, 630, 631, 632, 714, 53, 69, 238, + 239, 240, 241, 242, 243, 244, 380, 245, 384, 246, + 383, 247, 248, 385, 249, 134, 331, 634, 635, 636, + 717, 55, 70, 257, 258, 259, 260, 261, 389, 262, + 263, 264, 265, 186, 351, 683, 684, 685, 747, 47, + 66, 199, 200, 201, 365, 187, 352, 203, 366, 560, + 188, 361, 687, 688, 689, 750, 49, 67, 214, 215, + 216, 135, 320, 136, 321, 137, 322, 220, 376, 221, + 370, 222, 371, 223, 373, 224, 372, 225, 375, 226, + 374, 227, 369, 192, 362, 691, 753, 138, 334, 654, + 655, 725, 804, 805, 806, 807, 808, 846, 809, 139, + 140, 338, 676, 677, 678, 739, 679, 740, 141, 339, + 59, 72, 288, 289, 290, 291, 399, 292, 400, 293, + 294, 402, 295, 296, 297, 405, 582, 298, 406, 299, + 300, 301, 302, 410, 589, 303, 411, 89, 311, 90, + 312, 91, 313, 92, 310, 594, 595, 596, 693, 858, + 859, 864, 873, 874, 875, 876, 881, 877, 879, 891, + 892, 893, 900, 901, 902, 907, 903, 904, 905 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 85, 251, 79, 166, 193, 209, 252, 233, 250, 265, - 284, 717, 775, 73, 718, 183, 195, 210, 194, 225, - 574, 199, 187, 188, 214, 215, 253, 27, 38, 28, - 26, 29, 776, 778, 189, 167, 216, 785, 312, 93, - 168, 169, 720, 313, 40, 721, 170, 107, 94, 95, - 96, 97, 98, 99, 100, 263, 264, 337, 42, 191, - 156, 192, 338, 95, 96, 97, 98, 544, 545, 546, - 101, 102, 103, 104, 105, 343, 163, 359, 106, 107, - 344, 76, 360, 44, 101, 102, 103, 885, 105, 108, - 886, 887, 888, 107, 227, 227, 247, 228, 229, 248, - 249, 263, 264, 142, 143, 109, 110, 144, 363, 46, - 145, 158, 84, 364, 226, 162, 80, 854, 111, 48, - 855, 112, 163, 50, 575, 81, 82, 83, 113, 114, - 165, 52, 115, 775, 95, 96, 97, 98, 392, 227, - 84, 228, 229, 393, 84, 230, 231, 232, 54, 96, - 97, 98, 578, 776, 778, 101, 102, 103, 785, 56, - 152, 153, 154, 227, 107, 529, 530, 96, 97, 98, - 30, 31, 32, 33, 58, 155, 84, 156, 107, 532, - 533, 157, 158, 159, 160, 161, 162, 408, 552, 553, - 84, 84, 409, 163, 164, 106, 107, 227, 337, 688, - 106, 165, 302, 686, 689, 201, 579, 580, 581, 202, - 203, 204, 205, 206, 207, 301, 208, 343, 702, 304, - 592, 303, 690, 703, 788, 593, 594, 595, 596, 597, - 598, 599, 600, 601, 602, 84, 582, 857, 305, 858, - 859, 635, 636, 637, 638, 227, 639, 702, 731, 735, - 85, 311, 704, 732, 736, 410, 411, 883, 373, 84, - 884, 84, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 315, 84, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 408, 359, 374, 84, 835, 737, 832, 166, 316, 836, - 322, 193, 654, 655, 656, 657, 658, 659, 323, 183, - 324, 325, 209, 195, 334, 194, 187, 188, 199, 84, - 251, 392, 233, 375, 210, 252, 840, 250, 189, 167, - 342, 214, 215, 363, 168, 169, 353, 871, 844, 900, - 170, 84, 872, 216, 901, 253, 284, 822, 823, 824, - 825, 668, 669, 354, 378, 382, 383, 384, 412, 386, - 387, 388, 389, 420, 394, 397, 399, 400, 508, 509, - 510, 403, 404, 405, 413, 414, 415, 416, 417, 419, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 440, 441, - 439, 443, 444, 445, 446, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 457, 458, 459, 460, 461, 463, - 464, 466, 467, 468, 469, 470, 471, 472, 473, 475, - 476, 477, 478, 479, 480, 481, 483, 484, 487, 488, - 491, 570, 492, 485, 490, 494, 611, 611, 493, 495, - 496, 497, 498, 603, 603, 502, 499, 503, 585, 500, - 501, 505, 506, 507, 284, 511, 515, 516, 512, 513, - 514, 517, 518, 519, 520, 521, 522, 523, 755, 535, - 524, 525, 526, 527, 538, 536, 537, 28, 541, 542, - 543, 548, 549, 550, 551, 556, 619, 623, 627, 631, - 557, 647, 650, 676, 680, 558, 559, 695, 696, 697, - 698, 699, 560, 561, 562, 706, 707, 709, 710, 713, - 712, 716, 539, 715, 563, 723, 724, 742, 684, 725, - 564, 565, 566, 567, 726, 727, 728, 729, 730, 743, - 746, 745, 418, 749, 568, 751, 748, 752, 569, 753, - 754, 577, 760, 761, 811, 812, 820, 571, 572, 814, - 815, 821, 587, 833, 839, 555, 834, 838, 845, 847, - 851, 869, 873, 875, 586, 573, 877, 879, 897, 898, - 899, 584, 902, 618, 591, 442, 447, 762, 738, 787, - 803, 802, 757, 756, 759, 758, 489, 903, 804, 805, - 764, 806, 810, 807, 763, 786, 850, 766, 765, 482, - 808, 809, 827, 828, 462, 768, 767, 486, 817, 816, - 465, 818, 819, 801, 829, 830, 474, 852, 504, 831, - 841, 842, 843, 611, 874, 674, 846, 750, 867, 813, - 603, 856, 251, 166, 876, 774, 233, 252, 878, 250, - 790, 904, 769, 895, 906, 183, 907, 789, 0, 905, - 265, 0, 187, 188, 781, 0, 777, 253, 0, 792, - 791, 782, 783, 0, 189, 167, 793, 794, 0, 193, - 168, 169, 209, 784, 770, 0, 170, 0, 795, 771, - 772, 195, 0, 194, 210, 773, 199, 0, 0, 0, - 0, 214, 215, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, + 85, 254, 228, 167, 195, 212, 255, 236, 253, 268, + 287, 73, 79, 202, 168, 185, 198, 213, 256, 781, + 196, 189, 190, 217, 218, 169, 27, 580, 28, 26, + 29, 38, 191, 40, 219, 266, 267, 230, 170, 93, + 171, 782, 42, 723, 726, 197, 724, 727, 94, 95, + 96, 97, 98, 99, 100, 785, 792, 553, 266, 267, + 95, 96, 97, 98, 896, 561, 44, 897, 898, 899, + 101, 102, 103, 104, 105, 315, 534, 535, 106, 107, + 316, 101, 102, 103, 537, 538, 152, 153, 154, 108, + 107, 46, 84, 340, 346, 96, 97, 98, 341, 347, + 48, 155, 50, 156, 52, 109, 110, 157, 158, 159, + 160, 161, 162, 868, 363, 869, 870, 54, 163, 364, + 111, 164, 165, 112, 107, 549, 550, 551, 80, 166, + 113, 114, 56, 581, 115, 84, 367, 81, 82, 83, + 76, 368, 58, 781, 396, 95, 96, 97, 98, 397, + 106, 204, 84, 96, 97, 98, 304, 205, 206, 207, + 208, 209, 210, 229, 211, 782, 101, 102, 103, 305, + 105, 30, 31, 32, 33, 107, 230, 306, 84, 785, + 792, 106, 107, 230, 584, 558, 559, 412, 230, 84, + 231, 232, 413, 158, 233, 234, 235, 162, 142, 143, + 674, 675, 144, 163, 340, 145, 164, 307, 107, 692, + 694, 795, 796, 346, 166, 695, 308, 377, 696, 598, + 193, 156, 194, 84, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 865, 378, 163, 866, 708, 164, + 585, 586, 587, 709, 230, 230, 250, 231, 232, 251, + 252, 894, 388, 85, 895, 314, 414, 415, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 588, 318, 319, 325, 84, 660, 661, 662, 663, 664, + 665, 84, 641, 642, 643, 644, 84, 645, 708, 737, + 741, 412, 363, 710, 738, 742, 743, 841, 844, 396, + 379, 167, 326, 845, 850, 195, 367, 84, 327, 328, + 882, 854, 168, 185, 202, 883, 212, 198, 337, 189, + 190, 196, 911, 169, 254, 345, 236, 912, 213, 255, + 191, 253, 356, 357, 217, 218, 170, 382, 171, 386, + 387, 256, 84, 84, 390, 219, 197, 391, 393, 392, + 287, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 831, 832, 833, 834, 398, + 513, 514, 515, 401, 403, 404, 407, 408, 409, 416, + 417, 418, 419, 420, 421, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 84, 435, 432, 433, 434, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 447, + 448, 449, 450, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 462, 463, 461, 464, 465, 466, 468, 469, + 471, 472, 473, 474, 475, 476, 477, 478, 480, 481, + 483, 482, 484, 485, 576, 488, 486, 489, 492, 493, + 490, 617, 617, 495, 496, 497, 499, 498, 609, 609, + 500, 591, 501, 502, 503, 504, 505, 507, 506, 287, + 508, 510, 511, 517, 518, 512, 516, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 761, 540, 529, + 530, 531, 532, 543, 541, 701, 542, 28, 546, 547, + 548, 554, 555, 556, 557, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 583, 572, 573, 574, 593, + 625, 629, 633, 637, 653, 575, 656, 682, 686, 702, + 703, 690, 577, 578, 704, 705, 713, 716, 712, 579, + 590, 715, 718, 719, 721, 722, 730, 729, 731, 732, + 733, 734, 735, 736, 749, 752, 748, 544, 744, 751, + 755, 757, 754, 758, 759, 760, 766, 767, 820, 821, + 762, 763, 823, 824, 830, 829, 842, 847, 849, 422, + 843, 861, 848, 880, 855, 857, 884, 886, 890, 888, + 764, 908, 909, 765, 813, 910, 913, 814, 815, 816, + 817, 446, 597, 592, 818, 836, 837, 838, 839, 451, + 624, 840, 851, 768, 852, 794, 812, 811, 494, 819, + 853, 770, 769, 856, 793, 467, 860, 862, 772, 771, + 491, 487, 774, 773, 826, 867, 828, 885, 825, 617, + 915, 470, 889, 827, 916, 918, 609, 914, 254, 167, + 479, 780, 236, 255, 810, 253, 798, 863, 775, 799, + 168, 185, 822, 797, 509, 256, 268, 189, 190, 776, + 788, 169, 756, 680, 783, 800, 789, 790, 191, 878, + 777, 801, 802, 887, 170, 195, 171, 791, 212, 906, + 917, 0, 803, 778, 202, 779, 0, 198, 0, 784, + 213, 196, 0, 0, 0, 0, 217, 218, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 774, 0, 0, 0, - 790, 0, 0, 769, 0, 0, 0, 789, 0, 0, - 0, 0, 0, 0, 861, 781, 0, 777, 0, 792, - 791, 860, 782, 783, 0, 0, 793, 794, 0, 0, - 0, 0, 861, 0, 784, 770, 0, 0, 795, 860, - 771, 772, 0, 0, 0, 0, 773 + 0, 0, 0, 0, 0, 780, 0, 0, 0, 0, + 798, 0, 775, 799, 0, 0, 0, 797, 0, 0, + 0, 0, 0, 776, 788, 872, 0, 0, 783, 800, + 789, 790, 871, 0, 777, 801, 802, 0, 0, 0, + 0, 791, 0, 872, 0, 0, 803, 778, 0, 779, + 871, 0, 0, 784 }; const short int Dhcp4Parser::yycheck_[] = { - 62, 70, 10, 65, 66, 67, 70, 69, 70, 71, - 72, 3, 714, 60, 6, 65, 66, 67, 66, 68, - 15, 66, 65, 65, 67, 67, 70, 5, 7, 7, - 0, 9, 714, 714, 65, 65, 67, 714, 3, 11, - 65, 65, 3, 8, 7, 6, 65, 51, 20, 21, - 22, 23, 24, 25, 26, 91, 92, 3, 7, 63, - 64, 65, 8, 21, 22, 23, 24, 74, 75, 76, - 42, 43, 44, 45, 46, 3, 80, 3, 50, 51, - 8, 148, 8, 7, 42, 43, 44, 127, 46, 61, - 130, 131, 132, 51, 52, 52, 53, 54, 55, 56, - 57, 91, 92, 12, 13, 77, 78, 16, 3, 7, - 19, 69, 148, 8, 27, 73, 124, 3, 90, 7, - 6, 93, 80, 7, 119, 133, 134, 135, 100, 101, - 88, 7, 104, 835, 21, 22, 23, 24, 3, 52, - 148, 54, 55, 8, 148, 58, 59, 60, 7, 22, - 23, 24, 67, 835, 835, 42, 43, 44, 835, 7, - 47, 48, 49, 52, 51, 14, 15, 22, 23, 24, - 148, 149, 150, 151, 7, 62, 148, 64, 51, 17, - 18, 68, 69, 70, 71, 72, 73, 3, 66, 67, - 148, 148, 8, 80, 81, 50, 51, 52, 3, 3, - 50, 88, 3, 8, 8, 78, 121, 122, 123, 82, - 83, 84, 85, 86, 87, 6, 89, 3, 3, 8, - 27, 4, 8, 8, 79, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 148, 151, 126, 3, 128, - 129, 82, 83, 84, 85, 52, 87, 3, 3, 3, - 312, 4, 8, 8, 8, 302, 303, 3, 8, 148, - 6, 148, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 4, 148, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 3, 3, 3, 148, 3, 8, 8, 359, 4, 8, - 4, 363, 94, 95, 96, 97, 98, 99, 4, 359, - 4, 4, 374, 363, 4, 363, 359, 359, 363, 148, - 389, 3, 384, 8, 374, 389, 8, 389, 359, 359, - 4, 374, 374, 3, 359, 359, 4, 3, 8, 3, - 359, 148, 8, 374, 8, 389, 408, 28, 29, 30, - 31, 102, 103, 4, 4, 4, 8, 3, 148, 4, - 4, 8, 3, 151, 4, 4, 4, 4, 415, 416, - 417, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 151, 4, 4, 4, 4, 4, 149, 149, 149, 149, + 62, 70, 68, 65, 66, 67, 70, 69, 70, 71, + 72, 60, 10, 66, 65, 65, 66, 67, 70, 720, + 66, 65, 65, 67, 67, 65, 5, 15, 7, 0, + 9, 7, 65, 7, 67, 93, 94, 52, 65, 11, + 65, 720, 7, 3, 3, 66, 6, 6, 20, 21, + 22, 23, 24, 25, 26, 720, 720, 463, 93, 94, + 21, 22, 23, 24, 129, 471, 7, 132, 133, 134, + 42, 43, 44, 45, 46, 3, 14, 15, 50, 51, + 8, 42, 43, 44, 17, 18, 47, 48, 49, 61, + 51, 7, 150, 3, 3, 22, 23, 24, 8, 8, + 7, 62, 7, 64, 7, 77, 78, 68, 69, 70, + 71, 72, 73, 128, 3, 130, 131, 7, 79, 8, + 92, 82, 83, 95, 51, 74, 75, 76, 126, 90, + 102, 103, 7, 121, 106, 150, 3, 135, 136, 137, + 150, 8, 7, 844, 3, 21, 22, 23, 24, 8, + 50, 78, 150, 22, 23, 24, 6, 84, 85, 86, + 87, 88, 89, 27, 91, 844, 42, 43, 44, 3, + 46, 150, 151, 152, 153, 51, 52, 4, 150, 844, + 844, 50, 51, 52, 67, 66, 67, 3, 52, 150, + 54, 55, 8, 69, 58, 59, 60, 73, 12, 13, + 104, 105, 16, 79, 3, 19, 82, 8, 51, 8, + 3, 80, 81, 3, 90, 8, 3, 8, 8, 27, + 63, 64, 65, 150, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 3, 3, 79, 6, 3, 82, + 123, 124, 125, 8, 52, 52, 53, 54, 55, 56, + 57, 3, 3, 315, 6, 4, 305, 306, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 153, 4, 4, 4, 150, 96, 97, 98, 99, 100, + 101, 150, 84, 85, 86, 87, 150, 89, 3, 3, + 3, 3, 3, 8, 8, 8, 8, 8, 3, 3, + 8, 363, 4, 8, 8, 367, 3, 150, 4, 4, + 3, 8, 363, 363, 367, 8, 378, 367, 4, 363, + 363, 367, 3, 363, 393, 4, 388, 8, 378, 393, + 363, 393, 4, 4, 378, 378, 363, 4, 363, 4, + 8, 393, 150, 150, 4, 378, 367, 4, 3, 8, + 412, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 28, 29, 30, 31, 4, + 419, 420, 421, 4, 4, 4, 4, 4, 4, 150, + 4, 4, 4, 4, 4, 4, 153, 153, 4, 4, + 4, 4, 4, 151, 150, 4, 151, 151, 151, 4, + 4, 4, 4, 4, 4, 4, 151, 4, 4, 4, + 4, 4, 153, 4, 4, 4, 4, 4, 4, 4, + 4, 151, 4, 4, 153, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 149, 4, 4, 4, 151, 4, 4, 4, 4, 4, - 4, 4, 4, 149, 151, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 149, 4, 4, 4, 151, 4, 151, 4, 4, - 4, 488, 4, 151, 151, 4, 515, 516, 149, 149, - 149, 4, 4, 515, 516, 4, 151, 4, 505, 151, - 151, 4, 7, 7, 526, 7, 7, 7, 148, 148, - 148, 5, 5, 5, 5, 5, 5, 5, 149, 148, - 7, 7, 7, 5, 5, 148, 148, 7, 148, 148, - 148, 148, 5, 7, 148, 148, 7, 7, 7, 7, - 148, 7, 7, 7, 7, 148, 148, 4, 4, 4, - 4, 4, 148, 148, 148, 6, 3, 6, 3, 3, - 6, 3, 452, 6, 148, 6, 3, 6, 89, 4, - 148, 148, 148, 148, 4, 4, 4, 4, 4, 3, - 3, 6, 312, 4, 148, 4, 8, 4, 148, 4, - 4, 120, 4, 4, 4, 4, 4, 148, 148, 6, - 3, 5, 125, 8, 3, 466, 8, 8, 8, 7, - 4, 4, 4, 4, 506, 148, 5, 7, 4, 4, - 4, 148, 4, 516, 511, 337, 343, 702, 148, 717, - 724, 722, 149, 151, 149, 151, 392, 151, 149, 149, - 707, 149, 731, 149, 705, 716, 835, 710, 708, 384, - 149, 149, 148, 148, 359, 713, 711, 389, 743, 741, - 363, 744, 746, 720, 148, 148, 374, 839, 408, 148, - 148, 148, 148, 702, 149, 526, 148, 688, 854, 735, - 702, 148, 711, 705, 871, 714, 708, 711, 148, 711, - 719, 149, 714, 883, 900, 705, 148, 719, -1, 149, - 722, -1, 705, 705, 714, -1, 714, 711, -1, 719, - 719, 714, 714, -1, 705, 705, 719, 719, -1, 741, - 705, 705, 744, 714, 714, -1, 705, -1, 719, 714, - 714, 741, -1, 741, 744, 714, 741, -1, -1, -1, - -1, 744, 744, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 744, -1, -1, -1, -1, -1, -1, + 4, 151, 4, 4, 493, 4, 153, 153, 4, 4, + 153, 520, 521, 153, 4, 4, 4, 151, 520, 521, + 151, 510, 151, 4, 4, 153, 153, 4, 153, 531, + 4, 4, 7, 150, 150, 7, 7, 150, 7, 7, + 5, 5, 5, 5, 5, 5, 5, 151, 150, 7, + 7, 7, 5, 5, 150, 4, 150, 7, 150, 150, + 150, 150, 5, 7, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 122, 150, 150, 150, 127, + 7, 7, 7, 7, 7, 150, 7, 7, 7, 4, + 4, 91, 150, 150, 4, 4, 3, 3, 6, 150, + 150, 6, 6, 3, 6, 3, 3, 6, 4, 4, + 4, 4, 4, 4, 3, 3, 6, 456, 150, 6, + 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, + 153, 151, 6, 3, 5, 4, 8, 4, 3, 315, + 8, 4, 8, 4, 8, 7, 4, 4, 7, 5, + 153, 4, 4, 151, 151, 4, 4, 151, 151, 151, + 151, 340, 516, 511, 151, 150, 150, 150, 150, 346, + 521, 150, 150, 708, 150, 723, 730, 728, 396, 737, + 150, 713, 711, 150, 722, 363, 844, 153, 716, 714, + 393, 388, 719, 717, 749, 150, 752, 151, 747, 708, + 151, 367, 150, 750, 151, 150, 708, 153, 717, 711, + 378, 720, 714, 717, 726, 717, 725, 849, 720, 725, + 711, 711, 741, 725, 412, 717, 728, 711, 711, 720, + 720, 711, 694, 531, 720, 725, 720, 720, 711, 865, + 720, 725, 725, 882, 711, 747, 711, 720, 750, 894, + 911, -1, 725, 720, 747, 720, -1, 747, -1, 720, + 750, 747, -1, -1, -1, -1, 750, 750, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 750, -1, -1, + -1, -1, -1, -1, -1, -1, 747, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 835, -1, -1, -1, - 839, -1, -1, 835, -1, -1, -1, 839, -1, -1, - -1, -1, -1, -1, 853, 835, -1, 835, -1, 839, - 839, 853, 835, 835, -1, -1, 839, 839, -1, -1, - -1, -1, 871, -1, 835, 835, -1, -1, 839, 871, - 835, 835, -1, -1, -1, -1, 835 + -1, -1, -1, -1, -1, 844, -1, -1, -1, -1, + 849, -1, 844, 849, -1, -1, -1, 849, -1, -1, + -1, -1, -1, 844, 844, 864, -1, -1, 844, 849, + 844, 844, 864, -1, 844, 849, 849, -1, -1, -1, + -1, 844, -1, 882, -1, -1, 849, 844, -1, 844, + 882, -1, -1, 844 }; const unsigned short int Dhcp4Parser::yystos_[] = { - 0, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 0, 5, 7, 9, - 148, 149, 150, 151, 166, 167, 168, 173, 7, 182, - 7, 188, 7, 202, 7, 278, 7, 359, 7, 376, - 7, 311, 7, 317, 7, 341, 7, 254, 7, 429, - 174, 169, 183, 189, 203, 279, 360, 377, 312, 318, - 342, 255, 430, 166, 175, 176, 148, 171, 172, 10, - 124, 133, 134, 135, 148, 181, 184, 185, 186, 456, - 458, 460, 462, 11, 20, 21, 22, 23, 24, 25, + 0, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 0, 5, 7, 9, + 150, 151, 152, 153, 168, 169, 170, 175, 7, 184, + 7, 190, 7, 204, 7, 280, 7, 363, 7, 380, + 7, 315, 7, 321, 7, 345, 7, 256, 7, 434, + 176, 171, 185, 191, 205, 281, 364, 381, 316, 322, + 346, 257, 435, 168, 177, 178, 150, 173, 174, 10, + 126, 135, 136, 137, 150, 183, 186, 187, 188, 461, + 463, 465, 467, 11, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 50, 51, 61, 77, - 78, 90, 93, 100, 101, 104, 181, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 213, 215, 239, 248, - 262, 272, 301, 309, 335, 381, 383, 385, 407, 418, - 419, 427, 12, 13, 16, 19, 200, 201, 204, 206, - 209, 212, 47, 48, 49, 62, 64, 68, 69, 70, - 71, 72, 73, 80, 81, 88, 181, 192, 193, 194, - 197, 280, 281, 282, 284, 286, 288, 290, 292, 294, - 296, 299, 300, 335, 353, 365, 370, 381, 383, 385, - 403, 63, 65, 181, 294, 335, 361, 362, 363, 365, - 367, 78, 82, 83, 84, 85, 86, 87, 89, 181, - 335, 378, 379, 380, 381, 383, 385, 387, 389, 391, - 393, 395, 397, 399, 401, 309, 27, 52, 54, 55, - 58, 59, 60, 181, 229, 319, 320, 321, 322, 323, - 324, 325, 327, 329, 331, 332, 334, 53, 56, 57, - 181, 229, 323, 329, 343, 344, 345, 346, 347, 349, - 350, 351, 352, 91, 92, 181, 256, 257, 258, 260, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 181, 431, 432, 433, 434, 436, - 438, 439, 441, 442, 443, 446, 448, 449, 450, 451, - 454, 6, 3, 4, 8, 3, 187, 463, 457, 459, - 461, 4, 3, 8, 199, 4, 4, 382, 384, 386, - 214, 216, 4, 4, 4, 4, 273, 310, 336, 302, - 240, 408, 249, 263, 4, 420, 428, 3, 8, 205, - 207, 210, 4, 3, 8, 285, 287, 289, 354, 366, - 283, 291, 293, 4, 4, 297, 295, 371, 404, 3, - 8, 364, 368, 3, 8, 402, 390, 392, 396, 394, - 400, 398, 388, 8, 3, 8, 326, 230, 4, 330, - 328, 333, 4, 8, 3, 348, 4, 4, 8, 3, - 259, 261, 3, 8, 4, 435, 437, 4, 440, 4, - 4, 444, 447, 4, 4, 4, 452, 455, 3, 8, - 166, 166, 148, 4, 4, 4, 4, 4, 185, 4, - 151, 151, 4, 4, 4, 4, 4, 149, 149, 149, - 149, 4, 4, 4, 4, 4, 4, 4, 4, 149, - 4, 4, 191, 4, 4, 4, 151, 201, 4, 4, - 4, 4, 4, 4, 4, 4, 149, 151, 4, 4, - 4, 4, 281, 4, 4, 362, 4, 4, 4, 4, - 4, 4, 4, 4, 380, 4, 4, 149, 4, 4, - 4, 151, 321, 4, 151, 151, 345, 4, 4, 257, - 151, 4, 4, 149, 4, 149, 149, 4, 4, 151, - 151, 151, 4, 4, 432, 4, 7, 7, 166, 166, - 166, 7, 148, 148, 148, 7, 7, 5, 5, 5, - 5, 5, 5, 5, 7, 7, 7, 5, 177, 14, - 15, 208, 17, 18, 211, 148, 148, 148, 5, 168, - 170, 148, 148, 148, 74, 75, 76, 298, 148, 5, - 7, 148, 66, 67, 369, 177, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 166, 148, 148, 148, 15, 119, 445, 120, 67, 121, - 122, 123, 151, 453, 148, 166, 190, 125, 464, 465, - 466, 200, 27, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 181, 217, 218, 219, 222, 224, 226, - 228, 229, 231, 232, 233, 234, 235, 237, 217, 7, - 274, 275, 276, 7, 313, 314, 315, 7, 337, 338, - 339, 7, 303, 304, 305, 82, 83, 84, 85, 87, - 241, 242, 243, 244, 245, 246, 247, 7, 409, 410, - 7, 250, 251, 252, 94, 95, 96, 97, 98, 99, - 264, 265, 266, 267, 268, 269, 270, 271, 102, 103, - 421, 422, 423, 425, 431, 178, 7, 355, 356, 357, - 7, 372, 373, 374, 89, 405, 8, 467, 3, 8, - 8, 220, 223, 225, 227, 4, 4, 4, 4, 4, - 236, 238, 3, 8, 8, 277, 6, 3, 316, 6, - 3, 340, 6, 3, 306, 6, 3, 3, 6, 411, - 3, 6, 253, 6, 3, 4, 4, 4, 4, 4, - 4, 3, 8, 424, 426, 3, 8, 8, 148, 179, - 180, 358, 6, 3, 375, 6, 3, 406, 8, 4, - 465, 4, 4, 4, 4, 149, 151, 149, 151, 149, - 4, 4, 218, 280, 276, 319, 315, 343, 339, 181, - 192, 193, 194, 197, 229, 272, 290, 294, 296, 307, - 308, 335, 381, 383, 385, 403, 305, 242, 79, 181, - 229, 309, 335, 381, 383, 385, 412, 413, 414, 415, - 416, 410, 256, 252, 149, 149, 149, 149, 149, 149, - 265, 4, 4, 422, 6, 3, 361, 357, 378, 374, - 4, 5, 28, 29, 30, 31, 221, 148, 148, 148, - 148, 148, 8, 8, 8, 3, 8, 417, 8, 3, - 8, 148, 148, 148, 8, 8, 148, 7, 468, 469, - 308, 4, 414, 470, 3, 6, 148, 126, 128, 129, - 181, 229, 471, 472, 473, 474, 476, 469, 477, 4, - 475, 3, 8, 4, 149, 4, 472, 5, 148, 7, - 478, 479, 480, 3, 6, 127, 130, 131, 132, 481, - 482, 483, 485, 486, 487, 479, 484, 4, 4, 4, - 3, 8, 4, 151, 149, 149, 482, 148 + 78, 92, 95, 102, 103, 106, 183, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 215, 217, 241, 250, + 264, 274, 305, 313, 339, 385, 387, 389, 411, 423, + 424, 432, 12, 13, 16, 19, 202, 203, 206, 208, + 211, 214, 47, 48, 49, 62, 64, 68, 69, 70, + 71, 72, 73, 79, 82, 83, 90, 183, 194, 195, + 196, 199, 282, 283, 284, 286, 288, 290, 292, 294, + 296, 298, 300, 303, 304, 339, 357, 369, 374, 385, + 387, 389, 407, 63, 65, 183, 296, 298, 339, 365, + 366, 367, 369, 371, 78, 84, 85, 86, 87, 88, + 89, 91, 183, 339, 382, 383, 384, 385, 387, 389, + 391, 393, 395, 397, 399, 401, 403, 405, 313, 27, + 52, 54, 55, 58, 59, 60, 183, 231, 323, 324, + 325, 326, 327, 328, 329, 331, 333, 335, 336, 338, + 53, 56, 57, 183, 231, 327, 333, 347, 348, 349, + 350, 351, 353, 354, 355, 356, 93, 94, 183, 258, + 259, 260, 262, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 183, 436, 437, + 438, 439, 441, 443, 444, 446, 447, 448, 451, 453, + 454, 455, 456, 459, 6, 3, 4, 8, 3, 189, + 468, 462, 464, 466, 4, 3, 8, 201, 4, 4, + 386, 388, 390, 216, 218, 4, 4, 4, 4, 275, + 314, 340, 306, 242, 412, 251, 265, 4, 425, 433, + 3, 8, 207, 209, 212, 4, 3, 8, 287, 289, + 291, 358, 370, 285, 293, 295, 4, 4, 301, 299, + 297, 375, 408, 3, 8, 368, 372, 3, 8, 406, + 394, 396, 400, 398, 404, 402, 392, 8, 3, 8, + 330, 232, 4, 334, 332, 337, 4, 8, 3, 352, + 4, 4, 8, 3, 261, 263, 3, 8, 4, 440, + 442, 4, 445, 4, 4, 449, 452, 4, 4, 4, + 457, 460, 3, 8, 168, 168, 150, 4, 4, 4, + 4, 4, 187, 4, 153, 153, 4, 4, 4, 4, + 4, 151, 151, 151, 151, 4, 4, 4, 4, 4, + 4, 4, 4, 151, 4, 4, 193, 4, 4, 4, + 153, 203, 4, 4, 4, 4, 4, 4, 4, 4, + 151, 153, 4, 4, 4, 4, 4, 283, 4, 4, + 366, 4, 4, 4, 4, 4, 4, 4, 4, 384, + 4, 4, 151, 4, 4, 4, 153, 325, 4, 153, + 153, 349, 4, 4, 259, 153, 4, 4, 151, 4, + 151, 151, 4, 4, 153, 153, 153, 4, 4, 437, + 4, 7, 7, 168, 168, 168, 7, 150, 150, 150, + 7, 7, 5, 5, 5, 5, 5, 5, 5, 7, + 7, 7, 5, 179, 14, 15, 210, 17, 18, 213, + 150, 150, 150, 5, 170, 172, 150, 150, 150, 74, + 75, 76, 302, 179, 150, 5, 7, 150, 66, 67, + 373, 179, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 168, 150, 150, 150, + 15, 121, 450, 122, 67, 123, 124, 125, 153, 458, + 150, 168, 192, 127, 469, 470, 471, 202, 27, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 183, + 219, 220, 221, 224, 226, 228, 230, 231, 233, 234, + 235, 236, 237, 239, 219, 7, 276, 277, 278, 7, + 317, 318, 319, 7, 341, 342, 343, 7, 307, 308, + 309, 84, 85, 86, 87, 89, 243, 244, 245, 246, + 247, 248, 249, 7, 413, 414, 7, 252, 253, 254, + 96, 97, 98, 99, 100, 101, 266, 267, 268, 269, + 270, 271, 272, 273, 104, 105, 426, 427, 428, 430, + 436, 180, 7, 359, 360, 361, 7, 376, 377, 378, + 91, 409, 8, 472, 3, 8, 8, 222, 225, 227, + 229, 4, 4, 4, 4, 4, 238, 240, 3, 8, + 8, 279, 6, 3, 320, 6, 3, 344, 6, 3, + 310, 6, 3, 3, 6, 415, 3, 6, 255, 6, + 3, 4, 4, 4, 4, 4, 4, 3, 8, 429, + 431, 3, 8, 8, 150, 181, 182, 362, 6, 3, + 379, 6, 3, 410, 8, 4, 470, 4, 4, 4, + 4, 151, 153, 151, 153, 151, 4, 4, 220, 282, + 278, 323, 319, 347, 343, 183, 194, 195, 196, 199, + 231, 274, 292, 296, 298, 300, 311, 312, 339, 385, + 387, 389, 407, 309, 244, 80, 81, 183, 231, 313, + 339, 385, 387, 389, 416, 417, 418, 419, 420, 422, + 414, 258, 254, 151, 151, 151, 151, 151, 151, 267, + 4, 4, 427, 6, 3, 365, 361, 382, 378, 4, + 5, 28, 29, 30, 31, 223, 150, 150, 150, 150, + 150, 8, 8, 8, 3, 8, 421, 4, 8, 3, + 8, 150, 150, 150, 8, 8, 150, 7, 473, 474, + 312, 4, 153, 418, 475, 3, 6, 150, 128, 130, + 131, 183, 231, 476, 477, 478, 479, 481, 474, 482, + 4, 480, 3, 8, 4, 151, 4, 477, 5, 150, + 7, 483, 484, 485, 3, 6, 129, 132, 133, 134, + 486, 487, 488, 490, 491, 492, 484, 489, 4, 4, + 4, 3, 8, 4, 153, 151, 151, 487, 150 }; const unsigned short int Dhcp4Parser::yyr1_[] = { - 0, 152, 154, 153, 155, 153, 156, 153, 157, 153, - 158, 153, 159, 153, 160, 153, 161, 153, 162, 153, - 163, 153, 164, 153, 165, 153, 166, 166, 166, 166, - 166, 166, 166, 167, 169, 168, 170, 171, 171, 172, - 172, 174, 173, 175, 175, 176, 176, 178, 177, 179, - 179, 180, 180, 181, 183, 182, 184, 184, 185, 185, - 185, 185, 185, 185, 187, 186, 189, 188, 190, 190, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 192, 193, 194, 195, 196, 197, - 199, 198, 200, 200, 201, 201, 201, 201, 203, 202, - 205, 204, 207, 206, 208, 208, 210, 209, 211, 211, - 212, 214, 213, 216, 215, 217, 217, 218, 218, 218, - 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, - 220, 219, 221, 221, 221, 221, 223, 222, 225, 224, - 227, 226, 228, 230, 229, 231, 232, 233, 234, 236, - 235, 238, 237, 240, 239, 241, 241, 242, 242, 242, - 242, 242, 243, 244, 245, 246, 247, 249, 248, 250, - 250, 251, 251, 253, 252, 255, 254, 256, 256, 256, - 257, 257, 259, 258, 261, 260, 263, 262, 264, 264, - 265, 265, 265, 265, 265, 265, 266, 267, 268, 269, - 270, 271, 273, 272, 274, 274, 275, 275, 277, 276, - 279, 278, 280, 280, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 281, 281, 281, 281, 281, 281, 283, 282, 285, - 284, 287, 286, 289, 288, 291, 290, 293, 292, 295, - 294, 297, 296, 298, 298, 298, 299, 300, 302, 301, - 303, 303, 304, 304, 306, 305, 307, 307, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 310, 309, 312, 311, 313, 313, 314, - 314, 316, 315, 318, 317, 319, 319, 320, 320, 321, - 321, 321, 321, 321, 321, 321, 321, 322, 323, 324, - 326, 325, 328, 327, 330, 329, 331, 333, 332, 334, - 336, 335, 337, 337, 338, 338, 340, 339, 342, 341, - 343, 343, 344, 344, 345, 345, 345, 345, 345, 345, - 345, 346, 348, 347, 349, 350, 351, 352, 354, 353, - 355, 355, 356, 356, 358, 357, 360, 359, 361, 361, - 362, 362, 362, 362, 362, 362, 364, 363, 366, 365, - 368, 367, 369, 369, 371, 370, 372, 372, 373, 373, - 375, 374, 377, 376, 378, 378, 379, 379, 380, 380, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 382, 381, 384, 383, 386, 385, 388, 387, 390, - 389, 392, 391, 394, 393, 396, 395, 398, 397, 400, - 399, 402, 401, 404, 403, 406, 405, 408, 407, 409, - 409, 411, 410, 412, 412, 413, 413, 414, 414, 414, - 414, 414, 414, 414, 414, 415, 417, 416, 418, 420, - 419, 421, 421, 422, 422, 424, 423, 426, 425, 428, - 427, 430, 429, 431, 431, 432, 432, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, - 433, 435, 434, 437, 436, 438, 440, 439, 441, 442, - 444, 443, 445, 445, 447, 446, 448, 449, 450, 452, - 451, 453, 453, 453, 453, 453, 455, 454, 457, 456, - 459, 458, 461, 460, 463, 462, 464, 464, 465, 467, - 466, 468, 468, 470, 469, 471, 471, 472, 472, 472, - 472, 472, 473, 475, 474, 477, 476, 478, 478, 480, - 479, 481, 481, 482, 482, 482, 482, 484, 483, 485, - 486, 487 + 0, 154, 156, 155, 157, 155, 158, 155, 159, 155, + 160, 155, 161, 155, 162, 155, 163, 155, 164, 155, + 165, 155, 166, 155, 167, 155, 168, 168, 168, 168, + 168, 168, 168, 169, 171, 170, 172, 173, 173, 174, + 174, 176, 175, 177, 177, 178, 178, 180, 179, 181, + 181, 182, 182, 183, 185, 184, 186, 186, 187, 187, + 187, 187, 187, 187, 189, 188, 191, 190, 192, 192, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 194, 195, 196, 197, 198, 199, + 201, 200, 202, 202, 203, 203, 203, 203, 205, 204, + 207, 206, 209, 208, 210, 210, 212, 211, 213, 213, + 214, 216, 215, 218, 217, 219, 219, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 222, 221, 223, 223, 223, 223, 225, 224, 227, 226, + 229, 228, 230, 232, 231, 233, 234, 235, 236, 238, + 237, 240, 239, 242, 241, 243, 243, 244, 244, 244, + 244, 244, 245, 246, 247, 248, 249, 251, 250, 252, + 252, 253, 253, 255, 254, 257, 256, 258, 258, 258, + 259, 259, 261, 260, 263, 262, 265, 264, 266, 266, + 267, 267, 267, 267, 267, 267, 268, 269, 270, 271, + 272, 273, 275, 274, 276, 276, 277, 277, 279, 278, + 281, 280, 282, 282, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 285, 284, + 287, 286, 289, 288, 291, 290, 293, 292, 295, 294, + 297, 296, 299, 298, 301, 300, 302, 302, 302, 303, + 304, 306, 305, 307, 307, 308, 308, 310, 309, 311, + 311, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 314, 313, 316, + 315, 317, 317, 318, 318, 320, 319, 322, 321, 323, + 323, 324, 324, 325, 325, 325, 325, 325, 325, 325, + 325, 326, 327, 328, 330, 329, 332, 331, 334, 333, + 335, 337, 336, 338, 340, 339, 341, 341, 342, 342, + 344, 343, 346, 345, 347, 347, 348, 348, 349, 349, + 349, 349, 349, 349, 349, 350, 352, 351, 353, 354, + 355, 356, 358, 357, 359, 359, 360, 360, 362, 361, + 364, 363, 365, 365, 366, 366, 366, 366, 366, 366, + 366, 368, 367, 370, 369, 372, 371, 373, 373, 375, + 374, 376, 376, 377, 377, 379, 378, 381, 380, 382, + 382, 383, 383, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 386, 385, 388, 387, + 390, 389, 392, 391, 394, 393, 396, 395, 398, 397, + 400, 399, 402, 401, 404, 403, 406, 405, 408, 407, + 410, 409, 412, 411, 413, 413, 415, 414, 416, 416, + 417, 417, 418, 418, 418, 418, 418, 418, 418, 418, + 418, 419, 421, 420, 422, 423, 425, 424, 426, 426, + 427, 427, 429, 428, 431, 430, 433, 432, 435, 434, + 436, 436, 437, 437, 437, 437, 437, 437, 437, 437, + 437, 437, 437, 437, 437, 437, 437, 438, 440, 439, + 442, 441, 443, 445, 444, 446, 447, 449, 448, 450, + 450, 452, 451, 453, 454, 455, 457, 456, 458, 458, + 458, 458, 458, 460, 459, 462, 461, 464, 463, 466, + 465, 468, 467, 469, 469, 470, 472, 471, 473, 473, + 475, 474, 476, 476, 477, 477, 477, 477, 477, 478, + 480, 479, 482, 481, 483, 483, 485, 484, 486, 486, + 487, 487, 487, 487, 489, 488, 490, 491, 492 }; const unsigned char @@ -4158,39 +4192,39 @@ namespace isc { namespace dhcp { 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 1, 1, 1, 3, 3, 0, 6, - 0, 1, 1, 3, 0, 4, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 6, 0, 4, 0, 1, 1, - 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 0, 4, 0, 4, 0, 4, 1, 0, 4, 3, - 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, - 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, - 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 1, 1, 0, 6, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 1, 1, 1, 3, + 3, 0, 6, 0, 1, 1, 3, 0, 4, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 6, 0, + 4, 0, 1, 1, 3, 0, 4, 0, 4, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 0, 4, 0, 4, 0, 4, + 1, 0, 4, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, - 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 4, 3, 0, - 6, 1, 3, 1, 1, 0, 4, 0, 4, 0, - 6, 0, 4, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 0, 4, 0, 4, 3, 0, 4, 3, 3, - 0, 4, 1, 1, 0, 4, 3, 3, 3, 0, - 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 6, 1, 3, 1, 0, - 6, 1, 3, 0, 4, 1, 3, 1, 1, 1, - 1, 1, 3, 0, 4, 0, 6, 1, 3, 0, - 4, 1, 3, 1, 1, 1, 1, 0, 4, 3, - 3, 3 + 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, + 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 0, 4, 0, 4, 0, 4, 1, 1, 0, + 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, + 0, 4, 0, 6, 1, 3, 0, 4, 0, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 4, 3, 3, 0, 6, 1, 3, + 1, 1, 0, 4, 0, 4, 0, 6, 0, 4, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 4, + 0, 4, 3, 0, 4, 3, 3, 0, 4, 1, + 1, 0, 4, 3, 3, 3, 0, 4, 1, 1, + 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 6, 1, 3, 1, 0, 6, 1, 3, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 3, + 0, 4, 0, 6, 1, 3, 0, 4, 1, 3, + 1, 1, 1, 1, 0, 4, 3, 3, 3 }; @@ -4220,7 +4254,8 @@ namespace isc { namespace dhcp { "\"known-clients\"", "\"only\"", "\"never\"", "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", - "\"host-reservation-identifiers\"", "\"client-classes\"", "\"test\"", + "\"host-reservation-identifiers\"", "\"client-classes\"", + "\"eval-client-classes\"", "\"test\"", "\"eval-on-demand\"", "\"client-class\"", "\"reservations\"", "\"duid\"", "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", @@ -4276,53 +4311,54 @@ namespace isc { namespace dhcp { "sub_subnet4", "$@42", "subnet4_params", "subnet4_param", "subnet", "$@43", "subnet_4o6_interface", "$@44", "subnet_4o6_interface_id", "$@45", "subnet_4o6_subnet", "$@46", "interface", "$@47", "interface_id", - "$@48", "client_class", "$@49", "reservation_mode", "$@50", "hr_mode", - "id", "rapid_commit", "shared_networks", "$@51", - "shared_networks_content", "shared_networks_list", "shared_network", - "$@52", "shared_network_params", "shared_network_param", - "option_def_list", "$@53", "sub_option_def_list", "$@54", - "option_def_list_content", "not_empty_option_def_list", - "option_def_entry", "$@55", "sub_option_def", "$@56", - "option_def_params", "not_empty_option_def_params", "option_def_param", - "option_def_name", "code", "option_def_code", "option_def_type", "$@57", - "option_def_record_types", "$@58", "space", "$@59", "option_def_space", - "option_def_encapsulate", "$@60", "option_def_array", "option_data_list", - "$@61", "option_data_list_content", "not_empty_option_data_list", - "option_data_entry", "$@62", "sub_option_data", "$@63", + "$@48", "client_class", "$@49", "eval_client_classes", "$@50", + "reservation_mode", "$@51", "hr_mode", "id", "rapid_commit", + "shared_networks", "$@52", "shared_networks_content", + "shared_networks_list", "shared_network", "$@53", + "shared_network_params", "shared_network_param", "option_def_list", + "$@54", "sub_option_def_list", "$@55", "option_def_list_content", + "not_empty_option_def_list", "option_def_entry", "$@56", + "sub_option_def", "$@57", "option_def_params", + "not_empty_option_def_params", "option_def_param", "option_def_name", + "code", "option_def_code", "option_def_type", "$@58", + "option_def_record_types", "$@59", "space", "$@60", "option_def_space", + "option_def_encapsulate", "$@61", "option_def_array", "option_data_list", + "$@62", "option_data_list_content", "not_empty_option_data_list", + "option_data_entry", "$@63", "sub_option_data", "$@64", "option_data_params", "not_empty_option_data_params", - "option_data_param", "option_data_name", "option_data_data", "$@64", + "option_data_param", "option_data_name", "option_data_data", "$@65", "option_data_code", "option_data_space", "option_data_csv_format", - "option_data_always_send", "pools_list", "$@65", "pools_list_content", - "not_empty_pools_list", "pool_list_entry", "$@66", "sub_pool4", "$@67", - "pool_params", "pool_param", "pool_entry", "$@68", "user_context", - "$@69", "known_clients", "$@70", "known_clients_value", "reservations", - "$@71", "reservations_list", "not_empty_reservations_list", - "reservation", "$@72", "sub_reservation", "$@73", "reservation_params", + "option_data_always_send", "pools_list", "$@66", "pools_list_content", + "not_empty_pools_list", "pool_list_entry", "$@67", "sub_pool4", "$@68", + "pool_params", "pool_param", "pool_entry", "$@69", "user_context", + "$@70", "known_clients", "$@71", "known_clients_value", "reservations", + "$@72", "reservations_list", "not_empty_reservations_list", + "reservation", "$@73", "sub_reservation", "$@74", "reservation_params", "not_empty_reservation_params", "reservation_param", "next_server", - "$@74", "server_hostname", "$@75", "boot_file_name", "$@76", - "ip_address", "$@77", "duid", "$@78", "hw_address", "$@79", - "client_id_value", "$@80", "circuit_id_value", "$@81", "flex_id_value", - "$@82", "hostname", "$@83", "reservation_client_classes", "$@84", - "relay", "$@85", "relay_map", "$@86", "client_classes", "$@87", - "client_classes_list", "client_class_entry", "$@88", + "$@75", "server_hostname", "$@76", "boot_file_name", "$@77", + "ip_address", "$@78", "duid", "$@79", "hw_address", "$@80", + "client_id_value", "$@81", "circuit_id_value", "$@82", "flex_id_value", + "$@83", "hostname", "$@84", "reservation_client_classes", "$@85", + "relay", "$@86", "relay_map", "$@87", "client_classes", "$@88", + "client_classes_list", "client_class_entry", "$@89", "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@89", - "dhcp4o6_port", "control_socket", "$@90", "control_socket_params", - "control_socket_param", "control_socket_type", "$@91", - "control_socket_name", "$@92", "dhcp_ddns", "$@93", "sub_dhcp_ddns", - "$@94", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@95", "server_ip", "$@96", "server_port", - "sender_ip", "$@97", "sender_port", "max_queue_size", "ncr_protocol", - "$@98", "ncr_protocol_value", "ncr_format", "$@99", + "client_class_param", "client_class_name", "client_class_test", "$@90", + "eval_on_demand", "dhcp4o6_port", "control_socket", "$@91", + "control_socket_params", "control_socket_param", "control_socket_type", + "$@92", "control_socket_name", "$@93", "dhcp_ddns", "$@94", + "sub_dhcp_ddns", "$@95", "dhcp_ddns_params", "dhcp_ddns_param", + "enable_updates", "qualifying_suffix", "$@96", "server_ip", "$@97", + "server_port", "sender_ip", "$@98", "sender_port", "max_queue_size", + "ncr_protocol", "$@99", "ncr_protocol_value", "ncr_format", "$@100", "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@100", "replace_client_name_value", - "generated_prefix", "$@101", "dhcp6_json_object", "$@102", - "dhcpddns_json_object", "$@103", "control_agent_json_object", "$@104", - "logging_object", "$@105", "logging_params", "logging_param", "loggers", - "$@106", "loggers_entries", "logger_entry", "$@107", "logger_params", - "logger_param", "debuglevel", "severity", "$@108", "output_options_list", - "$@109", "output_options_list_content", "output_entry", "$@110", - "output_params_list", "output_params", "output", "$@111", "flush", + "replace_client_name", "$@101", "replace_client_name_value", + "generated_prefix", "$@102", "dhcp6_json_object", "$@103", + "dhcpddns_json_object", "$@104", "control_agent_json_object", "$@105", + "logging_object", "$@106", "logging_params", "logging_param", "loggers", + "$@107", "loggers_entries", "logger_entry", "$@108", "logger_params", + "logger_param", "debuglevel", "severity", "$@109", "output_options_list", + "$@110", "output_options_list_content", "output_entry", "$@111", + "output_params_list", "output_params", "output", "$@112", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4330,63 +4366,63 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp4Parser::yyrline_[] = { - 0, 236, 236, 236, 237, 237, 238, 238, 239, 239, - 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, - 245, 245, 246, 246, 247, 247, 255, 256, 257, 258, - 259, 260, 261, 264, 269, 269, 280, 283, 284, 287, - 291, 298, 298, 305, 306, 309, 313, 320, 320, 327, - 328, 331, 335, 346, 356, 356, 372, 373, 377, 378, - 379, 380, 381, 382, 385, 385, 400, 400, 409, 410, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 441, 446, 451, 456, 461, 466, - 472, 472, 483, 484, 487, 488, 489, 490, 493, 493, - 502, 502, 512, 512, 519, 520, 523, 523, 530, 532, - 536, 542, 542, 554, 554, 566, 567, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 585, 585, 592, 593, 594, 595, 598, 598, 606, 606, - 614, 614, 622, 627, 627, 635, 640, 645, 650, 655, - 655, 663, 663, 672, 672, 682, 683, 686, 687, 688, - 689, 690, 693, 698, 703, 708, 713, 718, 718, 728, - 729, 732, 733, 736, 736, 746, 746, 756, 757, 758, - 761, 762, 765, 765, 773, 773, 781, 781, 792, 793, - 796, 797, 798, 799, 800, 801, 804, 809, 814, 819, - 824, 829, 837, 837, 850, 851, 854, 855, 862, 862, - 888, 888, 899, 900, 904, 905, 906, 907, 908, 909, - 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 929, 929, 937, - 937, 945, 945, 953, 953, 961, 961, 969, 969, 977, - 977, 985, 985, 992, 993, 994, 997, 1002, 1009, 1009, - 1020, 1021, 1025, 1026, 1029, 1029, 1037, 1038, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1062, 1062, 1075, 1075, 1084, 1085, 1088, - 1089, 1094, 1094, 1109, 1109, 1123, 1124, 1127, 1128, 1131, - 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1141, 1143, 1148, - 1150, 1150, 1158, 1158, 1166, 1166, 1174, 1176, 1176, 1184, - 1193, 1193, 1205, 1206, 1211, 1212, 1217, 1217, 1229, 1229, - 1241, 1242, 1247, 1248, 1253, 1254, 1255, 1256, 1257, 1258, - 1259, 1262, 1264, 1264, 1272, 1274, 1276, 1281, 1289, 1289, - 1301, 1302, 1305, 1306, 1309, 1309, 1319, 1319, 1329, 1330, - 1333, 1334, 1335, 1336, 1337, 1338, 1341, 1341, 1349, 1349, - 1356, 1356, 1364, 1365, 1371, 1371, 1381, 1382, 1385, 1386, - 1389, 1389, 1398, 1398, 1407, 1408, 1411, 1412, 1416, 1417, - 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, - 1428, 1431, 1431, 1439, 1439, 1447, 1447, 1455, 1455, 1463, - 1463, 1471, 1471, 1479, 1479, 1487, 1487, 1495, 1495, 1503, - 1503, 1511, 1511, 1524, 1524, 1534, 1534, 1545, 1545, 1555, - 1556, 1559, 1559, 1569, 1570, 1573, 1574, 1577, 1578, 1579, - 1580, 1581, 1582, 1583, 1584, 1587, 1589, 1589, 1601, 1608, - 1608, 1618, 1619, 1622, 1623, 1626, 1626, 1634, 1634, 1644, - 1644, 1656, 1656, 1666, 1667, 1670, 1671, 1672, 1673, 1674, - 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, - 1687, 1692, 1692, 1700, 1700, 1708, 1713, 1713, 1721, 1726, - 1731, 1731, 1739, 1740, 1743, 1743, 1751, 1756, 1761, 1766, - 1766, 1774, 1777, 1780, 1783, 1786, 1792, 1792, 1802, 1802, - 1809, 1809, 1816, 1816, 1828, 1828, 1841, 1842, 1846, 1850, - 1850, 1862, 1863, 1867, 1867, 1875, 1876, 1879, 1880, 1881, - 1882, 1883, 1886, 1891, 1891, 1899, 1899, 1909, 1910, 1913, - 1913, 1921, 1922, 1925, 1926, 1927, 1928, 1931, 1931, 1939, - 1944, 1949 + 0, 238, 238, 238, 239, 239, 240, 240, 241, 241, + 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, + 247, 247, 248, 248, 249, 249, 257, 258, 259, 260, + 261, 262, 263, 266, 271, 271, 282, 285, 286, 289, + 293, 300, 300, 307, 308, 311, 315, 322, 322, 329, + 330, 333, 337, 348, 358, 358, 374, 375, 379, 380, + 381, 382, 383, 384, 387, 387, 402, 402, 411, 412, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 443, 448, 453, 458, 463, 468, + 474, 474, 485, 486, 489, 490, 491, 492, 495, 495, + 504, 504, 514, 514, 521, 522, 525, 525, 532, 534, + 538, 544, 544, 556, 556, 568, 569, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 587, 587, 594, 595, 596, 597, 600, 600, 608, 608, + 616, 616, 624, 629, 629, 637, 642, 647, 652, 657, + 657, 665, 665, 674, 674, 684, 685, 688, 689, 690, + 691, 692, 695, 700, 705, 710, 715, 720, 720, 730, + 731, 734, 735, 738, 738, 748, 748, 758, 759, 760, + 763, 764, 767, 767, 775, 775, 783, 783, 794, 795, + 798, 799, 800, 801, 802, 803, 806, 811, 816, 821, + 826, 831, 839, 839, 852, 853, 856, 857, 864, 864, + 890, 890, 901, 902, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 929, 932, 932, + 940, 940, 948, 948, 956, 956, 964, 964, 972, 972, + 980, 980, 988, 988, 998, 998, 1005, 1006, 1007, 1010, + 1015, 1022, 1022, 1033, 1034, 1038, 1039, 1042, 1042, 1050, + 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1076, 1076, 1089, + 1089, 1098, 1099, 1102, 1103, 1108, 1108, 1123, 1123, 1137, + 1138, 1141, 1142, 1145, 1146, 1147, 1148, 1149, 1150, 1151, + 1152, 1155, 1157, 1162, 1164, 1164, 1172, 1172, 1180, 1180, + 1188, 1190, 1190, 1198, 1207, 1207, 1219, 1220, 1225, 1226, + 1231, 1231, 1243, 1243, 1255, 1256, 1261, 1262, 1267, 1268, + 1269, 1270, 1271, 1272, 1273, 1276, 1278, 1278, 1286, 1288, + 1290, 1295, 1303, 1303, 1315, 1316, 1319, 1320, 1323, 1323, + 1333, 1333, 1343, 1344, 1347, 1348, 1349, 1350, 1351, 1352, + 1353, 1356, 1356, 1364, 1364, 1371, 1371, 1379, 1380, 1386, + 1386, 1396, 1397, 1400, 1401, 1404, 1404, 1413, 1413, 1422, + 1423, 1426, 1427, 1431, 1432, 1433, 1434, 1435, 1436, 1437, + 1438, 1439, 1440, 1441, 1442, 1443, 1446, 1446, 1454, 1454, + 1462, 1462, 1470, 1470, 1478, 1478, 1486, 1486, 1494, 1494, + 1502, 1502, 1510, 1510, 1518, 1518, 1526, 1526, 1539, 1539, + 1549, 1549, 1560, 1560, 1570, 1571, 1574, 1574, 1584, 1585, + 1588, 1589, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, + 1600, 1603, 1605, 1605, 1613, 1622, 1629, 1629, 1639, 1640, + 1643, 1644, 1647, 1647, 1655, 1655, 1665, 1665, 1677, 1677, + 1687, 1688, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, + 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1708, 1713, 1713, + 1721, 1721, 1729, 1734, 1734, 1742, 1747, 1752, 1752, 1760, + 1761, 1764, 1764, 1772, 1777, 1782, 1787, 1787, 1795, 1798, + 1801, 1804, 1807, 1813, 1813, 1823, 1823, 1830, 1830, 1837, + 1837, 1849, 1849, 1862, 1863, 1867, 1871, 1871, 1883, 1884, + 1888, 1888, 1896, 1897, 1900, 1901, 1902, 1903, 1904, 1907, + 1912, 1912, 1920, 1920, 1930, 1931, 1934, 1934, 1942, 1943, + 1946, 1947, 1948, 1949, 1952, 1952, 1960, 1965, 1970 }; // Print the state stack on the debug stream. @@ -4421,8 +4457,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4425 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 1954 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4461 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 1975 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index b231e29e94..f79d68b50e 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -425,79 +425,81 @@ namespace isc { namespace dhcp { TOKEN_ALL = 331, TOKEN_HOST_RESERVATION_IDENTIFIERS = 332, TOKEN_CLIENT_CLASSES = 333, - TOKEN_TEST = 334, - TOKEN_CLIENT_CLASS = 335, - TOKEN_RESERVATIONS = 336, - TOKEN_DUID = 337, - TOKEN_HW_ADDRESS = 338, - TOKEN_CIRCUIT_ID = 339, - TOKEN_CLIENT_ID = 340, - TOKEN_HOSTNAME = 341, - TOKEN_FLEX_ID = 342, - TOKEN_RELAY = 343, - TOKEN_IP_ADDRESS = 344, - TOKEN_HOOKS_LIBRARIES = 345, - TOKEN_LIBRARY = 346, - TOKEN_PARAMETERS = 347, - TOKEN_EXPIRED_LEASES_PROCESSING = 348, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 349, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 350, - TOKEN_HOLD_RECLAIMED_TIME = 351, - TOKEN_MAX_RECLAIM_LEASES = 352, - TOKEN_MAX_RECLAIM_TIME = 353, - TOKEN_UNWARNED_RECLAIM_CYCLES = 354, - TOKEN_DHCP4O6_PORT = 355, - TOKEN_CONTROL_SOCKET = 356, - TOKEN_SOCKET_TYPE = 357, - TOKEN_SOCKET_NAME = 358, - TOKEN_DHCP_DDNS = 359, - TOKEN_ENABLE_UPDATES = 360, - TOKEN_QUALIFYING_SUFFIX = 361, - TOKEN_SERVER_IP = 362, - TOKEN_SERVER_PORT = 363, - TOKEN_SENDER_IP = 364, - TOKEN_SENDER_PORT = 365, - TOKEN_MAX_QUEUE_SIZE = 366, - TOKEN_NCR_PROTOCOL = 367, - TOKEN_NCR_FORMAT = 368, - TOKEN_ALWAYS_INCLUDE_FQDN = 369, - TOKEN_OVERRIDE_NO_UPDATE = 370, - TOKEN_OVERRIDE_CLIENT_UPDATE = 371, - TOKEN_REPLACE_CLIENT_NAME = 372, - TOKEN_GENERATED_PREFIX = 373, - TOKEN_TCP = 374, - TOKEN_JSON = 375, - TOKEN_WHEN_PRESENT = 376, - TOKEN_ALWAYS = 377, - TOKEN_WHEN_NOT_PRESENT = 378, - TOKEN_LOGGING = 379, - TOKEN_LOGGERS = 380, - TOKEN_OUTPUT_OPTIONS = 381, - TOKEN_OUTPUT = 382, - TOKEN_DEBUGLEVEL = 383, - TOKEN_SEVERITY = 384, - TOKEN_FLUSH = 385, - TOKEN_MAXSIZE = 386, - TOKEN_MAXVER = 387, - TOKEN_DHCP6 = 388, - TOKEN_DHCPDDNS = 389, - TOKEN_CONTROL_AGENT = 390, - TOKEN_TOPLEVEL_JSON = 391, - TOKEN_TOPLEVEL_DHCP4 = 392, - TOKEN_SUB_DHCP4 = 393, - TOKEN_SUB_INTERFACES4 = 394, - TOKEN_SUB_SUBNET4 = 395, - TOKEN_SUB_POOL4 = 396, - TOKEN_SUB_RESERVATION = 397, - TOKEN_SUB_OPTION_DEFS = 398, - TOKEN_SUB_OPTION_DEF = 399, - TOKEN_SUB_OPTION_DATA = 400, - TOKEN_SUB_HOOKS_LIBRARY = 401, - TOKEN_SUB_DHCP_DDNS = 402, - TOKEN_STRING = 403, - TOKEN_INTEGER = 404, - TOKEN_FLOAT = 405, - TOKEN_BOOLEAN = 406 + TOKEN_EVAL_CLIENT_CLASSES = 334, + TOKEN_TEST = 335, + TOKEN_EVAL_ON_DEMAND = 336, + TOKEN_CLIENT_CLASS = 337, + TOKEN_RESERVATIONS = 338, + TOKEN_DUID = 339, + TOKEN_HW_ADDRESS = 340, + TOKEN_CIRCUIT_ID = 341, + TOKEN_CLIENT_ID = 342, + TOKEN_HOSTNAME = 343, + TOKEN_FLEX_ID = 344, + TOKEN_RELAY = 345, + TOKEN_IP_ADDRESS = 346, + TOKEN_HOOKS_LIBRARIES = 347, + TOKEN_LIBRARY = 348, + TOKEN_PARAMETERS = 349, + TOKEN_EXPIRED_LEASES_PROCESSING = 350, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 351, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 352, + TOKEN_HOLD_RECLAIMED_TIME = 353, + TOKEN_MAX_RECLAIM_LEASES = 354, + TOKEN_MAX_RECLAIM_TIME = 355, + TOKEN_UNWARNED_RECLAIM_CYCLES = 356, + TOKEN_DHCP4O6_PORT = 357, + TOKEN_CONTROL_SOCKET = 358, + TOKEN_SOCKET_TYPE = 359, + TOKEN_SOCKET_NAME = 360, + TOKEN_DHCP_DDNS = 361, + TOKEN_ENABLE_UPDATES = 362, + TOKEN_QUALIFYING_SUFFIX = 363, + TOKEN_SERVER_IP = 364, + TOKEN_SERVER_PORT = 365, + TOKEN_SENDER_IP = 366, + TOKEN_SENDER_PORT = 367, + TOKEN_MAX_QUEUE_SIZE = 368, + TOKEN_NCR_PROTOCOL = 369, + TOKEN_NCR_FORMAT = 370, + TOKEN_ALWAYS_INCLUDE_FQDN = 371, + TOKEN_OVERRIDE_NO_UPDATE = 372, + TOKEN_OVERRIDE_CLIENT_UPDATE = 373, + TOKEN_REPLACE_CLIENT_NAME = 374, + TOKEN_GENERATED_PREFIX = 375, + TOKEN_TCP = 376, + TOKEN_JSON = 377, + TOKEN_WHEN_PRESENT = 378, + TOKEN_ALWAYS = 379, + TOKEN_WHEN_NOT_PRESENT = 380, + TOKEN_LOGGING = 381, + TOKEN_LOGGERS = 382, + TOKEN_OUTPUT_OPTIONS = 383, + TOKEN_OUTPUT = 384, + TOKEN_DEBUGLEVEL = 385, + TOKEN_SEVERITY = 386, + TOKEN_FLUSH = 387, + TOKEN_MAXSIZE = 388, + TOKEN_MAXVER = 389, + TOKEN_DHCP6 = 390, + TOKEN_DHCPDDNS = 391, + TOKEN_CONTROL_AGENT = 392, + TOKEN_TOPLEVEL_JSON = 393, + TOKEN_TOPLEVEL_DHCP4 = 394, + TOKEN_SUB_DHCP4 = 395, + TOKEN_SUB_INTERFACES4 = 396, + TOKEN_SUB_SUBNET4 = 397, + TOKEN_SUB_POOL4 = 398, + TOKEN_SUB_RESERVATION = 399, + TOKEN_SUB_OPTION_DEFS = 400, + TOKEN_SUB_OPTION_DEF = 401, + TOKEN_SUB_OPTION_DATA = 402, + TOKEN_SUB_HOOKS_LIBRARY = 403, + TOKEN_SUB_DHCP_DDNS = 404, + TOKEN_STRING = 405, + TOKEN_INTEGER = 406, + TOKEN_FLOAT = 407, + TOKEN_BOOLEAN = 408 }; }; @@ -920,10 +922,18 @@ namespace isc { namespace dhcp { symbol_type make_CLIENT_CLASSES (const location_type& l); + static inline + symbol_type + make_EVAL_CLIENT_CLASSES (const location_type& l); + static inline symbol_type make_TEST (const location_type& l); + static inline + symbol_type + make_EVAL_ON_DEMAND (const location_type& l); + static inline symbol_type make_CLIENT_CLASS (const location_type& l); @@ -1417,12 +1427,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 816, ///< Last index in yytable_. - yynnts_ = 336, ///< Number of nonterminal symbols. + yylast_ = 823, ///< Last index in yytable_. + yynnts_ = 339, ///< Number of nonterminal symbols. yyfinal_ = 26, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 152 ///< Number of tokens. + yyntokens_ = 154 ///< Number of tokens. }; @@ -1479,9 +1489,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, 146, 147, 148, 149, 150, 151 + 145, 146, 147, 148, 149, 150, 151, 152, 153 }; - const unsigned int user_token_number_max_ = 406; + const unsigned int user_token_number_max_ = 408; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1514,31 +1524,31 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 151: // "boolean" + case 153: // "boolean" value.copy< bool > (other.value); break; - case 150: // "floating point" + case 152: // "floating point" value.copy< double > (other.value); break; - case 149: // "integer" + case 151: // "integer" value.copy< int64_t > (other.value); break; - case 148: // "constant string" + case 150: // "constant string" value.copy< std::string > (other.value); break; @@ -1559,31 +1569,31 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 151: // "boolean" + case 153: // "boolean" value.copy< bool > (v); break; - case 150: // "floating point" + case 152: // "floating point" value.copy< double > (v); break; - case 149: // "integer" + case 151: // "integer" value.copy< int64_t > (v); break; - case 148: // "constant string" + case 150: // "constant string" value.copy< std::string > (v); break; @@ -1663,31 +1673,31 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 151: // "boolean" + case 153: // "boolean" value.template destroy< bool > (); break; - case 150: // "floating point" + case 152: // "floating point" value.template destroy< double > (); break; - case 149: // "integer" + case 151: // "integer" value.template destroy< int64_t > (); break; - case 148: // "constant string" + case 150: // "constant string" value.template destroy< std::string > (); break; @@ -1714,31 +1724,31 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 166: // value - case 170: // map_value - case 208: // socket_type - case 211: // outbound_interface_value - case 221: // db_type - case 298: // hr_mode - case 369: // known_clients_value - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 223: // db_type + case 302: // hr_mode + case 373: // known_clients_value + case 450: // ncr_protocol_value + case 458: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 151: // "boolean" + case 153: // "boolean" value.move< bool > (s.value); break; - case 150: // "floating point" + case 152: // "floating point" value.move< double > (s.value); break; - case 149: // "integer" + case 151: // "integer" value.move< int64_t > (s.value); break; - case 148: // "constant string" + case 150: // "constant string" value.move< std::string > (s.value); break; @@ -1812,7 +1822,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406 + 405, 406, 407, 408 }; return static_cast (yytoken_number_[type]); } @@ -2279,12 +2289,24 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_CLIENT_CLASSES, l); } + Dhcp4Parser::symbol_type + Dhcp4Parser::make_EVAL_CLIENT_CLASSES (const location_type& l) + { + return symbol_type (token::TOKEN_EVAL_CLIENT_CLASSES, l); + } + Dhcp4Parser::symbol_type Dhcp4Parser::make_TEST (const location_type& l) { return symbol_type (token::TOKEN_TEST, l); } + Dhcp4Parser::symbol_type + Dhcp4Parser::make_EVAL_ON_DEMAND (const location_type& l) + { + return symbol_type (token::TOKEN_EVAL_ON_DEMAND, l); + } + Dhcp4Parser::symbol_type Dhcp4Parser::make_CLIENT_CLASS (const location_type& l) { @@ -2720,7 +2742,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2724 "dhcp4_parser.h" // lalr1.cc:377 +#line 2746 "dhcp4_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 026c42d703..c963e41946 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201711191032 +// Generated 201711270201 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 9a6143d45a..ff40d48564 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201711191032 +// Generated 201711270201 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index 88216713cd..c3d3506011 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711191032 +// Generated 201711270201 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index 52b3cc4701..da86f0771b 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 164 -#define YY_END_OF_BUFFER 165 +#define YY_NUM_RULES 166 +#define YY_END_OF_BUFFER 167 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,149 +700,153 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1288] = +static const flex_int16_t yy_accept[1317] = { 0, - 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, - 165, 163, 10, 11, 163, 1, 157, 154, 157, 157, - 163, 156, 155, 163, 163, 163, 163, 163, 150, 151, - 163, 163, 163, 152, 153, 5, 5, 5, 163, 163, - 163, 10, 11, 0, 0, 146, 0, 0, 0, 0, + 159, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 167, 165, 10, 11, 165, 1, 159, 156, 159, 159, + 165, 158, 157, 165, 165, 165, 165, 165, 152, 153, + 165, 165, 165, 154, 155, 5, 5, 5, 165, 165, + 165, 10, 11, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 157, - 157, 0, 156, 157, 3, 2, 6, 0, 157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 159, + 159, 0, 158, 159, 3, 2, 6, 0, 159, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, + 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 125, 0, - 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 127, + 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, - 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 162, 160, 0, 159, 158, 0, - 0, 0, 0, 0, 0, 0, 124, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 164, 162, 0, 161, + 160, 0, 0, 0, 0, 0, 0, 0, 126, 0, - 0, 26, 0, 0, 89, 0, 0, 0, 0, 0, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 0, 26, 0, 0, 89, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, - 158, 0, 0, 0, 0, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 163, 160, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 0, 30, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 0, 67, 0, 0, 0, + 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 66, 0, 0, 0, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 76, 0, 51, 0, + 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, + 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 76, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 105, 129, 43, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 106, 131, 43, 0, 48, 0, - 0, 143, 36, 0, 33, 0, 32, 0, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 36, 0, 33, 0, + 32, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 45, 0, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, - 0, 7, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, + 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 0, 0, 7, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, - 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 0, 0, 0, 0, 0, 0, 94, 0, + 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, + 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, + 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 122, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 124, 95, 0, 0, 0, 99, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, - 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 70, 0, - 0, 0, 108, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 70, 0, 0, 0, 110, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, + 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 123, 14, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 114, 101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 110, 127, 0, 38, 0, 119, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 64, 0, - 0, 0, 0, 121, 46, 0, 72, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 0, 0, 0, 65, 88, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 0, 17, 15, 0, 141, 140, 0, 0, - 0, 0, 0, 29, 0, 104, 0, 0, 0, 0, - 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 0, 107, 0, 0, 53, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 125, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 129, + 0, 38, 0, 121, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 0, 64, 0, 0, 0, 0, 123, + 46, 0, 72, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, + + 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 0, 0, 0, 65, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, + 0, 17, 15, 0, 143, 142, 0, 0, 0, 0, + 0, 29, 0, 105, 0, 0, 0, 0, 0, 0, + 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 109, 0, 0, 53, 0, 0, 0, 19, 0, 0, 0, 0, 0, 84, 60, - 0, 115, 0, 0, 0, 106, 0, 0, 77, 0, - 145, 0, 0, 0, 0, 0, 0, 0, 75, 0, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 0, 0, 0, 108, 0, 0, 77, 0, - 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, - 0, 56, 139, 0, 12, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 40, 18, 0, 0, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 54, 0, 73, 0, 0, 0, 0, 0, - 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 35, 0, 0, 0, 0, - 0, 25, 0, 0, 0, 0, 136, 0, 0, 0, - 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 75, 0, + 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103, 0, 56, 141, 0, 12, 0, 107, 0, + 0, 0, 0, 0, 0, 0, 41, 0, 40, 18, + 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 58, 0, 0, 54, 0, 0, 73, + 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 13, 0, + 35, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, + 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, + 22, 57, 0, 0, 0, 0, 21, 0, 104, 74, + 0, 0, 136, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 0, 22, 57, 0, 0, 0, 0, 21, 0, - 74, 0, 0, 134, 0, 0, 0, 0, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 92, 0, 0, 0, 0, 0, 132, 137, - 61, 0, 0, 0, 131, 0, 0, 0, 0, 0, - 0, 0, 93, 0, 0, 133, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, + 0, 92, 0, 0, 0, 0, 0, 134, 139, 61, + + 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, + 0, 93, 0, 0, 135, 0 } ; static const YY_CHAR yy_ec[256] = @@ -889,317 +893,323 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1300] = +static const flex_int16_t yy_base[1329] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1651, 1652, 32, 1647, 141, 0, 201, 1652, 206, 88, - 11, 213, 1652, 1629, 114, 25, 2, 6, 1652, 1652, - 73, 11, 17, 1652, 1652, 1652, 104, 1635, 1590, 0, - 1627, 107, 1642, 217, 241, 1652, 185, 1586, 1592, 1612, + 1681, 1682, 32, 1677, 141, 0, 201, 1682, 206, 88, + 11, 213, 1682, 1659, 114, 25, 2, 6, 1682, 1682, + 73, 11, 17, 1682, 1682, 1682, 104, 1665, 1620, 0, + 1657, 107, 1672, 217, 241, 1682, 185, 1616, 1622, 1642, 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 64, 231, 1593, 187, 75, 11, 274, 188, 290, - 278, 297, 1576, 195, 298, 317, 324, 1595, 0, 345, - 352, 373, 380, 358, 1652, 0, 1652, 267, 295, 296, - 324, 283, 325, 346, 340, 1652, 1592, 1631, 1652, 384, + 269, 67, 231, 1623, 187, 268, 11, 274, 188, 293, + 285, 299, 1606, 78, 297, 329, 311, 1625, 0, 351, + 368, 380, 386, 389, 1682, 0, 1682, 267, 295, 285, + 309, 315, 330, 357, 342, 1682, 1622, 1661, 1682, 237, - 1652, 385, 361, 1579, 1589, 1628, 368, 220, 249, 1583, - 366, 370, 371, 377, 304, 1626, 0, 436, 377, 1570, - 1578, 361, 1574, 1563, 1564, 365, 1580, 1563, 1572, 370, - 200, 373, 1566, 383, 1554, 1610, 406, 1557, 1608, 1550, - 1559, 1572, 1569, 1569, 1563, 272, 1556, 1549, 1554, 1548, - 382, 1559, 1552, 1543, 1542, 1556, 378, 1592, 1541, 405, - 1553, 1556, 1540, 433, 407, 1554, 1551, 1552, 1550, 1532, - 1537, 1533, 1525, 1542, 1534, 0, 431, 441, 428, 435, - 444, 446, 1533, 1652, 0, 454, 1524, 1527, 1652, 440, - 456, 1652, 1579, 1534, 462, 1577, 464, 1576, 461, 1575, + 1682, 402, 354, 1609, 1619, 1658, 358, 305, 249, 1613, + 370, 377, 374, 385, 393, 1656, 0, 453, 384, 1600, + 1608, 74, 1604, 1593, 1594, 378, 1610, 1593, 1602, 325, + 1609, 200, 306, 1595, 370, 1583, 1639, 413, 1586, 1637, + 1579, 1588, 1601, 1598, 1598, 1592, 193, 1585, 1578, 1583, + 1577, 384, 1588, 1581, 1572, 1571, 1585, 365, 1621, 1570, + 384, 1582, 1585, 1569, 449, 391, 1583, 1580, 1581, 1579, + 1561, 1566, 1562, 1554, 1571, 1563, 0, 395, 425, 405, + 421, 429, 437, 1562, 1682, 0, 443, 1553, 1556, 1682, + 447, 456, 1682, 1608, 1563, 448, 1606, 457, 1605, 458, - 1652, 505, 1574, 479, 1535, 1530, 1529, 444, 1570, 1564, - 1530, 1509, 1517, 1523, 1511, 1525, 1521, 1522, 1522, 1517, - 1509, 1511, 1495, 1499, 1512, 1512, 1504, 1494, 1497, 1511, - 1652, 1497, 1505, 1508, 1489, 1484, 1487, 1537, 1486, 1496, - 1534, 444, 1495, 1483, 1494, 1530, 486, 1534, 1471, 1486, - 445, 1476, 1492, 1473, 1475, 1471, 1477, 1468, 1467, 1480, - 1473, 1475, 1479, 1478, 1472, 80, 1479, 1474, 1466, 1472, - 1472, 1453, 1469, 1455, 1461, 1468, 1456, 1449, 1463, 1462, - 1465, 1447, 1455, 489, 1652, 1652, 490, 1652, 1652, 1442, - 0, 464, 1444, 501, 497, 1498, 1652, 1451, 472, 1652, + 1604, 1682, 502, 1603, 468, 1564, 1559, 1558, 457, 1599, + 1593, 1559, 1538, 1546, 1552, 1540, 1554, 1550, 1551, 1551, + 1546, 1538, 1537, 1539, 1523, 1527, 1540, 1540, 1532, 1522, + 1525, 1539, 1682, 1525, 1533, 1536, 1517, 1512, 1515, 1565, + 1514, 1524, 1562, 479, 1523, 1511, 1522, 1558, 482, 1562, + 1499, 1514, 460, 1504, 1520, 1501, 1503, 1499, 1505, 1496, + 1495, 1508, 1501, 1503, 1507, 1506, 1500, 80, 1507, 1502, + 1494, 1500, 1500, 1481, 1497, 1483, 1489, 1496, 1484, 1477, + 1491, 1490, 1493, 1475, 1483, 485, 1682, 1682, 497, 1682, + 1682, 1470, 0, 453, 1472, 516, 504, 1526, 1682, 1479, - 1496, 1652, 1490, 541, 1652, 500, 1432, 1442, 1492, 1449, - 480, 1652, 1447, 1489, 1444, 1441, 1442, 402, 1446, 1484, - 1434, 1429, 1426, 1422, 1424, 1473, 1432, 1421, 1470, 1418, - 536, 1431, 1431, 1414, 1415, 1428, 1415, 1416, 1424, 1419, - 1426, 1421, 1406, 475, 1415, 1418, 1413, 1409, 1457, 499, - 510, 1652, 1456, 1403, 1402, 1395, 1397, 1401, 1390, 1397, - 1402, 534, 1447, 1402, 521, 1399, 1403, 1401, 1390, 1390, - 1402, 1384, 1376, 1377, 1398, 1380, 1392, 1391, 1377, 1389, - 1388, 1387, 1386, 1427, 1426, 1425, 1369, 564, 1382, 1652, - 1652, 1381, 0, 510, 1369, 1420, 1419, 1377, 1417, 1652, + 501, 1682, 1524, 1682, 1518, 549, 1682, 498, 1460, 1470, + 1520, 1477, 492, 1682, 1475, 1517, 1472, 1469, 1470, 524, + 1474, 1512, 1462, 1457, 1454, 1503, 1449, 1451, 1500, 1459, + 1448, 1497, 1445, 548, 1458, 1458, 1441, 1442, 1455, 1442, + 1443, 1451, 1446, 1453, 1448, 1433, 482, 1442, 1445, 1440, + 1436, 1484, 192, 522, 1682, 1483, 1430, 1429, 1422, 1424, + 1428, 1417, 1424, 1429, 257, 1474, 1429, 508, 1426, 1430, + 1428, 1417, 1417, 1429, 1411, 1403, 1404, 1425, 1407, 1419, + 1418, 1404, 1416, 1415, 1414, 1413, 1454, 1453, 1452, 1396, + 570, 1409, 1682, 1682, 1408, 0, 523, 1396, 1447, 1446, - 1365, 1415, 1652, 544, 590, 545, 1414, 1356, 1652, 1372, - 1371, 1358, 1357, 1652, 1359, 1356, 1368, 1364, 1352, 1354, - 1652, 1360, 1345, 1347, 1358, 1356, 1351, 571, 1358, 1340, - 1389, 1652, 1338, 1354, 1386, 1390, 1348, 1342, 1344, 1345, - 1347, 1379, 1378, 1331, 1326, 1325, 1327, 1320, 1335, 1313, - 1320, 1325, 1373, 1652, 1320, 1316, 1370, 1652, 1318, 1325, - 1310, 1320, 1323, 1312, 1311, 1306, 1652, 1361, 1652, 1305, - 1304, 1297, 1314, 1351, 1298, 1303, 1312, 1306, 1310, 572, - 1345, 1309, 1289, 1292, 1291, 1299, 1303, 1286, 1342, 1284, - 1652, 1652, 1652, 1289, 1652, 1299, 1333, 1295, 0, 1336, + 1404, 1444, 1682, 1392, 1442, 1682, 547, 597, 524, 1441, + 1383, 1682, 1399, 1398, 1385, 1384, 1682, 1386, 1383, 1395, + 1391, 1379, 1381, 1682, 1387, 1372, 1374, 445, 1385, 1383, + 1378, 576, 1385, 1367, 1416, 1682, 1365, 1381, 1413, 1417, + 1375, 1369, 1371, 1372, 1374, 1406, 1405, 1358, 1353, 1352, + 1354, 1347, 1362, 1340, 1347, 1352, 1400, 1682, 1347, 1343, + 1397, 1682, 1345, 1352, 1337, 1347, 1350, 1339, 1338, 1333, + 1682, 1388, 1682, 1332, 1331, 1324, 1341, 1378, 1325, 1330, + 1339, 1333, 1337, 578, 1372, 1336, 1316, 1319, 1318, 1326, + 1330, 1313, 1369, 1311, 1682, 1682, 1682, 1316, 1682, 1326, - 1286, 1652, 1652, 1283, 1652, 1289, 1652, 550, 558, 586, - 1652, 1327, 1274, 1273, 1280, 1273, 1285, 1284, 1268, 1283, - 1313, 1280, 1316, 1262, 1264, 1276, 1276, 1275, 1652, 1260, - 1257, 1271, 1263, 1269, 1260, 1268, 1652, 1253, 1264, 1268, - 1250, 1264, 1263, 1261, 1244, 1238, 1243, 1240, 1255, 1256, - 1253, 1294, 1251, 1652, 1237, 1239, 1652, 1285, 1284, 574, - 1247, 1230, 1231, 1236, 1227, 1652, 1241, 1227, 612, 1219, - 1240, 1237, 1229, 1272, 1226, 1270, 1652, 1218, 1216, 1230, - 1233, 1265, 1264, 1211, 1262, 1261, 1652, 578, 1223, 1212, - 1214, 1652, 1652, 1257, 1205, 1260, 564, 577, 548, 1219, + 1360, 1322, 0, 1363, 1313, 1682, 1682, 1310, 1682, 1316, + 1682, 530, 547, 596, 1682, 1354, 1301, 1300, 1307, 1300, + 1312, 1311, 1295, 1310, 1340, 1307, 1343, 1289, 1291, 1296, + 1293, 1301, 1301, 1300, 1682, 1285, 1282, 1296, 1288, 1294, + 1285, 1293, 1682, 1278, 1289, 1293, 1275, 1289, 1288, 1286, + 1269, 1263, 1268, 1265, 1280, 1281, 1278, 1319, 1276, 1682, + 1262, 1264, 1682, 1310, 1309, 572, 1272, 1255, 1256, 1261, + 1252, 1682, 1266, 1252, 603, 1244, 1265, 1262, 1254, 1297, + 1251, 1295, 1682, 1243, 1241, 1255, 1258, 1290, 1289, 1236, + 1287, 1286, 1682, 584, 1248, 1237, 1239, 1682, 1682, 1282, - 1253, 1252, 1251, 1205, 1195, 1248, 1210, 1200, 1245, 1208, - 1190, 1198, 1200, 1204, 1239, 1243, 1200, 1199, 1200, 1193, - 1182, 1195, 1198, 1193, 1188, 1193, 1190, 1189, 1181, 1191, - 1186, 1227, 1226, 1170, 1166, 1174, 1222, 1652, 1221, 1170, - 1162, 1177, 1164, 1652, 1164, 1173, 1172, 1172, 1156, 1211, - 1154, 1167, 1652, 1159, 1151, 1160, 1153, 1164, 1141, 1145, - 1196, 1143, 1141, 1152, 1192, 1139, 569, 570, 1133, 1143, - 563, 1652, 1193, 1151, 1140, 1144, 1151, 1188, 1652, 1182, - 590, 1135, 1143, 1135, 1126, 1129, 1125, 1142, 1137, 1125, - 1136, 1120, 1122, 1174, 1120, 1134, 1115, 1165, 1120, 1652, + 1230, 1285, 564, 543, 564, 1244, 1278, 1277, 1276, 1230, + 1220, 1273, 1235, 1225, 1270, 1233, 1215, 1223, 1225, 1224, + 1264, 1227, 1262, 1266, 1223, 1222, 1223, 1216, 1205, 1218, + 1221, 1216, 1211, 1216, 1213, 1212, 1204, 1214, 1209, 1250, + 1249, 1193, 1189, 1197, 1245, 1682, 1244, 1193, 1185, 1200, + 1187, 1682, 1187, 1196, 1195, 1195, 1179, 1234, 1177, 1190, + 1682, 1182, 1174, 1183, 1176, 1187, 1164, 1168, 1219, 1166, + 1164, 1175, 1215, 1162, 565, 573, 1156, 1166, 571, 1682, + 1216, 1174, 1163, 1167, 1174, 1211, 1682, 1205, 567, 1158, + 1166, 1158, 1149, 1152, 1148, 1165, 1160, 1148, 1159, 1143, - 1128, 1126, 1117, 1126, 1122, 1163, 1105, 1105, 1118, 1117, - 1102, 1157, 1110, 1098, 1099, 1652, 1652, 1113, 1110, 1113, - 1652, 1652, 1112, 1097, 596, 1096, 1094, 9, 63, 120, - 235, 1652, 200, 216, 266, 416, 367, 452, 483, 553, - 508, 498, 527, 550, 574, 585, 580, 574, 583, 595, - 585, 639, 598, 603, 580, 1652, 638, 587, 602, 603, - 1652, 623, 631, 611, 601, 615, 609, 604, 605, 601, - 610, 605, 656, 662, 611, 1652, 623, 608, 624, 614, - 626, 620, 665, 633, 617, 619, 1652, 637, 621, 623, - 679, 624, 1652, 639, 644, 624, 643, 681, 641, 631, + 1145, 1197, 1143, 1157, 1138, 1151, 1151, 1186, 1141, 1682, + 1149, 1147, 1138, 1147, 1143, 1184, 1126, 1126, 1139, 1138, + 1123, 1178, 1131, 266, 292, 1682, 1682, 326, 326, 387, + 1682, 1682, 396, 412, 587, 414, 479, 556, 508, 586, + 597, 1682, 570, 586, 588, 631, 581, 583, 577, 641, + 596, 586, 582, 593, 597, 608, 603, 597, 599, 611, + 601, 654, 613, 618, 595, 1682, 653, 602, 617, 617, + 1682, 636, 644, 625, 615, 629, 622, 617, 618, 614, + 623, 618, 669, 675, 624, 1682, 636, 621, 637, 629, + 639, 629, 641, 635, 680, 649, 633, 635, 1682, 653, - 649, 633, 648, 640, 636, 654, 639, 1652, 1652, 647, - 692, 647, 1652, 655, 650, 701, 1652, 652, 657, 651, - 653, 665, 659, 657, 710, 656, 712, 713, 659, 1652, - 658, 666, 664, 663, 677, 678, 679, 695, 700, 674, - 684, 670, 677, 682, 689, 730, 731, 680, 684, 1652, - 679, 698, 695, 733, 684, 702, 703, 689, 697, 706, - 686, 707, 747, 748, 1652, 703, 752, 753, 703, 716, - 718, 702, 703, 710, 761, 710, 725, 764, 716, 720, - 718, 716, 769, 770, 722, 772, 768, 728, 1652, 733, - 726, 735, 729, 724, 734, 730, 1652, 725, 1652, 1652, + 636, 638, 694, 639, 1682, 654, 659, 639, 658, 696, + 656, 646, 664, 648, 663, 655, 651, 669, 654, 1682, + 1682, 662, 707, 662, 1682, 670, 665, 716, 1682, 667, + 672, 666, 668, 680, 674, 672, 725, 671, 727, 728, + 674, 1682, 673, 681, 679, 678, 692, 693, 694, 710, + 715, 689, 699, 685, 692, 697, 704, 745, 746, 695, + 699, 1682, 694, 713, 710, 748, 697, 705, 701, 719, + 720, 706, 714, 723, 703, 724, 764, 767, 1682, 722, + 769, 770, 720, 733, 735, 719, 720, 727, 778, 727, + 742, 781, 733, 737, 735, 733, 786, 787, 739, 789, - 726, 724, 743, 744, 745, 727, 732, 739, 772, 763, - 735, 794, 740, 755, 747, 751, 1652, 1652, 761, 759, - 745, 746, 804, 759, 764, 751, 762, 754, 760, 756, - 774, 775, 1652, 1652, 774, 1652, 776, 1652, 761, 761, - 781, 772, 822, 777, 819, 1652, 776, 826, 1652, 827, - 776, 783, 825, 1652, 1652, 785, 1652, 776, 776, 779, - 793, 780, 791, 838, 797, 835, 841, 842, 791, 844, - 845, 806, 790, 802, 792, 822, 851, 811, 1652, 853, - 802, 798, 814, 819, 807, 859, 818, 1652, 820, 819, - 821, 814, 823, 824, 821, 811, 813, 870, 819, 872, + 785, 745, 1682, 750, 743, 752, 746, 741, 751, 747, + 1682, 742, 1682, 1682, 743, 741, 760, 761, 762, 744, + 749, 756, 789, 780, 752, 811, 757, 772, 764, 768, + 1682, 1682, 778, 776, 762, 763, 821, 776, 818, 786, + 783, 770, 781, 773, 779, 775, 794, 795, 1682, 1682, + 793, 1682, 795, 1682, 780, 781, 801, 791, 841, 796, + 838, 1682, 795, 845, 1682, 846, 795, 802, 844, 1682, + 1682, 804, 1682, 795, 795, 798, 812, 799, 810, 857, + 816, 854, 860, 861, 810, 863, 864, 825, 809, 821, + 811, 841, 870, 830, 1682, 872, 821, 817, 833, 838, - 817, 818, 875, 1652, 813, 828, 879, 1652, 1652, 829, - 839, 824, 840, 826, 886, 887, 833, 889, 848, 1652, - 841, 843, 894, 1652, 1652, 841, 1652, 1652, 848, 898, - 849, 900, 882, 1652, 860, 1652, 847, 846, 849, 849, - 850, 908, 1652, 853, 910, 865, 856, 871, 871, 874, - 874, 871, 876, 1652, 868, 1652, 920, 879, 1652, 880, - 881, 879, 1652, 870, 876, 875, 887, 887, 1652, 1652, - 926, 1652, 891, 876, 882, 1652, 887, 898, 1652, 895, - 1652, 914, 934, 940, 884, 942, 943, 898, 1652, 945, - 1652, 885, 942, 907, 903, 945, 895, 900, 953, 911, + 826, 878, 837, 1682, 839, 841, 831, 840, 842, 835, + 844, 845, 842, 832, 834, 891, 840, 893, 838, 839, + 896, 1682, 835, 850, 900, 1682, 1682, 850, 860, 845, + 861, 847, 906, 908, 854, 911, 870, 1682, 862, 865, + 916, 1682, 1682, 862, 1682, 1682, 869, 919, 870, 921, + 903, 1682, 881, 1682, 868, 867, 870, 870, 871, 929, + 1682, 874, 931, 883, 892, 888, 879, 894, 894, 897, + 897, 894, 899, 1682, 891, 1682, 943, 902, 1682, 904, + 905, 902, 1682, 893, 899, 898, 910, 910, 1682, 1682, + 949, 1682, 914, 899, 905, 1682, 910, 921, 1682, 918, - 1652, 955, 956, 919, 908, 959, 903, 920, 905, 920, - 904, 961, 962, 927, 913, 924, 971, 943, 930, 1652, - 974, 1652, 1652, 923, 1652, 976, 924, 973, 918, 923, - 982, 932, 1652, 938, 1652, 1652, 929, 944, 1652, 982, - 950, 943, 944, 953, 940, 942, 952, 995, 946, 1652, - 997, 944, 1652, 948, 1652, 952, 947, 946, 1004, 959, - 1652, 1001, 963, 966, 1009, 952, 954, 962, 952, 968, - 962, 978, 1017, 1652, 1013, 1652, 978, 1015, 979, 970, - 977, 1652, 974, 979, 1026, 971, 1652, 975, 987, 988, - 1031, 975, 976, 984, 1652, 995, 985, 984, 987, 999, + 1682, 937, 957, 963, 907, 965, 966, 921, 1682, 968, + 1682, 931, 970, 910, 967, 932, 928, 970, 920, 925, + 978, 936, 1682, 980, 981, 944, 933, 984, 928, 945, + 930, 946, 930, 986, 987, 952, 938, 949, 996, 968, + 955, 1682, 999, 1682, 1682, 948, 1682, 945, 1682, 1002, + 950, 999, 944, 949, 1008, 958, 1682, 964, 1682, 1682, + 955, 970, 1682, 1008, 976, 969, 970, 979, 966, 968, + 978, 1021, 972, 1682, 1023, 970, 1682, 975, 971, 1682, + 979, 974, 973, 1031, 986, 1682, 1028, 990, 993, 1036, + 979, 981, 989, 979, 995, 989, 1005, 1044, 1682, 1040, - 990, 999, 1001, 1652, 1043, 1003, 1045, 1046, 1652, 1042, - 1002, 1007, 988, 1051, 1010, 1053, 1012, 1013, 1056, 1015, - 1652, 1020, 1652, 1652, 1002, 1008, 1061, 1022, 1652, 1008, - 1652, 1008, 1010, 1652, 1015, 1010, 1022, 1018, 1652, 1021, - 1025, 1016, 1068, 1017, 1033, 1026, 1021, 1036, 1027, 1034, - 1021, 1036, 1083, 1042, 1085, 1030, 1046, 1037, 1051, 1047, - 1652, 1091, 1652, 1092, 1093, 1050, 1049, 1050, 1652, 1652, - 1652, 1097, 1041, 1057, 1652, 1095, 1046, 1045, 1047, 1058, - 1105, 1056, 1652, 1065, 1108, 1652, 1652, 1114, 1119, 1124, - 1129, 1134, 1139, 1144, 1147, 1121, 1126, 1128, 1141 + 1682, 1005, 1042, 1006, 1007, 998, 1005, 1682, 1002, 1007, + 1054, 999, 1682, 1003, 1015, 1016, 1059, 1003, 1004, 1012, + 1682, 1023, 1013, 1012, 1010, 1016, 1028, 1019, 1028, 1030, + 1682, 1072, 1032, 1074, 1075, 1682, 1071, 1031, 1036, 1017, + 1080, 1039, 1082, 1083, 1042, 1043, 1086, 1045, 1682, 1050, + 1682, 1682, 1032, 1038, 1091, 1052, 1682, 1038, 1682, 1682, + 1038, 1040, 1682, 1045, 1040, 1052, 1048, 1682, 1051, 1055, + 1046, 1098, 1047, 1063, 1056, 1051, 1066, 1057, 1064, 1051, + 1066, 1113, 1072, 1115, 1060, 1076, 1067, 1081, 1077, 1682, + 1121, 1682, 1122, 1123, 1080, 1079, 1080, 1682, 1682, 1682, + 1127, 1071, 1087, 1682, 1125, 1076, 1075, 1077, 1088, 1135, + 1086, 1682, 1095, 1138, 1682, 1682, 1144, 1149, 1154, 1159, + 1164, 1169, 1174, 1177, 1151, 1156, 1158, 1171 } ; -static const flex_int16_t yy_def[1300] = +static const flex_int16_t yy_def[1329] = { 0, - 1288, 1288, 1289, 1289, 1288, 1288, 1288, 1288, 1288, 1288, - 1287, 1287, 1287, 1287, 1287, 1290, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1291, - 1287, 1287, 1287, 1292, 15, 1287, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, + 1317, 1317, 1318, 1318, 1317, 1317, 1317, 1317, 1317, 1317, + 1316, 1316, 1316, 1316, 1316, 1319, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1320, + 1316, 1316, 1316, 1321, 15, 1316, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1322, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1290, 1287, - 1287, 1287, 1287, 1287, 1287, 1294, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1291, 1287, 1292, + 45, 45, 45, 45, 45, 45, 45, 45, 1319, 1316, + 1316, 1316, 1316, 1316, 1316, 1323, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1320, 1316, 1321, - 1287, 1287, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1295, 45, 1293, 45, 45, + 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1324, 45, 1322, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1294, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1296, 45, 45, 45, 1287, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 45, 1295, + 45, 45, 45, 45, 45, 45, 1323, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1325, 45, 45, 45, 1316, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 1287, 1293, 45, 45, 45, 45, 45, 45, 45, 45, + 1324, 1316, 1322, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1297, 45, 45, 45, 45, 45, 1287, 45, 45, 1287, + 45, 45, 45, 45, 45, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1326, 45, 45, 45, 45, 45, 1316, 45, - 45, 1287, 45, 1293, 1287, 45, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 1316, 45, 1322, 1316, 45, 45, 45, + 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 1287, 1287, 1298, 45, 45, 45, 45, 45, 45, 1287, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 1316, 1316, 1327, 45, 45, 45, 45, - 45, 45, 1287, 45, 1293, 45, 45, 45, 1287, 45, - 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 1316, 45, 1322, 45, 45, + 45, 1316, 45, 45, 45, 45, 1316, 45, 45, 45, + 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 45, 45, 45, 1287, 45, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 1316, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1287, 1287, 1287, 45, 1287, 45, 45, 1287, 1299, 45, + 45, 45, 45, 45, 1316, 1316, 1316, 45, 1316, 45, - 45, 1287, 1287, 45, 1287, 45, 1287, 45, 45, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, + 45, 1316, 1328, 45, 45, 1316, 1316, 45, 1316, 45, + 1316, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 45, 45, 1287, 45, 45, 45, - 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, - 45, 1287, 1287, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, - 45, 45, 45, 1287, 45, 45, 45, 45, 45, 45, - 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 1287, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1287, 1287, 45, 45, 45, - 1287, 1287, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1287, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 45, 45, - 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 1287, 1287, 45, - 45, 45, 1287, 45, 45, 45, 1287, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, - 45, 45, 45, 45, 45, 45, 1287, 45, 1287, 1287, - - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1287, 1287, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1287, 1287, 45, 1287, 45, 1287, 45, 45, - 45, 45, 45, 45, 45, 1287, 45, 45, 1287, 45, - 45, 45, 45, 1287, 1287, 45, 1287, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1287, 45, - 45, 45, 45, 45, 45, 45, 45, 1287, 45, 45, + 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, + 45, 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 45, 45, 45, 1287, 1287, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 45, 45, 45, 1287, 1287, 45, 1287, 1287, 45, 45, - 45, 45, 45, 1287, 45, 1287, 45, 45, 45, 45, - 45, 45, 1287, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 45, 1287, 45, 45, 1287, 45, - 45, 45, 1287, 45, 45, 45, 45, 45, 1287, 1287, - 45, 1287, 45, 45, 45, 1287, 45, 45, 1287, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 1287, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 45, 1287, 1287, 45, 1287, 45, 45, 45, 45, 45, - 45, 45, 1287, 45, 1287, 1287, 45, 45, 1287, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1287, - 45, 45, 1287, 45, 1287, 45, 45, 45, 45, 45, - 1287, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1287, 45, 1287, 45, 45, 45, 45, - 45, 1287, 45, 45, 45, 45, 1287, 45, 45, 45, - 45, 45, 45, 45, 1287, 45, 45, 45, 45, 45, - - 45, 45, 45, 1287, 45, 45, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1287, 45, 1287, 1287, 45, 45, 45, 45, 1287, 45, - 1287, 45, 45, 1287, 45, 45, 45, 45, 1287, 45, + 45, 45, 45, 45, 45, 1316, 1316, 45, 45, 45, + 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, + + 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, + 1316, 45, 45, 45, 1316, 45, 45, 45, 1316, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1287, 45, 1287, 45, 45, 45, 45, 45, 1287, 1287, - 1287, 45, 45, 45, 1287, 45, 45, 45, 45, 45, - 45, 45, 1287, 45, 45, 1287, 0, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287 + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 1316, 45, 1316, 1316, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1316, 1316, + 45, 1316, 45, 1316, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 1316, 45, 45, 45, 45, 1316, + 1316, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + + 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 45, 1316, 1316, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, + 45, 1316, 1316, 45, 1316, 1316, 45, 45, 45, 45, + 45, 1316, 45, 1316, 45, 45, 45, 45, 45, 45, + 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1316, 45, 1316, 45, 45, 1316, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 1316, 1316, + 45, 1316, 45, 45, 45, 1316, 45, 45, 1316, 45, + + 1316, 45, 45, 45, 45, 45, 45, 45, 1316, 45, + 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 1316, 1316, 45, 1316, 45, 1316, 45, + 45, 45, 45, 45, 45, 45, 1316, 45, 1316, 1316, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1316, 45, 45, 1316, 45, 45, 1316, + 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, + + 1316, 45, 45, 45, 45, 45, 45, 1316, 45, 45, + 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1316, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, + 1316, 1316, 45, 45, 45, 45, 1316, 45, 1316, 1316, + 45, 45, 1316, 45, 45, 45, 45, 1316, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, + 45, 1316, 45, 45, 45, 45, 45, 1316, 1316, 1316, + + 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, + 45, 1316, 45, 45, 1316, 0, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316 } ; -static const flex_int16_t yy_nxt[1724] = +static const flex_int16_t yy_nxt[1754] = { 0, - 1287, 13, 14, 13, 1287, 15, 16, 1287, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 85, 806, - 37, 14, 37, 86, 25, 26, 38, 1287, 1287, 27, + 1316, 13, 14, 13, 1316, 15, 16, 1316, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 85, 1316, + 37, 14, 37, 86, 25, 26, 38, 1316, 1316, 27, 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, - 13, 14, 13, 13, 14, 13, 32, 40, 140, 13, - 14, 13, 33, 40, 115, 91, 92, 141, 90, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 141, 13, + 14, 13, 33, 40, 115, 91, 92, 142, 90, 34, 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 108, 39, 90, 25, 26, 13, 14, 13, 27, 39, 84, 84, 84, 28, 42, 41, 42, 42, 29, 42, 30, 82, 107, 41, 111, 93, 25, 31, 108, - 130, 137, 88, 807, 88, 808, 32, 89, 89, 89, - 131, 138, 33, 139, 371, 82, 107, 372, 111, 34, + 208, 164, 88, 130, 88, 165, 32, 89, 89, 89, + 209, 131, 33, 132, 374, 82, 107, 375, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 48, 49, 50, 51, 45, 52, 53, @@ -1210,177 +1220,180 @@ static const flex_int16_t yy_nxt[1724] = 73, 74, 75, 76, 77, 78, 57, 45, 45, 45, 45, 45, 80, 103, 81, 81, 81, 80, 109, 83, 83, 83, 101, 114, 80, 82, 83, 83, 83, 121, - 82, 146, 122, 112, 123, 147, 124, 82, 163, 103, - 809, 103, 164, 113, 134, 221, 114, 110, 82, 135, - 191, 107, 136, 82, 192, 148, 112, 102, 222, 810, - 82, 45, 811, 45, 45, 45, 45, 119, 45, 45, - 45, 113, 117, 120, 107, 45, 45, 191, 45, 45, - 89, 89, 89, 193, 45, 132, 45, 45, 45, 45, + 82, 147, 122, 112, 123, 148, 124, 82, 243, 103, + 459, 103, 101, 113, 135, 223, 114, 110, 82, 136, + 460, 107, 137, 82, 193, 149, 112, 102, 224, 244, + 82, 45, 471, 45, 45, 45, 45, 119, 45, 45, + 45, 113, 117, 120, 107, 45, 45, 102, 45, 45, + 89, 89, 89, 194, 45, 133, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 89, 89, - 89, 45, 125, 812, 111, 45, 126, 241, 179, 127, - 128, 142, 143, 45, 177, 144, 152, 45, 199, 45, - 118, 145, 129, 149, 153, 150, 154, 151, 242, 112, - 157, 155, 156, 158, 159, 165, 179, 114, 166, 113, - 177, 199, 178, 177, 160, 167, 168, 161, 84, 84, - 84, 169, 112, 80, 170, 81, 81, 81, 171, 82, - 114, 84, 84, 84, 178, 179, 82, 113, 178, 180, - 173, 88, 82, 88, 172, 174, 89, 89, 89, 101, - 100, 80, 82, 83, 83, 83, 190, 100, 186, 82, + 89, 45, 125, 178, 138, 45, 126, 111, 472, 127, + 128, 143, 144, 45, 139, 145, 140, 45, 807, 45, + 118, 146, 129, 153, 114, 192, 150, 179, 151, 178, + 152, 154, 158, 155, 166, 159, 160, 167, 156, 157, + 180, 112, 808, 225, 168, 169, 161, 114, 178, 162, + 170, 113, 192, 179, 84, 84, 84, 174, 219, 226, + 220, 809, 175, 810, 112, 82, 171, 180, 180, 80, + 172, 81, 81, 81, 181, 179, 191, 221, 88, 113, + 88, 187, 82, 89, 89, 89, 173, 80, 82, 83, - 181, 196, 195, 182, 82, 82, 197, 207, 198, 212, - 213, 231, 418, 218, 186, 219, 419, 208, 195, 214, - 223, 813, 190, 814, 102, 100, 186, 82, 196, 100, - 195, 203, 220, 100, 197, 198, 224, 226, 253, 254, - 227, 100, 204, 263, 228, 100, 247, 100, 185, 202, - 202, 202, 286, 232, 344, 355, 202, 202, 202, 202, - 202, 202, 257, 271, 284, 258, 259, 272, 284, 285, - 286, 273, 285, 295, 292, 286, 264, 265, 266, 202, - 202, 202, 202, 202, 202, 296, 299, 267, 301, 268, - 303, 269, 284, 289, 270, 285, 287, 292, 288, 292, + 83, 83, 84, 84, 84, 183, 196, 100, 197, 198, + 82, 182, 191, 82, 100, 82, 199, 200, 233, 187, + 196, 187, 213, 214, 228, 255, 256, 229, 286, 288, + 811, 230, 215, 82, 196, 197, 82, 198, 204, 812, + 200, 259, 100, 199, 260, 261, 100, 273, 249, 205, + 100, 274, 288, 287, 286, 275, 286, 287, 100, 265, + 234, 288, 100, 294, 100, 186, 203, 203, 203, 813, + 358, 816, 301, 203, 203, 203, 203, 203, 203, 287, + 297, 303, 289, 290, 291, 298, 294, 305, 294, 347, + 530, 397, 266, 267, 268, 301, 203, 203, 203, 203, - 310, 295, 394, 356, 402, 345, 311, 815, 346, 299, - 299, 301, 296, 390, 390, 396, 397, 303, 304, 304, - 304, 399, 306, 411, 398, 304, 304, 304, 304, 304, - 304, 394, 402, 351, 448, 449, 390, 391, 394, 467, - 412, 432, 402, 500, 399, 816, 433, 455, 304, 304, - 304, 304, 304, 304, 405, 405, 405, 456, 817, 818, - 819, 405, 405, 405, 405, 405, 405, 406, 471, 495, - 457, 500, 472, 508, 496, 509, 529, 577, 500, 644, - 597, 530, 578, 672, 405, 405, 405, 405, 405, 405, - 598, 593, 434, 673, 820, 468, 599, 435, 680, 682, + 203, 203, 531, 269, 303, 270, 301, 271, 297, 393, + 272, 308, 298, 312, 305, 306, 306, 306, 359, 313, + 397, 393, 306, 306, 306, 306, 306, 306, 402, 354, + 399, 400, 393, 405, 421, 414, 397, 817, 422, 401, + 348, 452, 453, 349, 394, 306, 306, 306, 306, 306, + 306, 402, 415, 436, 405, 475, 504, 504, 437, 476, + 603, 405, 408, 408, 408, 409, 818, 689, 819, 408, + 408, 408, 408, 408, 408, 499, 512, 652, 513, 604, + 500, 535, 461, 583, 504, 514, 536, 603, 584, 680, + 689, 820, 408, 408, 408, 408, 408, 408, 688, 681, - 508, 681, 509, 45, 45, 45, 510, 597, 821, 683, - 45, 45, 45, 45, 45, 45, 645, 653, 598, 754, - 748, 750, 654, 763, 681, 755, 680, 749, 751, 822, - 823, 824, 825, 45, 45, 45, 45, 45, 45, 802, - 826, 827, 829, 803, 830, 831, 832, 833, 834, 835, - 836, 763, 837, 828, 838, 839, 840, 841, 842, 655, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 839, 861, - 862, 838, 863, 864, 865, 868, 869, 870, 871, 866, - 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, + 773, 599, 821, 512, 438, 513, 605, 604, 661, 439, + 45, 45, 45, 662, 653, 690, 758, 45, 45, 45, + 45, 45, 45, 759, 760, 691, 688, 764, 773, 822, + 814, 761, 823, 765, 815, 824, 825, 826, 827, 828, + 45, 45, 45, 45, 45, 45, 829, 830, 831, 832, + 663, 833, 834, 835, 836, 837, 838, 839, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 840, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, + 872, 851, 873, 874, 850, 875, 876, 877, 878, 879, - 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 882, 893, 894, 895, 896, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 911, 910, - 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 867, 922, 923, 924, 925, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 909, 910, 936, 938, 940, - 941, 942, 937, 943, 944, 945, 946, 947, 948, 949, - 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 882, 883, 884, 885, 880, 886, 887, 888, 889, 890, + 891, 892, 893, 894, 895, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 896, 907, 908, 909, 910, + 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 923, 925, 924, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 881, 936, 937, 938, 939, + 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, + 923, 924, 950, 951, 952, 954, 956, 957, 958, 953, + 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 939, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 976, - 998, 999, 1000, 1001, 1002, 977, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1024, 1025, 1026, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, - 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, - 1059, 1060, 1061, 1033, 1063, 1064, 1065, 1066, 1067, 1068, - 1062, 1069, 1070, 1071, 1072, 1073, 1023, 1074, 1075, 1076, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 955, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 992, 1014, 1015, 1016, + 1017, 1018, 993, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1042, 1043, 1044, 1045, 1046, + 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1056, 1057, + 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, + 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, - 1037, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1082, + 1078, 1079, 1051, 1080, 1081, 1083, 1084, 1085, 1086, 1087, + 1088, 1089, 1082, 1090, 1091, 1041, 1092, 1093, 1094, 1055, + 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, - 1118, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1157, 1158, 1159, 1160, 1156, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1102, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, + 1164, 1165, 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, - 1174, 1175, 1176, 1177, 1178, 1151, 1179, 1180, 1181, 1182, - 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1182, 1183, + 1184, 1185, 1181, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, - 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, - 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, - 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, - 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, - 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, + 1175, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, + 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, - 1283, 1284, 1285, 1286, 12, 12, 12, 12, 12, 36, - 36, 36, 36, 36, 79, 291, 79, 79, 79, 98, - 393, 98, 499, 98, 100, 100, 100, 100, 100, 116, - 116, 116, 116, 116, 176, 100, 176, 176, 176, 200, - 200, 200, 805, 804, 801, 800, 799, 798, 797, 796, - 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, - 785, 784, 783, 782, 781, 780, 779, 778, 777, 776, - 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, - 765, 764, 762, 761, 760, 759, 758, 757, 756, 753, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, + 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, + 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, + 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, + 1312, 1313, 1314, 1315, 12, 12, 12, 12, 12, 36, + 36, 36, 36, 36, 79, 293, 79, 79, 79, 98, + 396, 98, 503, 98, 100, 100, 100, 100, 100, 116, + 116, 116, 116, 116, 177, 100, 177, 177, 177, 201, + 201, 201, 806, 805, 804, 803, 802, 801, 800, 799, + 798, 797, 796, 795, 794, 793, 792, 791, 790, 789, - 752, 747, 746, 745, 744, 743, 742, 741, 740, 739, - 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, - 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, - 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, - 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, - 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, - 688, 687, 686, 685, 684, 679, 678, 677, 676, 675, - 674, 671, 670, 669, 668, 667, 666, 665, 664, 663, - 662, 661, 660, 659, 658, 657, 656, 652, 651, 650, - 649, 648, 647, 646, 643, 642, 641, 640, 639, 638, + 788, 787, 786, 785, 784, 783, 782, 781, 780, 779, + 778, 777, 776, 775, 774, 772, 771, 770, 769, 768, + 767, 766, 763, 762, 757, 756, 755, 754, 753, 752, + 751, 750, 749, 748, 747, 746, 745, 744, 743, 742, + 741, 740, 739, 738, 737, 736, 735, 734, 733, 732, + 731, 730, 729, 728, 727, 726, 725, 724, 723, 722, + 721, 720, 719, 718, 717, 716, 715, 714, 713, 712, + 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, + 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, + 687, 686, 685, 684, 683, 682, 679, 678, 677, 676, - 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, - 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, - 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, - 607, 606, 605, 604, 603, 602, 601, 600, 596, 595, - 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, - 584, 583, 582, 581, 580, 579, 576, 575, 574, 573, - 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, - 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, - 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, + 675, 674, 673, 672, 671, 670, 669, 668, 667, 666, + 665, 664, 660, 659, 658, 657, 656, 655, 654, 651, + 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, + 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, + 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, + 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, + 610, 609, 608, 607, 606, 602, 601, 600, 599, 598, + 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, + 587, 586, 585, 582, 581, 580, 579, 578, 577, 576, + 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, - 532, 531, 528, 527, 526, 525, 524, 523, 522, 521, - 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, - 507, 506, 505, 504, 503, 502, 501, 498, 497, 494, - 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, - 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, - 473, 470, 469, 466, 465, 464, 463, 462, 461, 460, - 459, 458, 454, 453, 452, 451, 450, 447, 446, 445, - 444, 443, 442, 441, 440, 439, 438, 437, 436, 431, - 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, - 420, 417, 416, 415, 414, 413, 410, 409, 408, 407, + 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, + 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, + 545, 544, 543, 542, 541, 540, 539, 538, 537, 534, + 533, 532, 529, 528, 527, 526, 525, 524, 523, 522, + 521, 520, 519, 518, 517, 516, 515, 511, 510, 509, + 508, 507, 506, 505, 502, 501, 498, 497, 496, 495, + 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, + 484, 483, 482, 481, 480, 479, 478, 477, 474, 473, + 470, 469, 468, 467, 466, 465, 464, 463, 462, 458, + 457, 456, 455, 454, 451, 450, 449, 448, 447, 446, - 404, 403, 401, 400, 395, 392, 389, 388, 387, 386, - 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, - 375, 374, 373, 370, 369, 368, 367, 366, 365, 364, - 363, 362, 361, 360, 359, 358, 357, 354, 353, 352, - 350, 349, 348, 347, 343, 342, 341, 340, 339, 338, - 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, - 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, - 317, 316, 315, 314, 313, 312, 309, 308, 307, 305, - 201, 302, 300, 298, 297, 294, 293, 290, 283, 282, - 281, 280, 279, 278, 277, 276, 275, 274, 262, 261, + 445, 444, 443, 442, 441, 440, 435, 434, 433, 432, + 431, 430, 429, 428, 427, 426, 425, 424, 423, 420, + 419, 418, 417, 416, 413, 412, 411, 410, 407, 406, + 404, 403, 398, 395, 392, 391, 390, 389, 388, 387, + 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, + 376, 373, 372, 371, 370, 369, 368, 367, 366, 365, + 364, 363, 362, 361, 360, 357, 356, 355, 353, 352, + 351, 350, 346, 345, 344, 343, 342, 341, 340, 339, + 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, + 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, - 260, 256, 255, 252, 251, 250, 249, 248, 246, 245, - 244, 243, 240, 239, 238, 237, 236, 235, 234, 233, - 230, 229, 225, 217, 216, 215, 211, 210, 209, 206, - 205, 201, 194, 189, 188, 187, 184, 183, 175, 162, - 133, 106, 105, 104, 43, 99, 97, 96, 87, 43, - 1287, 11, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 318, 317, 316, 315, 314, 311, 310, 309, 307, 202, + 304, 302, 300, 299, 296, 295, 292, 285, 284, 283, + 282, 281, 280, 279, 278, 277, 276, 264, 263, 262, + 258, 257, 254, 253, 252, 251, 250, 248, 247, 246, + 245, 242, 241, 240, 239, 238, 237, 236, 235, 232, + 231, 227, 222, 218, 217, 216, 212, 211, 210, 207, + 206, 202, 195, 190, 189, 188, 185, 184, 176, 163, + 134, 106, 105, 104, 43, 99, 97, 96, 87, 43, + 1316, 11, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287 + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316 } ; -static const flex_int16_t yy_chk[1724] = +static const flex_int16_t yy_chk[1754] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 728, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 0, 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, @@ -1392,8 +1405,8 @@ static const flex_int16_t yy_chk[1724] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, - 62, 66, 25, 729, 25, 730, 2, 25, 25, 25, - 62, 66, 2, 66, 266, 20, 51, 266, 54, 2, + 122, 74, 25, 62, 25, 74, 2, 25, 25, 25, + 122, 62, 2, 62, 268, 20, 51, 268, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1404,171 +1417,174 @@ static const flex_int16_t yy_chk[1724] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 47, 17, 17, 17, 19, 53, 19, 19, 19, 44, 56, 22, 17, 22, 22, 22, 60, - 19, 69, 60, 55, 60, 69, 60, 22, 74, 47, - 731, 59, 74, 55, 65, 131, 56, 53, 17, 65, - 108, 63, 65, 19, 109, 69, 55, 44, 131, 733, - 22, 45, 734, 45, 45, 45, 45, 59, 45, 45, - 45, 55, 58, 59, 63, 45, 45, 108, 45, 58, + 19, 69, 60, 55, 60, 69, 60, 22, 147, 47, + 353, 59, 100, 55, 65, 132, 56, 53, 17, 65, + 353, 63, 65, 19, 109, 69, 55, 44, 132, 147, + 22, 45, 365, 45, 45, 45, 45, 59, 45, 45, + 45, 55, 58, 59, 63, 45, 45, 100, 45, 58, 88, 88, 88, 109, 45, 63, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, - 89, 58, 61, 735, 70, 58, 61, 146, 92, 61, - 61, 68, 68, 58, 90, 68, 71, 58, 115, 58, - 58, 68, 61, 70, 71, 70, 71, 70, 146, 76, - 72, 71, 71, 72, 72, 75, 92, 77, 75, 76, - 90, 115, 91, 93, 72, 75, 75, 72, 80, 80, - 80, 75, 76, 81, 76, 81, 81, 81, 76, 80, - 77, 84, 84, 84, 94, 95, 81, 76, 91, 93, - 77, 82, 84, 82, 76, 77, 82, 82, 82, 100, - 102, 83, 80, 83, 83, 83, 107, 102, 103, 81, + 89, 58, 61, 90, 66, 58, 61, 70, 365, 61, + 61, 68, 68, 58, 66, 68, 66, 58, 724, 58, + 58, 68, 61, 71, 77, 108, 70, 91, 70, 90, + 70, 71, 72, 71, 75, 72, 72, 75, 71, 71, + 92, 76, 725, 133, 75, 75, 72, 77, 93, 72, + 75, 76, 108, 91, 80, 80, 80, 77, 130, 133, + 130, 728, 77, 729, 76, 80, 76, 95, 92, 81, + 76, 81, 81, 81, 93, 94, 107, 130, 82, 76, + 82, 103, 81, 82, 82, 82, 76, 83, 80, 83, - 94, 112, 111, 95, 83, 84, 113, 122, 114, 126, - 126, 137, 318, 130, 119, 130, 318, 122, 151, 126, - 132, 736, 107, 737, 100, 102, 103, 83, 112, 102, - 111, 119, 130, 102, 113, 114, 132, 134, 157, 157, - 134, 102, 119, 164, 134, 102, 151, 102, 102, 118, - 118, 118, 179, 137, 242, 251, 118, 118, 118, 118, - 118, 118, 160, 165, 177, 160, 160, 165, 180, 178, - 182, 165, 181, 190, 186, 179, 164, 164, 164, 118, - 118, 118, 118, 118, 118, 191, 195, 164, 197, 164, - 199, 164, 177, 182, 164, 178, 180, 186, 181, 204, + 83, 83, 84, 84, 84, 95, 111, 102, 112, 113, + 83, 94, 107, 84, 102, 81, 114, 115, 138, 103, + 152, 119, 126, 126, 135, 158, 158, 135, 178, 180, + 730, 135, 126, 83, 111, 112, 84, 113, 119, 733, + 115, 161, 102, 114, 161, 161, 102, 166, 152, 119, + 102, 166, 180, 179, 181, 166, 178, 182, 102, 165, + 138, 183, 102, 187, 102, 102, 118, 118, 118, 734, + 253, 736, 196, 118, 118, 118, 118, 118, 118, 179, + 191, 198, 181, 182, 183, 192, 187, 200, 205, 244, + 428, 294, 165, 165, 165, 196, 118, 118, 118, 118, - 208, 190, 292, 251, 299, 242, 208, 738, 242, 195, - 247, 197, 191, 284, 287, 294, 294, 199, 202, 202, - 202, 295, 204, 311, 294, 202, 202, 202, 202, 202, - 202, 292, 299, 247, 344, 344, 284, 287, 306, 362, - 311, 331, 351, 394, 295, 739, 331, 350, 202, 202, - 202, 202, 202, 202, 304, 304, 304, 350, 740, 741, - 742, 304, 304, 304, 304, 304, 304, 306, 365, 388, - 351, 394, 365, 404, 388, 404, 428, 480, 406, 560, - 508, 428, 480, 588, 304, 304, 304, 304, 304, 304, - 509, 510, 331, 588, 743, 362, 510, 331, 597, 599, + 118, 118, 428, 165, 198, 165, 249, 165, 191, 286, + 165, 205, 192, 209, 200, 203, 203, 203, 253, 209, + 294, 289, 203, 203, 203, 203, 203, 203, 297, 249, + 296, 296, 286, 301, 320, 313, 308, 737, 320, 296, + 244, 347, 347, 244, 289, 203, 203, 203, 203, 203, + 203, 297, 313, 334, 354, 368, 397, 409, 334, 368, + 512, 301, 306, 306, 306, 308, 738, 604, 739, 306, + 306, 306, 306, 306, 306, 391, 407, 566, 407, 513, + 391, 432, 354, 484, 397, 409, 432, 512, 484, 594, + 604, 740, 306, 306, 306, 306, 306, 306, 603, 594, - 404, 598, 404, 405, 405, 405, 406, 508, 744, 599, - 405, 405, 405, 405, 405, 405, 560, 569, 509, 671, - 667, 668, 569, 681, 598, 671, 597, 667, 668, 745, - 746, 747, 748, 405, 405, 405, 405, 405, 405, 725, - 749, 750, 751, 725, 752, 753, 754, 755, 757, 758, - 759, 681, 760, 750, 762, 763, 764, 765, 766, 569, - 767, 768, 769, 770, 771, 772, 773, 774, 775, 777, - 778, 779, 780, 781, 782, 783, 784, 785, 763, 786, - 788, 762, 789, 790, 791, 792, 794, 795, 796, 791, - 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, + 689, 514, 741, 407, 334, 407, 514, 513, 575, 334, + 408, 408, 408, 575, 566, 605, 675, 408, 408, 408, + 408, 408, 408, 675, 676, 605, 603, 679, 689, 743, + 735, 676, 744, 679, 735, 745, 746, 747, 748, 749, + 408, 408, 408, 408, 408, 408, 750, 751, 752, 753, + 575, 754, 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 767, 768, 769, 770, 772, 773, 760, + 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 787, 788, 789, 790, 791, 792, 793, 794, + 795, 773, 796, 797, 772, 798, 800, 801, 802, 803, - 807, 810, 811, 812, 814, 815, 816, 818, 819, 820, - 806, 821, 822, 823, 824, 825, 826, 827, 828, 829, - 831, 832, 833, 834, 835, 836, 837, 838, 840, 839, - 841, 842, 843, 844, 845, 846, 847, 848, 849, 851, - 791, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 866, 838, 839, 867, 868, 869, - 870, 871, 867, 872, 873, 874, 875, 876, 877, 878, - 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, - 890, 891, 892, 893, 894, 895, 896, 898, 901, 902, - 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, + 804, 806, 807, 808, 803, 809, 810, 811, 812, 813, + 814, 815, 816, 817, 818, 819, 822, 823, 824, 826, + 827, 828, 830, 831, 832, 818, 833, 834, 835, 836, + 837, 838, 839, 840, 841, 843, 844, 845, 846, 847, + 848, 849, 850, 852, 851, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 863, 803, 864, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, + 850, 851, 878, 880, 881, 882, 883, 884, 885, 881, + 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, + 896, 897, 898, 899, 900, 901, 902, 904, 905, 906, - 868, 913, 914, 915, 916, 919, 920, 921, 922, 923, - 924, 925, 926, 927, 928, 929, 930, 931, 932, 909, - 935, 937, 939, 940, 941, 910, 942, 943, 944, 945, - 947, 948, 950, 951, 952, 953, 956, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 974, 975, 976, 977, 978, 980, 981, - 982, 983, 984, 985, 986, 987, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1005, 1006, 976, 1007, 1010, 1011, 1012, 1013, 1014, - 1006, 1015, 1016, 1017, 1018, 1019, 966, 1021, 1022, 1023, + 907, 908, 909, 910, 912, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 882, 927, 928, + 929, 930, 933, 934, 935, 936, 937, 938, 939, 940, + 941, 942, 943, 944, 945, 946, 923, 947, 948, 951, + 953, 955, 924, 956, 957, 958, 959, 960, 961, 963, + 964, 966, 967, 968, 969, 972, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 980, 1026, 1029, 1030, 1031, 1032, 1033, 1035, 1037, 1038, - 1039, 1040, 1041, 1042, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1053, 1055, 1057, 1058, 1060, 1061, 1033, - 1062, 1064, 1065, 1066, 1067, 1068, 1071, 1073, 1074, 1075, - 1077, 1078, 1080, 1082, 1083, 1084, 1085, 1086, 1087, 1088, - 1090, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, - 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1082, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1121, - 1124, 1126, 1127, 1128, 1129, 1130, 1126, 1131, 1132, 1134, - 1137, 1138, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, + 1020, 1021, 992, 1023, 1024, 1025, 1028, 1029, 1030, 1031, + 1032, 1033, 1024, 1034, 1035, 982, 1036, 1037, 1039, 996, + 1040, 1041, 1044, 1047, 1048, 1049, 1050, 1051, 1053, 1055, + 1056, 1057, 1058, 1059, 1060, 1062, 1063, 1064, 1065, 1066, + 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1075, 1077, 1078, + 1051, 1080, 1081, 1082, 1084, 1085, 1086, 1087, 1088, 1091, + 1093, 1094, 1095, 1097, 1098, 1100, 1102, 1103, 1104, 1105, + 1106, 1107, 1108, 1110, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1124, 1125, 1126, 1127, 1128, + 1129, 1130, 1131, 1102, 1132, 1133, 1134, 1135, 1136, 1137, - 1148, 1149, 1151, 1152, 1154, 1118, 1156, 1157, 1158, 1159, - 1160, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, - 1171, 1172, 1173, 1175, 1177, 1178, 1179, 1180, 1181, 1183, - 1184, 1185, 1186, 1188, 1189, 1190, 1191, 1192, 1193, 1194, - 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1205, 1206, - 1207, 1208, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, - 1218, 1219, 1220, 1222, 1225, 1226, 1227, 1228, 1230, 1232, - 1233, 1235, 1236, 1237, 1238, 1240, 1241, 1242, 1243, 1244, - 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, - 1255, 1256, 1257, 1258, 1259, 1260, 1262, 1264, 1265, 1266, + 1138, 1139, 1140, 1141, 1143, 1146, 1148, 1150, 1151, 1152, + 1153, 1154, 1150, 1155, 1156, 1158, 1161, 1162, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1175, 1176, + 1140, 1178, 1179, 1181, 1182, 1183, 1184, 1185, 1187, 1188, + 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, + 1200, 1202, 1203, 1204, 1205, 1206, 1207, 1209, 1210, 1211, + 1212, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1232, 1233, 1234, + 1235, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1247, 1248, 1250, 1253, 1254, 1255, 1256, 1258, 1261, - 1267, 1268, 1272, 1273, 1274, 1276, 1277, 1278, 1279, 1280, - 1281, 1282, 1284, 1285, 1288, 1288, 1288, 1288, 1288, 1289, - 1289, 1289, 1289, 1289, 1290, 1296, 1290, 1290, 1290, 1291, - 1297, 1291, 1298, 1291, 1292, 1292, 1292, 1292, 1292, 1293, - 1293, 1293, 1293, 1293, 1294, 1299, 1294, 1294, 1294, 1295, - 1295, 1295, 727, 726, 724, 723, 720, 719, 718, 715, - 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, - 704, 703, 702, 701, 699, 698, 697, 696, 695, 694, - 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, - 683, 682, 680, 678, 677, 676, 675, 674, 673, 670, + 1262, 1264, 1265, 1266, 1267, 1269, 1270, 1271, 1272, 1273, + 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, + 1284, 1285, 1286, 1287, 1288, 1289, 1291, 1293, 1294, 1295, + 1296, 1297, 1301, 1302, 1303, 1305, 1306, 1307, 1308, 1309, + 1310, 1311, 1313, 1314, 1317, 1317, 1317, 1317, 1317, 1318, + 1318, 1318, 1318, 1318, 1319, 1325, 1319, 1319, 1319, 1320, + 1326, 1320, 1327, 1320, 1321, 1321, 1321, 1321, 1321, 1322, + 1322, 1322, 1322, 1322, 1323, 1328, 1323, 1323, 1323, 1324, + 1324, 1324, 723, 722, 721, 720, 719, 718, 717, 716, + 715, 714, 713, 712, 711, 709, 708, 707, 706, 705, - 669, 666, 665, 664, 663, 662, 661, 660, 659, 658, - 657, 656, 655, 654, 652, 651, 650, 649, 648, 647, - 646, 645, 643, 642, 641, 640, 639, 637, 636, 635, - 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, - 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, - 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, - 604, 603, 602, 601, 600, 596, 595, 594, 591, 590, - 589, 586, 585, 584, 583, 582, 581, 580, 579, 578, - 576, 575, 574, 573, 572, 571, 570, 568, 567, 565, - 564, 563, 562, 561, 559, 558, 556, 555, 553, 552, + 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, + 694, 693, 692, 691, 690, 688, 686, 685, 684, 683, + 682, 681, 678, 677, 674, 673, 672, 671, 670, 669, + 668, 667, 666, 665, 664, 663, 662, 660, 659, 658, + 657, 656, 655, 654, 653, 651, 650, 649, 648, 647, + 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, + 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, + 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, + 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, + 602, 601, 600, 597, 596, 595, 592, 591, 590, 589, - 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, - 541, 540, 539, 538, 536, 535, 534, 533, 532, 531, - 530, 528, 527, 526, 525, 524, 523, 522, 521, 520, - 519, 518, 517, 516, 515, 514, 513, 512, 506, 504, - 501, 500, 498, 497, 496, 494, 490, 489, 488, 487, - 486, 485, 484, 483, 482, 481, 479, 478, 477, 476, - 475, 474, 473, 472, 471, 470, 468, 466, 465, 464, - 463, 462, 461, 460, 459, 457, 456, 455, 453, 452, - 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, - 441, 440, 439, 438, 437, 436, 435, 434, 433, 431, + 588, 587, 586, 585, 584, 582, 581, 580, 579, 578, + 577, 576, 574, 573, 571, 570, 569, 568, 567, 565, + 564, 562, 561, 559, 558, 557, 556, 555, 554, 553, + 552, 551, 550, 549, 548, 547, 546, 545, 544, 542, + 541, 540, 539, 538, 537, 536, 534, 533, 532, 531, + 530, 529, 528, 527, 526, 525, 524, 523, 522, 521, + 520, 519, 518, 517, 516, 510, 508, 505, 504, 502, + 501, 500, 498, 494, 493, 492, 491, 490, 489, 488, + 487, 486, 485, 483, 482, 481, 480, 479, 478, 477, + 476, 475, 474, 472, 470, 469, 468, 467, 466, 465, - 430, 429, 427, 426, 425, 424, 423, 422, 420, 419, - 418, 417, 416, 415, 413, 412, 411, 410, 408, 407, - 402, 401, 399, 398, 397, 396, 395, 392, 389, 387, + 464, 463, 461, 460, 459, 457, 456, 455, 454, 453, + 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, + 442, 441, 440, 439, 438, 437, 435, 434, 433, 431, + 430, 429, 427, 426, 425, 423, 422, 421, 420, 419, + 418, 416, 415, 414, 413, 411, 410, 405, 404, 402, + 401, 400, 399, 398, 395, 392, 390, 389, 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, - 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, - 366, 364, 363, 361, 360, 359, 358, 357, 356, 355, - 354, 353, 349, 348, 347, 346, 345, 343, 342, 341, - 340, 339, 338, 337, 336, 335, 334, 333, 332, 330, - 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, - 319, 317, 316, 315, 314, 313, 310, 309, 308, 307, + 376, 375, 374, 373, 372, 371, 370, 369, 367, 366, + 364, 363, 362, 361, 360, 359, 358, 357, 356, 352, + 351, 350, 349, 348, 346, 345, 344, 343, 342, 341, - 303, 301, 298, 296, 293, 290, 283, 282, 281, 280, + 340, 339, 338, 337, 336, 335, 333, 332, 331, 330, + 329, 328, 327, 326, 325, 324, 323, 322, 321, 319, + 318, 317, 316, 315, 312, 311, 310, 309, 305, 303, + 300, 298, 295, 292, 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, - 269, 268, 267, 265, 264, 263, 262, 261, 260, 259, - 258, 257, 256, 255, 254, 253, 252, 250, 249, 248, - 246, 245, 244, 243, 241, 240, 239, 238, 237, 236, - 235, 234, 233, 232, 230, 229, 228, 227, 226, 225, + 269, 267, 266, 265, 264, 263, 262, 261, 260, 259, + 258, 257, 256, 255, 254, 252, 251, 250, 248, 247, + 246, 245, 243, 242, 241, 240, 239, 238, 237, 236, + 235, 234, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, - 214, 213, 212, 211, 210, 209, 207, 206, 205, 203, - 200, 198, 196, 194, 193, 188, 187, 183, 175, 174, - 173, 172, 171, 170, 169, 168, 167, 166, 163, 162, - 161, 159, 158, 156, 155, 154, 153, 152, 150, 149, - 148, 147, 145, 144, 143, 142, 141, 140, 139, 138, - 136, 135, 133, 129, 128, 127, 125, 124, 123, 121, + 214, 213, 212, 211, 210, 208, 207, 206, 204, 201, + 199, 197, 195, 194, 189, 188, 184, 176, 175, 174, + 173, 172, 171, 170, 169, 168, 167, 164, 163, 162, + 160, 159, 157, 156, 155, 154, 153, 151, 150, 149, + 148, 146, 145, 144, 143, 142, 141, 140, 139, 137, + 136, 134, 131, 129, 128, 127, 125, 124, 123, 121, 120, 116, 110, 106, 105, 104, 98, 97, 78, 73, 64, 50, 49, 48, 43, 41, 39, 38, 24, 14, - 11, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, + 11, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287 + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 1316, 1316, 1316 } ; static yy_state_type yy_last_accepting_state; @@ -1577,7 +1593,7 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[164] = +static const flex_int16_t yy_rule_linenum[166] = { 0, 145, 147, 149, 154, 155, 160, 161, 162, 174, 177, 182, 189, 198, 207, 216, 225, 234, 243, 252, 261, @@ -1586,17 +1602,17 @@ static const flex_int16_t yy_rule_linenum[164] = 460, 469, 478, 490, 499, 508, 517, 526, 536, 546, 556, 566, 577, 587, 597, 607, 617, 628, 639, 650, 661, 670, 680, 689, 698, 714, 730, 739, 748, 757, - 766, 775, 784, 793, 802, 811, 820, 831, 840, 849, - 858, 868, 878, 887, 897, 907, 916, 925, 934, 943, - 953, 962, 971, 980, 989, 998, 1007, 1016, 1025, 1034, + 766, 775, 784, 793, 802, 811, 820, 831, 841, 850, + 859, 869, 879, 888, 898, 908, 917, 926, 935, 944, + 954, 963, 972, 981, 990, 999, 1008, 1017, 1026, 1035, - 1044, 1053, 1062, 1072, 1085, 1095, 1104, 1113, 1122, 1133, - 1143, 1152, 1162, 1172, 1181, 1190, 1199, 1208, 1218, 1227, - 1237, 1246, 1255, 1264, 1273, 1282, 1291, 1300, 1309, 1318, - 1327, 1336, 1345, 1354, 1363, 1372, 1381, 1390, 1399, 1408, - 1417, 1426, 1435, 1444, 1453, 1463, 1561, 1566, 1571, 1576, - 1577, 1578, 1579, 1580, 1581, 1583, 1601, 1614, 1619, 1623, - 1625, 1627, 1629 + 1045, 1054, 1063, 1073, 1085, 1098, 1108, 1117, 1126, 1135, + 1144, 1155, 1165, 1174, 1184, 1194, 1203, 1212, 1221, 1230, + 1240, 1249, 1259, 1268, 1277, 1286, 1295, 1304, 1313, 1322, + 1331, 1340, 1349, 1358, 1367, 1376, 1385, 1394, 1403, 1412, + 1421, 1430, 1439, 1448, 1457, 1466, 1475, 1485, 1583, 1588, + 1593, 1598, 1599, 1600, 1601, 1602, 1603, 1605, 1623, 1636, + 1641, 1645, 1647, 1649, 1651 } ; /* The intent behind this definition is that it'll catch @@ -1649,7 +1665,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg) -#line 1652 "dhcp6_lexer.cc" +#line 1668 "dhcp6_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1675,8 +1691,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1678 "dhcp6_lexer.cc" -#line 1679 "dhcp6_lexer.cc" +#line 1694 "dhcp6_lexer.cc" +#line 1695 "dhcp6_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2004,7 +2020,7 @@ YY_DECL } -#line 2007 "dhcp6_lexer.cc" +#line 2023 "dhcp6_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2033,13 +2049,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1288 ) + if ( yy_current_state >= 1317 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1287 ); + while ( yy_current_state != 1316 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2058,13 +2074,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 164 ) + else if ( yy_act < 166 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 164 ) + else if ( yy_act == 166 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 165 ) + else if ( yy_act == 167 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -3023,7 +3039,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 840 "dhcp6_lexer.ll" +#line 841 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::KNOWN_CLIENTS: @@ -3035,7 +3051,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 849 "dhcp6_lexer.ll" +#line 850 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3047,7 +3063,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 858 "dhcp6_lexer.ll" +#line 859 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3060,7 +3076,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 868 "dhcp6_lexer.ll" +#line 869 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3073,7 +3089,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 878 "dhcp6_lexer.ll" +#line 879 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3085,7 +3101,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 887 "dhcp6_lexer.ll" +#line 888 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3098,7 +3114,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 897 "dhcp6_lexer.ll" +#line 898 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3111,7 +3127,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 907 "dhcp6_lexer.ll" +#line 908 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3123,7 +3139,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 916 "dhcp6_lexer.ll" +#line 917 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3135,7 +3151,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 925 "dhcp6_lexer.ll" +#line 926 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3147,7 +3163,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 934 "dhcp6_lexer.ll" +#line 935 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3159,7 +3175,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 943 "dhcp6_lexer.ll" +#line 944 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3172,7 +3188,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 953 "dhcp6_lexer.ll" +#line 954 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3184,7 +3200,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 962 "dhcp6_lexer.ll" +#line 963 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3196,7 +3212,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 971 "dhcp6_lexer.ll" +#line 972 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3208,7 +3224,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 980 "dhcp6_lexer.ll" +#line 981 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3220,7 +3236,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 989 "dhcp6_lexer.ll" +#line 990 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3232,7 +3248,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 998 "dhcp6_lexer.ll" +#line 999 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3244,7 +3260,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1007 "dhcp6_lexer.ll" +#line 1008 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3256,7 +3272,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1016 "dhcp6_lexer.ll" +#line 1017 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3268,7 +3284,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1025 "dhcp6_lexer.ll" +#line 1026 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3280,7 +3296,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1034 "dhcp6_lexer.ll" +#line 1035 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3292,7 +3308,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1044 "dhcp6_lexer.ll" +#line 1045 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3304,7 +3320,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1053 "dhcp6_lexer.ll" +#line 1054 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3316,7 +3332,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1062 "dhcp6_lexer.ll" +#line 1063 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3329,7 +3345,22 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1072 "dhcp6_lexer.ll" +#line 1073 "dhcp6_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: + case isc::dhcp::Parser6Context::SHARED_NETWORK: + return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + } +} + YY_BREAK +case 105: +YY_RULE_SETUP +#line 1085 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3343,9 +3374,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 106: YY_RULE_SETUP -#line 1085 "dhcp6_lexer.ll" +#line 1098 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3356,9 +3387,21 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 107: YY_RULE_SETUP -#line 1095 "dhcp6_lexer.ll" +#line 1108 "dhcp6_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::CLIENT_CLASSES: + return isc::dhcp::Dhcp6Parser::make_EVAL_ON_DEMAND(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("eval-on-demand", driver.loc_); + } +} + YY_BREAK +case 108: +YY_RULE_SETUP +#line 1117 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3368,9 +3411,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 109: YY_RULE_SETUP -#line 1104 "dhcp6_lexer.ll" +#line 1126 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3380,9 +3423,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 110: YY_RULE_SETUP -#line 1113 "dhcp6_lexer.ll" +#line 1135 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3392,9 +3435,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 111: YY_RULE_SETUP -#line 1122 "dhcp6_lexer.ll" +#line 1144 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3406,9 +3449,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 112: YY_RULE_SETUP -#line 1133 "dhcp6_lexer.ll" +#line 1155 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3419,9 +3462,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 113: YY_RULE_SETUP -#line 1143 "dhcp6_lexer.ll" +#line 1165 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3431,9 +3474,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 114: YY_RULE_SETUP -#line 1152 "dhcp6_lexer.ll" +#line 1174 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3444,9 +3487,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 115: YY_RULE_SETUP -#line 1162 "dhcp6_lexer.ll" +#line 1184 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3457,9 +3500,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 116: YY_RULE_SETUP -#line 1172 "dhcp6_lexer.ll" +#line 1194 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3469,9 +3512,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 117: YY_RULE_SETUP -#line 1181 "dhcp6_lexer.ll" +#line 1203 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3481,9 +3524,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 118: YY_RULE_SETUP -#line 1190 "dhcp6_lexer.ll" +#line 1212 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3493,9 +3536,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 119: YY_RULE_SETUP -#line 1199 "dhcp6_lexer.ll" +#line 1221 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3505,9 +3548,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 120: YY_RULE_SETUP -#line 1208 "dhcp6_lexer.ll" +#line 1230 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3518,9 +3561,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 121: YY_RULE_SETUP -#line 1218 "dhcp6_lexer.ll" +#line 1240 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3530,9 +3573,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 122: YY_RULE_SETUP -#line 1227 "dhcp6_lexer.ll" +#line 1249 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3542,9 +3585,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 123: YY_RULE_SETUP -#line 1237 "dhcp6_lexer.ll" +#line 1259 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3554,9 +3597,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 124: YY_RULE_SETUP -#line 1246 "dhcp6_lexer.ll" +#line 1268 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3566,9 +3609,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 125: YY_RULE_SETUP -#line 1255 "dhcp6_lexer.ll" +#line 1277 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3578,9 +3621,9 @@ YY_RULE_SETUP } } YY_BREAK -case 124: +case 126: YY_RULE_SETUP -#line 1264 "dhcp6_lexer.ll" +#line 1286 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3590,9 +3633,9 @@ YY_RULE_SETUP } } YY_BREAK -case 125: +case 127: YY_RULE_SETUP -#line 1273 "dhcp6_lexer.ll" +#line 1295 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3602,9 +3645,9 @@ YY_RULE_SETUP } } YY_BREAK -case 126: +case 128: YY_RULE_SETUP -#line 1282 "dhcp6_lexer.ll" +#line 1304 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3614,9 +3657,9 @@ YY_RULE_SETUP } } YY_BREAK -case 127: +case 129: YY_RULE_SETUP -#line 1291 "dhcp6_lexer.ll" +#line 1313 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3626,9 +3669,9 @@ YY_RULE_SETUP } } YY_BREAK -case 128: +case 130: YY_RULE_SETUP -#line 1300 "dhcp6_lexer.ll" +#line 1322 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3638,9 +3681,9 @@ YY_RULE_SETUP } } YY_BREAK -case 129: +case 131: YY_RULE_SETUP -#line 1309 "dhcp6_lexer.ll" +#line 1331 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3650,9 +3693,9 @@ YY_RULE_SETUP } } YY_BREAK -case 130: +case 132: YY_RULE_SETUP -#line 1318 "dhcp6_lexer.ll" +#line 1340 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3662,9 +3705,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 133: YY_RULE_SETUP -#line 1327 "dhcp6_lexer.ll" +#line 1349 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3674,9 +3717,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 134: YY_RULE_SETUP -#line 1336 "dhcp6_lexer.ll" +#line 1358 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3686,9 +3729,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 135: YY_RULE_SETUP -#line 1345 "dhcp6_lexer.ll" +#line 1367 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3698,9 +3741,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 136: YY_RULE_SETUP -#line 1354 "dhcp6_lexer.ll" +#line 1376 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3710,9 +3753,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 137: YY_RULE_SETUP -#line 1363 "dhcp6_lexer.ll" +#line 1385 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3722,9 +3765,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 138: YY_RULE_SETUP -#line 1372 "dhcp6_lexer.ll" +#line 1394 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3734,9 +3777,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 139: YY_RULE_SETUP -#line 1381 "dhcp6_lexer.ll" +#line 1403 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3746,9 +3789,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 140: YY_RULE_SETUP -#line 1390 "dhcp6_lexer.ll" +#line 1412 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3758,9 +3801,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 141: YY_RULE_SETUP -#line 1399 "dhcp6_lexer.ll" +#line 1421 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3770,9 +3813,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 142: YY_RULE_SETUP -#line 1408 "dhcp6_lexer.ll" +#line 1430 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3782,9 +3825,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 143: YY_RULE_SETUP -#line 1417 "dhcp6_lexer.ll" +#line 1439 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3794,9 +3837,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 144: YY_RULE_SETUP -#line 1426 "dhcp6_lexer.ll" +#line 1448 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3806,9 +3849,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 145: YY_RULE_SETUP -#line 1435 "dhcp6_lexer.ll" +#line 1457 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3818,9 +3861,9 @@ YY_RULE_SETUP } } YY_BREAK -case 144: +case 146: YY_RULE_SETUP -#line 1444 "dhcp6_lexer.ll" +#line 1466 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3830,9 +3873,9 @@ YY_RULE_SETUP } } YY_BREAK -case 145: +case 147: YY_RULE_SETUP -#line 1453 "dhcp6_lexer.ll" +#line 1475 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3842,9 +3885,9 @@ YY_RULE_SETUP } } YY_BREAK -case 146: +case 148: YY_RULE_SETUP -#line 1463 "dhcp6_lexer.ll" +#line 1485 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3943,65 +3986,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 147: -/* rule 147 can match eol */ +case 149: +/* rule 149 can match eol */ YY_RULE_SETUP -#line 1561 "dhcp6_lexer.ll" +#line 1583 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 148: -/* rule 148 can match eol */ +case 150: +/* rule 150 can match eol */ YY_RULE_SETUP -#line 1566 "dhcp6_lexer.ll" +#line 1588 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 149: +case 151: YY_RULE_SETUP -#line 1571 "dhcp6_lexer.ll" +#line 1593 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 150: -YY_RULE_SETUP -#line 1576 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK -case 151: -YY_RULE_SETUP -#line 1577 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } - YY_BREAK case 152: YY_RULE_SETUP -#line 1578 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1598 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1579 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1599 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1580 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } +#line 1600 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 155: YY_RULE_SETUP -#line 1581 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } +#line 1601 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 156: YY_RULE_SETUP -#line 1583 "dhcp6_lexer.ll" +#line 1602 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } + YY_BREAK +case 157: +YY_RULE_SETUP +#line 1603 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } + YY_BREAK +case 158: +YY_RULE_SETUP +#line 1605 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4020,9 +4063,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 157: +case 159: YY_RULE_SETUP -#line 1601 "dhcp6_lexer.ll" +#line 1623 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4036,43 +4079,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 158: +case 160: YY_RULE_SETUP -#line 1614 "dhcp6_lexer.ll" +#line 1636 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 159: +case 161: YY_RULE_SETUP -#line 1619 "dhcp6_lexer.ll" +#line 1641 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 160: -YY_RULE_SETUP -#line 1623 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK -case 161: -YY_RULE_SETUP -#line 1625 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK case 162: YY_RULE_SETUP -#line 1627 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); +#line 1645 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 163: YY_RULE_SETUP -#line 1629 "dhcp6_lexer.ll" +#line 1647 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK +case 164: +YY_RULE_SETUP +#line 1649 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 165: +YY_RULE_SETUP +#line 1651 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1631 "dhcp6_lexer.ll" +#line 1653 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4096,12 +4139,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 164: +case 166: YY_RULE_SETUP -#line 1654 "dhcp6_lexer.ll" +#line 1676 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4103 "dhcp6_lexer.cc" +#line 4147 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4420,7 +4463,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1288 ) + if ( yy_current_state >= 1317 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4453,11 +4496,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1288 ) + if ( yy_current_state >= 1317 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1287); + yy_is_jam = (yy_current_state == 1316); return yy_is_jam ? 0 : yy_current_state; } @@ -5206,7 +5249,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1654 "dhcp6_lexer.ll" +#line 1676 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 0747d12c48..5196a4b01c 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -949,7 +949,7 @@ client_class: CLIENT_CLASS { ctx.leave(); }; -+eval_client_classes: EVAL_CLIENT_CLASSES { +eval_client_classes: EVAL_CLIENT_CLASSES { ElementPtr c(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("eval-client-classes", c); ctx.stack_.push_back(c); diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index a4c2b72f9b..a46ed39111 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,3 +1,6 @@ +// Generated 201711270201 +// Generated 201711270201 +// Generated 201711270201 // Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 474b341ca5..6d58434f36 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,3 +1,6 @@ +// Generated 201711270201 +// Generated 201711270201 +// Generated 201711270201 // Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index c57d21f6b2..7183f849aa 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,3 +1,6 @@ +// Generated 201711270201 +// Generated 201711270201 +// Generated 201711270201 // Generated 201711191033 // A Bison parser, made by GNU Bison 3.0.4. diff --git a/src/lib/eval/location.hh b/src/lib/eval/location.hh index afce8e45e7..6c10901951 100644 --- a/src/lib/eval/location.hh +++ b/src/lib/eval/location.hh @@ -1,4 +1,4 @@ -// Generated 201711240833 +// Generated 201711270203 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/lib/eval/position.hh b/src/lib/eval/position.hh index 8292fb4f0e..01a150e6ab 100644 --- a/src/lib/eval/position.hh +++ b/src/lib/eval/position.hh @@ -1,4 +1,4 @@ -// Generated 201711240833 +// Generated 201711270203 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/lib/eval/stack.hh b/src/lib/eval/stack.hh index cc15969074..0304add897 100644 --- a/src/lib/eval/stack.hh +++ b/src/lib/eval/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711240833 +// Generated 201711270203 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 920a75fe37a5b7728e703fa5a82aac97cfdf91cd Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 02:10:43 +0000 Subject: [PATCH 29/52] [trac5374] regen bison --- src/bin/dhcp4/dhcp4_parser.cc | 2 +- src/bin/dhcp4/dhcp4_parser.yy | 2 +- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_parser.cc | 2989 +++++++++++++++++---------------- src/bin/dhcp6/dhcp6_parser.h | 298 ++-- src/bin/dhcp6/dhcp6_parser.yy | 2 +- src/bin/dhcp6/location.hh | 5 +- src/bin/dhcp6/position.hh | 5 +- src/bin/dhcp6/stack.hh | 5 +- 11 files changed, 1685 insertions(+), 1629 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index d69aa47e56..c93560eb02 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -2727,7 +2727,7 @@ namespace isc { namespace dhcp { #line 1613 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("eval-on-demand"); + ctx.stack_.back()->set("eval-on-demand", b); } #line 2733 "dhcp4_parser.cc" // lalr1.cc:859 break; diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 2b83ced450..066bfc1498 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1612,7 +1612,7 @@ client_class_test: TEST { eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); - ctx.stack_.back()->set("eval-on-demand"); + ctx.stack_.back()->set("eval-on-demand", b); }; // --- end of client classes --------------------------------- diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index c963e41946..0bd41b683b 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201711270201 +// Generated 201711270209 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index ff40d48564..5eb004d047 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201711270201 +// Generated 201711270209 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index c3d3506011..bc8092c73f 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711270201 +// Generated 201711270209 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index f00484b8a3..1031693c98 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -253,30 +253,30 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 156: // "boolean" + case 158: // "boolean" value.move< bool > (that.value); break; - case 155: // "floating point" + case 157: // "floating point" value.move< double > (that.value); break; - case 154: // "integer" + case 156: // "integer" value.move< int64_t > (that.value); break; - case 153: // "constant string" + case 155: // "constant string" value.move< std::string > (that.value); break; @@ -295,30 +295,30 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 156: // "boolean" + case 158: // "boolean" value.copy< bool > (that.value); break; - case 155: // "floating point" + case 157: // "floating point" value.copy< double > (that.value); break; - case 154: // "integer" + case 156: // "integer" value.copy< int64_t > (that.value); break; - case 153: // "constant string" + case 155: // "constant string" value.copy< std::string > (that.value); break; @@ -358,86 +358,86 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 153: // "constant string" + case 155: // "constant string" -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 366 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 154: // "integer" + case 156: // "integer" -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } #line 373 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 155: // "floating point" + case 157: // "floating point" -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } #line 380 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 156: // "boolean" + case 158: // "boolean" -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } #line 387 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 172: // value + case 174: // value -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 394 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 176: // map_value + case 178: // map_value -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 401 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 220: // db_type + case 222: // db_type -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 408 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 296: // hr_mode + case 300: // hr_mode -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 415 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 367: // known_clients_value + case 371: // known_clients_value -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 422 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 431: // duid_type + case 436: // duid_type -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 429 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 464: // ncr_protocol_value + case 469: // ncr_protocol_value -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 436 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 472: // replace_client_name_value + case 477: // replace_client_name_value -#line 230 "dhcp6_parser.yy" // lalr1.cc:636 +#line 232 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 443 "dhcp6_parser.cc" // lalr1.cc:636 break; @@ -639,30 +639,30 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 156: // "boolean" + case 158: // "boolean" yylhs.value.build< bool > (); break; - case 155: // "floating point" + case 157: // "floating point" yylhs.value.build< double > (); break; - case 154: // "integer" + case 156: // "integer" yylhs.value.build< int64_t > (); break; - case 153: // "constant string" + case 155: // "constant string" yylhs.value.build< std::string > (); break; @@ -684,127 +684,127 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 239 "dhcp6_parser.yy" // lalr1.cc:859 +#line 241 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } #line 690 "dhcp6_parser.cc" // lalr1.cc:859 break; case 4: -#line 240 "dhcp6_parser.yy" // lalr1.cc:859 +#line 242 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } #line 696 "dhcp6_parser.cc" // lalr1.cc:859 break; case 6: -#line 241 "dhcp6_parser.yy" // lalr1.cc:859 +#line 243 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } #line 702 "dhcp6_parser.cc" // lalr1.cc:859 break; case 8: -#line 242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 244 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } #line 708 "dhcp6_parser.cc" // lalr1.cc:859 break; case 10: -#line 243 "dhcp6_parser.yy" // lalr1.cc:859 +#line 245 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET6; } #line 714 "dhcp6_parser.cc" // lalr1.cc:859 break; case 12: -#line 244 "dhcp6_parser.yy" // lalr1.cc:859 +#line 246 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } #line 720 "dhcp6_parser.cc" // lalr1.cc:859 break; case 14: -#line 245 "dhcp6_parser.yy" // lalr1.cc:859 +#line 247 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.PD_POOLS; } #line 726 "dhcp6_parser.cc" // lalr1.cc:859 break; case 16: -#line 246 "dhcp6_parser.yy" // lalr1.cc:859 +#line 248 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } #line 732 "dhcp6_parser.cc" // lalr1.cc:859 break; case 18: -#line 247 "dhcp6_parser.yy" // lalr1.cc:859 +#line 249 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } #line 738 "dhcp6_parser.cc" // lalr1.cc:859 break; case 20: -#line 248 "dhcp6_parser.yy" // lalr1.cc:859 +#line 250 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } #line 744 "dhcp6_parser.cc" // lalr1.cc:859 break; case 22: -#line 249 "dhcp6_parser.yy" // lalr1.cc:859 +#line 251 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } #line 750 "dhcp6_parser.cc" // lalr1.cc:859 break; case 24: -#line 250 "dhcp6_parser.yy" // lalr1.cc:859 +#line 252 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } #line 756 "dhcp6_parser.cc" // lalr1.cc:859 break; case 26: -#line 251 "dhcp6_parser.yy" // lalr1.cc:859 +#line 253 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } #line 762 "dhcp6_parser.cc" // lalr1.cc:859 break; case 28: -#line 259 "dhcp6_parser.yy" // lalr1.cc:859 +#line 261 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } #line 768 "dhcp6_parser.cc" // lalr1.cc:859 break; case 29: -#line 260 "dhcp6_parser.yy" // lalr1.cc:859 +#line 262 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } #line 774 "dhcp6_parser.cc" // lalr1.cc:859 break; case 30: -#line 261 "dhcp6_parser.yy" // lalr1.cc:859 +#line 263 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } #line 780 "dhcp6_parser.cc" // lalr1.cc:859 break; case 31: -#line 262 "dhcp6_parser.yy" // lalr1.cc:859 +#line 264 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } #line 786 "dhcp6_parser.cc" // lalr1.cc:859 break; case 32: -#line 263 "dhcp6_parser.yy" // lalr1.cc:859 +#line 265 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } #line 792 "dhcp6_parser.cc" // lalr1.cc:859 break; case 33: -#line 264 "dhcp6_parser.yy" // lalr1.cc:859 +#line 266 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 798 "dhcp6_parser.cc" // lalr1.cc:859 break; case 34: -#line 265 "dhcp6_parser.yy" // lalr1.cc:859 +#line 267 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 804 "dhcp6_parser.cc" // lalr1.cc:859 break; case 35: -#line 268 "dhcp6_parser.yy" // lalr1.cc:859 +#line 270 "dhcp6_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); @@ -813,7 +813,7 @@ namespace isc { namespace dhcp { break; case 36: -#line 273 "dhcp6_parser.yy" // lalr1.cc:859 +#line 275 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -824,7 +824,7 @@ namespace isc { namespace dhcp { break; case 37: -#line 278 "dhcp6_parser.yy" // lalr1.cc:859 +#line 280 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -834,13 +834,13 @@ namespace isc { namespace dhcp { break; case 38: -#line 284 "dhcp6_parser.yy" // lalr1.cc:859 +#line 286 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 840 "dhcp6_parser.cc" // lalr1.cc:859 break; case 41: -#line 291 "dhcp6_parser.yy" // lalr1.cc:859 +#line 293 "dhcp6_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); @@ -849,7 +849,7 @@ namespace isc { namespace dhcp { break; case 42: -#line 295 "dhcp6_parser.yy" // lalr1.cc:859 +#line 297 "dhcp6_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value @@ -859,7 +859,7 @@ namespace isc { namespace dhcp { break; case 43: -#line 302 "dhcp6_parser.yy" // lalr1.cc:859 +#line 304 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); @@ -868,7 +868,7 @@ namespace isc { namespace dhcp { break; case 44: -#line 305 "dhcp6_parser.yy" // lalr1.cc:859 +#line 307 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } @@ -876,7 +876,7 @@ namespace isc { namespace dhcp { break; case 47: -#line 313 "dhcp6_parser.yy" // lalr1.cc:859 +#line 315 "dhcp6_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -885,7 +885,7 @@ namespace isc { namespace dhcp { break; case 48: -#line 317 "dhcp6_parser.yy" // lalr1.cc:859 +#line 319 "dhcp6_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -894,7 +894,7 @@ namespace isc { namespace dhcp { break; case 49: -#line 324 "dhcp6_parser.yy" // lalr1.cc:859 +#line 326 "dhcp6_parser.yy" // lalr1.cc:859 { // List parsing about to start } @@ -902,7 +902,7 @@ namespace isc { namespace dhcp { break; case 50: -#line 326 "dhcp6_parser.yy" // lalr1.cc:859 +#line 328 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); @@ -911,7 +911,7 @@ namespace isc { namespace dhcp { break; case 53: -#line 335 "dhcp6_parser.yy" // lalr1.cc:859 +#line 337 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -920,7 +920,7 @@ namespace isc { namespace dhcp { break; case 54: -#line 339 "dhcp6_parser.yy" // lalr1.cc:859 +#line 341 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -929,7 +929,7 @@ namespace isc { namespace dhcp { break; case 55: -#line 350 "dhcp6_parser.yy" // lalr1.cc:859 +#line 352 "dhcp6_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); @@ -940,7 +940,7 @@ namespace isc { namespace dhcp { break; case 56: -#line 360 "dhcp6_parser.yy" // lalr1.cc:859 +#line 362 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -951,7 +951,7 @@ namespace isc { namespace dhcp { break; case 57: -#line 365 "dhcp6_parser.yy" // lalr1.cc:859 +#line 367 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -964,7 +964,7 @@ namespace isc { namespace dhcp { break; case 66: -#line 388 "dhcp6_parser.yy" // lalr1.cc:859 +#line 390 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -977,7 +977,7 @@ namespace isc { namespace dhcp { break; case 67: -#line 395 "dhcp6_parser.yy" // lalr1.cc:859 +#line 397 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); @@ -987,7 +987,7 @@ namespace isc { namespace dhcp { break; case 68: -#line 403 "dhcp6_parser.yy" // lalr1.cc:859 +#line 405 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Dhcp6 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -997,7 +997,7 @@ namespace isc { namespace dhcp { break; case 69: -#line 407 "dhcp6_parser.yy" // lalr1.cc:859 +#line 409 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed @@ -1006,7 +1006,7 @@ namespace isc { namespace dhcp { break; case 95: -#line 443 "dhcp6_parser.yy" // lalr1.cc:859 +#line 445 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("preferred-lifetime", prf); @@ -1015,7 +1015,7 @@ namespace isc { namespace dhcp { break; case 96: -#line 448 "dhcp6_parser.yy" // lalr1.cc:859 +#line 450 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); @@ -1024,7 +1024,7 @@ namespace isc { namespace dhcp { break; case 97: -#line 453 "dhcp6_parser.yy" // lalr1.cc:859 +#line 455 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); @@ -1033,7 +1033,7 @@ namespace isc { namespace dhcp { break; case 98: -#line 458 "dhcp6_parser.yy" // lalr1.cc:859 +#line 460 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); @@ -1042,7 +1042,7 @@ namespace isc { namespace dhcp { break; case 99: -#line 463 "dhcp6_parser.yy" // lalr1.cc:859 +#line 465 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); @@ -1051,7 +1051,7 @@ namespace isc { namespace dhcp { break; case 100: -#line 468 "dhcp6_parser.yy" // lalr1.cc:859 +#line 470 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); @@ -1062,7 +1062,7 @@ namespace isc { namespace dhcp { break; case 101: -#line 473 "dhcp6_parser.yy" // lalr1.cc:859 +#line 475 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); @@ -1072,7 +1072,7 @@ namespace isc { namespace dhcp { break; case 102: -#line 479 "dhcp6_parser.yy" // lalr1.cc:859 +#line 481 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1082,7 +1082,7 @@ namespace isc { namespace dhcp { break; case 103: -#line 483 "dhcp6_parser.yy" // lalr1.cc:859 +#line 485 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed @@ -1091,7 +1091,7 @@ namespace isc { namespace dhcp { break; case 108: -#line 496 "dhcp6_parser.yy" // lalr1.cc:859 +#line 498 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); @@ -1102,7 +1102,7 @@ namespace isc { namespace dhcp { break; case 109: -#line 501 "dhcp6_parser.yy" // lalr1.cc:859 +#line 503 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1111,7 +1111,7 @@ namespace isc { namespace dhcp { break; case 110: -#line 506 "dhcp6_parser.yy" // lalr1.cc:859 +#line 508 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); @@ -1120,7 +1120,7 @@ namespace isc { namespace dhcp { break; case 111: -#line 512 "dhcp6_parser.yy" // lalr1.cc:859 +#line 514 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); @@ -1131,7 +1131,7 @@ namespace isc { namespace dhcp { break; case 112: -#line 517 "dhcp6_parser.yy" // lalr1.cc:859 +#line 519 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1142,7 +1142,7 @@ namespace isc { namespace dhcp { break; case 113: -#line 524 "dhcp6_parser.yy" // lalr1.cc:859 +#line 526 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); @@ -1153,7 +1153,7 @@ namespace isc { namespace dhcp { break; case 114: -#line 529 "dhcp6_parser.yy" // lalr1.cc:859 +#line 531 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1164,7 +1164,7 @@ namespace isc { namespace dhcp { break; case 130: -#line 555 "dhcp6_parser.yy" // lalr1.cc:859 +#line 557 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } @@ -1172,7 +1172,7 @@ namespace isc { namespace dhcp { break; case 131: -#line 557 "dhcp6_parser.yy" // lalr1.cc:859 +#line 559 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1181,31 +1181,31 @@ namespace isc { namespace dhcp { break; case 132: -#line 562 "dhcp6_parser.yy" // lalr1.cc:859 +#line 564 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } #line 1187 "dhcp6_parser.cc" // lalr1.cc:859 break; case 133: -#line 563 "dhcp6_parser.yy" // lalr1.cc:859 +#line 565 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } #line 1193 "dhcp6_parser.cc" // lalr1.cc:859 break; case 134: -#line 564 "dhcp6_parser.yy" // lalr1.cc:859 +#line 566 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } #line 1199 "dhcp6_parser.cc" // lalr1.cc:859 break; case 135: -#line 565 "dhcp6_parser.yy" // lalr1.cc:859 +#line 567 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } #line 1205 "dhcp6_parser.cc" // lalr1.cc:859 break; case 136: -#line 568 "dhcp6_parser.yy" // lalr1.cc:859 +#line 570 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1213,7 +1213,7 @@ namespace isc { namespace dhcp { break; case 137: -#line 570 "dhcp6_parser.yy" // lalr1.cc:859 +#line 572 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); @@ -1223,7 +1223,7 @@ namespace isc { namespace dhcp { break; case 138: -#line 576 "dhcp6_parser.yy" // lalr1.cc:859 +#line 578 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1231,7 +1231,7 @@ namespace isc { namespace dhcp { break; case 139: -#line 578 "dhcp6_parser.yy" // lalr1.cc:859 +#line 580 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); @@ -1241,7 +1241,7 @@ namespace isc { namespace dhcp { break; case 140: -#line 584 "dhcp6_parser.yy" // lalr1.cc:859 +#line 586 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1249,7 +1249,7 @@ namespace isc { namespace dhcp { break; case 141: -#line 586 "dhcp6_parser.yy" // lalr1.cc:859 +#line 588 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); @@ -1259,7 +1259,7 @@ namespace isc { namespace dhcp { break; case 142: -#line 592 "dhcp6_parser.yy" // lalr1.cc:859 +#line 594 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); @@ -1268,7 +1268,7 @@ namespace isc { namespace dhcp { break; case 143: -#line 597 "dhcp6_parser.yy" // lalr1.cc:859 +#line 599 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1276,7 +1276,7 @@ namespace isc { namespace dhcp { break; case 144: -#line 599 "dhcp6_parser.yy" // lalr1.cc:859 +#line 601 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); @@ -1286,7 +1286,7 @@ namespace isc { namespace dhcp { break; case 145: -#line 605 "dhcp6_parser.yy" // lalr1.cc:859 +#line 607 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); @@ -1295,7 +1295,7 @@ namespace isc { namespace dhcp { break; case 146: -#line 610 "dhcp6_parser.yy" // lalr1.cc:859 +#line 612 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); @@ -1304,7 +1304,7 @@ namespace isc { namespace dhcp { break; case 147: -#line 615 "dhcp6_parser.yy" // lalr1.cc:859 +#line 617 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); @@ -1313,7 +1313,7 @@ namespace isc { namespace dhcp { break; case 148: -#line 620 "dhcp6_parser.yy" // lalr1.cc:859 +#line 622 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); @@ -1322,7 +1322,7 @@ namespace isc { namespace dhcp { break; case 149: -#line 625 "dhcp6_parser.yy" // lalr1.cc:859 +#line 627 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1330,7 +1330,7 @@ namespace isc { namespace dhcp { break; case 150: -#line 627 "dhcp6_parser.yy" // lalr1.cc:859 +#line 629 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); @@ -1340,7 +1340,7 @@ namespace isc { namespace dhcp { break; case 151: -#line 633 "dhcp6_parser.yy" // lalr1.cc:859 +#line 635 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1348,7 +1348,7 @@ namespace isc { namespace dhcp { break; case 152: -#line 635 "dhcp6_parser.yy" // lalr1.cc:859 +#line 637 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); @@ -1358,7 +1358,7 @@ namespace isc { namespace dhcp { break; case 153: -#line 642 "dhcp6_parser.yy" // lalr1.cc:859 +#line 644 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("mac-sources", l); @@ -1369,7 +1369,7 @@ namespace isc { namespace dhcp { break; case 154: -#line 647 "dhcp6_parser.yy" // lalr1.cc:859 +#line 649 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1378,7 +1378,7 @@ namespace isc { namespace dhcp { break; case 159: -#line 660 "dhcp6_parser.yy" // lalr1.cc:859 +#line 662 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); @@ -1387,7 +1387,7 @@ namespace isc { namespace dhcp { break; case 160: -#line 665 "dhcp6_parser.yy" // lalr1.cc:859 +#line 667 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); @@ -1396,7 +1396,7 @@ namespace isc { namespace dhcp { break; case 161: -#line 670 "dhcp6_parser.yy" // lalr1.cc:859 +#line 672 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); @@ -1407,7 +1407,7 @@ namespace isc { namespace dhcp { break; case 162: -#line 675 "dhcp6_parser.yy" // lalr1.cc:859 +#line 677 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1416,7 +1416,7 @@ namespace isc { namespace dhcp { break; case 168: -#line 689 "dhcp6_parser.yy" // lalr1.cc:859 +#line 691 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); @@ -1425,7 +1425,7 @@ namespace isc { namespace dhcp { break; case 169: -#line 694 "dhcp6_parser.yy" // lalr1.cc:859 +#line 696 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); @@ -1434,7 +1434,7 @@ namespace isc { namespace dhcp { break; case 170: -#line 701 "dhcp6_parser.yy" // lalr1.cc:859 +#line 703 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay-supplied-options", l); @@ -1445,7 +1445,7 @@ namespace isc { namespace dhcp { break; case 171: -#line 706 "dhcp6_parser.yy" // lalr1.cc:859 +#line 708 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1454,7 +1454,7 @@ namespace isc { namespace dhcp { break; case 172: -#line 711 "dhcp6_parser.yy" // lalr1.cc:859 +#line 713 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); @@ -1465,7 +1465,7 @@ namespace isc { namespace dhcp { break; case 173: -#line 716 "dhcp6_parser.yy" // lalr1.cc:859 +#line 718 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1474,7 +1474,7 @@ namespace isc { namespace dhcp { break; case 178: -#line 729 "dhcp6_parser.yy" // lalr1.cc:859 +#line 731 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -1484,7 +1484,7 @@ namespace isc { namespace dhcp { break; case 179: -#line 733 "dhcp6_parser.yy" // lalr1.cc:859 +#line 735 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1494,7 +1494,7 @@ namespace isc { namespace dhcp { break; case 180: -#line 739 "dhcp6_parser.yy" // lalr1.cc:859 +#line 741 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1504,7 +1504,7 @@ namespace isc { namespace dhcp { break; case 181: -#line 743 "dhcp6_parser.yy" // lalr1.cc:859 +#line 745 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1514,7 +1514,7 @@ namespace isc { namespace dhcp { break; case 187: -#line 758 "dhcp6_parser.yy" // lalr1.cc:859 +#line 760 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1522,7 +1522,7 @@ namespace isc { namespace dhcp { break; case 188: -#line 760 "dhcp6_parser.yy" // lalr1.cc:859 +#line 762 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); @@ -1532,7 +1532,7 @@ namespace isc { namespace dhcp { break; case 189: -#line 766 "dhcp6_parser.yy" // lalr1.cc:859 +#line 768 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } @@ -1540,7 +1540,7 @@ namespace isc { namespace dhcp { break; case 190: -#line 768 "dhcp6_parser.yy" // lalr1.cc:859 +#line 770 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1549,7 +1549,7 @@ namespace isc { namespace dhcp { break; case 191: -#line 774 "dhcp6_parser.yy" // lalr1.cc:859 +#line 776 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); @@ -1560,7 +1560,7 @@ namespace isc { namespace dhcp { break; case 192: -#line 779 "dhcp6_parser.yy" // lalr1.cc:859 +#line 781 "dhcp6_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); @@ -1570,7 +1570,7 @@ namespace isc { namespace dhcp { break; case 201: -#line 797 "dhcp6_parser.yy" // lalr1.cc:859 +#line 799 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); @@ -1579,7 +1579,7 @@ namespace isc { namespace dhcp { break; case 202: -#line 802 "dhcp6_parser.yy" // lalr1.cc:859 +#line 804 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); @@ -1588,7 +1588,7 @@ namespace isc { namespace dhcp { break; case 203: -#line 807 "dhcp6_parser.yy" // lalr1.cc:859 +#line 809 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); @@ -1597,7 +1597,7 @@ namespace isc { namespace dhcp { break; case 204: -#line 812 "dhcp6_parser.yy" // lalr1.cc:859 +#line 814 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); @@ -1606,7 +1606,7 @@ namespace isc { namespace dhcp { break; case 205: -#line 817 "dhcp6_parser.yy" // lalr1.cc:859 +#line 819 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); @@ -1615,7 +1615,7 @@ namespace isc { namespace dhcp { break; case 206: -#line 822 "dhcp6_parser.yy" // lalr1.cc:859 +#line 824 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); @@ -1624,7 +1624,7 @@ namespace isc { namespace dhcp { break; case 207: -#line 830 "dhcp6_parser.yy" // lalr1.cc:859 +#line 832 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet6", l); @@ -1635,7 +1635,7 @@ namespace isc { namespace dhcp { break; case 208: -#line 835 "dhcp6_parser.yy" // lalr1.cc:859 +#line 837 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1644,7 +1644,7 @@ namespace isc { namespace dhcp { break; case 213: -#line 855 "dhcp6_parser.yy" // lalr1.cc:859 +#line 857 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -1654,7 +1654,7 @@ namespace isc { namespace dhcp { break; case 214: -#line 859 "dhcp6_parser.yy" // lalr1.cc:859 +#line 861 "dhcp6_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1680,7 +1680,7 @@ namespace isc { namespace dhcp { break; case 215: -#line 881 "dhcp6_parser.yy" // lalr1.cc:859 +#line 883 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the subnet6 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1690,7 +1690,7 @@ namespace isc { namespace dhcp { break; case 216: -#line 885 "dhcp6_parser.yy" // lalr1.cc:859 +#line 887 "dhcp6_parser.yy" // lalr1.cc:859 { // The subnet subnet6 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1699,16 +1699,16 @@ namespace isc { namespace dhcp { #line 1700 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 237: -#line 917 "dhcp6_parser.yy" // lalr1.cc:859 + case 238: +#line 920 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1708 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 238: -#line 919 "dhcp6_parser.yy" // lalr1.cc:859 + case 239: +#line 922 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); @@ -1717,16 +1717,16 @@ namespace isc { namespace dhcp { #line 1718 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 239: -#line 925 "dhcp6_parser.yy" // lalr1.cc:859 + case 240: +#line 928 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1726 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 240: -#line 927 "dhcp6_parser.yy" // lalr1.cc:859 + case 241: +#line 930 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); @@ -1735,16 +1735,16 @@ namespace isc { namespace dhcp { #line 1736 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 241: -#line 933 "dhcp6_parser.yy" // lalr1.cc:859 + case 242: +#line 936 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 1744 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 242: -#line 935 "dhcp6_parser.yy" // lalr1.cc:859 + case 243: +#line 938 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); @@ -1753,16 +1753,16 @@ namespace isc { namespace dhcp { #line 1754 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 243: -#line 941 "dhcp6_parser.yy" // lalr1.cc:859 + case 244: +#line 944 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.CLIENT_CLASS); + ctx.enter(ctx.NO_KEYWORD); } #line 1762 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 244: -#line 943 "dhcp6_parser.yy" // lalr1.cc:859 + case 245: +#line 946 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); @@ -1771,146 +1771,166 @@ namespace isc { namespace dhcp { #line 1772 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 245: -#line 949 "dhcp6_parser.yy" // lalr1.cc:859 + case 246: +#line 952 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.push_back(c); + ctx.enter(ctx.NO_KEYWORD); +} +#line 1783 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 247: +#line 957 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 1792 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 248: +#line 962 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1780 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1800 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 246: -#line 951 "dhcp6_parser.yy" // lalr1.cc:859 + case 249: +#line 964 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1789 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 247: -#line 956 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1795 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 248: -#line 957 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1801 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 249: -#line 958 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1807 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1809 "dhcp6_parser.cc" // lalr1.cc:859 break; case 250: -#line 961 "dhcp6_parser.yy" // lalr1.cc:859 +#line 969 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } +#line 1815 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 251: +#line 970 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } +#line 1821 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 252: +#line 971 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } +#line 1827 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 253: +#line 974 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1816 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1836 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 251: -#line 966 "dhcp6_parser.yy" // lalr1.cc:859 + case 254: +#line 979 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1825 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1845 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 252: -#line 974 "dhcp6_parser.yy" // lalr1.cc:859 + case 255: +#line 987 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1836 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1856 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 253: -#line 979 "dhcp6_parser.yy" // lalr1.cc:859 + case 256: +#line 992 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1845 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1865 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 258: -#line 994 "dhcp6_parser.yy" // lalr1.cc:859 + case 261: +#line 1007 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1855 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1875 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 259: -#line 998 "dhcp6_parser.yy" // lalr1.cc:859 + case 262: +#line 1011 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1863 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1883 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 276: -#line 1026 "dhcp6_parser.yy" // lalr1.cc:859 + case 280: +#line 1040 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1874 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1894 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 277: -#line 1031 "dhcp6_parser.yy" // lalr1.cc:859 + case 281: +#line 1045 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1883 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1903 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 278: -#line 1039 "dhcp6_parser.yy" // lalr1.cc:859 + case 282: +#line 1053 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1892 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1912 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 279: -#line 1042 "dhcp6_parser.yy" // lalr1.cc:859 + case 283: +#line 1056 "dhcp6_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 1900 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1920 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 284: -#line 1058 "dhcp6_parser.yy" // lalr1.cc:859 + case 288: +#line 1072 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1910 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1930 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 285: -#line 1062 "dhcp6_parser.yy" // lalr1.cc:859 + case 289: +#line 1076 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1918,21 +1938,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1922 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1942 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 286: -#line 1073 "dhcp6_parser.yy" // lalr1.cc:859 + case 290: +#line 1087 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1932 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1952 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 287: -#line 1077 "dhcp6_parser.yy" // lalr1.cc:859 + case 291: +#line 1091 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1940,348 +1960,348 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1944 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1964 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 301: -#line 1107 "dhcp6_parser.yy" // lalr1.cc:859 + case 305: +#line 1121 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 1953 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1973 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 303: -#line 1114 "dhcp6_parser.yy" // lalr1.cc:859 + case 307: +#line 1128 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1961 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1981 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 304: -#line 1116 "dhcp6_parser.yy" // lalr1.cc:859 + case 308: +#line 1130 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 1971 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1991 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 305: -#line 1122 "dhcp6_parser.yy" // lalr1.cc:859 + case 309: +#line 1136 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1979 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1999 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 306: -#line 1124 "dhcp6_parser.yy" // lalr1.cc:859 + case 310: +#line 1138 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 1989 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2009 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 307: -#line 1130 "dhcp6_parser.yy" // lalr1.cc:859 + case 311: +#line 1144 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1997 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2017 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 308: -#line 1132 "dhcp6_parser.yy" // lalr1.cc:859 + case 312: +#line 1146 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2007 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2027 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 310: -#line 1140 "dhcp6_parser.yy" // lalr1.cc:859 + case 314: +#line 1154 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2015 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2035 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 311: -#line 1142 "dhcp6_parser.yy" // lalr1.cc:859 + case 315: +#line 1156 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2025 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2045 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 312: -#line 1148 "dhcp6_parser.yy" // lalr1.cc:859 + case 316: +#line 1162 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2034 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2054 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 313: -#line 1157 "dhcp6_parser.yy" // lalr1.cc:859 + case 317: +#line 1171 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2045 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2065 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 314: -#line 1162 "dhcp6_parser.yy" // lalr1.cc:859 + case 318: +#line 1176 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2054 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2074 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 319: -#line 1181 "dhcp6_parser.yy" // lalr1.cc:859 + case 323: +#line 1195 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2064 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2084 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 320: -#line 1185 "dhcp6_parser.yy" // lalr1.cc:859 + case 324: +#line 1199 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2073 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2093 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 321: -#line 1193 "dhcp6_parser.yy" // lalr1.cc:859 + case 325: +#line 1207 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2083 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2103 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 322: -#line 1197 "dhcp6_parser.yy" // lalr1.cc:859 + case 326: +#line 1211 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2092 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2112 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 335: -#line 1228 "dhcp6_parser.yy" // lalr1.cc:859 + case 339: +#line 1242 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2100 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2120 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 336: -#line 1230 "dhcp6_parser.yy" // lalr1.cc:859 + case 340: +#line 1244 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2110 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2130 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 339: -#line 1240 "dhcp6_parser.yy" // lalr1.cc:859 + case 343: +#line 1254 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2119 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2139 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 340: -#line 1245 "dhcp6_parser.yy" // lalr1.cc:859 + case 344: +#line 1259 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2128 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2148 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 341: -#line 1253 "dhcp6_parser.yy" // lalr1.cc:859 + case 345: +#line 1267 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2139 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2159 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 342: -#line 1258 "dhcp6_parser.yy" // lalr1.cc:859 + case 346: +#line 1272 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2148 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 347: -#line 1273 "dhcp6_parser.yy" // lalr1.cc:859 + case 351: +#line 1287 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2158 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2178 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 348: -#line 1277 "dhcp6_parser.yy" // lalr1.cc:859 + case 352: +#line 1291 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2188 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 349: -#line 1283 "dhcp6_parser.yy" // lalr1.cc:859 + case 353: +#line 1297 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2178 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2198 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 350: -#line 1287 "dhcp6_parser.yy" // lalr1.cc:859 + case 354: +#line 1301 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 2187 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2207 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 359: -#line 1304 "dhcp6_parser.yy" // lalr1.cc:859 + case 364: +#line 1319 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2195 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2215 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 360: -#line 1306 "dhcp6_parser.yy" // lalr1.cc:859 + case 365: +#line 1321 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); ctx.leave(); } -#line 2205 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2225 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 361: -#line 1312 "dhcp6_parser.yy" // lalr1.cc:859 + case 366: +#line 1327 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2213 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2233 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 362: -#line 1314 "dhcp6_parser.yy" // lalr1.cc:859 + case 367: +#line 1329 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2222 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2242 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 363: -#line 1319 "dhcp6_parser.yy" // lalr1.cc:859 + case 368: +#line 1334 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.KNOWN_CLIENTS); } -#line 2230 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2250 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 364: -#line 1321 "dhcp6_parser.yy" // lalr1.cc:859 + case 369: +#line 1336 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2239 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2259 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 365: -#line 1327 "dhcp6_parser.yy" // lalr1.cc:859 + case 370: +#line 1342 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } -#line 2245 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2265 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 366: -#line 1328 "dhcp6_parser.yy" // lalr1.cc:859 + case 371: +#line 1343 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 2251 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2271 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 367: -#line 1334 "dhcp6_parser.yy" // lalr1.cc:859 + case 372: +#line 1349 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.PD_POOLS); } -#line 2262 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 368: -#line 1339 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2271 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2282 "dhcp6_parser.cc" // lalr1.cc:859 break; case 373: #line 1354 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 2291 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 378: +#line 1369 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2281 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2301 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 374: -#line 1358 "dhcp6_parser.yy" // lalr1.cc:859 + case 379: +#line 1373 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2289,21 +2309,21 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2293 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2313 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 375: -#line 1366 "dhcp6_parser.yy" // lalr1.cc:859 + case 380: +#line 1381 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2303 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2323 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 376: -#line 1370 "dhcp6_parser.yy" // lalr1.cc:859 + case 381: +#line 1385 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2311,163 +2331,143 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2315 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2335 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 389: -#line 1394 "dhcp6_parser.yy" // lalr1.cc:859 + case 395: +#line 1410 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2323 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2343 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1396 "dhcp6_parser.yy" // lalr1.cc:859 + case 396: +#line 1412 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); ctx.leave(); } -#line 2333 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2353 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 391: -#line 1402 "dhcp6_parser.yy" // lalr1.cc:859 + case 397: +#line 1418 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); } -#line 2342 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2362 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 392: -#line 1407 "dhcp6_parser.yy" // lalr1.cc:859 + case 398: +#line 1423 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2350 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2370 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 393: -#line 1409 "dhcp6_parser.yy" // lalr1.cc:859 + case 399: +#line 1425 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); ctx.leave(); } -#line 2360 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2380 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 394: -#line 1415 "dhcp6_parser.yy" // lalr1.cc:859 + case 400: +#line 1431 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); } -#line 2369 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2389 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1420 "dhcp6_parser.yy" // lalr1.cc:859 + case 401: +#line 1436 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); } -#line 2378 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2398 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1428 "dhcp6_parser.yy" // lalr1.cc:859 + case 402: +#line 1444 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2389 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2409 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 397: -#line 1433 "dhcp6_parser.yy" // lalr1.cc:859 + case 403: +#line 1449 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2398 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2418 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1446 "dhcp6_parser.yy" // lalr1.cc:859 + case 408: +#line 1462 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2408 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2428 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1450 "dhcp6_parser.yy" // lalr1.cc:859 + case 409: +#line 1466 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2417 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2437 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 404: -#line 1455 "dhcp6_parser.yy" // lalr1.cc:859 + case 410: +#line 1471 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2427 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2447 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 405: -#line 1459 "dhcp6_parser.yy" // lalr1.cc:859 + case 411: +#line 1475 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2436 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2456 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1484 "dhcp6_parser.yy" // lalr1.cc:859 + case 425: +#line 1500 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2447 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 420: -#line 1489 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2456 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 421: -#line 1494 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("prefixes", l); - ctx.stack_.push_back(l); - ctx.enter(ctx.NO_KEYWORD); -} #line 2467 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1499 "dhcp6_parser.yy" // lalr1.cc:859 + case 426: +#line 1505 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2475,111 +2475,111 @@ namespace isc { namespace dhcp { #line 2476 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1504 "dhcp6_parser.yy" // lalr1.cc:859 + case 427: +#line 1510 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("prefixes", l); + ctx.stack_.push_back(l); + ctx.enter(ctx.NO_KEYWORD); +} +#line 2487 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 428: +#line 1515 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 2496 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 429: +#line 1520 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2484 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2504 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1506 "dhcp6_parser.yy" // lalr1.cc:859 + case 430: +#line 1522 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2494 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2514 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1512 "dhcp6_parser.yy" // lalr1.cc:859 + case 431: +#line 1528 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2502 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2522 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1514 "dhcp6_parser.yy" // lalr1.cc:859 + case 432: +#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2512 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2532 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1520 "dhcp6_parser.yy" // lalr1.cc:859 + case 433: +#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2520 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2540 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1522 "dhcp6_parser.yy" // lalr1.cc:859 + case 434: +#line 1538 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2530 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2550 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1528 "dhcp6_parser.yy" // lalr1.cc:859 + case 435: +#line 1544 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2538 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2558 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 + case 436: +#line 1546 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2548 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2568 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 + case 437: +#line 1552 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2559 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 432: -#line 1541 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); - ctx.leave(); -} -#line 2568 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 433: -#line 1549 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("relay", m); - ctx.stack_.push_back(m); - ctx.enter(ctx.RELAY); -} #line 2579 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1554 "dhcp6_parser.yy" // lalr1.cc:859 + case 438: +#line 1557 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2587,752 +2587,781 @@ namespace isc { namespace dhcp { #line 2588 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1559 "dhcp6_parser.yy" // lalr1.cc:859 + case 439: +#line 1565 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("relay", m); + ctx.stack_.push_back(m); + ctx.enter(ctx.RELAY); +} +#line 2599 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 440: +#line 1570 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 2608 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 441: +#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2596 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2616 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1561 "dhcp6_parser.yy" // lalr1.cc:859 + case 442: +#line 1577 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2606 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2626 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1570 "dhcp6_parser.yy" // lalr1.cc:859 + case 443: +#line 1586 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2617 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2637 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 + case 444: +#line 1591 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2626 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2646 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1584 "dhcp6_parser.yy" // lalr1.cc:859 + case 447: +#line 1600 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2636 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2656 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1588 "dhcp6_parser.yy" // lalr1.cc:859 + case 448: +#line 1604 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2646 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2666 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 452: -#line 1610 "dhcp6_parser.yy" // lalr1.cc:859 + case 459: +#line 1627 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2654 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2674 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 453: -#line 1612 "dhcp6_parser.yy" // lalr1.cc:859 + case 460: +#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2664 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2684 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 454: -#line 1621 "dhcp6_parser.yy" // lalr1.cc:859 + case 461: +#line 1635 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("eval-on-demand", b); +} +#line 2693 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 462: +#line 1643 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER_ID); } -#line 2675 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2704 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 455: -#line 1626 "dhcp6_parser.yy" // lalr1.cc:859 + case 463: +#line 1648 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2686 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2715 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 465: -#line 1646 "dhcp6_parser.yy" // lalr1.cc:859 + case 473: +#line 1668 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DUID_TYPE); } -#line 2694 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2723 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1648 "dhcp6_parser.yy" // lalr1.cc:859 + case 474: +#line 1670 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2703 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2732 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1653 "dhcp6_parser.yy" // lalr1.cc:859 + case 475: +#line 1675 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } -#line 2709 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2738 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1654 "dhcp6_parser.yy" // lalr1.cc:859 + case 476: +#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } -#line 2715 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2744 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1655 "dhcp6_parser.yy" // lalr1.cc:859 + case 477: +#line 1677 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } -#line 2721 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2750 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 470: -#line 1658 "dhcp6_parser.yy" // lalr1.cc:859 + case 478: +#line 1680 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("htype", htype); } -#line 2730 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2759 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 471: -#line 1663 "dhcp6_parser.yy" // lalr1.cc:859 + case 479: +#line 1685 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2738 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2767 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 472: -#line 1665 "dhcp6_parser.yy" // lalr1.cc:859 + case 480: +#line 1687 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("identifier", id); ctx.leave(); } -#line 2748 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2777 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 473: -#line 1671 "dhcp6_parser.yy" // lalr1.cc:859 + case 481: +#line 1693 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("time", time); } -#line 2757 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2786 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 474: -#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 + case 482: +#line 1698 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enterprise-id", time); } -#line 2766 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2795 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 475: -#line 1683 "dhcp6_parser.yy" // lalr1.cc:859 + case 483: +#line 1705 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2775 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2804 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 476: -#line 1690 "dhcp6_parser.yy" // lalr1.cc:859 + case 484: +#line 1712 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2786 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2815 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 477: -#line 1695 "dhcp6_parser.yy" // lalr1.cc:859 + case 485: +#line 1717 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2795 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2824 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 482: -#line 1708 "dhcp6_parser.yy" // lalr1.cc:859 + case 490: +#line 1730 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2803 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2832 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 483: -#line 1710 "dhcp6_parser.yy" // lalr1.cc:859 + case 491: +#line 1732 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2813 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2842 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1716 "dhcp6_parser.yy" // lalr1.cc:859 + case 492: +#line 1738 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2821 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2850 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1718 "dhcp6_parser.yy" // lalr1.cc:859 + case 493: +#line 1740 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2831 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2860 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1726 "dhcp6_parser.yy" // lalr1.cc:859 + case 494: +#line 1748 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2842 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2871 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1731 "dhcp6_parser.yy" // lalr1.cc:859 + case 495: +#line 1753 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2853 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2882 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1738 "dhcp6_parser.yy" // lalr1.cc:859 + case 496: +#line 1760 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2863 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2892 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1742 "dhcp6_parser.yy" // lalr1.cc:859 + case 497: +#line 1764 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2873 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2902 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1769 "dhcp6_parser.yy" // lalr1.cc:859 + case 515: +#line 1791 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2882 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2911 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1774 "dhcp6_parser.yy" // lalr1.cc:859 + case 516: +#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2890 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2919 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1776 "dhcp6_parser.yy" // lalr1.cc:859 + case 517: +#line 1798 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2900 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2929 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1782 "dhcp6_parser.yy" // lalr1.cc:859 + case 518: +#line 1804 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2908 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2937 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1784 "dhcp6_parser.yy" // lalr1.cc:859 + case 519: +#line 1806 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2918 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2947 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1790 "dhcp6_parser.yy" // lalr1.cc:859 + case 520: +#line 1812 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2927 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2956 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1795 "dhcp6_parser.yy" // lalr1.cc:859 + case 521: +#line 1817 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2935 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2964 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1797 "dhcp6_parser.yy" // lalr1.cc:859 + case 522: +#line 1819 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2945 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2974 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1803 "dhcp6_parser.yy" // lalr1.cc:859 + case 523: +#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2954 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2983 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 + case 524: +#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2963 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 517: -#line 1813 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NCR_PROTOCOL); -} -#line 2971 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 518: -#line 1815 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2980 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 519: -#line 1821 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2986 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 520: -#line 1822 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 2992 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 + case 525: +#line 1835 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NCR_FORMAT); + ctx.enter(ctx.NCR_PROTOCOL); } #line 3000 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1827 "dhcp6_parser.yy" // lalr1.cc:859 + case 526: +#line 1837 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3009 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 527: +#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } +#line 3015 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 528: +#line 1844 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } +#line 3021 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 529: +#line 1847 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NCR_FORMAT); +} +#line 3029 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 530: +#line 1849 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 3010 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3039 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1833 "dhcp6_parser.yy" // lalr1.cc:859 + case 531: +#line 1855 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 3019 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3048 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 + case 532: +#line 1860 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 3028 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3057 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 + case 533: +#line 1865 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 3037 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3066 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1848 "dhcp6_parser.yy" // lalr1.cc:859 + case 534: +#line 1870 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3045 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3074 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1850 "dhcp6_parser.yy" // lalr1.cc:859 + case 535: +#line 1872 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3054 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3083 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1856 "dhcp6_parser.yy" // lalr1.cc:859 + case 536: +#line 1878 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3062 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3091 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 + case 537: +#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3070 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3099 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1862 "dhcp6_parser.yy" // lalr1.cc:859 + case 538: +#line 1884 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3078 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3107 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1865 "dhcp6_parser.yy" // lalr1.cc:859 + case 539: +#line 1887 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3086 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3115 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1868 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1890 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3095 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3124 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1874 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1896 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3103 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3132 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 + case 542: +#line 1898 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3113 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3142 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1884 "dhcp6_parser.yy" // lalr1.cc:859 + case 543: +#line 1906 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3121 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3150 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1886 "dhcp6_parser.yy" // lalr1.cc:859 + case 544: +#line 1908 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3130 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3159 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1891 "dhcp6_parser.yy" // lalr1.cc:859 + case 545: +#line 1913 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3138 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3167 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1893 "dhcp6_parser.yy" // lalr1.cc:859 + case 546: +#line 1915 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3147 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3176 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1898 "dhcp6_parser.yy" // lalr1.cc:859 + case 547: +#line 1920 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3155 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3184 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1900 "dhcp6_parser.yy" // lalr1.cc:859 + case 548: +#line 1922 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3164 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3193 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1911 "dhcp6_parser.yy" // lalr1.cc:859 + case 549: +#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3175 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3204 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 + case 550: +#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3184 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3213 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 + case 554: +#line 1955 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3195 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3224 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 + case 555: +#line 1960 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3204 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3233 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 550: -#line 1950 "dhcp6_parser.yy" // lalr1.cc:859 + case 558: +#line 1972 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3214 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 551: -#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); -} -#line 3222 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3243 "dhcp6_parser.cc" // lalr1.cc:859 break; case 559: -#line 1969 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1976 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); +} +#line 3251 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 567: +#line 1991 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3231 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3260 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 560: -#line 1974 "dhcp6_parser.yy" // lalr1.cc:859 + case 568: +#line 1996 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3239 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3268 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 561: -#line 1976 "dhcp6_parser.yy" // lalr1.cc:859 + case 569: +#line 1998 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3249 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3278 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 562: -#line 1982 "dhcp6_parser.yy" // lalr1.cc:859 + case 570: +#line 2004 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3260 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3289 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 563: -#line 1987 "dhcp6_parser.yy" // lalr1.cc:859 + case 571: +#line 2009 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3269 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3298 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 566: -#line 1996 "dhcp6_parser.yy" // lalr1.cc:859 + case 574: +#line 2018 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3279 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 567: -#line 2000 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.pop_back(); -} -#line 3287 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 574: -#line 2014 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3295 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3308 "dhcp6_parser.cc" // lalr1.cc:859 break; case 575: -#line 2016 "dhcp6_parser.yy" // lalr1.cc:859 +#line 2022 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); +} +#line 3316 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 582: +#line 2036 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3324 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 583: +#line 2038 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3305 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3334 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 576: -#line 2022 "dhcp6_parser.yy" // lalr1.cc:859 + case 584: +#line 2044 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3314 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3343 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 577: -#line 2027 "dhcp6_parser.yy" // lalr1.cc:859 + case 585: +#line 2049 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3323 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3352 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 578: -#line 2032 "dhcp6_parser.yy" // lalr1.cc:859 + case 586: +#line 2054 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3332 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3361 "dhcp6_parser.cc" // lalr1.cc:859 break; -#line 3336 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3365 "dhcp6_parser.cc" // lalr1.cc:859 default: break; } @@ -3587,108 +3616,110 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -710; + const short int Dhcp6Parser::yypact_ninf_ = -720; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 218, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, 55, 29, 61, 73, 75, 79, - 100, 108, 121, 129, 145, 157, 159, 164, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, 29, -3, 10, 26, 333, 156, - 154, 103, 12, 160, 71, 204, 40, 163, -710, 193, - 198, 203, 207, 238, -710, -710, -710, -710, -710, 230, - -710, 39, -710, -710, -710, -710, -710, -710, -710, -710, - -710, 247, 281, 302, 308, 316, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, 318, -710, -710, - -710, 48, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, 325, 97, -710, -710, - -710, -710, -710, -710, -710, -710, -710, 328, 344, -710, - -710, -710, -710, -710, -710, -710, -710, -710, 134, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, 136, -710, - -710, -710, -710, -710, 367, -710, 368, 369, -710, -710, - -710, -710, -710, 143, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, 245, - 284, -710, -710, -710, -710, -710, -710, -710, -710, 258, - -710, -710, 370, -710, -710, -710, 371, -710, -710, 291, - 373, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, 374, 375, -710, -710, -710, -710, 372, 378, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - 178, -710, -710, -710, 379, -710, -710, 380, -710, 381, - 382, -710, -710, 383, 384, 385, -710, -710, -710, 188, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, 29, 29, -710, 224, - 386, 387, 388, 389, 390, -710, 10, -710, 391, 392, - 393, 228, 244, 248, 251, 252, 395, 396, 397, 399, - 400, 403, 404, 405, 406, 407, 408, 259, 410, 411, - 26, -710, 412, 264, 333, -710, 413, 414, 415, 417, - 418, 419, 270, 269, 422, 423, 424, 425, 156, -710, - 426, 430, 154, -710, 431, 282, 433, 287, 288, 103, - -710, 434, 435, 436, 439, 442, 443, 444, -710, 12, - -710, 445, 446, 299, 450, 451, 452, 301, -710, 71, - 454, 303, 304, -710, 204, 457, 458, 263, -710, 310, - 460, 463, 314, 465, 319, 320, 466, 467, 321, 322, - 323, 468, 471, 163, -710, -710, -710, 472, 473, 474, - 29, 29, 29, -710, 475, 476, 477, -710, -710, -710, - -710, -710, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, -710, 491, 492, -710, 495, -710, -710, - 496, 497, 498, 341, 342, 350, -710, -710, -23, 353, - 502, 501, -710, 356, 293, -710, 357, -710, 358, -710, - -710, -710, 495, 495, 495, 359, 360, 361, 362, -710, - 363, 364, -710, 365, 366, 376, -710, -710, 377, -710, - -710, -710, 394, 29, -710, -710, 398, 401, -710, 402, - -710, -710, 231, 409, -710, -710, -710, 111, 416, -710, - 29, 26, 420, -710, -710, -710, 333, 49, 49, 513, - 515, 516, 517, -33, 29, -13, 518, 519, 168, 23, - 250, 163, -710, -710, 520, 521, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, 524, 448, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, 197, -710, 205, -710, -710, 206, - -710, -710, -710, -710, 530, 531, 532, 533, 534, -710, - -710, -710, 219, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, 222, -710, 535, 536, - -710, -710, 537, 539, -710, -710, 538, 542, -710, -710, - 540, 545, -710, -710, -710, 137, -710, -710, -710, 544, - -710, -710, -710, 174, -710, -710, -710, -710, 249, -710, - -710, 546, 550, -710, 552, 553, 554, 555, 556, 557, - 225, -710, -710, -710, -710, -710, -710, -710, -710, -710, - 558, 559, 560, -710, -710, 232, -710, -710, -710, -710, - -710, -710, -710, -710, 246, -710, -710, -710, 260, 421, - -710, 561, 562, -710, -710, 564, 563, -710, -710, 565, - 569, -710, -710, 567, -710, 572, 420, -710, -710, 573, - 574, 575, 576, 427, 428, 429, 432, 437, 578, 581, - 49, -710, -710, 156, -710, 513, 71, -710, 515, 204, - -710, 516, 70, -710, 517, -33, -710, -710, -13, -710, - 45, 518, -710, 40, -710, 519, 438, 440, 441, 447, - 449, 453, 168, -710, 582, 583, 455, 456, 459, 23, - -710, 585, 586, 250, -710, -710, -710, 587, 570, 154, - -710, 520, 103, -710, 521, 12, -710, 524, 592, -710, - 593, -710, 317, 461, 462, 464, -710, -710, -710, -710, - -710, 469, 470, -710, 261, -710, 589, -710, 591, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, 262, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, 594, 597, -710, -710, -710, -710, 283, - -710, -710, -710, -710, -710, -710, -710, -710, 243, 478, - -710, -710, -710, -710, 479, 493, -710, -710, 499, 285, - -710, 286, -710, 596, -710, 500, 598, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - 70, -710, 602, -710, 45, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, 295, - -710, -710, 505, -710, 42, 598, -710, -710, -710, 604, - -710, -710, -710, 292, -710, -710, -710, -710, -710, 607, - 494, 608, 42, -710, 611, -710, 508, -710, 612, -710, - -710, 324, -710, -82, 612, -710, -710, 614, 616, 617, - 294, -710, -710, -710, -710, -710, -710, 620, 506, 511, - 526, -82, -710, 528, -710, -710, -710, -710, -710 + 234, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, 39, 31, 84, 118, 126, 131, + 149, 155, 191, 198, 200, 210, 227, 241, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, 31, -43, 4, 30, 35, 168, + 206, 184, 130, 52, 68, 14, -29, 252, -720, 185, + 172, 190, 211, 222, -720, -720, -720, -720, -720, 271, + -720, 43, -720, -720, -720, -720, -720, -720, -720, -720, + -720, 292, 306, 310, 328, 331, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, 333, -720, -720, + -720, 116, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, 336, 129, -720, -720, + -720, -720, -720, -720, -720, -720, -720, 337, 338, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, 169, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, 171, -720, -720, -720, -720, -720, 340, -720, 341, + 347, -720, -720, -720, -720, -720, -720, 187, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, 261, 275, -720, -720, -720, -720, -720, + -720, -720, -720, 345, -720, -720, 350, -720, -720, -720, + 351, -720, -720, 348, 354, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, 355, 356, -720, -720, + -720, -720, 381, 387, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, 189, -720, -720, -720, 388, -720, + -720, 389, -720, 390, 391, -720, -720, 392, 393, 394, + -720, -720, -720, 212, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + 31, 31, -720, 203, 395, 396, 397, 398, 399, -720, + 4, -720, 400, 401, 402, 235, 254, 255, 258, 259, + 404, 405, 408, 409, 412, 416, 417, 418, 419, 420, + 421, 270, 423, 424, 30, -720, 425, 272, 35, -720, + 427, 428, 429, 430, 431, 432, 281, 280, 435, 436, + 437, 438, 439, 168, -720, 440, 441, 206, -720, 442, + 291, 444, 293, 296, 184, -720, 449, 450, 451, 452, + 455, 456, 457, -720, 130, -720, 458, 459, 308, 461, + 462, 463, 312, -720, 68, 464, 314, 315, -720, 14, + 470, 471, 59, -720, 318, 473, 474, 323, 476, 325, + 326, 479, 480, 327, 329, 332, 482, 484, 252, -720, + -720, -720, 485, 486, 487, 31, 31, 31, -720, 488, + 489, 490, -720, -720, -720, -720, -720, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, -720, 504, + 505, -720, 508, -720, -720, 509, 510, 511, 352, 361, + 362, -720, -720, 232, 508, 364, 515, 514, -720, 367, + 253, -720, 368, -720, 369, -720, -720, -720, 508, 508, + 508, 370, 371, 372, 373, -720, 374, 375, -720, 376, + 377, 378, -720, -720, 379, -720, -720, -720, 380, 31, + -720, -720, 382, 383, -720, 384, -720, -720, 192, 366, + -720, -720, -720, 13, 385, -720, 31, 30, 410, -720, + -720, -720, 35, 53, 53, 529, 535, 536, 537, -39, + 31, -11, 538, 539, 2, 27, 217, 252, -720, -720, + 540, 541, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, 542, 465, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, 218, -720, 248, -720, -720, 249, -720, -720, -720, + -720, 546, 548, 549, 550, 551, -720, -720, -720, 256, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, 257, -720, 552, 553, -720, -720, 554, + 556, -720, -720, 555, 559, -720, -720, 557, 561, -720, + -720, -720, 82, -720, -720, -720, 560, -720, -720, -720, + 105, -720, -720, -720, -720, 143, -720, -720, 562, 564, + -720, 565, 566, 567, 568, 569, 570, 263, -720, -720, + -720, -720, -720, -720, -720, -720, -720, 571, 572, 573, + -720, -720, 264, -720, -720, -720, -720, -720, -720, -720, + -720, 265, -720, -720, -720, 273, 426, -720, 574, 575, + -720, -720, 576, 580, -720, -720, 578, 582, -720, -720, + 579, -720, 584, 410, -720, -720, 585, 586, 587, 588, + 443, 407, 445, 446, 447, 589, 590, 53, -720, -720, + 168, -720, 529, 68, -720, 535, 14, -720, 536, 119, + -720, 537, -39, -720, -720, -11, -720, 11, 538, -720, + -29, -720, 539, 453, 454, 460, 466, 467, 468, 2, + -720, 591, 592, 469, 472, 475, 27, -720, 593, 594, + 217, -720, -720, -720, 596, 583, 206, -720, 540, 184, + -720, 541, 130, -720, 542, 601, -720, 595, -720, 330, + 477, 478, 481, -720, -720, -720, -720, -720, 483, 491, + -720, 274, -720, 598, -720, 599, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + 276, -720, -720, -720, -720, -720, -720, -720, 604, -720, + -720, -720, 603, 609, -720, -720, -720, -720, -720, 283, + -720, -720, -720, -720, -720, -720, -720, -720, 207, 492, + -720, -720, -720, -720, 507, 513, -720, -720, 516, 284, + -720, 285, -720, 605, -720, 517, 607, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + 119, -720, 611, 519, -720, 11, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + 157, -720, -720, 520, -720, -720, 115, 607, -720, -720, + -720, 613, -720, -720, -720, 286, -720, -720, -720, -720, + -720, 614, 522, 615, 115, -720, 616, -720, 524, -720, + 619, -720, -720, 170, -720, -15, 619, -720, -720, 623, + 625, 626, 287, -720, -720, -720, -720, -720, -720, 630, + 532, 531, 543, -15, -720, 547, -720, -720, -720, -720, + -720 }; const unsigned short int @@ -3698,520 +3729,529 @@ namespace isc { namespace dhcp { 20, 22, 24, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, - 56, 5, 68, 7, 102, 9, 215, 11, 349, 13, - 375, 15, 404, 17, 278, 19, 286, 21, 321, 23, - 180, 25, 488, 27, 45, 39, 0, 0, 0, 0, - 0, 0, 406, 0, 288, 323, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 541, 535, 537, 539, 0, + 56, 5, 68, 7, 102, 9, 215, 11, 353, 13, + 380, 15, 410, 17, 282, 19, 290, 21, 325, 23, + 180, 25, 496, 27, 45, 39, 0, 0, 0, 0, + 0, 0, 412, 0, 292, 327, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 549, 543, 545, 547, 0, 65, 0, 58, 60, 62, 63, 64, 61, 100, 111, - 113, 0, 0, 0, 0, 0, 207, 276, 313, 252, - 153, 170, 161, 437, 172, 191, 454, 0, 476, 486, + 113, 0, 0, 0, 0, 0, 207, 280, 317, 255, + 153, 170, 161, 443, 172, 191, 462, 0, 484, 494, 94, 0, 70, 72, 73, 74, 75, 76, 79, 80, 81, 82, 84, 83, 88, 89, 77, 78, 86, 87, 85, 90, 91, 92, 93, 108, 0, 0, 104, 106, - 107, 341, 367, 361, 237, 239, 241, 0, 0, 245, - 243, 396, 433, 236, 219, 220, 221, 222, 0, 217, - 226, 227, 228, 231, 233, 229, 230, 223, 224, 235, - 225, 232, 234, 359, 363, 358, 355, 354, 0, 351, - 353, 356, 357, 389, 0, 392, 0, 0, 388, 383, - 382, 386, 387, 0, 377, 379, 380, 384, 385, 381, - 431, 419, 421, 423, 425, 427, 429, 418, 417, 0, - 407, 408, 412, 413, 410, 414, 415, 416, 411, 0, - 303, 143, 0, 307, 305, 310, 0, 299, 300, 0, - 289, 290, 292, 302, 293, 294, 295, 309, 296, 297, - 298, 335, 0, 0, 333, 334, 337, 338, 0, 324, - 325, 327, 328, 329, 330, 331, 332, 187, 189, 184, - 0, 182, 185, 186, 0, 508, 510, 0, 513, 0, - 0, 517, 521, 0, 0, 0, 526, 533, 506, 0, - 490, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 44, 0, 0, 37, 0, - 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, + 107, 345, 372, 366, 238, 240, 242, 0, 0, 248, + 246, 244, 402, 439, 237, 219, 220, 221, 222, 0, + 217, 226, 227, 228, 231, 232, 234, 229, 230, 223, + 224, 236, 225, 233, 235, 364, 368, 363, 359, 360, + 358, 0, 355, 357, 361, 362, 395, 0, 398, 0, + 0, 394, 388, 389, 387, 392, 393, 0, 382, 384, + 385, 390, 391, 386, 437, 425, 427, 429, 431, 433, + 435, 424, 423, 0, 413, 414, 418, 419, 416, 420, + 421, 422, 417, 0, 307, 143, 0, 311, 309, 314, + 0, 303, 304, 0, 293, 294, 296, 306, 297, 298, + 299, 313, 300, 301, 302, 339, 0, 0, 337, 338, + 341, 342, 0, 328, 329, 331, 332, 333, 334, 335, + 336, 187, 189, 184, 0, 182, 185, 186, 0, 516, + 518, 0, 521, 0, 0, 525, 529, 0, 0, 0, + 534, 541, 514, 0, 498, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 44, + 0, 0, 37, 0, 0, 0, 0, 0, 0, 55, + 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 69, 0, 0, 0, 103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, - 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, - 376, 0, 0, 0, 0, 0, 0, 0, 405, 0, - 279, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 0, 0, 0, 322, 0, 0, 0, 0, 181, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 489, 48, 41, 0, 0, 0, - 0, 0, 0, 59, 0, 0, 0, 95, 96, 97, - 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 475, 0, 0, 71, 0, 110, 105, - 0, 0, 0, 0, 0, 0, 250, 251, 0, 0, - 0, 0, 218, 0, 0, 352, 0, 391, 0, 394, - 395, 378, 0, 0, 0, 0, 0, 0, 0, 409, - 0, 0, 301, 0, 0, 0, 312, 291, 0, 339, - 340, 326, 0, 0, 183, 507, 0, 0, 512, 0, - 515, 516, 0, 0, 523, 524, 525, 0, 0, 491, - 0, 0, 0, 536, 538, 540, 0, 0, 0, 209, - 280, 315, 254, 0, 45, 0, 0, 174, 0, 0, - 0, 0, 49, 109, 343, 369, 38, 362, 238, 240, - 242, 247, 248, 249, 246, 244, 398, 0, 360, 365, - 366, 364, 390, 393, 432, 420, 422, 424, 426, 428, - 430, 304, 144, 308, 306, 311, 336, 188, 190, 509, - 511, 514, 519, 520, 518, 522, 529, 528, 530, 531, - 532, 527, 534, 42, 0, 546, 0, 543, 545, 0, - 130, 136, 138, 140, 0, 0, 0, 0, 0, 149, - 151, 129, 0, 115, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 0, 213, 0, 210, - 211, 284, 0, 281, 282, 319, 0, 316, 317, 258, - 0, 255, 256, 159, 160, 0, 155, 157, 158, 0, - 168, 169, 165, 0, 163, 166, 167, 441, 0, 439, - 178, 0, 175, 176, 0, 0, 0, 0, 0, 0, - 0, 193, 195, 196, 197, 198, 199, 200, 465, 471, - 0, 0, 0, 464, 463, 0, 456, 458, 461, 459, - 460, 462, 482, 484, 0, 478, 480, 481, 0, 51, - 347, 0, 344, 345, 373, 0, 370, 371, 402, 0, - 399, 400, 435, 0, 67, 0, 0, 542, 101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 112, 114, 0, 208, 0, 288, 277, 0, 323, - 314, 0, 0, 253, 0, 0, 154, 171, 0, 162, - 443, 0, 438, 0, 173, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, - 455, 0, 0, 0, 477, 487, 53, 0, 52, 0, - 342, 0, 0, 368, 0, 406, 397, 0, 0, 434, - 0, 544, 0, 0, 0, 0, 142, 145, 146, 147, - 148, 0, 0, 116, 0, 212, 0, 283, 0, 318, - 275, 272, 274, 266, 267, 262, 263, 264, 265, 271, - 270, 273, 0, 260, 268, 269, 257, 156, 164, 452, - 450, 451, 449, 0, 444, 445, 447, 448, 440, 0, + 0, 0, 0, 0, 216, 0, 0, 0, 354, 0, + 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 283, 0, 0, 0, 0, + 0, 0, 0, 291, 0, 0, 0, 0, 326, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 48, 41, 0, 0, 0, 0, 0, 0, 59, 0, + 0, 0, 95, 96, 97, 98, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, + 0, 71, 0, 110, 105, 0, 0, 0, 0, 0, + 0, 253, 254, 0, 0, 0, 0, 0, 218, 0, + 0, 356, 0, 397, 0, 400, 401, 383, 0, 0, + 0, 0, 0, 0, 0, 415, 0, 0, 305, 0, + 0, 0, 316, 295, 0, 343, 344, 330, 0, 0, + 183, 515, 0, 0, 520, 0, 523, 524, 0, 0, + 531, 532, 533, 0, 0, 499, 0, 0, 0, 544, + 546, 548, 0, 0, 0, 209, 284, 319, 257, 0, + 45, 0, 0, 174, 0, 0, 0, 0, 49, 109, + 347, 374, 38, 367, 239, 241, 243, 250, 251, 252, + 249, 247, 245, 404, 0, 365, 370, 371, 369, 396, + 399, 438, 426, 428, 430, 432, 434, 436, 308, 144, + 312, 310, 315, 340, 188, 190, 517, 519, 522, 527, + 528, 526, 530, 537, 536, 538, 539, 540, 535, 542, + 42, 0, 554, 0, 551, 553, 0, 130, 136, 138, + 140, 0, 0, 0, 0, 0, 149, 151, 129, 0, + 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 0, 213, 0, 210, 211, 288, 0, + 285, 286, 323, 0, 320, 321, 261, 0, 258, 259, + 159, 160, 0, 155, 157, 158, 0, 168, 169, 165, + 0, 163, 166, 167, 447, 0, 445, 178, 0, 175, + 176, 0, 0, 0, 0, 0, 0, 0, 193, 195, + 196, 197, 198, 199, 200, 473, 479, 0, 0, 0, + 472, 471, 0, 464, 466, 469, 467, 468, 470, 490, + 492, 0, 486, 488, 489, 0, 51, 351, 0, 348, + 349, 378, 0, 375, 376, 408, 0, 405, 406, 441, + 0, 67, 0, 0, 550, 101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, + 0, 208, 0, 292, 281, 0, 327, 318, 0, 0, + 256, 0, 0, 154, 171, 0, 162, 449, 0, 444, + 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 0, 0, 0, 0, 0, 0, 463, 0, 0, + 0, 485, 495, 53, 0, 52, 0, 346, 0, 0, + 373, 0, 412, 403, 0, 0, 440, 0, 552, 0, + 0, 0, 0, 142, 145, 146, 147, 148, 0, 0, + 116, 0, 212, 0, 287, 0, 322, 279, 276, 278, + 269, 270, 265, 266, 267, 268, 274, 275, 273, 277, + 0, 263, 271, 272, 260, 156, 164, 459, 0, 457, + 458, 456, 0, 450, 451, 453, 454, 455, 446, 0, 177, 201, 202, 203, 204, 205, 206, 194, 0, 0, - 470, 473, 474, 457, 0, 0, 479, 50, 0, 0, - 346, 0, 372, 0, 401, 0, 0, 132, 133, 134, - 135, 131, 137, 139, 141, 150, 152, 214, 285, 320, - 0, 259, 0, 442, 0, 179, 467, 468, 469, 466, - 472, 483, 485, 54, 348, 374, 403, 436, 550, 0, - 548, 261, 0, 446, 0, 0, 547, 453, 562, 0, - 560, 558, 554, 0, 552, 556, 557, 555, 549, 0, - 0, 0, 0, 551, 0, 559, 0, 553, 0, 561, - 566, 0, 564, 0, 0, 563, 574, 0, 0, 0, - 0, 568, 570, 571, 572, 573, 565, 0, 0, 0, - 0, 0, 567, 0, 576, 577, 578, 569, 575 + 478, 481, 482, 465, 0, 0, 487, 50, 0, 0, + 350, 0, 377, 0, 407, 0, 0, 132, 133, 134, + 135, 131, 137, 139, 141, 150, 152, 214, 289, 324, + 0, 262, 0, 0, 448, 0, 179, 475, 476, 477, + 474, 480, 491, 493, 54, 352, 379, 409, 442, 558, + 0, 556, 264, 0, 461, 452, 0, 0, 555, 460, + 570, 0, 568, 566, 562, 0, 560, 564, 565, 563, + 557, 0, 0, 0, 0, 559, 0, 567, 0, 561, + 0, 569, 574, 0, 572, 0, 0, 571, 582, 0, + 0, 0, 0, 576, 578, 579, 580, 581, 573, 0, + 0, 0, 0, 0, 575, 0, 584, 585, 586, 577, + 583 }; const short int Dhcp6Parser::yypgoto_[] = { - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, 11, -710, 88, -710, -710, - -710, -710, -710, -710, 44, -710, -130, -710, -710, -710, - -66, -710, -710, -710, 309, -710, -710, -710, -710, 115, - 289, -68, -48, -47, -44, -710, -710, -710, -710, -710, - 112, 290, -710, -710, -710, -710, -710, -710, -710, 109, - -90, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -73, -710, -517, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -102, -512, -710, -710, -710, -710, - -103, -710, -710, -710, -710, -710, -710, -710, -710, -109, - -710, -710, -710, -106, 241, -710, -710, -710, -710, -710, - -710, -710, -113, -710, -710, -710, -710, -710, -710, -709, - -710, -710, -710, -85, -710, -710, -710, -81, 312, -710, - -710, -708, -710, -703, -710, -43, -710, -702, -710, -710, - -710, -701, -710, -710, -710, -710, -93, -710, -710, -227, - 571, -710, -710, -710, -710, -710, -83, -710, -710, -710, - -77, -710, 298, -710, -61, -710, -710, -710, -710, -710, - -56, -710, -710, -710, -710, -710, -54, -710, -710, -710, - -80, -710, -710, -710, -79, -710, 277, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -99, -710, - -710, -710, -87, 329, -710, -710, -38, -710, -64, -710, - -710, -710, -710, -710, -710, -91, -710, -710, -710, -78, - 326, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -76, -710, -710, -710, -75, -710, 311, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -697, -710, -710, -710, -710, -710, -710, - -49, -710, -710, -710, -178, -710, -710, -710, -710, -710, - -710, -62, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -65, -710, -710, -710, -710, -710, - -710, -710, -710, 171, 297, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -710, -710, -710, - -710, -710, -710, -710, -710, -710, -710, -7, -710, -710, - -710, -191, -710, -710, -207, -710, -710, -710, -710, -710, - -710, -217, -710, -710, -230, -710, -710, -710, -710, -710 + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -8, -720, 100, -720, -720, + -720, -720, -720, -720, 49, -720, -374, -720, -720, -720, + -66, -720, -720, -720, 300, -720, -720, -720, -720, 120, + 295, -48, -44, -42, -41, -720, -720, -720, -720, -720, + 113, 294, -720, -720, -720, -720, -720, -720, -720, 117, + -87, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -73, -720, -523, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -99, -518, -720, -720, -720, -720, + -101, -720, -720, -720, -720, -720, -720, -720, -720, -107, + -720, -720, -720, -102, 247, -720, -720, -720, -720, -720, + -720, -720, -109, -720, -720, -720, -720, -720, -720, -719, + -720, -720, -720, -81, -720, -720, -720, -78, 290, -720, + -720, -716, -720, -715, -720, -38, -720, -36, -720, -713, + -720, -720, -720, -710, -720, -720, -720, -720, -86, -720, + -720, -224, 621, -720, -720, -720, -720, -720, -77, -720, + -720, -720, -76, -720, 266, -720, -56, -720, -720, -720, + -720, -720, -53, -720, -720, -720, -720, -720, -54, -720, + -720, -720, -79, -720, -720, -720, -71, -720, 297, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -74, -720, -720, -720, -84, 302, -720, -720, -40, -720, + -70, -720, -720, -720, -720, -720, -720, -75, -720, -720, + -720, -72, 334, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -69, -720, -720, -720, -68, -720, + 321, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -702, -720, -720, -720, -720, + -720, -720, -37, -720, -720, -720, -173, -720, -720, -720, + -720, -720, -720, -720, -49, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -52, -720, -720, + -720, -720, -720, -720, -720, -720, 182, 303, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, + 7, -720, -720, -720, -184, -720, -720, -200, -720, -720, + -720, -720, -720, -720, -210, -720, -720, -226, -720, -720, + -720, -720, -720 }; const short int Dhcp6Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 78, 37, 38, 65, 537, - 82, 83, 39, 64, 79, 80, 533, 689, 767, 768, - 120, 41, 66, 91, 92, 93, 310, 43, 67, 121, - 122, 123, 124, 125, 126, 127, 128, 318, 45, 68, - 147, 148, 149, 342, 150, 129, 319, 130, 320, 602, - 603, 604, 709, 861, 605, 710, 606, 711, 607, 712, - 608, 238, 382, 610, 611, 612, 613, 614, 718, 615, - 719, 131, 330, 635, 636, 637, 638, 132, 332, 643, - 644, 645, 646, 133, 331, 134, 334, 651, 652, 653, - 743, 61, 76, 270, 271, 272, 395, 273, 396, 135, - 335, 660, 661, 662, 663, 664, 665, 666, 667, 136, - 326, 618, 619, 620, 723, 47, 69, 168, 169, 170, - 349, 171, 350, 172, 351, 173, 355, 174, 354, 544, - 175, 176, 137, 329, 630, 631, 632, 732, 812, 813, - 138, 327, 55, 73, 622, 623, 624, 726, 57, 74, - 239, 240, 241, 242, 243, 244, 245, 381, 246, 385, - 247, 384, 248, 249, 386, 250, 139, 328, 626, 627, - 628, 729, 59, 75, 258, 259, 260, 261, 262, 390, - 263, 264, 265, 266, 178, 346, 691, 692, 693, 769, - 49, 70, 188, 189, 190, 360, 179, 348, 192, 361, - 551, 180, 347, 695, 696, 697, 772, 51, 71, 203, - 204, 205, 364, 206, 207, 366, 208, 209, 181, 356, - 699, 700, 701, 775, 53, 72, 219, 220, 221, 222, - 372, 223, 373, 224, 374, 225, 375, 226, 376, 227, - 377, 228, 371, 182, 357, 703, 778, 140, 333, 648, - 649, 740, 823, 824, 825, 826, 827, 872, 141, 336, - 675, 676, 677, 754, 879, 678, 679, 755, 680, 681, - 142, 143, 338, 684, 685, 686, 761, 687, 762, 144, - 339, 63, 77, 289, 290, 291, 292, 400, 293, 401, - 294, 295, 403, 296, 297, 298, 406, 574, 299, 407, - 300, 301, 302, 303, 411, 581, 304, 412, 94, 312, - 95, 313, 96, 314, 97, 311, 586, 587, 588, 705, - 889, 890, 894, 903, 904, 905, 906, 911, 907, 909, - 921, 922, 923, 930, 931, 932, 937, 933, 934, 935 + 23, 24, 25, 26, 27, 78, 37, 38, 65, 543, + 82, 83, 39, 64, 79, 80, 539, 696, 774, 775, + 120, 41, 66, 91, 92, 93, 314, 43, 67, 121, + 122, 123, 124, 125, 126, 127, 128, 322, 45, 68, + 147, 148, 149, 346, 150, 129, 323, 130, 324, 609, + 610, 611, 716, 871, 612, 717, 613, 718, 614, 719, + 615, 242, 387, 617, 618, 619, 620, 621, 725, 622, + 726, 131, 334, 642, 643, 644, 645, 132, 336, 650, + 651, 652, 653, 133, 335, 134, 338, 658, 659, 660, + 750, 61, 76, 274, 275, 276, 400, 277, 401, 135, + 339, 667, 668, 669, 670, 671, 672, 673, 674, 136, + 330, 625, 626, 627, 730, 47, 69, 169, 170, 171, + 353, 172, 354, 173, 355, 174, 360, 175, 359, 176, + 358, 550, 177, 178, 137, 333, 637, 638, 639, 739, + 820, 821, 138, 331, 55, 73, 629, 630, 631, 733, + 57, 74, 243, 244, 245, 246, 247, 248, 249, 386, + 250, 390, 251, 389, 252, 253, 391, 254, 139, 332, + 633, 634, 635, 736, 59, 75, 262, 263, 264, 265, + 266, 395, 267, 268, 269, 270, 180, 350, 698, 699, + 700, 776, 49, 70, 191, 192, 193, 365, 181, 352, + 195, 366, 558, 182, 351, 702, 703, 704, 779, 51, + 71, 207, 208, 209, 369, 210, 211, 371, 212, 213, + 183, 361, 706, 707, 708, 782, 53, 72, 223, 224, + 225, 226, 377, 227, 378, 228, 379, 229, 380, 230, + 381, 231, 382, 232, 376, 184, 362, 710, 785, 140, + 337, 655, 656, 747, 832, 833, 834, 835, 836, 882, + 837, 141, 340, 682, 683, 684, 761, 890, 685, 686, + 762, 687, 688, 142, 143, 342, 691, 692, 693, 768, + 694, 769, 144, 343, 63, 77, 293, 294, 295, 296, + 405, 297, 406, 298, 299, 408, 300, 301, 302, 411, + 581, 303, 412, 304, 305, 306, 307, 416, 588, 308, + 417, 94, 316, 95, 317, 96, 318, 97, 315, 593, + 594, 595, 712, 900, 901, 906, 915, 916, 917, 918, + 923, 919, 921, 933, 934, 935, 942, 943, 944, 949, + 945, 946, 947 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 90, 164, 255, 163, 185, 198, 217, 202, 237, 254, - 269, 288, 674, 642, 256, 177, 187, 200, 218, 257, - 84, 165, 166, 806, 807, 167, 36, 186, 199, 808, - 810, 811, 191, 201, 29, 815, 30, 98, 31, 668, - 99, 100, 316, 541, 542, 543, 633, 317, 595, 926, - 108, 340, 927, 928, 929, 28, 341, 101, 102, 103, - 104, 105, 106, 107, 108, 590, 633, 640, 40, 641, - 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, - 42, 231, 44, 108, 231, 210, 46, 230, 231, 211, - 212, 213, 214, 215, 216, 109, 110, 111, 112, 113, - 344, 101, 102, 103, 104, 345, 106, 48, 108, 231, - 231, 114, 232, 233, 115, 50, 234, 235, 236, 819, - 634, 116, 669, 670, 671, 672, 267, 268, 52, 117, - 118, 155, 156, 119, 158, 159, 54, 358, 85, 362, - 735, 108, 359, 736, 363, 160, 369, 86, 87, 88, - 81, 370, 56, 162, 193, 194, 195, 196, 197, 153, - 184, 806, 807, 89, 58, 89, 60, 808, 810, 811, - 576, 62, 898, 815, 899, 900, 89, 738, 160, 89, - 739, 397, 32, 33, 34, 35, 398, 101, 102, 103, - 104, 413, 108, 89, 108, 89, 414, 107, 89, 305, - 340, 306, 89, 183, 151, 704, 152, 307, 706, 344, - 153, 184, 153, 707, 708, 308, 154, 155, 156, 157, - 158, 159, 720, 89, 89, 720, 642, 721, 752, 160, - 722, 160, 161, 753, 315, 759, 577, 578, 579, 162, - 760, 309, 674, 231, 251, 232, 233, 252, 253, 763, - 90, 321, 741, 378, 764, 742, 89, 654, 655, 656, - 657, 658, 659, 413, 358, 870, 380, 580, 765, 867, - 871, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 322, 397, 379, 362, 369, - 164, 875, 163, 884, 885, 912, 185, 941, 895, 388, - 913, 896, 942, 198, 177, 202, 323, 89, 187, 89, - 165, 166, 324, 217, 167, 200, 89, 415, 416, 186, - 325, 255, 337, 237, 191, 218, 199, 924, 254, 343, - 925, 201, 352, 256, 857, 858, 859, 860, 257, 876, - 877, 878, 554, 555, 556, 145, 146, 288, 353, 267, - 268, 549, 550, 572, 573, 682, 683, 89, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 365, 367, 368, 383, 387, 389, 417, 391, 392, - 393, 394, 427, 399, 402, 404, 405, 408, 409, 410, - 418, 419, 420, 421, 422, 424, 425, 426, 428, 432, - 433, 434, 429, 435, 436, 430, 431, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 447, 450, 451, 452, - 448, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 463, 513, 514, 515, 464, 466, 467, 468, 472, 473, - 474, 469, 470, 475, 609, 609, 476, 477, 478, 480, - 481, 601, 601, 482, 483, 484, 485, 486, 488, 489, - 490, 492, 493, 673, 496, 288, 495, 497, 498, 499, - 502, 503, 507, 500, 501, 508, 510, 504, 505, 506, - 511, 512, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 538, 539, 528, 529, 530, 531, - 532, 534, 535, 540, 568, 30, 545, 546, 547, 548, - 552, 553, 557, 558, 559, 560, 561, 562, 563, 564, - 617, 583, 621, 625, 629, 647, 650, 690, 694, 565, - 566, 698, 702, 575, 713, 714, 715, 716, 717, 725, - 536, 724, 728, 727, 730, 731, 733, 567, 734, 585, - 737, 569, 744, 745, 570, 571, 746, 747, 748, 749, - 750, 751, 756, 757, 758, 771, 774, 770, 639, 582, - 773, 776, 777, 848, 766, 779, 780, 782, 783, 784, - 785, 786, 791, 788, 787, 792, 838, 839, 789, 844, - 845, 790, 831, 847, 832, 833, 855, 868, 856, 869, - 874, 834, 873, 835, 886, 888, 892, 836, 910, 840, - 841, 914, 916, 842, 862, 863, 918, 864, 938, 920, - 939, 940, 865, 866, 943, 423, 584, 616, 589, 446, - 793, 880, 881, 817, 449, 818, 830, 829, 494, 837, - 795, 816, 794, 891, 229, 797, 882, 609, 915, 796, - 798, 799, 883, 887, 601, 164, 255, 163, 897, 805, - 237, 919, 944, 254, 801, 945, 800, 821, 256, 177, - 462, 491, 850, 257, 820, 165, 166, 269, 814, 167, - 946, 948, 849, 852, 802, 803, 822, 487, 804, 809, - 479, 465, 828, 673, 851, 471, 893, 843, 846, 781, - 853, 854, 688, 185, 908, 917, 198, 936, 202, 217, - 509, 947, 0, 0, 0, 187, 0, 0, 200, 0, - 0, 218, 0, 0, 0, 0, 186, 0, 0, 199, - 0, 191, 0, 0, 201, 0, 0, 0, 0, 0, + 90, 206, 259, 164, 187, 201, 221, 36, 241, 258, + 273, 292, 681, 649, 84, 179, 190, 204, 222, 260, + 813, 165, 261, 814, 815, 166, 818, 167, 168, 819, + 194, 205, 188, 202, 189, 203, 29, 823, 30, 28, + 31, 98, 640, 675, 99, 100, 320, 145, 146, 108, + 235, 321, 602, 235, 255, 236, 237, 256, 257, 271, + 272, 101, 102, 103, 104, 105, 106, 107, 108, 597, + 640, 647, 583, 648, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 234, 742, 827, 828, 743, 107, + 551, 40, 235, 661, 662, 663, 664, 665, 666, 109, + 110, 111, 112, 113, 561, 562, 563, 235, 745, 236, + 237, 746, 81, 238, 239, 240, 641, 114, 938, 344, + 115, 939, 940, 941, 345, 42, 89, 116, 676, 677, + 678, 679, 348, 44, 85, 117, 118, 349, 46, 119, + 584, 585, 586, 86, 87, 88, 748, 271, 272, 749, + 101, 102, 103, 104, 235, 106, 48, 108, 235, 89, + 907, 813, 50, 908, 814, 815, 89, 818, 108, 89, + 819, 587, 363, 936, 367, 310, 937, 364, 823, 368, + 155, 156, 89, 158, 159, 89, 32, 33, 34, 35, + 374, 309, 402, 160, 311, 375, 161, 403, 52, 101, + 102, 103, 104, 214, 163, 54, 108, 56, 89, 215, + 216, 217, 218, 219, 220, 418, 151, 58, 152, 312, + 419, 344, 108, 89, 153, 313, 711, 649, 154, 155, + 156, 157, 158, 159, 60, 196, 197, 198, 199, 200, + 153, 186, 160, 681, 108, 161, 162, 910, 62, 911, + 912, 713, 348, 163, 90, 185, 714, 715, 160, 727, + 727, 161, 153, 186, 728, 729, 759, 766, 770, 383, + 89, 760, 767, 771, 89, 319, 418, 363, 384, 880, + 160, 772, 877, 161, 881, 89, 402, 367, 374, 924, + 953, 886, 895, 896, 925, 954, 325, 164, 547, 548, + 549, 187, 420, 421, 206, 887, 888, 889, 201, 179, + 326, 556, 557, 190, 327, 165, 579, 580, 221, 166, + 204, 167, 168, 89, 689, 690, 259, 194, 241, 188, + 222, 189, 328, 258, 205, 329, 202, 341, 203, 89, + 347, 356, 357, 260, 370, 372, 261, 867, 868, 869, + 870, 373, 292, 385, 388, 392, 393, 394, 422, 396, + 397, 89, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 398, + 399, 432, 404, 407, 409, 410, 413, 414, 415, 423, + 424, 425, 426, 427, 429, 430, 431, 89, 437, 438, + 433, 434, 439, 440, 435, 436, 441, 519, 520, 521, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 452, + 453, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 469, 470, 472, 473, 474, 475, + 616, 616, 476, 478, 479, 480, 481, 608, 608, 482, + 483, 484, 486, 487, 488, 489, 490, 491, 494, 680, + 492, 292, 495, 496, 498, 499, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 513, 511, 514, 516, + 512, 575, 582, 517, 518, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 544, 590, 534, + 535, 536, 537, 538, 540, 541, 545, 546, 30, 552, + 553, 554, 555, 559, 560, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 624, 576, 577, 578, + 589, 592, 628, 632, 636, 654, 657, 697, 701, 705, + 720, 709, 721, 722, 723, 724, 732, 542, 731, 735, + 734, 737, 738, 740, 741, 794, 744, 752, 751, 753, + 754, 755, 756, 757, 758, 763, 764, 765, 778, 646, + 777, 773, 780, 781, 783, 784, 858, 786, 787, 789, + 790, 791, 792, 798, 799, 848, 849, 854, 855, 793, + 866, 795, 857, 797, 796, 865, 878, 879, 883, 841, + 842, 884, 885, 897, 899, 903, 843, 922, 926, 928, + 428, 930, 844, 845, 846, 850, 932, 950, 851, 951, + 952, 852, 872, 873, 955, 596, 874, 591, 875, 451, + 800, 623, 454, 825, 826, 840, 876, 891, 839, 500, + 847, 802, 801, 468, 616, 824, 902, 803, 804, 806, + 493, 608, 892, 259, 164, 805, 812, 241, 893, 471, + 258, 894, 898, 807, 830, 909, 179, 904, 927, 931, + 260, 829, 165, 261, 273, 822, 166, 957, 167, 168, + 956, 808, 859, 831, 233, 809, 497, 810, 811, 958, + 680, 816, 960, 817, 860, 485, 862, 861, 477, 206, + 187, 838, 905, 201, 863, 864, 221, 853, 856, 695, + 788, 515, 190, 920, 929, 204, 948, 959, 222, 0, + 0, 0, 0, 0, 0, 0, 194, 0, 188, 205, + 189, 202, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, - 0, 821, 801, 0, 800, 0, 0, 0, 820, 0, - 0, 0, 0, 0, 0, 0, 814, 0, 0, 0, - 822, 902, 802, 803, 0, 0, 804, 809, 901, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 902, - 0, 0, 0, 0, 0, 0, 901 + 0, 0, 0, 0, 0, 0, 0, 812, 0, 0, + 0, 0, 830, 0, 807, 0, 0, 0, 0, 829, + 0, 0, 0, 0, 0, 0, 822, 0, 0, 0, + 0, 831, 808, 914, 0, 0, 809, 0, 810, 811, + 913, 0, 816, 0, 817, 0, 0, 0, 0, 0, + 0, 914, 0, 0, 0, 0, 0, 0, 913 }; const short int Dhcp6Parser::yycheck_[] = { - 66, 69, 75, 69, 70, 71, 72, 71, 74, 75, - 76, 77, 529, 525, 75, 69, 70, 71, 72, 75, - 10, 69, 69, 732, 732, 69, 15, 70, 71, 732, - 732, 732, 70, 71, 5, 732, 7, 11, 9, 16, - 14, 15, 3, 66, 67, 68, 79, 8, 25, 131, - 38, 3, 134, 135, 136, 0, 8, 31, 32, 33, - 34, 35, 36, 37, 38, 16, 79, 80, 7, 82, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 7, 39, 7, 38, 39, 73, 7, 16, 39, 77, - 78, 79, 80, 81, 82, 69, 70, 71, 72, 73, - 3, 31, 32, 33, 34, 8, 36, 7, 38, 39, - 39, 85, 41, 42, 88, 7, 45, 46, 47, 74, - 153, 95, 99, 100, 101, 102, 86, 87, 7, 103, - 104, 61, 62, 107, 64, 65, 7, 3, 128, 3, - 3, 38, 8, 6, 8, 75, 3, 137, 138, 139, - 153, 8, 7, 83, 51, 52, 53, 54, 55, 56, - 57, 870, 870, 153, 7, 153, 7, 870, 870, 870, - 59, 7, 130, 870, 132, 133, 153, 3, 75, 153, - 6, 3, 153, 154, 155, 156, 8, 31, 32, 33, - 34, 3, 38, 153, 38, 153, 8, 37, 153, 6, - 3, 3, 153, 49, 48, 8, 50, 4, 3, 3, - 56, 57, 56, 8, 8, 8, 60, 61, 62, 63, - 64, 65, 3, 153, 153, 3, 738, 8, 3, 75, - 8, 75, 76, 8, 4, 3, 125, 126, 127, 83, - 8, 3, 759, 39, 40, 41, 42, 43, 44, 3, - 316, 4, 3, 8, 8, 6, 153, 89, 90, 91, - 92, 93, 94, 3, 3, 3, 8, 156, 8, 8, - 8, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 4, 3, 3, 3, 3, - 358, 8, 358, 8, 8, 3, 362, 3, 3, 8, - 8, 6, 8, 369, 358, 369, 4, 153, 362, 153, - 358, 358, 4, 379, 358, 369, 153, 306, 307, 362, - 4, 394, 4, 389, 362, 379, 369, 3, 394, 4, - 6, 369, 4, 394, 17, 18, 19, 20, 394, 96, - 97, 98, 472, 473, 474, 12, 13, 413, 4, 86, - 87, 58, 59, 122, 123, 105, 106, 153, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 4, 4, 4, 4, 4, 3, 153, 4, 4, - 8, 3, 154, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 154, 4, - 4, 4, 154, 4, 4, 154, 154, 4, 4, 4, - 4, 4, 4, 154, 4, 4, 4, 4, 4, 4, - 156, 4, 4, 4, 154, 156, 4, 4, 4, 4, - 4, 420, 421, 422, 4, 4, 154, 4, 4, 4, - 4, 154, 154, 4, 517, 518, 4, 4, 4, 4, - 4, 517, 518, 154, 4, 4, 4, 156, 4, 156, - 156, 4, 4, 529, 4, 531, 156, 4, 154, 4, - 4, 4, 4, 154, 154, 4, 4, 156, 156, 156, - 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 153, 153, 7, 7, 7, 7, - 5, 5, 5, 153, 493, 7, 153, 5, 7, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 7, 510, 7, 7, 7, 7, 7, 7, 7, 153, - 153, 7, 84, 124, 4, 4, 4, 4, 4, 3, - 452, 6, 3, 6, 6, 3, 6, 153, 3, 129, - 6, 153, 6, 3, 153, 153, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 3, 3, 6, 524, 153, - 6, 6, 3, 3, 153, 8, 4, 4, 4, 4, - 4, 154, 4, 154, 156, 4, 4, 4, 156, 4, - 4, 154, 154, 6, 154, 154, 4, 8, 5, 8, - 3, 154, 8, 154, 8, 7, 4, 154, 4, 154, - 154, 4, 4, 154, 153, 153, 5, 153, 4, 7, - 4, 4, 153, 153, 4, 316, 511, 518, 516, 340, - 720, 153, 153, 735, 344, 738, 745, 743, 397, 752, - 725, 734, 723, 870, 73, 728, 153, 720, 154, 726, - 729, 731, 153, 153, 720, 723, 729, 723, 153, 732, - 726, 153, 156, 729, 732, 154, 732, 740, 729, 723, - 358, 394, 771, 729, 740, 723, 723, 743, 732, 723, - 154, 153, 769, 774, 732, 732, 740, 389, 732, 732, - 379, 362, 741, 759, 772, 369, 874, 759, 763, 706, - 775, 777, 531, 769, 895, 912, 772, 924, 772, 775, - 413, 941, -1, -1, -1, 769, -1, -1, 772, -1, - -1, 775, -1, -1, -1, -1, 769, -1, -1, 772, - -1, 769, -1, -1, 772, -1, -1, -1, -1, -1, + 66, 71, 75, 69, 70, 71, 72, 15, 74, 75, + 76, 77, 535, 531, 10, 69, 70, 71, 72, 75, + 739, 69, 75, 739, 739, 69, 739, 69, 69, 739, + 70, 71, 70, 71, 70, 71, 5, 739, 7, 0, + 9, 11, 81, 16, 14, 15, 3, 12, 13, 38, + 39, 8, 25, 39, 40, 41, 42, 43, 44, 88, + 89, 31, 32, 33, 34, 35, 36, 37, 38, 16, + 81, 82, 59, 84, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 16, 3, 75, 76, 6, 37, + 464, 7, 39, 91, 92, 93, 94, 95, 96, 69, + 70, 71, 72, 73, 478, 479, 480, 39, 3, 41, + 42, 6, 155, 45, 46, 47, 155, 87, 133, 3, + 90, 136, 137, 138, 8, 7, 155, 97, 101, 102, + 103, 104, 3, 7, 130, 105, 106, 8, 7, 109, + 127, 128, 129, 139, 140, 141, 3, 88, 89, 6, + 31, 32, 33, 34, 39, 36, 7, 38, 39, 155, + 3, 880, 7, 6, 880, 880, 155, 880, 38, 155, + 880, 158, 3, 3, 3, 3, 6, 8, 880, 8, + 61, 62, 155, 64, 65, 155, 155, 156, 157, 158, + 3, 6, 3, 74, 4, 8, 77, 8, 7, 31, + 32, 33, 34, 73, 85, 7, 38, 7, 155, 79, + 80, 81, 82, 83, 84, 3, 48, 7, 50, 8, + 8, 3, 38, 155, 56, 3, 8, 745, 60, 61, + 62, 63, 64, 65, 7, 51, 52, 53, 54, 55, + 56, 57, 74, 766, 38, 77, 78, 132, 7, 134, + 135, 3, 3, 85, 320, 49, 8, 8, 74, 3, + 3, 77, 56, 57, 8, 8, 3, 3, 3, 8, + 155, 8, 8, 8, 155, 4, 3, 3, 3, 3, + 74, 8, 8, 77, 8, 155, 3, 3, 3, 3, + 3, 8, 8, 8, 8, 8, 4, 363, 66, 67, + 68, 367, 310, 311, 374, 98, 99, 100, 374, 363, + 4, 58, 59, 367, 4, 363, 124, 125, 384, 363, + 374, 363, 363, 155, 107, 108, 399, 367, 394, 367, + 384, 367, 4, 399, 374, 4, 374, 4, 374, 155, + 4, 4, 4, 399, 4, 4, 399, 17, 18, 19, + 20, 4, 418, 8, 4, 4, 8, 3, 155, 4, + 4, 155, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 8, + 3, 156, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 155, 4, 4, + 156, 156, 4, 4, 156, 156, 4, 425, 426, 427, + 4, 4, 4, 4, 4, 4, 156, 4, 4, 4, + 158, 4, 4, 4, 4, 4, 4, 156, 158, 4, + 4, 4, 4, 4, 4, 4, 4, 156, 4, 156, + 523, 524, 156, 4, 4, 4, 4, 523, 524, 4, + 4, 4, 4, 4, 156, 4, 4, 4, 4, 535, + 158, 537, 158, 158, 4, 4, 158, 4, 4, 156, + 4, 156, 156, 4, 4, 158, 4, 158, 4, 4, + 158, 499, 126, 7, 7, 7, 7, 7, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 155, 516, 7, + 7, 7, 7, 5, 5, 5, 155, 155, 7, 155, + 5, 7, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 7, 155, 155, 155, + 155, 131, 7, 7, 7, 7, 7, 7, 7, 7, + 4, 86, 4, 4, 4, 4, 3, 457, 6, 3, + 6, 6, 3, 6, 3, 158, 6, 3, 6, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 3, 530, + 6, 155, 6, 3, 6, 3, 3, 8, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 156, + 5, 156, 6, 156, 158, 4, 8, 8, 4, 156, + 156, 8, 3, 8, 7, 4, 156, 4, 4, 4, + 320, 5, 156, 156, 156, 156, 7, 4, 156, 4, + 4, 156, 155, 155, 4, 522, 155, 517, 155, 344, + 727, 524, 348, 742, 745, 752, 155, 155, 750, 402, + 759, 732, 730, 363, 727, 741, 880, 733, 735, 738, + 394, 727, 155, 736, 730, 736, 739, 733, 155, 367, + 736, 155, 155, 739, 747, 155, 730, 158, 156, 155, + 736, 747, 730, 736, 750, 739, 730, 156, 730, 730, + 158, 739, 776, 747, 73, 739, 399, 739, 739, 156, + 766, 739, 155, 739, 778, 384, 781, 779, 374, 779, + 776, 748, 885, 779, 782, 784, 782, 766, 770, 537, + 713, 418, 776, 907, 924, 779, 936, 953, 782, -1, + -1, -1, -1, -1, -1, -1, 776, -1, 776, 779, + 776, 779, -1, 779, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 870, -1, -1, - -1, 874, 870, -1, 870, -1, -1, -1, 874, -1, - -1, -1, -1, -1, -1, -1, 870, -1, -1, -1, - 874, 894, 870, 870, -1, -1, 870, 870, 894, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 912, - -1, -1, -1, -1, -1, -1, 912 + -1, -1, -1, -1, -1, -1, -1, 880, -1, -1, + -1, -1, 885, -1, 880, -1, -1, -1, -1, 885, + -1, -1, -1, -1, -1, -1, 880, -1, -1, -1, + -1, 885, 880, 906, -1, -1, 880, -1, 880, 880, + 906, -1, 880, -1, 880, -1, -1, -1, -1, -1, + -1, 924, -1, -1, -1, -1, -1, -1, 924 }; const unsigned short int Dhcp6Parser::yystos_[] = { - 0, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 0, 5, - 7, 9, 153, 154, 155, 156, 172, 173, 174, 179, - 7, 188, 7, 194, 7, 205, 7, 282, 7, 357, - 7, 374, 7, 391, 7, 309, 7, 315, 7, 339, - 7, 258, 7, 448, 180, 175, 189, 195, 206, 283, - 358, 375, 392, 310, 316, 340, 259, 449, 172, 181, - 182, 153, 177, 178, 10, 128, 137, 138, 139, 153, - 187, 190, 191, 192, 475, 477, 479, 481, 11, 14, + 0, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 0, 5, + 7, 9, 155, 156, 157, 158, 174, 175, 176, 181, + 7, 190, 7, 196, 7, 207, 7, 284, 7, 361, + 7, 378, 7, 395, 7, 313, 7, 319, 7, 343, + 7, 260, 7, 453, 182, 177, 191, 197, 208, 285, + 362, 379, 396, 314, 320, 344, 261, 454, 174, 183, + 184, 155, 179, 180, 10, 130, 139, 140, 141, 155, + 189, 192, 193, 194, 480, 482, 484, 486, 11, 14, 15, 31, 32, 33, 34, 35, 36, 37, 38, 69, - 70, 71, 72, 73, 85, 88, 95, 103, 104, 107, - 187, 196, 197, 198, 199, 200, 201, 202, 203, 212, - 214, 238, 244, 250, 252, 266, 276, 299, 307, 333, - 414, 425, 437, 438, 446, 12, 13, 207, 208, 209, - 211, 48, 50, 56, 60, 61, 62, 63, 64, 65, - 75, 76, 83, 187, 198, 199, 200, 201, 284, 285, - 286, 288, 290, 292, 294, 297, 298, 333, 351, 363, - 368, 385, 410, 49, 57, 187, 292, 333, 359, 360, - 361, 363, 365, 51, 52, 53, 54, 55, 187, 292, - 333, 363, 365, 376, 377, 378, 380, 381, 383, 384, - 73, 77, 78, 79, 80, 81, 82, 187, 333, 393, - 394, 395, 396, 398, 400, 402, 404, 406, 408, 307, - 16, 39, 41, 42, 45, 46, 47, 187, 228, 317, - 318, 319, 320, 321, 322, 323, 325, 327, 329, 330, - 332, 40, 43, 44, 187, 228, 321, 327, 341, 342, - 343, 344, 345, 347, 348, 349, 350, 86, 87, 187, - 260, 261, 262, 264, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 187, 450, - 451, 452, 453, 455, 457, 458, 460, 461, 462, 465, - 467, 468, 469, 470, 473, 6, 3, 4, 8, 3, - 193, 482, 476, 478, 480, 4, 3, 8, 204, 213, - 215, 4, 4, 4, 4, 4, 277, 308, 334, 300, - 239, 251, 245, 415, 253, 267, 426, 4, 439, 447, - 3, 8, 210, 4, 3, 8, 352, 369, 364, 287, - 289, 291, 4, 4, 295, 293, 386, 411, 3, 8, - 362, 366, 3, 8, 379, 4, 382, 4, 4, 3, - 8, 409, 397, 399, 401, 403, 405, 407, 8, 3, - 8, 324, 229, 4, 328, 326, 331, 4, 8, 3, - 346, 4, 4, 8, 3, 263, 265, 3, 8, 4, - 454, 456, 4, 459, 4, 4, 463, 466, 4, 4, - 4, 471, 474, 3, 8, 172, 172, 153, 4, 4, - 4, 4, 4, 191, 4, 4, 4, 154, 154, 154, - 154, 154, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 154, 4, 4, 197, 4, 156, 208, - 4, 4, 4, 4, 4, 4, 154, 156, 4, 4, - 4, 4, 285, 4, 4, 360, 4, 154, 4, 154, - 154, 377, 4, 4, 4, 4, 4, 4, 4, 395, - 4, 4, 154, 4, 4, 4, 156, 319, 4, 156, - 156, 343, 4, 4, 261, 156, 4, 4, 154, 4, - 154, 154, 4, 4, 156, 156, 156, 4, 4, 451, - 4, 7, 7, 172, 172, 172, 7, 7, 7, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, - 7, 7, 5, 183, 5, 5, 174, 176, 153, 153, - 153, 66, 67, 68, 296, 153, 5, 7, 153, 58, - 59, 367, 153, 153, 183, 183, 183, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 172, 153, - 153, 153, 122, 123, 464, 124, 59, 125, 126, 127, - 156, 472, 153, 172, 196, 129, 483, 484, 485, 207, - 16, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 187, 216, 217, 218, 221, 223, 225, 227, 228, - 230, 231, 232, 233, 234, 236, 216, 7, 278, 279, - 280, 7, 311, 312, 313, 7, 335, 336, 337, 7, - 301, 302, 303, 79, 153, 240, 241, 242, 243, 181, - 80, 82, 242, 246, 247, 248, 249, 7, 416, 417, - 7, 254, 255, 256, 89, 90, 91, 92, 93, 94, - 268, 269, 270, 271, 272, 273, 274, 275, 16, 99, - 100, 101, 102, 187, 230, 427, 428, 429, 432, 433, - 435, 436, 105, 106, 440, 441, 442, 444, 450, 184, - 7, 353, 354, 355, 7, 370, 371, 372, 7, 387, - 388, 389, 84, 412, 8, 486, 3, 8, 8, 219, - 222, 224, 226, 4, 4, 4, 4, 4, 235, 237, - 3, 8, 8, 281, 6, 3, 314, 6, 3, 338, - 6, 3, 304, 6, 3, 3, 6, 6, 3, 6, - 418, 3, 6, 257, 6, 3, 4, 4, 4, 4, - 4, 4, 3, 8, 430, 434, 4, 4, 4, 3, - 8, 443, 445, 3, 8, 8, 153, 185, 186, 356, - 6, 3, 373, 6, 3, 390, 6, 3, 413, 8, - 4, 484, 4, 4, 4, 4, 154, 156, 154, 156, - 154, 4, 4, 217, 284, 280, 317, 313, 341, 337, - 187, 198, 199, 200, 201, 228, 276, 288, 290, 292, - 294, 298, 305, 306, 333, 410, 303, 241, 247, 74, - 187, 228, 333, 419, 420, 421, 422, 423, 417, 260, - 256, 154, 154, 154, 154, 154, 154, 269, 4, 4, - 154, 154, 154, 428, 4, 4, 441, 6, 3, 359, - 355, 376, 372, 393, 389, 4, 5, 17, 18, 19, - 20, 220, 153, 153, 153, 153, 153, 8, 8, 8, - 3, 8, 424, 8, 3, 8, 96, 97, 98, 431, - 153, 153, 153, 153, 8, 8, 8, 153, 7, 487, - 488, 306, 4, 421, 489, 3, 6, 153, 130, 132, - 133, 187, 228, 490, 491, 492, 493, 495, 488, 496, - 4, 494, 3, 8, 4, 154, 4, 491, 5, 153, - 7, 497, 498, 499, 3, 6, 131, 134, 135, 136, - 500, 501, 502, 504, 505, 506, 498, 503, 4, 4, - 4, 3, 8, 4, 156, 154, 154, 501, 153 + 70, 71, 72, 73, 87, 90, 97, 105, 106, 109, + 189, 198, 199, 200, 201, 202, 203, 204, 205, 214, + 216, 240, 246, 252, 254, 268, 278, 303, 311, 337, + 418, 430, 442, 443, 451, 12, 13, 209, 210, 211, + 213, 48, 50, 56, 60, 61, 62, 63, 64, 65, + 74, 77, 78, 85, 189, 200, 201, 202, 203, 286, + 287, 288, 290, 292, 294, 296, 298, 301, 302, 337, + 355, 367, 372, 389, 414, 49, 57, 189, 294, 296, + 337, 363, 364, 365, 367, 369, 51, 52, 53, 54, + 55, 189, 294, 296, 337, 367, 369, 380, 381, 382, + 384, 385, 387, 388, 73, 79, 80, 81, 82, 83, + 84, 189, 337, 397, 398, 399, 400, 402, 404, 406, + 408, 410, 412, 311, 16, 39, 41, 42, 45, 46, + 47, 189, 230, 321, 322, 323, 324, 325, 326, 327, + 329, 331, 333, 334, 336, 40, 43, 44, 189, 230, + 325, 331, 345, 346, 347, 348, 349, 351, 352, 353, + 354, 88, 89, 189, 262, 263, 264, 266, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 189, 455, 456, 457, 458, 460, 462, 463, + 465, 466, 467, 470, 472, 473, 474, 475, 478, 6, + 3, 4, 8, 3, 195, 487, 481, 483, 485, 4, + 3, 8, 206, 215, 217, 4, 4, 4, 4, 4, + 279, 312, 338, 304, 241, 253, 247, 419, 255, 269, + 431, 4, 444, 452, 3, 8, 212, 4, 3, 8, + 356, 373, 368, 289, 291, 293, 4, 4, 299, 297, + 295, 390, 415, 3, 8, 366, 370, 3, 8, 383, + 4, 386, 4, 4, 3, 8, 413, 401, 403, 405, + 407, 409, 411, 8, 3, 8, 328, 231, 4, 332, + 330, 335, 4, 8, 3, 350, 4, 4, 8, 3, + 265, 267, 3, 8, 4, 459, 461, 4, 464, 4, + 4, 468, 471, 4, 4, 4, 476, 479, 3, 8, + 174, 174, 155, 4, 4, 4, 4, 4, 193, 4, + 4, 4, 156, 156, 156, 156, 156, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 156, 4, + 4, 199, 4, 158, 210, 4, 4, 4, 4, 4, + 4, 156, 158, 4, 4, 4, 4, 4, 287, 4, + 4, 364, 4, 156, 4, 156, 156, 381, 4, 4, + 4, 4, 4, 4, 4, 399, 4, 4, 156, 4, + 4, 4, 158, 323, 4, 158, 158, 347, 4, 4, + 263, 158, 4, 4, 156, 4, 156, 156, 4, 4, + 158, 158, 158, 4, 4, 456, 4, 7, 7, 174, + 174, 174, 7, 7, 7, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 7, 7, 7, 7, 5, 185, + 5, 5, 176, 178, 155, 155, 155, 66, 67, 68, + 300, 185, 155, 5, 7, 155, 58, 59, 371, 155, + 155, 185, 185, 185, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 174, 155, 155, 155, 124, + 125, 469, 126, 59, 127, 128, 129, 158, 477, 155, + 174, 198, 131, 488, 489, 490, 209, 16, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 189, 218, + 219, 220, 223, 225, 227, 229, 230, 232, 233, 234, + 235, 236, 238, 218, 7, 280, 281, 282, 7, 315, + 316, 317, 7, 339, 340, 341, 7, 305, 306, 307, + 81, 155, 242, 243, 244, 245, 183, 82, 84, 244, + 248, 249, 250, 251, 7, 420, 421, 7, 256, 257, + 258, 91, 92, 93, 94, 95, 96, 270, 271, 272, + 273, 274, 275, 276, 277, 16, 101, 102, 103, 104, + 189, 232, 432, 433, 434, 437, 438, 440, 441, 107, + 108, 445, 446, 447, 449, 455, 186, 7, 357, 358, + 359, 7, 374, 375, 376, 7, 391, 392, 393, 86, + 416, 8, 491, 3, 8, 8, 221, 224, 226, 228, + 4, 4, 4, 4, 4, 237, 239, 3, 8, 8, + 283, 6, 3, 318, 6, 3, 342, 6, 3, 308, + 6, 3, 3, 6, 6, 3, 6, 422, 3, 6, + 259, 6, 3, 4, 4, 4, 4, 4, 4, 3, + 8, 435, 439, 4, 4, 4, 3, 8, 448, 450, + 3, 8, 8, 155, 187, 188, 360, 6, 3, 377, + 6, 3, 394, 6, 3, 417, 8, 4, 489, 4, + 4, 4, 4, 156, 158, 156, 158, 156, 4, 4, + 219, 286, 282, 321, 317, 345, 341, 189, 200, 201, + 202, 203, 230, 278, 290, 292, 294, 296, 298, 302, + 309, 310, 337, 414, 307, 243, 249, 75, 76, 189, + 230, 337, 423, 424, 425, 426, 427, 429, 421, 262, + 258, 156, 156, 156, 156, 156, 156, 271, 4, 4, + 156, 156, 156, 433, 4, 4, 446, 6, 3, 363, + 359, 380, 376, 397, 393, 4, 5, 17, 18, 19, + 20, 222, 155, 155, 155, 155, 155, 8, 8, 8, + 3, 8, 428, 4, 8, 3, 8, 98, 99, 100, + 436, 155, 155, 155, 155, 8, 8, 8, 155, 7, + 492, 493, 310, 4, 158, 425, 494, 3, 6, 155, + 132, 134, 135, 189, 230, 495, 496, 497, 498, 500, + 493, 501, 4, 499, 3, 8, 4, 156, 4, 496, + 5, 155, 7, 502, 503, 504, 3, 6, 133, 136, + 137, 138, 505, 506, 507, 509, 510, 511, 503, 508, + 4, 4, 4, 3, 8, 4, 158, 156, 156, 506, + 155 }; const unsigned short int Dhcp6Parser::yyr1_[] = { - 0, 157, 159, 158, 160, 158, 161, 158, 162, 158, - 163, 158, 164, 158, 165, 158, 166, 158, 167, 158, - 168, 158, 169, 158, 170, 158, 171, 158, 172, 172, - 172, 172, 172, 172, 172, 173, 175, 174, 176, 177, - 177, 178, 178, 180, 179, 181, 181, 182, 182, 184, - 183, 185, 185, 186, 186, 187, 189, 188, 190, 190, - 191, 191, 191, 191, 191, 191, 193, 192, 195, 194, - 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 198, 199, 200, 201, 202, - 204, 203, 206, 205, 207, 207, 208, 208, 210, 209, - 211, 213, 212, 215, 214, 216, 216, 217, 217, 217, - 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, - 219, 218, 220, 220, 220, 220, 222, 221, 224, 223, - 226, 225, 227, 229, 228, 230, 231, 232, 233, 235, - 234, 237, 236, 239, 238, 240, 240, 241, 241, 242, - 243, 245, 244, 246, 246, 247, 247, 247, 248, 249, - 251, 250, 253, 252, 254, 254, 255, 255, 257, 256, - 259, 258, 260, 260, 260, 261, 261, 263, 262, 265, - 264, 267, 266, 268, 268, 269, 269, 269, 269, 269, - 269, 270, 271, 272, 273, 274, 275, 277, 276, 278, - 278, 279, 279, 281, 280, 283, 282, 284, 284, 285, - 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 287, 286, 289, - 288, 291, 290, 293, 292, 295, 294, 296, 296, 296, - 297, 298, 300, 299, 301, 301, 302, 302, 304, 303, - 305, 305, 306, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 308, 307, 310, 309, - 311, 311, 312, 312, 314, 313, 316, 315, 317, 317, - 318, 318, 319, 319, 319, 319, 319, 319, 319, 319, - 320, 321, 322, 324, 323, 326, 325, 328, 327, 329, - 331, 330, 332, 334, 333, 335, 335, 336, 336, 338, - 337, 340, 339, 341, 341, 342, 342, 343, 343, 343, - 343, 343, 343, 343, 344, 346, 345, 347, 348, 349, - 350, 352, 351, 353, 353, 354, 354, 356, 355, 358, - 357, 359, 359, 360, 360, 360, 360, 360, 360, 362, - 361, 364, 363, 366, 365, 367, 367, 369, 368, 370, - 370, 371, 371, 373, 372, 375, 374, 376, 376, 377, - 377, 377, 377, 377, 377, 377, 377, 377, 377, 379, - 378, 380, 382, 381, 383, 384, 386, 385, 387, 387, - 388, 388, 390, 389, 392, 391, 393, 393, 394, 394, - 395, 395, 395, 395, 395, 395, 395, 395, 395, 397, - 396, 399, 398, 401, 400, 403, 402, 405, 404, 407, - 406, 409, 408, 411, 410, 413, 412, 415, 414, 416, - 416, 418, 417, 419, 419, 420, 420, 421, 421, 421, - 421, 422, 424, 423, 426, 425, 427, 427, 428, 428, - 428, 428, 428, 428, 428, 430, 429, 431, 431, 431, - 432, 434, 433, 435, 436, 437, 439, 438, 440, 440, - 441, 441, 443, 442, 445, 444, 447, 446, 449, 448, - 450, 450, 451, 451, 451, 451, 451, 451, 451, 451, - 451, 451, 451, 451, 451, 451, 451, 452, 454, 453, - 456, 455, 457, 459, 458, 460, 461, 463, 462, 464, - 464, 466, 465, 467, 468, 469, 471, 470, 472, 472, - 472, 472, 472, 474, 473, 476, 475, 478, 477, 480, - 479, 482, 481, 483, 483, 484, 486, 485, 487, 487, - 489, 488, 490, 490, 491, 491, 491, 491, 491, 492, - 494, 493, 496, 495, 497, 497, 499, 498, 500, 500, - 501, 501, 501, 501, 503, 502, 504, 505, 506 + 0, 159, 161, 160, 162, 160, 163, 160, 164, 160, + 165, 160, 166, 160, 167, 160, 168, 160, 169, 160, + 170, 160, 171, 160, 172, 160, 173, 160, 174, 174, + 174, 174, 174, 174, 174, 175, 177, 176, 178, 179, + 179, 180, 180, 182, 181, 183, 183, 184, 184, 186, + 185, 187, 187, 188, 188, 189, 191, 190, 192, 192, + 193, 193, 193, 193, 193, 193, 195, 194, 197, 196, + 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 200, 201, 202, 203, 204, + 206, 205, 208, 207, 209, 209, 210, 210, 212, 211, + 213, 215, 214, 217, 216, 218, 218, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 221, 220, 222, 222, 222, 222, 224, 223, 226, 225, + 228, 227, 229, 231, 230, 232, 233, 234, 235, 237, + 236, 239, 238, 241, 240, 242, 242, 243, 243, 244, + 245, 247, 246, 248, 248, 249, 249, 249, 250, 251, + 253, 252, 255, 254, 256, 256, 257, 257, 259, 258, + 261, 260, 262, 262, 262, 263, 263, 265, 264, 267, + 266, 269, 268, 270, 270, 271, 271, 271, 271, 271, + 271, 272, 273, 274, 275, 276, 277, 279, 278, 280, + 280, 281, 281, 283, 282, 285, 284, 286, 286, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 289, 288, + 291, 290, 293, 292, 295, 294, 297, 296, 299, 298, + 300, 300, 300, 301, 302, 304, 303, 305, 305, 306, + 306, 308, 307, 309, 309, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 312, 311, 314, 313, 315, 315, 316, 316, 318, 317, + 320, 319, 321, 321, 322, 322, 323, 323, 323, 323, + 323, 323, 323, 323, 324, 325, 326, 328, 327, 330, + 329, 332, 331, 333, 335, 334, 336, 338, 337, 339, + 339, 340, 340, 342, 341, 344, 343, 345, 345, 346, + 346, 347, 347, 347, 347, 347, 347, 347, 348, 350, + 349, 351, 352, 353, 354, 356, 355, 357, 357, 358, + 358, 360, 359, 362, 361, 363, 363, 364, 364, 364, + 364, 364, 364, 364, 366, 365, 368, 367, 370, 369, + 371, 371, 373, 372, 374, 374, 375, 375, 377, 376, + 379, 378, 380, 380, 381, 381, 381, 381, 381, 381, + 381, 381, 381, 381, 381, 383, 382, 384, 386, 385, + 387, 388, 390, 389, 391, 391, 392, 392, 394, 393, + 396, 395, 397, 397, 398, 398, 399, 399, 399, 399, + 399, 399, 399, 399, 399, 401, 400, 403, 402, 405, + 404, 407, 406, 409, 408, 411, 410, 413, 412, 415, + 414, 417, 416, 419, 418, 420, 420, 422, 421, 423, + 423, 424, 424, 425, 425, 425, 425, 425, 426, 428, + 427, 429, 431, 430, 432, 432, 433, 433, 433, 433, + 433, 433, 433, 435, 434, 436, 436, 436, 437, 439, + 438, 440, 441, 442, 444, 443, 445, 445, 446, 446, + 448, 447, 450, 449, 452, 451, 454, 453, 455, 455, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 457, 459, 458, 461, 460, + 462, 464, 463, 465, 466, 468, 467, 469, 469, 471, + 470, 472, 473, 474, 476, 475, 477, 477, 477, 477, + 477, 479, 478, 481, 480, 483, 482, 485, 484, 487, + 486, 488, 488, 489, 491, 490, 492, 492, 494, 493, + 495, 495, 496, 496, 496, 496, 496, 497, 499, 498, + 501, 500, 502, 502, 504, 503, 505, 505, 506, 506, + 506, 506, 508, 507, 509, 510, 511 }; const unsigned char @@ -4240,41 +4280,42 @@ namespace isc { namespace dhcp { 1, 3, 3, 3, 3, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, + 1, 1, 1, 3, 3, 0, 6, 0, 1, 1, + 3, 0, 4, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 6, 0, 4, 0, 1, 1, 3, 0, 4, + 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 0, 4, 0, + 4, 0, 4, 1, 0, 4, 3, 0, 6, 0, + 1, 1, 3, 0, 4, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, + 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, + 1, 1, 0, 6, 0, 1, 1, 3, 0, 4, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 3, 0, 4, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 6, 0, 4, - 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 1, 0, 4, 0, 4, 0, 4, 1, - 0, 4, 3, 0, 6, 0, 1, 1, 3, 0, - 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, - 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, - 4, 1, 3, 1, 1, 1, 1, 1, 1, 0, - 4, 0, 4, 0, 4, 1, 1, 0, 6, 0, - 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 4, 3, 0, 4, 3, 3, 0, 6, 0, 1, - 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, - 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, - 1, 1, 0, 4, 0, 6, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 1, 1, 1, - 3, 0, 4, 3, 3, 3, 0, 6, 1, 3, - 1, 1, 0, 4, 0, 4, 0, 6, 0, 4, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 0, 4, - 0, 4, 3, 0, 4, 3, 3, 0, 4, 1, - 1, 0, 4, 3, 3, 3, 0, 4, 1, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 6, 1, 3, 1, 0, 6, 1, 3, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 3, - 0, 4, 0, 6, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 0, 4, 3, 3, 3 + 6, 0, 4, 0, 6, 1, 3, 0, 4, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 0, + 4, 3, 0, 6, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 0, 4, 1, 1, 1, 3, 0, + 4, 3, 3, 3, 0, 6, 1, 3, 1, 1, + 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 4, 0, 4, + 3, 0, 4, 3, 3, 0, 4, 1, 1, 0, + 4, 3, 3, 3, 0, 4, 1, 1, 1, 1, + 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 6, 1, 3, 1, 0, 6, 1, 3, 0, 4, + 1, 3, 1, 1, 1, 1, 1, 3, 0, 4, + 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, + 1, 1, 0, 4, 3, 3, 3 }; @@ -4303,7 +4344,8 @@ namespace isc { namespace dhcp { "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"test\"", "\"client-class\"", "\"reservations\"", + "\"client-classes\"", "\"eval-client-classes\"", "\"test\"", + "\"eval-on-demand\"", "\"client-class\"", "\"reservations\"", "\"ip-addresses\"", "\"prefixes\"", "\"duid\"", "\"hw-address\"", "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", "\"parameters\"", @@ -4359,58 +4401,58 @@ namespace isc { namespace dhcp { "subnet6_list_content", "not_empty_subnet6_list", "subnet6", "$@42", "sub_subnet6", "$@43", "subnet6_params", "subnet6_param", "subnet", "$@44", "interface", "$@45", "interface_id", "$@46", "client_class", - "$@47", "reservation_mode", "$@48", "hr_mode", "id", "rapid_commit", - "shared_networks", "$@49", "shared_networks_content", - "shared_networks_list", "shared_network", "$@50", - "shared_network_params", "shared_network_param", "option_def_list", - "$@51", "sub_option_def_list", "$@52", "option_def_list_content", - "not_empty_option_def_list", "option_def_entry", "$@53", - "sub_option_def", "$@54", "option_def_params", - "not_empty_option_def_params", "option_def_param", "option_def_name", - "code", "option_def_code", "option_def_type", "$@55", - "option_def_record_types", "$@56", "space", "$@57", "option_def_space", - "option_def_encapsulate", "$@58", "option_def_array", "option_data_list", - "$@59", "option_data_list_content", "not_empty_option_data_list", - "option_data_entry", "$@60", "sub_option_data", "$@61", + "$@47", "eval_client_classes", "$@48", "reservation_mode", "$@49", + "hr_mode", "id", "rapid_commit", "shared_networks", "$@50", + "shared_networks_content", "shared_networks_list", "shared_network", + "$@51", "shared_network_params", "shared_network_param", + "option_def_list", "$@52", "sub_option_def_list", "$@53", + "option_def_list_content", "not_empty_option_def_list", + "option_def_entry", "$@54", "sub_option_def", "$@55", + "option_def_params", "not_empty_option_def_params", "option_def_param", + "option_def_name", "code", "option_def_code", "option_def_type", "$@56", + "option_def_record_types", "$@57", "space", "$@58", "option_def_space", + "option_def_encapsulate", "$@59", "option_def_array", "option_data_list", + "$@60", "option_data_list_content", "not_empty_option_data_list", + "option_data_entry", "$@61", "sub_option_data", "$@62", "option_data_params", "not_empty_option_data_params", - "option_data_param", "option_data_name", "option_data_data", "$@62", + "option_data_param", "option_data_name", "option_data_data", "$@63", "option_data_code", "option_data_space", "option_data_csv_format", - "option_data_always_send", "pools_list", "$@63", "pools_list_content", - "not_empty_pools_list", "pool_list_entry", "$@64", "sub_pool6", "$@65", - "pool_params", "pool_param", "pool_entry", "$@66", "user_context", - "$@67", "known_clients", "$@68", "known_clients_value", "pd_pools_list", - "$@69", "pd_pools_list_content", "not_empty_pd_pools_list", - "pd_pool_entry", "$@70", "sub_pd_pool", "$@71", "pd_pool_params", - "pd_pool_param", "pd_prefix", "$@72", "pd_prefix_len", "excluded_prefix", - "$@73", "excluded_prefix_len", "pd_delegated_len", "reservations", - "$@74", "reservations_list", "not_empty_reservations_list", - "reservation", "$@75", "sub_reservation", "$@76", "reservation_params", + "option_data_always_send", "pools_list", "$@64", "pools_list_content", + "not_empty_pools_list", "pool_list_entry", "$@65", "sub_pool6", "$@66", + "pool_params", "pool_param", "pool_entry", "$@67", "user_context", + "$@68", "known_clients", "$@69", "known_clients_value", "pd_pools_list", + "$@70", "pd_pools_list_content", "not_empty_pd_pools_list", + "pd_pool_entry", "$@71", "sub_pd_pool", "$@72", "pd_pool_params", + "pd_pool_param", "pd_prefix", "$@73", "pd_prefix_len", "excluded_prefix", + "$@74", "excluded_prefix_len", "pd_delegated_len", "reservations", + "$@75", "reservations_list", "not_empty_reservations_list", + "reservation", "$@76", "sub_reservation", "$@77", "reservation_params", "not_empty_reservation_params", "reservation_param", "ip_addresses", - "$@77", "prefixes", "$@78", "duid", "$@79", "hw_address", "$@80", - "hostname", "$@81", "flex_id_value", "$@82", - "reservation_client_classes", "$@83", "relay", "$@84", "relay_map", - "$@85", "client_classes", "$@86", "client_classes_list", - "client_class_entry", "$@87", "client_class_params", + "$@78", "prefixes", "$@79", "duid", "$@80", "hw_address", "$@81", + "hostname", "$@82", "flex_id_value", "$@83", + "reservation_client_classes", "$@84", "relay", "$@85", "relay_map", + "$@86", "client_classes", "$@87", "client_classes_list", + "client_class_entry", "$@88", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@88", "server_id", "$@89", - "server_id_params", "server_id_param", "server_id_type", "$@90", - "duid_type", "htype", "identifier", "$@91", "time", "enterprise_id", - "dhcp4o6_port", "control_socket", "$@92", "control_socket_params", - "control_socket_param", "socket_type", "$@93", "socket_name", "$@94", - "dhcp_ddns", "$@95", "sub_dhcp_ddns", "$@96", "dhcp_ddns_params", - "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@97", - "server_ip", "$@98", "server_port", "sender_ip", "$@99", "sender_port", - "max_queue_size", "ncr_protocol", "$@100", "ncr_protocol_value", - "ncr_format", "$@101", "always_include_fqdn", "override_no_update", - "override_client_update", "replace_client_name", "$@102", - "replace_client_name_value", "generated_prefix", "$@103", - "dhcp4_json_object", "$@104", "dhcpddns_json_object", "$@105", - "control_agent_json_object", "$@106", "logging_object", "$@107", - "logging_params", "logging_param", "loggers", "$@108", "loggers_entries", - "logger_entry", "$@109", "logger_params", "logger_param", "debuglevel", - "severity", "$@110", "output_options_list", "$@111", - "output_options_list_content", "output_entry", "$@112", - "output_params_list", "output_params", "output", "$@113", "flush", + "client_class_name", "client_class_test", "$@89", "eval_on_demand", + "server_id", "$@90", "server_id_params", "server_id_param", + "server_id_type", "$@91", "duid_type", "htype", "identifier", "$@92", + "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@93", + "control_socket_params", "control_socket_param", "socket_type", "$@94", + "socket_name", "$@95", "dhcp_ddns", "$@96", "sub_dhcp_ddns", "$@97", + "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", + "qualifying_suffix", "$@98", "server_ip", "$@99", "server_port", + "sender_ip", "$@100", "sender_port", "max_queue_size", "ncr_protocol", + "$@101", "ncr_protocol_value", "ncr_format", "$@102", + "always_include_fqdn", "override_no_update", "override_client_update", + "replace_client_name", "$@103", "replace_client_name_value", + "generated_prefix", "$@104", "dhcp4_json_object", "$@105", + "dhcpddns_json_object", "$@106", "control_agent_json_object", "$@107", + "logging_object", "$@108", "logging_params", "logging_param", "loggers", + "$@109", "loggers_entries", "logger_entry", "$@110", "logger_params", + "logger_param", "debuglevel", "severity", "$@111", "output_options_list", + "$@112", "output_options_list_content", "output_entry", "$@113", + "output_params_list", "output_params", "output", "$@114", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4418,64 +4460,65 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp6Parser::yyrline_[] = { - 0, 239, 239, 239, 240, 240, 241, 241, 242, 242, - 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, - 248, 248, 249, 249, 250, 250, 251, 251, 259, 260, - 261, 262, 263, 264, 265, 268, 273, 273, 284, 287, - 288, 291, 295, 302, 302, 309, 310, 313, 317, 324, - 324, 331, 332, 335, 339, 350, 360, 360, 375, 376, - 380, 381, 382, 383, 384, 385, 388, 388, 403, 403, - 412, 413, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 443, 448, 453, 458, 463, - 468, 468, 479, 479, 488, 489, 492, 493, 496, 496, - 506, 512, 512, 524, 524, 536, 537, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, - 555, 555, 562, 563, 564, 565, 568, 568, 576, 576, - 584, 584, 592, 597, 597, 605, 610, 615, 620, 625, - 625, 633, 633, 642, 642, 652, 653, 656, 657, 660, - 665, 670, 670, 680, 681, 684, 685, 686, 689, 694, - 701, 701, 711, 711, 721, 722, 725, 726, 729, 729, - 739, 739, 749, 750, 751, 754, 755, 758, 758, 766, - 766, 774, 774, 785, 786, 789, 790, 791, 792, 793, - 794, 797, 802, 807, 812, 817, 822, 830, 830, 843, - 844, 847, 848, 855, 855, 881, 881, 892, 893, 897, - 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, - 908, 909, 910, 911, 912, 913, 914, 917, 917, 925, - 925, 933, 933, 941, 941, 949, 949, 956, 957, 958, - 961, 966, 974, 974, 985, 986, 990, 991, 994, 994, - 1002, 1003, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 1016, 1017, 1018, 1019, 1026, 1026, 1039, 1039, - 1048, 1049, 1052, 1053, 1058, 1058, 1073, 1073, 1087, 1088, - 1091, 1092, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1105, 1107, 1112, 1114, 1114, 1122, 1122, 1130, 1130, 1138, - 1140, 1140, 1148, 1157, 1157, 1169, 1170, 1175, 1176, 1181, - 1181, 1193, 1193, 1205, 1206, 1211, 1212, 1217, 1218, 1219, - 1220, 1221, 1222, 1223, 1226, 1228, 1228, 1236, 1238, 1240, - 1245, 1253, 1253, 1265, 1266, 1269, 1270, 1273, 1273, 1283, - 1283, 1292, 1293, 1296, 1297, 1298, 1299, 1300, 1301, 1304, - 1304, 1312, 1312, 1319, 1319, 1327, 1328, 1334, 1334, 1346, - 1347, 1350, 1351, 1354, 1354, 1366, 1366, 1378, 1379, 1382, - 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1394, - 1394, 1402, 1407, 1407, 1415, 1420, 1428, 1428, 1438, 1439, - 1442, 1443, 1446, 1446, 1455, 1455, 1464, 1465, 1468, 1469, - 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1484, - 1484, 1494, 1494, 1504, 1504, 1512, 1512, 1520, 1520, 1528, - 1528, 1536, 1536, 1549, 1549, 1559, 1559, 1570, 1570, 1580, - 1581, 1584, 1584, 1594, 1595, 1598, 1599, 1602, 1603, 1604, - 1605, 1608, 1610, 1610, 1621, 1621, 1633, 1634, 1637, 1638, - 1639, 1640, 1641, 1642, 1643, 1646, 1646, 1653, 1654, 1655, - 1658, 1663, 1663, 1671, 1676, 1683, 1690, 1690, 1700, 1701, - 1704, 1705, 1708, 1708, 1716, 1716, 1726, 1726, 1738, 1738, - 1748, 1749, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, - 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1769, 1774, 1774, - 1782, 1782, 1790, 1795, 1795, 1803, 1808, 1813, 1813, 1821, - 1822, 1825, 1825, 1833, 1838, 1843, 1848, 1848, 1856, 1859, - 1862, 1865, 1868, 1874, 1874, 1884, 1884, 1891, 1891, 1898, - 1898, 1911, 1911, 1924, 1925, 1929, 1933, 1933, 1945, 1946, - 1950, 1950, 1958, 1959, 1962, 1963, 1964, 1965, 1966, 1969, - 1974, 1974, 1982, 1982, 1992, 1993, 1996, 1996, 2004, 2005, - 2008, 2009, 2010, 2011, 2014, 2014, 2022, 2027, 2032 + 0, 241, 241, 241, 242, 242, 243, 243, 244, 244, + 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, + 250, 250, 251, 251, 252, 252, 253, 253, 261, 262, + 263, 264, 265, 266, 267, 270, 275, 275, 286, 289, + 290, 293, 297, 304, 304, 311, 312, 315, 319, 326, + 326, 333, 334, 337, 341, 352, 362, 362, 377, 378, + 382, 383, 384, 385, 386, 387, 390, 390, 405, 405, + 414, 415, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 445, 450, 455, 460, 465, + 470, 470, 481, 481, 490, 491, 494, 495, 498, 498, + 508, 514, 514, 526, 526, 538, 539, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 557, 557, 564, 565, 566, 567, 570, 570, 578, 578, + 586, 586, 594, 599, 599, 607, 612, 617, 622, 627, + 627, 635, 635, 644, 644, 654, 655, 658, 659, 662, + 667, 672, 672, 682, 683, 686, 687, 688, 691, 696, + 703, 703, 713, 713, 723, 724, 727, 728, 731, 731, + 741, 741, 751, 752, 753, 756, 757, 760, 760, 768, + 768, 776, 776, 787, 788, 791, 792, 793, 794, 795, + 796, 799, 804, 809, 814, 819, 824, 832, 832, 845, + 846, 849, 850, 857, 857, 883, 883, 894, 895, 899, + 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, + 910, 911, 912, 913, 914, 915, 916, 917, 920, 920, + 928, 928, 936, 936, 944, 944, 952, 952, 962, 962, + 969, 970, 971, 974, 979, 987, 987, 998, 999, 1003, + 1004, 1007, 1007, 1015, 1016, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, + 1040, 1040, 1053, 1053, 1062, 1063, 1066, 1067, 1072, 1072, + 1087, 1087, 1101, 1102, 1105, 1106, 1109, 1110, 1111, 1112, + 1113, 1114, 1115, 1116, 1119, 1121, 1126, 1128, 1128, 1136, + 1136, 1144, 1144, 1152, 1154, 1154, 1162, 1171, 1171, 1183, + 1184, 1189, 1190, 1195, 1195, 1207, 1207, 1219, 1220, 1225, + 1226, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1240, 1242, + 1242, 1250, 1252, 1254, 1259, 1267, 1267, 1279, 1280, 1283, + 1284, 1287, 1287, 1297, 1297, 1306, 1307, 1310, 1311, 1312, + 1313, 1314, 1315, 1316, 1319, 1319, 1327, 1327, 1334, 1334, + 1342, 1343, 1349, 1349, 1361, 1362, 1365, 1366, 1369, 1369, + 1381, 1381, 1393, 1394, 1397, 1398, 1399, 1400, 1401, 1402, + 1403, 1404, 1405, 1406, 1407, 1410, 1410, 1418, 1423, 1423, + 1431, 1436, 1444, 1444, 1454, 1455, 1458, 1459, 1462, 1462, + 1471, 1471, 1480, 1481, 1484, 1485, 1489, 1490, 1491, 1492, + 1493, 1494, 1495, 1496, 1497, 1500, 1500, 1510, 1510, 1520, + 1520, 1528, 1528, 1536, 1536, 1544, 1544, 1552, 1552, 1565, + 1565, 1575, 1575, 1586, 1586, 1596, 1597, 1600, 1600, 1610, + 1611, 1614, 1615, 1618, 1619, 1620, 1621, 1622, 1625, 1627, + 1627, 1635, 1643, 1643, 1655, 1656, 1659, 1660, 1661, 1662, + 1663, 1664, 1665, 1668, 1668, 1675, 1676, 1677, 1680, 1685, + 1685, 1693, 1698, 1705, 1712, 1712, 1722, 1723, 1726, 1727, + 1730, 1730, 1738, 1738, 1748, 1748, 1760, 1760, 1770, 1771, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, + 1784, 1785, 1786, 1787, 1788, 1791, 1796, 1796, 1804, 1804, + 1812, 1817, 1817, 1825, 1830, 1835, 1835, 1843, 1844, 1847, + 1847, 1855, 1860, 1865, 1870, 1870, 1878, 1881, 1884, 1887, + 1890, 1896, 1896, 1906, 1906, 1913, 1913, 1920, 1920, 1933, + 1933, 1946, 1947, 1951, 1955, 1955, 1967, 1968, 1972, 1972, + 1980, 1981, 1984, 1985, 1986, 1987, 1988, 1991, 1996, 1996, + 2004, 2004, 2014, 2015, 2018, 2018, 2026, 2027, 2030, 2031, + 2032, 2033, 2036, 2036, 2044, 2049, 2054 }; // Print the state stack on the debug stream. @@ -4510,8 +4553,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4514 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2037 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4557 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2059 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index bf04e570c3..b61d8fd79a 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -419,89 +419,91 @@ namespace isc { namespace dhcp { TOKEN_RELAY_SUPPLIED_OPTIONS = 326, TOKEN_HOST_RESERVATION_IDENTIFIERS = 327, TOKEN_CLIENT_CLASSES = 328, - TOKEN_TEST = 329, - TOKEN_CLIENT_CLASS = 330, - TOKEN_RESERVATIONS = 331, - TOKEN_IP_ADDRESSES = 332, - TOKEN_PREFIXES = 333, - TOKEN_DUID = 334, - TOKEN_HW_ADDRESS = 335, - TOKEN_HOSTNAME = 336, - TOKEN_FLEX_ID = 337, - TOKEN_RELAY = 338, - TOKEN_IP_ADDRESS = 339, - TOKEN_HOOKS_LIBRARIES = 340, - TOKEN_LIBRARY = 341, - TOKEN_PARAMETERS = 342, - TOKEN_EXPIRED_LEASES_PROCESSING = 343, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 344, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 345, - TOKEN_HOLD_RECLAIMED_TIME = 346, - TOKEN_MAX_RECLAIM_LEASES = 347, - TOKEN_MAX_RECLAIM_TIME = 348, - TOKEN_UNWARNED_RECLAIM_CYCLES = 349, - TOKEN_SERVER_ID = 350, - TOKEN_LLT = 351, - TOKEN_EN = 352, - TOKEN_LL = 353, - TOKEN_IDENTIFIER = 354, - TOKEN_HTYPE = 355, - TOKEN_TIME = 356, - TOKEN_ENTERPRISE_ID = 357, - TOKEN_DHCP4O6_PORT = 358, - TOKEN_CONTROL_SOCKET = 359, - TOKEN_SOCKET_TYPE = 360, - TOKEN_SOCKET_NAME = 361, - TOKEN_DHCP_DDNS = 362, - TOKEN_ENABLE_UPDATES = 363, - TOKEN_QUALIFYING_SUFFIX = 364, - TOKEN_SERVER_IP = 365, - TOKEN_SERVER_PORT = 366, - TOKEN_SENDER_IP = 367, - TOKEN_SENDER_PORT = 368, - TOKEN_MAX_QUEUE_SIZE = 369, - TOKEN_NCR_PROTOCOL = 370, - TOKEN_NCR_FORMAT = 371, - TOKEN_ALWAYS_INCLUDE_FQDN = 372, - TOKEN_OVERRIDE_NO_UPDATE = 373, - TOKEN_OVERRIDE_CLIENT_UPDATE = 374, - TOKEN_REPLACE_CLIENT_NAME = 375, - TOKEN_GENERATED_PREFIX = 376, - TOKEN_UDP = 377, - TOKEN_TCP = 378, - TOKEN_JSON = 379, - TOKEN_WHEN_PRESENT = 380, - TOKEN_ALWAYS = 381, - TOKEN_WHEN_NOT_PRESENT = 382, - TOKEN_LOGGING = 383, - TOKEN_LOGGERS = 384, - TOKEN_OUTPUT_OPTIONS = 385, - TOKEN_OUTPUT = 386, - TOKEN_DEBUGLEVEL = 387, - TOKEN_SEVERITY = 388, - TOKEN_FLUSH = 389, - TOKEN_MAXSIZE = 390, - TOKEN_MAXVER = 391, - TOKEN_DHCP4 = 392, - TOKEN_DHCPDDNS = 393, - TOKEN_CONTROL_AGENT = 394, - TOKEN_TOPLEVEL_JSON = 395, - TOKEN_TOPLEVEL_DHCP6 = 396, - TOKEN_SUB_DHCP6 = 397, - TOKEN_SUB_INTERFACES6 = 398, - TOKEN_SUB_SUBNET6 = 399, - TOKEN_SUB_POOL6 = 400, - TOKEN_SUB_PD_POOL = 401, - TOKEN_SUB_RESERVATION = 402, - TOKEN_SUB_OPTION_DEFS = 403, - TOKEN_SUB_OPTION_DEF = 404, - TOKEN_SUB_OPTION_DATA = 405, - TOKEN_SUB_HOOKS_LIBRARY = 406, - TOKEN_SUB_DHCP_DDNS = 407, - TOKEN_STRING = 408, - TOKEN_INTEGER = 409, - TOKEN_FLOAT = 410, - TOKEN_BOOLEAN = 411 + TOKEN_EVAL_CLIENT_CLASSES = 329, + TOKEN_TEST = 330, + TOKEN_EVAL_ON_DEMAND = 331, + TOKEN_CLIENT_CLASS = 332, + TOKEN_RESERVATIONS = 333, + TOKEN_IP_ADDRESSES = 334, + TOKEN_PREFIXES = 335, + TOKEN_DUID = 336, + TOKEN_HW_ADDRESS = 337, + TOKEN_HOSTNAME = 338, + TOKEN_FLEX_ID = 339, + TOKEN_RELAY = 340, + TOKEN_IP_ADDRESS = 341, + TOKEN_HOOKS_LIBRARIES = 342, + TOKEN_LIBRARY = 343, + TOKEN_PARAMETERS = 344, + TOKEN_EXPIRED_LEASES_PROCESSING = 345, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 346, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 347, + TOKEN_HOLD_RECLAIMED_TIME = 348, + TOKEN_MAX_RECLAIM_LEASES = 349, + TOKEN_MAX_RECLAIM_TIME = 350, + TOKEN_UNWARNED_RECLAIM_CYCLES = 351, + TOKEN_SERVER_ID = 352, + TOKEN_LLT = 353, + TOKEN_EN = 354, + TOKEN_LL = 355, + TOKEN_IDENTIFIER = 356, + TOKEN_HTYPE = 357, + TOKEN_TIME = 358, + TOKEN_ENTERPRISE_ID = 359, + TOKEN_DHCP4O6_PORT = 360, + TOKEN_CONTROL_SOCKET = 361, + TOKEN_SOCKET_TYPE = 362, + TOKEN_SOCKET_NAME = 363, + TOKEN_DHCP_DDNS = 364, + TOKEN_ENABLE_UPDATES = 365, + TOKEN_QUALIFYING_SUFFIX = 366, + TOKEN_SERVER_IP = 367, + TOKEN_SERVER_PORT = 368, + TOKEN_SENDER_IP = 369, + TOKEN_SENDER_PORT = 370, + TOKEN_MAX_QUEUE_SIZE = 371, + TOKEN_NCR_PROTOCOL = 372, + TOKEN_NCR_FORMAT = 373, + TOKEN_ALWAYS_INCLUDE_FQDN = 374, + TOKEN_OVERRIDE_NO_UPDATE = 375, + TOKEN_OVERRIDE_CLIENT_UPDATE = 376, + TOKEN_REPLACE_CLIENT_NAME = 377, + TOKEN_GENERATED_PREFIX = 378, + TOKEN_UDP = 379, + TOKEN_TCP = 380, + TOKEN_JSON = 381, + TOKEN_WHEN_PRESENT = 382, + TOKEN_ALWAYS = 383, + TOKEN_WHEN_NOT_PRESENT = 384, + TOKEN_LOGGING = 385, + TOKEN_LOGGERS = 386, + TOKEN_OUTPUT_OPTIONS = 387, + TOKEN_OUTPUT = 388, + TOKEN_DEBUGLEVEL = 389, + TOKEN_SEVERITY = 390, + TOKEN_FLUSH = 391, + TOKEN_MAXSIZE = 392, + TOKEN_MAXVER = 393, + TOKEN_DHCP4 = 394, + TOKEN_DHCPDDNS = 395, + TOKEN_CONTROL_AGENT = 396, + TOKEN_TOPLEVEL_JSON = 397, + TOKEN_TOPLEVEL_DHCP6 = 398, + TOKEN_SUB_DHCP6 = 399, + TOKEN_SUB_INTERFACES6 = 400, + TOKEN_SUB_SUBNET6 = 401, + TOKEN_SUB_POOL6 = 402, + TOKEN_SUB_PD_POOL = 403, + TOKEN_SUB_RESERVATION = 404, + TOKEN_SUB_OPTION_DEFS = 405, + TOKEN_SUB_OPTION_DEF = 406, + TOKEN_SUB_OPTION_DATA = 407, + TOKEN_SUB_HOOKS_LIBRARY = 408, + TOKEN_SUB_DHCP_DDNS = 409, + TOKEN_STRING = 410, + TOKEN_INTEGER = 411, + TOKEN_FLOAT = 412, + TOKEN_BOOLEAN = 413 }; }; @@ -904,10 +906,18 @@ namespace isc { namespace dhcp { symbol_type make_CLIENT_CLASSES (const location_type& l); + static inline + symbol_type + make_EVAL_CLIENT_CLASSES (const location_type& l); + static inline symbol_type make_TEST (const location_type& l); + static inline + symbol_type + make_EVAL_ON_DEMAND (const location_type& l); + static inline symbol_type make_CLIENT_CLASS (const location_type& l); @@ -1441,12 +1451,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 846, ///< Last index in yytable_. - yynnts_ = 350, ///< Number of nonterminal symbols. + yylast_ = 858, ///< Last index in yytable_. + yynnts_ = 353, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 157 ///< Number of tokens. + yyntokens_ = 159 ///< Number of tokens. }; @@ -1504,9 +1514,9 @@ namespace isc { namespace dhcp { 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156 + 155, 156, 157, 158 }; - const unsigned int user_token_number_max_ = 411; + const unsigned int user_token_number_max_ = 413; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1539,30 +1549,30 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 156: // "boolean" + case 158: // "boolean" value.copy< bool > (other.value); break; - case 155: // "floating point" + case 157: // "floating point" value.copy< double > (other.value); break; - case 154: // "integer" + case 156: // "integer" value.copy< int64_t > (other.value); break; - case 153: // "constant string" + case 155: // "constant string" value.copy< std::string > (other.value); break; @@ -1583,30 +1593,30 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 156: // "boolean" + case 158: // "boolean" value.copy< bool > (v); break; - case 155: // "floating point" + case 157: // "floating point" value.copy< double > (v); break; - case 154: // "integer" + case 156: // "integer" value.copy< int64_t > (v); break; - case 153: // "constant string" + case 155: // "constant string" value.copy< std::string > (v); break; @@ -1686,30 +1696,30 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 156: // "boolean" + case 158: // "boolean" value.template destroy< bool > (); break; - case 155: // "floating point" + case 157: // "floating point" value.template destroy< double > (); break; - case 154: // "integer" + case 156: // "integer" value.template destroy< int64_t > (); break; - case 153: // "constant string" + case 155: // "constant string" value.template destroy< std::string > (); break; @@ -1736,30 +1746,30 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 172: // value - case 176: // map_value - case 220: // db_type - case 296: // hr_mode - case 367: // known_clients_value - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 222: // db_type + case 300: // hr_mode + case 371: // known_clients_value + case 436: // duid_type + case 469: // ncr_protocol_value + case 477: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 156: // "boolean" + case 158: // "boolean" value.move< bool > (s.value); break; - case 155: // "floating point" + case 157: // "floating point" value.move< double > (s.value); break; - case 154: // "integer" + case 156: // "integer" value.move< int64_t > (s.value); break; - case 153: // "constant string" + case 155: // "constant string" value.move< std::string > (s.value); break; @@ -1833,7 +1843,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411 + 405, 406, 407, 408, 409, 410, 411, 412, 413 }; return static_cast (yytoken_number_[type]); } @@ -2270,12 +2280,24 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_CLIENT_CLASSES, l); } + Dhcp6Parser::symbol_type + Dhcp6Parser::make_EVAL_CLIENT_CLASSES (const location_type& l) + { + return symbol_type (token::TOKEN_EVAL_CLIENT_CLASSES, l); + } + Dhcp6Parser::symbol_type Dhcp6Parser::make_TEST (const location_type& l) { return symbol_type (token::TOKEN_TEST, l); } + Dhcp6Parser::symbol_type + Dhcp6Parser::make_EVAL_ON_DEMAND (const location_type& l) + { + return symbol_type (token::TOKEN_EVAL_ON_DEMAND, l); + } + Dhcp6Parser::symbol_type Dhcp6Parser::make_CLIENT_CLASS (const location_type& l) { @@ -2771,7 +2793,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2775 "dhcp6_parser.h" // lalr1.cc:377 +#line 2797 "dhcp6_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 5196a4b01c..7e6eed01ff 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1634,7 +1634,7 @@ client_class_test: TEST { eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); - ctx.stack_.back()->set("eval-on-demand"); + ctx.stack_.back()->set("eval-on-demand", b); }; // --- end of client classes --------------------------------- diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index a46ed39111..d53ec75ef7 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,7 +1,4 @@ -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711191033 +// Generated 201711270210 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 6d58434f36..d19bfcb55c 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,7 +1,4 @@ -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711191033 +// Generated 201711270210 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index 7183f849aa..37730a1df1 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,7 +1,4 @@ -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711270201 -// Generated 201711191033 +// Generated 201711270210 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 9eca7ed2cb064af10e2c51142b3f580850db7595 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 02:15:00 +0000 Subject: [PATCH 30/52] [trac5374] regen lexer --- src/bin/dhcp6/dhcp6_lexer.cc | 233 +++++++++++++++++------------------ src/bin/dhcp6/dhcp6_lexer.ll | 3 - 2 files changed, 115 insertions(+), 121 deletions(-) diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index da86f0771b..a3972ddbdd 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -1601,18 +1601,18 @@ static const flex_int16_t yy_rule_linenum[166] = 365, 375, 385, 395, 405, 415, 424, 433, 442, 451, 460, 469, 478, 490, 499, 508, 517, 526, 536, 546, 556, 566, 577, 587, 597, 607, 617, 628, 639, 650, - 661, 670, 680, 689, 698, 714, 730, 739, 748, 757, - 766, 775, 784, 793, 802, 811, 820, 831, 841, 850, - 859, 869, 879, 888, 898, 908, 917, 926, 935, 944, - 954, 963, 972, 981, 990, 999, 1008, 1017, 1026, 1035, + 661, 670, 680, 689, 698, 713, 728, 737, 746, 755, + 764, 773, 782, 791, 800, 809, 818, 829, 839, 848, + 857, 867, 877, 886, 896, 906, 915, 924, 933, 942, + 952, 961, 970, 979, 988, 997, 1006, 1015, 1024, 1033, - 1045, 1054, 1063, 1073, 1085, 1098, 1108, 1117, 1126, 1135, - 1144, 1155, 1165, 1174, 1184, 1194, 1203, 1212, 1221, 1230, - 1240, 1249, 1259, 1268, 1277, 1286, 1295, 1304, 1313, 1322, - 1331, 1340, 1349, 1358, 1367, 1376, 1385, 1394, 1403, 1412, - 1421, 1430, 1439, 1448, 1457, 1466, 1475, 1485, 1583, 1588, - 1593, 1598, 1599, 1600, 1601, 1602, 1603, 1605, 1623, 1636, - 1641, 1645, 1647, 1649, 1651 + 1043, 1052, 1061, 1071, 1083, 1096, 1105, 1114, 1123, 1132, + 1141, 1152, 1162, 1171, 1181, 1191, 1200, 1209, 1218, 1227, + 1237, 1246, 1256, 1265, 1274, 1283, 1292, 1301, 1310, 1319, + 1328, 1337, 1346, 1355, 1364, 1373, 1382, 1391, 1400, 1409, + 1418, 1427, 1436, 1445, 1454, 1463, 1472, 1482, 1580, 1585, + 1590, 1595, 1596, 1597, 1598, 1599, 1600, 1602, 1620, 1633, + 1638, 1642, 1644, 1646, 1648 } ; /* The intent behind this definition is that it'll catch @@ -2863,7 +2863,6 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: @@ -2873,7 +2872,7 @@ YY_RULE_SETUP YY_BREAK case 66: YY_RULE_SETUP -#line 714 "dhcp6_lexer.ll" +#line 713 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2881,7 +2880,6 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::OPTION_DEF: case isc::dhcp::Parser6Context::OPTION_DATA: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); @@ -2892,7 +2890,7 @@ YY_RULE_SETUP YY_BREAK case 67: YY_RULE_SETUP -#line 730 "dhcp6_lexer.ll" +#line 728 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2904,7 +2902,7 @@ YY_RULE_SETUP YY_BREAK case 68: YY_RULE_SETUP -#line 739 "dhcp6_lexer.ll" +#line 737 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2916,7 +2914,7 @@ YY_RULE_SETUP YY_BREAK case 69: YY_RULE_SETUP -#line 748 "dhcp6_lexer.ll" +#line 746 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2928,7 +2926,7 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 757 "dhcp6_lexer.ll" +#line 755 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2940,7 +2938,7 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 766 "dhcp6_lexer.ll" +#line 764 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2952,7 +2950,7 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 775 "dhcp6_lexer.ll" +#line 773 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2964,7 +2962,7 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 784 "dhcp6_lexer.ll" +#line 782 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2976,7 +2974,7 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 793 "dhcp6_lexer.ll" +#line 791 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2988,7 +2986,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 802 "dhcp6_lexer.ll" +#line 800 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -3000,7 +2998,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 811 "dhcp6_lexer.ll" +#line 809 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3012,7 +3010,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 820 "dhcp6_lexer.ll" +#line 818 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3026,7 +3024,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 831 "dhcp6_lexer.ll" +#line 829 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3039,7 +3037,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 841 "dhcp6_lexer.ll" +#line 839 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::KNOWN_CLIENTS: @@ -3051,7 +3049,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 850 "dhcp6_lexer.ll" +#line 848 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3063,7 +3061,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 859 "dhcp6_lexer.ll" +#line 857 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3076,7 +3074,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 869 "dhcp6_lexer.ll" +#line 867 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3089,7 +3087,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 879 "dhcp6_lexer.ll" +#line 877 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3101,7 +3099,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 888 "dhcp6_lexer.ll" +#line 886 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3114,7 +3112,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 898 "dhcp6_lexer.ll" +#line 896 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3127,7 +3125,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 908 "dhcp6_lexer.ll" +#line 906 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3139,7 +3137,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 917 "dhcp6_lexer.ll" +#line 915 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3151,7 +3149,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 926 "dhcp6_lexer.ll" +#line 924 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3163,7 +3161,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 935 "dhcp6_lexer.ll" +#line 933 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3175,7 +3173,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 944 "dhcp6_lexer.ll" +#line 942 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3188,7 +3186,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 954 "dhcp6_lexer.ll" +#line 952 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3200,7 +3198,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 963 "dhcp6_lexer.ll" +#line 961 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3212,7 +3210,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 972 "dhcp6_lexer.ll" +#line 970 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3224,7 +3222,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 981 "dhcp6_lexer.ll" +#line 979 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3236,7 +3234,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 990 "dhcp6_lexer.ll" +#line 988 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3248,7 +3246,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 999 "dhcp6_lexer.ll" +#line 997 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3260,7 +3258,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1008 "dhcp6_lexer.ll" +#line 1006 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3272,7 +3270,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1017 "dhcp6_lexer.ll" +#line 1015 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3284,7 +3282,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1026 "dhcp6_lexer.ll" +#line 1024 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3296,7 +3294,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1035 "dhcp6_lexer.ll" +#line 1033 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3308,7 +3306,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1045 "dhcp6_lexer.ll" +#line 1043 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3320,7 +3318,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1054 "dhcp6_lexer.ll" +#line 1052 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3332,7 +3330,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1063 "dhcp6_lexer.ll" +#line 1061 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3345,7 +3343,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1073 "dhcp6_lexer.ll" +#line 1071 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3360,7 +3358,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1085 "dhcp6_lexer.ll" +#line 1083 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3376,11 +3374,10 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1098 "dhcp6_lexer.ll" +#line 1096 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: return isc::dhcp::Dhcp6Parser::make_TEST(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("test", driver.loc_); @@ -3389,7 +3386,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1108 "dhcp6_lexer.ll" +#line 1105 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3401,7 +3398,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1117 "dhcp6_lexer.ll" +#line 1114 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3413,7 +3410,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1126 "dhcp6_lexer.ll" +#line 1123 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3425,7 +3422,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1135 "dhcp6_lexer.ll" +#line 1132 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3437,7 +3434,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1144 "dhcp6_lexer.ll" +#line 1141 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3451,7 +3448,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1155 "dhcp6_lexer.ll" +#line 1152 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3464,7 +3461,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1165 "dhcp6_lexer.ll" +#line 1162 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3476,7 +3473,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1174 "dhcp6_lexer.ll" +#line 1171 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3489,7 +3486,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1184 "dhcp6_lexer.ll" +#line 1181 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3502,7 +3499,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1194 "dhcp6_lexer.ll" +#line 1191 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3514,7 +3511,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1203 "dhcp6_lexer.ll" +#line 1200 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3526,7 +3523,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1212 "dhcp6_lexer.ll" +#line 1209 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3538,7 +3535,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1221 "dhcp6_lexer.ll" +#line 1218 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3550,7 +3547,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1230 "dhcp6_lexer.ll" +#line 1227 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3563,7 +3560,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1240 "dhcp6_lexer.ll" +#line 1237 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3575,7 +3572,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1249 "dhcp6_lexer.ll" +#line 1246 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3587,7 +3584,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1259 "dhcp6_lexer.ll" +#line 1256 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3599,7 +3596,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1268 "dhcp6_lexer.ll" +#line 1265 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3611,7 +3608,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1277 "dhcp6_lexer.ll" +#line 1274 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3623,7 +3620,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1286 "dhcp6_lexer.ll" +#line 1283 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3635,7 +3632,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1295 "dhcp6_lexer.ll" +#line 1292 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3647,7 +3644,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1304 "dhcp6_lexer.ll" +#line 1301 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3659,7 +3656,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1313 "dhcp6_lexer.ll" +#line 1310 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3671,7 +3668,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1322 "dhcp6_lexer.ll" +#line 1319 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3683,7 +3680,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1331 "dhcp6_lexer.ll" +#line 1328 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3695,7 +3692,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1340 "dhcp6_lexer.ll" +#line 1337 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3707,7 +3704,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1349 "dhcp6_lexer.ll" +#line 1346 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3719,7 +3716,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1358 "dhcp6_lexer.ll" +#line 1355 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3731,7 +3728,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1367 "dhcp6_lexer.ll" +#line 1364 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3743,7 +3740,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1376 "dhcp6_lexer.ll" +#line 1373 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3755,7 +3752,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1385 "dhcp6_lexer.ll" +#line 1382 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3767,7 +3764,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1394 "dhcp6_lexer.ll" +#line 1391 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3779,7 +3776,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1403 "dhcp6_lexer.ll" +#line 1400 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3791,7 +3788,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1412 "dhcp6_lexer.ll" +#line 1409 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3803,7 +3800,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1421 "dhcp6_lexer.ll" +#line 1418 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3815,7 +3812,7 @@ YY_RULE_SETUP YY_BREAK case 142: YY_RULE_SETUP -#line 1430 "dhcp6_lexer.ll" +#line 1427 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3827,7 +3824,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1439 "dhcp6_lexer.ll" +#line 1436 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3839,7 +3836,7 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1448 "dhcp6_lexer.ll" +#line 1445 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3851,7 +3848,7 @@ YY_RULE_SETUP YY_BREAK case 145: YY_RULE_SETUP -#line 1457 "dhcp6_lexer.ll" +#line 1454 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3863,7 +3860,7 @@ YY_RULE_SETUP YY_BREAK case 146: YY_RULE_SETUP -#line 1466 "dhcp6_lexer.ll" +#line 1463 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3875,7 +3872,7 @@ YY_RULE_SETUP YY_BREAK case 147: YY_RULE_SETUP -#line 1475 "dhcp6_lexer.ll" +#line 1472 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3887,7 +3884,7 @@ YY_RULE_SETUP YY_BREAK case 148: YY_RULE_SETUP -#line 1485 "dhcp6_lexer.ll" +#line 1482 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3989,7 +3986,7 @@ YY_RULE_SETUP case 149: /* rule 149 can match eol */ YY_RULE_SETUP -#line 1583 "dhcp6_lexer.ll" +#line 1580 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3998,7 +3995,7 @@ YY_RULE_SETUP case 150: /* rule 150 can match eol */ YY_RULE_SETUP -#line 1588 "dhcp6_lexer.ll" +#line 1585 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -4006,7 +4003,7 @@ YY_RULE_SETUP YY_BREAK case 151: YY_RULE_SETUP -#line 1593 "dhcp6_lexer.ll" +#line 1590 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -4014,37 +4011,37 @@ YY_RULE_SETUP YY_BREAK case 152: YY_RULE_SETUP -#line 1598 "dhcp6_lexer.ll" +#line 1595 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1599 "dhcp6_lexer.ll" +#line 1596 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1600 "dhcp6_lexer.ll" +#line 1597 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 155: YY_RULE_SETUP -#line 1601 "dhcp6_lexer.ll" +#line 1598 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 156: YY_RULE_SETUP -#line 1602 "dhcp6_lexer.ll" +#line 1599 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 157: YY_RULE_SETUP -#line 1603 "dhcp6_lexer.ll" +#line 1600 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } YY_BREAK case 158: YY_RULE_SETUP -#line 1605 "dhcp6_lexer.ll" +#line 1602 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4065,7 +4062,7 @@ YY_RULE_SETUP YY_BREAK case 159: YY_RULE_SETUP -#line 1623 "dhcp6_lexer.ll" +#line 1620 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4081,7 +4078,7 @@ YY_RULE_SETUP YY_BREAK case 160: YY_RULE_SETUP -#line 1636 "dhcp6_lexer.ll" +#line 1633 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -4089,33 +4086,33 @@ YY_RULE_SETUP YY_BREAK case 161: YY_RULE_SETUP -#line 1641 "dhcp6_lexer.ll" +#line 1638 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 162: YY_RULE_SETUP -#line 1645 "dhcp6_lexer.ll" +#line 1642 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 163: YY_RULE_SETUP -#line 1647 "dhcp6_lexer.ll" +#line 1644 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 164: YY_RULE_SETUP -#line 1649 "dhcp6_lexer.ll" +#line 1646 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 165: YY_RULE_SETUP -#line 1651 "dhcp6_lexer.ll" +#line 1648 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1653 "dhcp6_lexer.ll" +#line 1650 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4141,10 +4138,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 166: YY_RULE_SETUP -#line 1676 "dhcp6_lexer.ll" +#line 1673 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4147 "dhcp6_lexer.cc" +#line 4144 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -5249,7 +5246,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1676 "dhcp6_lexer.ll" +#line 1673 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 0ea4191f49..b0134c77f0 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -702,7 +702,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: @@ -717,7 +716,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::OPTION_DEF: case isc::dhcp::Parser6Context::OPTION_DATA: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); @@ -1097,7 +1095,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"test\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case isc::dhcp::Parser6Context::CLIENT_CLASS: return isc::dhcp::Dhcp6Parser::make_TEST(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("test", driver.loc_); From f50a2b92dfb1df6f4bb35307b0295f3b3bb76fb8 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 02:17:57 +0000 Subject: [PATCH 31/52] [trac5374] regen lexer --- src/bin/dhcp6/dhcp6_lexer.cc | 2 +- src/bin/dhcp6/dhcp6_lexer.ll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index a3972ddbdd..89ea5a5d84 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -3352,7 +3352,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("eval-client-classes", driver.loc_); } } YY_BREAK diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index b0134c77f0..8a94ce791d 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1075,7 +1075,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("eval-client-classes", driver.loc_); } } From 1db3a9656fd382550895dba637c9c2f63f05c4c2 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 15:03:17 +0100 Subject: [PATCH 32/52] [5374] Fixed options in DHCPv4 pool --- src/bin/dhcp4/dhcp4_srv.cc | 17 +- .../dhcp4/tests/shared_network_unittest.cc | 541 ++++++++++++++++++ 2 files changed, 556 insertions(+), 2 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index e5f39d21bb..36e6cf6b1a 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1185,12 +1185,25 @@ Dhcpv4Srv::buildCfgOptionList(Dhcpv4Exchange& ex) { co_list.push_back(host->getCfgOption4()); } - // Secondly, subnet configured options. + // Secondly, pool specific options. + Pkt4Ptr resp = ex.getResponse(); + IOAddress addr = IOAddress::IPV4_ZERO_ADDRESS(); + if (resp) { + addr = resp->getYiaddr(); + } + if (!addr.isV4Zero()) { + PoolPtr pool = subnet->getPool(Lease::TYPE_V4, addr, false); + if (pool && !pool->getCfgOption()->empty()) { + co_list.push_back(pool->getCfgOption()); + } + } + + // Thirdly, subnet configured options. if (!subnet->getCfgOption()->empty()) { co_list.push_back(subnet->getCfgOption()); } - // Thirdly, shared network specific options. + // Forthly, shared network specific options. SharedNetwork4Ptr network; subnet->getSharedNetwork(network); if (network && !network->getCfgOption()->empty()) { diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index 9e564d551e..fc7d00452a 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -2050,4 +2050,545 @@ TEST_F(Dhcpv4SharedNetworkTest, poolInSubnetSelectedByClass) { doRequest(client2, "192.0.2.100"); }); } + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceGlobal) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.1", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceClass) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.2", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceNetwork) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.3\"" + " }" + " ]," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.3", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceSubnet) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.3\"" + " }" + " ]," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.4", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedencePool) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.3\"" + " }" + " ]," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.5\"" + " }" + " ]" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.5", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceReservation) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.3\"" + " }" + " ]," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.5\"" + " }" + " ]" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.6\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("192.0.2.6", addrs[0].toText()); +} + } // end of anonymous namespace From 6b0e2fd859946c1bb9253ab0f5da1fe13bfc01ed Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 27 Nov 2017 19:12:28 +0100 Subject: [PATCH 33/52] [5374] Checkpoint: nearly finished: still some cleanups --- doc/guide/classify.xml | 47 +- doc/guide/dhcp4-srv.xml | 71 +- doc/guide/dhcp6-srv.xml | 63 +- src/bin/dhcp4/tests/classify_unittest.cc | 438 +++++++++++++ .../dhcp4/tests/shared_network_unittest.cc | 93 +++ src/bin/dhcp6/tests/classify_unittests.cc | 513 +++++++++++++++ .../dhcp6/tests/shared_network_unittest.cc | 606 ++++++++++++++++++ 7 files changed, 1818 insertions(+), 13 deletions(-) diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 49fd96d01f..29765165f1 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -40,7 +40,7 @@ - The process of doing classification is conducted in four steps: + The process of doing classification is conducted in six steps: Assess an incoming packet and assign it to zero or more classes. @@ -54,6 +54,13 @@ Choose a subnet, possibly based on the class information. + Assign classes from host reservations + + + Perform a second pass by evaluating match expressions of on-demand + classes. + + Assign options, again possibly based on the class information. For DHCPv4 private and code 43 options this includes class local option definitions. @@ -142,6 +149,11 @@ is "true". Expressions are written in standard format and can be nested. + + When the eval-on-demand flag is set to true in a class definition, + the match expression is skipped during the first evaluation pass. + + Expressions are pre-processed during the parsing of the configuration file and converted to an internal representation. This allows certain types of @@ -671,9 +683,11 @@ concatenation of the strings
Configuring Classes - A class contains three items: a name, a test expression and option data. + A class contains five items: a name, a test expression, option data, + option definition and eval on-demand flag. The name must exist and must be unique amongst all classes. The test - expression and option data are optional. + expression, option data and definition, and eval on-demand flag are + optional. @@ -687,6 +701,33 @@ concatenation of the strings to members of this class. + + The option definition is for DHCPv4 option 43 ( and DHCPv4 private options + (). + + + + Usually the test expression is evaluated before subnet selection + but in some cases it is useful to evaluate it later when the + subnet, shared-network or pools are known but output option + processing not yet done. The eval-on-demand flag, false by default, + allows to defer and make only on-demand the evaluation of the + test expression. + + + + The eval-client-classes list which is valid for shared-network, + subnet and pool scope specifies the classes which are evaluated + in the second pass before output option processing. + The list is built in the reversed precedence order of option + data, i.e. an option data in a subnet takes precedence on one + in a shared-network but an on-demand class in a subnet is added + after one in a shared-network. + The mechanism is related to the eval-on-demand flag but it is + not required that the flag was set to true. + + In the following example the class named "Client_foo" is defined. It is comprised of all clients whose client ids (option 61) start with the diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 34f2fd9e81..6a55a91563 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -1613,7 +1613,7 @@ It is merely echoed by the server an old PXEClient vendor: "Dhcp4": { - "client-class": [ + "client-classes": [ { "name": "pxeclient", "test": "option[vendor-class-identifier].text == 'PXEClient'", @@ -1656,7 +1656,7 @@ It is merely echoed by the server }, ... ], - "client-class": [ + "client-classes": [ { "name": "APC", "test": "(option[vendor-class-identifier].text == 'APC'", @@ -2100,10 +2100,13 @@ It is merely echoed by the server - The process of doing classification is conducted in three steps. The first step + The process of doing classification is conducted in five steps. The first step is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. - The third step is to assign options, again possibly based on the class + The third step is to assign classes from host reservations. + The forth step is to build the list of on-demand classes and perform + deferred evaluation for each class of the list. + The last step is to assign options, again possibly based on the class information. @@ -2161,9 +2164,13 @@ It is merely echoed by the server If there are multiple classes defined and an incoming packet is matched - to multiple classes, the class whose name is alphabetically the first - is used. + to multiple classes, the class which is defined first is used. + + + In versions before 1.4 the alphabetical order was used. + +
@@ -2249,6 +2256,56 @@ It is merely echoed by the server }
+ +
+ On-demand classification + + In some cases it is useful to limit the scope of class. + Two devices are available to perform evaluation of test + expressions so assignment when it returns true only on-demand. + + + + The first one is the per-class eval-on-demand + flag which is false by default. When it is set to + true the test expression of the class is not + evaluated at the reception of a new incoming ticket. + + + + The second is the eval-client-classes which + takes a list of class names and is valid in shared-network, + subnet and pool scope. Classes in these lists are evaluated + after resource assignment and before output option processing. + + + + In this example a class is assigned to the incoming packet + when the specified subnet is used. + + +"Dhcp4": { + "client-classes": [ + { + "name": "Client_foo", + "test": "'' == ''", + "eval-on-demand": true + }, + ... + ], + "subnet4": [ + { + "subnet": "192.0.2.0/24", + "pools": [ { "pool": "192.0.2.10 - 192.0.2.20" } ], + "eval-client-classes": [ "Client_foo" ], + ... + }, + ... + ], + ... +} + +
@@ -3766,7 +3823,7 @@ for each subnet. Here's an example: "shared-networks": [ - {" + { "name": "kakapo", "relay": { "ip-address": "192.3.5.6" diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 1ac0cf5aac..d14b177db2 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1960,10 +1960,13 @@ should include options from the isc option space: - The process of doing classification is conducted in three steps. The first step + The process of doing classification is conducted in five steps. The first step is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. - The third step is to assign options again possibly based on the class + The third step is to assign classes from host reservations. + The forth step is to build the list of on-demand classes and perform + deferred evaluation for each class of the list. + The last step is to assign options again possibly based on the class information. @@ -2046,6 +2049,60 @@ should include options from the isc option space:
+ +
+ On-demand classification + + In some cases it is useful to limit the scope of class. + Two devices are available to perform evaluation of test + expressions so assignment when it returns true only on-demand. + + + + The first one is the per-class eval-on-demand + flag which is false by default. When it is set to + true the test expression of the class is not + evaluated at the reception of a new incoming ticket. + + + + The second is the eval-client-classes which + takes a list of class names and is valid in shared-network, + subnet and pool scope. Classes in these lists are evaluated + after resource assignment and before output option processing. + + + + In this example a class is assigned to the incoming packet + when the specified subnet is used. + + +"Dhcp6": { + "client-classes": [ + { + "name": "Client_foo", + "test": "'' == ''", + "eval-on-demand": true + }, + ... + ], + "subnet6": [ + { + "subnet": "2001:db8:1::/64" + "pools": [ + { + "pool": "2001:db8:1::-2001:db8:1::ffff" + } + ], + "eval-client-classes": [ "Client_foo" ], + ... + }, + ... + ], + ... +} + +
@@ -3300,7 +3357,7 @@ for each subnet. Here's an example: "shared-networks": [ - {" + { "name": "kakapo", "relay": { "ip-address": "2001:db8::abcd" diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 3f48b2013c..18a2230937 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -54,6 +54,16 @@ namespace { /// option[93].hex == 0x0006 /// option[93].hex == 0x0001 /// or member(), set boot-file-name to pxelinux.0 +/// +/// - Configuration 3: +/// - Used for late/on-demand classification +/// - 1 subnet: 10.0.0.0/24 +/// - 1 pool: 10.0.0.10-10.0.0.100 +/// - the following classes defined: +/// option[93].hex == 0x0009, next-server set to 1.2.3.4 +/// option[93].hex == 0x0007, set server-hostname to deneb +/// option[93].hex == 0x0006, set boot-file-name to pxelinux.0 +/// option[93].hex == 0x0001, set boot-file-name to ipxe.efi const char* CONFIGS[] = { // Configuration 0 "{ \"interfaces-config\": {" @@ -164,7 +174,45 @@ const char* CONFIGS[] = { " \"id\": 1," " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]" " } ]" + "}", + + // Configuration 3 + "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + "{" + " \"name\": \"pxe1\"," + " \"test\": \"option[93].hex == 0x0009\"," + " \"eval-on-demand\": true," + " \"next-server\": \"1.2.3.4\"" + "}," + "{" + " \"name\": \"pxe2\"," + " \"test\": \"option[93].hex == 0x0007\"," + " \"eval-on-demand\": true," + " \"server-hostname\": \"deneb\"" + "}," + "{" + " \"name\": \"pxe3\"," + " \"test\": \"option[93].hex == 0x0006\"," + " \"eval-on-demand\": false," + " \"boot-file-name\": \"pxelinux.0\"" + "}," + "{" + " \"name\": \"pxe4\"," + " \"test\": \"option[93].hex == 0x0001\"," + " \"boot-file-name\": \"ipxe.efi\"" + "}]," + "\"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\", " + " \"id\": 1," + " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]," + " \"eval-client-classes\": [ \"pxe2\" ]" + " } ]" "}" + }; /// @brief Test fixture class for testing classification. @@ -507,4 +555,394 @@ TEST_F(ClassifyTest, fixedFieldsInformFile22) { testFixedFields(CONFIGS[2], DHCPINFORM, pxe, "0.0.0.0", "", "pxelinux.0"); } +// No class +TEST_F(ClassifyTest, fixedFieldsDiscoverNoClasses3) { + testFixedFields(CONFIGS[3], DHCPDISCOVER, OptionPtr(), "0.0.0.0", "", ""); +} +TEST_F(ClassifyTest, fixedFieldsRequestNoClasses3) { + testFixedFields(CONFIGS[3], DHCPREQUEST, OptionPtr(), "0.0.0.0", "", ""); +} +TEST_F(ClassifyTest, fixedFieldsInformNoClasses3) { + testFixedFields(CONFIGS[3], DHCPINFORM, OptionPtr(), "0.0.0.0", "", ""); +} + +// Class 'pxe1' is on-demand and not subject to late evaluation +TEST_F(ClassifyTest, fixedFieldsDiscoverNextServer3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[3], DHCPDISCOVER, pxe, "0.0.0.0", "", ""); +} +TEST_F(ClassifyTest, fixedFieldsRequestNextServer3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[3], DHCPREQUEST, pxe, "0.0.0.0", "", ""); +} +TEST_F(ClassifyTest, fixedFieldsInformNextServer3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + + testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "", ""); +} + + +// Class pxe2 is on-demand but the subnet requests its late evaluation +TEST_F(ClassifyTest, fixedFieldsDiscoverHostname3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); + + testFixedFields(CONFIGS[3], DHCPDISCOVER, pxe, "0.0.0.0", "deneb", ""); +} +TEST_F(ClassifyTest, fixedFieldsRequestHostname3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); + + testFixedFields(CONFIGS[3], DHCPREQUEST, pxe, "0.0.0.0", "deneb", ""); +} +TEST_F(ClassifyTest, fixedFieldsInformHostname3) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); + + testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "deneb", ""); +} + +// No change from config #0 for pxe3 and pxe4 +TEST_F(ClassifyTest, fixedFieldsDiscoverFile31) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[3], DHCPDISCOVER, pxe, "0.0.0.0", "", "pxelinux.0"); +} +TEST_F(ClassifyTest, fixedFieldsRequestFile31) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[3], DHCPREQUEST, pxe, "0.0.0.0", "", "pxelinux.0"); +} +TEST_F(ClassifyTest, fixedFieldsInformFile31) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0006)); + + testFixedFields(CONFIGS[3], DHCPDISCOVER, pxe, "0.0.0.0", "", "pxelinux.0"); +} +TEST_F(ClassifyTest, fixedFieldsDiscoverFile32) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[3], DHCPDISCOVER, pxe, "0.0.0.0", "", "ipxe.efi"); +} +TEST_F(ClassifyTest, fixedFieldsRequestFile32) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[3], DHCPREQUEST, pxe, "0.0.0.0", "", "ipxe.efi"); +} +TEST_F(ClassifyTest, fixedFieldsInformFile32) { + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0001)); + + testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "", "ipxe.efi"); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceNone) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\"," + " \"id\": 1," + " \"pools\": [ { " + " \"pool\": \"10.0.0.10-10.0.0.100\"" + " } ]" + " } ]" + "} ]" + "}"; + + // Create a client requesting domain-name-servers option + Dhcp4Client client(Dhcp4Client::SELECTING); + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Load the config and perform a DORA + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doDORA()); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ("10.0.0.10", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + EXPECT_FALSE(opt); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedencePool) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\"," + " \"id\": 1," + " \"pools\": [ { " + " \"pool\": \"10.0.0.10-10.0.0.100\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]" + "}"; + + // Create a client requesting domain-name-servers option + Dhcp4Client client(Dhcp4Client::SELECTING); + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Load the config and perform a DORA + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doDORA()); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ("10.0.0.10", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("10.0.0.1", addrs[0].toText()); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceSubnet) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\"," + " \"id\": 1," + " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"pools\": [ { " + " \"pool\": \"10.0.0.10-10.0.0.100\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]" + "}"; + + // Create a client requesting domain-name-servers option + Dhcp4Client client(Dhcp4Client::SELECTING); + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Load the config and perform a DORA + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doDORA()); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ("10.0.0.10", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("10.0.0.2", addrs[0].toText()); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceNetwork) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"10.0.0.3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"eval-client-classes\": [ \"for-network\" ]," + " \"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\"," + " \"id\": 1," + " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"pools\": [ { " + " \"pool\": \"10.0.0.10-10.0.0.100\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]" + "}"; + + // Create a client requesting domain-name-servers option + Dhcp4Client client(Dhcp4Client::SELECTING); + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Load the config and perform a DORA + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doDORA()); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ("10.0.0.10", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("10.0.0.3", addrs[0].toText()); +} + } // end of anonymous namespace diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index fc7d00452a..2c92453ab8 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -2203,6 +2203,99 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceClass) { EXPECT_EQ("192.0.2.2", addrs[0].toText()); } +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pool < host reservation +TEST_F(Dhcpv4SharedNetworkTest, precedenceClasses) { + const std::string config = + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"valid-lifetime\": 600," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"beta\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.2\"" + " }" + " ]" + " }," + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"domain-name-servers\"," + " \"data\": \"192.0.2.3\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/26\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"hw-address\": \"aa:bb:cc:dd:ee:ff\"," + " \"ip-address\": \"192.0.2.28\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform a DORA + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + // Class order is the insert order + EXPECT_EQ("192.0.2.2", addrs[0].toText()); +} + // Verify option processing precedence // Order is global < class < shared-network < subnet < pool < host reservation TEST_F(Dhcpv4SharedNetworkTest, precedenceNetwork) { diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 99058ac014..a2b16ee50d 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -302,6 +302,189 @@ TEST_F(ClassifyTest, matchClassification) { EXPECT_FALSE(opt3); } +// Check that on-demand classes are not evaluated by classifyPacket +TEST_F(ClassifyTest, onDemand) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // The router class matches incoming packets with foo in a host-name + // option (code 1234) and sets an ipv6-forwarding option in the response. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ] }, " + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"valid-lifetime\": 4000, " + "\"option-def\": [ " + "{ \"name\": \"host-name\"," + " \"code\": 1234," + " \"type\": \"string\" }," + "{ \"name\": \"ipv6-forwarding\"," + " \"code\": 2345," + " \"type\": \"boolean\" }]," + "\"subnet6\": [ " + "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " + " \"subnet\": \"2001:db8:1::/48\", " + " \"interface\": \"eth1\" } ]," + "\"client-classes\": [ " + "{ \"name\": \"router\", " + " \"eval-on-demand\": true, " + " \"option-data\": [" + " { \"name\": \"ipv6-forwarding\", " + " \"data\": \"true\" } ], " + " \"test\": \"option[host-name].text == 'foo'\" } ] }"; + ASSERT_NO_THROW(configure(config)); + + // Create packets with enough to select the subnet + OptionPtr clientid = generateClientId(); + Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234)); + query1->setRemoteAddr(IOAddress("fe80::abcd")); + query1->addOption(clientid); + query1->setIface("eth1"); + query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234)); + query2->setRemoteAddr(IOAddress("fe80::abcd")); + query2->addOption(clientid); + query2->setIface("eth1"); + query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234)); + query3->setRemoteAddr(IOAddress("fe80::abcd")); + query3->addOption(clientid); + query3->setIface("eth1"); + query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000)); + + // Create and add an ORO option to the first 2 queries + OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); + ASSERT_TRUE(oro); + oro->addValue(2345); + query1->addOption(oro); + query2->addOption(oro); + + // Create and add a host-name option to the first and last queries + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + ASSERT_TRUE(hostname); + query1->addOption(hostname); + query3->addOption(hostname); + + // Classify packets + srv.classifyPacket(query1); + srv.classifyPacket(query2); + srv.classifyPacket(query3); + + // No packet is in the router class + EXPECT_FALSE(query1->inClass("router")); + EXPECT_FALSE(query2->inClass("router")); + EXPECT_FALSE(query3->inClass("router")); + + // Process queries + Pkt6Ptr response1 = srv.processSolicit(query1); + Pkt6Ptr response2 = srv.processSolicit(query2); + Pkt6Ptr response3 = srv.processSolicit(query3); + + // Classification processing should do nothing + OptionPtr opt1 = response1->getOption(2345); + EXPECT_FALSE(opt1); + OptionPtr opt2 = response2->getOption(2345); + EXPECT_FALSE(opt2); + OptionPtr opt3 = response3->getOption(2345); + EXPECT_FALSE(opt3); +} + +// Checks that when requested on-demand classes are still (but late) evaluated +TEST_F(ClassifyTest, lateClassification) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // The router class matches incoming packets with foo in a host-name + // option (code 1234) and sets an ipv6-forwarding option in the response. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ] }, " + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"valid-lifetime\": 4000, " + "\"option-def\": [ " + "{ \"name\": \"host-name\"," + " \"code\": 1234," + " \"type\": \"string\" }," + "{ \"name\": \"ipv6-forwarding\"," + " \"code\": 2345," + " \"type\": \"boolean\" }]," + "\"subnet6\": [ " + "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " + " \"subnet\": \"2001:db8:1::/48\", " + " \"eval-client-classes\": [ \"router\" ], " + " \"interface\": \"eth1\" } ]," + "\"client-classes\": [ " + "{ \"name\": \"router\", " + " \"eval-on-demand\": true, " + " \"option-data\": [" + " { \"name\": \"ipv6-forwarding\", " + " \"data\": \"true\" } ], " + " \"test\": \"option[host-name].text == 'foo'\" } ] }"; + ASSERT_NO_THROW(configure(config)); + + // Create packets with enough to select the subnet + OptionPtr clientid = generateClientId(); + Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234)); + query1->setRemoteAddr(IOAddress("fe80::abcd")); + query1->addOption(clientid); + query1->setIface("eth1"); + query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234)); + query2->setRemoteAddr(IOAddress("fe80::abcd")); + query2->addOption(clientid); + query2->setIface("eth1"); + query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); + Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234)); + query3->setRemoteAddr(IOAddress("fe80::abcd")); + query3->addOption(clientid); + query3->setIface("eth1"); + query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000)); + + // Create and add an ORO option to the first 2 queries + OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); + ASSERT_TRUE(oro); + oro->addValue(2345); + query1->addOption(oro); + query2->addOption(oro); + + // Create and add a host-name option to the first and last queries + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + ASSERT_TRUE(hostname); + query1->addOption(hostname); + query3->addOption(hostname); + + // Classify packets + srv.classifyPacket(query1); + srv.classifyPacket(query2); + srv.classifyPacket(query3); + + // No packet is in the router class yet + EXPECT_FALSE(query1->inClass("router")); + EXPECT_FALSE(query2->inClass("router")); + EXPECT_FALSE(query3->inClass("router")); + + // Process queries + Pkt6Ptr response1 = srv.processSolicit(query1); + Pkt6Ptr response2 = srv.processSolicit(query2); + Pkt6Ptr response3 = srv.processSolicit(query3); + + // Classification processing should add an ip-forwarding option + OptionPtr opt1 = response1->getOption(2345); + EXPECT_TRUE(opt1); + + // But only for the first query: second was not classified + OptionPtr opt2 = response2->getOption(2345); + EXPECT_FALSE(opt2); + + // But only for the first query: third has no ORO + OptionPtr opt3 = response3->getOption(2345); + EXPECT_FALSE(opt3); +} + // Checks subnet options have the priority over class options TEST_F(ClassifyTest, subnetClassPriority) { IfaceMgrTestConfig test_config(true); @@ -1125,4 +1308,334 @@ TEST_F(ClassifyTest, member) { EXPECT_FALSE(ipf3->readBoolean()); } +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceNone) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000," + "\"renew-timer\": 1000," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [ { " + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 1," + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " } ]" + " } ]" + "} ]," + "\"valid-lifetime\": 600" + "}"; + + // Create a client requesting dns-servers option + Dhcp6Client client; + client.setInterface("eth1"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + client.requestOption(D6O_NAME_SERVERS); + + // Load the config and perform a SARR + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + EXPECT_FALSE(opt); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedencePool) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [ { " + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 1," + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]," + "\"valid-lifetime\": 600" + "}"; + + // Create a client requesting dns-servers option + Dhcp6Client client; + client.setInterface("eth1"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + client.requestOption(D6O_NAME_SERVERS); + + // Load the config and perform a SARR + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::1", addrs[0].toText()); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceSubnet) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [ { " + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 1," + " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]," + "\"valid-lifetime\": 600" + "}"; + + // Create a client requesting dns-servers option + Dhcp6Client client; + client.setInterface("eth1"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + client.requestOption(D6O_NAME_SERVERS); + + // Load the config and perform a SARR + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); +} + +// This test checks the precedence order in requested late evaluation. +// This order is: shared-network > subnet > pools +TEST_F(ClassifyTest, precedenceNetwork) { + std::string config = + "{" + "\"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + " {" + " \"name\": \"all\"," + " \"test\": \"'' == ''\"" + " }," + " {" + " \"name\": \"for-pool\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " } ]" + " }," + " {" + " \"name\": \"for-subnet\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " } ]" + " }," + " {" + " \"name\": \"for-network\"," + " \"test\": \"member('all')\"," + " \"eval-on-demand\": true," + " \"option-data\": [ {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " } ]" + " }" + "]," + "\"shared-networks\": [ {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"eval-client-classes\": [ \"for-network\" ]," + " \"subnet6\": [ { " + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 1," + " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," + " \"eval-client-classes\": [ \"for-pool\" ]" + " } ]" + " } ]" + "} ]," + "\"valid-lifetime\": 600" + "}"; + + // Create a client requesting dns-servers option + Dhcp6Client client; + client.setInterface("eth1"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + client.requestOption(D6O_NAME_SERVERS); + + // Load the config and perform a SARR + configure(config, *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::3", addrs[0].toText()); +} + } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index bca8a1e08f..1f12e76e9f 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -2432,4 +2433,609 @@ TEST_F(Dhcpv6SharedNetworkTest, poolInSubnetSelectedByClass) { EXPECT_EQ(1, client2.getLeasesWithNonZeroLifetime().size()); } +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceGlobal) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::1", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceClass) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceClasses) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"beta\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }," + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + // Class order is the insert order + EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceNetworkClass) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::3", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceSubnet) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::4", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedencePool) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::5\"" + " }" + " ]" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::5", addrs[0].toText()); +} + +// Verify option processing precedence +// Order is global < class < shared-network < subnet < pools < host reservation +TEST_F(Dhcpv6SharedNetworkTest, precedenceReservation) { + const std::string config = + "{" + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::1\"" + " }" + " ]," + " \"client-classes\": [" + " {" + " \"name\": \"alpha\"," + " \"test\": \"'' == ''\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::2\"" + " }" + " ]" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::3\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::4\"" + " }" + " ]," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::5\"" + " }" + " ]" + " }" + " ]," + " \"reservations\": [" + " {" + " \"duid\": \"00:03:00:01:aa:bb:cc:dd:ee:ff\"," + " \"ip-addresses\": [ \"2001:db8:1::28\" ]," + " \"option-data\": [" + " {" + " \"name\": \"dns-servers\"," + " \"data\": \"2001:db8:1::6\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}"; + + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration + configure(config, *client.getServer()); + + // Perform SARR + ASSERT_NO_THROW(client.doSARR()); + + // Check response + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ("2001:db8:1::6", addrs[0].toText()); +} + } // end of anonymous namespace From f848c18c0a58674cf61019b752b10a5c48caffb2 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Tue, 28 Nov 2017 00:23:45 +0100 Subject: [PATCH 34/52] [5374] Final cleanup --- src/bin/dhcp4/dhcp4_messages.mes | 8 ++++ src/bin/dhcp4/dhcp4_srv.cc | 11 +++--- src/bin/dhcp6/dhcp6_messages.mes | 8 ++++ src/bin/dhcp6/dhcp6_srv.cc | 11 +++--- src/lib/dhcpsrv/client_class_def.cc | 39 +++++++++++++++++++ src/lib/dhcpsrv/client_class_def.h | 20 ++++++++++ .../parsers/client_class_def_parser.cc | 30 -------------- .../dhcpsrv/parsers/client_class_def_parser.h | 14 ------- 8 files changed, 87 insertions(+), 54 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_messages.mes b/src/bin/dhcp4/dhcp4_messages.mes index 15b9e82723..ca29b07ccc 100644 --- a/src/bin/dhcp4/dhcp4_messages.mes +++ b/src/bin/dhcp4/dhcp4_messages.mes @@ -59,6 +59,14 @@ which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is inconsistent. +% DHCP4_CLASS_UNKNOWN on-demand class %1 has no definition +This debug message informs that a class is listed for late evaluation but +has no definition. + +% DHCP4_CLASS_UNTESTABLE on-demand class %1 has no test expression +This debug message informs that a class was listed for late evaluation but +its definition does not include a test expression to evaluate. + % DHCP4_CLIENTID_IGNORED_FOR_LEASES %1: not using client identifier for lease allocation for subnet %2 This debug message is issued when the server is processing the DHCPv4 message for which client identifier will not be used when allocating new lease or diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 36e6cf6b1a..2e3f72bafa 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1218,10 +1218,8 @@ Dhcpv4Srv::buildCfgOptionList(Dhcpv4Exchange& ex) { const ClientClassDefPtr& ccdef = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->findClass(*cclass); if (!ccdef) { - // Not found: the class is not configured - if (((*cclass).size() <= VENDOR_CLASS_PREFIX.size()) || - ((*cclass).compare(0, VENDOR_CLASS_PREFIX.size(), VENDOR_CLASS_PREFIX) != 0)) { - // Not a VENDOR_CLASS_* so should be configured + // Not found: the class is built-in or not configured + if (!isClientClassBuiltIn(*cclass)) { LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNCONFIGURED) .arg(ex.getQuery()->getLabel()) .arg(*cclass); @@ -3071,13 +3069,16 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { for (ClientClasses::const_iterator cclass = classes.cbegin(); cclass != classes.cend(); ++cclass) { const ClientClassDefPtr class_def = dict->findClass(*cclass); - // Todo: log unknown classes if (!class_def) { + LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNKNOWN) + .arg(*cclass); continue; } const ExpressionPtr& expr_ptr = class_def->getMatchExpr(); // Nothing to do without an expression to evaluate if (!expr_ptr) { + LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNTESTABLE) + .arg(*cclass); continue; } // Evaluate the expression which can return false (no match), diff --git a/src/bin/dhcp6/dhcp6_messages.mes b/src/bin/dhcp6/dhcp6_messages.mes index 4c8c115454..aececc9b71 100644 --- a/src/bin/dhcp6/dhcp6_messages.mes +++ b/src/bin/dhcp6/dhcp6_messages.mes @@ -66,6 +66,14 @@ which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is inconsistent. +% DHCP6_CLASS_UNKNOWN on-demand class %1 has no definition +This debug message informs that a class is listed for late evaluation but +has no definition. + +% DHCP6_CLASS_UNTESTABLE on-demand class %1 has no test expression +This debug message informs that a class was listed for late evaluation but +its definition does not include a test expression to evaluate. + % DHCP6_COMMAND_RECEIVED received command %1, arguments: %2 A debug message listing the command (and possible arguments) received from the Kea control system by the IPv6 DHCP server. diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 18cbcb03fe..cfdd446195 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -902,10 +902,8 @@ Dhcpv6Srv::buildCfgOptionList(const Pkt6Ptr& question, const ClientClassDefPtr& ccdef = CfgMgr::instance().getCurrentCfg()-> getClientClassDictionary()->findClass(*cclass); if (!ccdef) { - // Not found: the class is not configured - if (((*cclass).size() <= VENDOR_CLASS_PREFIX.size()) || - ((*cclass).compare(0, VENDOR_CLASS_PREFIX.size(), VENDOR_CLASS_PREFIX) != 0)) { - // Not a VENDOR_CLASS_* so should be configured + // Not found: the class is built-in or not configured + if (!isClientClassBuiltIn(*cclass)) { LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_UNCONFIGURED) .arg(question->getLabel()) .arg(*cclass); @@ -3207,13 +3205,16 @@ Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { for (ClientClasses::const_iterator cclass = classes.cbegin(); cclass != classes.cend(); ++cclass) { const ClientClassDefPtr class_def = dict->findClass(*cclass); - // Todo: log unknown classes if (!class_def) { + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_UNKNOWN) + .arg(*cclass); continue; } const ExpressionPtr& expr_ptr = class_def->getMatchExpr(); // Nothing to do without an expression to evaluate if (!expr_ptr) { + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_UNTESTABLE) + .arg(*cclass); continue; } // Evaluate the expression which can return false (no match), diff --git a/src/lib/dhcpsrv/client_class_def.cc b/src/lib/dhcpsrv/client_class_def.cc index 9b5b153704..0b85639bf2 100644 --- a/src/lib/dhcpsrv/client_class_def.cc +++ b/src/lib/dhcpsrv/client_class_def.cc @@ -292,5 +292,44 @@ ClientClassDictionary::toElement() const { return (result); } +std::list +builtinPrefixes = { + "VENDOR_CLASS_", "AFTER_", "EXTERNAL_" +}; + +bool +isClientClassBuiltIn(const ClientClass& client_class) { + for (std::list::const_iterator bt = builtinPrefixes.cbegin(); + bt != builtinPrefixes.cend(); ++bt) { + if (client_class.size() <= bt->size()) { + continue; + } + auto mis = std::mismatch(bt->cbegin(), bt->cend(), client_class.cbegin()); + if (mis.first == bt->cend()) { + return true; + } + } + + return false; +} + +bool +isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class) { + // First check built-in prefixes + if (isClientClassBuiltIn(client_class)) { + return (true); + } + + // Second check already defined, i.e. in the dictionary + ClientClassDefPtr def = class_dictionary->findClass(client_class); + if (def) { + return (true); + } + + // Unknown... + return (false); +} + } // namespace isc::dhcp } // namespace isc diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index d12d2b6f80..b38263aba2 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -340,6 +340,26 @@ private: /// @brief Defines a pointer to a ClientClassDictionary typedef boost::shared_ptr ClientClassDictionaryPtr; +/// @brief List of built-in client class prefixes +/// i.e. VENDOR_CLASS_, AFTER_ and EXTERNAL_. +extern std::list builtinPrefixes; + +/// @brief Check if a client class name is builtin. +/// +/// @param client_class A client class name to look for. +/// @return true if built-in, false if not. +bool isClientClassBuiltIn(const ClientClass& client_class); + + +/// @brief Check if a client class name is already known, +/// i.e. beginning by a built-in prefix or in the dictionary, +/// +/// @param class_dictionary A class dictionary where to look for. +/// @param client_class A client class name to look for. +/// @return true if known or built-in, false if not. +bool isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class); + } // namespace isc::dhcp } // namespace isc diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc index e0d11ec957..cf4b231bbe 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc @@ -201,36 +201,6 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, } } -std::list -ClientClassDefParser::builtinPrefixes = { - "VENDOR_CLASS_", "AFTER_", "EXTERNAL_" -}; - -bool -ClientClassDefParser::isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, - const ClientClass& client_class) { - // First check built-in prefixes - for (std::list::const_iterator bt = builtinPrefixes.cbegin(); - bt != builtinPrefixes.cend(); ++bt) { - if (client_class.size() <= bt->size()) { - continue; - } - auto mis = std::mismatch(bt->cbegin(), bt->cend(), client_class.cbegin()); - if (mis.first == bt->cend()) { - return true; - } - } - - // Second check already defined, i.e. in the dictionary - ClientClassDefPtr def = class_dictionary->findClass(client_class); - if (def) { - return (true); - } - - // Unknown... - return (false); -} - // ****************** ClientClassDefListParser ************************ ClientClassDictionaryPtr diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.h b/src/lib/dhcpsrv/parsers/client_class_def_parser.h index 95a0a592c6..4723f480f4 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.h +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.h @@ -94,20 +94,6 @@ public: /// @throw DhcpConfigError if parsing was unsuccessful. void parse(ClientClassDictionaryPtr& class_dictionary, isc::data::ConstElementPtr client_class_def, uint16_t family); - - /// @brief List of built-in client class prefixes - /// i.e. VENDOR_CLASS_, AFTER_ and EXTERNAL_. - static std::list builtinPrefixes; - - /// @brief Check if a client class name is already known, - /// i.e. beginning by a built-in prefix or in the dictionary, - /// - /// @param class_dictionary A class dictionary where to look for. - /// @param client_class A client class name to look for. - /// @return true if known or built-in, false if not. - static bool - isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, - const ClientClass& client_class); }; /// @brief Defines a pointer to a ClientClassDefParser From 64f3a82b48e24ea0c9928d0751b5386c9273485a Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 28 Mar 2018 12:01:27 +0200 Subject: [PATCH 35/52] [5374] Added missing doxygen tag. --- src/lib/dhcpsrv/pool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index df0cc5fce0..8ed4cbad82 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -114,7 +114,7 @@ public: user_context_ = ctx; } - /// @Checks whether this pool supports client that belongs to + /// @brief Checks whether this pool supports client that belongs to /// specified classes. /// /// @param client_classes list of all classes the client belongs to From eace8a517077c39a37bfbcaf269d72ce190eff23 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 29 Mar 2018 15:41:28 +0200 Subject: [PATCH 36/52] [5374] Updated asiolink --- src/lib/asiolink/io_acceptor.h | 4 ++ src/lib/asiolink/io_address.h | 21 +++++--- src/lib/asiolink/io_asio_socket.h | 3 +- src/lib/asiolink/io_service.h | 5 ++ src/lib/asiolink/tcp_socket.h | 54 ++++++++++++++++++- src/lib/asiolink/tests/io_service_unittest.cc | 2 + src/lib/asiolink/tests/run_unittests.cc | 2 + src/lib/asiolink/udp_socket.h | 4 ++ src/lib/asiolink/unix_domain_socket.cc | 4 ++ 9 files changed, 90 insertions(+), 9 deletions(-) diff --git a/src/lib/asiolink/io_acceptor.h b/src/lib/asiolink/io_acceptor.h index c493d3427e..913a3280b2 100644 --- a/src/lib/asiolink/io_acceptor.h +++ b/src/lib/asiolink/io_acceptor.h @@ -47,7 +47,11 @@ public: /// @brief Returns file descriptor of the underlying socket. virtual int getNative() const { +#if BOOST_VERSION < 106600 return (acceptor_->native()); +#else + return (acceptor_->native_handle()); +#endif } /// @brief Opens acceptor socket given the endpoint. diff --git a/src/lib/asiolink/io_address.h b/src/lib/asiolink/io_address.h index 5747cb9291..42f09d7a9f 100644 --- a/src/lib/asiolink/io_address.h +++ b/src/lib/asiolink/io_address.h @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2010-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -23,11 +23,20 @@ namespace isc { namespace asiolink { - /// Defines length of IPv6 address. - const static size_t V6ADDRESS_LEN = 16; + /// Defines length of IPv6 address (in binary format). + static constexpr size_t V6ADDRESS_LEN = 16; - /// Defines length of IPv4 address. - const static size_t V4ADDRESS_LEN = 4; + /// Defines length of IPv4 address (in binary format). + static constexpr size_t V4ADDRESS_LEN = 4; + + /// @brief Maximum size of an IPv4 address represented as a text string. 12 + /// digits plus 3 full stops (dots). + static constexpr size_t V4ADDRESS_TEXT_MAX_LEN = 15u; + + /// @brief Maximum size of an IPv6 address represented as a text string. 32 + /// hexadecimal characters written in 8 groups of four, plus 7 colon + /// separators. + static constexpr size_t V6ADDRESS_TEXT_MAX_LEN = 39u; /// \brief The \c IOAddress class represents an IP addresses (version /// agnostic) @@ -136,7 +145,7 @@ public: /// \brief Creates an address from over wire data. /// - /// \param family AF_NET for IPv4 or AF_NET6 for IPv6. + /// \param family AF_INET for IPv4 or AF_INET6 for IPv6. /// \param data pointer to first char of data /// /// \return Created IOAddress object diff --git a/src/lib/asiolink/io_asio_socket.h b/src/lib/asiolink/io_asio_socket.h index cdb4074db2..49f5041db4 100644 --- a/src/lib/asiolink/io_asio_socket.h +++ b/src/lib/asiolink/io_asio_socket.h @@ -16,13 +16,14 @@ #include #include -#include #include #include #include +#include + namespace isc { namespace asiolink { diff --git a/src/lib/asiolink/io_service.h b/src/lib/asiolink/io_service.h index e9e402d114..e0832b2c04 100644 --- a/src/lib/asiolink/io_service.h +++ b/src/lib/asiolink/io_service.h @@ -11,7 +11,12 @@ namespace boost { namespace asio { +#if BOOST_VERSION < 106600 class io_service; +#else + class io_context; + typedef io_context io_service; +#endif } } diff --git a/src/lib/asiolink/tcp_socket.h b/src/lib/asiolink/tcp_socket.h index adf74d1f0f..f1297e0630 100644 --- a/src/lib/asiolink/tcp_socket.h +++ b/src/lib/asiolink/tcp_socket.h @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -75,7 +75,11 @@ public: /// \brief Return file descriptor of underlying socket virtual int getNative() const { +#if BOOST_VERSION < 106600 return (socket_.native()); +#else + return (socket_.native_handle()); +#endif } /// \brief Return protocol of socket @@ -90,6 +94,48 @@ public: return (false); } + /// \brief Checks if the connection is usable. + /// + /// The connection is usable if the socket is open and the peer has not + /// closed its connection. + /// + /// \return true if the connection is usable. + bool isUsable() const { + // If the socket is open it doesn't mean that it is still usable. The connection + // could have been closed on the other end. We have to check if we can still + // use this socket. + if (socket_.is_open()) { + // Remember the current non blocking setting. + const bool non_blocking_orig = socket_.non_blocking(); + // Set the socket to non blocking mode. We're going to test if the socket + // returns would_block status on the attempt to read from it. + socket_.non_blocking(true); + + boost::system::error_code ec; + char data[2]; + + // Use receive with message peek flag to avoid removing the data awaiting + // to be read. + socket_.receive(boost::asio::buffer(data, sizeof(data)), + boost::asio::socket_base::message_peek, + ec); + + // Revert the original non_blocking flag on the socket. + socket_.non_blocking(non_blocking_orig); + + // If the connection is alive we'd typically get would_block status code. + // If there are any data that haven't been read we may also get success + // status. We're guessing that try_again may also be returned by some + // implementations in some situations. Any other error code indicates a + // problem with the connection so we assume that the connection has been + // closed. + return (!ec || (ec.value() == boost::asio::error::try_again) || + (ec.value() == boost::asio::error::would_block)); + } + + return (false); + } + /// \brief Open Socket /// /// Opens the TCP socket. This is an asynchronous operation, completion of @@ -227,7 +273,11 @@ TCPSocket::~TCPSocket() template void TCPSocket::open(const IOEndpoint* endpoint, C& callback) { - + // If socket is open on this end but has been closed by the peer, + // we need to reconnect. + if (socket_.is_open() && !isUsable()) { + close(); + } // Ignore opens on already-open socket. Don't throw a failure because // of uncertainties as to what precedes whan when using asynchronous I/O. // At also allows us a treat a passed-in socket as a self-managed socket. diff --git a/src/lib/asiolink/tests/io_service_unittest.cc b/src/lib/asiolink/tests/io_service_unittest.cc index 70887c3d24..b1c33956be 100644 --- a/src/lib/asiolink/tests/io_service_unittest.cc +++ b/src/lib/asiolink/tests/io_service_unittest.cc @@ -4,6 +4,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +#include + #include #include diff --git a/src/lib/asiolink/tests/run_unittests.cc b/src/lib/asiolink/tests/run_unittests.cc index 7044863677..395dcd1d6e 100644 --- a/src/lib/asiolink/tests/run_unittests.cc +++ b/src/lib/asiolink/tests/run_unittests.cc @@ -4,6 +4,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. +#include + #include #include #include diff --git a/src/lib/asiolink/udp_socket.h b/src/lib/asiolink/udp_socket.h index 07ba44743e..5b040cfe1b 100644 --- a/src/lib/asiolink/udp_socket.h +++ b/src/lib/asiolink/udp_socket.h @@ -61,7 +61,11 @@ public: /// \brief Return file descriptor of underlying socket virtual int getNative() const { +#if BOOST_VERSION < 106600 return (socket_.native()); +#else + return (socket_.native_handle()); +#endif } /// \brief Return protocol of socket diff --git a/src/lib/asiolink/unix_domain_socket.cc b/src/lib/asiolink/unix_domain_socket.cc index f17ec2e8f7..d1ad9ec30c 100644 --- a/src/lib/asiolink/unix_domain_socket.cc +++ b/src/lib/asiolink/unix_domain_socket.cc @@ -287,7 +287,11 @@ UnixDomainSocket::UnixDomainSocket(IOService& io_service) int UnixDomainSocket::getNative() const { +#if BOOST_VERSION < 106600 return (impl_->socket_.native()); +#else + return (impl_->socket_.native_handle()); +#endif } int From b7ff0b949e46a9342df4e20fd67d461485c5fd3d Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 1 Apr 2018 14:44:13 +0200 Subject: [PATCH 37/52] [5374] Checkpoint: need regen --- doc/examples/kea4/advanced.json | 21 - doc/examples/kea6/advanced.json | 21 - doc/guide/classify.xml | 239 +++++--- doc/guide/dhcp4-srv.xml | 9 - doc/guide/dhcp6-srv.xml | 9 - src/bin/dhcp4/dhcp4_lexer.ll | 21 +- src/bin/dhcp4/dhcp4_parser.yy | 20 +- src/bin/dhcp4/parser_context.cc | 4 +- src/bin/dhcp4/parser_context.h | 5 +- src/bin/dhcp4/tests/config_parser_unittest.cc | 111 ---- src/bin/dhcp4/tests/dhcp4_srv_unittest.cc | 51 -- src/bin/dhcp6/dhcp6_lexer.ll | 22 +- src/bin/dhcp6/dhcp6_parser.yy | 21 +- src/bin/dhcp6/parser_context.cc | 4 +- src/bin/dhcp6/parser_context.h | 5 +- src/bin/dhcp6/tests/classify_unittests.cc | 87 --- src/bin/dhcp6/tests/config_parser_unittest.cc | 232 -------- src/lib/dhcpsrv/alloc_engine.cc | 31 +- src/lib/dhcpsrv/alloc_engine.h | 7 - src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 32 +- src/lib/dhcpsrv/parsers/dhcp_parsers.h | 4 +- src/lib/dhcpsrv/pool.cc | 35 +- src/lib/dhcpsrv/pool.h | 27 +- src/lib/dhcpsrv/subnet.cc | 24 +- src/lib/dhcpsrv/subnet.h | 23 +- .../dhcpsrv/tests/alloc_engine4_unittest.cc | 150 +---- .../dhcpsrv/tests/alloc_engine6_unittest.cc | 541 ++++-------------- src/lib/dhcpsrv/tests/alloc_engine_utils.h | 4 +- .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 4 +- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 7 +- src/lib/dhcpsrv/tests/pool_unittest.cc | 62 +- src/lib/dhcpsrv/tests/subnet_unittest.cc | 161 +----- 32 files changed, 361 insertions(+), 1633 deletions(-) diff --git a/doc/examples/kea4/advanced.json b/doc/examples/kea4/advanced.json index 34b062e269..327047bcd2 100644 --- a/doc/examples/kea4/advanced.json +++ b/doc/examples/kea4/advanced.json @@ -137,27 +137,6 @@ "relay": { "ip-address": "192.168.1.1" } - }, - { - // This subnet is divided in two pools for unknown and - // known (i.e. which have a reservation) clients. - "pools": [ - { - "pool": "192.0.8.100 - 192.0.8.200", - "known-clients": "never" - }, - { - "pool": "192.0.9.100 - 192.0.9.200", - "known-clients": "only" - } - ], - "subnet": "192.0.8.0/23", - "reservations": [ - { "hw-address": "00:00:00:11:22:33" }, - { "hw-address": "00:00:00:44:55:66" }, - { "hw-address": "00:00:00:77:88:99" }, - { "hw-address": "00:00:00:aa:bb:cc" } - ] } ] }, diff --git a/doc/examples/kea6/advanced.json b/doc/examples/kea6/advanced.json index 85fa54c7d2..a8e67ee973 100644 --- a/doc/examples/kea6/advanced.json +++ b/doc/examples/kea6/advanced.json @@ -134,27 +134,6 @@ "relay": { "ip-address": "3000::1" } - }, - { - // This subnet is divided in two pools for unknown and - // known (i.e. which have a reservation) clients. - "pools": [ - { - "pool": "2001:db8:8::/64", - "known-clients": "never" - }, - { - "pool": "2001:db8:9::/64", - "known-clients": "only" - } - ], - "subnet": "2001:db8:8::/46", - "reservations": [ - { "hw-address": "00:00:00:11:22:33" }, - { "hw-address": "00:00:00:44:55:66" }, - { "hw-address": "00:00:00:77:88:99" }, - { "hw-address": "00:00:00:aa:bb:cc" } - ] } ] }, diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 29765165f1..1721853f0d 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -29,21 +29,58 @@ - It is envisaged that client classification will be used for changing the - behavior of almost any part of the DHCP message processing, including the assignment of - leases from different pools, the assignment of different options (or different values of - the same options) etc. In the current release of the software however, there are - only four mechanisms that take - advantage of client classification: subnet selection, definition of DHCPv4 private (codes 224-254) and code 43 options, assignment of different - options and, for DHCPv4 cable modems, the setting of specific options for use with - the TFTP server address and the boot file field. + At the opposite some clients can be grouped into a client class for + instance to get a common option. - The process of doing classification is conducted in six steps: + An incoming packet can be associated with a client class in + serveral ways: + + + Implicitely using a vendor class option or another builtin condition. + + + Using an expression which evaluates to true. + + + Using static host reservations, a shared network, a subnet, etc. + + + Using a hook. + + + + + + It is envisaged that client classification will be used for + changing the behavior of almost any part of the DHCP message + processing, including the assignment of leases from different + pools, the assignment of different options (or different values + of the same options) etc. In the current release of the software + however, there are only five mechanisms that take advantage of + client classification: subnet selection, pool selection, + definition of DHCPv4 private (codes 224-254) and code 43 + options, assignment of different options and, for DHCPv4 cable + modems, the setting of specific options for use with the TFTP + server address and the boot file field. + + + + The process of doing classification is conducted in several steps: - Assess an incoming packet and assign it to zero or more classes. + The ALL class is associated with the incoming packet. + + + Vendor class options are processed. + + + Classes with matching expressions and not marked for later + evaluation are processed in the order they are defined in the + configuration: the boolean expression is evaluated and when it + returns true ("match") the incoming packet is associated to the + class. If a private or code 43 DHCPv4 option is received, decoding it @@ -51,17 +88,41 @@ resort) definition. - Choose a subnet, possibly based on the class information. + Choose a subnet, possibly based on the class information when + some subnets are guarded. More exactly: When choosing a subnet, + the server will iterate over all of the subnets that are + feasible given the information found in the packet (client + address, relay address etc). It will use the first subnet it + finds that either doesn't have a class associated with it or + that has a class which matches one of the packet's classes. - Assign classes from host reservations + Host reservations are looked for. If an identifier from the incoming + packet matches a host reservation in the subnet or shared network, + the packet is associated with the KNOWN builtin class and all classes + of the host reservation. - Perform a second pass by evaluating match expressions of on-demand - classes. + Classes with matching expressions using directly or indirectly on + the KNOWN builtin class and not marked for only when required + evaluation are processed in the order they are defined in the + configuration: the boolean expression is evaluated and when it + returns true ("match") the incoming packet is associated to the + class. - Assign options, again possibly based on the class information. + If needed resources from pools are assigned, possibly based on the + class information when some pools are reserved to class members. + + + Process required evaluation in the order classes are required + which uses the reverse precedence of option data: first shared + network, after the subnet and to finish pools assigned resources + belongs too. + + + Assign options, again possibly based on the class information + in order classes were associated with the incoming packet. For DHCPv4 private and code 43 options this includes class local option definitions. @@ -76,36 +137,25 @@ - When determining which options to include in the response the server will examine - the union of options from all of the assigned classes. In the case two or more - classes include the same option, the value from the first class examined will - be used. When choosing a subnet, the server will iterate over all of the - subnets that are feasible given the information found in the packet (client address, - relay address etc). It will use the first subnet it finds that either doesn't - have a class associated with it or that has a class which matches one of - the packet's classes. In the future the processing order of the - various classes may be specified but for now it is being left unspecified and - may change in future releases. + When determining which options to include in the response the + server will examine the union of options from all of the + assigned classes. In the case two or more classes include the + same option, the value from the first class examined will be + used, and classes are examined in the order they were associated + so ALL is always the first class and matching required classes + are last. - As an example, imagine that an incoming packet matches two classes. - Class "foo" defines values for an NTP server - (option 42 in DHCPv4) and an SMTP server (option 69 in DHCPv4) while class - "bar" defines values for an NTP server and a POP3 server (option 70 in DHCPv4). - The server will examine the three options NTP, SMTP and POP3 and return any - of them that the client requested. As the NTP server was defined twice the - server will choose only one of the values for the reply: the class from which the - value is obtained is unspecified. - - - - There are two methods of doing classification. The first is automatic and relies - on examining the values in the vendor class options. Information from these - options is extracted and a class name is constructed from it and added to - the class list for the packet. The second allows you to specify an expression - that is evaluated for each packet. If the result is true, the packet is - a member of the class. + As an example, imagine that an incoming packet matches two + classes. Class "foo" defines values for an NTP server (option + 42 in DHCPv4) and an SMTP server (option 69 in DHCPv4) while + class "bar" defines values for an NTP server and a POP3 server + (option 70 in DHCPv4). The server will examine the three + options NTP, SMTP and POP3 and return any of them that the + client requested. As the NTP server was defined twice the + server will choose only one of the values for the reply: the + class from which the value is obtained is unspecified. @@ -116,52 +166,48 @@
-
- Using Static Host Reservations In Classification - Classes can be statically assigned to the clients using techniques described - in and - . - -
-
- Using Vendor Class Information In Classification + Builtin Client Classes - The server checks whether an incoming DHCPv4 packet includes - the vendor class identifier option (60) or an incoming DHCPv6 packet - includes the vendor class option (16). If it does, the content of that - option is prepended with "VENDOR_CLASS_" and the result is interpreted - as a class. For example, modern cable modems will send this option with - value "docsis3.0" and so the packet will belong to - class "VENDOR_CLASS_docsis3.0". + Some classes are builtin so do not need to be defined. The main + example uses Vendor Class information: The server checks whether + an incoming DHCPv4 packet includes the vendor class identifier + option (60) or an incoming DHCPv6 packet includes the vendor + class option (16). If it does, the content of that option is + prepended with "VENDOR_CLASS_" and the result is + interpreted as a class. For example, modern cable modems will + send this option with value "docsis3.0" and so the + packet will belong to class "VENDOR_CLASS_docsis3.0". + + + Other examples are the ALL class what all incoming packets + belongs to, and the KNOWN class. By convention builtin classes + names begin with all caps.
Using Expressions In Classification - The expression portion of classification contains operators and values. - All values are currently strings and operators take a string or strings and - return another string. When all the operations have completed - the result should be a value of "true" or "false". - The packet belongs to - the class (and the class name is added to the list of classes) if the result - is "true". Expressions are written in standard format and can be nested. + The expression portion of classification contains operators and + values. All values are currently strings and operators take a + string or strings and return another string. When all the + operations have completed the result should be a value of + "true" or "false". The packet belongs to + the class (and the class name is added to the list of classes) + if the result is "true". Expressions are written in + standard format and can be nested. - When the eval-on-demand flag is set to true in a class definition, - the match expression is skipped during the first evaluation pass. - - - - Expressions are pre-processed during the parsing of the configuration file - and converted to an internal representation. This allows certain types of - errors to be caught and logged during parsing. Examples of these errors - include an incorrect number or types of arguments to an operator. The - evaluation code will also check for this class of error and generally - throw an exception, though this should not occur in a normally functioning - system. + Expressions are pre-processed during the parsing of the + configuration file and converted to an internal + representation. This allows certain types of errors to be caught + and logged during parsing. Examples of these errors include an + incorrect number or types of arguments to an operator. The + evaluation code will also check for this class of error and + generally throw an exception, though this should not occur in a + normally functioning system. @@ -177,6 +223,14 @@ remain the same. + + Dependencies between classes are checked too: for instance forward + dependencies are rejected when the configuration is parsed: + an expression can only depends on already defined classes (including + builtin classes) and which are evaluated in a previous or the + same evaluation phase. This does not apply to the KNOWN class. + + List of Classification Values @@ -249,6 +303,20 @@ If the packet belongs to the given client class "true" else "false" + + Known client + known + member('KNOWN') + If there is a host reservation for the client + "true" else "false" + + + Unknown client + unknown + not member('KNOWN') + If there is a hostreservation for the client + "false" else "true" + DHCPv4 relay agent sub-option relay4[123].hex @@ -504,7 +572,14 @@ parser checks if client classes were already defined or are built-in, i.e., beginning by "VENDOR_CLASS_", "AFTER__" (for the to come "after" hook) and - "EXTERNAL_". + "EXTERNAL_" or equal to "ALL", "KNOWN", + etc. + + "known" and "unknown" are short hands for "member('KNOWN')" and + "not member('KNOWN')". Note the evaluation of any expression using + directly or indirectly the "KNOWN" class is deferred + after the host reservation lookup (i.e. when the "KNOWN" + belonging is determined). @@ -785,6 +860,14 @@ concatenation of the strings +
+ Using Static Host Reservations In Classification + Classes can be statically assigned to the clients using techniques described + in and + . + +
+
Configuring Subnets With Class Information diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 6a55a91563..f37f3a69f0 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2090,15 +2090,6 @@ It is merely echoed by the server at the pool level, see . - - In a similar way a pool can be constrained to serve only known clients, - i.e. clients which have a reservation, using - "known-clients": "only", or only unknown clients - with "known-clients": "never". One can assign - addresses to registered clients without giving a different address per - reservations, for instance when there is not enough available addresses. - - The process of doing classification is conducted in five steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index d14b177db2..a9b44ff2f2 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1950,15 +1950,6 @@ should include options from the isc option space: linkend="classification-pools"/>. - - In a similar way a pool can be constrained to serve only known clients, - i.e. clients which have a reservation, using - "known-clients": "only", or only unknown clients - with "known-clients": "never". One can assign - prefixes to registered clients without giving a different prefix per - reservations, forinstance when there is not enough available prefixes. - - The process of doing classification is conducted in five steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 23ae511629..05405a39ff 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -584,27 +584,8 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"known-clients\" { - switch(driver.ctx_) { - case isc::dhcp::Parser4Context::POOLS: - return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); - default: - return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); - } -} - -\"only\" { - switch(driver.ctx_) { - case isc::dhcp::Parser4Context::KNOWN_CLIENTS: - return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); - default: - return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); - } -} - \"never\" { switch(driver.ctx_) { - case isc::dhcp::Parser4Context::KNOWN_CLIENTS: case isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME: return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); default: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 066bfc1498..81673e4d09 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -109,9 +109,6 @@ using namespace std; POOLS "pools" POOL "pool" USER_CONTEXT "user-context" - KNOWN_CLIENTS "known-clients" - ONLY "only" - NEVER "never" SUBNET "subnet" INTERFACE "interface" @@ -178,6 +175,7 @@ using namespace std; TCP "tcp" JSON "JSON" WHEN_PRESENT "when-present" + NEVER "never" ALWAYS "always" WHEN_NOT_PRESENT "when-not-present" @@ -222,7 +220,6 @@ using namespace std; %type outbound_interface_value %type db_type %type hr_mode -%type known_clients_value %type ncr_protocol_value %type replace_client_name_value @@ -1349,7 +1346,6 @@ pool_param: pool_entry | client_class | eval_client_classes | user_context - | known_clients | unknown_map_entry ; @@ -1368,18 +1364,6 @@ user_context: USER_CONTEXT { ctx.leave(); }; -known_clients: KNOWN_CLIENTS { - ctx.enter(ctx.KNOWN_CLIENTS); -} COLON known_clients_value { - ctx.stack_.back()->set("known-clients", $4); - ctx.leave(); -} - -known_clients_value: - ONLY { $$ = ElementPtr(new StringElement("only", ctx.loc2pos(@1))); } - | NEVER { $$ = ElementPtr(new StringElement("never", ctx.loc2pos(@1))); } -; - // --- end of pools definition ------------------------------- // --- reservations ------------------------------------------ diff --git a/src/bin/dhcp4/parser_context.cc b/src/bin/dhcp4/parser_context.cc index dca316b398..d160a2f6c7 100644 --- a/src/bin/dhcp4/parser_context.cc +++ b/src/bin/dhcp4/parser_context.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -174,8 +174,6 @@ Parser4Context::contextName() return ("control-socket"); case POOLS: return ("pools"); - case KNOWN_CLIENTS: - return ("known-clients"); case RESERVATIONS: return ("reservations"); case RELAY: diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index 4b112c651f..326fde6b37 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -264,9 +264,6 @@ public: /// Used while parsing Dhcp4/subnet4/pools structures. POOLS, - /// Used while parsing Dhcp4/subnet4/pools/known_client structures. - KNOWN_CLIENTS, - /// Used while parsing Dhcp4/reservations structures. RESERVATIONS, diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index c53fbb3cd2..71bb4c1b3b 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -4098,117 +4098,6 @@ TEST_F(Dhcp4ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } -// Goal of this test is to verify that multiple pools can be configured -// with defined client classes. -TEST_F(Dhcp4ParserTest, classifyPools) { - ConstElementPtr x; - string config = "{ " + genIfaceConfig() + "," + - "\"rebind-timer\": 2000, " - "\"renew-timer\": 1000, " - "\"subnet4\": [ { " - " \"pools\": [ { " - " \"pool\": \"192.0.2.1 - 192.0.2.100\", " - " \"client-class\": \"alpha\" " - " }," - " {" - " \"pool\": \"192.0.3.101 - 192.0.3.150\", " - " \"client-class\": \"beta\", " - " \"known-clients\": \"never\" " - " }," - " {" - " \"pool\": \"192.0.4.101 - 192.0.4.150\", " - " \"client-class\": \"gamma\", " - " \"known-clients\": \"only\" " - " }," - " {" - " \"pool\": \"192.0.5.101 - 192.0.5.150\" " - " } ]," - " \"subnet\": \"192.0.0.0/16\" " - " } ]," - "\"valid-lifetime\": 4000 }"; - - ConstElementPtr json; - ASSERT_NO_THROW(json = parseDHCP4(config, true)); - extractConfig(config); - - EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json)); - checkResult(x, 0); - - const Subnet4Collection* subnets = - CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->getAll(); - ASSERT_TRUE(subnets); - ASSERT_EQ(1, subnets->size()); - const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_V4); - ASSERT_EQ(4, pools.size()); // We expect 4 pools - - // Let's check if client belonging to alpha class is supported in pool[0] - // and not supported in any other pool (except pool[3], which allows - // everyone). - ClientClasses classes; - classes.insert("alpha"); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to beta class is supported in pool[1] - // and not supported in any other pool (except pools[3], which allows - // everyone). - classes.clear(); - classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to gamma class is supported in pool[2] - // and not supported in any other pool (except pool[3], which allows - // everyone). - classes.clear(); - classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to some other class (not mentioned in - // the config) is supported only in pool[3], which allows everyone. - classes.clear(); - classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Finally, let's check class-less client. He should be allowed only in - // the last pool, which does not have any class restrictions. - classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); -} - // This test verifies that the host reservations can be specified for // respective IPv4 subnets. TEST_F(Dhcp4ParserTest, reservations) { diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index d2cd09f099..f650d33867 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -2387,57 +2387,6 @@ TEST_F(Dhcpv4SrvTest, clientPoolClassify) { EXPECT_FALSE(offer->getYiaddr().isV4Zero()); } -// Checks if the known-clients field is indeed used for pool selection. -TEST_F(Dhcpv4SrvTest, clientPoolKnown) { - IfaceMgrTestConfig test_config(true); - IfaceMgr::instance().openSockets4(); - - NakedDhcpv4Srv srv(0); - - // This test configures 2 pools. - string config = "{ \"interfaces-config\": {" - " \"interfaces\": [ \"*\" ]" - "}," - "\"rebind-timer\": 2000, " - "\"renew-timer\": 1000, " - "\"subnet4\": [ " - "{ \"pools\": [ { " - " \"pool\": \"192.0.2.1 - 192.0.2.100\", " - " \"known-clients\": \"only\" }, " - " { \"pool\": \"192.0.3.1 - 192.0.3.100\", " - " \"known-clients\": \"never\" } ], " - " \"subnet\": \"192.0.0.0/16\" } " - "]," - "\"valid-lifetime\": 4000 }"; - - ConstElementPtr json; - ASSERT_NO_THROW(json = parseDHCP4(config, true)); - - ConstElementPtr status; - EXPECT_NO_THROW(status = configureDhcp4Server(srv, json)); - - CfgMgr::instance().commit(); - - // check if returned status is OK - ASSERT_TRUE(status); - comment_ = config::parseAnswer(rcode_, status); - ASSERT_EQ(0, rcode_); - - // Create a simple packet - Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234)); - dis->setRemoteAddr(IOAddress("192.0.2.1")); - dis->setCiaddr(IOAddress("192.0.2.1")); - dis->setIface("eth0"); - OptionPtr clientid = generateClientId(); - dis->addOption(clientid); - - // First pool requires reservation so the second will be used - Pkt4Ptr offer = srv.processDiscover(dis); - ASSERT_TRUE(offer); - EXPECT_EQ(DHCPOFFER, offer->getType()); - EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText()); -} - // Verifies last resort option 43 is backward compatible TEST_F(Dhcpv4SrvTest, option43LastResort) { IfaceMgrTestConfig test_config(true); diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 8a94ce791d..a8ab21ed1f 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -363,7 +363,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"never\" { switch(driver.ctx_) { - case isc::dhcp::Parser6Context::KNOWN_CLIENTS: case isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME: return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); default: @@ -825,25 +824,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"known-clients\" { - switch(driver.ctx_) { - case isc::dhcp::Parser6Context::POOLS: - case isc::dhcp::Parser6Context::PD_POOLS: - return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); - default: - return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); - } -} - -\"only\" { - switch(driver.ctx_) { - case isc::dhcp::Parser6Context::KNOWN_CLIENTS: - return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); - default: - return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); - } -} - \"subnet\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 7e6eed01ff..0720846ceb 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -99,9 +99,6 @@ using namespace std; EXCLUDED_PREFIX_LEN "excluded-prefix-len" DELEGATED_LEN "delegated-len" USER_CONTEXT "user-context" - KNOWN_CLIENTS "known-clients" - ONLY "only" - NEVER "never" SUBNET "subnet" INTERFACE "interface" @@ -181,6 +178,7 @@ using namespace std; TCP "TCP" JSON "JSON" WHEN_PRESENT "when-present" + NEVER "never" ALWAYS "always" WHEN_NOT_PRESENT "when-not-present" @@ -224,7 +222,6 @@ using namespace std; %type map_value %type db_type %type hr_mode -%type known_clients_value %type duid_type %type ncr_protocol_value %type replace_client_name_value @@ -1312,7 +1309,6 @@ pool_param: pool_entry | client_class | eval_client_classes | user_context - | known_clients | unknown_map_entry ; @@ -1331,18 +1327,6 @@ user_context: USER_CONTEXT { ctx.leave(); }; -known_clients: KNOWN_CLIENTS { - ctx.enter(ctx.KNOWN_CLIENTS); -} COLON known_clients_value { - ctx.stack_.back()->set("known-clients", $4); - ctx.leave(); -} - -known_clients_value: - ONLY { $$ = ElementPtr(new StringElement("only", ctx.loc2pos(@1))); } - | NEVER { $$ = ElementPtr(new StringElement("never", ctx.loc2pos(@1))); } -; - // --- end of pools definition ------------------------------- // --- pd-pools ---------------------------------------------- @@ -1403,7 +1387,6 @@ pd_pool_param: pd_prefix | excluded_prefix | excluded_prefix_len | user_context - | known_clients | unknown_map_entry ; diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index 5bd52e4b10..0ed107886f 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -176,8 +176,6 @@ Parser6Context::contextName() return ("pools"); case PD_POOLS: return ("pd-pools"); - case KNOWN_CLIENTS: - return ("known-clients"); case RESERVATIONS: return ("reservations"); case RELAY: diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index e6a1388318..6de4a3a7da 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -270,9 +270,6 @@ public: /// Used while parsing Dhcp6/subnet6/pd-pools structures. PD_POOLS, - /// Used while parsing Dhcp4/subnet6/pools/known_client structures. - KNOWN_CLIENTS, - /// Used while parsing Dhcp6/reservations structures. RESERVATIONS, diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index a2b16ee50d..8fc19dcce0 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -918,93 +918,6 @@ TEST_F(ClassifyTest, clientClassifyPool) { EXPECT_TRUE(ia_na3->getOption(D6O_IAADDR)); } -// Checks if the known-clients field is indeed used for pool selection. -TEST_F(ClassifyTest, clientKnownPool) { - IfaceMgrTestConfig test_config(true); - - NakedDhcpv6Srv srv(0); - - // This test configures 2 pools. - std::string config = "{ \"interfaces-config\": {" - " \"interfaces\": [ \"*\" ]" - "}," - "\"preferred-lifetime\": 3000," - "\"rebind-timer\": 2000, " - "\"renew-timer\": 1000, " - "\"client-classes\": [ " - " { " - " \"name\": \"foo\" " - " }, " - " { " - " \"name\": \"bar\" " - " } " - "], " - "\"subnet6\": [ " - " { \"pools\": [ " - " { " - " \"pool\": \"2001:db8:1::/64\", " - " \"known-clients\": \"only\" " - " }, " - " { " - " \"pool\": \"2001:db8:2::/64\", " - " \"known-clients\": \"never\" " - " } " - " ], " - " \"subnet\": \"2001:db8:2::/40\", " - " \"reservations\": [ " - " { \"duid\": \"01:02:03:04\", \"hostname\": \"foo\" } ] " - " } " - "], " - "\"valid-lifetime\": 4000 }"; - - ASSERT_NO_THROW(configure(config)); - - OptionPtr clientid1 = generateClientId(); - Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - query1->setRemoteAddr(IOAddress("2001:db8:1::3")); - query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query1->addOption(clientid1); - query1->setIface("eth1"); - - // First pool requires reservation so the second will be used - srv.classifyPacket(query1); - Pkt6Ptr response1 = srv.processSolicit(query1); - ASSERT_TRUE(response1); - OptionPtr ia_na1 = response1->getOption(D6O_IA_NA); - ASSERT_TRUE(ia_na1); - EXPECT_FALSE(ia_na1->getOption(D6O_STATUS_CODE)); - OptionPtr iaaddr1 = ia_na1->getOption(D6O_IAADDR); - ASSERT_TRUE(iaaddr1); - boost::shared_ptr addr1 = - boost::dynamic_pointer_cast(iaaddr1); - ASSERT_TRUE(addr1); - EXPECT_EQ("2001:db8:2::", addr1->getAddress().toText()); - - // Try with DUID 01:02:03:04 - uint8_t duid[] = { 0x01, 0x02, 0x03, 0x04 }; - OptionBuffer buf(duid, duid + sizeof(duid)); - OptionPtr clientid2(new Option(Option::V6, D6O_CLIENTID, buf)); - Pkt6Ptr query2 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 2345)); - query2->setRemoteAddr(IOAddress("2001:db8:1::3")); - query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query2->addOption(clientid2); - query2->setIface("eth1"); - - // Now the first pool will be used - srv.classifyPacket(query2); - Pkt6Ptr response2 = srv.processSolicit(query2); - ASSERT_TRUE(response2); - OptionPtr ia_na2 = response2->getOption(D6O_IA_NA); - ASSERT_TRUE(ia_na2); - EXPECT_FALSE(ia_na2->getOption(D6O_STATUS_CODE)); - OptionPtr iaaddr2 = ia_na2->getOption(D6O_IAADDR); - ASSERT_TRUE(iaaddr2); - boost::shared_ptr addr2 = - boost::dynamic_pointer_cast(iaaddr2); - ASSERT_TRUE(addr2); - EXPECT_EQ("2001:db8:1::", addr2->getAddress().toText()); -} - // Tests whether a packet with custom vendor-class (not erouter or docsis) // is classified properly. TEST_F(ClassifyTest, vendorClientClassification2) { diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 61c0342002..2d3e3c484c 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -4134,238 +4134,6 @@ TEST_F(Dhcp6ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } -// Goal of this test is to verify that multiple pools can be configured -// with defined client classes. -TEST_F(Dhcp6ParserTest, classifyPools) { - ConstElementPtr x; - string config = "{ " + genIfaceConfig() + "," - "\"preferred-lifetime\": 3000," - "\"rebind-timer\": 2000, " - "\"renew-timer\": 1000, " - "\"subnet6\": [ { " - " \"pools\": [ { " - " \"pool\": \"2001:db8:1::/80\", " - " \"client-class\": \"alpha\" " - " }," - " {" - " \"pool\": \"2001:db8:2::/80\", " - " \"client-class\": \"beta\", " - " \"known-clients\": \"never\" " - " }," - " {" - " \"pool\": \"2001:db8:3::/80\", " - " \"client-class\": \"gamma\", " - " \"known-clients\": \"only\" " - " }," - " {" - " \"pool\": \"2001:db8:4::/80\" " - " } ]," - " \"subnet\": \"2001:db8:0::/40\" " - " } ]," - "\"valid-lifetime\": 4000 }"; - - ConstElementPtr json; - ASSERT_NO_THROW(json = parseDHCP6(config, true)); - extractConfig(config); - - EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); - checkResult(x, 0); - - const Subnet6Collection* subnets = - CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); - ASSERT_TRUE(subnets); - ASSERT_EQ(1, subnets->size()); - const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_NA); - ASSERT_EQ(4, pools.size()); // We expect 4 pools - - // Let's check if client belonging to alpha class is supported in pool[0] - // and not supported in any other pool (except pool[3], which allows - // everyone). - ClientClasses classes; - classes.insert("alpha"); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to beta class is supported in pool[1] - // and not supported in any other pool (except pool[3], which allows - // everyone). - classes.clear(); - classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to gamma class is supported in pool[2] - // and not supported in any other pool (except pool[3], which allows - // everyone). - classes.clear(); - classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to some other class (not mentioned in - // the config) is supported only in pool[3], which allows everyone. - classes.clear(); - classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Finally, let's check class-less client. He should be allowed only in - // the last pool, which does not have any class restrictions. - classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); -} - -// Goal of this test is to verify that multiple pdpools can be configured -// with defined client classes. -TEST_F(Dhcp6ParserTest, classifyPdPools) { - ConstElementPtr x; - string config = "{ " + genIfaceConfig() + "," - "\"preferred-lifetime\": 3000," - "\"rebind-timer\": 2000, " - "\"renew-timer\": 1000, " - "\"subnet6\": [ { " - " \"pd-pools\": [ { " - " \"prefix-len\": 48, " - " \"delegated-len\": 64, " - " \"prefix\": \"2001:db8:1::\", " - " \"client-class\": \"alpha\" " - " }," - " {" - " \"prefix-len\": 48, " - " \"delegated-len\": 64, " - " \"prefix\": \"2001:db8:2::\", " - " \"client-class\": \"beta\", " - " \"known-clients\": \"never\" " - " }," - " {" - " \"prefix-len\": 48, " - " \"delegated-len\": 64, " - " \"prefix\": \"2001:db8:3::\", " - " \"client-class\": \"gamma\", " - " \"known-clients\": \"only\" " - " }," - " {" - " \"prefix-len\": 48, " - " \"delegated-len\": 64, " - " \"prefix\": \"2001:db8:4::\" " - " } ]," - " \"subnet\": \"2001:db8::/64\" " - " } ]," - "\"valid-lifetime\": 4000 }"; - - ConstElementPtr json; - ASSERT_NO_THROW(json = parseDHCP6(config, true)); - extractConfig(config); - - EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); - checkResult(x, 0); - - const Subnet6Collection* subnets = - CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); - ASSERT_TRUE(subnets); - ASSERT_EQ(1, subnets->size()); - const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_PD); - ASSERT_EQ(4, pools.size()); // We expect 4 pools - - // Let's check if client belonging to alpha class is supported in pool[0] - // and not supported in any other pool (except pool[3], which allows - // everyone). - ClientClasses classes; - classes.insert("alpha"); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to beta class is supported in pool[1] - // and not supported in any other pool (except pool[3], which allows - // everyone). - classes.clear(); - classes.insert("beta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to gamma class is supported in pool[2] - // and not supported in any other pool (except pool[3], which allows - // everyone). - classes.clear(); - classes.insert("gamma"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Let's check if client belonging to some other class (not mentioned in - // the config) is supported only in pool[3], which allows everyone. - classes.clear(); - classes.insert("delta"); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); - - // Finally, let's check class-less client. He should be allowed only in - // the last pool, which does not have any class restrictions. - classes.clear(); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(0)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(1)->clientSupported(classes, true)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, false)); - EXPECT_FALSE(pools.at(2)->clientSupported(classes, true)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, false)); - EXPECT_TRUE(pools.at(3)->clientSupported(classes, true)); -} - // This test checks the ability of the server to parse a configuration // containing a full, valid dhcp-ddns (D2ClientConfig) entry. TEST_F(Dhcp6ParserTest, d2ClientConfig) { diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index 7e8015fc1c..effbe40efe 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -158,7 +158,6 @@ AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress& isc::asiolink::IOAddress AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, - bool known_client, const DuidPtr&, const IOAddress&) { @@ -184,7 +183,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, PoolCollection::const_iterator first = pools.end(); PoolPtr first_pool; for (it = pools.begin(); it != pools.end(); ++it) { - if (!(*it)->clientSupported(client_classes, known_client)) { + if (!(*it)->clientSupported(client_classes)) { continue; } if (first == pools.end()) { @@ -213,7 +212,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // Trying next pool if (retrying) { for (; it != pools.end(); ++it) { - if ((*it)->clientSupported(client_classes, known_client)) { + if ((*it)->clientSupported(client_classes)) { break; } } @@ -272,7 +271,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // Let's rewind to the beginning. for (it = first; it != pools.end(); ++it) { - if ((*it)->clientSupported(client_classes, known_client)) { + if ((*it)->clientSupported(client_classes)) { (*it)->setLastAllocated((*it)->getFirstAddress()); (*it)->resetLastAllocated(); } @@ -294,7 +293,6 @@ AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::HashedAllocator::pickAddress(const SubnetPtr&, const ClientClasses&, - bool known_client, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Hashed allocator is not implemented"); @@ -309,7 +307,6 @@ AllocEngine::RandomAllocator::RandomAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::RandomAllocator::pickAddress(const SubnetPtr&, const ClientClasses&, - bool known_client, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Random allocator is not implemented"); @@ -450,8 +447,7 @@ inAllowedPool(AllocEngine::ClientContext6& ctx, const Lease::Type& lease_type, } } else { if (current_subnet->inPool(lease_type, address, - ctx.query_->getClasses(), - !ctx.hosts_.empty())) { + ctx.query_->getClasses())) { return (true); } } @@ -757,11 +753,10 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // This is equivalent of subnet->inPool(hint), but returns the pool pool = boost::dynamic_pointer_cast (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), - !ctx.hosts_.empty(), hint)); + hint)); // check if the pool is allowed - if (pool && !pool->clientSupported(ctx.query_->getClasses(), - !ctx.hosts_.empty())) { + if (pool && !pool->clientSupported(ctx.query_->getClasses())) { pool.reset(); } @@ -863,8 +858,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // - we exhaust number of tries uint64_t possible_attempts = subnet->getPoolCapacity(ctx.currentIA().type_, - ctx.query_->getClasses(), - !ctx.hosts_.empty()); + ctx.query_->getClasses()); // Try next subnet if there is no chance to get something if (possible_attempts == 0) { subnet = subnet->getNextSubnet(original_subnet); @@ -878,7 +872,6 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { IOAddress candidate = allocator->pickAddress(subnet, ctx.query_->getClasses(), - !ctx.hosts_.empty(), ctx.duid_, hint); @@ -899,7 +892,6 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { pool = boost::dynamic_pointer_cast( subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), - !ctx.hosts_.empty(), candidate)); if (pool) { prefix_len = pool->getLength(); @@ -2637,8 +2629,7 @@ inAllowedPool(AllocEngine::ClientContext4& ctx, const IOAddress& address) { while (current_subnet) { if (current_subnet->inPool(Lease::TYPE_V4, address, - ctx.query_->getClasses(), - !ctx.hosts_.empty())) { + ctx.query_->getClasses())) { // We found a subnet that this address belongs to, so it // seems that this subnet is the good candidate for allocation. // Let's update the selected subnet. @@ -3366,8 +3357,7 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { uint64_t possible_attempts = subnet->getPoolCapacity(Lease::TYPE_V4, - ctx.query_->getClasses(), - !ctx.hosts_.empty()); + ctx.query_->getClasses()); uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); // Skip trying if there is no chance to get something if (possible_attempts == 0) { @@ -3377,7 +3367,6 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { for (uint64_t i = 0; i < max_attempts; ++i) { IOAddress candidate = allocator->pickAddress(subnet, ctx.query_->getClasses(), - !ctx.hosts_.empty(), client_id, ctx.requested_address_); // If address is not reserved for another client, try to allocate it. diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index 251db83e3b..c771469447 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -83,7 +83,6 @@ protected: /// /// @param subnet next address will be returned from pool of that subnet /// @param client_classes list of classes client belongs to - /// @param known_client client has a reservation /// @param duid Client's DUID /// @param hint client's hint /// @@ -91,7 +90,6 @@ protected: virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, - bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint) = 0; @@ -134,14 +132,12 @@ protected: /// /// @param subnet next address will be returned from pool of that subnet /// @param client_classes list of classes client belongs to - /// @param known_client client has a reservation /// @param duid Client's DUID (ignored) /// @param hint client's hint (ignored) /// @return the next address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, - bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); protected: @@ -191,14 +187,12 @@ protected: /// /// @param subnet an address will be picked from pool of that subnet /// @param client_classes list of classes client belongs to - /// @param known_client client has a reservation /// @param duid Client's DUID /// @param hint a hint (last address that was picked) /// @return selected address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, - bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; @@ -224,7 +218,6 @@ protected: virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, const ClientClasses& client_classes, - bool known_client, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 3c549c520e..4c41cbf848 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -402,19 +402,6 @@ PoolParser::parse(PoolStoragePtr pools, pool->deferClientClass((*cclass)->stringValue()); } } - - // Known-clients. - ConstElementPtr known_clients = pool_structure->get("known-clients"); - if (known_clients) { - string kc = known_clients->stringValue(); - if (kc == "only") { - pool->setKnownClients(Pool::SERVE_KNOWN); - } else if (kc == "never") { - pool->setKnownClients(Pool::SERVE_UNKNOWN); - } else - isc_throw(DhcpConfigError, "invalid known-clients value: " << kc - << " (" << known_clients->getPosition() << ")"); - } } //****************************** Pool4Parser ************************* @@ -904,11 +891,6 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { client_class_ = client_class; } - ConstElementPtr known_clients = pd_pool_->get("known-clients"); - if (known_clients) { - known_clients_ = known_clients; - } - ConstElementPtr class_list = pd_pool_->get("eval-client-classes"); // Check the pool parameters. It will throw an exception if any @@ -941,18 +923,6 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { } } - if (known_clients_) { - string kc = known_clients_->stringValue(); - if (kc == "only") { - pool_->setKnownClients(Pool::SERVE_KNOWN); - } else if (kc == "never") { - pool_->setKnownClients(Pool::SERVE_UNKNOWN); - } else - isc_throw(isc::dhcp::DhcpConfigError, - "invalid known-clients value: " << kc - << " (" << known_clients_->getPosition() << ")"); - } - if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.h b/src/lib/dhcpsrv/parsers/dhcp_parsers.h index adabdb7732..f6a4cf7dc8 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.h +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.h @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -654,8 +654,6 @@ private: isc::data::ConstElementPtr user_context_; isc::data::ConstElementPtr client_class_; - - isc::data::ConstElementPtr known_clients_; }; /// @brief Parser for a list of prefix delegation pools. diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index b632949d7d..edc5db276a 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -19,7 +19,6 @@ Pool::Pool(Lease::Type type, const isc::asiolink::IOAddress& first, const isc::asiolink::IOAddress& last) :id_(getNextID()), first_(first), last_(last), type_(type), capacity_(0), cfg_option_(new CfgOption()), client_class_(""), - known_clients_(SERVE_BOTH), last_allocated_(first), last_allocated_valid_(false) { } @@ -27,32 +26,15 @@ bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { return (first_.smallerEqual(addr) && addr.smallerEqual(last_)); } -bool Pool::clientSupported(const ClientClasses& classes, - bool known_client) const { - bool match = false; +bool Pool::clientSupported(const ClientClasses& classes) const { if (client_class_.empty()) { // There is no class defined for this pool, so we do // support everyone. - match = true; - } else if (classes.contains(client_class_)) { - match = true; - } - - if (!match) { - return (false); - } - - switch (known_clients_) { - case SERVE_BOTH: return (true); - case SERVE_KNOWN: - return (known_client); - case SERVE_UNKNOWN: - return (!known_client); - default: - // Saninity check for an impossible condition - isc_throw(BadValue, "Invalid value of known clients"); + } else if (classes.contains(client_class_)) { + return (true); } + return (false); } void Pool::allowClientClass(const ClientClass& class_name) { @@ -130,13 +112,6 @@ Pool::toElement() const { map->set("client-class", Element::create(cclass)); } - // Set known-clients - KnownClients kc = getKnownClients(); - if (kc != SERVE_BOTH) { - map->set("known-clients", - Element::create(kc == SERVE_KNOWN ? "only" : "never")); - } - // Set eval-client-classes const ClientClasses& classes = getOnDemandClasses(); if (!classes.empty()) { diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index 8ed4cbad82..a1ae604a8d 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -28,13 +28,6 @@ namespace dhcp { class Pool { public: - /// @brief Value of known clients - typedef enum { - SERVE_BOTH = 0, ///< the pool serves both known and unknown clients - SERVE_KNOWN = 1, ///< the pool serves only known clients - SERVE_UNKNOWN = 2 ///< the pool never serves known clients - } KnownClients; - /// @note: /// PoolType enum was removed. Please use Lease::Type instead @@ -118,11 +111,8 @@ public: /// specified classes. /// /// @param client_classes list of all classes the client belongs to - /// @param known_client true if the client is known, i.e. has a - /// reservation /// @return true if client can be supported, false otherwise - bool clientSupported(const ClientClasses& client_classes, - bool known_client) const; + bool clientSupported(const ClientClasses& client_classes) const; /// @brief Sets the supported class to class class_name /// @@ -139,16 +129,6 @@ public: return (client_class_); } - /// @brief Returns the value of known clients - KnownClients getKnownClients() const { - return (known_clients_); - } - - /// @brief Sets the value of known clients - void setKnownClients(KnownClients known_clients) { - known_clients_ = known_clients; - } - /// @brief Adds class class_name to classes to be evaluated later /// /// @param class_name client class to be evaluated later @@ -252,9 +232,6 @@ protected: /// @ref Network::client_class_ ClientClass client_class_; - /// @brief Value of known clients - KnownClients known_clients_; - /// @brief On demand classes /// /// @ref isc::dhcp::Network::on_demand_classes diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 841592f789..172cb60feb 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -136,16 +136,15 @@ Subnet::getPoolCapacity(Lease::Type type) const { uint64_t Subnet::getPoolCapacity(Lease::Type type, - const ClientClasses& client_classes, - bool known_client) const { + const ClientClasses& client_classes) const { switch (type) { case Lease::TYPE_V4: case Lease::TYPE_NA: - return sumPoolCapacity(pools_, client_classes, known_client); + return sumPoolCapacity(pools_, client_classes); case Lease::TYPE_TA: - return sumPoolCapacity(pools_ta_, client_classes, known_client); + return sumPoolCapacity(pools_ta_, client_classes); case Lease::TYPE_PD: - return sumPoolCapacity(pools_pd_, client_classes, known_client); + return sumPoolCapacity(pools_pd_, client_classes); default: isc_throw(BadValue, "Unsupported pool type: " << static_cast(type)); @@ -172,11 +171,10 @@ Subnet::sumPoolCapacity(const PoolCollection& pools) const { uint64_t Subnet::sumPoolCapacity(const PoolCollection& pools, - const ClientClasses& client_classes, - bool known_client) const { + const ClientClasses& client_classes) const { uint64_t sum = 0; for (PoolCollection::const_iterator p = pools.begin(); p != pools.end(); ++p) { - if (!(*p)->clientSupported(client_classes, known_client)) { + if (!(*p)->clientSupported(client_classes)) { continue; } uint64_t x = (*p)->getCapacity(); @@ -372,7 +370,6 @@ const PoolPtr Subnet::getPool(Lease::Type type, const isc::asiolink::IOAddress& const PoolPtr Subnet::getPool(Lease::Type type, const ClientClasses& client_classes, - bool known_client, const isc::asiolink::IOAddress& hint) const { // check if the type is valid (and throw if it isn't) checkType(type); @@ -389,7 +386,7 @@ const PoolPtr Subnet::getPool(Lease::Type type, if (ub != pools.begin()) { --ub; if ((*ub)->inRange(hint) && - (*ub)->clientSupported(client_classes, known_client)) { + (*ub)->clientSupported(client_classes)) { candidate = *ub; } } @@ -482,8 +479,7 @@ Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const { bool Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr, - const ClientClasses& client_classes, - bool known_client) const { + const ClientClasses& client_classes) const { // Let's start with checking if it even belongs to that subnet. if ((type != Lease::TYPE_PD) && !inRange(addr)) { @@ -494,7 +490,7 @@ Subnet::inPool(Lease::Type type, for (PoolCollection::const_iterator pool = pools.begin(); pool != pools.end(); ++pool) { - if (!(*pool)->clientSupported(client_classes, known_client)) { + if (!(*pool)->clientSupported(client_classes)) { continue; } if ((*pool)->inRange(addr)) { diff --git a/src/lib/dhcpsrv/subnet.h b/src/lib/dhcpsrv/subnet.h index 5aa3640b7b..a22e364f21 100644 --- a/src/lib/dhcpsrv/subnet.h +++ b/src/lib/dhcpsrv/subnet.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -56,18 +56,16 @@ public: /// @brief checks if the specified address is in allowed pools /// - /// This takes also into account client classes and known client + /// This takes also into account client classes /// /// @param type type of pools to iterate over /// @param addr this address will be checked if it belongs to any pools in /// that subnet /// @param client_classes client class list which must be allowed - /// @param known_client true if the client is known, i.e. has a reservation /// @return true if the address is in any of the allowed pools bool inPool(Lease::Type type, const isc::asiolink::IOAddress& addr, - const ClientClasses& client_classes, - bool known_client) const; + const ClientClasses& client_classes) const; /// @brief returns the last address that was tried from this subnet /// @@ -159,15 +157,13 @@ public: /// @brief Returns a pool that specified address belongs to with classes /// - /// Variant using only pools allowing given classes and known clients + /// Variant using only pools allowing given classes /// /// @param type pool type that the pool is looked for /// @param client_classes client class list which must be allowed - /// @param known_client true if the client is known, i.e. has a reservation /// @param addr address that the returned pool should cover (optional) const PoolPtr getPool(Lease::Type type, const ClientClasses& client_classes, - bool known_client, const isc::asiolink::IOAddress& addr) const; /// @brief Returns a pool without any address specified @@ -198,15 +194,12 @@ public: uint64_t getPoolCapacity(Lease::Type type) const; /// @brief Returns the number of possible leases for specified lease type - /// allowed for a client which belongs to classes and matches known - /// clients constraint. + /// allowed for a client which belongs to classes. /// /// @param type type of the lease /// @param client_classes List of classes the client belongs to. - /// @param known_client true if the client is known, i.e. has a reservation uint64_t getPoolCapacity(Lease::Type type, - const ClientClasses& client_classes, - bool known_client) const; + const ClientClasses& client_classes) const; /// @brief Returns textual representation of the subnet (e.g. /// "2001:db8::/64") @@ -342,11 +335,9 @@ protected: /// @brief returns a sum of possible leases in all pools allowing classes /// @param pools list of pools /// @param client_classes list of classes - /// @param known_client true if the client is known, i.e. has a reservation /// @return sum of possible/allowed leases uint64_t sumPoolCapacity(const PoolCollection& pools, - const ClientClasses& client_classes, - bool known_client) const; + const ClientClasses& client_classes) const; /// @brief Checks if the specified pool overlaps with an existing pool. /// diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index d0f3600d04..88d1c079f6 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -326,8 +326,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, - known_client_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); } @@ -350,37 +349,10 @@ TEST_F(AllocEngine4Test, IterativeAllocator_class) { cc_.insert("bar"); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, - known_client_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, known_client_)); - } -} - -// This test verifies that the allocator picks addresses that belong to the -// pool using unknown clients -TEST_F(AllocEngine4Test, IterativeAllocator_unknown) { - boost::scoped_ptr - alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); - - // Restrict pool_ to known clients. Add a second pool for unknown clients. - pool_->setKnownClients(Pool::SERVE_KNOWN); - Pool4Ptr pool(new Pool4(IOAddress("192.0.2.200"), - IOAddress("192.0.2.209"))); - pool->setKnownClients(Pool::SERVE_UNKNOWN); - subnet_->addPool(pool); - - // Clients are unknown - known_client_ = false; - - for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, - known_client_, clientid_, - IOAddress("0.0.0.0")); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, known_client_)); - EXPECT_FALSE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, !known_client_)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_)); } } @@ -410,7 +382,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator_manyPools4) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_, clientid_, IOAddress("0.0.0.0")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); // One way to easily verify that the iterative allocator really works is @@ -741,49 +713,6 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkClassification) { EXPECT_EQ("192.0.2.17", lease->addr_.toText()); } -// This test verifies that the server can offer an address from a -// different subnet than orginally selected, when the address pool in -// the first subnet requires host reservations. -TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolKnown) { - - // Try to offer address from subnet1. There is one address available - // so it should be offerred. - AllocEngine::ClientContext4 - ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), - false, false, "host.example.com.", true); - ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234)); - Lease4Ptr lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); - - // Apply restrictions on the pool1. This should be only assigned - // to clients which have a reservation. - pool1_->setKnownClients(Pool::SERVE_KNOWN); - - // The allocation engine should determine that the pool1 is not - // available for the client without a reservation. - // Instead, it should offer an address from subnet2 that belongs - // to the same shared network. - ctx.subnet_ = subnet1_; - lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); - - // Add a host reservation and try again. This time, we should - // offer an address from the pool1. - HostPtr host(new Host(&hwaddr_->hwaddr_[0], hwaddr_->hwaddr_.size(), - Host::IDENT_HWADDR, subnet1_->getID(), - SubnetID(0), IOAddress::IPV4_ZERO_ADDRESS(), "foo")); - CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); - CfgMgr::instance().commit(); - AllocEngine::findReservation(ctx); - - ctx.subnet_ = subnet1_; - lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_EQ("192.0.2.17", lease->addr_.toText()); -} - // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong. @@ -1035,75 +964,6 @@ TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolClassification) { EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); } -// This test verifies that the server can assign an address from a -// different subnet than orginally selected, when the address pool in -// the first subnet requires host reservations. -TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolKnown) { - // Try to offer address from subnet1. There is one address available - // so it should be offerred. - AllocEngine::ClientContext4 - ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), - false, false, "host.example.com.", false); - ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); - Lease4Ptr lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); - - // Remove the lease so as we can start over. - LeaseMgrFactory::instance().deleteLease(lease->addr_); - - // Apply restrictions on the pool1. This should be only assigned - // to clients which have a reservation. - pool1_->setKnownClients(Pool::SERVE_KNOWN); - - // The allocation engine should determine that the pool1 is not - // available for the client without a reservation. - // Instead, it should assign an address from subnet2 that belongs - // to the same shared network. - ctx.subnet_ = subnet1_; - lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); - - // Remove the lease so as we can start over. - LeaseMgrFactory::instance().deleteLease(lease->addr_); - - // Add a host reservation and try again. This time, we should - // offer an address from the pool1. - HostPtr host(new Host(&hwaddr_->hwaddr_[0], hwaddr_->hwaddr_.size(), - Host::IDENT_HWADDR, subnet1_->getID(), - SubnetID(0), IOAddress::IPV4_ZERO_ADDRESS(), "foo")); - CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); - CfgMgr::instance().commit(); - AllocEngine::findReservation(ctx); - - ctx.subnet_ = subnet1_; - lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); - - // Let's now remove the client host reservation and try - // to renew the address. The engine should determine that the - // client doesn't have access to the pool1 anymore and - // assign an address from unrestricted pool. -#if 0 - CfgMgr::instance().getStagingCfg()->getCfgHosts()->del4(SubnetID(0), - Host::IDENT_HWADDR, - &hwaddr_->hwaddr_[0], - hwaddr_->hwaddr_.size()); - CfgMgr::instance().commit(); - AllocEngine::findReservation(ctx); -#else - // del4 is not always implemented - ctx.hosts_.clear(); -#endif - ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); - ctx.subnet_ = subnet1_; - lease = engine_.allocateLease4(ctx); - ASSERT_TRUE(lease); - EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); -} - // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong (DHCPREQUEST case). diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 2b833ec8da..97733e2915 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -189,7 +189,7 @@ TEST_F(AllocEngine6Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); } @@ -212,35 +212,9 @@ TEST_F(AllocEngine6Test, IterativeAllocator_class) { cc_.insert("bar"); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, known_client_)); - } -} - -// This test verifies that the allocator picks addresses that belong to the -// pool not requiring reservations -TEST_F(AllocEngine6Test, IterativeAllocator_unknown) { - boost::scoped_ptr - alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); - - // Restrict pool_ to known clients. Add a second pool for unknown clients. - pool_->setKnownClients(Pool::SERVE_KNOWN); - Pool6Ptr pool(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), - IOAddress("2001:db8:1::109"))); - pool->setKnownClients(Pool::SERVE_UNKNOWN); - subnet_->addPool(pool); - - // Clients are unknown - known_client_ = false; - - for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_, - duid_, IOAddress("::")); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); - EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, known_client_)); - EXPECT_FALSE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, !known_client_)); } } @@ -261,42 +235,32 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { // Let's check the first pool (5 addresses here) EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::3", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::4", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::5", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is easy - only one address here EXPECT_EQ("2001:db8:1::100", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it EXPECT_EQ("2001:db8:1::105", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::106", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { @@ -322,42 +286,32 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { // Let's check the first pool (5 addresses here) EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::3", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::4", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::5", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is easy - only one address here EXPECT_EQ("2001:db8:1::100", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it EXPECT_EQ("2001:db8:1::105", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::106", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { @@ -379,99 +333,30 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { // Let's check the first pool (5 addresses here) EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::3", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::4", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::5", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is skipped // This is the third and last pool, with 2 addresses in it EXPECT_EQ("2001:db8:1::105", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::106", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); -} - -TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepKnown) { - NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); - - subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool - - Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), - IOAddress("2001:db8:1::5"))); - Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), - IOAddress("2001:db8:1::100"))); - Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), - IOAddress("2001:db8:1::106"))); - // The pool1 serves everybody, pool2 known clients, pool3 unknown clients. - // Set pool1 and pool3 but not pool2 in foo class - pool1->setKnownClients(Pool::SERVE_BOTH); - pool2->setKnownClients(Pool::SERVE_KNOWN); - pool3->setKnownClients(Pool::SERVE_UNKNOWN); - subnet_->addPool(pool1); - subnet_->addPool(pool2); - subnet_->addPool(pool3); - - // Clients have no reservation - known_client_ = false; - - // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - - // The second pool is skipped - - // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - - // We iterated over all addresses and reached to the end of the last pool. - // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { @@ -493,84 +378,62 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { // First pool check (Let's check over all 16 leases) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:20::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:30::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:40::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:50::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:60::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:70::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:80::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:90::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:a0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:b0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:c0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:d0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:e0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:f0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Second pool (just one lease here) EXPECT_EQ("2001:db8:1::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool EXPECT_EQ("2001:db8:2::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; EXPECT_EQ(exp.str(), - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } EXPECT_EQ("2001:db8:2:ff::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { @@ -598,84 +461,62 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { // First pool check (Let's check over all 16 leases) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:20::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:30::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:40::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:50::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:60::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:70::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:80::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:90::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:a0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:b0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:c0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:d0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:e0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:f0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Second pool (just one lease here) EXPECT_EQ("2001:db8:1::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool EXPECT_EQ("2001:db8:2::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; EXPECT_EQ(exp.str(), - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } EXPECT_EQ("2001:db8:2:ff::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { @@ -699,184 +540,60 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { // First pool check (Let's check over all 16 leases) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:20::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:30::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:40::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:50::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:60::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:70::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:80::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:90::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:a0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:b0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:c0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:d0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:e0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:f0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is skipped // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool EXPECT_EQ("2001:db8:2::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; EXPECT_EQ(exp.str(), - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } EXPECT_EQ("2001:db8:2:ff::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); -} - -TEST_F(AllocEngine6Test, IterativeAllocatorPrefixKnown) { - NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); - - subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); - - Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); - Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); - Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); - // Set pool2 in foo - pool1->setKnownClients(Pool::SERVE_BOTH); - pool2->setKnownClients(Pool::SERVE_UNKNOWN); - pool3->setKnownClients(Pool::SERVE_KNOWN); - subnet_->addPool(pool1); - subnet_->addPool(pool2); - subnet_->addPool(pool3); - - // Clients have reservations - known_client_ = true; - - // We have a 2001:db8::/48 subnet that has 3 pools defined in it: - // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) - // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) - // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) - - // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - - // The second pool is skipped - - // Third pool (256 leases, let's check first and last explicitly and the - // rest over in a pool - EXPECT_EQ("2001:db8:2::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - for (int i = 1; i < 255; i++) { - stringstream exp; - exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - - } - EXPECT_EQ("2001:db8:2:ff::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - - // Ok, we've iterated over all prefixes in all pools. We now wrap around. - // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", - alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("::")).toText()); + alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } // This test verifies that the iterative allocator can step over addresses @@ -884,8 +601,7 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); // Let's pick the first address - IOAddress addr1 = alloc.pickAddress(subnet_, cc_, known_client_, duid_, - IOAddress("2001:db8:1::10")); + IOAddress addr1 = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("2001:db8:1::10")); // Check that we can indeed pick the first address from the pool EXPECT_EQ("2001:db8:1::10", addr1.toText()); @@ -975,7 +691,7 @@ TEST_F(AllocEngine6Test, IterativeAllocator_manyPools6) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_, + IOAddress candidate = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); @@ -1014,8 +730,7 @@ TEST_F(AllocEngine6Test, smallPool6) { IOAddress addr("2001:db8:1::ad"); // Create a subnet with a pool that has one address. - initSubnet(IOAddress("2001:db8:1::"), - addr, addr); + initSubnet(IOAddress("2001:db8:1::"), addr, addr); // Initialize FQDN for a lease. initFqdn("myhost.example.com", true, true); @@ -2835,62 +2550,6 @@ TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolClassification) { EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); } -// This test verifies that the server can offer an address from a -// different subnet than orginally selected, when the address pool in -// the first subnet requires a reservation. -TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolKnown) { - // Try to offer address from subnet1. There is an address available so - // it should be offerred. - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - AllocEngine::ClientContext6 ctx(subnet1_, duid_, false, false, "", true, - query); - ctx.currentIA().iaid_ = iaid_; - - Lease6Ptr lease; - ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx))); - ASSERT_TRUE(lease); - ASSERT_TRUE(subnet1_->inRange(lease->addr_)); - - // Apply restrictions on the pool1. This should be only assigned - // to clients with have a reservation. - pool1_->setKnownClients(Pool::SERVE_KNOWN); - - // The allocation engine should determine that the pool1 is not - // available for the client without a reservation. - // Instead, it should offer an address from subnet2 that belongs - // to the same shared network. - AllocEngine::ClientContext6 ctx2(subnet1_, duid_, false, false, "", true, - query); - ctx2.currentIA().iaid_ = iaid_; - ctx2.query_ = query; - ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx2))); - ASSERT_TRUE(lease); - ASSERT_TRUE(subnet2_->inRange(lease->addr_)); - - AllocEngine::ClientContext6 ctx3(subnet1_, duid_, false, false, "", true, - query); - ctx3.currentIA().iaid_ = iaid_; - ctx3.query_ = query; - - AllocEngine::ClientContext6 ctx4(subnet1_, duid_, false, false, "", true, - query); - ctx4.currentIA().iaid_ = iaid_; - ctx4.query_ = query; - - // Add a host reservation and try again. This time, we should - // offer an address from the pool1_. - HostPtr host(new Host(&duid_->getDuid()[0], duid_->getDuid().size(), - Host::IDENT_DUID, SubnetID(0), subnet1_->getID(), - IOAddress::IPV4_ZERO_ADDRESS(), "foo")); - CfgMgr::instance().getStagingCfg()->getCfgHosts()->add(host); - CfgMgr::instance().commit(); - AllocEngine::findReservation(ctx4); - - ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx4))); - ASSERT_TRUE(lease); - EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); -} - // This test verifies that the client is offerred a reserved address // even if this address belongs to another subnet within the same // shared network. diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index 1d20f0fc69..5b86b4e6a5 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -411,7 +411,6 @@ public: bool fqdn_rev_; ///< Perform reverse update for a lease. LeaseMgrFactory factory_; ///< pointer to LeaseMgr factory ClientClasses cc_; ///< client classes - bool known_client_; ///< client has a reservation }; /// @brief Used in Allocation Engine tests for IPv4 @@ -514,7 +513,6 @@ public: LeaseMgrFactory factory_; ///< Pointer to LeaseMgr factory AllocEngine::ClientContext4 ctx_; ///< Context information passed to various ClientClasses cc_; ///< Client classes - bool known_client_; ///< client has a reservation ///< allocation engine functions. }; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index 3acfe13070..c142dfa520 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -816,7 +816,6 @@ TEST(CfgSubnets4Test, unparsePool) { Pool4Ptr pool1(new Pool4(IOAddress("192.0.2.1"), IOAddress("192.0.2.10"))); Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); pool2->allowClientClass("bar"); - pool2->setKnownClients(Pool::SERVE_KNOWN); pool2->deferClientClass("foo"); subnet->addPool(pool1); @@ -849,7 +848,6 @@ TEST(CfgSubnets4Test, unparsePool) { " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\",\n" " \"client-class\": \"bar\",\n" - " \"known-clients\": \"only\",\n" " \"eval-client-classes\": [ \"foo\" ]\n" " }\n" " ]\n" diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index bedaff84e8..63c3297247 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -507,7 +507,6 @@ TEST(CfgSubnets6Test, unparsePool) { IOAddress("2001:db8:1::199"))); Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); pool2->allowClientClass("bar"); - pool2->setKnownClients(Pool::SERVE_UNKNOWN); pool2->deferClientClass("foo"); subnet->addPool(pool1); @@ -534,7 +533,6 @@ TEST(CfgSubnets6Test, unparsePool) { " \"pool\": \"2001:db8:1:1::/64\",\n" " \"option-data\": [ ],\n" " \"client-class\": \"bar\",\n" - " \"known-clients\": \"never\",\n" " \"eval-client-classes\": [ \"foo\" ]\n" " }\n" " ],\n" @@ -558,8 +556,6 @@ TEST(CfgSubnets6Test, unparsePdPool) { IOAddress("2001:db8:3::"), 64)); pdpool1->deferClientClass("bar"); pdpool2->allowClientClass("bar"); - pdpool2->setKnownClients(Pool::SERVE_KNOWN); - subnet->addPool(pdpool1); subnet->addPool(pdpool2); @@ -592,8 +588,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"excluded-prefix\": \"2001:db8:3::\",\n" " \"excluded-prefix-len\": 64,\n" " \"option-data\": [ ],\n" - " \"client-class\": \"bar\",\n" - " \"known-clients\": \"only\"\n" + " \"client-class\": \"bar\"\n" " }\n" " ],\n" " \"option-data\": [ ]\n" diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index ce2a1a8565..6f6b8192f5 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -215,33 +215,19 @@ TEST(Pool4Test, clientClass) { // No class restrictions defined, any client should be supported EXPECT_TRUE(pool->getClientClass().empty()); - EXPECT_TRUE(pool->clientSupported(no_class, false)); - EXPECT_TRUE(pool->clientSupported(foo_class, false)); - EXPECT_TRUE(pool->clientSupported(bar_class, false)); - EXPECT_TRUE(pool->clientSupported(three_classes, false)); + EXPECT_TRUE(pool->clientSupported(no_class)); + EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); // Let's allow only clients belonging to "bar" class. pool->allowClientClass("bar"); EXPECT_EQ("bar", pool->getClientClass()); - EXPECT_FALSE(pool->clientSupported(no_class, false)); - EXPECT_FALSE(pool->clientSupported(foo_class, false)); - EXPECT_TRUE(pool->clientSupported(bar_class, false)); - EXPECT_TRUE(pool->clientSupported(three_classes, false)); -} - -// This test checks that handling for known-clients is valid. -TEST(Pool4Test, knownClients) { - // Create a pool. - Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), - IOAddress("192.0.2.255"))); - - // This pool serves everybody by default. - EXPECT_EQ(Pool::SERVE_BOTH, pool->getKnownClients()); - - // Set it to only known clients. - pool->setKnownClients(Pool::SERVE_KNOWN); - EXPECT_EQ(Pool::SERVE_KNOWN,pool->getKnownClients()); + EXPECT_FALSE(pool->clientSupported(no_class)); + EXPECT_FALSE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); } // This test checks that handling for eval-client-classes is valid. @@ -624,33 +610,19 @@ TEST(Pool6Test, clientClass) { // No class restrictions defined, any client should be supported EXPECT_TRUE(pool.getClientClass().empty()); - EXPECT_TRUE(pool.clientSupported(no_class, false)); - EXPECT_TRUE(pool.clientSupported(foo_class, false)); - EXPECT_TRUE(pool.clientSupported(bar_class, false)); - EXPECT_TRUE(pool.clientSupported(three_classes, false)); + EXPECT_TRUE(pool.clientSupported(no_class)); + EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); // Let's allow only clients belonging to "bar" class. pool.allowClientClass("bar"); EXPECT_EQ("bar", pool.getClientClass()); - EXPECT_FALSE(pool.clientSupported(no_class, false)); - EXPECT_FALSE(pool.clientSupported(foo_class, false)); - EXPECT_TRUE(pool.clientSupported(bar_class, false)); - EXPECT_TRUE(pool.clientSupported(three_classes, false)); -} - -// This test checks that handling for known-clients is valid. -TEST(Pool6Test, knownClients) { - // Create a pool. - Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), - IOAddress("2001:db8::2")); - - // This pool serves everybody by default. - EXPECT_EQ(Pool::SERVE_BOTH, pool.getKnownClients()); - - // Set it to only known clients. - pool.setKnownClients(Pool::SERVE_KNOWN); - EXPECT_EQ(Pool::SERVE_KNOWN,pool.getKnownClients()); + EXPECT_FALSE(pool.clientSupported(no_class)); + EXPECT_FALSE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); } // This test checks that handling for eval-client-classes is valid. diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index ef34893d7b..979d4e04b9 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -235,74 +235,36 @@ TEST(Subnet4Test, pool4InSubnet4) { three_classes.insert("baz"); // If we provide a hint, we should get a pool that this hint belongs to - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, IOAddress("192.1.2.201"))); EXPECT_EQ(mypool, pool4); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, IOAddress("192.1.2.129"))); EXPECT_EQ(mypool, pool2); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, IOAddress("192.1.2.64"))); EXPECT_EQ(mypool, pool1); // Specify addresses which don't belong to any existing pools. - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, IOAddress("192.1.2.210"))); EXPECT_FALSE(mypool); // Pool3 requires a member of bar - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, IOAddress("192.1.2.195"))); EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, IOAddress("192.1.2.195"))); EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, IOAddress("192.1.2.195"))); EXPECT_EQ(mypool, pool3); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false, + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, IOAddress("192.1.2.195"))); EXPECT_EQ(mypool, pool3); - - // And now known clients - EXPECT_EQ(Pool::SERVE_BOTH, pool1->getKnownClients()); - pool2->setKnownClients(Pool::SERVE_KNOWN); - pool3->setKnownClients(Pool::SERVE_UNKNOWN); - pool4->setKnownClients(Pool::SERVE_UNKNOWN); - - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, - IOAddress("192.1.2.64"))); - EXPECT_EQ(mypool, pool1); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, - IOAddress("192.1.2.64"))); - EXPECT_EQ(mypool, pool1); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, - IOAddress("192.1.2.129"))); - EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, - IOAddress("192.1.2.129"))); - - EXPECT_EQ(mypool, pool2); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, - IOAddress("192.1.2.195"))); - EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, - IOAddress("192.1.2.195"))); - EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, false, - IOAddress("192.1.2.195"))); - EXPECT_EQ(mypool, pool3); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, true, - IOAddress("192.1.2.195"))); - EXPECT_FALSE(mypool); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false, - IOAddress("192.1.2.201"))); - EXPECT_EQ(mypool, pool4); - ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, true, - IOAddress("192.1.2.201"))); - EXPECT_FALSE(mypool); } // Check if it's possible to get specified number of possible leases for @@ -357,20 +319,10 @@ TEST(Subnet4Test, getCapacity) { pool3->allowClientClass("bar"); // Pool3 requires a member of bar - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, false)); - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class, false)); - EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false)); - EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes, false)); - - // And now known clients - EXPECT_EQ(Pool::SERVE_BOTH, pool1->getKnownClients()); - pool2->setKnownClients(Pool::SERVE_KNOWN); - pool3->setKnownClients(Pool::SERVE_UNKNOWN); - - EXPECT_EQ(132, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, false)); - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, true)); - EXPECT_EQ(136, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false)); - EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, true)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes)); } // Checks that it is not allowed to add invalid pools. @@ -551,29 +503,24 @@ TEST(Subnet4Test, inRangeinPool) { // This client does not belong to any class. isc::dhcp::ClientClasses no_class; - EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class, false)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class)); // This client belongs to foo only isc::dhcp::ClientClasses foo_class; foo_class.insert("foo"); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class, false)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class)); // This client belongs to bar only. I like that client. isc::dhcp::ClientClasses bar_class; bar_class.insert("bar"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class, false)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class)); // This client belongs to foo, bar and baz classes. isc::dhcp::ClientClasses three_classes; three_classes.insert("foo"); three_classes.insert("bar"); three_classes.insert("baz"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false)); - - // Add known clients - pool1->setKnownClients(Pool::SERVE_UNKNOWN); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false)); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, true)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes)); } // This test checks if the toText() method returns text representation @@ -796,31 +743,13 @@ TEST(Subnet6Test, Pool6getCapacity) { // Pool3 requires a member of bar EXPECT_EQ(uint64_t(4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, no_class, false)); + subnet->getPoolCapacity(Lease::TYPE_NA, no_class)); EXPECT_EQ(uint64_t(4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, foo_class, false)); + subnet->getPoolCapacity(Lease::TYPE_NA, foo_class)); EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, bar_class, false)); + subnet->getPoolCapacity(Lease::TYPE_NA, bar_class)); EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, three_classes, false)); - - // Add known clients - pool2->setKnownClients(Pool::SERVE_KNOWN); - EXPECT_EQ(uint64_t(65536), - subnet->getPoolCapacity(Lease::TYPE_NA, no_class, false)); - EXPECT_EQ(uint64_t(4294967296ull + 65536), - subnet->getPoolCapacity(Lease::TYPE_NA, no_class, true)); - - // This is 2^64 prefixes. We're overflown uint64_t. - PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64)); - subnet->addPool(pool4); - EXPECT_EQ(std::numeric_limits::max(), - subnet->getPoolCapacity(Lease::TYPE_NA)); - - PoolPtr pool5(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:5::"), 64)); - subnet->addPool(pool5); - EXPECT_EQ(std::numeric_limits::max(), - subnet->getPoolCapacity(Lease::TYPE_NA)); + subnet->getPoolCapacity(Lease::TYPE_NA, three_classes)); } // Test checks whether the number of prefixes available in the pools are @@ -912,45 +841,18 @@ TEST(Subnet6Test, Pool6InSubnet6) { pool3->allowClientClass("bar"); // Pool3 requires a member of bar - mypool = subnet->getPool(Lease::TYPE_NA, no_class, false, + mypool = subnet->getPool(Lease::TYPE_NA, no_class, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, foo_class, false, + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, bar_class, false, + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); - mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false, + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); - - // Add know cients - pool3->setKnownClients(Pool::SERVE_UNKNOWN); - mypool = subnet->getPool(Lease::TYPE_NA, no_class, false, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, no_class, true, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, foo_class, false, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, foo_class, true, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, bar_class, false, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_EQ(mypool, pool3); - mypool = subnet->getPool(Lease::TYPE_NA, bar_class, true, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); - mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_EQ(mypool, pool3); - mypool = subnet->getPool(Lease::TYPE_NA, three_classes, true, - IOAddress("2001:db8:1:3::dead:beef")); - EXPECT_FALSE(mypool); } // Check if Subnet6 supports different types of pools properly. @@ -1406,29 +1308,24 @@ TEST(Subnet6Test, inRangeinPool) { // This client does not belong to any class. isc::dhcp::ClientClasses no_class; - EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class, false)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class)); // This client belongs to foo only isc::dhcp::ClientClasses foo_class; foo_class.insert("foo"); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class, false)); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class)); // This client belongs to bar only. I like that client. isc::dhcp::ClientClasses bar_class; bar_class.insert("bar"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class, false)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class)); // This client belongs to foo, bar and baz classes. isc::dhcp::ClientClasses three_classes; three_classes.insert("foo"); three_classes.insert("bar"); three_classes.insert("baz"); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false)); - - // Add known clients - pool1->setKnownClients(Pool::SERVE_KNOWN); - EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false)); - EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, true)); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes)); } // This test verifies that inRange() and inPool() methods work properly From 21f1be7867187e489205e5a99ed1d1facf0a4cd7 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 1 Apr 2018 12:45:56 +0000 Subject: [PATCH 38/52] [trac5374] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 1952 +++++++++++---------- src/bin/dhcp4/dhcp4_parser.cc | 2934 ++++++++++++++++--------------- src/bin/dhcp4/dhcp4_parser.h | 331 ++-- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 1870 ++++++++++---------- src/bin/dhcp6/dhcp6_parser.cc | 3042 ++++++++++++++++----------------- src/bin/dhcp6/dhcp6_parser.h | 349 ++-- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 5140 insertions(+), 5350 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index d821e46454..b806f4a3c4 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 163 -#define YY_END_OF_BUFFER 164 +#define YY_NUM_RULES 161 +#define YY_END_OF_BUFFER 162 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,155 +700,153 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1336] = +static const flex_int16_t yy_accept[1319] = { 0, - 156, 156, 0, 0, 0, 0, 0, 0, 0, 0, - 164, 162, 10, 11, 162, 1, 156, 153, 156, 156, - 162, 155, 154, 162, 162, 162, 162, 162, 149, 150, - 162, 162, 162, 151, 152, 5, 5, 5, 162, 162, - 162, 10, 11, 0, 0, 145, 0, 0, 0, 0, + 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, + 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, + 160, 153, 152, 160, 160, 160, 160, 160, 147, 148, + 160, 160, 160, 149, 150, 5, 5, 5, 160, 160, + 160, 10, 11, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 156, 156, 0, 155, 156, 3, 2, 6, 0, 156, + 154, 154, 0, 153, 154, 3, 2, 6, 0, 154, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, - 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, + 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 161, 159, 0, 158, 157, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, - - 0, 125, 0, 0, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 0, 160, 157, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 127, 0, 0, 129, 0, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 48, - 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, - 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 25, 0, 0, 30, 0, 0, - - 0, 0, 0, 0, 0, 0, 12, 134, 0, 131, - 0, 130, 0, 0, 0, 93, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, - 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 89, 0, 0, 0, 0, 0, 7, 0, 0, - - 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, - 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 98, 69, - 0, 0, 0, 74, 26, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 159, 157, 0, 156, 155, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 124, 0, 123, 0, 0, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, - 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, + 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 158, 155, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, + + 127, 0, 0, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 0, 48, 0, 0, 0, 0, 0, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 78, 25, 0, 0, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 132, + + 0, 129, 0, 128, 0, 0, 0, 91, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 0, 0, 53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 0, 0, 7, 0, + 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 67, 0, + 0, 0, 72, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 115, 0, - 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 139, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 90, 72, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 0, 20, 0, 95, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 45, 0, 0, 0, 0, - 0, 97, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 113, 0, 0, 111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, + 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, + 88, 70, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 20, + 0, 93, 0, 0, 0, 0, 0, 117, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 95, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 142, 46, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, - 0, 0, 0, 0, 116, 0, 114, 0, 109, 108, - 0, 19, 0, 0, 0, 0, 0, 128, 0, 0, - 79, 0, 0, 0, 0, 0, 0, 106, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, - 0, 0, 0, 35, 0, 0, 0, 0, 118, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 60, 41, 0, 91, 0, 0, - 82, 0, 0, 0, 0, 52, 0, 137, 0, 136, + 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 144, 77, 0, 38, 107, 0, 0, - 140, 111, 0, 81, 0, 0, 0, 0, 0, 0, - 23, 0, 22, 0, 117, 0, 0, 0, 70, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, + 0, 0, 140, 46, 62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 0, 114, + 0, 112, 0, 107, 106, 0, 19, 0, 0, 0, + 0, 0, 126, 0, 0, 77, 0, 0, 0, 0, + 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 35, 0, 0, + 0, 0, 116, 0, 0, 0, 0, 0, 58, 41, + 0, 89, 0, 0, 80, 0, 0, 0, 0, 52, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 96, 0, 0, 141, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 143, 44, 0, 138, 133, - 0, 0, 14, 0, 0, 0, 124, 0, 0, 0, - 0, 104, 0, 0, 0, 0, 0, 0, 61, 0, - 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, - 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 103, 17, 0, 121, 0, 0, 0, - 120, 0, 78, 0, 0, 102, 0, 0, 0, 123, + 0, 135, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 142, 75, 0, 38, + 105, 0, 0, 138, 109, 0, 79, 0, 0, 0, + 0, 0, 0, 23, 0, 22, 0, 115, 0, 0, + 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 36, 0, 0, 0, + 0, 0, 0, 0, 94, 0, 0, 139, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, - 0, 0, 0, 0, 0, 0, 100, 105, 42, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 67, 0, 0, 101, 0 + 0, 0, 0, 0, 0, 0, 0, 18, 141, 44, + 0, 136, 131, 0, 0, 14, 0, 0, 0, 122, + 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, + 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 17, 0, 119, + 0, 0, 0, 118, 0, 76, 0, 0, 100, 0, + 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 120, 0, 0, 0, 0, 0, 0, 98, + + 103, 42, 0, 0, 0, 97, 0, 0, 0, 0, + 0, 0, 0, 65, 0, 0, 99, 0 } ; static const YY_CHAR yy_ec[256] = @@ -895,327 +893,323 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1348] = +static const flex_int16_t yy_base[1331] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1698, 1699, 32, 1694, 141, 0, 201, 1699, 206, 88, - 11, 213, 1699, 1676, 114, 25, 2, 6, 1699, 1699, - 73, 11, 17, 1699, 1699, 1699, 104, 1682, 1637, 0, - 1674, 107, 1689, 217, 247, 1699, 1633, 185, 1632, 1638, - 93, 58, 1630, 91, 211, 195, 14, 273, 195, 1629, - 181, 275, 202, 209, 1638, 66, 188, 11, 232, 272, - 299, 289, 207, 1621, 78, 307, 326, 305, 1640, 0, - 354, 361, 369, 376, 381, 1699, 0, 1699, 273, 317, - 208, 223, 196, 286, 306, 210, 1699, 1637, 1676, 1699, + 1682, 1683, 32, 1678, 141, 0, 201, 1683, 206, 88, + 11, 213, 1683, 1660, 114, 25, 2, 6, 1683, 1683, + 73, 11, 17, 1683, 1683, 1683, 104, 1666, 1621, 0, + 1658, 107, 1673, 217, 247, 1683, 1617, 185, 1616, 1622, + 93, 58, 1614, 91, 211, 195, 14, 273, 195, 1613, + 181, 275, 202, 209, 1622, 66, 188, 1621, 232, 272, + 299, 289, 207, 1604, 78, 298, 318, 308, 1623, 0, + 344, 359, 367, 373, 379, 1683, 0, 1683, 273, 385, + 208, 223, 196, 306, 348, 210, 1683, 1620, 1659, 1683, - 315, 1699, 376, 1665, 360, 1623, 1633, 352, 286, 1628, - 362, 361, 364, 371, 383, 1671, 0, 427, 380, 1615, - 1617, 1613, 1621, 74, 1617, 1606, 1607, 89, 1623, 1606, - 1615, 1615, 366, 1621, 1605, 368, 1606, 302, 1651, 1655, - 1597, 1648, 1590, 1599, 1612, 1609, 1609, 1603, 348, 1596, - 1589, 1594, 1588, 397, 1599, 1592, 1583, 1582, 1596, 343, - 1582, 361, 1598, 379, 433, 1585, 398, 1596, 1593, 1594, - 1592, 1574, 1576, 422, 1568, 1585, 1577, 0, 422, 428, - 388, 424, 432, 422, 1576, 1699, 0, 1619, 445, 1566, - 1569, 431, 437, 1577, 443, 1620, 455, 1619, 439, 1618, + 309, 1683, 384, 1648, 306, 1606, 1616, 351, 294, 1611, + 326, 364, 366, 373, 383, 1654, 0, 435, 371, 1598, + 1600, 1596, 1604, 74, 1600, 1589, 1590, 89, 1606, 1589, + 1598, 1598, 285, 1604, 1588, 269, 1589, 355, 1634, 1638, + 1580, 1631, 1573, 1596, 1593, 1593, 1587, 348, 1580, 1573, + 1578, 1572, 375, 1583, 1568, 1567, 1581, 306, 1567, 358, + 1583, 262, 432, 1570, 357, 1581, 1578, 1579, 1577, 1559, + 1561, 396, 1553, 1570, 1562, 0, 390, 407, 419, 401, + 409, 421, 1561, 1683, 0, 1604, 444, 1551, 1554, 434, + 409, 1562, 445, 1605, 447, 1604, 441, 1603, 1683, 485, - 1699, 490, 1617, 464, 1578, 1558, 1574, 1571, 1570, 444, - 1611, 1605, 1571, 1550, 1558, 1553, 1567, 1563, 1551, 1563, - 1563, 1551, 1553, 1537, 1541, 1554, 1554, 1546, 1536, 1554, - 1699, 1549, 1552, 1533, 1528, 1531, 1581, 1530, 1540, 1543, - 486, 1539, 1527, 1538, 1574, 473, 1521, 1577, 1514, 1529, - 488, 1519, 1535, 1516, 1515, 1521, 1512, 1511, 1518, 1520, - 1565, 1523, 1522, 1516, 270, 1523, 1518, 1510, 1516, 1515, - 1515, 1496, 1512, 1498, 1504, 1511, 1499, 1492, 1506, 1547, - 1508, 449, 1499, 475, 1699, 1699, 477, 1699, 1699, 1486, - 0, 457, 478, 1488, 516, 493, 1542, 1495, 489, 1699, + 1602, 453, 1563, 1543, 1559, 1556, 1555, 429, 1596, 1590, + 1556, 1535, 1543, 1538, 1552, 1548, 1536, 1548, 1548, 1536, + 1538, 1522, 1526, 1539, 1539, 1531, 1521, 1539, 1683, 1534, + 1537, 1518, 1517, 1567, 1516, 1526, 1529, 462, 1525, 1513, + 1524, 1560, 465, 1507, 1563, 1516, 491, 1506, 1522, 1503, + 1502, 1508, 1499, 1498, 1505, 1507, 1552, 1510, 1509, 1503, + 457, 1510, 1505, 1497, 1503, 1502, 1502, 1483, 1499, 1485, + 1491, 1498, 1486, 1479, 1493, 1534, 1495, 442, 1486, 480, + 1683, 1683, 489, 1683, 1683, 1473, 0, 423, 477, 1475, + 502, 494, 1529, 1482, 487, 1683, 1527, 1683, 1521, 537, - 1540, 1699, 1534, 538, 1699, 481, 1476, 1532, 1478, 1484, - 1534, 1491, 482, 1699, 1489, 1531, 1486, 1483, 513, 1489, - 1527, 1521, 1476, 1471, 1518, 1467, 1516, 1475, 1464, 1513, - 1461, 559, 1475, 1460, 1473, 1460, 1461, 1469, 1464, 1471, - 1466, 1462, 469, 1460, 1463, 1458, 1454, 1502, 496, 511, - 1496, 1699, 1500, 1447, 1446, 1445, 1438, 1440, 1444, 1433, - 1446, 536, 1491, 1446, 1443, 1447, 1699, 1445, 1434, 1434, - 1446, 1428, 1420, 1421, 1442, 1424, 1473, 1435, 1434, 1420, - 1432, 1431, 1430, 1429, 1470, 1469, 1699, 1413, 1412, 560, - 1425, 1699, 1699, 1424, 0, 1413, 1405, 533, 1410, 1461, + 1683, 486, 1463, 1519, 1465, 1471, 1521, 1478, 460, 1683, + 1476, 1518, 1473, 1470, 524, 1476, 1514, 1508, 1463, 1458, + 1505, 1454, 1503, 1462, 1451, 1500, 1448, 532, 1462, 1447, + 1460, 1447, 1457, 1452, 1459, 1454, 1450, 462, 1448, 1451, + 1446, 1442, 1490, 497, 507, 1484, 1683, 1436, 1435, 1434, + 1427, 1429, 1433, 1422, 1435, 535, 1480, 1435, 1432, 1436, + 1683, 1434, 1423, 1423, 1435, 1417, 1409, 1410, 1431, 1413, + 1462, 1424, 1423, 1409, 1421, 1420, 1419, 1418, 1459, 1458, + 1683, 1402, 1401, 538, 1414, 1683, 1683, 1413, 0, 1402, + 1394, 513, 1399, 1450, 1449, 1407, 1447, 1683, 1395, 1445, - 1460, 1418, 1458, 1699, 1406, 1456, 1699, 543, 608, 534, - 1455, 1411, 1407, 1395, 1699, 1411, 1410, 1397, 1396, 1699, - 1398, 1395, 527, 1393, 1395, 1699, 1403, 1400, 1385, 511, - 1398, 1393, 570, 1400, 1382, 1431, 1699, 1380, 1396, 1428, - 1391, 1388, 1389, 1391, 1423, 1422, 1375, 1370, 1369, 1418, - 1364, 1379, 1357, 1364, 1369, 1417, 1699, 1364, 1360, 1414, - 1357, 1699, 1361, 1368, 1352, 1352, 1362, 1365, 1354, 1349, - 1699, 1404, 1699, 1348, 1359, 1396, 1343, 1348, 1357, 1351, - 1355, 1395, 1389, 1353, 1333, 1353, 1335, 1334, 1342, 1346, - 1329, 1385, 1327, 1699, 1699, 1332, 1330, 1699, 1341, 1375, + 1683, 534, 584, 533, 1444, 1400, 1396, 1384, 1683, 1400, + 1399, 1386, 1385, 1683, 1387, 1384, 508, 1382, 1384, 1683, + 1392, 1389, 1374, 511, 1387, 1382, 565, 1389, 1371, 1420, + 1683, 1369, 1385, 1417, 1380, 1377, 1378, 1380, 1412, 1365, + 1360, 1359, 1408, 1354, 1369, 1347, 1354, 1359, 1407, 1683, + 1354, 1350, 1404, 1347, 1351, 1358, 1342, 1342, 1352, 1355, + 1344, 1339, 1683, 1394, 1683, 1338, 1349, 1386, 1333, 1338, + 1347, 1341, 1345, 1385, 1379, 1343, 1323, 1343, 1325, 1324, + 1332, 1336, 1319, 1375, 1317, 1683, 1683, 1322, 1320, 1683, + 1331, 1365, 1327, 0, 1311, 1328, 1366, 1316, 1683, 1683, - 1337, 0, 1321, 1338, 1376, 1326, 1699, 1699, 1323, 1699, - 1329, 1699, 546, 545, 582, 1699, 1326, 1314, 1365, 1312, - 1311, 1318, 1311, 1323, 1322, 1322, 1310, 1351, 1318, 1310, - 1353, 1299, 1307, 1304, 1313, 1312, 1699, 1297, 1294, 1308, - 1300, 1306, 1297, 1305, 1290, 1306, 1288, 1302, 1301, 1299, - 1282, 1276, 1281, 1296, 1293, 1294, 1291, 1332, 1289, 1699, - 1275, 1277, 1699, 1286, 1322, 1321, 1274, 574, 1283, 1266, - 1267, 1264, 1699, 1278, 1257, 1278, 1275, 1267, 1310, 1264, - 1308, 1699, 1255, 1269, 1272, 1253, 1303, 1302, 1249, 1300, - 1299, 1699, 14, 1261, 1244, 1249, 1251, 1699, 1257, 1247, + 1313, 1683, 1319, 1683, 534, 540, 566, 1683, 1316, 1304, + 1355, 1302, 1301, 1308, 1301, 1313, 1312, 1312, 1300, 1341, + 1308, 1300, 1343, 1289, 1297, 1294, 1303, 1302, 1683, 1287, + 1284, 1298, 1290, 1296, 1287, 1295, 1280, 1296, 1278, 1292, + 1290, 1273, 1267, 1272, 1287, 1284, 1285, 1282, 1323, 1280, + 1683, 1266, 1268, 1683, 1277, 1313, 1312, 1265, 568, 1274, + 1257, 1258, 1255, 1683, 1269, 1248, 1269, 1266, 1258, 1301, + 1255, 1299, 1683, 1246, 1260, 1263, 1244, 1294, 1293, 1240, + 1291, 1290, 1683, 14, 1252, 1235, 1240, 1242, 1683, 1248, + 1238, 1683, 1283, 1231, 1286, 552, 554, 526, 1236, 1279, - 1699, 1292, 1240, 1295, 544, 565, 539, 1245, 1288, 551, - 1287, 1286, 1285, 1239, 1229, 1282, 1235, 1245, 1279, 1242, - 1236, 1223, 1231, 1233, 1273, 1272, 1276, 1233, 1232, 1233, - 1226, 1215, 1228, 1231, 1226, 1227, 1224, 1223, 1215, 1225, - 1220, 1261, 1260, 1210, 1200, 1208, 1256, 1699, 1255, 1204, - 1196, 1197, 1210, 1197, 1208, 1699, 1196, 1205, 1204, 1204, - 1244, 1187, 1196, 1189, 1200, 1177, 1181, 1232, 1179, 1189, - 1229, 1176, 1227, 540, 559, 1169, 1179, 551, 1699, 1229, - 1187, 1170, 1175, 1179, 1169, 1181, 1184, 1221, 1699, 1215, - 575, 1168, 1176, 1175, 1170, 1166, 1173, 1156, 1159, 1155, + 544, 1278, 1277, 1276, 1230, 1220, 1273, 1226, 1236, 1270, + 1233, 1227, 1214, 1222, 1224, 1264, 1263, 1267, 1224, 1223, + 1224, 1217, 1206, 1219, 1222, 1217, 1218, 1215, 1214, 1217, + 1212, 1253, 1252, 1202, 1192, 1200, 1248, 1683, 1247, 1196, + 1188, 1189, 1202, 1189, 1200, 1683, 1188, 1197, 1196, 1196, + 1236, 1179, 1188, 1181, 1192, 1169, 1173, 1224, 1171, 1181, + 1221, 1168, 1219, 560, 562, 1161, 1171, 559, 1683, 1221, + 1179, 1162, 1167, 1171, 1161, 1173, 1176, 1213, 1683, 1207, + 583, 1160, 1168, 1167, 1162, 1158, 1165, 1148, 1151, 1147, + 1164, 1159, 1147, 1143, 1150, 1144, 1196, 1153, 1141, 1155, - 1172, 1167, 1155, 1151, 1158, 1152, 1204, 1161, 1149, 1163, - 1158, 1158, 1149, 1699, 1157, 1155, 1146, 1155, 90, 260, - 279, 288, 315, 352, 476, 475, 493, 497, 1699, 1699, - 542, 557, 568, 1699, 1699, 571, 561, 555, 591, 567, - 615, 568, 617, 575, 632, 1699, 580, 584, 586, 580, - 638, 593, 583, 579, 592, 603, 598, 599, 599, 601, - 602, 602, 604, 657, 616, 621, 598, 1699, 656, 616, - 606, 621, 622, 609, 623, 1699, 642, 650, 630, 620, - 667, 632, 636, 675, 630, 625, 626, 622, 631, 626, - 682, 641, 632, 1699, 634, 645, 630, 637, 647, 648, + 1150, 1150, 1141, 1683, 1149, 1147, 1138, 1147, 1143, 1184, + 1126, 1126, 1139, 1124, 1179, 1121, 7, 1683, 1683, 86, + 218, 390, 1683, 1683, 410, 522, 538, 576, 546, 607, + 564, 614, 565, 621, 1683, 574, 578, 580, 574, 632, + 587, 577, 573, 586, 597, 592, 594, 588, 590, 591, + 591, 593, 646, 605, 610, 587, 1683, 645, 605, 595, + 610, 611, 598, 612, 1683, 631, 639, 619, 609, 656, + 621, 625, 664, 619, 614, 615, 611, 620, 615, 671, + 630, 621, 1683, 623, 634, 619, 626, 636, 637, 631, + 677, 645, 630, 631, 1683, 649, 632, 689, 634, 1683, - 642, 688, 656, 641, 642, 1699, 660, 643, 700, 645, - 1699, 660, 665, 645, 664, 702, 662, 652, 670, 669, - 655, 670, 662, 669, 659, 677, 662, 1699, 670, 676, - 671, 722, 1699, 673, 678, 672, 684, 678, 677, 679, - 731, 677, 677, 734, 680, 1699, 679, 687, 685, 684, - 689, 699, 700, 705, 744, 703, 719, 724, 698, 708, - 699, 751, 696, 1699, 703, 708, 715, 757, 758, 707, - 1699, 703, 706, 705, 725, 722, 708, 716, 729, 730, - 716, 724, 733, 713, 734, 776, 1699, 731, 778, 779, - 729, 742, 744, 733, 729, 736, 787, 736, 734, 752, + 653, 633, 651, 690, 650, 640, 658, 657, 643, 658, + 650, 657, 647, 665, 650, 1683, 658, 664, 659, 710, + 1683, 661, 666, 660, 672, 666, 665, 667, 719, 665, + 665, 722, 668, 1683, 667, 675, 673, 672, 677, 687, + 688, 693, 732, 691, 707, 712, 686, 696, 687, 739, + 684, 1683, 691, 696, 703, 744, 746, 695, 1683, 691, + 694, 693, 713, 710, 696, 704, 717, 718, 704, 712, + 721, 701, 722, 764, 1683, 719, 766, 767, 729, 731, + 719, 716, 723, 774, 723, 721, 739, 778, 730, 729, + 735, 733, 731, 784, 785, 781, 741, 1683, 746, 739, - 791, 743, 742, 748, 746, 744, 797, 798, 794, 754, - 1699, 759, 752, 761, 749, 759, 755, 768, 1699, 751, - 752, 1699, 753, 751, 770, 771, 772, 771, 755, 760, - 778, 1699, 768, 801, 792, 764, 823, 786, 1699, 769, - 784, 776, 780, 1699, 1699, 790, 825, 774, 827, 776, - 834, 830, 798, 781, 792, 784, 790, 786, 804, 806, - 1699, 804, 1699, 806, 1699, 790, 810, 801, 794, 806, - 848, 1699, 805, 855, 856, 1699, 857, 801, 807, 814, - 856, 1699, 1699, 806, 806, 809, 823, 810, 867, 826, - 864, 818, 871, 821, 873, 822, 875, 876, 837, 878, + 748, 736, 746, 742, 755, 1683, 738, 739, 1683, 740, + 738, 757, 758, 759, 758, 742, 747, 765, 1683, 755, + 788, 779, 751, 810, 773, 1683, 756, 771, 763, 767, + 1683, 1683, 777, 812, 761, 814, 763, 821, 817, 785, + 768, 779, 771, 777, 773, 791, 793, 1683, 791, 1683, + 793, 1683, 796, 786, 780, 792, 834, 1683, 791, 841, + 842, 1683, 843, 787, 793, 800, 842, 1683, 1683, 792, + 792, 795, 809, 796, 853, 812, 850, 804, 857, 807, + 859, 808, 861, 862, 823, 864, 808, 820, 825, 811, + 841, 870, 830, 1683, 822, 873, 822, 818, 834, 839, - 822, 834, 839, 825, 855, 884, 844, 1699, 836, 887, - 836, 832, 848, 853, 835, 893, 848, 853, 1699, 856, - 846, 856, 849, 858, 859, 856, 846, 848, 905, 854, - 851, 852, 909, 905, 849, 864, 914, 1699, 1699, 1699, - 873, 865, 875, 860, 861, 922, 923, 869, 925, 1699, - 875, 877, 928, 872, 1699, 893, 1699, 877, 1699, 1699, - 884, 1699, 934, 885, 936, 937, 919, 1699, 897, 898, - 1699, 886, 885, 888, 888, 889, 885, 1699, 907, 893, - 901, 910, 896, 911, 911, 914, 914, 911, 916, 1699, - 908, 960, 920, 1699, 917, 922, 923, 920, 1699, 912, + 821, 879, 834, 839, 1683, 842, 832, 842, 835, 844, + 845, 842, 832, 834, 891, 840, 837, 894, 890, 833, + 850, 898, 1683, 1683, 1683, 858, 850, 860, 845, 846, + 905, 908, 854, 910, 1683, 860, 862, 913, 856, 1683, + 878, 1683, 862, 1683, 1683, 869, 1683, 919, 870, 921, + 922, 904, 1683, 882, 883, 1683, 871, 870, 873, 873, + 874, 870, 1683, 892, 878, 886, 895, 881, 896, 896, + 899, 899, 896, 901, 1683, 893, 903, 1683, 901, 906, + 907, 904, 1683, 896, 896, 902, 901, 912, 1683, 1683, + 951, 1683, 900, 906, 1683, 908, 910, 913, 924, 1683, - 912, 918, 917, 928, 1699, 1699, 967, 1699, 916, 922, - 1699, 924, 926, 929, 940, 1699, 937, 1699, 934, 1699, - 957, 977, 983, 984, 928, 986, 987, 942, 936, 990, - 991, 954, 993, 989, 954, 950, 992, 942, 947, 1000, - 958, 1699, 1002, 962, 1004, 967, 956, 964, 1009, 953, - 970, 969, 953, 1009, 974, 975, 975, 962, 973, 1020, - 980, 993, 980, 1699, 1699, 1024, 1699, 1699, 973, 984, - 1699, 1699, 971, 1699, 975, 1024, 969, 974, 1032, 982, - 1699, 988, 1699, 1035, 1699, 980, 995, 1000, 1699, 1034, - 1002, 995, 1004, 992, 1002, 1045, 1046, 1047, 998, 1699, + 921, 1683, 918, 1683, 941, 961, 967, 968, 912, 970, + 971, 926, 920, 974, 975, 938, 977, 973, 938, 934, + 976, 926, 931, 984, 942, 986, 946, 988, 951, 940, + 948, 993, 937, 954, 953, 937, 993, 958, 959, 959, + 946, 957, 1004, 964, 977, 964, 1683, 1683, 1008, 1683, + 1683, 957, 968, 1683, 1683, 955, 1683, 959, 1008, 953, + 958, 1016, 966, 1683, 972, 1683, 1019, 1683, 964, 979, + 984, 1683, 1018, 986, 979, 988, 976, 986, 1029, 1030, + 1031, 982, 1683, 1033, 1035, 982, 1683, 986, 1038, 983, + 985, 984, 1042, 997, 1683, 1039, 1001, 1683, 1004, 1047, - 1049, 1051, 998, 1699, 1002, 1054, 999, 1001, 1000, 1058, - 1013, 1699, 1055, 1017, 1699, 1020, 1063, 1024, 1007, 1009, - 1006, 1022, 1031, 1070, 1699, 1699, 1699, 1066, 1699, 1699, - 1031, 1068, 1699, 1032, 1023, 1030, 1699, 1027, 1032, 1079, - 1024, 1699, 1039, 1029, 1041, 1084, 1028, 1036, 1699, 1047, - 1037, 1036, 1034, 1051, 1042, 1051, 1053, 1699, 1095, 1096, - 1056, 1098, 1699, 1094, 1058, 1039, 1102, 1061, 1104, 1063, - 1064, 1107, 1066, 1699, 1699, 1071, 1699, 1053, 1111, 1072, - 1699, 1058, 1699, 1058, 1060, 1699, 1065, 1060, 1072, 1699, - 1070, 1074, 1065, 1117, 1066, 1082, 1075, 1084, 1075, 1082, + 1008, 991, 993, 990, 1006, 1015, 1054, 1683, 1683, 1683, + 1050, 1683, 1683, 1015, 1052, 1683, 1016, 1007, 1014, 1683, + 1011, 1016, 1063, 1008, 1683, 1023, 1013, 1025, 1068, 1012, + 1020, 1683, 1031, 1021, 1020, 1018, 1035, 1026, 1035, 1037, + 1683, 1079, 1080, 1040, 1082, 1683, 1078, 1042, 1023, 1086, + 1045, 1088, 1047, 1048, 1091, 1050, 1683, 1683, 1055, 1683, + 1037, 1095, 1056, 1683, 1042, 1683, 1042, 1044, 1683, 1049, + 1044, 1056, 1683, 1054, 1058, 1049, 1101, 1050, 1066, 1059, + 1068, 1059, 1066, 1053, 1068, 1115, 1074, 1061, 1077, 1068, + 1082, 1078, 1683, 1122, 1123, 1124, 1081, 1080, 1081, 1683, - 1069, 1084, 1131, 1090, 1077, 1093, 1084, 1098, 1094, 1699, - 1138, 1139, 1140, 1097, 1096, 1097, 1699, 1699, 1699, 1144, - 1088, 1104, 1699, 1142, 1093, 1092, 1094, 1105, 1152, 1103, - 1699, 1112, 1155, 1699, 1699, 1161, 1166, 1171, 1176, 1181, - 1186, 1191, 1194, 1168, 1173, 1175, 1188 + 1683, 1683, 1128, 1072, 1088, 1683, 1126, 1077, 1076, 1078, + 1089, 1136, 1087, 1683, 1096, 1139, 1683, 1683, 1145, 1150, + 1155, 1160, 1165, 1170, 1175, 1178, 1152, 1157, 1159, 1172 } ; -static const flex_int16_t yy_def[1348] = +static const flex_int16_t yy_def[1331] = { 0, - 1336, 1336, 1337, 1337, 1336, 1336, 1336, 1336, 1336, 1336, - 1335, 1335, 1335, 1335, 1335, 1338, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1339, - 1335, 1335, 1335, 1340, 15, 1335, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1341, 45, 45, + 1319, 1319, 1320, 1320, 1319, 1319, 1319, 1319, 1319, 1319, + 1318, 1318, 1318, 1318, 1318, 1321, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1322, + 1318, 1318, 1318, 1323, 15, 1318, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1324, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1338, - 1335, 1335, 1335, 1335, 1335, 1335, 1342, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1339, 1335, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1321, + 1318, 1318, 1318, 1318, 1318, 1318, 1325, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1322, 1318, - 1340, 1335, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1343, 45, 1341, 45, 45, + 1323, 1318, 1318, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 1324, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1342, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1344, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1343, - - 1335, 1341, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1345, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - - 45, 1335, 45, 1341, 1335, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, - 45, 1335, 1335, 1335, 1346, 45, 45, 45, 45, 45, - - 45, 45, 45, 1335, 45, 45, 1335, 45, 1341, 45, - 45, 45, 45, 45, 1335, 45, 45, 45, 45, 1335, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, - 1335, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 1335, 45, 45, 1335, 45, 45, - - 1335, 1347, 45, 45, 45, 45, 1335, 1335, 45, 1335, - 45, 1335, 45, 45, 45, 1335, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 1335, 45, 45, - - 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1325, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1326, 1318, 1324, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1335, 1335, - 45, 45, 45, 1335, 1335, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1328, 45, 45, 45, + 45, 45, 45, 45, 45, 1318, 45, 1318, 45, 1324, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, - 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, - 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 1318, 1318, 1318, 1329, 45, + 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, + + 1318, 45, 1324, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 1318, 45, 45, 45, 45, 45, 1318, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1318, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1318, 1318, 45, 45, 1318, + 45, 45, 1318, 1330, 45, 45, 45, 45, 1318, 1318, + + 45, 1318, 45, 1318, 45, 45, 45, 1318, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1318, 45, 45, 1318, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 1318, 45, + 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1335, 45, 45, 45, 45, 45, 45, 45, 1335, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 1335, 45, - 45, 45, 45, 1335, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1335, 45, 1335, 45, 1335, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 1335, 45, 45, 45, 45, - 45, 1335, 1335, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, + 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1335, 45, + 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1318, 1318, 45, + 45, 45, 1318, 1318, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 1335, 1335, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 45, 45, 45, 1335, 45, 1335, 45, 1335, 1335, - 45, 1335, 45, 45, 45, 45, 45, 1335, 45, 45, - 1335, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 45, 45, 1335, 45, 45, 45, 45, 1335, 45, + 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 1318, - 45, 45, 45, 45, 1335, 1335, 45, 1335, 45, 45, - 1335, 45, 45, 45, 45, 1335, 45, 1335, 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1318, 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 1335, 45, 1335, 1335, 45, 45, - 1335, 1335, 45, 1335, 45, 45, 45, 45, 45, 45, - 1335, 45, 1335, 45, 1335, 45, 45, 45, 1335, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, - 45, 45, 45, 1335, 45, 45, 45, 45, 45, 45, - 45, 1335, 45, 45, 1335, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1335, 1335, 1335, 45, 1335, 1335, - 45, 45, 1335, 45, 45, 45, 1335, 45, 45, 45, - 45, 1335, 45, 45, 45, 45, 45, 45, 1335, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 45, 45, - 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1335, 1335, 45, 1335, 45, 45, 45, - 1335, 45, 1335, 45, 45, 1335, 45, 45, 45, 1335, + 45, 45, 45, 45, 45, 1318, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, + 1318, 1318, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1318, 45, 1318, + 45, 1318, 45, 45, 45, 45, 45, 1318, 45, 45, + 45, 1318, 45, 45, 45, 45, 45, 1318, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1335, - 45, 45, 45, 45, 45, 45, 1335, 1335, 1335, 45, - 45, 45, 1335, 45, 45, 45, 45, 45, 45, 45, - 1335, 45, 45, 1335, 0, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335 + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 1318, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 1318, + 45, 1318, 45, 1318, 1318, 45, 1318, 45, 45, 45, + 45, 45, 1318, 45, 45, 1318, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 1318, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 1318, 1318, + 45, 1318, 45, 45, 1318, 45, 45, 45, 45, 1318, + + 45, 1318, 45, 1318, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1318, 1318, 45, 1318, + 1318, 45, 45, 1318, 1318, 45, 1318, 45, 45, 45, + 45, 45, 45, 1318, 45, 1318, 45, 1318, 45, 45, + 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 1318, 45, 45, 45, + 45, 45, 45, 45, 1318, 45, 45, 1318, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 1318, 1318, 1318, + 45, 1318, 1318, 45, 45, 1318, 45, 45, 45, 1318, + 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, + 1318, 45, 45, 45, 45, 1318, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1318, 1318, 45, 1318, + 45, 45, 45, 1318, 45, 1318, 45, 45, 1318, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1318, 45, 45, 45, 45, 45, 45, 1318, + + 1318, 1318, 45, 45, 45, 1318, 45, 45, 45, 45, + 45, 45, 45, 1318, 45, 45, 1318, 0, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318 } ; -static const flex_int16_t yy_nxt[1771] = +static const flex_int16_t yy_nxt[1755] = { 0, - 1335, 13, 14, 13, 1335, 15, 16, 1335, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 86, 679, - 37, 14, 37, 87, 25, 26, 38, 1335, 680, 27, + 1318, 13, 14, 13, 1318, 15, 16, 1318, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 86, 669, + 37, 14, 37, 87, 25, 26, 38, 1318, 670, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, - 13, 14, 13, 13, 14, 13, 32, 40, 143, 13, - 14, 13, 33, 40, 115, 92, 93, 144, 91, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 1318, 13, + 14, 13, 33, 40, 115, 92, 93, 802, 91, 34, 35, 13, 14, 13, 95, 15, 16, 96, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 109, 39, 91, 25, 26, 13, 14, 13, 27, 39, 85, 85, 85, 28, 42, 41, 42, 42, 29, 42, 30, 83, 108, 41, 111, 94, 25, 31, 109, - 209, 164, 89, 138, 89, 165, 32, 90, 90, 90, - 210, 139, 33, 214, 215, 83, 108, 805, 111, 34, + 207, 162, 89, 138, 89, 163, 32, 90, 90, 90, + 208, 139, 33, 212, 213, 83, 108, 803, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 45, 45, 45, 45, 48, 45, 49, 50, 45, 51, 45, 52, 53, @@ -1226,186 +1220,185 @@ static const flex_int16_t yy_nxt[1771] = 74, 75, 76, 77, 78, 79, 57, 45, 45, 45, 45, 45, 81, 105, 82, 82, 82, 81, 114, 84, 84, 84, 102, 105, 81, 83, 84, 84, 84, 108, - 83, 181, 122, 112, 140, 123, 179, 83, 124, 105, - 125, 114, 126, 113, 141, 181, 142, 132, 83, 119, - 160, 180, 108, 83, 161, 120, 112, 103, 133, 181, - 83, 45, 179, 136, 162, 806, 134, 45, 135, 45, - 45, 113, 45, 184, 45, 45, 45, 180, 117, 145, - 146, 45, 45, 147, 45, 45, 90, 90, 90, 148, + 83, 179, 122, 112, 140, 123, 177, 83, 124, 105, + 125, 114, 126, 113, 141, 179, 142, 132, 83, 119, + 158, 178, 108, 83, 159, 120, 112, 103, 133, 179, + 83, 45, 177, 136, 160, 804, 134, 45, 135, 45, + 45, 113, 45, 182, 45, 45, 45, 178, 117, 144, + 145, 45, 45, 146, 45, 45, 90, 90, 90, 147, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 179, 149, 193, 45, 127, 150, - 102, 45, 128, 111, 371, 129, 130, 372, 114, 45, - 90, 90, 90, 45, 180, 45, 118, 155, 131, 151, - 182, 807, 152, 193, 153, 156, 154, 157, 112, 808, - 166, 174, 158, 159, 167, 103, 227, 168, 113, 228, - 183, 175, 809, 229, 169, 170, 176, 85, 85, 85, - 171, 112, 81, 172, 82, 82, 82, 89, 83, 89, - 192, 101, 90, 90, 90, 83, 113, 81, 101, 84, - 84, 84, 196, 173, 85, 85, 85, 189, 195, 197, + 45, 45, 45, 45, 102, 148, 222, 45, 127, 149, + 256, 45, 128, 111, 191, 129, 130, 257, 218, 45, + 219, 114, 223, 45, 177, 45, 118, 154, 131, 150, + 112, 164, 151, 187, 152, 165, 153, 155, 166, 103, + 113, 191, 156, 157, 172, 167, 168, 85, 85, 85, + 180, 169, 193, 112, 173, 170, 249, 250, 83, 174, + 81, 187, 82, 82, 82, 89, 178, 89, 113, 190, + 90, 90, 90, 83, 81, 171, 84, 84, 84, 101, + 193, 83, 85, 85, 85, 194, 101, 83, 90, 90, - 83, 83, 198, 253, 254, 83, 192, 199, 83, 220, - 240, 221, 286, 810, 241, 224, 101, 189, 256, 196, - 101, 257, 258, 83, 101, 189, 195, 197, 83, 198, - 199, 225, 101, 195, 203, 286, 101, 260, 101, 187, - 202, 202, 202, 262, 261, 204, 286, 202, 202, 202, - 202, 202, 202, 198, 271, 284, 285, 284, 272, 389, - 285, 246, 273, 247, 296, 293, 297, 299, 303, 289, - 202, 202, 202, 202, 202, 202, 263, 264, 265, 301, - 280, 811, 285, 284, 293, 287, 288, 266, 293, 267, - 299, 268, 296, 297, 269, 303, 343, 299, 355, 392, + 90, 195, 181, 83, 196, 190, 83, 197, 187, 225, + 237, 193, 226, 267, 238, 252, 227, 268, 253, 254, + 83, 269, 194, 280, 101, 201, 83, 196, 101, 195, + 197, 196, 101, 805, 280, 281, 202, 281, 293, 243, + 101, 244, 258, 282, 101, 282, 101, 185, 200, 200, + 200, 280, 383, 806, 276, 200, 200, 200, 200, 200, + 200, 281, 283, 284, 289, 293, 282, 292, 285, 295, + 299, 297, 338, 289, 390, 259, 260, 261, 200, 200, + 200, 200, 200, 200, 391, 308, 262, 289, 263, 295, + 264, 309, 295, 265, 297, 292, 302, 299, 300, 300, - 312, 392, 301, 304, 304, 304, 313, 306, 396, 390, - 304, 304, 304, 304, 304, 304, 398, 403, 397, 398, - 350, 406, 392, 423, 393, 417, 812, 424, 451, 452, - 400, 401, 356, 304, 304, 304, 304, 304, 304, 402, - 403, 471, 418, 406, 458, 398, 357, 344, 410, 406, - 345, 409, 409, 409, 459, 813, 533, 814, 409, 409, - 409, 409, 409, 409, 437, 498, 505, 505, 534, 438, - 499, 460, 513, 526, 514, 537, 605, 606, 690, 656, - 538, 409, 409, 409, 409, 409, 409, 601, 527, 691, - 692, 759, 607, 815, 505, 515, 696, 472, 760, 513, + 300, 349, 384, 411, 386, 300, 300, 300, 300, 300, + 300, 365, 345, 386, 366, 392, 394, 395, 397, 400, + 412, 444, 445, 339, 392, 396, 340, 386, 300, 300, + 300, 300, 300, 300, 417, 350, 387, 431, 418, 400, + 463, 397, 432, 490, 392, 451, 497, 400, 491, 351, + 403, 403, 403, 404, 518, 452, 525, 403, 403, 403, + 403, 403, 403, 505, 596, 506, 497, 453, 526, 519, + 529, 592, 597, 646, 497, 530, 598, 682, 681, 807, + 403, 403, 403, 403, 403, 403, 680, 683, 433, 686, + 505, 596, 506, 434, 507, 687, 464, 45, 45, 45, - 693, 514, 697, 605, 816, 606, 690, 766, 778, 761, - 762, 817, 691, 767, 818, 439, 657, 763, 819, 820, - 440, 45, 45, 45, 823, 824, 825, 826, 45, 45, - 45, 45, 45, 45, 821, 827, 778, 828, 822, 829, - 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, - 840, 45, 45, 45, 45, 45, 45, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 878, 879, 880, 858, 881, 882, + 597, 681, 808, 811, 45, 45, 45, 45, 45, 45, + 647, 748, 750, 751, 680, 755, 767, 812, 749, 809, + 752, 756, 813, 810, 814, 815, 816, 45, 45, 45, + 45, 45, 45, 817, 818, 819, 820, 821, 822, 823, + 824, 825, 826, 827, 767, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, 867, 868, 846, 869, 870, 845, + 871, 872, 873, 874, 875, 878, 879, 880, 881, 876, - 857, 883, 884, 885, 886, 887, 890, 891, 892, 893, - 888, 894, 895, 896, 897, 898, 899, 900, 901, 902, - 903, 904, 905, 907, 908, 909, 910, 911, 912, 913, - 914, 915, 916, 906, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, - 933, 934, 936, 935, 937, 938, 939, 940, 941, 942, - 943, 889, 944, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, 934, - 935, 961, 962, 963, 965, 966, 967, 968, 964, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 894, 895, 896, 897, 898, 899, 900, 901, 902, + 903, 893, 904, 905, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 923, 922, 924, 925, 926, 927, 928, 929, 930, 931, + 877, 932, 933, 934, 935, 936, 937, 938, 939, 940, + 941, 942, 943, 944, 945, 946, 947, 921, 922, 948, + 949, 950, 952, 953, 954, 955, 951, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1005, 1028, - 1029, 1030, 1031, 1032, 1006, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 1049, 1050, 1051, 1052, 1054, 1055, 1056, 1057, 1058, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1013, 991, 1014, 1015, 1016, 1017, + 1018, 992, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, + 1037, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, - 1069, 1070, 1071, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, - 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, - 1090, 1091, 1092, 1093, 1094, 1095, 1067, 1096, 1097, 1099, - 1100, 1101, 1102, 1103, 1104, 1053, 1098, 1105, 1106, 1107, - 1108, 1109, 1110, 1111, 1072, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1120, 1121, 1122, 1123, 1119, 1124, 1125, 1126, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1137, 1138, 1139, 1140, 1141, 1142, 1121, 1143, 1144, 1145, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, - 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, + 1079, 1080, 1052, 1083, 1081, 1084, 1085, 1086, 1087, 1088, + 1089, 1038, 1082, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1057, 1097, 1098, 1099, 1100, 1101, 1102, 1104, 1105, 1106, + 1107, 1103, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, + 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1105, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, + 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1145, 1172, 1173, - 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, - 1186, 1187, 1188, 1162, 1189, 1190, 1191, 1192, 1193, 1194, - 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, - 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, - 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, - 1225, 1226, 1227, 1228, 1229, 1202, 1230, 1231, 1232, 1233, - 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, - 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, - 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, - 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, + 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1185, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, + 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, - 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, - 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, - 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, - 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, - 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, - 1334, 12, 12, 12, 12, 12, 36, 36, 36, 36, - 36, 80, 291, 80, 80, 80, 99, 395, 99, 502, - 99, 101, 101, 101, 101, 101, 116, 116, 116, 116, - 116, 178, 101, 178, 178, 178, 200, 200, 200, 804, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, + 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, + 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, + 1313, 1314, 1315, 1316, 1317, 12, 12, 12, 12, 12, + 36, 36, 36, 36, 36, 80, 287, 80, 80, 80, + 99, 389, 99, 494, 99, 101, 101, 101, 101, 101, + 116, 116, 116, 116, 116, 176, 101, 176, 176, 176, + 198, 198, 198, 801, 800, 799, 798, 797, 796, 795, + 794, 793, 792, 791, 790, 789, 788, 787, 786, 785, - 803, 802, 801, 800, 799, 798, 797, 796, 795, 794, - 793, 792, 791, 790, 789, 788, 787, 786, 785, 784, - 783, 782, 781, 780, 779, 777, 776, 775, 774, 773, - 772, 771, 770, 769, 768, 765, 764, 758, 757, 756, - 755, 754, 753, 752, 751, 750, 749, 748, 747, 746, - 745, 744, 743, 742, 741, 740, 739, 738, 737, 736, - 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, - 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, - 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, - 705, 704, 703, 702, 701, 700, 699, 698, 695, 694, + 784, 783, 782, 781, 780, 779, 778, 777, 776, 775, + 774, 773, 772, 771, 770, 769, 768, 766, 765, 764, + 763, 762, 761, 760, 759, 758, 757, 754, 753, 747, + 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, + 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, + 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, + 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, + 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, + 696, 695, 694, 693, 692, 691, 690, 689, 688, 685, + 684, 679, 678, 677, 676, 675, 674, 673, 672, 671, - 689, 688, 687, 686, 685, 684, 683, 682, 681, 678, - 677, 676, 675, 674, 673, 672, 671, 670, 669, 668, - 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, - 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, - 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, - 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, - 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 615, 614, 613, 612, 611, 610, 609, 608, 604, 603, - 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, - 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, + 668, 667, 666, 665, 664, 663, 662, 661, 660, 659, + 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, + 648, 645, 644, 643, 642, 641, 640, 639, 638, 637, + 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, + 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, + 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, + 606, 605, 604, 603, 602, 601, 600, 599, 595, 594, + 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, + 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, + 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, - 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, - 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, - 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, - 542, 541, 540, 539, 536, 535, 532, 531, 530, 529, - 528, 525, 524, 523, 522, 521, 520, 519, 518, 517, - 516, 512, 511, 510, 509, 508, 507, 506, 504, 503, - 501, 500, 497, 496, 495, 494, 493, 492, 491, 490, - 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, - 479, 478, 477, 476, 475, 474, 473, 470, 469, 468, + 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, + 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, + 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, + 533, 532, 531, 528, 527, 524, 523, 522, 521, 520, + 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, + 504, 503, 502, 501, 500, 499, 498, 496, 495, 493, + 492, 489, 488, 487, 486, 485, 484, 483, 482, 481, + 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, + 470, 469, 468, 467, 466, 465, 462, 461, 460, 459, + 458, 457, 456, 455, 454, 450, 449, 448, 447, 446, - 467, 466, 465, 464, 463, 462, 461, 457, 456, 455, - 454, 453, 450, 449, 448, 447, 446, 445, 444, 443, - 442, 441, 436, 435, 434, 433, 432, 431, 430, 429, - 428, 427, 426, 425, 422, 421, 420, 419, 416, 415, - 414, 413, 412, 411, 408, 407, 405, 404, 399, 394, - 391, 388, 387, 386, 385, 384, 383, 382, 381, 380, - 379, 378, 377, 376, 375, 374, 373, 370, 369, 368, - 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, - 354, 353, 352, 351, 349, 348, 347, 346, 342, 341, - 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, + 443, 442, 441, 440, 439, 438, 437, 436, 435, 430, + 429, 428, 427, 426, 425, 424, 423, 422, 421, 420, + 419, 416, 415, 414, 413, 410, 409, 408, 407, 406, + 405, 402, 401, 399, 398, 393, 388, 385, 382, 381, + 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, + 370, 369, 368, 367, 364, 363, 362, 361, 360, 359, + 358, 357, 356, 355, 354, 353, 352, 348, 347, 346, + 344, 343, 342, 341, 337, 336, 335, 334, 333, 332, + 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, + 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, - 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 319, 318, 317, 316, 315, 314, 311, 310, 309, - 308, 307, 305, 201, 302, 300, 298, 295, 294, 292, - 290, 283, 282, 281, 279, 278, 277, 276, 275, 274, - 270, 259, 255, 252, 251, 250, 249, 248, 245, 244, - 243, 242, 239, 238, 237, 236, 235, 234, 233, 232, - 231, 230, 226, 223, 222, 219, 218, 217, 216, 213, - 212, 211, 208, 207, 206, 205, 201, 194, 191, 190, - 188, 186, 185, 177, 163, 137, 121, 110, 107, 106, - 104, 43, 100, 98, 97, 88, 43, 1335, 11, 1335, + 311, 310, 307, 306, 305, 304, 303, 301, 199, 298, + 296, 294, 291, 290, 288, 286, 279, 278, 277, 275, + 274, 273, 272, 271, 270, 266, 255, 251, 248, 247, + 246, 245, 242, 241, 240, 239, 236, 235, 234, 233, + 232, 231, 230, 229, 228, 224, 221, 220, 217, 216, + 215, 214, 211, 210, 209, 206, 205, 204, 203, 199, + 192, 189, 188, 186, 184, 183, 175, 161, 143, 137, + 121, 110, 107, 106, 104, 43, 100, 98, 97, 88, + 43, 1318, 11, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335 + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318 } ; -static const flex_int16_t yy_chk[1771] = +static const flex_int16_t yy_chk[1755] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 593, - 3, 3, 3, 21, 1, 1, 3, 0, 593, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 584, + 3, 3, 3, 21, 1, 1, 3, 0, 584, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, - 6, 6, 6, 7, 7, 7, 1, 7, 68, 8, - 8, 8, 1, 8, 57, 27, 28, 68, 26, 1, + 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, + 8, 8, 1, 8, 57, 27, 28, 717, 26, 1, 1, 2, 2, 2, 32, 2, 2, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 52, 5, 31, 2, 2, 10, 10, 10, 2, @@ -1413,7 +1406,7 @@ static const flex_int16_t yy_chk[1771] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 124, 75, 25, 66, 25, 75, 2, 25, 25, 25, - 124, 66, 2, 128, 128, 20, 51, 719, 54, 2, + 124, 66, 2, 128, 128, 20, 51, 720, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1427,172 +1420,171 @@ static const flex_int16_t yy_chk[1771] = 19, 93, 61, 55, 67, 61, 91, 22, 61, 48, 61, 56, 61, 55, 67, 96, 67, 63, 17, 59, 73, 92, 64, 19, 73, 59, 55, 44, 63, 93, - 22, 45, 91, 64, 73, 720, 63, 45, 63, 45, + 22, 45, 91, 64, 73, 721, 63, 45, 63, 45, 45, 55, 45, 96, 45, 45, 45, 92, 58, 69, 69, 45, 45, 69, 45, 58, 89, 89, 89, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 58, 94, 70, 109, 58, 62, 70, - 101, 58, 62, 71, 265, 62, 62, 265, 78, 58, - 90, 90, 90, 58, 95, 58, 58, 72, 62, 70, - 94, 721, 71, 109, 71, 72, 71, 72, 77, 722, - 76, 78, 72, 72, 76, 101, 138, 76, 77, 138, - 95, 78, 723, 138, 76, 76, 78, 81, 81, 81, - 76, 77, 82, 77, 82, 82, 82, 83, 81, 83, - 108, 103, 83, 83, 83, 82, 77, 84, 103, 84, - 84, 84, 112, 77, 85, 85, 85, 105, 111, 113, + 45, 45, 45, 58, 101, 70, 136, 58, 62, 70, + 162, 58, 62, 71, 109, 62, 62, 162, 133, 58, + 133, 78, 136, 58, 94, 58, 58, 72, 62, 70, + 77, 76, 71, 105, 71, 76, 71, 72, 76, 101, + 77, 109, 72, 72, 78, 76, 76, 81, 81, 81, + 94, 76, 111, 77, 78, 77, 158, 158, 81, 78, + 82, 105, 82, 82, 82, 83, 95, 83, 77, 108, + 83, 83, 83, 82, 84, 77, 84, 84, 84, 103, + 111, 81, 85, 85, 85, 112, 103, 84, 90, 90, - 84, 81, 114, 160, 160, 85, 108, 115, 82, 133, - 149, 133, 181, 724, 149, 136, 103, 119, 162, 112, - 103, 162, 162, 84, 103, 105, 111, 113, 85, 114, - 115, 136, 103, 154, 119, 181, 103, 164, 103, 103, - 118, 118, 118, 165, 164, 119, 184, 118, 118, 118, - 118, 118, 118, 174, 167, 179, 180, 182, 167, 282, - 183, 154, 167, 154, 192, 189, 193, 195, 199, 184, - 118, 118, 118, 118, 118, 118, 165, 165, 165, 197, - 174, 725, 180, 179, 204, 182, 183, 165, 189, 165, - 195, 165, 192, 193, 165, 199, 241, 246, 251, 284, + 90, 113, 95, 85, 114, 108, 82, 115, 119, 138, + 148, 153, 138, 165, 148, 160, 138, 165, 160, 160, + 84, 165, 112, 177, 103, 119, 85, 172, 103, 113, + 115, 114, 103, 722, 180, 178, 119, 181, 191, 153, + 103, 153, 163, 179, 103, 182, 103, 103, 118, 118, + 118, 177, 278, 725, 172, 118, 118, 118, 118, 118, + 118, 178, 180, 181, 187, 191, 179, 190, 182, 193, + 197, 195, 238, 202, 288, 163, 163, 163, 118, 118, + 118, 118, 118, 118, 288, 208, 163, 187, 163, 243, + 163, 208, 193, 163, 195, 190, 202, 197, 200, 200, - 210, 287, 197, 202, 202, 202, 210, 204, 292, 282, - 202, 202, 202, 202, 202, 202, 293, 296, 292, 306, - 246, 299, 284, 319, 287, 313, 726, 319, 343, 343, - 295, 295, 251, 202, 202, 202, 202, 202, 202, 295, - 296, 362, 313, 350, 349, 293, 251, 241, 306, 299, - 241, 304, 304, 304, 349, 727, 430, 728, 304, 304, - 304, 304, 304, 304, 332, 390, 398, 410, 430, 332, - 390, 350, 408, 423, 408, 433, 513, 514, 605, 568, - 433, 304, 304, 304, 304, 304, 304, 515, 423, 606, - 607, 674, 515, 731, 398, 410, 610, 362, 674, 408, + 200, 247, 278, 309, 280, 200, 200, 200, 200, 200, + 200, 261, 243, 283, 261, 289, 291, 291, 292, 295, + 309, 338, 338, 238, 302, 291, 238, 280, 200, 200, + 200, 200, 200, 200, 315, 247, 283, 328, 315, 345, + 356, 292, 328, 384, 289, 344, 392, 295, 384, 247, + 300, 300, 300, 302, 417, 344, 424, 300, 300, 300, + 300, 300, 300, 402, 505, 402, 404, 345, 424, 417, + 427, 507, 506, 559, 392, 427, 507, 598, 597, 726, + 300, 300, 300, 300, 300, 300, 596, 598, 328, 601, + 402, 505, 402, 328, 404, 601, 356, 403, 403, 403, - 607, 408, 610, 513, 732, 514, 605, 678, 691, 675, - 675, 733, 606, 678, 736, 332, 568, 675, 737, 738, - 332, 409, 409, 409, 740, 741, 742, 743, 409, 409, - 409, 409, 409, 409, 739, 744, 691, 745, 739, 747, - 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 409, 409, 409, 409, 409, 409, 759, 760, 761, - 762, 763, 764, 765, 766, 767, 769, 770, 771, 772, - 773, 774, 775, 777, 778, 779, 780, 781, 782, 783, - 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, - 795, 796, 797, 798, 799, 800, 801, 778, 802, 803, + 506, 597, 727, 729, 403, 403, 403, 403, 403, 403, + 559, 664, 665, 665, 596, 668, 681, 730, 664, 728, + 665, 668, 731, 728, 732, 733, 734, 403, 403, 403, + 403, 403, 403, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 681, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, + 763, 764, 766, 767, 768, 769, 770, 771, 772, 773, + 774, 775, 776, 777, 778, 779, 780, 781, 782, 784, + 785, 786, 787, 788, 789, 790, 767, 791, 792, 766, + 793, 794, 796, 797, 798, 799, 801, 802, 803, 798, - 777, 804, 805, 807, 808, 809, 810, 812, 813, 814, - 809, 815, 816, 817, 818, 819, 820, 821, 822, 823, - 824, 825, 826, 827, 829, 830, 831, 832, 834, 835, - 836, 837, 838, 826, 839, 840, 841, 842, 843, 844, - 845, 847, 848, 849, 850, 851, 852, 853, 854, 855, - 856, 857, 859, 858, 860, 861, 862, 863, 865, 866, - 867, 809, 868, 869, 870, 872, 873, 874, 875, 876, - 877, 878, 879, 880, 881, 882, 883, 884, 885, 857, - 858, 886, 888, 889, 890, 891, 892, 893, 889, 894, - 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, + 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, + 814, 815, 817, 818, 819, 820, 822, 823, 824, 825, + 826, 814, 827, 828, 829, 830, 831, 832, 833, 835, + 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, + 847, 846, 848, 849, 850, 851, 853, 854, 855, 856, + 798, 857, 858, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 845, 846, 874, + 876, 877, 878, 879, 880, 881, 877, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, + 895, 896, 897, 899, 900, 901, 902, 903, 904, 905, - 905, 906, 907, 908, 909, 910, 912, 913, 914, 915, - 916, 917, 918, 920, 921, 923, 924, 925, 926, 927, - 928, 929, 930, 931, 933, 934, 935, 936, 937, 938, - 940, 941, 942, 943, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 934, 960, - 962, 964, 966, 967, 935, 968, 969, 970, 971, 973, - 974, 975, 977, 978, 979, 980, 981, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, + 907, 908, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 920, 921, 922, 923, 924, 925, 927, 928, 929, + 930, 933, 934, 935, 936, 937, 938, 939, 940, 941, + 942, 943, 944, 945, 946, 921, 947, 949, 951, 953, + 954, 922, 955, 956, 957, 959, 960, 961, 963, 964, + 965, 966, 967, 970, 971, 972, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1018, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, - 1029, 1030, 1031, 1032, 1033, 1034, 1005, 1035, 1036, 1037, - 1041, 1042, 1043, 1044, 1045, 991, 1036, 1046, 1047, 1048, - 1049, 1051, 1052, 1053, 1010, 1054, 1056, 1058, 1061, 1063, - 1064, 1065, 1066, 1067, 1069, 1070, 1065, 1072, 1073, 1074, - 1075, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1091, 1092, 1067, 1093, 1095, 1096, - 1097, 1098, 1100, 1101, 1102, 1103, 1104, 1107, 1109, 1110, - 1112, 1113, 1114, 1115, 1117, 1119, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1019, 1020, 991, 1022, 1021, 1026, 1027, 1028, 1029, 1030, + 1031, 977, 1021, 1032, 1033, 1034, 1036, 1037, 1038, 1039, + 996, 1041, 1043, 1046, 1048, 1049, 1050, 1051, 1052, 1054, + 1055, 1050, 1057, 1058, 1059, 1060, 1061, 1062, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1076, + 1077, 1052, 1079, 1080, 1081, 1082, 1084, 1085, 1086, 1087, + 1088, 1091, 1093, 1094, 1096, 1097, 1098, 1099, 1101, 1103, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1105, 1132, 1133, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, 1145, - 1146, 1147, 1148, 1121, 1149, 1150, 1151, 1152, 1153, 1154, - 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1166, - 1169, 1170, 1173, 1175, 1176, 1177, 1178, 1179, 1180, 1182, - 1184, 1186, 1187, 1188, 1190, 1191, 1192, 1193, 1194, 1195, - 1196, 1197, 1198, 1199, 1201, 1162, 1202, 1203, 1205, 1206, - 1207, 1208, 1209, 1210, 1211, 1213, 1214, 1216, 1217, 1218, - 1219, 1220, 1221, 1222, 1223, 1224, 1228, 1231, 1232, 1234, - 1235, 1236, 1238, 1239, 1240, 1241, 1243, 1244, 1245, 1246, - 1247, 1248, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1149, 1152, 1153, 1156, 1158, 1159, 1160, + 1161, 1162, 1163, 1165, 1167, 1169, 1170, 1171, 1173, 1174, + 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1145, + 1185, 1186, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1196, + 1197, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, + 1211, 1214, 1215, 1217, 1218, 1219, 1221, 1222, 1223, 1224, + 1226, 1227, 1228, 1229, 1230, 1231, 1233, 1234, 1235, 1236, + 1237, 1238, 1239, 1240, 1242, 1243, 1244, 1245, 1247, 1248, + 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1259, 1261, - 1259, 1260, 1261, 1262, 1264, 1265, 1266, 1267, 1268, 1269, - 1270, 1271, 1272, 1273, 1276, 1278, 1279, 1280, 1282, 1284, - 1285, 1287, 1288, 1289, 1291, 1292, 1293, 1294, 1295, 1296, - 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, - 1307, 1308, 1309, 1311, 1312, 1313, 1314, 1315, 1316, 1320, - 1321, 1322, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1332, - 1333, 1336, 1336, 1336, 1336, 1336, 1337, 1337, 1337, 1337, - 1337, 1338, 1344, 1338, 1338, 1338, 1339, 1345, 1339, 1346, - 1339, 1340, 1340, 1340, 1340, 1340, 1341, 1341, 1341, 1341, - 1341, 1342, 1347, 1342, 1342, 1342, 1343, 1343, 1343, 718, + 1262, 1263, 1265, 1267, 1268, 1270, 1271, 1272, 1274, 1275, + 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, + 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1294, 1295, 1296, + 1297, 1298, 1299, 1303, 1304, 1305, 1307, 1308, 1309, 1310, + 1311, 1312, 1313, 1315, 1316, 1319, 1319, 1319, 1319, 1319, + 1320, 1320, 1320, 1320, 1320, 1321, 1327, 1321, 1321, 1321, + 1322, 1328, 1322, 1329, 1322, 1323, 1323, 1323, 1323, 1323, + 1324, 1324, 1324, 1324, 1324, 1325, 1330, 1325, 1325, 1325, + 1326, 1326, 1326, 716, 715, 714, 713, 712, 711, 710, + 709, 708, 707, 706, 705, 703, 702, 701, 700, 699, - 717, 716, 715, 713, 712, 711, 710, 709, 708, 707, - 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, - 696, 695, 694, 693, 692, 690, 688, 687, 686, 685, - 684, 683, 682, 681, 680, 677, 676, 673, 672, 671, - 670, 669, 668, 667, 666, 665, 664, 663, 662, 661, - 660, 659, 658, 657, 655, 654, 653, 652, 651, 650, - 649, 647, 646, 645, 644, 643, 642, 641, 640, 639, - 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, - 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, - 618, 617, 616, 615, 614, 613, 612, 611, 609, 608, + 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, + 688, 687, 686, 685, 684, 683, 682, 680, 678, 677, + 676, 675, 674, 673, 672, 671, 670, 667, 666, 663, + 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, + 652, 651, 650, 649, 648, 647, 645, 644, 643, 642, + 641, 640, 639, 637, 636, 635, 634, 633, 632, 631, + 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, + 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, + 610, 609, 608, 607, 606, 605, 604, 603, 602, 600, + 599, 595, 594, 593, 591, 590, 588, 587, 586, 585, - 604, 603, 602, 600, 599, 597, 596, 595, 594, 591, - 590, 589, 588, 587, 586, 585, 584, 583, 581, 580, - 579, 578, 577, 576, 575, 574, 572, 571, 570, 569, - 567, 566, 565, 564, 562, 561, 559, 558, 557, 556, - 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, - 545, 544, 543, 542, 541, 540, 539, 538, 536, 535, - 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, - 524, 523, 522, 521, 520, 519, 518, 517, 511, 509, - 506, 505, 504, 503, 501, 500, 499, 497, 496, 493, - 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, + 582, 581, 580, 579, 578, 577, 576, 575, 574, 572, + 571, 570, 569, 568, 567, 566, 565, 563, 562, 561, + 560, 558, 557, 556, 555, 553, 552, 550, 549, 548, + 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, + 537, 536, 535, 534, 533, 532, 531, 530, 528, 527, + 526, 525, 524, 523, 522, 521, 520, 519, 518, 517, + 516, 515, 514, 513, 512, 511, 510, 509, 503, 501, + 498, 497, 496, 495, 493, 492, 491, 489, 488, 485, + 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, + 474, 473, 472, 471, 470, 469, 468, 467, 466, 464, - 482, 481, 480, 479, 478, 477, 476, 475, 474, 472, - 470, 469, 468, 467, 466, 465, 464, 463, 461, 460, - 459, 458, 456, 455, 454, 453, 452, 451, 450, 449, - 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 438, 436, 435, 434, 432, 431, 429, 428, 427, 425, - 424, 422, 421, 419, 418, 417, 416, 414, 413, 412, - 411, 406, 405, 403, 402, 401, 400, 399, 397, 396, - 394, 391, 389, 388, 386, 385, 384, 383, 382, 381, - 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, - 370, 369, 368, 366, 365, 364, 363, 361, 360, 359, + 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, + 452, 451, 449, 448, 447, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, + 430, 429, 428, 426, 425, 423, 422, 421, 419, 418, + 416, 415, 413, 412, 411, 410, 408, 407, 406, 405, + 400, 399, 397, 396, 395, 394, 393, 391, 390, 388, + 385, 383, 382, 380, 379, 378, 377, 376, 375, 374, + 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, + 363, 362, 360, 359, 358, 357, 355, 354, 353, 352, + 351, 350, 349, 348, 346, 343, 342, 341, 340, 339, - 358, 357, 356, 355, 354, 353, 351, 348, 347, 346, - 345, 344, 342, 341, 340, 339, 338, 337, 336, 335, - 334, 333, 331, 330, 329, 328, 327, 326, 325, 324, - 323, 322, 321, 320, 318, 317, 316, 315, 312, 311, - 310, 309, 308, 307, 303, 301, 298, 297, 294, 290, - 283, 281, 280, 279, 278, 277, 276, 275, 274, 273, - 272, 271, 270, 269, 268, 267, 266, 264, 263, 262, - 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, - 250, 249, 248, 247, 245, 244, 243, 242, 240, 239, - 238, 237, 236, 235, 234, 233, 232, 230, 229, 228, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 327, + 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, + 316, 314, 313, 312, 311, 308, 307, 306, 305, 304, + 303, 299, 297, 294, 293, 290, 286, 279, 277, 276, + 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, + 265, 264, 263, 262, 260, 259, 258, 257, 256, 255, + 254, 253, 252, 251, 250, 249, 248, 246, 245, 244, + 242, 241, 240, 239, 237, 236, 235, 234, 233, 232, + 231, 230, 228, 227, 226, 225, 224, 223, 222, 221, + 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, - 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, - 217, 216, 215, 214, 213, 212, 211, 209, 208, 207, - 206, 205, 203, 200, 198, 196, 194, 191, 190, 188, - 185, 177, 176, 175, 173, 172, 171, 170, 169, 168, - 166, 163, 161, 159, 158, 157, 156, 155, 153, 152, - 151, 150, 148, 147, 146, 145, 144, 143, 142, 141, - 140, 139, 137, 135, 134, 132, 131, 130, 129, 127, - 126, 125, 123, 122, 121, 120, 116, 110, 107, 106, - 104, 99, 98, 79, 74, 65, 60, 53, 50, 49, - 47, 43, 41, 39, 38, 24, 14, 11, 1335, 1335, + 210, 209, 207, 206, 205, 204, 203, 201, 198, 196, + 194, 192, 189, 188, 186, 183, 175, 174, 173, 171, + 170, 169, 168, 167, 166, 164, 161, 159, 157, 156, + 155, 154, 152, 151, 150, 149, 147, 146, 145, 144, + 143, 142, 141, 140, 139, 137, 135, 134, 132, 131, + 130, 129, 127, 126, 125, 123, 122, 121, 120, 116, + 110, 107, 106, 104, 99, 98, 79, 74, 68, 65, + 60, 53, 50, 49, 47, 43, 41, 39, 38, 24, + 14, 11, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, - 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335 + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 1318, 1318, 1318, 1318 } ; static yy_state_type yy_last_accepting_state; @@ -1601,26 +1593,25 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[163] = +static const flex_int16_t yy_rule_linenum[161] = { 0, 143, 145, 147, 152, 153, 158, 159, 160, 172, 175, 180, 187, 196, 205, 214, 223, 233, 242, 251, 260, 269, 278, 287, 296, 305, 316, 325, 334, 343, 352, 362, 372, 382, 392, 402, 412, 422, 432, 442, 453, 464, 475, 484, 494, 503, 513, 527, 542, 551, 560, - 569, 578, 588, 597, 606, 616, 625, 635, 644, 653, - 662, 672, 681, 690, 699, 708, 718, 727, 736, 745, - 754, 763, 772, 781, 790, 799, 808, 818, 829, 841, - 850, 859, 868, 878, 888, 898, 908, 918, 927, 937, - 946, 955, 964, 973, 983, 993, 1003, 1012, 1021, 1030, + 569, 578, 588, 597, 606, 616, 625, 634, 643, 653, + 662, 671, 680, 689, 699, 708, 717, 726, 735, 744, + 753, 762, 771, 780, 789, 799, 810, 822, 831, 840, + 849, 859, 869, 879, 889, 899, 908, 918, 927, 936, + 945, 954, 964, 974, 984, 993, 1002, 1011, 1020, 1029, - 1039, 1048, 1057, 1066, 1075, 1084, 1093, 1102, 1111, 1120, - 1129, 1138, 1147, 1156, 1165, 1174, 1183, 1192, 1201, 1210, - 1219, 1228, 1237, 1246, 1255, 1265, 1275, 1285, 1295, 1305, - 1315, 1325, 1335, 1345, 1354, 1363, 1372, 1381, 1390, 1399, - 1408, 1419, 1432, 1445, 1460, 1558, 1563, 1568, 1573, 1574, - 1575, 1576, 1577, 1578, 1580, 1598, 1611, 1616, 1620, 1622, - 1624, 1626 + 1038, 1047, 1056, 1065, 1074, 1083, 1092, 1101, 1110, 1119, + 1128, 1137, 1146, 1155, 1164, 1173, 1182, 1191, 1200, 1209, + 1218, 1227, 1236, 1246, 1256, 1266, 1276, 1286, 1296, 1306, + 1316, 1326, 1335, 1344, 1353, 1362, 1371, 1380, 1389, 1400, + 1413, 1426, 1441, 1539, 1544, 1549, 1554, 1555, 1556, 1557, + 1558, 1559, 1561, 1579, 1592, 1597, 1601, 1603, 1605, 1607 } ; /* The intent behind this definition is that it'll catch @@ -1632,7 +1623,7 @@ static const flex_int16_t yy_rule_linenum[163] = #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "dhcp4_lexer.ll" -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1673,7 +1664,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg) -#line 1676 "dhcp4_lexer.cc" +#line 1667 "dhcp4_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1699,8 +1690,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1702 "dhcp4_lexer.cc" -#line 1703 "dhcp4_lexer.cc" +#line 1693 "dhcp4_lexer.cc" +#line 1694 "dhcp4_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2026,7 +2017,7 @@ YY_DECL } -#line 2029 "dhcp4_lexer.cc" +#line 2020 "dhcp4_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2055,13 +2046,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1336 ) + if ( yy_current_state >= 1319 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1335 ); + while ( yy_current_state != 1318 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2080,13 +2071,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 163 ) + else if ( yy_act < 161 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 163 ) + else if ( yy_act == 161 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 164 ) + else if ( yy_act == 162 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2719,31 +2710,6 @@ YY_RULE_SETUP #line 588 "dhcp4_lexer.ll" { switch(driver.ctx_) { - case isc::dhcp::Parser4Context::POOLS: - return isc::dhcp::Dhcp4Parser::make_KNOWN_CLIENTS(driver.loc_); - default: - return isc::dhcp::Dhcp4Parser::make_STRING("known-clients", driver.loc_); - } -} - YY_BREAK -case 54: -YY_RULE_SETUP -#line 597 "dhcp4_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser4Context::KNOWN_CLIENTS: - return isc::dhcp::Dhcp4Parser::make_ONLY(driver.loc_); - default: - return isc::dhcp::Dhcp4Parser::make_STRING("only", driver.loc_); - } -} - YY_BREAK -case 55: -YY_RULE_SETUP -#line 606 "dhcp4_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser4Context::KNOWN_CLIENTS: case isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME: return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); default: @@ -2751,9 +2717,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 54: YY_RULE_SETUP -#line 616 "dhcp4_lexer.ll" +#line 597 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2763,9 +2729,9 @@ YY_RULE_SETUP } } YY_BREAK -case 57: +case 55: YY_RULE_SETUP -#line 625 "dhcp4_lexer.ll" +#line 606 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2776,9 +2742,9 @@ YY_RULE_SETUP } } YY_BREAK -case 58: +case 56: YY_RULE_SETUP -#line 635 "dhcp4_lexer.ll" +#line 616 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2788,9 +2754,9 @@ YY_RULE_SETUP } } YY_BREAK -case 59: +case 57: YY_RULE_SETUP -#line 644 "dhcp4_lexer.ll" +#line 625 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2800,9 +2766,9 @@ YY_RULE_SETUP } } YY_BREAK -case 60: +case 58: YY_RULE_SETUP -#line 653 "dhcp4_lexer.ll" +#line 634 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2812,9 +2778,9 @@ YY_RULE_SETUP } } YY_BREAK -case 61: +case 59: YY_RULE_SETUP -#line 662 "dhcp4_lexer.ll" +#line 643 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2825,9 +2791,9 @@ YY_RULE_SETUP } } YY_BREAK -case 62: +case 60: YY_RULE_SETUP -#line 672 "dhcp4_lexer.ll" +#line 653 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2837,9 +2803,9 @@ YY_RULE_SETUP } } YY_BREAK -case 63: +case 61: YY_RULE_SETUP -#line 681 "dhcp4_lexer.ll" +#line 662 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2849,9 +2815,9 @@ YY_RULE_SETUP } } YY_BREAK -case 64: +case 62: YY_RULE_SETUP -#line 690 "dhcp4_lexer.ll" +#line 671 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2861,9 +2827,9 @@ YY_RULE_SETUP } } YY_BREAK -case 65: +case 63: YY_RULE_SETUP -#line 699 "dhcp4_lexer.ll" +#line 680 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: @@ -2873,9 +2839,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 64: YY_RULE_SETUP -#line 708 "dhcp4_lexer.ll" +#line 689 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -2886,9 +2852,9 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 65: YY_RULE_SETUP -#line 718 "dhcp4_lexer.ll" +#line 699 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2898,9 +2864,9 @@ YY_RULE_SETUP } } YY_BREAK -case 68: +case 66: YY_RULE_SETUP -#line 727 "dhcp4_lexer.ll" +#line 708 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -2910,9 +2876,9 @@ YY_RULE_SETUP } } YY_BREAK -case 69: +case 67: YY_RULE_SETUP -#line 736 "dhcp4_lexer.ll" +#line 717 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGING: @@ -2922,9 +2888,9 @@ YY_RULE_SETUP } } YY_BREAK -case 70: +case 68: YY_RULE_SETUP -#line 745 "dhcp4_lexer.ll" +#line 726 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2934,9 +2900,9 @@ YY_RULE_SETUP } } YY_BREAK -case 71: +case 69: YY_RULE_SETUP -#line 754 "dhcp4_lexer.ll" +#line 735 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2946,9 +2912,9 @@ YY_RULE_SETUP } } YY_BREAK -case 72: +case 70: YY_RULE_SETUP -#line 763 "dhcp4_lexer.ll" +#line 744 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2958,9 +2924,9 @@ YY_RULE_SETUP } } YY_BREAK -case 73: +case 71: YY_RULE_SETUP -#line 772 "dhcp4_lexer.ll" +#line 753 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2970,9 +2936,9 @@ YY_RULE_SETUP } } YY_BREAK -case 74: +case 72: YY_RULE_SETUP -#line 781 "dhcp4_lexer.ll" +#line 762 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2982,9 +2948,9 @@ YY_RULE_SETUP } } YY_BREAK -case 75: +case 73: YY_RULE_SETUP -#line 790 "dhcp4_lexer.ll" +#line 771 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2994,9 +2960,9 @@ YY_RULE_SETUP } } YY_BREAK -case 76: +case 74: YY_RULE_SETUP -#line 799 "dhcp4_lexer.ll" +#line 780 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -3006,9 +2972,9 @@ YY_RULE_SETUP } } YY_BREAK -case 77: +case 75: YY_RULE_SETUP -#line 808 "dhcp4_lexer.ll" +#line 789 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3019,9 +2985,9 @@ YY_RULE_SETUP } } YY_BREAK -case 78: +case 76: YY_RULE_SETUP -#line 818 "dhcp4_lexer.ll" +#line 799 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3033,9 +2999,9 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 77: YY_RULE_SETUP -#line 829 "dhcp4_lexer.ll" +#line 810 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3048,9 +3014,9 @@ YY_RULE_SETUP } } YY_BREAK -case 80: +case 78: YY_RULE_SETUP -#line 841 "dhcp4_lexer.ll" +#line 822 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -3060,9 +3026,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 79: YY_RULE_SETUP -#line 850 "dhcp4_lexer.ll" +#line 831 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -3072,9 +3038,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 80: YY_RULE_SETUP -#line 859 "dhcp4_lexer.ll" +#line 840 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3084,9 +3050,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 81: YY_RULE_SETUP -#line 868 "dhcp4_lexer.ll" +#line 849 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3097,9 +3063,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 82: YY_RULE_SETUP -#line 878 "dhcp4_lexer.ll" +#line 859 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3110,9 +3076,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 83: YY_RULE_SETUP -#line 888 "dhcp4_lexer.ll" +#line 869 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3123,9 +3089,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 84: YY_RULE_SETUP -#line 898 "dhcp4_lexer.ll" +#line 879 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3136,9 +3102,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 85: YY_RULE_SETUP -#line 908 "dhcp4_lexer.ll" +#line 889 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3149,9 +3115,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 86: YY_RULE_SETUP -#line 918 "dhcp4_lexer.ll" +#line 899 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3161,9 +3127,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 87: YY_RULE_SETUP -#line 927 "dhcp4_lexer.ll" +#line 908 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3174,9 +3140,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 88: YY_RULE_SETUP -#line 937 "dhcp4_lexer.ll" +#line 918 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3186,9 +3152,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 89: YY_RULE_SETUP -#line 946 "dhcp4_lexer.ll" +#line 927 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3198,9 +3164,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 90: YY_RULE_SETUP -#line 955 "dhcp4_lexer.ll" +#line 936 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3210,9 +3176,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 91: YY_RULE_SETUP -#line 964 "dhcp4_lexer.ll" +#line 945 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3222,9 +3188,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 92: YY_RULE_SETUP -#line 973 "dhcp4_lexer.ll" +#line 954 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3235,9 +3201,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 93: YY_RULE_SETUP -#line 983 "dhcp4_lexer.ll" +#line 964 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3248,9 +3214,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 94: YY_RULE_SETUP -#line 993 "dhcp4_lexer.ll" +#line 974 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3260,9 +3226,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 95: YY_RULE_SETUP -#line 1003 "dhcp4_lexer.ll" +#line 984 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3272,9 +3238,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 96: YY_RULE_SETUP -#line 1012 "dhcp4_lexer.ll" +#line 993 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3284,9 +3250,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 97: YY_RULE_SETUP -#line 1021 "dhcp4_lexer.ll" +#line 1002 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3296,9 +3262,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 98: YY_RULE_SETUP -#line 1030 "dhcp4_lexer.ll" +#line 1011 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3308,9 +3274,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 99: YY_RULE_SETUP -#line 1039 "dhcp4_lexer.ll" +#line 1020 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3320,9 +3286,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 100: YY_RULE_SETUP -#line 1048 "dhcp4_lexer.ll" +#line 1029 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3332,9 +3298,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 101: YY_RULE_SETUP -#line 1057 "dhcp4_lexer.ll" +#line 1038 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3344,9 +3310,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 102: YY_RULE_SETUP -#line 1066 "dhcp4_lexer.ll" +#line 1047 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3356,9 +3322,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 103: YY_RULE_SETUP -#line 1075 "dhcp4_lexer.ll" +#line 1056 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3368,9 +3334,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 104: YY_RULE_SETUP -#line 1084 "dhcp4_lexer.ll" +#line 1065 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3380,9 +3346,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 105: YY_RULE_SETUP -#line 1093 "dhcp4_lexer.ll" +#line 1074 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3392,9 +3358,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 106: YY_RULE_SETUP -#line 1102 "dhcp4_lexer.ll" +#line 1083 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3404,9 +3370,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 107: YY_RULE_SETUP -#line 1111 "dhcp4_lexer.ll" +#line 1092 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3416,9 +3382,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 108: YY_RULE_SETUP -#line 1120 "dhcp4_lexer.ll" +#line 1101 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3428,9 +3394,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 109: YY_RULE_SETUP -#line 1129 "dhcp4_lexer.ll" +#line 1110 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3440,9 +3406,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 110: YY_RULE_SETUP -#line 1138 "dhcp4_lexer.ll" +#line 1119 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3452,9 +3418,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 111: YY_RULE_SETUP -#line 1147 "dhcp4_lexer.ll" +#line 1128 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3464,9 +3430,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 112: YY_RULE_SETUP -#line 1156 "dhcp4_lexer.ll" +#line 1137 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3476,9 +3442,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 113: YY_RULE_SETUP -#line 1165 "dhcp4_lexer.ll" +#line 1146 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3488,9 +3454,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 114: YY_RULE_SETUP -#line 1174 "dhcp4_lexer.ll" +#line 1155 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3500,9 +3466,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 115: YY_RULE_SETUP -#line 1183 "dhcp4_lexer.ll" +#line 1164 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3512,9 +3478,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 116: YY_RULE_SETUP -#line 1192 "dhcp4_lexer.ll" +#line 1173 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3524,9 +3490,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 117: YY_RULE_SETUP -#line 1201 "dhcp4_lexer.ll" +#line 1182 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3536,9 +3502,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 118: YY_RULE_SETUP -#line 1210 "dhcp4_lexer.ll" +#line 1191 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3548,9 +3514,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 119: YY_RULE_SETUP -#line 1219 "dhcp4_lexer.ll" +#line 1200 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3560,9 +3526,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 120: YY_RULE_SETUP -#line 1228 "dhcp4_lexer.ll" +#line 1209 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3572,9 +3538,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 121: YY_RULE_SETUP -#line 1237 "dhcp4_lexer.ll" +#line 1218 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3584,9 +3550,9 @@ YY_RULE_SETUP } } YY_BREAK -case 124: +case 122: YY_RULE_SETUP -#line 1246 "dhcp4_lexer.ll" +#line 1227 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3596,9 +3562,9 @@ YY_RULE_SETUP } } YY_BREAK -case 125: +case 123: YY_RULE_SETUP -#line 1255 "dhcp4_lexer.ll" +#line 1236 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3609,9 +3575,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 126: +case 124: YY_RULE_SETUP -#line 1265 "dhcp4_lexer.ll" +#line 1246 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3622,9 +3588,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 127: +case 125: YY_RULE_SETUP -#line 1275 "dhcp4_lexer.ll" +#line 1256 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3635,9 +3601,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 128: +case 126: YY_RULE_SETUP -#line 1285 "dhcp4_lexer.ll" +#line 1266 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3648,13 +3614,39 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK +case 127: +YY_RULE_SETUP +#line 1276 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 128: +YY_RULE_SETUP +#line 1286 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK case 129: YY_RULE_SETUP -#line 1295 "dhcp4_lexer.ll" +#line 1296 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); } std::string tmp(yytext+1); tmp.resize(tmp.size() - 1); @@ -3663,33 +3655,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1305 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK -case 131: -YY_RULE_SETUP -#line 1315 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK -case 132: -YY_RULE_SETUP -#line 1325 "dhcp4_lexer.ll" +#line 1306 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3700,9 +3666,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 133: +case 131: YY_RULE_SETUP -#line 1335 "dhcp4_lexer.ll" +#line 1316 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3713,9 +3679,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 134: +case 132: YY_RULE_SETUP -#line 1345 "dhcp4_lexer.ll" +#line 1326 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3725,9 +3691,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 133: YY_RULE_SETUP -#line 1354 "dhcp4_lexer.ll" +#line 1335 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3737,9 +3703,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 134: YY_RULE_SETUP -#line 1363 "dhcp4_lexer.ll" +#line 1344 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3749,9 +3715,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 135: YY_RULE_SETUP -#line 1372 "dhcp4_lexer.ll" +#line 1353 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3761,9 +3727,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 136: YY_RULE_SETUP -#line 1381 "dhcp4_lexer.ll" +#line 1362 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3773,9 +3739,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 137: YY_RULE_SETUP -#line 1390 "dhcp4_lexer.ll" +#line 1371 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3785,9 +3751,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 138: YY_RULE_SETUP -#line 1399 "dhcp4_lexer.ll" +#line 1380 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3797,9 +3763,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 139: YY_RULE_SETUP -#line 1408 "dhcp4_lexer.ll" +#line 1389 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3811,9 +3777,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 140: YY_RULE_SETUP -#line 1419 "dhcp4_lexer.ll" +#line 1400 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3827,9 +3793,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 141: YY_RULE_SETUP -#line 1432 "dhcp4_lexer.ll" +#line 1413 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3843,9 +3809,9 @@ YY_RULE_SETUP } } YY_BREAK -case 144: +case 142: YY_RULE_SETUP -#line 1445 "dhcp4_lexer.ll" +#line 1426 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3859,9 +3825,9 @@ YY_RULE_SETUP } } YY_BREAK -case 145: +case 143: YY_RULE_SETUP -#line 1460 "dhcp4_lexer.ll" +#line 1441 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3960,65 +3926,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 146: -/* rule 146 can match eol */ +case 144: +/* rule 144 can match eol */ YY_RULE_SETUP -#line 1558 "dhcp4_lexer.ll" +#line 1539 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 147: -/* rule 147 can match eol */ +case 145: +/* rule 145 can match eol */ YY_RULE_SETUP -#line 1563 "dhcp4_lexer.ll" +#line 1544 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 148: +case 146: YY_RULE_SETUP -#line 1568 "dhcp4_lexer.ll" +#line 1549 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK +case 147: +YY_RULE_SETUP +#line 1554 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } + YY_BREAK +case 148: +YY_RULE_SETUP +#line 1555 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } + YY_BREAK case 149: YY_RULE_SETUP -#line 1573 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } +#line 1556 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1574 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } +#line 1557 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1575 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1558 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1576 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1559 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1577 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } - YY_BREAK -case 154: -YY_RULE_SETUP -#line 1578 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } - YY_BREAK -case 155: -YY_RULE_SETUP -#line 1580 "dhcp4_lexer.ll" +#line 1561 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4037,9 +4003,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 156: +case 154: YY_RULE_SETUP -#line 1598 "dhcp4_lexer.ll" +#line 1579 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4053,43 +4019,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 157: +case 155: YY_RULE_SETUP -#line 1611 "dhcp4_lexer.ll" +#line 1592 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 158: +case 156: YY_RULE_SETUP -#line 1616 "dhcp4_lexer.ll" +#line 1597 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK +case 157: +YY_RULE_SETUP +#line 1601 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); + YY_BREAK +case 158: +YY_RULE_SETUP +#line 1603 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK case 159: YY_RULE_SETUP -#line 1620 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); +#line 1605 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1622 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK -case 161: -YY_RULE_SETUP -#line 1624 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); - YY_BREAK -case 162: -YY_RULE_SETUP -#line 1626 "dhcp4_lexer.ll" +#line 1607 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1628 "dhcp4_lexer.ll" +#line 1609 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4113,12 +4079,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 163: +case 161: YY_RULE_SETUP -#line 1651 "dhcp4_lexer.ll" +#line 1632 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4121 "dhcp4_lexer.cc" +#line 4087 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4437,7 +4403,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1336 ) + if ( yy_current_state >= 1319 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4470,11 +4436,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1336 ) + if ( yy_current_state >= 1319 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1335); + yy_is_jam = (yy_current_state == 1318); return yy_is_jam ? 0 : yy_current_state; } @@ -5223,7 +5189,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1651 "dhcp4_lexer.ll" +#line 1632 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index c93560eb02..3a8e831125 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -253,31 +253,30 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 153: // "boolean" + case 151: // "boolean" value.move< bool > (that.value); break; - case 152: // "floating point" + case 150: // "floating point" value.move< double > (that.value); break; - case 151: // "integer" + case 149: // "integer" value.move< int64_t > (that.value); break; - case 150: // "constant string" + case 148: // "constant string" value.move< std::string > (that.value); break; @@ -296,31 +295,30 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 153: // "boolean" + case 151: // "boolean" value.copy< bool > (that.value); break; - case 152: // "floating point" + case 150: // "floating point" value.copy< double > (that.value); break; - case 151: // "integer" + case 149: // "integer" value.copy< int64_t > (that.value); break; - case 150: // "constant string" + case 148: // "constant string" value.copy< std::string > (that.value); break; @@ -360,95 +358,88 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 150: // "constant string" + case 148: // "constant string" -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } -#line 368 "dhcp4_parser.cc" // lalr1.cc:636 +#line 366 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 151: // "integer" + case 149: // "integer" -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } -#line 375 "dhcp4_parser.cc" // lalr1.cc:636 +#line 373 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 152: // "floating point" + case 150: // "floating point" -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } -#line 382 "dhcp4_parser.cc" // lalr1.cc:636 +#line 380 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 153: // "boolean" + case 151: // "boolean" -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } -#line 389 "dhcp4_parser.cc" // lalr1.cc:636 +#line 387 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 168: // value + case 166: // value -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 396 "dhcp4_parser.cc" // lalr1.cc:636 +#line 394 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 172: // map_value + case 170: // map_value -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 403 "dhcp4_parser.cc" // lalr1.cc:636 +#line 401 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 210: // socket_type + case 208: // socket_type -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 410 "dhcp4_parser.cc" // lalr1.cc:636 +#line 408 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 213: // outbound_interface_value + case 211: // outbound_interface_value -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 417 "dhcp4_parser.cc" // lalr1.cc:636 +#line 415 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 223: // db_type + case 221: // db_type -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 424 "dhcp4_parser.cc" // lalr1.cc:636 +#line 422 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 302: // hr_mode + case 300: // hr_mode -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 431 "dhcp4_parser.cc" // lalr1.cc:636 +#line 429 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 373: // known_clients_value + case 445: // ncr_protocol_value -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 438 "dhcp4_parser.cc" // lalr1.cc:636 +#line 436 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 450: // ncr_protocol_value + case 453: // replace_client_name_value -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 +#line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 445 "dhcp4_parser.cc" // lalr1.cc:636 - break; - - case 458: // replace_client_name_value - -#line 229 "dhcp4_parser.yy" // lalr1.cc:636 - { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 452 "dhcp4_parser.cc" // lalr1.cc:636 +#line 443 "dhcp4_parser.cc" // lalr1.cc:636 break; @@ -648,31 +639,30 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 153: // "boolean" + case 151: // "boolean" yylhs.value.build< bool > (); break; - case 152: // "floating point" + case 150: // "floating point" yylhs.value.build< double > (); break; - case 151: // "integer" + case 149: // "integer" yylhs.value.build< int64_t > (); break; - case 150: // "constant string" + case 148: // "constant string" yylhs.value.build< std::string > (); break; @@ -694,268 +684,268 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 238 "dhcp4_parser.yy" // lalr1.cc:859 +#line 235 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } -#line 700 "dhcp4_parser.cc" // lalr1.cc:859 +#line 690 "dhcp4_parser.cc" // lalr1.cc:859 break; case 4: -#line 239 "dhcp4_parser.yy" // lalr1.cc:859 +#line 236 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } -#line 706 "dhcp4_parser.cc" // lalr1.cc:859 +#line 696 "dhcp4_parser.cc" // lalr1.cc:859 break; case 6: -#line 240 "dhcp4_parser.yy" // lalr1.cc:859 +#line 237 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } -#line 712 "dhcp4_parser.cc" // lalr1.cc:859 +#line 702 "dhcp4_parser.cc" // lalr1.cc:859 break; case 8: -#line 241 "dhcp4_parser.yy" // lalr1.cc:859 +#line 238 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } -#line 718 "dhcp4_parser.cc" // lalr1.cc:859 +#line 708 "dhcp4_parser.cc" // lalr1.cc:859 break; case 10: -#line 242 "dhcp4_parser.yy" // lalr1.cc:859 +#line 239 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET4; } -#line 724 "dhcp4_parser.cc" // lalr1.cc:859 +#line 714 "dhcp4_parser.cc" // lalr1.cc:859 break; case 12: -#line 243 "dhcp4_parser.yy" // lalr1.cc:859 +#line 240 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } -#line 730 "dhcp4_parser.cc" // lalr1.cc:859 +#line 720 "dhcp4_parser.cc" // lalr1.cc:859 break; case 14: -#line 244 "dhcp4_parser.yy" // lalr1.cc:859 +#line 241 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } -#line 736 "dhcp4_parser.cc" // lalr1.cc:859 +#line 726 "dhcp4_parser.cc" // lalr1.cc:859 break; case 16: -#line 245 "dhcp4_parser.yy" // lalr1.cc:859 +#line 242 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } -#line 742 "dhcp4_parser.cc" // lalr1.cc:859 +#line 732 "dhcp4_parser.cc" // lalr1.cc:859 break; case 18: -#line 246 "dhcp4_parser.yy" // lalr1.cc:859 +#line 243 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } -#line 748 "dhcp4_parser.cc" // lalr1.cc:859 +#line 738 "dhcp4_parser.cc" // lalr1.cc:859 break; case 20: -#line 247 "dhcp4_parser.yy" // lalr1.cc:859 +#line 244 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } -#line 754 "dhcp4_parser.cc" // lalr1.cc:859 +#line 744 "dhcp4_parser.cc" // lalr1.cc:859 break; case 22: -#line 248 "dhcp4_parser.yy" // lalr1.cc:859 +#line 245 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } -#line 760 "dhcp4_parser.cc" // lalr1.cc:859 +#line 750 "dhcp4_parser.cc" // lalr1.cc:859 break; case 24: -#line 249 "dhcp4_parser.yy" // lalr1.cc:859 +#line 246 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } -#line 766 "dhcp4_parser.cc" // lalr1.cc:859 +#line 756 "dhcp4_parser.cc" // lalr1.cc:859 break; case 26: -#line 257 "dhcp4_parser.yy" // lalr1.cc:859 +#line 254 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } -#line 772 "dhcp4_parser.cc" // lalr1.cc:859 +#line 762 "dhcp4_parser.cc" // lalr1.cc:859 break; case 27: -#line 258 "dhcp4_parser.yy" // lalr1.cc:859 +#line 255 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } -#line 778 "dhcp4_parser.cc" // lalr1.cc:859 +#line 768 "dhcp4_parser.cc" // lalr1.cc:859 break; case 28: -#line 259 "dhcp4_parser.yy" // lalr1.cc:859 +#line 256 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } -#line 784 "dhcp4_parser.cc" // lalr1.cc:859 +#line 774 "dhcp4_parser.cc" // lalr1.cc:859 break; case 29: -#line 260 "dhcp4_parser.yy" // lalr1.cc:859 +#line 257 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } -#line 790 "dhcp4_parser.cc" // lalr1.cc:859 +#line 780 "dhcp4_parser.cc" // lalr1.cc:859 break; case 30: -#line 261 "dhcp4_parser.yy" // lalr1.cc:859 +#line 258 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } -#line 796 "dhcp4_parser.cc" // lalr1.cc:859 +#line 786 "dhcp4_parser.cc" // lalr1.cc:859 break; case 31: -#line 262 "dhcp4_parser.yy" // lalr1.cc:859 +#line 259 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 802 "dhcp4_parser.cc" // lalr1.cc:859 +#line 792 "dhcp4_parser.cc" // lalr1.cc:859 break; case 32: -#line 263 "dhcp4_parser.yy" // lalr1.cc:859 +#line 260 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 808 "dhcp4_parser.cc" // lalr1.cc:859 +#line 798 "dhcp4_parser.cc" // lalr1.cc:859 break; case 33: -#line 266 "dhcp4_parser.yy" // lalr1.cc:859 +#line 263 "dhcp4_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); } -#line 817 "dhcp4_parser.cc" // lalr1.cc:859 +#line 807 "dhcp4_parser.cc" // lalr1.cc:859 break; case 34: -#line 271 "dhcp4_parser.yy" // lalr1.cc:859 +#line 268 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 828 "dhcp4_parser.cc" // lalr1.cc:859 +#line 818 "dhcp4_parser.cc" // lalr1.cc:859 break; case 35: -#line 276 "dhcp4_parser.yy" // lalr1.cc:859 +#line 273 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place // for it. } -#line 838 "dhcp4_parser.cc" // lalr1.cc:859 +#line 828 "dhcp4_parser.cc" // lalr1.cc:859 break; case 36: -#line 282 "dhcp4_parser.yy" // lalr1.cc:859 +#line 279 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 844 "dhcp4_parser.cc" // lalr1.cc:859 +#line 834 "dhcp4_parser.cc" // lalr1.cc:859 break; case 39: -#line 289 "dhcp4_parser.yy" // lalr1.cc:859 +#line 286 "dhcp4_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 853 "dhcp4_parser.cc" // lalr1.cc:859 +#line 843 "dhcp4_parser.cc" // lalr1.cc:859 break; case 40: -#line 293 "dhcp4_parser.yy" // lalr1.cc:859 +#line 290 "dhcp4_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 863 "dhcp4_parser.cc" // lalr1.cc:859 +#line 853 "dhcp4_parser.cc" // lalr1.cc:859 break; case 41: -#line 300 "dhcp4_parser.yy" // lalr1.cc:859 +#line 297 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); } -#line 872 "dhcp4_parser.cc" // lalr1.cc:859 +#line 862 "dhcp4_parser.cc" // lalr1.cc:859 break; case 42: -#line 303 "dhcp4_parser.yy" // lalr1.cc:859 +#line 300 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } -#line 880 "dhcp4_parser.cc" // lalr1.cc:859 +#line 870 "dhcp4_parser.cc" // lalr1.cc:859 break; case 45: -#line 311 "dhcp4_parser.yy" // lalr1.cc:859 +#line 308 "dhcp4_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 889 "dhcp4_parser.cc" // lalr1.cc:859 +#line 879 "dhcp4_parser.cc" // lalr1.cc:859 break; case 46: -#line 315 "dhcp4_parser.yy" // lalr1.cc:859 +#line 312 "dhcp4_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 898 "dhcp4_parser.cc" // lalr1.cc:859 +#line 888 "dhcp4_parser.cc" // lalr1.cc:859 break; case 47: -#line 322 "dhcp4_parser.yy" // lalr1.cc:859 +#line 319 "dhcp4_parser.yy" // lalr1.cc:859 { // List parsing about to start } -#line 906 "dhcp4_parser.cc" // lalr1.cc:859 +#line 896 "dhcp4_parser.cc" // lalr1.cc:859 break; case 48: -#line 324 "dhcp4_parser.yy" // lalr1.cc:859 +#line 321 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); } -#line 915 "dhcp4_parser.cc" // lalr1.cc:859 +#line 905 "dhcp4_parser.cc" // lalr1.cc:859 break; case 51: -#line 333 "dhcp4_parser.yy" // lalr1.cc:859 +#line 330 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 924 "dhcp4_parser.cc" // lalr1.cc:859 +#line 914 "dhcp4_parser.cc" // lalr1.cc:859 break; case 52: -#line 337 "dhcp4_parser.yy" // lalr1.cc:859 +#line 334 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 933 "dhcp4_parser.cc" // lalr1.cc:859 +#line 923 "dhcp4_parser.cc" // lalr1.cc:859 break; case 53: -#line 348 "dhcp4_parser.yy" // lalr1.cc:859 +#line 345 "dhcp4_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); error(yystack_[1].location, "got unexpected keyword \"" + keyword + "\" in " + where + " map."); } -#line 944 "dhcp4_parser.cc" // lalr1.cc:859 +#line 934 "dhcp4_parser.cc" // lalr1.cc:859 break; case 54: -#line 358 "dhcp4_parser.yy" // lalr1.cc:859 +#line 355 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 955 "dhcp4_parser.cc" // lalr1.cc:859 +#line 945 "dhcp4_parser.cc" // lalr1.cc:859 break; case 55: -#line 363 "dhcp4_parser.yy" // lalr1.cc:859 +#line 360 "dhcp4_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -964,11 +954,11 @@ namespace isc { namespace dhcp { // Dhcp4 is required ctx.require("Dhcp4", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 968 "dhcp4_parser.cc" // lalr1.cc:859 +#line 958 "dhcp4_parser.cc" // lalr1.cc:859 break; case 64: -#line 387 "dhcp4_parser.yy" // lalr1.cc:859 +#line 384 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -977,728 +967,728 @@ namespace isc { namespace dhcp { ctx.stack_.push_back(m); ctx.enter(ctx.DHCP4); } -#line 981 "dhcp4_parser.cc" // lalr1.cc:859 +#line 971 "dhcp4_parser.cc" // lalr1.cc:859 break; case 65: -#line 394 "dhcp4_parser.yy" // lalr1.cc:859 +#line 391 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 991 "dhcp4_parser.cc" // lalr1.cc:859 +#line 981 "dhcp4_parser.cc" // lalr1.cc:859 break; case 66: -#line 402 "dhcp4_parser.yy" // lalr1.cc:859 +#line 399 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Dhcp4 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1001 "dhcp4_parser.cc" // lalr1.cc:859 +#line 991 "dhcp4_parser.cc" // lalr1.cc:859 break; case 67: -#line 406 "dhcp4_parser.yy" // lalr1.cc:859 +#line 403 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed } -#line 1010 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1000 "dhcp4_parser.cc" // lalr1.cc:859 break; case 94: -#line 443 "dhcp4_parser.yy" // lalr1.cc:859 +#line 440 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); } -#line 1019 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1009 "dhcp4_parser.cc" // lalr1.cc:859 break; case 95: -#line 448 "dhcp4_parser.yy" // lalr1.cc:859 +#line 445 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); } -#line 1028 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1018 "dhcp4_parser.cc" // lalr1.cc:859 break; case 96: -#line 453 "dhcp4_parser.yy" // lalr1.cc:859 +#line 450 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); } -#line 1037 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1027 "dhcp4_parser.cc" // lalr1.cc:859 break; case 97: -#line 458 "dhcp4_parser.yy" // lalr1.cc:859 +#line 455 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); } -#line 1046 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1036 "dhcp4_parser.cc" // lalr1.cc:859 break; case 98: -#line 463 "dhcp4_parser.yy" // lalr1.cc:859 +#line 460 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("echo-client-id", echo); } -#line 1055 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1045 "dhcp4_parser.cc" // lalr1.cc:859 break; case 99: -#line 468 "dhcp4_parser.yy" // lalr1.cc:859 +#line 465 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("match-client-id", match); } -#line 1064 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1054 "dhcp4_parser.cc" // lalr1.cc:859 break; case 100: -#line 474 "dhcp4_parser.yy" // lalr1.cc:859 +#line 471 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); ctx.stack_.push_back(i); ctx.enter(ctx.INTERFACES_CONFIG); } -#line 1075 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1065 "dhcp4_parser.cc" // lalr1.cc:859 break; case 101: -#line 479 "dhcp4_parser.yy" // lalr1.cc:859 +#line 476 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1085 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1075 "dhcp4_parser.cc" // lalr1.cc:859 break; case 108: -#line 495 "dhcp4_parser.yy" // lalr1.cc:859 +#line 492 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1095 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1085 "dhcp4_parser.cc" // lalr1.cc:859 break; case 109: -#line 499 "dhcp4_parser.yy" // lalr1.cc:859 +#line 496 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed } -#line 1104 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1094 "dhcp4_parser.cc" // lalr1.cc:859 break; case 110: -#line 504 "dhcp4_parser.yy" // lalr1.cc:859 +#line 501 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1115 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1105 "dhcp4_parser.cc" // lalr1.cc:859 break; case 111: -#line 509 "dhcp4_parser.yy" // lalr1.cc:859 +#line 506 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1124 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1114 "dhcp4_parser.cc" // lalr1.cc:859 break; case 112: -#line 514 "dhcp4_parser.yy" // lalr1.cc:859 +#line 511 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DHCP_SOCKET_TYPE); } -#line 1132 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1122 "dhcp4_parser.cc" // lalr1.cc:859 break; case 113: -#line 516 "dhcp4_parser.yy" // lalr1.cc:859 +#line 513 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1141 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1131 "dhcp4_parser.cc" // lalr1.cc:859 break; case 114: -#line 521 "dhcp4_parser.yy" // lalr1.cc:859 +#line 518 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); } -#line 1147 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1137 "dhcp4_parser.cc" // lalr1.cc:859 break; case 115: -#line 522 "dhcp4_parser.yy" // lalr1.cc:859 +#line 519 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); } -#line 1153 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1143 "dhcp4_parser.cc" // lalr1.cc:859 break; case 116: -#line 525 "dhcp4_parser.yy" // lalr1.cc:859 +#line 522 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.OUTBOUND_INTERFACE); } -#line 1161 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1151 "dhcp4_parser.cc" // lalr1.cc:859 break; case 117: -#line 527 "dhcp4_parser.yy" // lalr1.cc:859 +#line 524 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1170 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1160 "dhcp4_parser.cc" // lalr1.cc:859 break; case 118: -#line 532 "dhcp4_parser.yy" // lalr1.cc:859 +#line 529 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location))); } -#line 1178 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1168 "dhcp4_parser.cc" // lalr1.cc:859 break; case 119: -#line 534 "dhcp4_parser.yy" // lalr1.cc:859 +#line 531 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location))); } -#line 1186 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1176 "dhcp4_parser.cc" // lalr1.cc:859 break; case 120: -#line 538 "dhcp4_parser.yy" // lalr1.cc:859 +#line 535 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); } -#line 1195 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1185 "dhcp4_parser.cc" // lalr1.cc:859 break; case 121: -#line 544 "dhcp4_parser.yy" // lalr1.cc:859 +#line 541 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.LEASE_DATABASE); } -#line 1206 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1196 "dhcp4_parser.cc" // lalr1.cc:859 break; case 122: -#line 549 "dhcp4_parser.yy" // lalr1.cc:859 +#line 546 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1217 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1207 "dhcp4_parser.cc" // lalr1.cc:859 break; case 123: -#line 556 "dhcp4_parser.yy" // lalr1.cc:859 +#line 553 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.HOSTS_DATABASE); } -#line 1228 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1218 "dhcp4_parser.cc" // lalr1.cc:859 break; case 124: -#line 561 "dhcp4_parser.yy" // lalr1.cc:859 +#line 558 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1239 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1229 "dhcp4_parser.cc" // lalr1.cc:859 break; case 140: -#line 587 "dhcp4_parser.yy" // lalr1.cc:859 +#line 584 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1247 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1237 "dhcp4_parser.cc" // lalr1.cc:859 break; case 141: -#line 589 "dhcp4_parser.yy" // lalr1.cc:859 +#line 586 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1256 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1246 "dhcp4_parser.cc" // lalr1.cc:859 break; case 142: -#line 594 "dhcp4_parser.yy" // lalr1.cc:859 +#line 591 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1262 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1252 "dhcp4_parser.cc" // lalr1.cc:859 break; case 143: -#line 595 "dhcp4_parser.yy" // lalr1.cc:859 +#line 592 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1268 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1258 "dhcp4_parser.cc" // lalr1.cc:859 break; case 144: -#line 596 "dhcp4_parser.yy" // lalr1.cc:859 +#line 593 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1274 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1264 "dhcp4_parser.cc" // lalr1.cc:859 break; case 145: -#line 597 "dhcp4_parser.yy" // lalr1.cc:859 +#line 594 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1280 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1270 "dhcp4_parser.cc" // lalr1.cc:859 break; case 146: -#line 600 "dhcp4_parser.yy" // lalr1.cc:859 +#line 597 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1288 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1278 "dhcp4_parser.cc" // lalr1.cc:859 break; case 147: -#line 602 "dhcp4_parser.yy" // lalr1.cc:859 +#line 599 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); ctx.leave(); } -#line 1298 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1288 "dhcp4_parser.cc" // lalr1.cc:859 break; case 148: -#line 608 "dhcp4_parser.yy" // lalr1.cc:859 +#line 605 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1306 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1296 "dhcp4_parser.cc" // lalr1.cc:859 break; case 149: -#line 610 "dhcp4_parser.yy" // lalr1.cc:859 +#line 607 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); ctx.leave(); } -#line 1316 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1306 "dhcp4_parser.cc" // lalr1.cc:859 break; case 150: -#line 616 "dhcp4_parser.yy" // lalr1.cc:859 +#line 613 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1324 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1314 "dhcp4_parser.cc" // lalr1.cc:859 break; case 151: -#line 618 "dhcp4_parser.yy" // lalr1.cc:859 +#line 615 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); ctx.leave(); } -#line 1334 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1324 "dhcp4_parser.cc" // lalr1.cc:859 break; case 152: -#line 624 "dhcp4_parser.yy" // lalr1.cc:859 +#line 621 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1343 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1333 "dhcp4_parser.cc" // lalr1.cc:859 break; case 153: -#line 629 "dhcp4_parser.yy" // lalr1.cc:859 +#line 626 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1351 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1341 "dhcp4_parser.cc" // lalr1.cc:859 break; case 154: -#line 631 "dhcp4_parser.yy" // lalr1.cc:859 +#line 628 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1361 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1351 "dhcp4_parser.cc" // lalr1.cc:859 break; case 155: -#line 637 "dhcp4_parser.yy" // lalr1.cc:859 +#line 634 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); } -#line 1370 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1360 "dhcp4_parser.cc" // lalr1.cc:859 break; case 156: -#line 642 "dhcp4_parser.yy" // lalr1.cc:859 +#line 639 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); } -#line 1379 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1369 "dhcp4_parser.cc" // lalr1.cc:859 break; case 157: -#line 647 "dhcp4_parser.yy" // lalr1.cc:859 +#line 644 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); } -#line 1388 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1378 "dhcp4_parser.cc" // lalr1.cc:859 break; case 158: -#line 652 "dhcp4_parser.yy" // lalr1.cc:859 +#line 649 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); } -#line 1397 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1387 "dhcp4_parser.cc" // lalr1.cc:859 break; case 159: -#line 657 "dhcp4_parser.yy" // lalr1.cc:859 +#line 654 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1405 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1395 "dhcp4_parser.cc" // lalr1.cc:859 break; case 160: -#line 659 "dhcp4_parser.yy" // lalr1.cc:859 +#line 656 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1415 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1405 "dhcp4_parser.cc" // lalr1.cc:859 break; case 161: -#line 665 "dhcp4_parser.yy" // lalr1.cc:859 +#line 662 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1423 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1413 "dhcp4_parser.cc" // lalr1.cc:859 break; case 162: -#line 667 "dhcp4_parser.yy" // lalr1.cc:859 +#line 664 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1433 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1423 "dhcp4_parser.cc" // lalr1.cc:859 break; case 163: -#line 674 "dhcp4_parser.yy" // lalr1.cc:859 +#line 671 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); } -#line 1444 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1434 "dhcp4_parser.cc" // lalr1.cc:859 break; case 164: -#line 679 "dhcp4_parser.yy" // lalr1.cc:859 +#line 676 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1453 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1443 "dhcp4_parser.cc" // lalr1.cc:859 break; case 172: -#line 695 "dhcp4_parser.yy" // lalr1.cc:859 +#line 692 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1462 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1452 "dhcp4_parser.cc" // lalr1.cc:859 break; case 173: -#line 700 "dhcp4_parser.yy" // lalr1.cc:859 +#line 697 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1471 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1461 "dhcp4_parser.cc" // lalr1.cc:859 break; case 174: -#line 705 "dhcp4_parser.yy" // lalr1.cc:859 +#line 702 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(circuit); } -#line 1480 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1470 "dhcp4_parser.cc" // lalr1.cc:859 break; case 175: -#line 710 "dhcp4_parser.yy" // lalr1.cc:859 +#line 707 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(client); } -#line 1489 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1479 "dhcp4_parser.cc" // lalr1.cc:859 break; case 176: -#line 715 "dhcp4_parser.yy" // lalr1.cc:859 +#line 712 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1498 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1488 "dhcp4_parser.cc" // lalr1.cc:859 break; case 177: -#line 720 "dhcp4_parser.yy" // lalr1.cc:859 +#line 717 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 1509 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1499 "dhcp4_parser.cc" // lalr1.cc:859 break; case 178: -#line 725 "dhcp4_parser.yy" // lalr1.cc:859 +#line 722 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1518 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1508 "dhcp4_parser.cc" // lalr1.cc:859 break; case 183: -#line 738 "dhcp4_parser.yy" // lalr1.cc:859 +#line 735 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1528 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1518 "dhcp4_parser.cc" // lalr1.cc:859 break; case 184: -#line 742 "dhcp4_parser.yy" // lalr1.cc:859 +#line 739 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1538 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1528 "dhcp4_parser.cc" // lalr1.cc:859 break; case 185: -#line 748 "dhcp4_parser.yy" // lalr1.cc:859 +#line 745 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1548 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1538 "dhcp4_parser.cc" // lalr1.cc:859 break; case 186: -#line 752 "dhcp4_parser.yy" // lalr1.cc:859 +#line 749 "dhcp4_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1558 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1548 "dhcp4_parser.cc" // lalr1.cc:859 break; case 192: -#line 767 "dhcp4_parser.yy" // lalr1.cc:859 +#line 764 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1566 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1556 "dhcp4_parser.cc" // lalr1.cc:859 break; case 193: -#line 769 "dhcp4_parser.yy" // lalr1.cc:859 +#line 766 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1576 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1566 "dhcp4_parser.cc" // lalr1.cc:859 break; case 194: -#line 775 "dhcp4_parser.yy" // lalr1.cc:859 +#line 772 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1584 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1574 "dhcp4_parser.cc" // lalr1.cc:859 break; case 195: -#line 777 "dhcp4_parser.yy" // lalr1.cc:859 +#line 774 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1593 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1583 "dhcp4_parser.cc" // lalr1.cc:859 break; case 196: -#line 783 "dhcp4_parser.yy" // lalr1.cc:859 +#line 780 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.EXPIRED_LEASES_PROCESSING); } -#line 1604 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1594 "dhcp4_parser.cc" // lalr1.cc:859 break; case 197: -#line 788 "dhcp4_parser.yy" // lalr1.cc:859 +#line 785 "dhcp4_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1614 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1604 "dhcp4_parser.cc" // lalr1.cc:859 break; case 206: -#line 806 "dhcp4_parser.yy" // lalr1.cc:859 +#line 803 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); } -#line 1623 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1613 "dhcp4_parser.cc" // lalr1.cc:859 break; case 207: -#line 811 "dhcp4_parser.yy" // lalr1.cc:859 +#line 808 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); } -#line 1632 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1622 "dhcp4_parser.cc" // lalr1.cc:859 break; case 208: -#line 816 "dhcp4_parser.yy" // lalr1.cc:859 +#line 813 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); } -#line 1641 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1631 "dhcp4_parser.cc" // lalr1.cc:859 break; case 209: -#line 821 "dhcp4_parser.yy" // lalr1.cc:859 +#line 818 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); } -#line 1650 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1640 "dhcp4_parser.cc" // lalr1.cc:859 break; case 210: -#line 826 "dhcp4_parser.yy" // lalr1.cc:859 +#line 823 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); } -#line 1659 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1649 "dhcp4_parser.cc" // lalr1.cc:859 break; case 211: -#line 831 "dhcp4_parser.yy" // lalr1.cc:859 +#line 828 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); } -#line 1668 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1658 "dhcp4_parser.cc" // lalr1.cc:859 break; case 212: -#line 839 "dhcp4_parser.yy" // lalr1.cc:859 +#line 836 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet4", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET4); } -#line 1679 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1669 "dhcp4_parser.cc" // lalr1.cc:859 break; case 213: -#line 844 "dhcp4_parser.yy" // lalr1.cc:859 +#line 841 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1688 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1678 "dhcp4_parser.cc" // lalr1.cc:859 break; case 218: -#line 864 "dhcp4_parser.yy" // lalr1.cc:859 +#line 861 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1698 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1688 "dhcp4_parser.cc" // lalr1.cc:859 break; case 219: -#line 868 "dhcp4_parser.yy" // lalr1.cc:859 +#line 865 "dhcp4_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1720,315 +1710,315 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1724 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1714 "dhcp4_parser.cc" // lalr1.cc:859 break; case 220: -#line 890 "dhcp4_parser.yy" // lalr1.cc:859 +#line 887 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the subnet4 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1734 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1724 "dhcp4_parser.cc" // lalr1.cc:859 break; case 221: -#line 894 "dhcp4_parser.yy" // lalr1.cc:859 +#line 891 "dhcp4_parser.yy" // lalr1.cc:859 { // The subnet subnet4 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1744 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1734 "dhcp4_parser.cc" // lalr1.cc:859 break; case 248: -#line 932 "dhcp4_parser.yy" // lalr1.cc:859 +#line 929 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1752 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1742 "dhcp4_parser.cc" // lalr1.cc:859 break; case 249: -#line 934 "dhcp4_parser.yy" // lalr1.cc:859 +#line 931 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); } -#line 1762 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1752 "dhcp4_parser.cc" // lalr1.cc:859 break; case 250: -#line 940 "dhcp4_parser.yy" // lalr1.cc:859 +#line 937 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1770 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1760 "dhcp4_parser.cc" // lalr1.cc:859 break; case 251: -#line 942 "dhcp4_parser.yy" // lalr1.cc:859 +#line 939 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface", iface); ctx.leave(); } -#line 1780 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1770 "dhcp4_parser.cc" // lalr1.cc:859 break; case 252: -#line 948 "dhcp4_parser.yy" // lalr1.cc:859 +#line 945 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1788 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1778 "dhcp4_parser.cc" // lalr1.cc:859 break; case 253: -#line 950 "dhcp4_parser.yy" // lalr1.cc:859 +#line 947 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-interface-id", iface); ctx.leave(); } -#line 1798 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1788 "dhcp4_parser.cc" // lalr1.cc:859 break; case 254: -#line 956 "dhcp4_parser.yy" // lalr1.cc:859 +#line 953 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1806 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1796 "dhcp4_parser.cc" // lalr1.cc:859 break; case 255: -#line 958 "dhcp4_parser.yy" // lalr1.cc:859 +#line 955 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("4o6-subnet", iface); ctx.leave(); } -#line 1816 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1806 "dhcp4_parser.cc" // lalr1.cc:859 break; case 256: -#line 964 "dhcp4_parser.yy" // lalr1.cc:859 +#line 961 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1824 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1814 "dhcp4_parser.cc" // lalr1.cc:859 break; case 257: -#line 966 "dhcp4_parser.yy" // lalr1.cc:859 +#line 963 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); ctx.leave(); } -#line 1834 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1824 "dhcp4_parser.cc" // lalr1.cc:859 break; case 258: -#line 972 "dhcp4_parser.yy" // lalr1.cc:859 +#line 969 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1842 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1832 "dhcp4_parser.cc" // lalr1.cc:859 break; case 259: -#line 974 "dhcp4_parser.yy" // lalr1.cc:859 +#line 971 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); ctx.leave(); } -#line 1852 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1842 "dhcp4_parser.cc" // lalr1.cc:859 break; case 260: -#line 980 "dhcp4_parser.yy" // lalr1.cc:859 +#line 977 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1860 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1850 "dhcp4_parser.cc" // lalr1.cc:859 break; case 261: -#line 982 "dhcp4_parser.yy" // lalr1.cc:859 +#line 979 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); } -#line 1870 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1860 "dhcp4_parser.cc" // lalr1.cc:859 break; case 262: -#line 988 "dhcp4_parser.yy" // lalr1.cc:859 +#line 985 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("eval-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 1881 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1871 "dhcp4_parser.cc" // lalr1.cc:859 break; case 263: -#line 993 "dhcp4_parser.yy" // lalr1.cc:859 +#line 990 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1890 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1880 "dhcp4_parser.cc" // lalr1.cc:859 break; case 264: -#line 998 "dhcp4_parser.yy" // lalr1.cc:859 +#line 995 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1898 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1888 "dhcp4_parser.cc" // lalr1.cc:859 break; case 265: -#line 1000 "dhcp4_parser.yy" // lalr1.cc:859 +#line 997 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1907 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1897 "dhcp4_parser.cc" // lalr1.cc:859 break; case 266: -#line 1005 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1002 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1913 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1903 "dhcp4_parser.cc" // lalr1.cc:859 break; case 267: -#line 1006 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1003 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1919 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1909 "dhcp4_parser.cc" // lalr1.cc:859 break; case 268: -#line 1007 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1004 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1925 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1915 "dhcp4_parser.cc" // lalr1.cc:859 break; case 269: -#line 1010 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1007 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1934 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1924 "dhcp4_parser.cc" // lalr1.cc:859 break; case 270: -#line 1015 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1012 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1943 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1933 "dhcp4_parser.cc" // lalr1.cc:859 break; case 271: -#line 1022 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1019 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1954 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1944 "dhcp4_parser.cc" // lalr1.cc:859 break; case 272: -#line 1027 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1024 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1963 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1953 "dhcp4_parser.cc" // lalr1.cc:859 break; case 277: -#line 1042 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1039 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1973 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1963 "dhcp4_parser.cc" // lalr1.cc:859 break; case 278: -#line 1046 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1043 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1981 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1971 "dhcp4_parser.cc" // lalr1.cc:859 break; case 297: -#line 1076 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1073 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1992 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1982 "dhcp4_parser.cc" // lalr1.cc:859 break; case 298: -#line 1081 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1078 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2001 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1991 "dhcp4_parser.cc" // lalr1.cc:859 break; case 299: -#line 1089 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1086 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2010 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2000 "dhcp4_parser.cc" // lalr1.cc:859 break; case 300: -#line 1092 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1089 "dhcp4_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 2018 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2008 "dhcp4_parser.cc" // lalr1.cc:859 break; case 305: -#line 1108 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1105 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2028 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2018 "dhcp4_parser.cc" // lalr1.cc:859 break; case 306: -#line 1112 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1109 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2036,21 +2026,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2040 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2030 "dhcp4_parser.cc" // lalr1.cc:859 break; case 307: -#line 1123 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1120 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2050 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2040 "dhcp4_parser.cc" // lalr1.cc:859 break; case 308: -#line 1127 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1124 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2058,1248 +2048,1219 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2062 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2052 "dhcp4_parser.cc" // lalr1.cc:859 break; case 322: -#line 1157 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1154 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 2071 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2061 "dhcp4_parser.cc" // lalr1.cc:859 break; case 324: -#line 1164 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1161 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2079 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2069 "dhcp4_parser.cc" // lalr1.cc:859 break; case 325: -#line 1166 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1163 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 2089 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2079 "dhcp4_parser.cc" // lalr1.cc:859 break; case 326: -#line 1172 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1169 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2097 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2087 "dhcp4_parser.cc" // lalr1.cc:859 break; case 327: -#line 1174 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1171 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 2107 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2097 "dhcp4_parser.cc" // lalr1.cc:859 break; case 328: -#line 1180 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1177 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2115 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2105 "dhcp4_parser.cc" // lalr1.cc:859 break; case 329: -#line 1182 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1179 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2125 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2115 "dhcp4_parser.cc" // lalr1.cc:859 break; case 331: -#line 1190 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1187 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2133 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2123 "dhcp4_parser.cc" // lalr1.cc:859 break; case 332: -#line 1192 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1189 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2143 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2133 "dhcp4_parser.cc" // lalr1.cc:859 break; case 333: -#line 1198 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1195 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2152 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2142 "dhcp4_parser.cc" // lalr1.cc:859 break; case 334: -#line 1207 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1204 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2163 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2153 "dhcp4_parser.cc" // lalr1.cc:859 break; case 335: -#line 1212 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1209 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2172 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2162 "dhcp4_parser.cc" // lalr1.cc:859 break; case 340: -#line 1231 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1228 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2182 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2172 "dhcp4_parser.cc" // lalr1.cc:859 break; case 341: -#line 1235 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1232 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2191 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2181 "dhcp4_parser.cc" // lalr1.cc:859 break; case 342: -#line 1243 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1240 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2201 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2191 "dhcp4_parser.cc" // lalr1.cc:859 break; case 343: -#line 1247 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1244 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2210 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2200 "dhcp4_parser.cc" // lalr1.cc:859 break; case 356: -#line 1278 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1275 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2218 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2208 "dhcp4_parser.cc" // lalr1.cc:859 break; case 357: -#line 1280 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1277 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2228 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2218 "dhcp4_parser.cc" // lalr1.cc:859 break; case 360: -#line 1290 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1287 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2237 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2227 "dhcp4_parser.cc" // lalr1.cc:859 break; case 361: -#line 1295 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1292 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2246 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2236 "dhcp4_parser.cc" // lalr1.cc:859 break; case 362: -#line 1303 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1300 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2257 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2247 "dhcp4_parser.cc" // lalr1.cc:859 break; case 363: -#line 1308 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1305 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2256 "dhcp4_parser.cc" // lalr1.cc:859 break; case 368: -#line 1323 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1320 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2266 "dhcp4_parser.cc" // lalr1.cc:859 break; case 369: -#line 1327 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1324 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2286 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2276 "dhcp4_parser.cc" // lalr1.cc:859 break; case 370: -#line 1333 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1330 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2296 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2286 "dhcp4_parser.cc" // lalr1.cc:859 break; case 371: -#line 1337 "dhcp4_parser.yy" // lalr1.cc:859 +#line 1334 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2306 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2296 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 381: -#line 1356 "dhcp4_parser.yy" // lalr1.cc:859 + case 380: +#line 1352 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2314 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2304 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 382: -#line 1358 "dhcp4_parser.yy" // lalr1.cc:859 + case 381: +#line 1354 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); ctx.leave(); } -#line 2324 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2314 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 383: -#line 1364 "dhcp4_parser.yy" // lalr1.cc:859 + case 382: +#line 1360 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2332 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2322 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1366 "dhcp4_parser.yy" // lalr1.cc:859 + case 383: +#line 1362 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2341 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2331 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1371 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.KNOWN_CLIENTS); -} -#line 2349 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 386: -#line 1373 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2358 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 387: -#line 1379 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } -#line 2364 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 388: -#line 1380 "dhcp4_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 2370 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 389: -#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 + case 384: +#line 1370 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2381 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2342 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1391 "dhcp4_parser.yy" // lalr1.cc:859 + case 385: +#line 1375 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2390 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2351 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1404 "dhcp4_parser.yy" // lalr1.cc:859 + case 390: +#line 1388 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2400 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2361 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1408 "dhcp4_parser.yy" // lalr1.cc:859 + case 391: +#line 1392 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2409 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2370 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 397: -#line 1413 "dhcp4_parser.yy" // lalr1.cc:859 + case 392: +#line 1397 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2419 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2380 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 398: -#line 1417 "dhcp4_parser.yy" // lalr1.cc:859 + case 393: +#line 1401 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2428 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2389 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1446 "dhcp4_parser.yy" // lalr1.cc:859 + case 411: +#line 1430 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2436 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2397 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1448 "dhcp4_parser.yy" // lalr1.cc:859 + case 412: +#line 1432 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); ctx.leave(); } -#line 2446 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2407 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 418: -#line 1454 "dhcp4_parser.yy" // lalr1.cc:859 + case 413: +#line 1438 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2454 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2415 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 419: -#line 1456 "dhcp4_parser.yy" // lalr1.cc:859 + case 414: +#line 1440 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); ctx.leave(); } -#line 2464 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2425 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 420: -#line 1462 "dhcp4_parser.yy" // lalr1.cc:859 + case 415: +#line 1446 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2472 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2433 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 421: -#line 1464 "dhcp4_parser.yy" // lalr1.cc:859 + case 416: +#line 1448 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); ctx.leave(); } -#line 2482 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2443 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 422: -#line 1470 "dhcp4_parser.yy" // lalr1.cc:859 + case 417: +#line 1454 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2490 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2451 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 423: -#line 1472 "dhcp4_parser.yy" // lalr1.cc:859 + case 418: +#line 1456 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); ctx.leave(); } -#line 2500 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2461 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 + case 419: +#line 1462 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2508 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2469 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 + case 420: +#line 1464 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2518 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2479 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 + case 421: +#line 1470 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2526 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2487 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 + case 422: +#line 1472 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2536 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2497 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 + case 423: +#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2544 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2505 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1496 "dhcp4_parser.yy" // lalr1.cc:859 + case 424: +#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); ctx.leave(); } -#line 2554 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2515 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1502 "dhcp4_parser.yy" // lalr1.cc:859 + case 425: +#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2562 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2523 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1504 "dhcp4_parser.yy" // lalr1.cc:859 + case 426: +#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); ctx.leave(); } -#line 2572 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2533 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1510 "dhcp4_parser.yy" // lalr1.cc:859 + case 427: +#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2580 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2541 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1512 "dhcp4_parser.yy" // lalr1.cc:859 + case 428: +#line 1496 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2590 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2551 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 + case 429: +#line 1502 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2598 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2559 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 + case 430: +#line 1504 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2608 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2569 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1526 "dhcp4_parser.yy" // lalr1.cc:859 + case 431: +#line 1510 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2619 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2580 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1531 "dhcp4_parser.yy" // lalr1.cc:859 + case 432: +#line 1515 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2628 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2589 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1539 "dhcp4_parser.yy" // lalr1.cc:859 + case 433: +#line 1523 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); ctx.stack_.push_back(m); ctx.enter(ctx.RELAY); } -#line 2639 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2600 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1544 "dhcp4_parser.yy" // lalr1.cc:859 + case 434: +#line 1528 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2648 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2609 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1549 "dhcp4_parser.yy" // lalr1.cc:859 + case 435: +#line 1533 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2656 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2617 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1551 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1535 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2666 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2627 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1560 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1544 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2677 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2638 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1565 "dhcp4_parser.yy" // lalr1.cc:859 + case 438: +#line 1549 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2686 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2647 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1574 "dhcp4_parser.yy" // lalr1.cc:859 + case 441: +#line 1558 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2696 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2657 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1578 "dhcp4_parser.yy" // lalr1.cc:859 + case 442: +#line 1562 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2706 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2667 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 462: -#line 1605 "dhcp4_parser.yy" // lalr1.cc:859 + case 457: +#line 1589 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2714 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2675 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 463: -#line 1607 "dhcp4_parser.yy" // lalr1.cc:859 + case 458: +#line 1591 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2724 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2685 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 464: -#line 1613 "dhcp4_parser.yy" // lalr1.cc:859 + case 459: +#line 1597 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("eval-on-demand", b); } -#line 2733 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2694 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 465: -#line 1622 "dhcp4_parser.yy" // lalr1.cc:859 + case 460: +#line 1606 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2742 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2703 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1629 "dhcp4_parser.yy" // lalr1.cc:859 + case 461: +#line 1613 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2753 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2714 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1634 "dhcp4_parser.yy" // lalr1.cc:859 + case 462: +#line 1618 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2762 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2723 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 472: -#line 1647 "dhcp4_parser.yy" // lalr1.cc:859 + case 467: +#line 1631 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2770 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2731 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 473: -#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 + case 468: +#line 1633 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2780 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2741 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 474: -#line 1655 "dhcp4_parser.yy" // lalr1.cc:859 + case 469: +#line 1639 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2788 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2749 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 475: -#line 1657 "dhcp4_parser.yy" // lalr1.cc:859 + case 470: +#line 1641 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2798 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2759 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 476: -#line 1665 "dhcp4_parser.yy" // lalr1.cc:859 + case 471: +#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2809 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2770 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 477: -#line 1670 "dhcp4_parser.yy" // lalr1.cc:859 + case 472: +#line 1654 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2820 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2781 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 478: -#line 1677 "dhcp4_parser.yy" // lalr1.cc:859 + case 473: +#line 1661 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2830 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2791 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 479: -#line 1681 "dhcp4_parser.yy" // lalr1.cc:859 + case 474: +#line 1665 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2840 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2801 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 497: -#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 + case 492: +#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2849 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2810 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 498: -#line 1713 "dhcp4_parser.yy" // lalr1.cc:859 + case 493: +#line 1697 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2857 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2818 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 499: -#line 1715 "dhcp4_parser.yy" // lalr1.cc:859 + case 494: +#line 1699 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2867 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2828 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 500: -#line 1721 "dhcp4_parser.yy" // lalr1.cc:859 + case 495: +#line 1705 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2875 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2836 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 501: -#line 1723 "dhcp4_parser.yy" // lalr1.cc:859 + case 496: +#line 1707 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2885 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2846 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 502: -#line 1729 "dhcp4_parser.yy" // lalr1.cc:859 + case 497: +#line 1713 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2894 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2855 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1734 "dhcp4_parser.yy" // lalr1.cc:859 + case 498: +#line 1718 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2902 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2863 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1736 "dhcp4_parser.yy" // lalr1.cc:859 + case 499: +#line 1720 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2912 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2873 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1742 "dhcp4_parser.yy" // lalr1.cc:859 + case 500: +#line 1726 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2921 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2882 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1747 "dhcp4_parser.yy" // lalr1.cc:859 + case 501: +#line 1731 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2930 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2891 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1752 "dhcp4_parser.yy" // lalr1.cc:859 + case 502: +#line 1736 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } -#line 2938 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2899 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1754 "dhcp4_parser.yy" // lalr1.cc:859 + case 503: +#line 1738 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2947 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2908 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1760 "dhcp4_parser.yy" // lalr1.cc:859 + case 504: +#line 1744 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2953 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2914 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 + case 505: +#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 2959 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2920 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1764 "dhcp4_parser.yy" // lalr1.cc:859 + case 506: +#line 1748 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } -#line 2967 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2928 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 + case 507: +#line 1750 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 2977 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2938 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1772 "dhcp4_parser.yy" // lalr1.cc:859 + case 508: +#line 1756 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 2986 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2947 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1777 "dhcp4_parser.yy" // lalr1.cc:859 + case 509: +#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 2995 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2956 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1782 "dhcp4_parser.yy" // lalr1.cc:859 + case 510: +#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 3004 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2965 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1787 "dhcp4_parser.yy" // lalr1.cc:859 + case 511: +#line 1771 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3012 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2973 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1789 "dhcp4_parser.yy" // lalr1.cc:859 + case 512: +#line 1773 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3021 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2982 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1795 "dhcp4_parser.yy" // lalr1.cc:859 + case 513: +#line 1779 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3029 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2990 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1798 "dhcp4_parser.yy" // lalr1.cc:859 + case 514: +#line 1782 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3037 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2998 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1801 "dhcp4_parser.yy" // lalr1.cc:859 + case 515: +#line 1785 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3045 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3006 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1804 "dhcp4_parser.yy" // lalr1.cc:859 + case 516: +#line 1788 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3053 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3014 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1807 "dhcp4_parser.yy" // lalr1.cc:859 + case 517: +#line 1791 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3062 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3023 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1813 "dhcp4_parser.yy" // lalr1.cc:859 + case 518: +#line 1797 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3070 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3031 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1815 "dhcp4_parser.yy" // lalr1.cc:859 + case 519: +#line 1799 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3080 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3041 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 520: +#line 1807 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3049 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 521: +#line 1809 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3058 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 522: +#line 1814 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3066 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 523: +#line 1816 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 3075 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 524: +#line 1821 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 3083 "dhcp4_parser.cc" // lalr1.cc:859 break; case 525: #line 1823 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3088 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 526: -#line 1825 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 3097 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 527: -#line 1830 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3105 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 528: -#line 1832 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 3114 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 529: -#line 1837 "dhcp4_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 3122 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 530: -#line 1839 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3131 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3092 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1849 "dhcp4_parser.yy" // lalr1.cc:859 + case 526: +#line 1833 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3142 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3103 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1854 "dhcp4_parser.yy" // lalr1.cc:859 + case 527: +#line 1838 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3151 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3112 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1871 "dhcp4_parser.yy" // lalr1.cc:859 + case 531: +#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3162 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3123 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1876 "dhcp4_parser.yy" // lalr1.cc:859 + case 532: +#line 1860 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3171 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3132 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1888 "dhcp4_parser.yy" // lalr1.cc:859 + case 535: +#line 1872 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3181 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3142 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1892 "dhcp4_parser.yy" // lalr1.cc:859 + case 536: +#line 1876 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3189 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3150 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 549: -#line 1907 "dhcp4_parser.yy" // lalr1.cc:859 + case 544: +#line 1891 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3198 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3159 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 550: -#line 1912 "dhcp4_parser.yy" // lalr1.cc:859 + case 545: +#line 1896 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3206 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3167 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1914 "dhcp4_parser.yy" // lalr1.cc:859 + case 546: +#line 1898 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3216 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3177 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1920 "dhcp4_parser.yy" // lalr1.cc:859 + case 547: +#line 1904 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3227 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3188 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1925 "dhcp4_parser.yy" // lalr1.cc:859 + case 548: +#line 1909 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3236 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3197 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1934 "dhcp4_parser.yy" // lalr1.cc:859 + case 551: +#line 1918 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3246 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3207 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 557: -#line 1938 "dhcp4_parser.yy" // lalr1.cc:859 + case 552: +#line 1922 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3254 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3215 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 564: -#line 1952 "dhcp4_parser.yy" // lalr1.cc:859 + case 559: +#line 1936 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3262 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3223 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 565: -#line 1954 "dhcp4_parser.yy" // lalr1.cc:859 + case 560: +#line 1938 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3272 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3233 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 566: -#line 1960 "dhcp4_parser.yy" // lalr1.cc:859 + case 561: +#line 1944 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3281 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3242 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1965 "dhcp4_parser.yy" // lalr1.cc:859 + case 562: +#line 1949 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3290 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3251 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 568: -#line 1970 "dhcp4_parser.yy" // lalr1.cc:859 + case 563: +#line 1954 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3299 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3260 "dhcp4_parser.cc" // lalr1.cc:859 break; -#line 3303 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3264 "dhcp4_parser.cc" // lalr1.cc:859 default: break; } @@ -3554,105 +3515,105 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -702; + const short int Dhcp4Parser::yypact_ninf_ = -684; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 120, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, 29, 21, 24, 26, 35, 59, 84, - 93, 95, 97, 110, 125, 135, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - 21, -10, 2, 28, 186, 39, 157, 73, 100, 136, - 193, -58, 244, -702, 150, 166, 173, 199, 213, -702, - -702, -702, -702, -702, 251, -702, 72, -702, -702, -702, - -702, -702, -702, -702, 267, 268, -702, -702, -702, -702, - -702, 269, 298, 304, 305, -702, -702, -702, -702, -702, - -702, -702, -702, 314, -702, -702, -702, 90, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, 321, 91, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - 328, 329, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, 111, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, 133, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, 209, 232, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, 292, -702, - -702, 333, -702, -702, -702, 335, -702, -702, 332, 249, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, 340, 343, -702, -702, -702, -702, 341, 345, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, 141, - -702, -702, -702, 365, -702, -702, 369, -702, 370, 371, - -702, -702, 372, 373, 374, -702, -702, -702, 184, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, 21, 21, -702, 229, 376, - 377, 378, 379, 380, -702, 2, -702, 381, 233, 234, - 384, 385, 386, 387, 388, 242, 245, 246, 247, 391, - 395, 396, 397, 398, 399, 400, 401, 255, 403, 404, - 28, -702, 405, 406, 407, 259, 186, -702, 409, 410, - 411, 412, 413, 414, 415, 416, 270, 271, 418, 419, - 421, 422, 423, 39, -702, 424, 425, 157, -702, 426, - 427, 428, 429, 430, 431, 432, 433, -702, 73, -702, - 434, 435, 290, 436, 438, 439, 293, -702, 136, 441, - 294, 297, -702, 193, 444, 445, -35, -702, 300, 450, - 451, 306, 452, 309, 311, 459, 460, 312, 313, 315, - 463, 466, 244, -702, -702, -702, 467, 465, 468, 21, - 21, 21, -702, 469, -702, -702, 323, 324, 327, 471, - 472, -702, -702, -702, -702, 475, 476, 477, 478, 479, - 480, 481, 482, -702, 483, 484, -702, 487, 62, 67, - -702, -702, 338, 344, 346, 488, 490, 348, 349, 350, - -702, -702, 51, 487, 351, 497, 496, -702, 354, 119, - -702, 487, 355, 356, 357, 358, 359, 360, 361, -702, - 362, 363, -702, 364, 366, 367, -702, -702, 368, -702, - -702, -702, 375, 21, -702, -702, 382, 383, -702, 389, - -702, -702, 12, 393, -702, -702, -702, 117, 390, -702, - 21, 28, 392, -702, -702, -702, 186, -702, -702, -702, - 192, 192, 513, 514, 515, 516, 198, 517, 519, 179, - 96, 244, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, 520, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, 521, 440, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, 201, -702, 207, -702, -702, 210, -702, -702, - -702, -702, 491, 525, 526, 530, 531, -702, -702, -702, - 235, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, 285, -702, 532, 533, -702, -702, - 535, 534, -702, -702, 536, 540, -702, -702, 538, 542, - -702, -702, -702, -702, -702, -702, 40, -702, -702, -702, - -702, -702, -702, -702, 41, -702, -702, 541, 543, -702, - 544, 545, 546, 547, 548, 549, 286, -702, -702, -702, - -702, -702, -702, -702, -702, -702, 287, -702, -702, -702, - 288, 408, -702, 550, 551, -702, -702, 553, 552, -702, - -702, 554, -702, 556, 392, -702, -702, 557, 559, 560, - 561, 336, 417, 420, 437, 442, 562, 563, 192, -702, - -702, 39, -702, 513, 136, -702, 514, 193, -702, 515, - 124, -702, 516, 198, -702, 131, 517, -702, -58, -702, - 519, 443, 446, 447, 448, 449, 453, 179, -702, 564, - 565, 96, -702, -702, -702, 566, 570, 157, -702, 520, - 73, -702, 521, 571, -702, 569, -702, 337, 455, 456, - 457, -702, -702, -702, -702, -702, 458, 461, -702, 289, - -702, 568, -702, 572, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, 295, -702, -702, -702, - -702, -702, -702, -702, -702, -702, 573, -702, -702, -702, - -702, -702, -702, -702, 574, 575, -702, -702, -702, -702, - -702, 296, -702, -702, -702, -702, -702, -702, -702, -702, - 462, 464, -702, -702, 470, 303, -702, 576, -702, 473, - 578, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, 124, -702, 577, 474, -702, 131, - -702, -702, -702, -702, -702, -702, -702, -702, 231, -702, - -702, 485, -702, -702, -15, 578, -702, -702, -702, 579, - -702, -702, -702, 307, -702, -702, -702, -702, -702, 582, - 486, 583, -15, -702, 584, -702, 492, -702, 581, -702, - -702, 248, -702, -65, 581, -702, -702, 587, 588, 591, - 319, -702, -702, -702, -702, -702, -702, 592, 494, 489, - 493, -65, -702, 495, -702, -702, -702, -702, -702 + 214, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, 32, 18, 27, 58, 73, 75, 95, + 97, 131, 133, 155, 173, 175, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + 18, -106, 2, 24, 217, 109, 33, 119, 143, 132, + 156, -38, 179, -684, 193, 203, 212, 210, 232, -684, + -684, -684, -684, -684, 234, -684, 52, -684, -684, -684, + -684, -684, -684, -684, 242, 258, -684, -684, -684, -684, + -684, 275, 278, 293, 308, -684, -684, -684, -684, -684, + -684, -684, -684, 313, -684, -684, -684, 68, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, 320, 80, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + 326, 333, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, 92, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, 112, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, 334, 340, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, 336, -684, -684, 341, + -684, -684, -684, 342, -684, -684, 354, 345, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, 359, + 360, -684, -684, -684, -684, 357, 363, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, 126, -684, -684, + -684, 366, -684, -684, 367, -684, 368, 369, -684, -684, + 370, 371, 372, -684, -684, -684, 229, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, 18, 18, -684, 230, 373, 375, 376, + 377, 378, -684, 2, -684, 379, 233, 235, 381, 383, + 384, 385, 386, 243, 244, 245, 246, 387, 392, 393, + 394, 395, 396, 397, 398, 254, 400, 401, 24, -684, + 402, 403, 404, 259, 217, -684, 405, 407, 408, 409, + 410, 411, 412, 413, 271, 268, 414, 417, 418, 419, + 420, 109, -684, 421, 33, -684, 422, 423, 424, 425, + 426, 427, 428, 429, -684, 119, -684, 430, 431, 287, + 433, 434, 435, 290, -684, 132, 438, 292, 294, -684, + 156, 440, 442, -18, -684, 299, 445, 447, 303, 449, + 307, 309, 455, 456, 310, 311, 312, 460, 462, 179, + -684, -684, -684, 463, 461, 464, 18, 18, 18, -684, + 465, -684, -684, 321, 322, 325, 467, 468, -684, -684, + -684, -684, 471, 472, 473, 474, 475, 476, 477, 478, + -684, 479, 480, -684, 483, 79, 302, -684, -684, 335, + 343, 344, 484, 486, 346, 347, 348, -684, -684, 236, + 483, 349, 485, 491, -684, 351, -684, 483, 352, 353, + 355, 356, 358, 361, 362, -684, 364, 365, -684, 374, + 380, 382, -684, -684, 388, -684, -684, -684, 389, 18, + -684, -684, 390, 391, -684, 399, -684, -684, 21, 406, + -684, -684, -684, -59, 415, -684, 18, 24, 416, -684, + -684, -684, 217, -684, -684, -684, 187, 187, 495, 498, + 500, 501, 166, 504, 507, 147, 239, 179, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, 508, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, 509, 432, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, 250, -684, 253, -684, -684, + 256, -684, -684, -684, -684, 513, 514, 515, 517, 519, + -684, -684, -684, 257, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, 260, -684, 518, + 481, -684, -684, 520, 524, -684, -684, 523, 528, -684, + -684, 526, 530, -684, -684, -684, -684, -684, -684, 48, + -684, -684, -684, -684, -684, -684, -684, 122, -684, -684, + 529, 531, -684, 536, 538, 539, 540, 541, 542, 263, + -684, -684, -684, -684, -684, -684, -684, -684, -684, 266, + -684, -684, -684, 267, 436, -684, 543, 545, -684, -684, + 544, 548, -684, -684, 546, -684, 549, 416, -684, -684, + 551, 552, 553, 554, 437, 439, 443, 444, 448, 555, + 556, 187, -684, -684, 109, -684, 495, 132, -684, 498, + 156, -684, 500, 35, -684, 501, 166, -684, 67, 504, + -684, -38, -684, 507, 450, 451, 452, 453, 454, 457, + 147, -684, 557, 558, 239, -684, -684, -684, 559, 561, + 33, -684, 508, 119, -684, 509, 562, -684, 547, -684, + 118, 441, 446, 459, -684, -684, -684, -684, -684, 466, + 469, -684, 269, -684, 560, -684, 563, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, 270, + -684, -684, -684, -684, -684, -684, -684, -684, -684, 565, + -684, -684, -684, -684, -684, -684, -684, 564, 567, -684, + -684, -684, -684, -684, 273, -684, -684, -684, -684, -684, + -684, -684, -684, 470, 482, -684, -684, 487, 295, -684, + 566, -684, 488, 568, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, 35, -684, 569, + 458, -684, 67, -684, -684, -684, -684, -684, -684, -684, + -684, 158, -684, -684, 489, -684, -684, 69, 568, -684, + -684, -684, 572, -684, -684, -684, 297, -684, -684, -684, + -684, -684, 573, 494, 574, 69, -684, 575, -684, 490, + -684, 576, -684, -684, 228, -684, -24, 576, -684, -684, + 577, 578, 581, 298, -684, -684, -684, -684, -684, -684, + 583, 496, 506, 511, -24, -684, 492, -684, -684, -684, + -684, -684 }; const unsigned short int @@ -3662,507 +3623,505 @@ namespace isc { namespace dhcp { 20, 22, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 34, 30, 29, 26, 27, 28, 33, 3, 31, 32, 54, 5, - 66, 7, 108, 9, 220, 11, 370, 13, 397, 15, - 299, 17, 307, 19, 342, 21, 185, 23, 478, 25, - 43, 37, 0, 0, 0, 0, 0, 399, 0, 309, + 66, 7, 108, 9, 220, 11, 370, 13, 392, 15, + 299, 17, 307, 19, 342, 21, 185, 23, 473, 25, + 43, 37, 0, 0, 0, 0, 0, 394, 0, 309, 344, 0, 0, 45, 0, 44, 0, 0, 38, 64, - 531, 525, 527, 529, 0, 63, 0, 56, 58, 60, - 61, 62, 59, 100, 0, 0, 416, 418, 420, 121, + 526, 520, 522, 524, 0, 63, 0, 56, 58, 60, + 61, 62, 59, 100, 0, 0, 411, 413, 415, 121, 123, 0, 0, 0, 0, 212, 297, 334, 271, 163, - 442, 177, 196, 0, 466, 476, 93, 0, 68, 70, + 437, 177, 196, 0, 461, 471, 93, 0, 68, 70, 71, 72, 73, 88, 89, 76, 77, 78, 79, 83, 84, 74, 75, 81, 82, 90, 91, 92, 80, 85, 86, 87, 110, 112, 116, 0, 0, 102, 104, 105, - 106, 107, 250, 252, 254, 362, 383, 248, 256, 258, - 0, 0, 264, 262, 260, 389, 438, 247, 224, 225, + 106, 107, 250, 252, 254, 362, 382, 248, 256, 258, + 0, 0, 264, 262, 260, 384, 433, 247, 224, 225, 226, 239, 0, 222, 229, 243, 244, 245, 230, 231, 234, 235, 237, 232, 233, 227, 228, 246, 236, 240, - 241, 242, 238, 381, 385, 380, 376, 377, 375, 0, - 372, 374, 378, 379, 436, 424, 426, 430, 428, 434, - 432, 422, 415, 411, 0, 400, 401, 412, 413, 414, - 408, 403, 409, 405, 406, 407, 410, 404, 0, 324, - 153, 0, 328, 326, 331, 0, 320, 321, 0, 310, - 311, 313, 323, 314, 315, 316, 330, 317, 318, 319, - 356, 0, 0, 354, 355, 358, 359, 0, 345, 346, - 348, 349, 350, 351, 352, 353, 192, 194, 189, 0, - 187, 190, 191, 0, 498, 500, 0, 503, 0, 0, - 507, 511, 0, 0, 0, 516, 523, 496, 0, 480, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 42, 0, 0, 35, 0, 0, - 0, 0, 0, 0, 53, 0, 55, 0, 0, 0, + 241, 242, 238, 380, 379, 376, 377, 375, 0, 372, + 374, 378, 431, 419, 421, 425, 423, 429, 427, 417, + 410, 406, 0, 395, 396, 407, 408, 409, 403, 398, + 404, 400, 401, 402, 405, 399, 0, 324, 153, 0, + 328, 326, 331, 0, 320, 321, 0, 310, 311, 313, + 323, 314, 315, 316, 330, 317, 318, 319, 356, 0, + 0, 354, 355, 358, 359, 0, 345, 346, 348, 349, + 350, 351, 352, 353, 192, 194, 189, 0, 187, 190, + 191, 0, 493, 495, 0, 498, 0, 0, 502, 506, + 0, 0, 0, 511, 518, 491, 0, 475, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 42, 0, 0, 35, 0, 0, 0, 0, + 0, 0, 53, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 67, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 221, 0, 0, 371, 0, 0, 0, 0, + 0, 0, 0, 0, 393, 0, 300, 0, 0, 0, + 0, 0, 0, 0, 308, 0, 0, 0, 0, 343, + 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 371, 0, - 0, 0, 0, 0, 0, 0, 0, 398, 0, 300, - 0, 0, 0, 0, 0, 0, 0, 308, 0, 0, - 0, 0, 343, 0, 0, 0, 0, 186, 0, 0, + 474, 46, 39, 0, 0, 0, 0, 0, 0, 57, + 0, 98, 99, 0, 0, 0, 0, 0, 94, 95, + 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 460, 0, 0, 69, 0, 0, 0, 120, 103, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 270, 0, + 0, 0, 0, 0, 223, 0, 373, 0, 0, 0, + 0, 0, 0, 0, 0, 397, 0, 0, 322, 0, + 0, 0, 333, 312, 0, 360, 361, 347, 0, 0, + 188, 492, 0, 0, 497, 0, 500, 501, 0, 0, + 508, 509, 510, 0, 0, 476, 0, 0, 0, 521, + 523, 525, 0, 412, 414, 416, 0, 0, 214, 301, + 336, 273, 0, 0, 179, 0, 0, 0, 47, 111, + 114, 115, 113, 118, 119, 117, 251, 253, 255, 364, + 36, 383, 249, 257, 259, 266, 267, 268, 265, 263, + 261, 386, 0, 381, 432, 420, 422, 426, 424, 430, + 428, 418, 325, 154, 329, 327, 332, 357, 193, 195, + 494, 496, 499, 504, 505, 503, 507, 513, 514, 515, + 516, 517, 512, 519, 40, 0, 531, 0, 528, 530, + 0, 140, 146, 148, 150, 0, 0, 0, 0, 0, + 159, 161, 139, 0, 125, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 0, 218, 0, + 215, 216, 305, 0, 302, 303, 340, 0, 337, 338, + 277, 0, 274, 275, 172, 173, 174, 175, 176, 0, + 165, 167, 168, 169, 170, 171, 441, 0, 439, 183, + 0, 180, 181, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 201, 202, 203, 204, 205, 467, 469, 0, + 463, 465, 466, 0, 49, 368, 0, 365, 366, 390, + 0, 387, 388, 435, 0, 65, 0, 0, 527, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 479, 46, 39, 0, 0, 0, 0, - 0, 0, 57, 0, 98, 99, 0, 0, 0, 0, - 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, - 0, 0, 0, 465, 0, 0, 69, 0, 0, 0, - 120, 103, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 270, 0, 0, 0, 0, 0, 223, 0, 0, - 373, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 322, 0, 0, 0, 333, 312, 0, 360, - 361, 347, 0, 0, 188, 497, 0, 0, 502, 0, - 505, 506, 0, 0, 513, 514, 515, 0, 0, 481, - 0, 0, 0, 526, 528, 530, 0, 417, 419, 421, - 0, 0, 214, 301, 336, 273, 0, 0, 179, 0, - 0, 0, 47, 111, 114, 115, 113, 118, 119, 117, - 251, 253, 255, 364, 36, 384, 249, 257, 259, 266, - 267, 268, 265, 263, 261, 391, 0, 382, 387, 388, - 386, 437, 425, 427, 431, 429, 435, 433, 423, 325, - 154, 329, 327, 332, 357, 193, 195, 499, 501, 504, - 509, 510, 508, 512, 519, 518, 520, 521, 522, 517, - 524, 40, 0, 536, 0, 533, 535, 0, 140, 146, - 148, 150, 0, 0, 0, 0, 0, 159, 161, 139, - 0, 125, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 0, 218, 0, 215, 216, 305, - 0, 302, 303, 340, 0, 337, 338, 277, 0, 274, - 275, 172, 173, 174, 175, 176, 0, 165, 167, 168, - 169, 170, 171, 446, 0, 444, 183, 0, 180, 181, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 201, - 202, 203, 204, 205, 472, 474, 0, 468, 470, 471, - 0, 49, 368, 0, 365, 366, 395, 0, 392, 393, - 440, 0, 65, 0, 0, 532, 101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, - 124, 0, 213, 0, 309, 298, 0, 344, 335, 0, - 0, 272, 0, 0, 164, 448, 0, 443, 0, 178, - 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, - 0, 0, 467, 477, 51, 0, 50, 0, 363, 0, - 399, 390, 0, 0, 439, 0, 534, 0, 0, 0, - 0, 152, 155, 156, 157, 158, 0, 0, 126, 0, - 217, 0, 304, 0, 339, 296, 295, 284, 285, 287, - 281, 282, 283, 293, 294, 292, 0, 279, 286, 288, - 289, 290, 291, 276, 166, 462, 0, 460, 461, 455, - 456, 457, 458, 459, 0, 449, 450, 452, 453, 454, - 445, 0, 182, 206, 207, 208, 209, 210, 211, 199, - 0, 0, 469, 48, 0, 0, 367, 0, 394, 0, - 0, 142, 143, 144, 145, 141, 147, 149, 151, 160, - 162, 219, 306, 341, 0, 278, 0, 0, 447, 0, - 184, 473, 475, 52, 369, 396, 441, 540, 0, 538, - 280, 0, 464, 451, 0, 0, 537, 463, 552, 0, - 550, 548, 544, 0, 542, 546, 547, 545, 539, 0, - 0, 0, 0, 541, 0, 549, 0, 543, 0, 551, - 556, 0, 554, 0, 0, 553, 564, 0, 0, 0, - 0, 558, 560, 561, 562, 563, 555, 0, 0, 0, - 0, 0, 557, 0, 566, 567, 568, 559, 565 + 0, 0, 122, 124, 0, 213, 0, 309, 298, 0, + 344, 335, 0, 0, 272, 0, 0, 164, 443, 0, + 438, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 462, 472, 51, 0, 50, + 0, 363, 0, 394, 385, 0, 0, 434, 0, 529, + 0, 0, 0, 0, 152, 155, 156, 157, 158, 0, + 0, 126, 0, 217, 0, 304, 0, 339, 296, 295, + 284, 285, 287, 281, 282, 283, 293, 294, 292, 0, + 279, 286, 288, 289, 290, 291, 276, 166, 457, 0, + 455, 456, 450, 451, 452, 453, 454, 0, 444, 445, + 447, 448, 449, 440, 0, 182, 206, 207, 208, 209, + 210, 211, 199, 0, 0, 464, 48, 0, 0, 367, + 0, 389, 0, 0, 142, 143, 144, 145, 141, 147, + 149, 151, 160, 162, 219, 306, 341, 0, 278, 0, + 0, 442, 0, 184, 468, 470, 52, 369, 391, 436, + 535, 0, 533, 280, 0, 459, 446, 0, 0, 532, + 458, 547, 0, 545, 543, 539, 0, 537, 541, 542, + 540, 534, 0, 0, 0, 0, 536, 0, 544, 0, + 538, 0, 546, 551, 0, 549, 0, 0, 548, 559, + 0, 0, 0, 0, 553, 555, 556, 557, 558, 550, + 0, 0, 0, 0, 0, 552, 0, 561, 562, 563, + 554, 560 }; const short int Dhcp4Parser::yypgoto_[] = { - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -49, -702, 101, -702, -702, -702, - -702, -702, -702, -702, -702, -406, -702, -702, -702, -62, - -702, -702, -702, 264, -702, -702, -702, -702, 92, 261, - -51, -40, -27, -702, -702, -25, -702, -702, 86, 263, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, 89, -95, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -69, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -108, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -114, -702, -702, -702, -111, 222, -702, -702, -702, -702, - -702, -702, -702, -118, -702, -702, -702, -702, -702, -702, - -701, -702, -702, -702, -92, -702, -702, -702, -89, 262, - -702, -702, -702, -702, -702, -702, -702, -702, -679, -702, - -702, -702, -46, -702, -21, -702, -665, -702, -702, -702, - -702, -702, -702, -702, -702, -98, -702, -702, -218, -66, - -702, -702, -702, -702, -702, -88, -702, -702, -702, -85, - -702, 243, -702, -64, -702, -702, -702, -702, -702, -52, - -702, -702, -702, -702, -702, -50, -702, -702, -702, -87, - -702, -702, -702, -84, -702, 237, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -115, -702, -702, - -702, -109, 274, -702, -702, -53, -702, -702, -702, -702, - -702, -702, -702, -702, -116, -702, -702, -702, -107, -702, - 272, -44, -702, -43, -702, -33, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -664, -702, -702, -702, -702, -702, -702, - -72, -702, -702, -702, -192, -702, -702, -702, -702, -702, - -702, -702, -702, -79, -702, -702, -702, -702, -702, -702, - -702, -702, 142, 252, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -702, -702, -702, -702, - -702, -702, -702, -702, -702, -702, -22, -702, -702, -702, - -186, -702, -702, -199, -702, -702, -702, -702, -702, -702, - -205, -702, -702, -221, -702, -702, -702, -702, -702 + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -49, -684, 114, -684, -684, -684, + -684, -684, -684, -684, -684, -447, -684, -684, -684, -62, + -684, -684, -684, 280, -684, -684, -684, -684, 72, 272, + -51, -28, -27, -684, -684, -22, -684, -684, 76, 247, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, 81, -105, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -69, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -112, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -118, -684, -684, -684, -113, 218, -684, -684, -684, -684, + -684, -684, -684, -117, -684, -684, -684, -684, -684, -684, + -683, -684, -684, -684, -94, -684, -684, -684, -89, 255, + -684, -684, -684, -684, -684, -684, -684, -684, -682, -684, + -684, -684, -33, -684, -26, -684, -674, -684, -684, -684, + -684, -684, -684, -684, -684, -96, -684, -684, -217, -66, + -684, -684, -684, -684, -684, -88, -684, -684, -684, -85, + -684, 238, -684, -64, -684, -684, -684, -684, -684, -41, + -684, -684, -684, -684, -684, -50, -684, -684, -684, -87, + -684, -684, -684, -86, -684, 237, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -116, -684, -684, + -684, -111, 264, -684, -684, -48, -684, -684, -684, -684, + -684, -114, -684, -684, -684, -110, -684, 282, -46, -684, + -43, -684, -39, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -672, -684, -684, -684, -684, -684, -684, -55, -684, -684, + -684, -208, -684, -684, -684, -684, -684, -684, -684, -684, + -84, -684, -684, -684, -684, -684, -684, -684, -684, 139, + 262, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -684, -684, -684, -684, -684, -684, -684, + -684, -684, -684, -14, -684, -684, -684, -175, -684, -684, + -191, -684, -684, -684, -684, -684, -684, -199, -684, -684, + -215, -684, -684, -684, -684, -684 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 34, 35, 36, 61, 545, 77, - 78, 37, 60, 74, 75, 533, 681, 745, 746, 116, - 39, 62, 86, 87, 88, 309, 41, 63, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 317, 146, 147, - 43, 64, 148, 342, 149, 343, 536, 150, 344, 539, - 151, 126, 323, 127, 324, 610, 611, 612, 697, 835, - 613, 698, 614, 699, 615, 700, 616, 237, 381, 618, - 619, 620, 621, 622, 706, 623, 707, 128, 333, 646, - 647, 648, 649, 650, 651, 652, 129, 335, 657, 658, - 659, 728, 57, 71, 269, 270, 271, 394, 272, 395, - 130, 336, 666, 667, 668, 669, 670, 671, 672, 673, - 131, 329, 626, 627, 628, 711, 45, 65, 172, 173, - 174, 353, 175, 348, 176, 349, 177, 350, 178, 354, - 179, 355, 180, 360, 181, 359, 182, 358, 552, 183, - 184, 132, 332, 638, 639, 640, 720, 786, 787, 133, - 330, 51, 68, 630, 631, 632, 714, 53, 69, 238, - 239, 240, 241, 242, 243, 244, 380, 245, 384, 246, - 383, 247, 248, 385, 249, 134, 331, 634, 635, 636, - 717, 55, 70, 257, 258, 259, 260, 261, 389, 262, - 263, 264, 265, 186, 351, 683, 684, 685, 747, 47, - 66, 199, 200, 201, 365, 187, 352, 203, 366, 560, - 188, 361, 687, 688, 689, 750, 49, 67, 214, 215, - 216, 135, 320, 136, 321, 137, 322, 220, 376, 221, - 370, 222, 371, 223, 373, 224, 372, 225, 375, 226, - 374, 227, 369, 192, 362, 691, 753, 138, 334, 654, - 655, 725, 804, 805, 806, 807, 808, 846, 809, 139, - 140, 338, 676, 677, 678, 739, 679, 740, 141, 339, - 59, 72, 288, 289, 290, 291, 399, 292, 400, 293, - 294, 402, 295, 296, 297, 405, 582, 298, 406, 299, - 300, 301, 302, 410, 589, 303, 411, 89, 311, 90, - 312, 91, 313, 92, 310, 594, 595, 596, 693, 858, - 859, 864, 873, 874, 875, 876, 881, 877, 879, 891, - 892, 893, 900, 901, 902, 907, 903, 904, 905 + 22, 23, 24, 25, 34, 35, 36, 61, 541, 77, + 78, 37, 60, 74, 75, 529, 674, 738, 739, 116, + 39, 62, 86, 87, 88, 307, 41, 63, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 315, 146, 147, + 43, 64, 148, 340, 149, 341, 532, 150, 342, 535, + 151, 126, 321, 127, 322, 603, 604, 605, 690, 828, + 606, 691, 607, 692, 608, 693, 609, 235, 378, 611, + 612, 613, 614, 615, 699, 616, 700, 128, 331, 639, + 640, 641, 642, 643, 644, 645, 129, 333, 650, 651, + 652, 721, 57, 71, 267, 268, 269, 391, 270, 392, + 130, 334, 659, 660, 661, 662, 663, 664, 665, 666, + 131, 327, 619, 620, 621, 704, 45, 65, 172, 173, + 174, 351, 175, 346, 176, 347, 177, 348, 178, 352, + 179, 353, 180, 358, 181, 357, 182, 356, 548, 183, + 184, 132, 330, 631, 632, 633, 713, 779, 780, 133, + 328, 51, 68, 623, 624, 625, 707, 53, 69, 236, + 237, 238, 239, 240, 241, 242, 377, 243, 381, 244, + 380, 245, 246, 382, 247, 134, 329, 627, 628, 629, + 710, 55, 70, 255, 256, 257, 258, 259, 386, 260, + 261, 262, 263, 186, 349, 676, 677, 678, 740, 47, + 66, 198, 199, 200, 363, 187, 350, 188, 359, 680, + 681, 682, 743, 49, 67, 212, 213, 214, 135, 318, + 136, 319, 137, 320, 218, 373, 219, 367, 220, 368, + 221, 370, 222, 369, 223, 372, 224, 371, 225, 366, + 192, 360, 684, 746, 138, 332, 647, 648, 718, 797, + 798, 799, 800, 801, 839, 802, 139, 140, 336, 669, + 670, 671, 732, 672, 733, 141, 337, 59, 72, 286, + 287, 288, 289, 396, 290, 397, 291, 292, 399, 293, + 294, 295, 402, 575, 296, 403, 297, 298, 299, 300, + 407, 582, 301, 408, 89, 309, 90, 310, 91, 311, + 92, 308, 587, 588, 589, 686, 851, 852, 857, 866, + 867, 868, 869, 874, 870, 872, 884, 885, 886, 893, + 894, 895, 900, 896, 897, 898 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 85, 254, 228, 167, 195, 212, 255, 236, 253, 268, - 287, 73, 79, 202, 168, 185, 198, 213, 256, 781, - 196, 189, 190, 217, 218, 169, 27, 580, 28, 26, - 29, 38, 191, 40, 219, 266, 267, 230, 170, 93, - 171, 782, 42, 723, 726, 197, 724, 727, 94, 95, - 96, 97, 98, 99, 100, 785, 792, 553, 266, 267, - 95, 96, 97, 98, 896, 561, 44, 897, 898, 899, - 101, 102, 103, 104, 105, 315, 534, 535, 106, 107, - 316, 101, 102, 103, 537, 538, 152, 153, 154, 108, - 107, 46, 84, 340, 346, 96, 97, 98, 341, 347, - 48, 155, 50, 156, 52, 109, 110, 157, 158, 159, - 160, 161, 162, 868, 363, 869, 870, 54, 163, 364, - 111, 164, 165, 112, 107, 549, 550, 551, 80, 166, - 113, 114, 56, 581, 115, 84, 367, 81, 82, 83, - 76, 368, 58, 781, 396, 95, 96, 97, 98, 397, - 106, 204, 84, 96, 97, 98, 304, 205, 206, 207, - 208, 209, 210, 229, 211, 782, 101, 102, 103, 305, - 105, 30, 31, 32, 33, 107, 230, 306, 84, 785, - 792, 106, 107, 230, 584, 558, 559, 412, 230, 84, - 231, 232, 413, 158, 233, 234, 235, 162, 142, 143, - 674, 675, 144, 163, 340, 145, 164, 307, 107, 692, - 694, 795, 796, 346, 166, 695, 308, 377, 696, 598, - 193, 156, 194, 84, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 608, 865, 378, 163, 866, 708, 164, - 585, 586, 587, 709, 230, 230, 250, 231, 232, 251, - 252, 894, 388, 85, 895, 314, 414, 415, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 588, 318, 319, 325, 84, 660, 661, 662, 663, 664, - 665, 84, 641, 642, 643, 644, 84, 645, 708, 737, - 741, 412, 363, 710, 738, 742, 743, 841, 844, 396, - 379, 167, 326, 845, 850, 195, 367, 84, 327, 328, - 882, 854, 168, 185, 202, 883, 212, 198, 337, 189, - 190, 196, 911, 169, 254, 345, 236, 912, 213, 255, - 191, 253, 356, 357, 217, 218, 170, 382, 171, 386, - 387, 256, 84, 84, 390, 219, 197, 391, 393, 392, - 287, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 831, 832, 833, 834, 398, - 513, 514, 515, 401, 403, 404, 407, 408, 409, 416, - 417, 418, 419, 420, 421, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 84, 435, 432, 433, 434, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 447, - 448, 449, 450, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 462, 463, 461, 464, 465, 466, 468, 469, - 471, 472, 473, 474, 475, 476, 477, 478, 480, 481, - 483, 482, 484, 485, 576, 488, 486, 489, 492, 493, - 490, 617, 617, 495, 496, 497, 499, 498, 609, 609, - 500, 591, 501, 502, 503, 504, 505, 507, 506, 287, - 508, 510, 511, 517, 518, 512, 516, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 761, 540, 529, - 530, 531, 532, 543, 541, 701, 542, 28, 546, 547, - 548, 554, 555, 556, 557, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 571, 583, 572, 573, 574, 593, - 625, 629, 633, 637, 653, 575, 656, 682, 686, 702, - 703, 690, 577, 578, 704, 705, 713, 716, 712, 579, - 590, 715, 718, 719, 721, 722, 730, 729, 731, 732, - 733, 734, 735, 736, 749, 752, 748, 544, 744, 751, - 755, 757, 754, 758, 759, 760, 766, 767, 820, 821, - 762, 763, 823, 824, 830, 829, 842, 847, 849, 422, - 843, 861, 848, 880, 855, 857, 884, 886, 890, 888, - 764, 908, 909, 765, 813, 910, 913, 814, 815, 816, - 817, 446, 597, 592, 818, 836, 837, 838, 839, 451, - 624, 840, 851, 768, 852, 794, 812, 811, 494, 819, - 853, 770, 769, 856, 793, 467, 860, 862, 772, 771, - 491, 487, 774, 773, 826, 867, 828, 885, 825, 617, - 915, 470, 889, 827, 916, 918, 609, 914, 254, 167, - 479, 780, 236, 255, 810, 253, 798, 863, 775, 799, - 168, 185, 822, 797, 509, 256, 268, 189, 190, 776, - 788, 169, 756, 680, 783, 800, 789, 790, 191, 878, - 777, 801, 802, 887, 170, 195, 171, 791, 212, 906, - 917, 0, 803, 778, 202, 779, 0, 198, 0, 784, - 213, 196, 0, 0, 0, 0, 217, 218, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, - 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, + 85, 252, 226, 167, 194, 210, 253, 234, 251, 266, + 285, 73, 79, 549, 168, 185, 197, 211, 201, 189, + 554, 215, 190, 27, 216, 28, 191, 29, 217, 254, + 774, 775, 26, 195, 38, 93, 573, 169, 170, 778, + 196, 785, 76, 171, 94, 95, 96, 97, 98, 99, + 100, 716, 264, 265, 717, 313, 95, 96, 97, 98, + 314, 577, 578, 579, 580, 40, 101, 102, 103, 104, + 105, 338, 264, 265, 106, 107, 339, 101, 102, 103, + 42, 105, 44, 344, 107, 108, 107, 228, 345, 96, + 97, 98, 581, 530, 531, 361, 193, 156, 109, 110, + 362, 158, 46, 889, 48, 162, 890, 891, 892, 163, + 84, 163, 164, 111, 164, 364, 112, 106, 107, 228, + 365, 228, 166, 113, 114, 719, 80, 115, 720, 393, + 95, 96, 97, 98, 394, 81, 82, 83, 50, 574, + 52, 96, 97, 98, 788, 789, 824, 825, 826, 827, + 84, 101, 102, 103, 774, 775, 152, 153, 154, 227, + 107, 858, 54, 778, 859, 785, 30, 31, 32, 33, + 107, 155, 84, 156, 157, 158, 159, 160, 161, 162, + 56, 84, 58, 84, 228, 163, 229, 230, 164, 165, + 231, 232, 233, 106, 202, 861, 166, 862, 863, 302, + 203, 204, 205, 206, 207, 208, 303, 209, 228, 248, + 229, 230, 249, 250, 591, 84, 304, 84, 305, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 142, + 143, 887, 409, 144, 888, 306, 145, 410, 312, 228, + 653, 654, 655, 656, 657, 658, 316, 634, 635, 636, + 637, 85, 638, 338, 411, 412, 687, 84, 685, 344, + 701, 688, 317, 701, 689, 702, 730, 84, 703, 734, + 409, 731, 361, 837, 735, 736, 393, 834, 838, 323, + 84, 843, 324, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 325, 364, 167, + 875, 904, 194, 847, 84, 876, 905, 545, 546, 547, + 168, 185, 326, 210, 197, 189, 201, 335, 190, 533, + 534, 252, 191, 234, 343, 211, 253, 84, 251, 215, + 354, 195, 216, 169, 170, 84, 217, 355, 196, 171, + 667, 668, 374, 375, 376, 379, 383, 285, 385, 254, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 384, 387, 388, 389, 390, 509, 510, 511, + 395, 398, 400, 401, 404, 405, 406, 414, 413, 415, + 416, 417, 418, 420, 421, 423, 422, 424, 425, 426, + 427, 432, 428, 429, 430, 431, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 444, 445, 446, 449, + 447, 450, 451, 452, 453, 454, 455, 456, 459, 458, + 457, 460, 461, 462, 463, 465, 467, 468, 469, 470, + 471, 472, 473, 474, 476, 477, 478, 479, 480, 481, + 569, 482, 484, 485, 488, 486, 489, 610, 610, 492, + 491, 493, 494, 495, 602, 602, 496, 584, 497, 498, + 499, 500, 501, 502, 503, 285, 504, 506, 507, 513, + 514, 508, 512, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 536, 706, 525, 526, 527, 528, 539, + 551, 537, 538, 28, 542, 543, 544, 550, 552, 553, + 555, 556, 618, 557, 558, 622, 559, 626, 630, 560, + 561, 646, 562, 563, 649, 675, 679, 694, 695, 696, + 683, 697, 564, 698, 705, 576, 708, 709, 565, 711, + 566, 712, 714, 715, 723, 722, 567, 568, 570, 571, + 724, 586, 725, 726, 727, 728, 729, 572, 742, 741, + 744, 745, 823, 748, 747, 750, 751, 752, 753, 759, + 760, 813, 814, 583, 817, 816, 822, 540, 835, 840, + 842, 836, 841, 854, 848, 850, 873, 877, 879, 585, + 881, 901, 902, 883, 737, 903, 754, 906, 590, 829, + 755, 448, 756, 419, 830, 757, 761, 758, 617, 806, + 807, 808, 809, 810, 787, 805, 811, 831, 804, 855, + 443, 490, 763, 812, 832, 762, 464, 833, 844, 786, + 853, 765, 764, 483, 766, 767, 819, 487, 466, 818, + 845, 821, 610, 820, 856, 846, 849, 860, 882, 602, + 911, 252, 167, 878, 773, 234, 253, 907, 251, 791, + 815, 768, 792, 168, 185, 908, 790, 475, 189, 266, + 909, 190, 769, 781, 803, 191, 673, 782, 793, 254, + 783, 505, 794, 749, 784, 795, 169, 170, 194, 796, + 776, 210, 171, 871, 880, 770, 771, 777, 899, 910, + 197, 772, 201, 211, 0, 0, 0, 215, 0, 0, + 216, 0, 0, 0, 217, 0, 0, 195, 0, 0, + 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 780, 0, 0, 0, 0, - 798, 0, 775, 799, 0, 0, 0, 797, 0, 0, - 0, 0, 0, 776, 788, 872, 0, 0, 783, 800, - 789, 790, 871, 0, 777, 801, 802, 0, 0, 0, - 0, 791, 0, 872, 0, 0, 803, 778, 0, 779, - 871, 0, 0, 784 + 0, 0, 0, 0, 0, 0, 0, 0, 773, 0, + 0, 0, 0, 791, 0, 768, 792, 0, 0, 0, + 790, 0, 0, 0, 0, 0, 769, 781, 865, 0, + 0, 782, 793, 0, 783, 864, 794, 0, 784, 795, + 0, 0, 0, 796, 776, 0, 865, 0, 0, 770, + 771, 777, 0, 864, 0, 772 }; const short int Dhcp4Parser::yycheck_[] = { 62, 70, 68, 65, 66, 67, 70, 69, 70, 71, - 72, 60, 10, 66, 65, 65, 66, 67, 70, 720, - 66, 65, 65, 67, 67, 65, 5, 15, 7, 0, - 9, 7, 65, 7, 67, 93, 94, 52, 65, 11, - 65, 720, 7, 3, 3, 66, 6, 6, 20, 21, - 22, 23, 24, 25, 26, 720, 720, 463, 93, 94, - 21, 22, 23, 24, 129, 471, 7, 132, 133, 134, - 42, 43, 44, 45, 46, 3, 14, 15, 50, 51, - 8, 42, 43, 44, 17, 18, 47, 48, 49, 61, - 51, 7, 150, 3, 3, 22, 23, 24, 8, 8, - 7, 62, 7, 64, 7, 77, 78, 68, 69, 70, - 71, 72, 73, 128, 3, 130, 131, 7, 79, 8, - 92, 82, 83, 95, 51, 74, 75, 76, 126, 90, - 102, 103, 7, 121, 106, 150, 3, 135, 136, 137, - 150, 8, 7, 844, 3, 21, 22, 23, 24, 8, - 50, 78, 150, 22, 23, 24, 6, 84, 85, 86, - 87, 88, 89, 27, 91, 844, 42, 43, 44, 3, - 46, 150, 151, 152, 153, 51, 52, 4, 150, 844, - 844, 50, 51, 52, 67, 66, 67, 3, 52, 150, - 54, 55, 8, 69, 58, 59, 60, 73, 12, 13, - 104, 105, 16, 79, 3, 19, 82, 8, 51, 8, - 3, 80, 81, 3, 90, 8, 3, 8, 8, 27, - 63, 64, 65, 150, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 3, 3, 79, 6, 3, 82, - 123, 124, 125, 8, 52, 52, 53, 54, 55, 56, - 57, 3, 3, 315, 6, 4, 305, 306, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 153, 4, 4, 4, 150, 96, 97, 98, 99, 100, - 101, 150, 84, 85, 86, 87, 150, 89, 3, 3, - 3, 3, 3, 8, 8, 8, 8, 8, 3, 3, - 8, 363, 4, 8, 8, 367, 3, 150, 4, 4, - 3, 8, 363, 363, 367, 8, 378, 367, 4, 363, - 363, 367, 3, 363, 393, 4, 388, 8, 378, 393, - 363, 393, 4, 4, 378, 378, 363, 4, 363, 4, - 8, 393, 150, 150, 4, 378, 367, 4, 3, 8, - 412, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 28, 29, 30, 31, 4, - 419, 420, 421, 4, 4, 4, 4, 4, 4, 150, - 4, 4, 4, 4, 4, 4, 153, 153, 4, 4, - 4, 4, 4, 151, 150, 4, 151, 151, 151, 4, - 4, 4, 4, 4, 4, 4, 151, 4, 4, 4, - 4, 4, 153, 4, 4, 4, 4, 4, 4, 4, - 4, 151, 4, 4, 153, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 151, 4, 4, 493, 4, 153, 153, 4, 4, - 153, 520, 521, 153, 4, 4, 4, 151, 520, 521, - 151, 510, 151, 4, 4, 153, 153, 4, 153, 531, - 4, 4, 7, 150, 150, 7, 7, 150, 7, 7, - 5, 5, 5, 5, 5, 5, 5, 151, 150, 7, - 7, 7, 5, 5, 150, 4, 150, 7, 150, 150, - 150, 150, 5, 7, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 122, 150, 150, 150, 127, - 7, 7, 7, 7, 7, 150, 7, 7, 7, 4, - 4, 91, 150, 150, 4, 4, 3, 3, 6, 150, - 150, 6, 6, 3, 6, 3, 3, 6, 4, 4, - 4, 4, 4, 4, 3, 3, 6, 456, 150, 6, - 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, - 153, 151, 6, 3, 5, 4, 8, 4, 3, 315, - 8, 4, 8, 4, 8, 7, 4, 4, 7, 5, - 153, 4, 4, 151, 151, 4, 4, 151, 151, 151, - 151, 340, 516, 511, 151, 150, 150, 150, 150, 346, - 521, 150, 150, 708, 150, 723, 730, 728, 396, 737, - 150, 713, 711, 150, 722, 363, 844, 153, 716, 714, - 393, 388, 719, 717, 749, 150, 752, 151, 747, 708, - 151, 367, 150, 750, 151, 150, 708, 153, 717, 711, - 378, 720, 714, 717, 726, 717, 725, 849, 720, 725, - 711, 711, 741, 725, 412, 717, 728, 711, 711, 720, - 720, 711, 694, 531, 720, 725, 720, 720, 711, 865, - 720, 725, 725, 882, 711, 747, 711, 720, 750, 894, - 911, -1, 725, 720, 747, 720, -1, 747, -1, 720, - 750, 747, -1, -1, -1, -1, 750, 750, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 750, -1, -1, - -1, -1, -1, -1, -1, -1, 747, -1, -1, -1, + 72, 60, 10, 460, 65, 65, 66, 67, 66, 65, + 467, 67, 65, 5, 67, 7, 65, 9, 67, 70, + 713, 713, 0, 66, 7, 11, 15, 65, 65, 713, + 66, 713, 148, 65, 20, 21, 22, 23, 24, 25, + 26, 3, 90, 91, 6, 3, 21, 22, 23, 24, + 8, 120, 121, 122, 123, 7, 42, 43, 44, 45, + 46, 3, 90, 91, 50, 51, 8, 42, 43, 44, + 7, 46, 7, 3, 51, 61, 51, 52, 8, 22, + 23, 24, 151, 14, 15, 3, 63, 64, 74, 75, + 8, 66, 7, 127, 7, 70, 130, 131, 132, 76, + 148, 76, 79, 89, 79, 3, 92, 50, 51, 52, + 8, 52, 87, 99, 100, 3, 124, 103, 6, 3, + 21, 22, 23, 24, 8, 133, 134, 135, 7, 118, + 7, 22, 23, 24, 77, 78, 28, 29, 30, 31, + 148, 42, 43, 44, 837, 837, 47, 48, 49, 27, + 51, 3, 7, 837, 6, 837, 148, 149, 150, 151, + 51, 62, 148, 64, 65, 66, 67, 68, 69, 70, + 7, 148, 7, 148, 52, 76, 54, 55, 79, 80, + 58, 59, 60, 50, 75, 126, 87, 128, 129, 6, + 81, 82, 83, 84, 85, 86, 3, 88, 52, 53, + 54, 55, 56, 57, 27, 148, 4, 148, 8, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 12, + 13, 3, 3, 16, 6, 3, 19, 8, 4, 52, + 93, 94, 95, 96, 97, 98, 4, 81, 82, 83, + 84, 313, 86, 3, 303, 304, 3, 148, 8, 3, + 3, 8, 4, 3, 8, 8, 3, 148, 8, 3, + 3, 8, 3, 3, 8, 8, 3, 8, 8, 4, + 148, 8, 4, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 4, 3, 361, + 3, 3, 364, 8, 148, 8, 8, 71, 72, 73, + 361, 361, 4, 375, 364, 361, 364, 4, 361, 17, + 18, 390, 361, 385, 4, 375, 390, 148, 390, 375, + 4, 364, 375, 361, 361, 148, 375, 4, 364, 361, + 101, 102, 8, 3, 8, 4, 4, 409, 3, 390, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 8, 4, 4, 8, 3, 416, 417, 418, + 4, 4, 4, 4, 4, 4, 4, 4, 148, 4, + 4, 4, 4, 4, 151, 4, 151, 4, 4, 4, + 4, 4, 149, 149, 149, 149, 4, 4, 4, 4, + 4, 4, 4, 149, 4, 4, 4, 4, 4, 4, + 151, 4, 4, 4, 4, 4, 4, 4, 4, 151, + 149, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 149, 4, 4, 4, + 489, 151, 4, 151, 4, 151, 4, 516, 517, 4, + 151, 4, 149, 4, 516, 517, 149, 506, 149, 4, + 4, 151, 151, 151, 4, 527, 4, 4, 7, 148, + 148, 7, 7, 148, 7, 7, 5, 5, 5, 5, + 5, 5, 5, 148, 3, 7, 7, 7, 5, 5, + 5, 148, 148, 7, 148, 148, 148, 148, 7, 148, + 148, 148, 7, 148, 148, 7, 148, 7, 7, 148, + 148, 7, 148, 148, 7, 7, 7, 4, 4, 4, + 88, 4, 148, 4, 6, 119, 6, 3, 148, 6, + 148, 3, 6, 3, 3, 6, 148, 148, 148, 148, + 4, 125, 4, 4, 4, 4, 4, 148, 3, 6, + 6, 3, 5, 4, 8, 4, 4, 4, 4, 4, + 4, 4, 4, 148, 3, 6, 4, 453, 8, 4, + 3, 8, 8, 4, 8, 7, 4, 4, 4, 507, + 5, 4, 4, 7, 148, 4, 149, 4, 512, 148, + 151, 344, 149, 313, 148, 151, 701, 149, 517, 149, + 149, 149, 149, 149, 716, 723, 149, 148, 721, 151, + 338, 393, 706, 730, 148, 704, 361, 148, 148, 715, + 837, 709, 707, 385, 710, 712, 742, 390, 364, 740, + 148, 745, 701, 743, 842, 148, 148, 148, 148, 701, + 148, 710, 704, 149, 713, 707, 710, 151, 710, 718, + 734, 713, 718, 704, 704, 149, 718, 375, 704, 721, + 149, 704, 713, 713, 719, 704, 527, 713, 718, 710, + 713, 409, 718, 687, 713, 718, 704, 704, 740, 718, + 713, 743, 704, 858, 875, 713, 713, 713, 887, 904, + 740, 713, 740, 743, -1, -1, -1, 743, -1, -1, + 743, -1, -1, -1, 743, -1, -1, 740, -1, -1, + -1, -1, -1, -1, 740, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 844, -1, -1, -1, -1, - 849, -1, 844, 849, -1, -1, -1, 849, -1, -1, - -1, -1, -1, 844, 844, 864, -1, -1, 844, 849, - 844, 844, 864, -1, 844, 849, 849, -1, -1, -1, - -1, 844, -1, 882, -1, -1, 849, 844, -1, 844, - 882, -1, -1, 844 + -1, -1, -1, -1, -1, -1, -1, -1, 837, -1, + -1, -1, -1, 842, -1, 837, 842, -1, -1, -1, + 842, -1, -1, -1, -1, -1, 837, 837, 857, -1, + -1, 837, 842, -1, 837, 857, 842, -1, 837, 842, + -1, -1, -1, 842, 837, -1, 875, -1, -1, 837, + 837, 837, -1, 875, -1, 837 }; const unsigned short int Dhcp4Parser::yystos_[] = { - 0, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 0, 5, 7, 9, - 150, 151, 152, 153, 168, 169, 170, 175, 7, 184, - 7, 190, 7, 204, 7, 280, 7, 363, 7, 380, - 7, 315, 7, 321, 7, 345, 7, 256, 7, 434, - 176, 171, 185, 191, 205, 281, 364, 381, 316, 322, - 346, 257, 435, 168, 177, 178, 150, 173, 174, 10, - 126, 135, 136, 137, 150, 183, 186, 187, 188, 461, - 463, 465, 467, 11, 20, 21, 22, 23, 24, 25, - 26, 42, 43, 44, 45, 46, 50, 51, 61, 77, - 78, 92, 95, 102, 103, 106, 183, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 215, 217, 241, 250, - 264, 274, 305, 313, 339, 385, 387, 389, 411, 423, - 424, 432, 12, 13, 16, 19, 202, 203, 206, 208, - 211, 214, 47, 48, 49, 62, 64, 68, 69, 70, - 71, 72, 73, 79, 82, 83, 90, 183, 194, 195, - 196, 199, 282, 283, 284, 286, 288, 290, 292, 294, - 296, 298, 300, 303, 304, 339, 357, 369, 374, 385, - 387, 389, 407, 63, 65, 183, 296, 298, 339, 365, - 366, 367, 369, 371, 78, 84, 85, 86, 87, 88, - 89, 91, 183, 339, 382, 383, 384, 385, 387, 389, - 391, 393, 395, 397, 399, 401, 403, 405, 313, 27, - 52, 54, 55, 58, 59, 60, 183, 231, 323, 324, - 325, 326, 327, 328, 329, 331, 333, 335, 336, 338, - 53, 56, 57, 183, 231, 327, 333, 347, 348, 349, - 350, 351, 353, 354, 355, 356, 93, 94, 183, 258, - 259, 260, 262, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 183, 436, 437, - 438, 439, 441, 443, 444, 446, 447, 448, 451, 453, - 454, 455, 456, 459, 6, 3, 4, 8, 3, 189, - 468, 462, 464, 466, 4, 3, 8, 201, 4, 4, - 386, 388, 390, 216, 218, 4, 4, 4, 4, 275, - 314, 340, 306, 242, 412, 251, 265, 4, 425, 433, - 3, 8, 207, 209, 212, 4, 3, 8, 287, 289, - 291, 358, 370, 285, 293, 295, 4, 4, 301, 299, - 297, 375, 408, 3, 8, 368, 372, 3, 8, 406, - 394, 396, 400, 398, 404, 402, 392, 8, 3, 8, - 330, 232, 4, 334, 332, 337, 4, 8, 3, 352, - 4, 4, 8, 3, 261, 263, 3, 8, 4, 440, - 442, 4, 445, 4, 4, 449, 452, 4, 4, 4, - 457, 460, 3, 8, 168, 168, 150, 4, 4, 4, - 4, 4, 187, 4, 153, 153, 4, 4, 4, 4, - 4, 151, 151, 151, 151, 4, 4, 4, 4, 4, - 4, 4, 4, 151, 4, 4, 193, 4, 4, 4, - 153, 203, 4, 4, 4, 4, 4, 4, 4, 4, - 151, 153, 4, 4, 4, 4, 4, 283, 4, 4, - 366, 4, 4, 4, 4, 4, 4, 4, 4, 384, - 4, 4, 151, 4, 4, 4, 153, 325, 4, 153, - 153, 349, 4, 4, 259, 153, 4, 4, 151, 4, - 151, 151, 4, 4, 153, 153, 153, 4, 4, 437, - 4, 7, 7, 168, 168, 168, 7, 150, 150, 150, - 7, 7, 5, 5, 5, 5, 5, 5, 5, 7, - 7, 7, 5, 179, 14, 15, 210, 17, 18, 213, - 150, 150, 150, 5, 170, 172, 150, 150, 150, 74, - 75, 76, 302, 179, 150, 5, 7, 150, 66, 67, - 373, 179, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 168, 150, 150, 150, - 15, 121, 450, 122, 67, 123, 124, 125, 153, 458, - 150, 168, 192, 127, 469, 470, 471, 202, 27, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 183, - 219, 220, 221, 224, 226, 228, 230, 231, 233, 234, - 235, 236, 237, 239, 219, 7, 276, 277, 278, 7, - 317, 318, 319, 7, 341, 342, 343, 7, 307, 308, - 309, 84, 85, 86, 87, 89, 243, 244, 245, 246, - 247, 248, 249, 7, 413, 414, 7, 252, 253, 254, - 96, 97, 98, 99, 100, 101, 266, 267, 268, 269, - 270, 271, 272, 273, 104, 105, 426, 427, 428, 430, - 436, 180, 7, 359, 360, 361, 7, 376, 377, 378, - 91, 409, 8, 472, 3, 8, 8, 222, 225, 227, - 229, 4, 4, 4, 4, 4, 238, 240, 3, 8, - 8, 279, 6, 3, 320, 6, 3, 344, 6, 3, - 310, 6, 3, 3, 6, 415, 3, 6, 255, 6, - 3, 4, 4, 4, 4, 4, 4, 3, 8, 429, - 431, 3, 8, 8, 150, 181, 182, 362, 6, 3, - 379, 6, 3, 410, 8, 4, 470, 4, 4, 4, - 4, 151, 153, 151, 153, 151, 4, 4, 220, 282, - 278, 323, 319, 347, 343, 183, 194, 195, 196, 199, - 231, 274, 292, 296, 298, 300, 311, 312, 339, 385, - 387, 389, 407, 309, 244, 80, 81, 183, 231, 313, - 339, 385, 387, 389, 416, 417, 418, 419, 420, 422, - 414, 258, 254, 151, 151, 151, 151, 151, 151, 267, - 4, 4, 427, 6, 3, 365, 361, 382, 378, 4, - 5, 28, 29, 30, 31, 223, 150, 150, 150, 150, - 150, 8, 8, 8, 3, 8, 421, 4, 8, 3, - 8, 150, 150, 150, 8, 8, 150, 7, 473, 474, - 312, 4, 153, 418, 475, 3, 6, 150, 128, 130, - 131, 183, 231, 476, 477, 478, 479, 481, 474, 482, - 4, 480, 3, 8, 4, 151, 4, 477, 5, 150, - 7, 483, 484, 485, 3, 6, 129, 132, 133, 134, - 486, 487, 488, 490, 491, 492, 484, 489, 4, 4, - 4, 3, 8, 4, 153, 151, 151, 487, 150 + 0, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 0, 5, 7, 9, + 148, 149, 150, 151, 166, 167, 168, 173, 7, 182, + 7, 188, 7, 202, 7, 278, 7, 361, 7, 375, + 7, 313, 7, 319, 7, 343, 7, 254, 7, 429, + 174, 169, 183, 189, 203, 279, 362, 376, 314, 320, + 344, 255, 430, 166, 175, 176, 148, 171, 172, 10, + 124, 133, 134, 135, 148, 181, 184, 185, 186, 456, + 458, 460, 462, 11, 20, 21, 22, 23, 24, 25, + 26, 42, 43, 44, 45, 46, 50, 51, 61, 74, + 75, 89, 92, 99, 100, 103, 181, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 213, 215, 239, 248, + 262, 272, 303, 311, 337, 380, 382, 384, 406, 418, + 419, 427, 12, 13, 16, 19, 200, 201, 204, 206, + 209, 212, 47, 48, 49, 62, 64, 65, 66, 67, + 68, 69, 70, 76, 79, 80, 87, 181, 192, 193, + 194, 197, 280, 281, 282, 284, 286, 288, 290, 292, + 294, 296, 298, 301, 302, 337, 355, 367, 369, 380, + 382, 384, 402, 63, 181, 294, 296, 337, 363, 364, + 365, 367, 75, 81, 82, 83, 84, 85, 86, 88, + 181, 337, 377, 378, 379, 380, 382, 384, 386, 388, + 390, 392, 394, 396, 398, 400, 311, 27, 52, 54, + 55, 58, 59, 60, 181, 229, 321, 322, 323, 324, + 325, 326, 327, 329, 331, 333, 334, 336, 53, 56, + 57, 181, 229, 325, 331, 345, 346, 347, 348, 349, + 351, 352, 353, 354, 90, 91, 181, 256, 257, 258, + 260, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 181, 431, 432, 433, 434, + 436, 438, 439, 441, 442, 443, 446, 448, 449, 450, + 451, 454, 6, 3, 4, 8, 3, 187, 463, 457, + 459, 461, 4, 3, 8, 199, 4, 4, 381, 383, + 385, 214, 216, 4, 4, 4, 4, 273, 312, 338, + 304, 240, 407, 249, 263, 4, 420, 428, 3, 8, + 205, 207, 210, 4, 3, 8, 285, 287, 289, 356, + 368, 283, 291, 293, 4, 4, 299, 297, 295, 370, + 403, 3, 8, 366, 3, 8, 401, 389, 391, 395, + 393, 399, 397, 387, 8, 3, 8, 328, 230, 4, + 332, 330, 335, 4, 8, 3, 350, 4, 4, 8, + 3, 259, 261, 3, 8, 4, 435, 437, 4, 440, + 4, 4, 444, 447, 4, 4, 4, 452, 455, 3, + 8, 166, 166, 148, 4, 4, 4, 4, 4, 185, + 4, 151, 151, 4, 4, 4, 4, 4, 149, 149, + 149, 149, 4, 4, 4, 4, 4, 4, 4, 4, + 149, 4, 4, 191, 4, 4, 4, 151, 201, 4, + 4, 4, 4, 4, 4, 4, 4, 149, 151, 4, + 4, 4, 4, 4, 281, 4, 364, 4, 4, 4, + 4, 4, 4, 4, 4, 379, 4, 4, 149, 4, + 4, 4, 151, 323, 4, 151, 151, 347, 4, 4, + 257, 151, 4, 4, 149, 4, 149, 149, 4, 4, + 151, 151, 151, 4, 4, 432, 4, 7, 7, 166, + 166, 166, 7, 148, 148, 148, 7, 7, 5, 5, + 5, 5, 5, 5, 5, 7, 7, 7, 5, 177, + 14, 15, 208, 17, 18, 211, 148, 148, 148, 5, + 168, 170, 148, 148, 148, 71, 72, 73, 300, 177, + 148, 5, 7, 148, 177, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 166, + 148, 148, 148, 15, 118, 445, 119, 120, 121, 122, + 123, 151, 453, 148, 166, 190, 125, 464, 465, 466, + 200, 27, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 181, 217, 218, 219, 222, 224, 226, 228, + 229, 231, 232, 233, 234, 235, 237, 217, 7, 274, + 275, 276, 7, 315, 316, 317, 7, 339, 340, 341, + 7, 305, 306, 307, 81, 82, 83, 84, 86, 241, + 242, 243, 244, 245, 246, 247, 7, 408, 409, 7, + 250, 251, 252, 93, 94, 95, 96, 97, 98, 264, + 265, 266, 267, 268, 269, 270, 271, 101, 102, 421, + 422, 423, 425, 431, 178, 7, 357, 358, 359, 7, + 371, 372, 373, 88, 404, 8, 467, 3, 8, 8, + 220, 223, 225, 227, 4, 4, 4, 4, 4, 236, + 238, 3, 8, 8, 277, 6, 3, 318, 6, 3, + 342, 6, 3, 308, 6, 3, 3, 6, 410, 3, + 6, 253, 6, 3, 4, 4, 4, 4, 4, 4, + 3, 8, 424, 426, 3, 8, 8, 148, 179, 180, + 360, 6, 3, 374, 6, 3, 405, 8, 4, 465, + 4, 4, 4, 4, 149, 151, 149, 151, 149, 4, + 4, 218, 280, 276, 321, 317, 345, 341, 181, 192, + 193, 194, 197, 229, 272, 290, 294, 296, 298, 309, + 310, 337, 380, 382, 384, 402, 307, 242, 77, 78, + 181, 229, 311, 337, 380, 382, 384, 411, 412, 413, + 414, 415, 417, 409, 256, 252, 149, 149, 149, 149, + 149, 149, 265, 4, 4, 422, 6, 3, 363, 359, + 377, 373, 4, 5, 28, 29, 30, 31, 221, 148, + 148, 148, 148, 148, 8, 8, 8, 3, 8, 416, + 4, 8, 3, 8, 148, 148, 148, 8, 8, 148, + 7, 468, 469, 310, 4, 151, 413, 470, 3, 6, + 148, 126, 128, 129, 181, 229, 471, 472, 473, 474, + 476, 469, 477, 4, 475, 3, 8, 4, 149, 4, + 472, 5, 148, 7, 478, 479, 480, 3, 6, 127, + 130, 131, 132, 481, 482, 483, 485, 486, 487, 479, + 484, 4, 4, 4, 3, 8, 4, 151, 149, 149, + 482, 148 }; const unsigned short int Dhcp4Parser::yyr1_[] = { - 0, 154, 156, 155, 157, 155, 158, 155, 159, 155, - 160, 155, 161, 155, 162, 155, 163, 155, 164, 155, - 165, 155, 166, 155, 167, 155, 168, 168, 168, 168, - 168, 168, 168, 169, 171, 170, 172, 173, 173, 174, - 174, 176, 175, 177, 177, 178, 178, 180, 179, 181, - 181, 182, 182, 183, 185, 184, 186, 186, 187, 187, - 187, 187, 187, 187, 189, 188, 191, 190, 192, 192, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 194, 195, 196, 197, 198, 199, - 201, 200, 202, 202, 203, 203, 203, 203, 205, 204, - 207, 206, 209, 208, 210, 210, 212, 211, 213, 213, - 214, 216, 215, 218, 217, 219, 219, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 222, 221, 223, 223, 223, 223, 225, 224, 227, 226, - 229, 228, 230, 232, 231, 233, 234, 235, 236, 238, - 237, 240, 239, 242, 241, 243, 243, 244, 244, 244, - 244, 244, 245, 246, 247, 248, 249, 251, 250, 252, - 252, 253, 253, 255, 254, 257, 256, 258, 258, 258, - 259, 259, 261, 260, 263, 262, 265, 264, 266, 266, - 267, 267, 267, 267, 267, 267, 268, 269, 270, 271, - 272, 273, 275, 274, 276, 276, 277, 277, 279, 278, - 281, 280, 282, 282, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, 285, 284, - 287, 286, 289, 288, 291, 290, 293, 292, 295, 294, - 297, 296, 299, 298, 301, 300, 302, 302, 302, 303, - 304, 306, 305, 307, 307, 308, 308, 310, 309, 311, - 311, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 312, 314, 313, 316, - 315, 317, 317, 318, 318, 320, 319, 322, 321, 323, - 323, 324, 324, 325, 325, 325, 325, 325, 325, 325, - 325, 326, 327, 328, 330, 329, 332, 331, 334, 333, - 335, 337, 336, 338, 340, 339, 341, 341, 342, 342, - 344, 343, 346, 345, 347, 347, 348, 348, 349, 349, - 349, 349, 349, 349, 349, 350, 352, 351, 353, 354, - 355, 356, 358, 357, 359, 359, 360, 360, 362, 361, - 364, 363, 365, 365, 366, 366, 366, 366, 366, 366, - 366, 368, 367, 370, 369, 372, 371, 373, 373, 375, - 374, 376, 376, 377, 377, 379, 378, 381, 380, 382, - 382, 383, 383, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 384, 384, 386, 385, 388, 387, - 390, 389, 392, 391, 394, 393, 396, 395, 398, 397, - 400, 399, 402, 401, 404, 403, 406, 405, 408, 407, - 410, 409, 412, 411, 413, 413, 415, 414, 416, 416, - 417, 417, 418, 418, 418, 418, 418, 418, 418, 418, - 418, 419, 421, 420, 422, 423, 425, 424, 426, 426, - 427, 427, 429, 428, 431, 430, 433, 432, 435, 434, - 436, 436, 437, 437, 437, 437, 437, 437, 437, 437, - 437, 437, 437, 437, 437, 437, 437, 438, 440, 439, - 442, 441, 443, 445, 444, 446, 447, 449, 448, 450, - 450, 452, 451, 453, 454, 455, 457, 456, 458, 458, - 458, 458, 458, 460, 459, 462, 461, 464, 463, 466, - 465, 468, 467, 469, 469, 470, 472, 471, 473, 473, - 475, 474, 476, 476, 477, 477, 477, 477, 477, 478, - 480, 479, 482, 481, 483, 483, 485, 484, 486, 486, - 487, 487, 487, 487, 489, 488, 490, 491, 492 + 0, 152, 154, 153, 155, 153, 156, 153, 157, 153, + 158, 153, 159, 153, 160, 153, 161, 153, 162, 153, + 163, 153, 164, 153, 165, 153, 166, 166, 166, 166, + 166, 166, 166, 167, 169, 168, 170, 171, 171, 172, + 172, 174, 173, 175, 175, 176, 176, 178, 177, 179, + 179, 180, 180, 181, 183, 182, 184, 184, 185, 185, + 185, 185, 185, 185, 187, 186, 189, 188, 190, 190, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 192, 193, 194, 195, 196, 197, + 199, 198, 200, 200, 201, 201, 201, 201, 203, 202, + 205, 204, 207, 206, 208, 208, 210, 209, 211, 211, + 212, 214, 213, 216, 215, 217, 217, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 220, 219, 221, 221, 221, 221, 223, 222, 225, 224, + 227, 226, 228, 230, 229, 231, 232, 233, 234, 236, + 235, 238, 237, 240, 239, 241, 241, 242, 242, 242, + 242, 242, 243, 244, 245, 246, 247, 249, 248, 250, + 250, 251, 251, 253, 252, 255, 254, 256, 256, 256, + 257, 257, 259, 258, 261, 260, 263, 262, 264, 264, + 265, 265, 265, 265, 265, 265, 266, 267, 268, 269, + 270, 271, 273, 272, 274, 274, 275, 275, 277, 276, + 279, 278, 280, 280, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 281, 283, 282, + 285, 284, 287, 286, 289, 288, 291, 290, 293, 292, + 295, 294, 297, 296, 299, 298, 300, 300, 300, 301, + 302, 304, 303, 305, 305, 306, 306, 308, 307, 309, + 309, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 312, 311, 314, + 313, 315, 315, 316, 316, 318, 317, 320, 319, 321, + 321, 322, 322, 323, 323, 323, 323, 323, 323, 323, + 323, 324, 325, 326, 328, 327, 330, 329, 332, 331, + 333, 335, 334, 336, 338, 337, 339, 339, 340, 340, + 342, 341, 344, 343, 345, 345, 346, 346, 347, 347, + 347, 347, 347, 347, 347, 348, 350, 349, 351, 352, + 353, 354, 356, 355, 357, 357, 358, 358, 360, 359, + 362, 361, 363, 363, 364, 364, 364, 364, 364, 364, + 366, 365, 368, 367, 370, 369, 371, 371, 372, 372, + 374, 373, 376, 375, 377, 377, 378, 378, 379, 379, + 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, + 379, 381, 380, 383, 382, 385, 384, 387, 386, 389, + 388, 391, 390, 393, 392, 395, 394, 397, 396, 399, + 398, 401, 400, 403, 402, 405, 404, 407, 406, 408, + 408, 410, 409, 411, 411, 412, 412, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 414, 416, 415, 417, + 418, 420, 419, 421, 421, 422, 422, 424, 423, 426, + 425, 428, 427, 430, 429, 431, 431, 432, 432, 432, + 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, + 432, 432, 433, 435, 434, 437, 436, 438, 440, 439, + 441, 442, 444, 443, 445, 445, 447, 446, 448, 449, + 450, 452, 451, 453, 453, 453, 453, 453, 455, 454, + 457, 456, 459, 458, 461, 460, 463, 462, 464, 464, + 465, 467, 466, 468, 468, 470, 469, 471, 471, 472, + 472, 472, 472, 472, 473, 475, 474, 477, 476, 478, + 478, 480, 479, 481, 481, 482, 482, 482, 482, 484, + 483, 485, 486, 487 }; const unsigned char @@ -4206,25 +4165,25 @@ namespace isc { namespace dhcp { 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 1, 1, 0, - 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 4, 0, 6, - 0, 4, 0, 6, 1, 3, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 4, 3, 3, 0, 6, 1, 3, - 1, 1, 0, 4, 0, 4, 0, 6, 0, 4, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 0, 4, - 0, 4, 3, 0, 4, 3, 3, 0, 4, 1, - 1, 0, 4, 3, 3, 3, 0, 4, 1, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 6, 1, 3, 1, 0, 6, 1, 3, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 3, - 0, 4, 0, 6, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 0, 4, 3, 3, 3 + 0, 4, 0, 4, 0, 6, 0, 1, 1, 3, + 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, + 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 3, + 3, 0, 6, 1, 3, 1, 1, 0, 4, 0, + 4, 0, 6, 0, 4, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 0, 4, 0, 4, 3, 0, 4, + 3, 3, 0, 4, 1, 1, 0, 4, 3, 3, + 3, 0, 4, 1, 1, 1, 1, 1, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 6, 1, 3, + 1, 0, 6, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 3, 0, 4, 0, 6, 1, + 3, 0, 4, 1, 3, 1, 1, 1, 1, 0, + 4, 3, 3, 3 }; @@ -4251,15 +4210,14 @@ namespace isc { namespace dhcp { "\"data\"", "\"code\"", "\"space\"", "\"csv-format\"", "\"always-send\"", "\"record-types\"", "\"encapsulate\"", "\"array\"", "\"shared-networks\"", "\"pools\"", "\"pool\"", "\"user-context\"", - "\"known-clients\"", "\"only\"", "\"never\"", "\"subnet\"", - "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", - "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", - "\"host-reservation-identifiers\"", "\"client-classes\"", - "\"eval-client-classes\"", "\"test\"", "\"eval-on-demand\"", - "\"client-class\"", "\"reservations\"", "\"duid\"", "\"hw-address\"", - "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"", - "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", - "\"parameters\"", "\"expired-leases-processing\"", + "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", + "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", + "\"out-of-pool\"", "\"all\"", "\"host-reservation-identifiers\"", + "\"client-classes\"", "\"eval-client-classes\"", "\"test\"", + "\"eval-on-demand\"", "\"client-class\"", "\"reservations\"", "\"duid\"", + "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", "\"hostname\"", + "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", + "\"library\"", "\"parameters\"", "\"expired-leases-processing\"", "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"", "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"", "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"", @@ -4270,22 +4228,22 @@ namespace isc { namespace dhcp { "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", "\"override-no-update\"", "\"override-client-update\"", "\"replace-client-name\"", "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", - "\"when-present\"", "\"always\"", "\"when-not-present\"", "\"Logging\"", - "\"loggers\"", "\"output_options\"", "\"output\"", "\"debuglevel\"", - "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp6\"", - "\"DhcpDdns\"", "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", - "SUB_DHCP4", "SUB_INTERFACES4", "SUB_SUBNET4", "SUB_POOL4", - "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", - "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", - "\"constant string\"", "\"integer\"", "\"floating point\"", - "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", - "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "value", "sub_json", - "map2", "$@13", "map_value", "map_content", "not_empty_map", - "list_generic", "$@14", "list_content", "not_empty_list", "list_strings", - "$@15", "list_strings_content", "not_empty_list_strings", - "unknown_map_entry", "syntax_map", "$@16", "global_objects", - "global_object", "dhcp4_object", "$@17", "sub_dhcp4", "$@18", - "global_params", "global_param", "valid_lifetime", "renew_timer", + "\"when-present\"", "\"never\"", "\"always\"", "\"when-not-present\"", + "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", + "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", + "\"maxver\"", "\"Dhcp6\"", "\"DhcpDdns\"", "\"Control-agent\"", + "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", "SUB_DHCP4", "SUB_INTERFACES4", + "SUB_SUBNET4", "SUB_POOL4", "SUB_RESERVATION", "SUB_OPTION_DEFS", + "SUB_OPTION_DEF", "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", + "SUB_DHCP_DDNS", "\"constant string\"", "\"integer\"", + "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2", + "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", + "value", "sub_json", "map2", "$@13", "map_value", "map_content", + "not_empty_map", "list_generic", "$@14", "list_content", + "not_empty_list", "list_strings", "$@15", "list_strings_content", + "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@16", + "global_objects", "global_object", "dhcp4_object", "$@17", "sub_dhcp4", + "$@18", "global_params", "global_param", "valid_lifetime", "renew_timer", "rebind_timer", "decline_probation_period", "echo_client_id", "match_client_id", "interfaces_config", "$@19", "interfaces_config_params", "interfaces_config_param", "sub_interfaces4", @@ -4331,34 +4289,34 @@ namespace isc { namespace dhcp { "option_data_always_send", "pools_list", "$@66", "pools_list_content", "not_empty_pools_list", "pool_list_entry", "$@67", "sub_pool4", "$@68", "pool_params", "pool_param", "pool_entry", "$@69", "user_context", - "$@70", "known_clients", "$@71", "known_clients_value", "reservations", - "$@72", "reservations_list", "not_empty_reservations_list", - "reservation", "$@73", "sub_reservation", "$@74", "reservation_params", - "not_empty_reservation_params", "reservation_param", "next_server", - "$@75", "server_hostname", "$@76", "boot_file_name", "$@77", - "ip_address", "$@78", "duid", "$@79", "hw_address", "$@80", - "client_id_value", "$@81", "circuit_id_value", "$@82", "flex_id_value", - "$@83", "hostname", "$@84", "reservation_client_classes", "$@85", - "relay", "$@86", "relay_map", "$@87", "client_classes", "$@88", - "client_classes_list", "client_class_entry", "$@89", - "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@90", - "eval_on_demand", "dhcp4o6_port", "control_socket", "$@91", - "control_socket_params", "control_socket_param", "control_socket_type", - "$@92", "control_socket_name", "$@93", "dhcp_ddns", "$@94", - "sub_dhcp_ddns", "$@95", "dhcp_ddns_params", "dhcp_ddns_param", - "enable_updates", "qualifying_suffix", "$@96", "server_ip", "$@97", - "server_port", "sender_ip", "$@98", "sender_port", "max_queue_size", - "ncr_protocol", "$@99", "ncr_protocol_value", "ncr_format", "$@100", + "$@70", "reservations", "$@71", "reservations_list", + "not_empty_reservations_list", "reservation", "$@72", "sub_reservation", + "$@73", "reservation_params", "not_empty_reservation_params", + "reservation_param", "next_server", "$@74", "server_hostname", "$@75", + "boot_file_name", "$@76", "ip_address", "$@77", "duid", "$@78", + "hw_address", "$@79", "client_id_value", "$@80", "circuit_id_value", + "$@81", "flex_id_value", "$@82", "hostname", "$@83", + "reservation_client_classes", "$@84", "relay", "$@85", "relay_map", + "$@86", "client_classes", "$@87", "client_classes_list", + "client_class_entry", "$@88", "client_class_params", + "not_empty_client_class_params", "client_class_param", + "client_class_name", "client_class_test", "$@89", "eval_on_demand", + "dhcp4o6_port", "control_socket", "$@90", "control_socket_params", + "control_socket_param", "control_socket_type", "$@91", + "control_socket_name", "$@92", "dhcp_ddns", "$@93", "sub_dhcp_ddns", + "$@94", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", + "qualifying_suffix", "$@95", "server_ip", "$@96", "server_port", + "sender_ip", "$@97", "sender_port", "max_queue_size", "ncr_protocol", + "$@98", "ncr_protocol_value", "ncr_format", "$@99", "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@101", "replace_client_name_value", - "generated_prefix", "$@102", "dhcp6_json_object", "$@103", - "dhcpddns_json_object", "$@104", "control_agent_json_object", "$@105", - "logging_object", "$@106", "logging_params", "logging_param", "loggers", - "$@107", "loggers_entries", "logger_entry", "$@108", "logger_params", - "logger_param", "debuglevel", "severity", "$@109", "output_options_list", - "$@110", "output_options_list_content", "output_entry", "$@111", - "output_params_list", "output_params", "output", "$@112", "flush", + "replace_client_name", "$@100", "replace_client_name_value", + "generated_prefix", "$@101", "dhcp6_json_object", "$@102", + "dhcpddns_json_object", "$@103", "control_agent_json_object", "$@104", + "logging_object", "$@105", "logging_params", "logging_param", "loggers", + "$@106", "loggers_entries", "logger_entry", "$@107", "logger_params", + "logger_param", "debuglevel", "severity", "$@108", "output_options_list", + "$@109", "output_options_list_content", "output_entry", "$@110", + "output_params_list", "output_params", "output", "$@111", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4366,63 +4324,63 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp4Parser::yyrline_[] = { - 0, 238, 238, 238, 239, 239, 240, 240, 241, 241, - 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, - 247, 247, 248, 248, 249, 249, 257, 258, 259, 260, - 261, 262, 263, 266, 271, 271, 282, 285, 286, 289, - 293, 300, 300, 307, 308, 311, 315, 322, 322, 329, - 330, 333, 337, 348, 358, 358, 374, 375, 379, 380, - 381, 382, 383, 384, 387, 387, 402, 402, 411, 412, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 443, 448, 453, 458, 463, 468, - 474, 474, 485, 486, 489, 490, 491, 492, 495, 495, - 504, 504, 514, 514, 521, 522, 525, 525, 532, 534, - 538, 544, 544, 556, 556, 568, 569, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 587, 587, 594, 595, 596, 597, 600, 600, 608, 608, - 616, 616, 624, 629, 629, 637, 642, 647, 652, 657, - 657, 665, 665, 674, 674, 684, 685, 688, 689, 690, - 691, 692, 695, 700, 705, 710, 715, 720, 720, 730, - 731, 734, 735, 738, 738, 748, 748, 758, 759, 760, - 763, 764, 767, 767, 775, 775, 783, 783, 794, 795, - 798, 799, 800, 801, 802, 803, 806, 811, 816, 821, - 826, 831, 839, 839, 852, 853, 856, 857, 864, 864, - 890, 890, 901, 902, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 932, 932, - 940, 940, 948, 948, 956, 956, 964, 964, 972, 972, - 980, 980, 988, 988, 998, 998, 1005, 1006, 1007, 1010, - 1015, 1022, 1022, 1033, 1034, 1038, 1039, 1042, 1042, 1050, - 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1076, 1076, 1089, - 1089, 1098, 1099, 1102, 1103, 1108, 1108, 1123, 1123, 1137, - 1138, 1141, 1142, 1145, 1146, 1147, 1148, 1149, 1150, 1151, - 1152, 1155, 1157, 1162, 1164, 1164, 1172, 1172, 1180, 1180, - 1188, 1190, 1190, 1198, 1207, 1207, 1219, 1220, 1225, 1226, - 1231, 1231, 1243, 1243, 1255, 1256, 1261, 1262, 1267, 1268, - 1269, 1270, 1271, 1272, 1273, 1276, 1278, 1278, 1286, 1288, - 1290, 1295, 1303, 1303, 1315, 1316, 1319, 1320, 1323, 1323, - 1333, 1333, 1343, 1344, 1347, 1348, 1349, 1350, 1351, 1352, - 1353, 1356, 1356, 1364, 1364, 1371, 1371, 1379, 1380, 1386, - 1386, 1396, 1397, 1400, 1401, 1404, 1404, 1413, 1413, 1422, - 1423, 1426, 1427, 1431, 1432, 1433, 1434, 1435, 1436, 1437, - 1438, 1439, 1440, 1441, 1442, 1443, 1446, 1446, 1454, 1454, - 1462, 1462, 1470, 1470, 1478, 1478, 1486, 1486, 1494, 1494, - 1502, 1502, 1510, 1510, 1518, 1518, 1526, 1526, 1539, 1539, - 1549, 1549, 1560, 1560, 1570, 1571, 1574, 1574, 1584, 1585, - 1588, 1589, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, - 1600, 1603, 1605, 1605, 1613, 1622, 1629, 1629, 1639, 1640, - 1643, 1644, 1647, 1647, 1655, 1655, 1665, 1665, 1677, 1677, - 1687, 1688, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, - 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1708, 1713, 1713, - 1721, 1721, 1729, 1734, 1734, 1742, 1747, 1752, 1752, 1760, - 1761, 1764, 1764, 1772, 1777, 1782, 1787, 1787, 1795, 1798, - 1801, 1804, 1807, 1813, 1813, 1823, 1823, 1830, 1830, 1837, - 1837, 1849, 1849, 1862, 1863, 1867, 1871, 1871, 1883, 1884, - 1888, 1888, 1896, 1897, 1900, 1901, 1902, 1903, 1904, 1907, - 1912, 1912, 1920, 1920, 1930, 1931, 1934, 1934, 1942, 1943, - 1946, 1947, 1948, 1949, 1952, 1952, 1960, 1965, 1970 + 0, 235, 235, 235, 236, 236, 237, 237, 238, 238, + 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, + 244, 244, 245, 245, 246, 246, 254, 255, 256, 257, + 258, 259, 260, 263, 268, 268, 279, 282, 283, 286, + 290, 297, 297, 304, 305, 308, 312, 319, 319, 326, + 327, 330, 334, 345, 355, 355, 371, 372, 376, 377, + 378, 379, 380, 381, 384, 384, 399, 399, 408, 409, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 440, 445, 450, 455, 460, 465, + 471, 471, 482, 483, 486, 487, 488, 489, 492, 492, + 501, 501, 511, 511, 518, 519, 522, 522, 529, 531, + 535, 541, 541, 553, 553, 565, 566, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 584, 584, 591, 592, 593, 594, 597, 597, 605, 605, + 613, 613, 621, 626, 626, 634, 639, 644, 649, 654, + 654, 662, 662, 671, 671, 681, 682, 685, 686, 687, + 688, 689, 692, 697, 702, 707, 712, 717, 717, 727, + 728, 731, 732, 735, 735, 745, 745, 755, 756, 757, + 760, 761, 764, 764, 772, 772, 780, 780, 791, 792, + 795, 796, 797, 798, 799, 800, 803, 808, 813, 818, + 823, 828, 836, 836, 849, 850, 853, 854, 861, 861, + 887, 887, 898, 899, 903, 904, 905, 906, 907, 908, + 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, + 919, 920, 921, 922, 923, 924, 925, 926, 929, 929, + 937, 937, 945, 945, 953, 953, 961, 961, 969, 969, + 977, 977, 985, 985, 995, 995, 1002, 1003, 1004, 1007, + 1012, 1019, 1019, 1030, 1031, 1035, 1036, 1039, 1039, 1047, + 1048, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1073, 1073, 1086, + 1086, 1095, 1096, 1099, 1100, 1105, 1105, 1120, 1120, 1134, + 1135, 1138, 1139, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 1149, 1152, 1154, 1159, 1161, 1161, 1169, 1169, 1177, 1177, + 1185, 1187, 1187, 1195, 1204, 1204, 1216, 1217, 1222, 1223, + 1228, 1228, 1240, 1240, 1252, 1253, 1258, 1259, 1264, 1265, + 1266, 1267, 1268, 1269, 1270, 1273, 1275, 1275, 1283, 1285, + 1287, 1292, 1300, 1300, 1312, 1313, 1316, 1317, 1320, 1320, + 1330, 1330, 1340, 1341, 1344, 1345, 1346, 1347, 1348, 1349, + 1352, 1352, 1360, 1360, 1370, 1370, 1380, 1381, 1384, 1385, + 1388, 1388, 1397, 1397, 1406, 1407, 1410, 1411, 1415, 1416, + 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, + 1427, 1430, 1430, 1438, 1438, 1446, 1446, 1454, 1454, 1462, + 1462, 1470, 1470, 1478, 1478, 1486, 1486, 1494, 1494, 1502, + 1502, 1510, 1510, 1523, 1523, 1533, 1533, 1544, 1544, 1554, + 1555, 1558, 1558, 1568, 1569, 1572, 1573, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1587, 1589, 1589, 1597, + 1606, 1613, 1613, 1623, 1624, 1627, 1628, 1631, 1631, 1639, + 1639, 1649, 1649, 1661, 1661, 1671, 1672, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, + 1688, 1689, 1692, 1697, 1697, 1705, 1705, 1713, 1718, 1718, + 1726, 1731, 1736, 1736, 1744, 1745, 1748, 1748, 1756, 1761, + 1766, 1771, 1771, 1779, 1782, 1785, 1788, 1791, 1797, 1797, + 1807, 1807, 1814, 1814, 1821, 1821, 1833, 1833, 1846, 1847, + 1851, 1855, 1855, 1867, 1868, 1872, 1872, 1880, 1881, 1884, + 1885, 1886, 1887, 1888, 1891, 1896, 1896, 1904, 1904, 1914, + 1915, 1918, 1918, 1926, 1927, 1930, 1931, 1932, 1933, 1936, + 1936, 1944, 1949, 1954 }; // Print the state stack on the debug stream. @@ -4457,8 +4415,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4461 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 1975 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4419 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 1959 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index f79d68b50e..cbbf327d31 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -310,7 +310,6 @@ namespace isc { namespace dhcp { // outbound_interface_value // db_type // hr_mode - // known_clients_value // ncr_protocol_value // replace_client_name_value char dummy1[sizeof(ElementPtr)]; @@ -411,95 +410,93 @@ namespace isc { namespace dhcp { TOKEN_POOLS = 317, TOKEN_POOL = 318, TOKEN_USER_CONTEXT = 319, - TOKEN_KNOWN_CLIENTS = 320, - TOKEN_ONLY = 321, - TOKEN_NEVER = 322, - TOKEN_SUBNET = 323, - TOKEN_INTERFACE = 324, - TOKEN_INTERFACE_ID = 325, - TOKEN_ID = 326, - TOKEN_RAPID_COMMIT = 327, - TOKEN_RESERVATION_MODE = 328, - TOKEN_DISABLED = 329, - TOKEN_OUT_OF_POOL = 330, - TOKEN_ALL = 331, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 332, - TOKEN_CLIENT_CLASSES = 333, - TOKEN_EVAL_CLIENT_CLASSES = 334, - TOKEN_TEST = 335, - TOKEN_EVAL_ON_DEMAND = 336, - TOKEN_CLIENT_CLASS = 337, - TOKEN_RESERVATIONS = 338, - TOKEN_DUID = 339, - TOKEN_HW_ADDRESS = 340, - TOKEN_CIRCUIT_ID = 341, - TOKEN_CLIENT_ID = 342, - TOKEN_HOSTNAME = 343, - TOKEN_FLEX_ID = 344, - TOKEN_RELAY = 345, - TOKEN_IP_ADDRESS = 346, - TOKEN_HOOKS_LIBRARIES = 347, - TOKEN_LIBRARY = 348, - TOKEN_PARAMETERS = 349, - TOKEN_EXPIRED_LEASES_PROCESSING = 350, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 351, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 352, - TOKEN_HOLD_RECLAIMED_TIME = 353, - TOKEN_MAX_RECLAIM_LEASES = 354, - TOKEN_MAX_RECLAIM_TIME = 355, - TOKEN_UNWARNED_RECLAIM_CYCLES = 356, - TOKEN_DHCP4O6_PORT = 357, - TOKEN_CONTROL_SOCKET = 358, - TOKEN_SOCKET_TYPE = 359, - TOKEN_SOCKET_NAME = 360, - TOKEN_DHCP_DDNS = 361, - TOKEN_ENABLE_UPDATES = 362, - TOKEN_QUALIFYING_SUFFIX = 363, - TOKEN_SERVER_IP = 364, - TOKEN_SERVER_PORT = 365, - TOKEN_SENDER_IP = 366, - TOKEN_SENDER_PORT = 367, - TOKEN_MAX_QUEUE_SIZE = 368, - TOKEN_NCR_PROTOCOL = 369, - TOKEN_NCR_FORMAT = 370, - TOKEN_ALWAYS_INCLUDE_FQDN = 371, - TOKEN_OVERRIDE_NO_UPDATE = 372, - TOKEN_OVERRIDE_CLIENT_UPDATE = 373, - TOKEN_REPLACE_CLIENT_NAME = 374, - TOKEN_GENERATED_PREFIX = 375, - TOKEN_TCP = 376, - TOKEN_JSON = 377, - TOKEN_WHEN_PRESENT = 378, - TOKEN_ALWAYS = 379, - TOKEN_WHEN_NOT_PRESENT = 380, - TOKEN_LOGGING = 381, - TOKEN_LOGGERS = 382, - TOKEN_OUTPUT_OPTIONS = 383, - TOKEN_OUTPUT = 384, - TOKEN_DEBUGLEVEL = 385, - TOKEN_SEVERITY = 386, - TOKEN_FLUSH = 387, - TOKEN_MAXSIZE = 388, - TOKEN_MAXVER = 389, - TOKEN_DHCP6 = 390, - TOKEN_DHCPDDNS = 391, - TOKEN_CONTROL_AGENT = 392, - TOKEN_TOPLEVEL_JSON = 393, - TOKEN_TOPLEVEL_DHCP4 = 394, - TOKEN_SUB_DHCP4 = 395, - TOKEN_SUB_INTERFACES4 = 396, - TOKEN_SUB_SUBNET4 = 397, - TOKEN_SUB_POOL4 = 398, - TOKEN_SUB_RESERVATION = 399, - TOKEN_SUB_OPTION_DEFS = 400, - TOKEN_SUB_OPTION_DEF = 401, - TOKEN_SUB_OPTION_DATA = 402, - TOKEN_SUB_HOOKS_LIBRARY = 403, - TOKEN_SUB_DHCP_DDNS = 404, - TOKEN_STRING = 405, - TOKEN_INTEGER = 406, - TOKEN_FLOAT = 407, - TOKEN_BOOLEAN = 408 + TOKEN_SUBNET = 320, + TOKEN_INTERFACE = 321, + TOKEN_INTERFACE_ID = 322, + TOKEN_ID = 323, + TOKEN_RAPID_COMMIT = 324, + TOKEN_RESERVATION_MODE = 325, + TOKEN_DISABLED = 326, + TOKEN_OUT_OF_POOL = 327, + TOKEN_ALL = 328, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 329, + TOKEN_CLIENT_CLASSES = 330, + TOKEN_EVAL_CLIENT_CLASSES = 331, + TOKEN_TEST = 332, + TOKEN_EVAL_ON_DEMAND = 333, + TOKEN_CLIENT_CLASS = 334, + TOKEN_RESERVATIONS = 335, + TOKEN_DUID = 336, + TOKEN_HW_ADDRESS = 337, + TOKEN_CIRCUIT_ID = 338, + TOKEN_CLIENT_ID = 339, + TOKEN_HOSTNAME = 340, + TOKEN_FLEX_ID = 341, + TOKEN_RELAY = 342, + TOKEN_IP_ADDRESS = 343, + TOKEN_HOOKS_LIBRARIES = 344, + TOKEN_LIBRARY = 345, + TOKEN_PARAMETERS = 346, + TOKEN_EXPIRED_LEASES_PROCESSING = 347, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 348, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 349, + TOKEN_HOLD_RECLAIMED_TIME = 350, + TOKEN_MAX_RECLAIM_LEASES = 351, + TOKEN_MAX_RECLAIM_TIME = 352, + TOKEN_UNWARNED_RECLAIM_CYCLES = 353, + TOKEN_DHCP4O6_PORT = 354, + TOKEN_CONTROL_SOCKET = 355, + TOKEN_SOCKET_TYPE = 356, + TOKEN_SOCKET_NAME = 357, + TOKEN_DHCP_DDNS = 358, + TOKEN_ENABLE_UPDATES = 359, + TOKEN_QUALIFYING_SUFFIX = 360, + TOKEN_SERVER_IP = 361, + TOKEN_SERVER_PORT = 362, + TOKEN_SENDER_IP = 363, + TOKEN_SENDER_PORT = 364, + TOKEN_MAX_QUEUE_SIZE = 365, + TOKEN_NCR_PROTOCOL = 366, + TOKEN_NCR_FORMAT = 367, + TOKEN_ALWAYS_INCLUDE_FQDN = 368, + TOKEN_OVERRIDE_NO_UPDATE = 369, + TOKEN_OVERRIDE_CLIENT_UPDATE = 370, + TOKEN_REPLACE_CLIENT_NAME = 371, + TOKEN_GENERATED_PREFIX = 372, + TOKEN_TCP = 373, + TOKEN_JSON = 374, + TOKEN_WHEN_PRESENT = 375, + TOKEN_NEVER = 376, + TOKEN_ALWAYS = 377, + TOKEN_WHEN_NOT_PRESENT = 378, + TOKEN_LOGGING = 379, + TOKEN_LOGGERS = 380, + TOKEN_OUTPUT_OPTIONS = 381, + TOKEN_OUTPUT = 382, + TOKEN_DEBUGLEVEL = 383, + TOKEN_SEVERITY = 384, + TOKEN_FLUSH = 385, + TOKEN_MAXSIZE = 386, + TOKEN_MAXVER = 387, + TOKEN_DHCP6 = 388, + TOKEN_DHCPDDNS = 389, + TOKEN_CONTROL_AGENT = 390, + TOKEN_TOPLEVEL_JSON = 391, + TOKEN_TOPLEVEL_DHCP4 = 392, + TOKEN_SUB_DHCP4 = 393, + TOKEN_SUB_INTERFACES4 = 394, + TOKEN_SUB_SUBNET4 = 395, + TOKEN_SUB_POOL4 = 396, + TOKEN_SUB_RESERVATION = 397, + TOKEN_SUB_OPTION_DEFS = 398, + TOKEN_SUB_OPTION_DEF = 399, + TOKEN_SUB_OPTION_DATA = 400, + TOKEN_SUB_HOOKS_LIBRARY = 401, + TOKEN_SUB_DHCP_DDNS = 402, + TOKEN_STRING = 403, + TOKEN_INTEGER = 404, + TOKEN_FLOAT = 405, + TOKEN_BOOLEAN = 406 }; }; @@ -866,18 +863,6 @@ namespace isc { namespace dhcp { symbol_type make_USER_CONTEXT (const location_type& l); - static inline - symbol_type - make_KNOWN_CLIENTS (const location_type& l); - - static inline - symbol_type - make_ONLY (const location_type& l); - - static inline - symbol_type - make_NEVER (const location_type& l); - static inline symbol_type make_SUBNET (const location_type& l); @@ -1102,6 +1087,10 @@ namespace isc { namespace dhcp { symbol_type make_WHEN_PRESENT (const location_type& l); + static inline + symbol_type + make_NEVER (const location_type& l); + static inline symbol_type make_ALWAYS (const location_type& l); @@ -1427,12 +1416,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 823, ///< Last index in yytable_. - yynnts_ = 339, ///< Number of nonterminal symbols. + yylast_ = 815, ///< Last index in yytable_. + yynnts_ = 336, ///< Number of nonterminal symbols. yyfinal_ = 26, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 154 ///< Number of tokens. + yyntokens_ = 152 ///< Number of tokens. }; @@ -1489,9 +1478,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, 146, 147, 148, 149, 150, 151, 152, 153 + 145, 146, 147, 148, 149, 150, 151 }; - const unsigned int user_token_number_max_ = 408; + const unsigned int user_token_number_max_ = 406; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1524,31 +1513,30 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 153: // "boolean" + case 151: // "boolean" value.copy< bool > (other.value); break; - case 152: // "floating point" + case 150: // "floating point" value.copy< double > (other.value); break; - case 151: // "integer" + case 149: // "integer" value.copy< int64_t > (other.value); break; - case 150: // "constant string" + case 148: // "constant string" value.copy< std::string > (other.value); break; @@ -1569,31 +1557,30 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 153: // "boolean" + case 151: // "boolean" value.copy< bool > (v); break; - case 152: // "floating point" + case 150: // "floating point" value.copy< double > (v); break; - case 151: // "integer" + case 149: // "integer" value.copy< int64_t > (v); break; - case 150: // "constant string" + case 148: // "constant string" value.copy< std::string > (v); break; @@ -1673,31 +1660,30 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 153: // "boolean" + case 151: // "boolean" value.template destroy< bool > (); break; - case 152: // "floating point" + case 150: // "floating point" value.template destroy< double > (); break; - case 151: // "integer" + case 149: // "integer" value.template destroy< int64_t > (); break; - case 150: // "constant string" + case 148: // "constant string" value.template destroy< std::string > (); break; @@ -1724,31 +1710,30 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 168: // value - case 172: // map_value - case 210: // socket_type - case 213: // outbound_interface_value - case 223: // db_type - case 302: // hr_mode - case 373: // known_clients_value - case 450: // ncr_protocol_value - case 458: // replace_client_name_value + case 166: // value + case 170: // map_value + case 208: // socket_type + case 211: // outbound_interface_value + case 221: // db_type + case 300: // hr_mode + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 153: // "boolean" + case 151: // "boolean" value.move< bool > (s.value); break; - case 152: // "floating point" + case 150: // "floating point" value.move< double > (s.value); break; - case 151: // "integer" + case 149: // "integer" value.move< int64_t > (s.value); break; - case 150: // "constant string" + case 148: // "constant string" value.move< std::string > (s.value); break; @@ -1822,7 +1807,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408 + 405, 406 }; return static_cast (yytoken_number_[type]); } @@ -2205,24 +2190,6 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_USER_CONTEXT, l); } - Dhcp4Parser::symbol_type - Dhcp4Parser::make_KNOWN_CLIENTS (const location_type& l) - { - return symbol_type (token::TOKEN_KNOWN_CLIENTS, l); - } - - Dhcp4Parser::symbol_type - Dhcp4Parser::make_ONLY (const location_type& l) - { - return symbol_type (token::TOKEN_ONLY, l); - } - - Dhcp4Parser::symbol_type - Dhcp4Parser::make_NEVER (const location_type& l) - { - return symbol_type (token::TOKEN_NEVER, l); - } - Dhcp4Parser::symbol_type Dhcp4Parser::make_SUBNET (const location_type& l) { @@ -2559,6 +2526,12 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_WHEN_PRESENT, l); } + Dhcp4Parser::symbol_type + Dhcp4Parser::make_NEVER (const location_type& l) + { + return symbol_type (token::TOKEN_NEVER, l); + } + Dhcp4Parser::symbol_type Dhcp4Parser::make_ALWAYS (const location_type& l) { @@ -2742,7 +2715,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2746 "dhcp4_parser.h" // lalr1.cc:377 +#line 2719 "dhcp4_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 0bd41b683b..9b6f6fb24f 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201711270209 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 5eb004d047..9f50a762d0 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201711270209 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index bc8092c73f..c9fb3583b8 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711270209 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index 89ea5a5d84..c1abb4cd62 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 166 -#define YY_END_OF_BUFFER 167 +#define YY_NUM_RULES 164 +#define YY_END_OF_BUFFER 165 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,153 +700,151 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1317] = +static const flex_int16_t yy_accept[1300] = { 0, - 159, 159, 0, 0, 0, 0, 0, 0, 0, 0, - 167, 165, 10, 11, 165, 1, 159, 156, 159, 159, - 165, 158, 157, 165, 165, 165, 165, 165, 152, 153, - 165, 165, 165, 154, 155, 5, 5, 5, 165, 165, - 165, 10, 11, 0, 0, 148, 0, 0, 0, 0, + 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, + 165, 163, 10, 11, 163, 1, 157, 154, 157, 157, + 163, 156, 155, 163, 163, 163, 163, 163, 150, 151, + 163, 163, 163, 152, 153, 5, 5, 5, 163, 163, + 163, 10, 11, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 159, - 159, 0, 158, 159, 3, 2, 6, 0, 159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 157, + 157, 0, 156, 157, 3, 2, 6, 0, 157, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 127, - 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, - - 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 164, 162, 0, 161, - 160, 0, 0, 0, 0, 0, 0, 0, 126, 0, - - 0, 27, 0, 26, 0, 0, 89, 0, 0, 0, - 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 163, 160, 0, 0, 0, 0, 0, 0, - - 0, 0, 28, 0, 0, 30, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, - 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 0, 51, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 106, 131, 43, 0, 48, 0, - - 0, 0, 0, 0, 0, 145, 36, 0, 33, 0, - 32, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, - 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 115, 0, 0, 0, 0, 7, 34, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 125, 0, 0, + 126, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, - 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 162, 160, 0, 159, 158, 0, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 27, 0, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, + 0, 0, 87, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 124, 95, 0, 0, 0, - 99, 44, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, - 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 161, 158, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 30, - 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 70, 0, 0, 0, 110, 0, 0, 0, 42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 67, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 76, 0, 51, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 104, 129, 43, 0, + 48, 0, 0, 0, 0, 0, 0, 143, 36, 0, - 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 125, 14, 0, 0, 0, 0, 0, 0, + 33, 0, 32, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 116, 101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 112, 129, - 0, 38, 0, 121, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 64, 0, 0, 0, 0, 123, - 46, 0, 72, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, - + 45, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 0, 0, 0, 7, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 91, 0, 0, 0, 65, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 17, 15, 0, 143, 142, 0, 0, 0, 0, - 0, 29, 0, 105, 0, 0, 0, 0, 0, 0, - 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 0, 109, 0, 0, 53, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 84, 60, - 0, 117, 0, 0, 0, 108, 0, 0, 77, 0, - 147, 0, 0, 0, 0, 0, 0, 0, 75, 0, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103, 0, 56, 141, 0, 12, 0, 107, 0, - 0, 0, 0, 0, 0, 0, 41, 0, 40, 18, - 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 58, 0, 0, 54, 0, 0, 73, - 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - - 35, 0, 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, - 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, - 22, 57, 0, 0, 0, 0, 21, 0, 104, 74, - 0, 0, 136, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, - 0, 92, 0, 0, 0, 0, 0, 134, 139, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, + 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, + 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 122, 93, 0, 0, 0, 97, + 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, + 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 49, 70, 0, + 0, 0, 108, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 123, + + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 114, 99, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 110, 127, 0, 38, 0, + 119, 0, 0, 0, 0, 0, 0, 20, 0, 0, + 64, 0, 0, 0, 0, 121, 46, 0, 72, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, + 65, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 17, 15, 0, 141, + 140, 0, 0, 0, 0, 0, 29, 0, 103, 0, + 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, + 107, 0, 53, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 82, 60, 0, 115, 0, 0, 0, 106, + 0, 0, 77, 0, 145, 0, 0, 0, 0, 0, + 0, 0, 75, 0, 130, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 101, 0, 56, 139, 0, 12, + 0, 105, 0, 0, 0, 0, 0, 0, 0, 41, + 0, 40, 18, 0, 0, 94, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 58, 0, 0, 54, + 0, 0, 73, 0, 0, 0, 0, 0, 120, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 35, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 136, 0, 0, 0, 0, + + 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 135, 0, 22, 57, 0, 0, 0, 0, 21, + 0, 102, 74, 0, 0, 134, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 90, 0, 0, 0, 0, 0, + 132, 137, 61, 0, 0, 0, 131, 0, 0, 0, + 0, 0, 0, 0, 91, 0, 0, 133, 0 - 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, - 0, 93, 0, 0, 135, 0 } ; static const YY_CHAR yy_ec[256] = @@ -893,323 +891,321 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1329] = +static const flex_int16_t yy_base[1312] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1681, 1682, 32, 1677, 141, 0, 201, 1682, 206, 88, - 11, 213, 1682, 1659, 114, 25, 2, 6, 1682, 1682, - 73, 11, 17, 1682, 1682, 1682, 104, 1665, 1620, 0, - 1657, 107, 1672, 217, 241, 1682, 185, 1616, 1622, 1642, + 1663, 1664, 32, 1659, 141, 0, 201, 1664, 206, 88, + 11, 213, 1664, 1641, 114, 25, 2, 6, 1664, 1664, + 73, 11, 17, 1664, 1664, 1664, 104, 1647, 1602, 0, + 1639, 107, 1654, 217, 241, 1664, 185, 1598, 1604, 1624, 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 67, 231, 1623, 187, 268, 11, 274, 188, 293, - 285, 299, 1606, 78, 297, 329, 311, 1625, 0, 351, - 368, 380, 386, 389, 1682, 0, 1682, 267, 295, 285, - 309, 315, 330, 357, 342, 1682, 1622, 1661, 1682, 237, + 269, 67, 231, 1605, 187, 268, 1604, 274, 188, 293, + 270, 296, 1587, 78, 294, 313, 323, 1606, 0, 335, + 352, 373, 378, 381, 1664, 0, 1664, 267, 295, 343, + 344, 312, 346, 349, 327, 1664, 1603, 1642, 1664, 237, - 1682, 402, 354, 1609, 1619, 1658, 358, 305, 249, 1613, - 370, 377, 374, 385, 393, 1656, 0, 453, 384, 1600, - 1608, 74, 1604, 1593, 1594, 378, 1610, 1593, 1602, 325, - 1609, 200, 306, 1595, 370, 1583, 1639, 413, 1586, 1637, - 1579, 1588, 1601, 1598, 1598, 1592, 193, 1585, 1578, 1583, - 1577, 384, 1588, 1581, 1572, 1571, 1585, 365, 1621, 1570, - 384, 1582, 1585, 1569, 449, 391, 1583, 1580, 1581, 1579, - 1561, 1566, 1562, 1554, 1571, 1563, 0, 395, 425, 405, - 421, 429, 437, 1562, 1682, 0, 443, 1553, 1556, 1682, - 447, 456, 1682, 1608, 1563, 448, 1606, 457, 1605, 458, + 1664, 373, 367, 1590, 1600, 1639, 373, 377, 249, 1594, + 373, 380, 377, 383, 384, 1637, 0, 429, 393, 1581, + 1589, 74, 1585, 1574, 1575, 401, 1591, 1574, 1583, 377, + 1590, 200, 307, 1576, 362, 1564, 1620, 308, 1567, 1618, + 1560, 1583, 1580, 1580, 1574, 193, 1567, 1560, 1565, 1559, + 420, 1570, 1555, 1554, 1568, 399, 1604, 1553, 404, 1565, + 1568, 1552, 438, 406, 1566, 1563, 1564, 1562, 1544, 1549, + 1545, 1537, 1554, 1546, 0, 424, 435, 443, 436, 450, + 444, 1545, 1664, 0, 459, 1536, 1539, 1664, 447, 442, + 1664, 1591, 1546, 462, 1589, 463, 1588, 459, 1587, 1664, - 1604, 1682, 502, 1603, 468, 1564, 1559, 1558, 457, 1599, - 1593, 1559, 1538, 1546, 1552, 1540, 1554, 1550, 1551, 1551, - 1546, 1538, 1537, 1539, 1523, 1527, 1540, 1540, 1532, 1522, - 1525, 1539, 1682, 1525, 1533, 1536, 1517, 1512, 1515, 1565, - 1514, 1524, 1562, 479, 1523, 1511, 1522, 1558, 482, 1562, - 1499, 1514, 460, 1504, 1520, 1501, 1503, 1499, 1505, 1496, - 1495, 1508, 1501, 1503, 1507, 1506, 1500, 80, 1507, 1502, - 1494, 1500, 1500, 1481, 1497, 1483, 1489, 1496, 1484, 1477, - 1491, 1490, 1493, 1475, 1483, 485, 1682, 1682, 497, 1682, - 1682, 1470, 0, 453, 1472, 516, 504, 1526, 1682, 1479, + 503, 1586, 486, 1547, 1542, 1541, 362, 1582, 1576, 1542, + 1521, 1529, 1535, 1523, 1537, 1533, 1534, 1534, 1529, 1521, + 1520, 1522, 1506, 1510, 1523, 1523, 1515, 1505, 1508, 1522, + 1664, 1508, 1516, 1519, 1500, 1499, 1549, 1498, 1508, 1546, + 491, 1507, 1495, 1506, 1542, 483, 1546, 1499, 9, 1489, + 1505, 1486, 1488, 1484, 1490, 1481, 1480, 1493, 1486, 1488, + 1492, 1491, 1485, 80, 1492, 1487, 1479, 1485, 1485, 1466, + 1482, 1468, 1474, 1481, 1469, 1462, 1476, 1475, 1478, 1460, + 1468, 487, 1664, 1664, 488, 1664, 1664, 1455, 0, 455, + 1457, 517, 489, 1511, 1664, 1464, 473, 1664, 1509, 1664, - 501, 1682, 1524, 1682, 1518, 549, 1682, 498, 1460, 1470, - 1520, 1477, 492, 1682, 1475, 1517, 1472, 1469, 1470, 524, - 1474, 1512, 1462, 1457, 1454, 1503, 1449, 1451, 1500, 1459, - 1448, 1497, 1445, 548, 1458, 1458, 1441, 1442, 1455, 1442, - 1443, 1451, 1446, 1453, 1448, 1433, 482, 1442, 1445, 1440, - 1436, 1484, 192, 522, 1682, 1483, 1430, 1429, 1422, 1424, - 1428, 1417, 1424, 1429, 257, 1474, 1429, 508, 1426, 1430, - 1428, 1417, 1417, 1429, 1411, 1403, 1404, 1425, 1407, 1419, - 1418, 1404, 1416, 1415, 1414, 1413, 1454, 1453, 1452, 1396, - 570, 1409, 1682, 1682, 1408, 0, 523, 1396, 1447, 1446, + 1503, 543, 1664, 476, 1445, 1455, 1505, 1462, 460, 1664, + 1460, 1502, 1457, 1454, 1455, 396, 1459, 1497, 1447, 1442, + 1439, 1488, 1434, 1436, 1485, 1444, 1433, 1482, 1430, 549, + 1443, 1443, 1426, 1427, 1440, 1427, 1437, 1432, 1439, 1434, + 1419, 478, 1428, 1431, 1426, 1422, 1470, 192, 509, 1664, + 1417, 1416, 1409, 1411, 1415, 1404, 1411, 1416, 514, 1461, + 1416, 523, 1413, 1417, 1415, 1404, 1404, 1416, 1398, 1390, + 1391, 1412, 1394, 1406, 1405, 1391, 1403, 1402, 1401, 1400, + 1441, 1440, 1439, 1383, 490, 1396, 1664, 1664, 1395, 0, + 511, 1383, 1434, 1433, 1391, 1431, 1664, 1379, 1429, 1664, - 1404, 1444, 1682, 1392, 1442, 1682, 547, 597, 524, 1441, - 1383, 1682, 1399, 1398, 1385, 1384, 1682, 1386, 1383, 1395, - 1391, 1379, 1381, 1682, 1387, 1372, 1374, 445, 1385, 1383, - 1378, 576, 1385, 1367, 1416, 1682, 1365, 1381, 1413, 1417, - 1375, 1369, 1371, 1372, 1374, 1406, 1405, 1358, 1353, 1352, - 1354, 1347, 1362, 1340, 1347, 1352, 1400, 1682, 1347, 1343, - 1397, 1682, 1345, 1352, 1337, 1347, 1350, 1339, 1338, 1333, - 1682, 1388, 1682, 1332, 1331, 1324, 1341, 1378, 1325, 1330, - 1339, 1333, 1337, 578, 1372, 1336, 1316, 1319, 1318, 1326, - 1330, 1313, 1369, 1311, 1682, 1682, 1682, 1316, 1682, 1326, + 542, 598, 520, 1428, 1370, 1664, 1386, 1385, 1372, 1371, + 1664, 1373, 1370, 1382, 1378, 1366, 1368, 1664, 1374, 1359, + 1361, 535, 1372, 1370, 1365, 572, 1372, 1354, 1403, 1664, + 1352, 1368, 1400, 1404, 1362, 1356, 1358, 1359, 1361, 1393, + 1346, 1341, 1340, 1342, 1335, 1350, 1328, 1335, 1340, 1388, + 1664, 1335, 1331, 1385, 1333, 1340, 1325, 1335, 1338, 1327, + 1326, 1321, 1664, 1376, 1664, 1320, 1319, 1312, 1329, 1366, + 1313, 1318, 1327, 1321, 1325, 573, 1360, 1324, 1304, 1307, + 1306, 1314, 1318, 1301, 1357, 1299, 1664, 1664, 1664, 1304, + 1664, 1314, 1348, 1310, 0, 1351, 1301, 1664, 1664, 1298, - 1360, 1322, 0, 1363, 1313, 1682, 1682, 1310, 1682, 1316, - 1682, 530, 547, 596, 1682, 1354, 1301, 1300, 1307, 1300, - 1312, 1311, 1295, 1310, 1340, 1307, 1343, 1289, 1291, 1296, - 1293, 1301, 1301, 1300, 1682, 1285, 1282, 1296, 1288, 1294, - 1285, 1293, 1682, 1278, 1289, 1293, 1275, 1289, 1288, 1286, - 1269, 1263, 1268, 1265, 1280, 1281, 1278, 1319, 1276, 1682, - 1262, 1264, 1682, 1310, 1309, 572, 1272, 1255, 1256, 1261, - 1252, 1682, 1266, 1252, 603, 1244, 1265, 1262, 1254, 1297, - 1251, 1295, 1682, 1243, 1241, 1255, 1258, 1290, 1289, 1236, - 1287, 1286, 1682, 584, 1248, 1237, 1239, 1682, 1682, 1282, + 1664, 1304, 1664, 546, 547, 589, 1664, 1342, 1289, 1288, + 1295, 1288, 1300, 1299, 1283, 1298, 1328, 1295, 1331, 1277, + 1279, 1284, 1281, 1289, 1289, 1288, 1664, 1273, 1270, 1284, + 1276, 1282, 1273, 1281, 1664, 1266, 1277, 1281, 1263, 1277, + 1275, 1258, 1252, 1257, 1254, 1269, 1270, 1267, 1308, 1265, + 1664, 1251, 1253, 1664, 1299, 1298, 555, 1261, 1244, 1245, + 1250, 1241, 1664, 1255, 1241, 591, 1233, 1254, 1251, 1243, + 1286, 1240, 1284, 1664, 1232, 1230, 1244, 1247, 1279, 1278, + 1225, 1276, 1275, 1664, 580, 1237, 1226, 1228, 1664, 1664, + 1271, 1219, 1274, 568, 515, 553, 1233, 1267, 1266, 1265, - 1230, 1285, 564, 543, 564, 1244, 1278, 1277, 1276, 1230, - 1220, 1273, 1235, 1225, 1270, 1233, 1215, 1223, 1225, 1224, - 1264, 1227, 1262, 1266, 1223, 1222, 1223, 1216, 1205, 1218, - 1221, 1216, 1211, 1216, 1213, 1212, 1204, 1214, 1209, 1250, - 1249, 1193, 1189, 1197, 1245, 1682, 1244, 1193, 1185, 1200, - 1187, 1682, 1187, 1196, 1195, 1195, 1179, 1234, 1177, 1190, - 1682, 1182, 1174, 1183, 1176, 1187, 1164, 1168, 1219, 1166, - 1164, 1175, 1215, 1162, 565, 573, 1156, 1166, 571, 1682, - 1216, 1174, 1163, 1167, 1174, 1211, 1682, 1205, 567, 1158, - 1166, 1158, 1149, 1152, 1148, 1165, 1160, 1148, 1159, 1143, + 1219, 1209, 1262, 1224, 1214, 1259, 1222, 1204, 1212, 1214, + 1213, 1253, 1216, 1251, 1255, 1212, 1211, 1212, 1205, 1194, + 1207, 1210, 1205, 1200, 1205, 1202, 1201, 1204, 1199, 1240, + 1239, 1183, 1179, 1187, 1235, 1664, 1234, 1183, 1175, 1190, + 1177, 1664, 1177, 1186, 1185, 1185, 1169, 1224, 1167, 1180, + 1664, 1172, 1164, 1173, 1166, 1177, 1154, 1158, 1209, 1156, + 1154, 1165, 1205, 1152, 310, 557, 1146, 1156, 569, 1664, + 1206, 1164, 1153, 1157, 1164, 1201, 1664, 1195, 573, 1148, + 1156, 1148, 1139, 1142, 1138, 1155, 1150, 1138, 1149, 1133, + 1135, 1187, 1133, 1147, 1128, 1141, 1141, 1176, 1131, 1664, - 1145, 1197, 1143, 1157, 1138, 1151, 1151, 1186, 1141, 1682, - 1149, 1147, 1138, 1147, 1143, 1184, 1126, 1126, 1139, 1138, - 1123, 1178, 1131, 266, 292, 1682, 1682, 326, 326, 387, - 1682, 1682, 396, 412, 587, 414, 479, 556, 508, 586, - 597, 1682, 570, 586, 588, 631, 581, 583, 577, 641, - 596, 586, 582, 593, 597, 608, 603, 597, 599, 611, - 601, 654, 613, 618, 595, 1682, 653, 602, 617, 617, - 1682, 636, 644, 625, 615, 629, 622, 617, 618, 614, - 623, 618, 669, 675, 624, 1682, 636, 621, 637, 629, - 639, 629, 641, 635, 680, 649, 633, 635, 1682, 653, + 1139, 1137, 1128, 1137, 1133, 1174, 1116, 1116, 1129, 1128, + 1113, 1168, 1110, 1111, 1664, 1664, 1125, 1122, 1125, 1664, + 1664, 1124, 1109, 581, 1108, 1106, 17, 202, 332, 410, + 1664, 367, 475, 495, 540, 505, 529, 531, 604, 565, + 555, 559, 569, 574, 587, 582, 577, 579, 591, 582, + 635, 600, 605, 583, 1664, 641, 590, 605, 605, 1664, + 624, 632, 612, 602, 616, 609, 604, 605, 601, 610, + 605, 656, 662, 611, 1664, 623, 608, 624, 616, 626, + 616, 628, 622, 667, 635, 620, 621, 1664, 640, 623, + 625, 681, 626, 1664, 645, 625, 643, 682, 642, 632, - 636, 638, 694, 639, 1682, 654, 659, 639, 658, 696, - 656, 646, 664, 648, 663, 655, 651, 669, 654, 1682, - 1682, 662, 707, 662, 1682, 670, 665, 716, 1682, 667, - 672, 666, 668, 680, 674, 672, 725, 671, 727, 728, - 674, 1682, 673, 681, 679, 678, 692, 693, 694, 710, - 715, 689, 699, 685, 692, 697, 704, 745, 746, 695, - 699, 1682, 694, 713, 710, 748, 697, 705, 701, 719, - 720, 706, 714, 723, 703, 724, 764, 767, 1682, 722, - 769, 770, 720, 733, 735, 719, 720, 727, 778, 727, - 742, 781, 733, 737, 735, 733, 786, 787, 739, 789, + 650, 634, 649, 641, 637, 655, 640, 1664, 1664, 648, + 693, 648, 1664, 656, 651, 702, 1664, 653, 658, 652, + 654, 666, 660, 658, 711, 657, 713, 714, 660, 1664, + 659, 667, 665, 664, 678, 679, 680, 696, 701, 675, + 685, 671, 678, 683, 690, 731, 732, 681, 685, 1664, + 680, 698, 696, 734, 683, 691, 687, 705, 706, 692, + 700, 709, 689, 710, 750, 753, 1664, 708, 755, 756, + 718, 720, 703, 705, 712, 763, 712, 727, 766, 718, + 722, 720, 718, 771, 772, 724, 774, 770, 730, 1664, + 735, 728, 737, 731, 726, 736, 732, 1664, 727, 1664, - 785, 745, 1682, 750, 743, 752, 746, 741, 751, 747, - 1682, 742, 1682, 1682, 743, 741, 760, 761, 762, 744, - 749, 756, 789, 780, 752, 811, 757, 772, 764, 768, - 1682, 1682, 778, 776, 762, 763, 821, 776, 818, 786, - 783, 770, 781, 773, 779, 775, 794, 795, 1682, 1682, - 793, 1682, 795, 1682, 780, 781, 801, 791, 841, 796, - 838, 1682, 795, 845, 1682, 846, 795, 802, 844, 1682, - 1682, 804, 1682, 795, 795, 798, 812, 799, 810, 857, - 816, 854, 860, 861, 810, 863, 864, 825, 809, 821, - 811, 841, 870, 830, 1682, 872, 821, 817, 833, 838, + 1664, 728, 726, 745, 746, 747, 729, 734, 741, 774, + 765, 737, 796, 741, 757, 749, 753, 1664, 1664, 763, + 761, 747, 748, 806, 761, 803, 771, 768, 755, 766, + 758, 764, 760, 779, 780, 1664, 1664, 778, 1664, 780, + 1664, 765, 785, 775, 825, 780, 822, 1664, 779, 829, + 1664, 830, 779, 786, 828, 1664, 1664, 788, 1664, 779, + 779, 782, 796, 783, 794, 841, 800, 838, 844, 845, + 794, 847, 848, 809, 793, 805, 795, 825, 854, 814, + 1664, 856, 805, 801, 817, 822, 810, 862, 821, 1664, + 823, 825, 815, 824, 826, 819, 828, 829, 826, 816, - 826, 878, 837, 1682, 839, 841, 831, 840, 842, 835, - 844, 845, 842, 832, 834, 891, 840, 893, 838, 839, - 896, 1682, 835, 850, 900, 1682, 1682, 850, 860, 845, - 861, 847, 906, 908, 854, 911, 870, 1682, 862, 865, - 916, 1682, 1682, 862, 1682, 1682, 869, 919, 870, 921, - 903, 1682, 881, 1682, 868, 867, 870, 870, 871, 929, - 1682, 874, 931, 883, 892, 888, 879, 894, 894, 897, - 897, 894, 899, 1682, 891, 1682, 943, 902, 1682, 904, - 905, 902, 1682, 893, 899, 898, 910, 910, 1682, 1682, - 949, 1682, 914, 899, 905, 1682, 910, 921, 1682, 918, + 818, 875, 824, 877, 822, 879, 1664, 817, 833, 883, + 1664, 1664, 833, 843, 828, 844, 830, 889, 891, 837, + 893, 853, 1664, 845, 847, 899, 1664, 1664, 845, 1664, + 1664, 852, 902, 853, 904, 886, 1664, 864, 1664, 851, + 850, 853, 853, 854, 912, 1664, 857, 914, 866, 875, + 871, 862, 877, 877, 880, 880, 877, 882, 1664, 874, + 1664, 884, 1664, 885, 887, 884, 1664, 875, 881, 880, + 892, 892, 1664, 1664, 931, 1664, 896, 881, 887, 1664, + 892, 903, 1664, 900, 1664, 919, 939, 945, 889, 947, + 948, 903, 1664, 950, 1664, 913, 952, 892, 949, 914, - 1682, 937, 957, 963, 907, 965, 966, 921, 1682, 968, - 1682, 931, 970, 910, 967, 932, 928, 970, 920, 925, - 978, 936, 1682, 980, 981, 944, 933, 984, 928, 945, - 930, 946, 930, 986, 987, 952, 938, 949, 996, 968, - 955, 1682, 999, 1682, 1682, 948, 1682, 945, 1682, 1002, - 950, 999, 944, 949, 1008, 958, 1682, 964, 1682, 1682, - 955, 970, 1682, 1008, 976, 969, 970, 979, 966, 968, - 978, 1021, 972, 1682, 1023, 970, 1682, 975, 971, 1682, - 979, 974, 973, 1031, 986, 1682, 1028, 990, 993, 1036, - 979, 981, 989, 979, 995, 989, 1005, 1044, 1682, 1040, + 910, 952, 902, 907, 960, 918, 962, 963, 926, 915, + 966, 910, 927, 912, 928, 912, 968, 969, 934, 920, + 931, 978, 950, 937, 1664, 981, 1664, 1664, 930, 1664, + 927, 1664, 984, 932, 981, 926, 931, 990, 940, 1664, + 946, 1664, 1664, 937, 952, 1664, 990, 958, 951, 952, + 961, 948, 950, 960, 1003, 954, 1664, 1005, 952, 1664, + 957, 953, 1664, 961, 956, 955, 1013, 968, 1664, 1010, + 972, 975, 1018, 961, 963, 971, 961, 977, 971, 987, + 1026, 1664, 1022, 1664, 987, 1024, 988, 989, 980, 987, + 1664, 984, 989, 1036, 981, 1664, 985, 997, 998, 1041, - 1682, 1005, 1042, 1006, 1007, 998, 1005, 1682, 1002, 1007, - 1054, 999, 1682, 1003, 1015, 1016, 1059, 1003, 1004, 1012, - 1682, 1023, 1013, 1012, 1010, 1016, 1028, 1019, 1028, 1030, - 1682, 1072, 1032, 1074, 1075, 1682, 1071, 1031, 1036, 1017, - 1080, 1039, 1082, 1083, 1042, 1043, 1086, 1045, 1682, 1050, - 1682, 1682, 1032, 1038, 1091, 1052, 1682, 1038, 1682, 1682, - 1038, 1040, 1682, 1045, 1040, 1052, 1048, 1682, 1051, 1055, - 1046, 1098, 1047, 1063, 1056, 1051, 1066, 1057, 1064, 1051, - 1066, 1113, 1072, 1115, 1060, 1076, 1067, 1081, 1077, 1682, - 1121, 1682, 1122, 1123, 1080, 1079, 1080, 1682, 1682, 1682, + 985, 986, 994, 1664, 1005, 995, 994, 992, 998, 1010, + 1001, 1010, 1012, 1664, 1054, 1014, 1056, 1057, 1664, 1053, + 1013, 1018, 999, 1062, 1021, 1064, 1065, 1024, 1025, 1068, + 1027, 1664, 1032, 1664, 1664, 1014, 1020, 1073, 1034, 1664, + 1020, 1664, 1664, 1020, 1022, 1664, 1027, 1022, 1034, 1030, + 1664, 1033, 1037, 1028, 1080, 1029, 1045, 1038, 1033, 1048, + 1039, 1046, 1033, 1048, 1095, 1054, 1097, 1042, 1058, 1049, + 1063, 1059, 1664, 1103, 1664, 1104, 1105, 1062, 1061, 1062, + 1664, 1664, 1664, 1109, 1053, 1069, 1664, 1107, 1058, 1057, + 1059, 1070, 1117, 1068, 1664, 1077, 1120, 1664, 1664, 1126, - 1127, 1071, 1087, 1682, 1125, 1076, 1075, 1077, 1088, 1135, - 1086, 1682, 1095, 1138, 1682, 1682, 1144, 1149, 1154, 1159, - 1164, 1169, 1174, 1177, 1151, 1156, 1158, 1171 + 1131, 1136, 1141, 1146, 1151, 1156, 1159, 1133, 1138, 1140, + 1153 } ; -static const flex_int16_t yy_def[1329] = +static const flex_int16_t yy_def[1312] = { 0, - 1317, 1317, 1318, 1318, 1317, 1317, 1317, 1317, 1317, 1317, - 1316, 1316, 1316, 1316, 1316, 1319, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1320, - 1316, 1316, 1316, 1321, 15, 1316, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1322, 45, 45, + 1300, 1300, 1301, 1301, 1300, 1300, 1300, 1300, 1300, 1300, + 1299, 1299, 1299, 1299, 1299, 1302, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1303, + 1299, 1299, 1299, 1304, 15, 1299, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1305, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1319, 1316, - 1316, 1316, 1316, 1316, 1316, 1323, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1320, 1316, 1321, + 45, 45, 45, 45, 45, 45, 45, 45, 1302, 1299, + 1299, 1299, 1299, 1299, 1299, 1306, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1303, 1299, 1304, - 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1324, 45, 1322, 45, 45, + 1299, 1299, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 1305, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1323, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1325, 45, 45, 45, 1316, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1306, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1308, 45, 45, 45, 1299, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 1307, 1299, - 1324, 1316, 1322, 45, 45, 45, 45, 45, 45, 45, + 1305, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1326, 45, 45, 45, 45, 45, 1316, 45, + 45, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1309, 45, + 45, 45, 45, 45, 1299, 45, 45, 1299, 45, 1299, - 45, 1316, 45, 1316, 45, 1322, 1316, 45, 45, 45, - 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, + 45, 1305, 1299, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1316, 1316, 1316, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1299, 1299, 1299, 1310, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 1299, - 45, 45, 1316, 45, 45, 1316, 45, 1322, 45, 45, - 45, 1316, 45, 45, 45, 45, 1316, 45, 45, 45, - 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, + 45, 1305, 45, 45, 45, 1299, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 1299, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 1316, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1316, 1316, 1316, 45, 1316, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1299, 1299, 1299, 45, + 1299, 45, 45, 1299, 1311, 45, 45, 1299, 1299, 45, - 45, 1316, 1328, 45, 45, 1316, 1316, 45, 1316, 45, - 1316, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + 1299, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 1299, 45, 45, 45, 45, 45, 45, + 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1299, 45, 45, 45, 45, 1299, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, + 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, - 45, 45, 45, 45, 45, 45, 1316, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1299, 1299, 45, 45, 45, 1299, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1299, 45, 45, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, + 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 1299, 1299, 45, + 45, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 1299, 45, 1299, + + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1299, 1299, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1299, 1299, 45, 1299, 45, + 1299, 45, 45, 45, 45, 45, 45, 1299, 45, 45, + 1299, 45, 45, 45, 45, 1299, 1299, 45, 1299, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 1316, 45, 45, 45, - 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, - 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, + 1299, 1299, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1299, 45, 45, 45, 1299, 1299, 45, 1299, + 1299, 45, 45, 45, 45, 45, 1299, 45, 1299, 45, + 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, + 1299, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 1299, 1299, 45, 1299, 45, 45, 45, 1299, + 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, + 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, - 1316, 45, 45, 45, 1316, 45, 45, 45, 1316, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1299, 45, 1299, 1299, 45, 1299, + 45, 1299, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 1299, 1299, 45, 45, 1299, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1299, 45, 45, 1299, + 45, 45, 1299, 45, 45, 45, 45, 45, 1299, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1299, 45, 1299, 45, 45, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 1299, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 1316, 45, 1316, 1316, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1299, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1316, 1316, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1316, 1316, - 45, 1316, 45, 1316, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 1316, 45, 45, 45, 45, 1316, - 1316, 45, 1316, 45, 45, 45, 45, 45, 45, 45, + 45, 1299, 45, 1299, 1299, 45, 45, 45, 45, 1299, + 45, 1299, 1299, 45, 45, 1299, 45, 45, 45, 45, + 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1316, 45, 45, 45, 45, 45, + 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, + 1299, 1299, 1299, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 1299, 45, 45, 1299, 0, 1299, - 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 45, 1316, 1316, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1316, 45, 45, - 45, 1316, 1316, 45, 1316, 1316, 45, 45, 45, 45, - 45, 1316, 45, 1316, 45, 45, 45, 45, 45, 45, - 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1316, 45, 1316, 45, 45, 1316, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 1316, 1316, - 45, 1316, 45, 45, 45, 1316, 45, 45, 1316, 45, - - 1316, 45, 45, 45, 45, 45, 45, 45, 1316, 45, - 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 1316, 1316, 45, 1316, 45, 1316, 45, - 45, 45, 45, 45, 45, 45, 1316, 45, 1316, 1316, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1316, 45, 45, 1316, 45, 45, 1316, - 45, 45, 45, 45, 45, 1316, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, - - 1316, 45, 45, 45, 45, 45, 45, 1316, 45, 45, - 45, 45, 1316, 45, 45, 45, 45, 45, 45, 45, - 1316, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1316, 45, 45, 45, 45, 1316, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1316, 45, - 1316, 1316, 45, 45, 45, 45, 1316, 45, 1316, 1316, - 45, 45, 1316, 45, 45, 45, 45, 1316, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1316, - 45, 1316, 45, 45, 45, 45, 45, 1316, 1316, 1316, - - 45, 45, 45, 1316, 45, 45, 45, 45, 45, 45, - 45, 1316, 45, 45, 1316, 0, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316 + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299 } ; -static const flex_int16_t yy_nxt[1754] = +static const flex_int16_t yy_nxt[1736] = { 0, - 1316, 13, 14, 13, 1316, 15, 16, 1316, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 85, 1316, - 37, 14, 37, 86, 25, 26, 38, 1316, 1316, 27, + 1299, 13, 14, 13, 1299, 15, 16, 1299, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 85, 352, + 37, 14, 37, 86, 25, 26, 38, 806, 1299, 27, 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, - 13, 14, 13, 13, 14, 13, 32, 40, 141, 13, - 14, 13, 33, 40, 115, 91, 92, 142, 90, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 1299, 13, + 14, 13, 33, 40, 115, 91, 92, 353, 90, 34, 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 108, 39, 90, 25, 26, 13, 14, 13, 27, 39, 84, 84, 84, 28, 42, 41, 42, 42, 29, 42, 30, 82, 107, 41, 111, 93, 25, 31, 108, - 208, 164, 88, 130, 88, 165, 32, 89, 89, 89, - 209, 131, 33, 132, 374, 82, 107, 375, 111, 34, + 206, 162, 88, 130, 88, 163, 32, 89, 89, 89, + 207, 131, 33, 132, 368, 82, 107, 369, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 48, 49, 50, 51, 45, 52, 53, @@ -1220,185 +1216,183 @@ static const flex_int16_t yy_nxt[1754] = 73, 74, 75, 76, 77, 78, 57, 45, 45, 45, 45, 45, 80, 103, 81, 81, 81, 80, 109, 83, 83, 83, 101, 114, 80, 82, 83, 83, 83, 121, - 82, 147, 122, 112, 123, 148, 124, 82, 243, 103, - 459, 103, 101, 113, 135, 223, 114, 110, 82, 136, - 460, 107, 137, 82, 193, 149, 112, 102, 224, 244, - 82, 45, 471, 45, 45, 45, 45, 119, 45, 45, + 82, 146, 122, 112, 123, 147, 124, 82, 240, 103, + 452, 103, 101, 113, 135, 221, 114, 110, 82, 136, + 453, 107, 137, 82, 191, 148, 112, 102, 222, 241, + 82, 45, 807, 45, 45, 45, 45, 119, 45, 45, 45, 113, 117, 120, 107, 45, 45, 102, 45, 45, - 89, 89, 89, 194, 45, 133, 45, 45, 45, 45, + 89, 89, 89, 192, 45, 133, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 89, 89, - 89, 45, 125, 178, 138, 45, 126, 111, 472, 127, - 128, 143, 144, 45, 139, 145, 140, 45, 807, 45, - 118, 146, 129, 153, 114, 192, 150, 179, 151, 178, - 152, 154, 158, 155, 166, 159, 160, 167, 156, 157, - 180, 112, 808, 225, 168, 169, 161, 114, 178, 162, - 170, 113, 192, 179, 84, 84, 84, 174, 219, 226, - 220, 809, 175, 810, 112, 82, 171, 180, 180, 80, - 172, 81, 81, 81, 181, 179, 191, 221, 88, 113, - 88, 187, 82, 89, 89, 89, 173, 80, 82, 83, + 89, 45, 125, 231, 138, 45, 126, 111, 152, 127, + 128, 142, 143, 45, 139, 144, 140, 45, 153, 45, + 118, 145, 129, 154, 155, 112, 149, 808, 150, 156, + 151, 164, 157, 158, 165, 113, 114, 178, 84, 84, + 84, 166, 167, 159, 223, 232, 160, 168, 112, 82, + 169, 747, 178, 80, 170, 81, 81, 81, 748, 114, + 224, 176, 177, 113, 176, 178, 82, 177, 100, 172, + 171, 88, 82, 88, 173, 100, 89, 89, 89, 80, + 181, 83, 83, 83, 84, 84, 84, 176, 177, 82, - 83, 83, 84, 84, 84, 183, 196, 100, 197, 198, - 82, 182, 191, 82, 100, 82, 199, 200, 233, 187, - 196, 187, 213, 214, 228, 255, 256, 229, 286, 288, - 811, 230, 215, 82, 196, 197, 82, 198, 204, 812, - 200, 259, 100, 199, 260, 261, 100, 273, 249, 205, - 100, 274, 288, 287, 286, 275, 286, 287, 100, 265, - 234, 288, 100, 294, 100, 186, 203, 203, 203, 813, - 358, 816, 301, 203, 203, 203, 203, 203, 203, 287, - 297, 303, 289, 290, 291, 298, 294, 305, 294, 347, - 530, 397, 266, 267, 268, 301, 203, 203, 203, 203, + 179, 189, 82, 180, 185, 82, 415, 190, 198, 194, + 416, 195, 196, 100, 197, 809, 226, 100, 308, 227, + 217, 100, 218, 228, 309, 82, 810, 189, 82, 100, + 185, 198, 185, 100, 190, 100, 184, 194, 195, 219, + 196, 197, 201, 201, 201, 211, 212, 202, 261, 201, + 201, 201, 201, 201, 201, 213, 194, 282, 203, 251, + 252, 255, 269, 283, 256, 257, 270, 284, 284, 282, + 271, 294, 201, 201, 201, 201, 201, 201, 283, 290, + 293, 262, 263, 264, 246, 282, 297, 299, 301, 283, + 284, 287, 265, 391, 266, 491, 267, 285, 294, 268, - 203, 203, 531, 269, 303, 270, 301, 271, 297, 393, - 272, 308, 298, 312, 305, 306, 306, 306, 359, 313, - 397, 393, 306, 306, 306, 306, 306, 306, 402, 354, - 399, 400, 393, 405, 421, 414, 397, 817, 422, 401, - 348, 452, 453, 349, 394, 306, 306, 306, 306, 306, - 306, 402, 415, 436, 405, 475, 504, 504, 437, 476, - 603, 405, 408, 408, 408, 409, 818, 689, 819, 408, - 408, 408, 408, 408, 408, 499, 512, 652, 513, 604, - 500, 535, 461, 583, 504, 514, 536, 603, 584, 680, - 689, 820, 408, 408, 408, 408, 408, 408, 688, 681, + 492, 342, 290, 408, 286, 399, 290, 297, 293, 297, + 299, 387, 387, 396, 391, 301, 302, 302, 302, 463, + 409, 811, 391, 302, 302, 302, 302, 302, 302, 304, + 349, 393, 394, 399, 387, 388, 396, 445, 446, 679, + 395, 399, 812, 403, 496, 813, 302, 302, 302, 302, + 302, 302, 343, 496, 430, 344, 402, 402, 402, 431, + 642, 814, 679, 402, 402, 402, 402, 402, 402, 454, + 467, 504, 496, 505, 468, 464, 594, 527, 574, 595, + 522, 506, 528, 575, 815, 670, 402, 402, 402, 402, + 402, 402, 523, 816, 590, 671, 651, 643, 504, 596, - 773, 599, 821, 512, 438, 513, 605, 604, 661, 439, - 45, 45, 45, 662, 653, 690, 758, 45, 45, 45, - 45, 45, 45, 759, 760, 691, 688, 764, 773, 822, - 814, 761, 823, 765, 815, 824, 825, 826, 827, 828, - 45, 45, 45, 45, 45, 45, 829, 830, 831, 832, - 663, 833, 834, 835, 836, 837, 838, 839, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 840, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, - 872, 851, 873, 874, 850, 875, 876, 877, 878, 879, + 505, 652, 678, 594, 680, 432, 762, 595, 749, 817, + 433, 45, 45, 45, 681, 750, 818, 819, 45, 45, + 45, 45, 45, 45, 802, 753, 820, 821, 803, 822, + 678, 754, 823, 824, 762, 825, 826, 827, 653, 829, + 830, 45, 45, 45, 45, 45, 45, 831, 832, 828, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 839, + 862, 863, 838, 864, 865, 866, 867, 870, 871, 872, + 873, 868, 874, 875, 876, 877, 878, 879, 880, 881, - 882, 883, 884, 885, 880, 886, 887, 888, 889, 890, - 891, 892, 893, 894, 895, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 896, 907, 908, 909, 910, - 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 925, 924, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 881, 936, 937, 938, 939, - 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, - 923, 924, 950, 951, 952, 954, 956, 957, 958, 953, - 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 882, 884, 885, 886, 887, 888, 889, 890, 891, 892, + 893, 883, 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 908, 909, 910, 912, + 911, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 869, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 936, 910, 911, 937, 938, + 939, 941, 943, 944, 945, 940, 946, 947, 948, 949, + 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 955, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 992, 1014, 1015, 1016, - 1017, 1018, 993, 1019, 1020, 1021, 1022, 1023, 1024, 1025, - 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, - 1036, 1037, 1038, 1039, 1040, 1042, 1043, 1044, 1045, 1046, - 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1056, 1057, - 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, - 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, + 980, 981, 982, 942, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 978, 1000, 1001, 1002, 1003, 1004, 979, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, + 1038, 1039, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1063, 1064, 1036, 1065, 1067, 1068, + 1069, 1070, 1071, 1072, 1073, 1066, 1074, 1075, 1076, 1026, - 1078, 1079, 1051, 1080, 1081, 1083, 1084, 1085, 1086, 1087, - 1088, 1089, 1082, 1090, 1091, 1041, 1092, 1093, 1094, 1055, - 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, - 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1077, 1078, 1079, 1040, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, + 1106, 1107, 1108, 1086, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1102, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, - 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 1145, 1146, 1147, 1148, 1149, 1123, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1140, 1167, 1168, 1169, 1170, 1171, 1172, + 1165, 1166, 1167, 1168, 1164, 1169, 1170, 1171, 1172, 1173, - 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1182, 1183, - 1184, 1185, 1181, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1158, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, - 1175, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, - 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, - 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, - 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, + 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, - 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, - 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, - 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, - 1312, 1313, 1314, 1315, 12, 12, 12, 12, 12, 36, - 36, 36, 36, 36, 79, 293, 79, 79, 79, 98, - 396, 98, 503, 98, 100, 100, 100, 100, 100, 116, - 116, 116, 116, 116, 177, 100, 177, 177, 177, 201, - 201, 201, 806, 805, 804, 803, 802, 801, 800, 799, - 798, 797, 796, 795, 794, 793, 792, 791, 790, 789, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, + 1293, 1294, 1295, 1296, 1297, 1298, 12, 12, 12, 12, + 12, 36, 36, 36, 36, 36, 79, 289, 79, 79, + 79, 98, 390, 98, 495, 98, 100, 100, 100, 100, + 100, 116, 116, 116, 116, 116, 175, 100, 175, 175, + 175, 199, 199, 199, 805, 804, 801, 800, 799, 798, + 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, + 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, + 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, - 788, 787, 786, 785, 784, 783, 782, 781, 780, 779, - 778, 777, 776, 775, 774, 772, 771, 770, 769, 768, - 767, 766, 763, 762, 757, 756, 755, 754, 753, 752, - 751, 750, 749, 748, 747, 746, 745, 744, 743, 742, - 741, 740, 739, 738, 737, 736, 735, 734, 733, 732, - 731, 730, 729, 728, 727, 726, 725, 724, 723, 722, - 721, 720, 719, 718, 717, 716, 715, 714, 713, 712, - 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, - 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, - 687, 686, 685, 684, 683, 682, 679, 678, 677, 676, + 767, 766, 765, 764, 763, 761, 760, 759, 758, 757, + 756, 755, 752, 751, 746, 745, 744, 743, 742, 741, + 740, 739, 738, 737, 736, 735, 734, 733, 732, 731, + 730, 729, 728, 727, 726, 725, 724, 723, 722, 721, + 720, 719, 718, 717, 716, 715, 714, 713, 712, 711, + 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, + 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, + 690, 689, 688, 687, 686, 685, 684, 683, 682, 677, + 676, 675, 674, 673, 672, 669, 668, 667, 666, 665, + 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, - 675, 674, 673, 672, 671, 670, 669, 668, 667, 666, - 665, 664, 660, 659, 658, 657, 656, 655, 654, 651, - 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, - 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, - 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, - 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, - 610, 609, 608, 607, 606, 602, 601, 600, 599, 598, - 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, - 587, 586, 585, 582, 581, 580, 579, 578, 577, 576, - 575, 574, 573, 572, 571, 570, 569, 568, 567, 566, + 654, 650, 649, 648, 647, 646, 645, 644, 641, 640, + 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, + 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, + 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, + 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, + 599, 598, 597, 593, 592, 591, 590, 589, 588, 587, + 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, + 576, 573, 572, 571, 570, 569, 568, 567, 566, 565, + 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, + 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, - 565, 564, 563, 562, 561, 560, 559, 558, 557, 556, - 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, - 545, 544, 543, 542, 541, 540, 539, 538, 537, 534, - 533, 532, 529, 528, 527, 526, 525, 524, 523, 522, - 521, 520, 519, 518, 517, 516, 515, 511, 510, 509, - 508, 507, 506, 505, 502, 501, 498, 497, 496, 495, - 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, - 484, 483, 482, 481, 480, 479, 478, 477, 474, 473, - 470, 469, 468, 467, 466, 465, 464, 463, 462, 458, - 457, 456, 455, 454, 451, 450, 449, 448, 447, 446, + 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, + 534, 533, 532, 531, 530, 529, 526, 525, 524, 521, + 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, + 510, 509, 508, 507, 503, 502, 501, 500, 499, 498, + 497, 494, 493, 490, 489, 488, 487, 486, 485, 484, + 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, + 473, 472, 471, 470, 469, 466, 465, 462, 461, 460, + 459, 458, 457, 456, 455, 451, 450, 449, 448, 447, + 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, + 434, 429, 428, 427, 426, 425, 424, 423, 422, 421, - 445, 444, 443, 442, 441, 440, 435, 434, 433, 432, - 431, 430, 429, 428, 427, 426, 425, 424, 423, 420, - 419, 418, 417, 416, 413, 412, 411, 410, 407, 406, - 404, 403, 398, 395, 392, 391, 390, 389, 388, 387, - 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, - 376, 373, 372, 371, 370, 369, 368, 367, 366, 365, - 364, 363, 362, 361, 360, 357, 356, 355, 353, 352, - 351, 350, 346, 345, 344, 343, 342, 341, 340, 339, - 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, - 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, + 420, 419, 418, 417, 414, 413, 412, 411, 410, 407, + 406, 405, 404, 401, 400, 398, 397, 392, 389, 386, + 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, + 375, 374, 373, 372, 371, 370, 367, 366, 365, 364, + 363, 362, 361, 360, 359, 358, 357, 356, 355, 354, + 351, 350, 348, 347, 346, 345, 341, 340, 339, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 312, 311, 310, 307, 306, + 305, 303, 200, 300, 298, 296, 295, 292, 291, 288, - 318, 317, 316, 315, 314, 311, 310, 309, 307, 202, - 304, 302, 300, 299, 296, 295, 292, 285, 284, 283, - 282, 281, 280, 279, 278, 277, 276, 264, 263, 262, - 258, 257, 254, 253, 252, 251, 250, 248, 247, 246, - 245, 242, 241, 240, 239, 238, 237, 236, 235, 232, - 231, 227, 222, 218, 217, 216, 212, 211, 210, 207, - 206, 202, 195, 190, 189, 188, 185, 184, 176, 163, - 134, 106, 105, 104, 43, 99, 97, 96, 87, 43, - 1316, 11, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, + 260, 259, 258, 254, 253, 250, 249, 248, 247, 245, + 244, 243, 242, 239, 238, 237, 236, 235, 234, 233, + 230, 229, 225, 220, 216, 215, 214, 210, 209, 208, + 205, 204, 200, 193, 188, 187, 186, 183, 182, 174, + 161, 141, 134, 106, 105, 104, 43, 99, 97, 96, + 87, 43, 1299, 11, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316 + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299 } ; -static const flex_int16_t yy_chk[1754] = +static const flex_int16_t yy_chk[1736] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 0, - 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 249, + 3, 3, 3, 21, 1, 1, 3, 727, 0, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, - 6, 6, 6, 7, 7, 7, 1, 7, 67, 8, - 8, 8, 1, 8, 57, 27, 28, 67, 26, 1, + 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, + 8, 8, 1, 8, 57, 27, 28, 249, 26, 1, 1, 2, 2, 2, 32, 2, 2, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 52, 5, 31, 2, 2, 10, 10, 10, 2, @@ -1406,7 +1400,7 @@ static const flex_int16_t yy_chk[1754] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 122, 74, 25, 62, 25, 74, 2, 25, 25, 25, - 122, 62, 2, 62, 268, 20, 51, 268, 54, 2, + 122, 62, 2, 62, 264, 20, 51, 264, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1417,174 +1411,172 @@ static const flex_int16_t yy_chk[1754] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 47, 17, 17, 17, 19, 53, 19, 19, 19, 44, 56, 22, 17, 22, 22, 22, 60, - 19, 69, 60, 55, 60, 69, 60, 22, 147, 47, - 353, 59, 100, 55, 65, 132, 56, 53, 17, 65, - 353, 63, 65, 19, 109, 69, 55, 44, 132, 147, - 22, 45, 365, 45, 45, 45, 45, 59, 45, 45, + 19, 69, 60, 55, 60, 69, 60, 22, 146, 47, + 348, 59, 100, 55, 65, 132, 56, 53, 17, 65, + 348, 63, 65, 19, 109, 69, 55, 44, 132, 146, + 22, 45, 728, 45, 45, 45, 45, 59, 45, 45, 45, 55, 58, 59, 63, 45, 45, 100, 45, 58, 88, 88, 88, 109, 45, 63, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, - 89, 58, 61, 90, 66, 58, 61, 70, 365, 61, - 61, 68, 68, 58, 66, 68, 66, 58, 724, 58, - 58, 68, 61, 71, 77, 108, 70, 91, 70, 90, - 70, 71, 72, 71, 75, 72, 72, 75, 71, 71, - 92, 76, 725, 133, 75, 75, 72, 77, 93, 72, - 75, 76, 108, 91, 80, 80, 80, 77, 130, 133, - 130, 728, 77, 729, 76, 80, 76, 95, 92, 81, - 76, 81, 81, 81, 93, 94, 107, 130, 82, 76, - 82, 103, 81, 82, 82, 82, 76, 83, 80, 83, + 89, 58, 61, 138, 66, 58, 61, 70, 71, 61, + 61, 68, 68, 58, 66, 68, 66, 58, 71, 58, + 58, 68, 61, 71, 71, 76, 70, 729, 70, 72, + 70, 75, 72, 72, 75, 76, 77, 92, 80, 80, + 80, 75, 75, 72, 133, 138, 72, 75, 76, 80, + 76, 665, 95, 81, 76, 81, 81, 81, 665, 77, + 133, 90, 91, 76, 93, 92, 81, 94, 102, 77, + 76, 82, 80, 82, 77, 102, 82, 82, 82, 83, + 95, 83, 83, 83, 84, 84, 84, 90, 91, 81, - 83, 83, 84, 84, 84, 95, 111, 102, 112, 113, - 83, 94, 107, 84, 102, 81, 114, 115, 138, 103, - 152, 119, 126, 126, 135, 158, 158, 135, 178, 180, - 730, 135, 126, 83, 111, 112, 84, 113, 119, 733, - 115, 161, 102, 114, 161, 161, 102, 166, 152, 119, - 102, 166, 180, 179, 181, 166, 178, 182, 102, 165, - 138, 183, 102, 187, 102, 102, 118, 118, 118, 734, - 253, 736, 196, 118, 118, 118, 118, 118, 118, 179, - 191, 198, 181, 182, 183, 192, 187, 200, 205, 244, - 428, 294, 165, 165, 165, 196, 118, 118, 118, 118, + 93, 107, 83, 94, 103, 84, 316, 108, 115, 111, + 316, 112, 113, 102, 114, 730, 135, 102, 207, 135, + 130, 102, 130, 135, 207, 83, 732, 107, 84, 102, + 119, 115, 103, 102, 108, 102, 102, 111, 112, 130, + 113, 114, 118, 118, 118, 126, 126, 119, 163, 118, + 118, 118, 118, 118, 118, 126, 151, 176, 119, 156, + 156, 159, 164, 177, 159, 159, 164, 178, 181, 179, + 164, 190, 118, 118, 118, 118, 118, 118, 180, 185, + 189, 163, 163, 163, 151, 176, 194, 196, 198, 177, + 178, 181, 163, 290, 163, 385, 163, 179, 190, 163, - 118, 118, 428, 165, 198, 165, 249, 165, 191, 286, - 165, 205, 192, 209, 200, 203, 203, 203, 253, 209, - 294, 289, 203, 203, 203, 203, 203, 203, 297, 249, - 296, 296, 286, 301, 320, 313, 308, 737, 320, 296, - 244, 347, 347, 244, 289, 203, 203, 203, 203, 203, - 203, 297, 313, 334, 354, 368, 397, 409, 334, 368, - 512, 301, 306, 306, 306, 308, 738, 604, 739, 306, - 306, 306, 306, 306, 306, 391, 407, 566, 407, 513, - 391, 432, 354, 484, 397, 409, 432, 512, 484, 594, - 604, 740, 306, 306, 306, 306, 306, 306, 603, 594, + 385, 241, 185, 309, 180, 297, 203, 246, 189, 194, + 196, 282, 285, 293, 304, 198, 201, 201, 201, 359, + 309, 733, 290, 201, 201, 201, 201, 201, 201, 203, + 246, 292, 292, 297, 282, 285, 293, 342, 342, 595, + 292, 349, 734, 304, 391, 735, 201, 201, 201, 201, + 201, 201, 241, 403, 330, 241, 302, 302, 302, 330, + 557, 736, 595, 302, 302, 302, 302, 302, 302, 349, + 362, 401, 391, 401, 362, 359, 504, 426, 476, 505, + 422, 403, 426, 476, 737, 585, 302, 302, 302, 302, + 302, 302, 422, 738, 506, 585, 566, 557, 401, 506, - 689, 514, 741, 407, 334, 407, 514, 513, 575, 334, - 408, 408, 408, 575, 566, 605, 675, 408, 408, 408, - 408, 408, 408, 675, 676, 605, 603, 679, 689, 743, - 735, 676, 744, 679, 735, 745, 746, 747, 748, 749, - 408, 408, 408, 408, 408, 408, 750, 751, 752, 753, - 575, 754, 755, 756, 757, 758, 759, 760, 761, 762, - 763, 764, 765, 767, 768, 769, 770, 772, 773, 760, - 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, - 784, 785, 787, 788, 789, 790, 791, 792, 793, 794, - 795, 773, 796, 797, 772, 798, 800, 801, 802, 803, + 401, 566, 594, 504, 596, 330, 679, 505, 666, 739, + 330, 402, 402, 402, 596, 666, 740, 741, 402, 402, + 402, 402, 402, 402, 724, 669, 742, 743, 724, 744, + 594, 669, 745, 746, 679, 747, 748, 749, 566, 750, + 751, 402, 402, 402, 402, 402, 402, 752, 753, 749, + 754, 756, 757, 758, 759, 761, 762, 763, 764, 765, + 766, 767, 768, 769, 770, 771, 772, 773, 774, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 762, + 786, 787, 761, 789, 790, 791, 792, 793, 795, 796, + 797, 792, 798, 799, 800, 801, 802, 803, 804, 805, - 804, 806, 807, 808, 803, 809, 810, 811, 812, 813, - 814, 815, 816, 817, 818, 819, 822, 823, 824, 826, - 827, 828, 830, 831, 832, 818, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 843, 844, 845, 846, 847, - 848, 849, 850, 852, 851, 853, 854, 855, 856, 857, - 858, 859, 860, 861, 863, 803, 864, 865, 866, 867, - 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, - 850, 851, 878, 880, 881, 882, 883, 884, 885, 881, - 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, - 896, 897, 898, 899, 900, 901, 902, 904, 905, 906, + 806, 807, 810, 811, 812, 814, 815, 816, 818, 819, + 820, 806, 821, 822, 823, 824, 825, 826, 827, 828, + 829, 831, 832, 833, 834, 835, 836, 837, 838, 840, + 839, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 851, 852, 792, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 838, 839, 866, 868, + 869, 870, 871, 872, 873, 869, 874, 875, 876, 877, + 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, + 888, 889, 891, 892, 893, 894, 895, 896, 897, 899, + 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, - 907, 908, 909, 910, 912, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 882, 927, 928, - 929, 930, 933, 934, 935, 936, 937, 938, 939, 940, - 941, 942, 943, 944, 945, 946, 923, 947, 948, 951, - 953, 955, 924, 956, 957, 958, 959, 960, 961, 963, - 964, 966, 967, 968, 969, 972, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 912, 913, 914, 870, 915, 916, 917, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, + 933, 910, 934, 935, 938, 940, 942, 911, 943, 944, + 945, 946, 947, 949, 950, 952, 953, 954, 955, 958, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 982, 983, 984, 985, 986, 987, 988, 989, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1008, 978, 1009, 1010, 1013, + 1014, 1015, 1016, 1017, 1018, 1009, 1019, 1020, 1021, 968, - 1020, 1021, 992, 1023, 1024, 1025, 1028, 1029, 1030, 1031, - 1032, 1033, 1024, 1034, 1035, 982, 1036, 1037, 1039, 996, - 1040, 1041, 1044, 1047, 1048, 1049, 1050, 1051, 1053, 1055, - 1056, 1057, 1058, 1059, 1060, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1075, 1077, 1078, - 1051, 1080, 1081, 1082, 1084, 1085, 1086, 1087, 1088, 1091, - 1093, 1094, 1095, 1097, 1098, 1100, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 1110, 1112, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 1120, 1121, 1122, 1124, 1125, 1126, 1127, 1128, - 1129, 1130, 1131, 1102, 1132, 1133, 1134, 1135, 1136, 1137, + 1022, 1024, 1025, 982, 1026, 1029, 1032, 1033, 1034, 1035, + 1036, 1038, 1040, 1041, 1042, 1043, 1044, 1045, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1060, 1062, 1064, 1036, 1065, 1066, 1068, 1069, 1070, 1071, + 1072, 1075, 1077, 1078, 1079, 1081, 1082, 1084, 1086, 1087, + 1088, 1089, 1090, 1091, 1092, 1094, 1096, 1097, 1098, 1099, + 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1086, 1115, 1116, 1117, 1118, + 1119, 1120, 1121, 1122, 1123, 1124, 1126, 1129, 1131, 1133, + 1134, 1135, 1136, 1137, 1133, 1138, 1139, 1141, 1144, 1145, - 1138, 1139, 1140, 1141, 1143, 1146, 1148, 1150, 1151, 1152, - 1153, 1154, 1150, 1155, 1156, 1158, 1161, 1162, 1164, 1165, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1175, 1176, - 1140, 1178, 1179, 1181, 1182, 1183, 1184, 1185, 1187, 1188, - 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1200, 1202, 1203, 1204, 1205, 1206, 1207, 1209, 1210, 1211, - 1212, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1222, 1223, - 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1232, 1233, 1234, - 1235, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, - 1246, 1247, 1248, 1250, 1253, 1254, 1255, 1256, 1258, 1261, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1158, 1159, 1123, 1161, 1162, 1164, 1165, 1166, 1167, 1168, + 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, + 1180, 1181, 1183, 1185, 1186, 1187, 1188, 1189, 1190, 1192, + 1193, 1194, 1195, 1197, 1198, 1199, 1200, 1201, 1202, 1203, + 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1215, + 1216, 1217, 1218, 1220, 1221, 1222, 1223, 1224, 1225, 1226, + 1227, 1228, 1229, 1230, 1231, 1233, 1236, 1237, 1238, 1239, + 1241, 1244, 1245, 1247, 1248, 1249, 1250, 1252, 1253, 1254, + 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, - 1262, 1264, 1265, 1266, 1267, 1269, 1270, 1271, 1272, 1273, - 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, - 1284, 1285, 1286, 1287, 1288, 1289, 1291, 1293, 1294, 1295, - 1296, 1297, 1301, 1302, 1303, 1305, 1306, 1307, 1308, 1309, - 1310, 1311, 1313, 1314, 1317, 1317, 1317, 1317, 1317, 1318, - 1318, 1318, 1318, 1318, 1319, 1325, 1319, 1319, 1319, 1320, - 1326, 1320, 1327, 1320, 1321, 1321, 1321, 1321, 1321, 1322, - 1322, 1322, 1322, 1322, 1323, 1328, 1323, 1323, 1323, 1324, - 1324, 1324, 723, 722, 721, 720, 719, 718, 717, 716, - 715, 714, 713, 712, 711, 709, 708, 707, 706, 705, + 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1274, 1276, + 1277, 1278, 1279, 1280, 1284, 1285, 1286, 1288, 1289, 1290, + 1291, 1292, 1293, 1294, 1296, 1297, 1300, 1300, 1300, 1300, + 1300, 1301, 1301, 1301, 1301, 1301, 1302, 1308, 1302, 1302, + 1302, 1303, 1309, 1303, 1310, 1303, 1304, 1304, 1304, 1304, + 1304, 1305, 1305, 1305, 1305, 1305, 1306, 1311, 1306, 1306, + 1306, 1307, 1307, 1307, 726, 725, 723, 722, 719, 718, + 717, 714, 713, 712, 711, 710, 709, 708, 707, 706, + 705, 704, 703, 702, 701, 699, 698, 697, 696, 695, + 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, - 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, - 694, 693, 692, 691, 690, 688, 686, 685, 684, 683, - 682, 681, 678, 677, 674, 673, 672, 671, 670, 669, - 668, 667, 666, 665, 664, 663, 662, 660, 659, 658, - 657, 656, 655, 654, 653, 651, 650, 649, 648, 647, - 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, + 684, 683, 682, 681, 680, 678, 676, 675, 674, 673, + 672, 671, 668, 667, 664, 663, 662, 661, 660, 659, + 658, 657, 656, 655, 654, 653, 652, 650, 649, 648, + 647, 646, 645, 644, 643, 641, 640, 639, 638, 637, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, - 602, 601, 600, 597, 596, 595, 592, 591, 590, 589, + 605, 604, 603, 602, 601, 600, 599, 598, 597, 593, + 592, 591, 588, 587, 586, 583, 582, 581, 580, 579, + 578, 577, 576, 575, 573, 572, 571, 570, 569, 568, - 588, 587, 586, 585, 584, 582, 581, 580, 579, 578, - 577, 576, 574, 573, 571, 570, 569, 568, 567, 565, - 564, 562, 561, 559, 558, 557, 556, 555, 554, 553, - 552, 551, 550, 549, 548, 547, 546, 545, 544, 542, - 541, 540, 539, 538, 537, 536, 534, 533, 532, 531, - 530, 529, 528, 527, 526, 525, 524, 523, 522, 521, - 520, 519, 518, 517, 516, 510, 508, 505, 504, 502, - 501, 500, 498, 494, 493, 492, 491, 490, 489, 488, - 487, 486, 485, 483, 482, 481, 480, 479, 478, 477, - 476, 475, 474, 472, 470, 469, 468, 467, 466, 465, + 567, 565, 564, 562, 561, 560, 559, 558, 556, 555, + 553, 552, 550, 549, 548, 547, 546, 545, 544, 543, + 542, 541, 540, 539, 538, 537, 536, 534, 533, 532, + 531, 530, 529, 528, 526, 525, 524, 523, 522, 521, + 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, + 510, 509, 508, 502, 500, 497, 496, 494, 493, 492, + 490, 486, 485, 484, 483, 482, 481, 480, 479, 478, + 477, 475, 474, 473, 472, 471, 470, 469, 468, 467, + 466, 464, 462, 461, 460, 459, 458, 457, 456, 455, + 454, 453, 452, 450, 449, 448, 447, 446, 445, 444, - 464, 463, 461, 460, 459, 457, 456, 455, 454, 453, - 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, - 442, 441, 440, 439, 438, 437, 435, 434, 433, 431, - 430, 429, 427, 426, 425, 423, 422, 421, 420, 419, - 418, 416, 415, 414, 413, 411, 410, 405, 404, 402, - 401, 400, 399, 398, 395, 392, 390, 389, 388, 387, - 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, - 376, 375, 374, 373, 372, 371, 370, 369, 367, 366, - 364, 363, 362, 361, 360, 359, 358, 357, 356, 352, - 351, 350, 349, 348, 346, 345, 344, 343, 342, 341, + 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, + 433, 432, 431, 429, 428, 427, 425, 424, 423, 421, + 420, 419, 417, 416, 415, 414, 413, 412, 410, 409, + 408, 407, 405, 404, 399, 398, 396, 395, 394, 393, + 392, 389, 386, 384, 383, 382, 381, 380, 379, 378, + 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, + 367, 366, 365, 364, 363, 361, 360, 358, 357, 356, + 355, 354, 353, 352, 351, 347, 346, 345, 344, 343, + 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, + 331, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 340, 339, 338, 337, 336, 335, 333, 332, 331, 330, - 329, 328, 327, 326, 325, 324, 323, 322, 321, 319, - 318, 317, 316, 315, 312, 311, 310, 309, 305, 303, - 300, 298, 295, 292, 285, 284, 283, 282, 281, 280, - 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, - 269, 267, 266, 265, 264, 263, 262, 261, 260, 259, - 258, 257, 256, 255, 254, 252, 251, 250, 248, 247, - 246, 245, 243, 242, 241, 240, 239, 238, 237, 236, - 235, 234, 232, 231, 230, 229, 228, 227, 226, 225, - 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, + 320, 319, 318, 317, 315, 314, 313, 312, 311, 308, + 307, 306, 305, 301, 299, 296, 294, 291, 288, 281, + 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, + 270, 269, 268, 267, 266, 265, 263, 262, 261, 260, + 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, + 248, 247, 245, 244, 243, 242, 240, 239, 238, 237, + 236, 235, 234, 233, 232, 230, 229, 228, 227, 226, + 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, + 215, 214, 213, 212, 211, 210, 209, 208, 206, 205, + 204, 202, 199, 197, 195, 193, 192, 187, 186, 182, - 214, 213, 212, 211, 210, 208, 207, 206, 204, 201, - 199, 197, 195, 194, 189, 188, 184, 176, 175, 174, - 173, 172, 171, 170, 169, 168, 167, 164, 163, 162, - 160, 159, 157, 156, 155, 154, 153, 151, 150, 149, - 148, 146, 145, 144, 143, 142, 141, 140, 139, 137, - 136, 134, 131, 129, 128, 127, 125, 124, 123, 121, - 120, 116, 110, 106, 105, 104, 98, 97, 78, 73, - 64, 50, 49, 48, 43, 41, 39, 38, 24, 14, - 11, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, + 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, + 162, 161, 160, 158, 157, 155, 154, 153, 152, 150, + 149, 148, 147, 145, 144, 143, 142, 141, 140, 139, + 137, 136, 134, 131, 129, 128, 127, 125, 124, 123, + 121, 120, 116, 110, 106, 105, 104, 98, 97, 78, + 73, 67, 64, 50, 49, 48, 43, 41, 39, 38, + 24, 14, 11, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, - 1316, 1316, 1316 + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 1299, 1299, 1299, 1299, 1299 } ; static yy_state_type yy_last_accepting_state; @@ -1593,26 +1585,26 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[166] = +static const flex_int16_t yy_rule_linenum[164] = { 0, 145, 147, 149, 154, 155, 160, 161, 162, 174, 177, 182, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 325, 335, 345, 355, - 365, 375, 385, 395, 405, 415, 424, 433, 442, 451, - 460, 469, 478, 490, 499, 508, 517, 526, 536, 546, - 556, 566, 577, 587, 597, 607, 617, 628, 639, 650, - 661, 670, 680, 689, 698, 713, 728, 737, 746, 755, - 764, 773, 782, 791, 800, 809, 818, 829, 839, 848, - 857, 867, 877, 886, 896, 906, 915, 924, 933, 942, - 952, 961, 970, 979, 988, 997, 1006, 1015, 1024, 1033, + 365, 374, 384, 394, 404, 414, 423, 432, 441, 450, + 459, 468, 477, 489, 498, 507, 516, 525, 535, 545, + 555, 565, 576, 586, 596, 606, 616, 627, 638, 649, + 660, 669, 679, 688, 697, 712, 727, 736, 745, 754, + 763, 772, 781, 790, 799, 808, 817, 828, 837, 847, + 857, 866, 876, 886, 895, 904, 913, 922, 932, 941, + 950, 959, 968, 977, 986, 995, 1004, 1013, 1023, 1032, - 1043, 1052, 1061, 1071, 1083, 1096, 1105, 1114, 1123, 1132, - 1141, 1152, 1162, 1171, 1181, 1191, 1200, 1209, 1218, 1227, - 1237, 1246, 1256, 1265, 1274, 1283, 1292, 1301, 1310, 1319, - 1328, 1337, 1346, 1355, 1364, 1373, 1382, 1391, 1400, 1409, - 1418, 1427, 1436, 1445, 1454, 1463, 1472, 1482, 1580, 1585, - 1590, 1595, 1596, 1597, 1598, 1599, 1600, 1602, 1620, 1633, - 1638, 1642, 1644, 1646, 1648 + 1041, 1051, 1063, 1076, 1085, 1094, 1103, 1112, 1121, 1132, + 1142, 1151, 1161, 1171, 1180, 1189, 1198, 1207, 1217, 1226, + 1236, 1245, 1254, 1263, 1272, 1281, 1290, 1299, 1308, 1317, + 1326, 1335, 1344, 1353, 1362, 1371, 1380, 1389, 1398, 1407, + 1416, 1425, 1434, 1443, 1452, 1462, 1560, 1565, 1570, 1575, + 1576, 1577, 1578, 1579, 1580, 1582, 1600, 1613, 1618, 1622, + 1624, 1626, 1628 } ; /* The intent behind this definition is that it'll catch @@ -1624,7 +1616,7 @@ static const flex_int16_t yy_rule_linenum[166] = #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "dhcp6_lexer.ll" -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1665,7 +1657,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg) -#line 1668 "dhcp6_lexer.cc" +#line 1660 "dhcp6_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1691,8 +1683,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1694 "dhcp6_lexer.cc" -#line 1695 "dhcp6_lexer.cc" +#line 1686 "dhcp6_lexer.cc" +#line 1687 "dhcp6_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2020,7 +2012,7 @@ YY_DECL } -#line 2023 "dhcp6_lexer.cc" +#line 2015 "dhcp6_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2049,13 +2041,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1317 ) + if ( yy_current_state >= 1300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1316 ); + while ( yy_current_state != 1299 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2074,13 +2066,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 166 ) + else if ( yy_act < 164 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 166 ) + else if ( yy_act == 164 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 167 ) + else if ( yy_act == 165 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2422,7 +2414,6 @@ YY_RULE_SETUP #line 365 "dhcp6_lexer.ll" { switch(driver.ctx_) { - case isc::dhcp::Parser6Context::KNOWN_CLIENTS: case isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME: return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_); default: @@ -2432,7 +2423,7 @@ YY_RULE_SETUP YY_BREAK case 32: YY_RULE_SETUP -#line 375 "dhcp6_lexer.ll" +#line 374 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2445,7 +2436,7 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 385 "dhcp6_lexer.ll" +#line 384 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2458,7 +2449,7 @@ YY_RULE_SETUP YY_BREAK case 34: YY_RULE_SETUP -#line 395 "dhcp6_lexer.ll" +#line 394 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2471,7 +2462,7 @@ YY_RULE_SETUP YY_BREAK case 35: YY_RULE_SETUP -#line 405 "dhcp6_lexer.ll" +#line 404 "dhcp6_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) { @@ -2484,7 +2475,7 @@ YY_RULE_SETUP YY_BREAK case 36: YY_RULE_SETUP -#line 415 "dhcp6_lexer.ll" +#line 414 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -2496,7 +2487,7 @@ YY_RULE_SETUP YY_BREAK case 37: YY_RULE_SETUP -#line 424 "dhcp6_lexer.ll" +#line 423 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2508,7 +2499,7 @@ YY_RULE_SETUP YY_BREAK case 38: YY_RULE_SETUP -#line 433 "dhcp6_lexer.ll" +#line 432 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2520,7 +2511,7 @@ YY_RULE_SETUP YY_BREAK case 39: YY_RULE_SETUP -#line 442 "dhcp6_lexer.ll" +#line 441 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::INTERFACES_CONFIG: @@ -2532,7 +2523,7 @@ YY_RULE_SETUP YY_BREAK case 40: YY_RULE_SETUP -#line 451 "dhcp6_lexer.ll" +#line 450 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2544,7 +2535,7 @@ YY_RULE_SETUP YY_BREAK case 41: YY_RULE_SETUP -#line 460 "dhcp6_lexer.ll" +#line 459 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2556,7 +2547,7 @@ YY_RULE_SETUP YY_BREAK case 42: YY_RULE_SETUP -#line 469 "dhcp6_lexer.ll" +#line 468 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOSTS_DATABASE: @@ -2568,7 +2559,7 @@ YY_RULE_SETUP YY_BREAK case 43: YY_RULE_SETUP -#line 478 "dhcp6_lexer.ll" +#line 477 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2583,7 +2574,7 @@ YY_RULE_SETUP YY_BREAK case 44: YY_RULE_SETUP -#line 490 "dhcp6_lexer.ll" +#line 489 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2595,7 +2586,7 @@ YY_RULE_SETUP YY_BREAK case 45: YY_RULE_SETUP -#line 499 "dhcp6_lexer.ll" +#line 498 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2607,7 +2598,7 @@ YY_RULE_SETUP YY_BREAK case 46: YY_RULE_SETUP -#line 508 "dhcp6_lexer.ll" +#line 507 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2619,7 +2610,7 @@ YY_RULE_SETUP YY_BREAK case 47: YY_RULE_SETUP -#line 517 "dhcp6_lexer.ll" +#line 516 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2631,7 +2622,7 @@ YY_RULE_SETUP YY_BREAK case 48: YY_RULE_SETUP -#line 526 "dhcp6_lexer.ll" +#line 525 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2644,7 +2635,7 @@ YY_RULE_SETUP YY_BREAK case 49: YY_RULE_SETUP -#line 536 "dhcp6_lexer.ll" +#line 535 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2657,7 +2648,7 @@ YY_RULE_SETUP YY_BREAK case 50: YY_RULE_SETUP -#line 546 "dhcp6_lexer.ll" +#line 545 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2670,7 +2661,7 @@ YY_RULE_SETUP YY_BREAK case 51: YY_RULE_SETUP -#line 556 "dhcp6_lexer.ll" +#line 555 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2683,7 +2674,7 @@ YY_RULE_SETUP YY_BREAK case 52: YY_RULE_SETUP -#line 566 "dhcp6_lexer.ll" +#line 565 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2697,7 +2688,7 @@ YY_RULE_SETUP YY_BREAK case 53: YY_RULE_SETUP -#line 577 "dhcp6_lexer.ll" +#line 576 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2710,7 +2701,7 @@ YY_RULE_SETUP YY_BREAK case 54: YY_RULE_SETUP -#line 587 "dhcp6_lexer.ll" +#line 586 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2723,7 +2714,7 @@ YY_RULE_SETUP YY_BREAK case 55: YY_RULE_SETUP -#line 597 "dhcp6_lexer.ll" +#line 596 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2736,7 +2727,7 @@ YY_RULE_SETUP YY_BREAK case 56: YY_RULE_SETUP -#line 607 "dhcp6_lexer.ll" +#line 606 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2749,7 +2740,7 @@ YY_RULE_SETUP YY_BREAK case 57: YY_RULE_SETUP -#line 617 "dhcp6_lexer.ll" +#line 616 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2763,7 +2754,7 @@ YY_RULE_SETUP YY_BREAK case 58: YY_RULE_SETUP -#line 628 "dhcp6_lexer.ll" +#line 627 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2777,7 +2768,7 @@ YY_RULE_SETUP YY_BREAK case 59: YY_RULE_SETUP -#line 639 "dhcp6_lexer.ll" +#line 638 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2791,7 +2782,7 @@ YY_RULE_SETUP YY_BREAK case 60: YY_RULE_SETUP -#line 650 "dhcp6_lexer.ll" +#line 649 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2805,7 +2796,7 @@ YY_RULE_SETUP YY_BREAK case 61: YY_RULE_SETUP -#line 661 "dhcp6_lexer.ll" +#line 660 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2817,7 +2808,7 @@ YY_RULE_SETUP YY_BREAK case 62: YY_RULE_SETUP -#line 670 "dhcp6_lexer.ll" +#line 669 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2830,7 +2821,7 @@ YY_RULE_SETUP YY_BREAK case 63: YY_RULE_SETUP -#line 680 "dhcp6_lexer.ll" +#line 679 "dhcp6_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2842,7 +2833,7 @@ YY_RULE_SETUP YY_BREAK case 64: YY_RULE_SETUP -#line 689 "dhcp6_lexer.ll" +#line 688 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2854,7 +2845,7 @@ YY_RULE_SETUP YY_BREAK case 65: YY_RULE_SETUP -#line 698 "dhcp6_lexer.ll" +#line 697 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2872,7 +2863,7 @@ YY_RULE_SETUP YY_BREAK case 66: YY_RULE_SETUP -#line 713 "dhcp6_lexer.ll" +#line 712 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2890,7 +2881,7 @@ YY_RULE_SETUP YY_BREAK case 67: YY_RULE_SETUP -#line 728 "dhcp6_lexer.ll" +#line 727 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2902,7 +2893,7 @@ YY_RULE_SETUP YY_BREAK case 68: YY_RULE_SETUP -#line 737 "dhcp6_lexer.ll" +#line 736 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2914,7 +2905,7 @@ YY_RULE_SETUP YY_BREAK case 69: YY_RULE_SETUP -#line 746 "dhcp6_lexer.ll" +#line 745 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2926,7 +2917,7 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 755 "dhcp6_lexer.ll" +#line 754 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2938,7 +2929,7 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 764 "dhcp6_lexer.ll" +#line 763 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2950,7 +2941,7 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 773 "dhcp6_lexer.ll" +#line 772 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2962,7 +2953,7 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 782 "dhcp6_lexer.ll" +#line 781 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2974,7 +2965,7 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 791 "dhcp6_lexer.ll" +#line 790 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2986,7 +2977,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 800 "dhcp6_lexer.ll" +#line 799 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2998,7 +2989,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 809 "dhcp6_lexer.ll" +#line 808 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3010,7 +3001,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 818 "dhcp6_lexer.ll" +#line 817 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -3024,32 +3015,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 829 "dhcp6_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser6Context::POOLS: - case isc::dhcp::Parser6Context::PD_POOLS: - return isc::dhcp::Dhcp6Parser::make_KNOWN_CLIENTS(driver.loc_); - default: - return isc::dhcp::Dhcp6Parser::make_STRING("known-clients", driver.loc_); - } -} - YY_BREAK -case 79: -YY_RULE_SETUP -#line 839 "dhcp6_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser6Context::KNOWN_CLIENTS: - return isc::dhcp::Dhcp6Parser::make_ONLY(driver.loc_); - default: - return isc::dhcp::Dhcp6Parser::make_STRING("only", driver.loc_); - } -} - YY_BREAK -case 80: -YY_RULE_SETUP -#line 848 "dhcp6_lexer.ll" +#line 828 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3059,9 +3025,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 79: YY_RULE_SETUP -#line 857 "dhcp6_lexer.ll" +#line 837 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3072,9 +3038,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 80: YY_RULE_SETUP -#line 867 "dhcp6_lexer.ll" +#line 847 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3085,9 +3051,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 81: YY_RULE_SETUP -#line 877 "dhcp6_lexer.ll" +#line 857 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3097,9 +3063,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 82: YY_RULE_SETUP -#line 886 "dhcp6_lexer.ll" +#line 866 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3110,9 +3076,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 83: YY_RULE_SETUP -#line 896 "dhcp6_lexer.ll" +#line 876 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3123,9 +3089,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 84: YY_RULE_SETUP -#line 906 "dhcp6_lexer.ll" +#line 886 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3135,9 +3101,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 85: YY_RULE_SETUP -#line 915 "dhcp6_lexer.ll" +#line 895 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3147,9 +3113,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 86: YY_RULE_SETUP -#line 924 "dhcp6_lexer.ll" +#line 904 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3159,9 +3125,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 87: YY_RULE_SETUP -#line 933 "dhcp6_lexer.ll" +#line 913 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: @@ -3171,9 +3137,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 88: YY_RULE_SETUP -#line 942 "dhcp6_lexer.ll" +#line 922 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3184,9 +3150,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 89: YY_RULE_SETUP -#line 952 "dhcp6_lexer.ll" +#line 932 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3196,9 +3162,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 90: YY_RULE_SETUP -#line 961 "dhcp6_lexer.ll" +#line 941 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3208,9 +3174,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 91: YY_RULE_SETUP -#line 970 "dhcp6_lexer.ll" +#line 950 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3220,9 +3186,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 92: YY_RULE_SETUP -#line 979 "dhcp6_lexer.ll" +#line 959 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3232,9 +3198,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 93: YY_RULE_SETUP -#line 988 "dhcp6_lexer.ll" +#line 968 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3244,9 +3210,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 94: YY_RULE_SETUP -#line 997 "dhcp6_lexer.ll" +#line 977 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3256,9 +3222,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 95: YY_RULE_SETUP -#line 1006 "dhcp6_lexer.ll" +#line 986 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3268,9 +3234,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 96: YY_RULE_SETUP -#line 1015 "dhcp6_lexer.ll" +#line 995 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3280,9 +3246,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 97: YY_RULE_SETUP -#line 1024 "dhcp6_lexer.ll" +#line 1004 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3292,9 +3258,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 98: YY_RULE_SETUP -#line 1033 "dhcp6_lexer.ll" +#line 1013 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3304,9 +3270,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 99: YY_RULE_SETUP -#line 1043 "dhcp6_lexer.ll" +#line 1023 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3316,9 +3282,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 100: YY_RULE_SETUP -#line 1052 "dhcp6_lexer.ll" +#line 1032 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3328,9 +3294,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 101: YY_RULE_SETUP -#line 1061 "dhcp6_lexer.ll" +#line 1041 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3341,9 +3307,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 102: YY_RULE_SETUP -#line 1071 "dhcp6_lexer.ll" +#line 1051 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3356,9 +3322,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 103: YY_RULE_SETUP -#line 1083 "dhcp6_lexer.ll" +#line 1063 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3372,9 +3338,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 104: YY_RULE_SETUP -#line 1096 "dhcp6_lexer.ll" +#line 1076 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3384,9 +3350,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 105: YY_RULE_SETUP -#line 1105 "dhcp6_lexer.ll" +#line 1085 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3396,9 +3362,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 106: YY_RULE_SETUP -#line 1114 "dhcp6_lexer.ll" +#line 1094 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3408,9 +3374,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 107: YY_RULE_SETUP -#line 1123 "dhcp6_lexer.ll" +#line 1103 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3420,9 +3386,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 108: YY_RULE_SETUP -#line 1132 "dhcp6_lexer.ll" +#line 1112 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3432,9 +3398,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 109: YY_RULE_SETUP -#line 1141 "dhcp6_lexer.ll" +#line 1121 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3446,9 +3412,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 110: YY_RULE_SETUP -#line 1152 "dhcp6_lexer.ll" +#line 1132 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3459,9 +3425,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 111: YY_RULE_SETUP -#line 1162 "dhcp6_lexer.ll" +#line 1142 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3471,9 +3437,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 112: YY_RULE_SETUP -#line 1171 "dhcp6_lexer.ll" +#line 1151 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3484,9 +3450,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 113: YY_RULE_SETUP -#line 1181 "dhcp6_lexer.ll" +#line 1161 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3497,9 +3463,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 114: YY_RULE_SETUP -#line 1191 "dhcp6_lexer.ll" +#line 1171 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3509,9 +3475,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 115: YY_RULE_SETUP -#line 1200 "dhcp6_lexer.ll" +#line 1180 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3521,9 +3487,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 116: YY_RULE_SETUP -#line 1209 "dhcp6_lexer.ll" +#line 1189 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3533,9 +3499,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 117: YY_RULE_SETUP -#line 1218 "dhcp6_lexer.ll" +#line 1198 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3545,9 +3511,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 118: YY_RULE_SETUP -#line 1227 "dhcp6_lexer.ll" +#line 1207 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3558,9 +3524,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 119: YY_RULE_SETUP -#line 1237 "dhcp6_lexer.ll" +#line 1217 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3570,9 +3536,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 120: YY_RULE_SETUP -#line 1246 "dhcp6_lexer.ll" +#line 1226 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3582,9 +3548,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 121: YY_RULE_SETUP -#line 1256 "dhcp6_lexer.ll" +#line 1236 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3594,9 +3560,9 @@ YY_RULE_SETUP } } YY_BREAK -case 124: +case 122: YY_RULE_SETUP -#line 1265 "dhcp6_lexer.ll" +#line 1245 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3606,9 +3572,9 @@ YY_RULE_SETUP } } YY_BREAK -case 125: +case 123: YY_RULE_SETUP -#line 1274 "dhcp6_lexer.ll" +#line 1254 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3618,9 +3584,9 @@ YY_RULE_SETUP } } YY_BREAK -case 126: +case 124: YY_RULE_SETUP -#line 1283 "dhcp6_lexer.ll" +#line 1263 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3630,9 +3596,9 @@ YY_RULE_SETUP } } YY_BREAK -case 127: +case 125: YY_RULE_SETUP -#line 1292 "dhcp6_lexer.ll" +#line 1272 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3642,9 +3608,9 @@ YY_RULE_SETUP } } YY_BREAK -case 128: +case 126: YY_RULE_SETUP -#line 1301 "dhcp6_lexer.ll" +#line 1281 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3654,9 +3620,9 @@ YY_RULE_SETUP } } YY_BREAK -case 129: +case 127: YY_RULE_SETUP -#line 1310 "dhcp6_lexer.ll" +#line 1290 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3666,9 +3632,9 @@ YY_RULE_SETUP } } YY_BREAK -case 130: +case 128: YY_RULE_SETUP -#line 1319 "dhcp6_lexer.ll" +#line 1299 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3678,9 +3644,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 129: YY_RULE_SETUP -#line 1328 "dhcp6_lexer.ll" +#line 1308 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3690,9 +3656,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 130: YY_RULE_SETUP -#line 1337 "dhcp6_lexer.ll" +#line 1317 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3702,9 +3668,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 131: YY_RULE_SETUP -#line 1346 "dhcp6_lexer.ll" +#line 1326 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3714,9 +3680,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 132: YY_RULE_SETUP -#line 1355 "dhcp6_lexer.ll" +#line 1335 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3726,9 +3692,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 133: YY_RULE_SETUP -#line 1364 "dhcp6_lexer.ll" +#line 1344 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3738,9 +3704,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 134: YY_RULE_SETUP -#line 1373 "dhcp6_lexer.ll" +#line 1353 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3750,9 +3716,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 135: YY_RULE_SETUP -#line 1382 "dhcp6_lexer.ll" +#line 1362 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3762,9 +3728,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 136: YY_RULE_SETUP -#line 1391 "dhcp6_lexer.ll" +#line 1371 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3774,9 +3740,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 137: YY_RULE_SETUP -#line 1400 "dhcp6_lexer.ll" +#line 1380 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3786,9 +3752,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 138: YY_RULE_SETUP -#line 1409 "dhcp6_lexer.ll" +#line 1389 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3798,9 +3764,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 139: YY_RULE_SETUP -#line 1418 "dhcp6_lexer.ll" +#line 1398 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3810,9 +3776,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 140: YY_RULE_SETUP -#line 1427 "dhcp6_lexer.ll" +#line 1407 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3822,9 +3788,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 141: YY_RULE_SETUP -#line 1436 "dhcp6_lexer.ll" +#line 1416 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3834,9 +3800,9 @@ YY_RULE_SETUP } } YY_BREAK -case 144: +case 142: YY_RULE_SETUP -#line 1445 "dhcp6_lexer.ll" +#line 1425 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3846,9 +3812,9 @@ YY_RULE_SETUP } } YY_BREAK -case 145: +case 143: YY_RULE_SETUP -#line 1454 "dhcp6_lexer.ll" +#line 1434 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3858,9 +3824,9 @@ YY_RULE_SETUP } } YY_BREAK -case 146: +case 144: YY_RULE_SETUP -#line 1463 "dhcp6_lexer.ll" +#line 1443 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3870,9 +3836,9 @@ YY_RULE_SETUP } } YY_BREAK -case 147: +case 145: YY_RULE_SETUP -#line 1472 "dhcp6_lexer.ll" +#line 1452 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3882,9 +3848,9 @@ YY_RULE_SETUP } } YY_BREAK -case 148: +case 146: YY_RULE_SETUP -#line 1482 "dhcp6_lexer.ll" +#line 1462 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3983,65 +3949,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 149: -/* rule 149 can match eol */ +case 147: +/* rule 147 can match eol */ YY_RULE_SETUP -#line 1580 "dhcp6_lexer.ll" +#line 1560 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 150: -/* rule 150 can match eol */ +case 148: +/* rule 148 can match eol */ YY_RULE_SETUP -#line 1585 "dhcp6_lexer.ll" +#line 1565 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 151: +case 149: YY_RULE_SETUP -#line 1590 "dhcp6_lexer.ll" +#line 1570 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK +case 150: +YY_RULE_SETUP +#line 1575 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } + YY_BREAK +case 151: +YY_RULE_SETUP +#line 1576 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } + YY_BREAK case 152: YY_RULE_SETUP -#line 1595 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } +#line 1577 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1596 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } +#line 1578 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1597 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1579 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 155: YY_RULE_SETUP -#line 1598 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1580 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } YY_BREAK case 156: YY_RULE_SETUP -#line 1599 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } - YY_BREAK -case 157: -YY_RULE_SETUP -#line 1600 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } - YY_BREAK -case 158: -YY_RULE_SETUP -#line 1602 "dhcp6_lexer.ll" +#line 1582 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4060,9 +4026,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 159: +case 157: YY_RULE_SETUP -#line 1620 "dhcp6_lexer.ll" +#line 1600 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4076,43 +4042,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 160: +case 158: YY_RULE_SETUP -#line 1633 "dhcp6_lexer.ll" +#line 1613 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 161: +case 159: YY_RULE_SETUP -#line 1638 "dhcp6_lexer.ll" +#line 1618 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK +case 160: +YY_RULE_SETUP +#line 1622 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); + YY_BREAK +case 161: +YY_RULE_SETUP +#line 1624 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); + YY_BREAK case 162: YY_RULE_SETUP -#line 1642 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); +#line 1626 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 163: YY_RULE_SETUP -#line 1644 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); - YY_BREAK -case 164: -YY_RULE_SETUP -#line 1646 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); - YY_BREAK -case 165: -YY_RULE_SETUP -#line 1648 "dhcp6_lexer.ll" +#line 1628 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1650 "dhcp6_lexer.ll" +#line 1630 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4136,12 +4102,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 166: +case 164: YY_RULE_SETUP -#line 1673 "dhcp6_lexer.ll" +#line 1653 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4144 "dhcp6_lexer.cc" +#line 4110 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4460,7 +4426,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1317 ) + if ( yy_current_state >= 1300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4493,11 +4459,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1317 ) + if ( yy_current_state >= 1300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1316); + yy_is_jam = (yy_current_state == 1299); return yy_is_jam ? 0 : yy_current_state; } @@ -5246,7 +5212,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1673 "dhcp6_lexer.ll" +#line 1653 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index 1031693c98..e7b0bdd6b7 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -253,30 +253,29 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 158: // "boolean" + case 156: // "boolean" value.move< bool > (that.value); break; - case 157: // "floating point" + case 155: // "floating point" value.move< double > (that.value); break; - case 156: // "integer" + case 154: // "integer" value.move< int64_t > (that.value); break; - case 155: // "constant string" + case 153: // "constant string" value.move< std::string > (that.value); break; @@ -295,30 +294,29 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 158: // "boolean" + case 156: // "boolean" value.copy< bool > (that.value); break; - case 157: // "floating point" + case 155: // "floating point" value.copy< double > (that.value); break; - case 156: // "integer" + case 154: // "integer" value.copy< int64_t > (that.value); break; - case 155: // "constant string" + case 153: // "constant string" value.copy< std::string > (that.value); break; @@ -358,88 +356,81 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 155: // "constant string" + case 153: // "constant string" -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } -#line 366 "dhcp6_parser.cc" // lalr1.cc:636 +#line 364 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 156: // "integer" + case 154: // "integer" -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } -#line 373 "dhcp6_parser.cc" // lalr1.cc:636 +#line 371 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 157: // "floating point" + case 155: // "floating point" -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } -#line 380 "dhcp6_parser.cc" // lalr1.cc:636 +#line 378 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 158: // "boolean" + case 156: // "boolean" -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } -#line 387 "dhcp6_parser.cc" // lalr1.cc:636 +#line 385 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 174: // value + case 172: // value -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 394 "dhcp6_parser.cc" // lalr1.cc:636 +#line 392 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 178: // map_value + case 176: // map_value -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 401 "dhcp6_parser.cc" // lalr1.cc:636 +#line 399 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 222: // db_type + case 220: // db_type -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 408 "dhcp6_parser.cc" // lalr1.cc:636 +#line 406 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 300: // hr_mode + case 298: // hr_mode -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 415 "dhcp6_parser.cc" // lalr1.cc:636 +#line 413 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 371: // known_clients_value + case 431: // duid_type -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 422 "dhcp6_parser.cc" // lalr1.cc:636 +#line 420 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 436: // duid_type + case 464: // ncr_protocol_value -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 429 "dhcp6_parser.cc" // lalr1.cc:636 +#line 427 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 469: // ncr_protocol_value + case 472: // replace_client_name_value -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 +#line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 436 "dhcp6_parser.cc" // lalr1.cc:636 - break; - - case 477: // replace_client_name_value - -#line 232 "dhcp6_parser.yy" // lalr1.cc:636 - { yyoutput << yysym.value.template as< ElementPtr > (); } -#line 443 "dhcp6_parser.cc" // lalr1.cc:636 +#line 434 "dhcp6_parser.cc" // lalr1.cc:636 break; @@ -639,30 +630,29 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 158: // "boolean" + case 156: // "boolean" yylhs.value.build< bool > (); break; - case 157: // "floating point" + case 155: // "floating point" yylhs.value.build< double > (); break; - case 156: // "integer" + case 154: // "integer" yylhs.value.build< int64_t > (); break; - case 155: // "constant string" + case 153: // "constant string" yylhs.value.build< std::string > (); break; @@ -684,274 +674,274 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 241 "dhcp6_parser.yy" // lalr1.cc:859 +#line 238 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } -#line 690 "dhcp6_parser.cc" // lalr1.cc:859 +#line 680 "dhcp6_parser.cc" // lalr1.cc:859 break; case 4: -#line 242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 239 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } -#line 696 "dhcp6_parser.cc" // lalr1.cc:859 +#line 686 "dhcp6_parser.cc" // lalr1.cc:859 break; case 6: -#line 243 "dhcp6_parser.yy" // lalr1.cc:859 +#line 240 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } -#line 702 "dhcp6_parser.cc" // lalr1.cc:859 +#line 692 "dhcp6_parser.cc" // lalr1.cc:859 break; case 8: -#line 244 "dhcp6_parser.yy" // lalr1.cc:859 +#line 241 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } -#line 708 "dhcp6_parser.cc" // lalr1.cc:859 +#line 698 "dhcp6_parser.cc" // lalr1.cc:859 break; case 10: -#line 245 "dhcp6_parser.yy" // lalr1.cc:859 +#line 242 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET6; } -#line 714 "dhcp6_parser.cc" // lalr1.cc:859 +#line 704 "dhcp6_parser.cc" // lalr1.cc:859 break; case 12: -#line 246 "dhcp6_parser.yy" // lalr1.cc:859 +#line 243 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } -#line 720 "dhcp6_parser.cc" // lalr1.cc:859 +#line 710 "dhcp6_parser.cc" // lalr1.cc:859 break; case 14: -#line 247 "dhcp6_parser.yy" // lalr1.cc:859 +#line 244 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.PD_POOLS; } -#line 726 "dhcp6_parser.cc" // lalr1.cc:859 +#line 716 "dhcp6_parser.cc" // lalr1.cc:859 break; case 16: -#line 248 "dhcp6_parser.yy" // lalr1.cc:859 +#line 245 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } -#line 732 "dhcp6_parser.cc" // lalr1.cc:859 +#line 722 "dhcp6_parser.cc" // lalr1.cc:859 break; case 18: -#line 249 "dhcp6_parser.yy" // lalr1.cc:859 +#line 246 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } -#line 738 "dhcp6_parser.cc" // lalr1.cc:859 +#line 728 "dhcp6_parser.cc" // lalr1.cc:859 break; case 20: -#line 250 "dhcp6_parser.yy" // lalr1.cc:859 +#line 247 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } -#line 744 "dhcp6_parser.cc" // lalr1.cc:859 +#line 734 "dhcp6_parser.cc" // lalr1.cc:859 break; case 22: -#line 251 "dhcp6_parser.yy" // lalr1.cc:859 +#line 248 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } -#line 750 "dhcp6_parser.cc" // lalr1.cc:859 +#line 740 "dhcp6_parser.cc" // lalr1.cc:859 break; case 24: -#line 252 "dhcp6_parser.yy" // lalr1.cc:859 +#line 249 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } -#line 756 "dhcp6_parser.cc" // lalr1.cc:859 +#line 746 "dhcp6_parser.cc" // lalr1.cc:859 break; case 26: -#line 253 "dhcp6_parser.yy" // lalr1.cc:859 +#line 250 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } -#line 762 "dhcp6_parser.cc" // lalr1.cc:859 +#line 752 "dhcp6_parser.cc" // lalr1.cc:859 break; case 28: -#line 261 "dhcp6_parser.yy" // lalr1.cc:859 +#line 258 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } -#line 768 "dhcp6_parser.cc" // lalr1.cc:859 +#line 758 "dhcp6_parser.cc" // lalr1.cc:859 break; case 29: -#line 262 "dhcp6_parser.yy" // lalr1.cc:859 +#line 259 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } -#line 774 "dhcp6_parser.cc" // lalr1.cc:859 +#line 764 "dhcp6_parser.cc" // lalr1.cc:859 break; case 30: -#line 263 "dhcp6_parser.yy" // lalr1.cc:859 +#line 260 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } -#line 780 "dhcp6_parser.cc" // lalr1.cc:859 +#line 770 "dhcp6_parser.cc" // lalr1.cc:859 break; case 31: -#line 264 "dhcp6_parser.yy" // lalr1.cc:859 +#line 261 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } -#line 786 "dhcp6_parser.cc" // lalr1.cc:859 +#line 776 "dhcp6_parser.cc" // lalr1.cc:859 break; case 32: -#line 265 "dhcp6_parser.yy" // lalr1.cc:859 +#line 262 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } -#line 792 "dhcp6_parser.cc" // lalr1.cc:859 +#line 782 "dhcp6_parser.cc" // lalr1.cc:859 break; case 33: -#line 266 "dhcp6_parser.yy" // lalr1.cc:859 +#line 263 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 798 "dhcp6_parser.cc" // lalr1.cc:859 +#line 788 "dhcp6_parser.cc" // lalr1.cc:859 break; case 34: -#line 267 "dhcp6_parser.yy" // lalr1.cc:859 +#line 264 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 804 "dhcp6_parser.cc" // lalr1.cc:859 +#line 794 "dhcp6_parser.cc" // lalr1.cc:859 break; case 35: -#line 270 "dhcp6_parser.yy" // lalr1.cc:859 +#line 267 "dhcp6_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); } -#line 813 "dhcp6_parser.cc" // lalr1.cc:859 +#line 803 "dhcp6_parser.cc" // lalr1.cc:859 break; case 36: -#line 275 "dhcp6_parser.yy" // lalr1.cc:859 +#line 272 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 824 "dhcp6_parser.cc" // lalr1.cc:859 +#line 814 "dhcp6_parser.cc" // lalr1.cc:859 break; case 37: -#line 280 "dhcp6_parser.yy" // lalr1.cc:859 +#line 277 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place // for it. } -#line 834 "dhcp6_parser.cc" // lalr1.cc:859 +#line 824 "dhcp6_parser.cc" // lalr1.cc:859 break; case 38: -#line 286 "dhcp6_parser.yy" // lalr1.cc:859 +#line 283 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } -#line 840 "dhcp6_parser.cc" // lalr1.cc:859 +#line 830 "dhcp6_parser.cc" // lalr1.cc:859 break; case 41: -#line 293 "dhcp6_parser.yy" // lalr1.cc:859 +#line 290 "dhcp6_parser.yy" // lalr1.cc:859 { // map containing a single entry ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 849 "dhcp6_parser.cc" // lalr1.cc:859 +#line 839 "dhcp6_parser.cc" // lalr1.cc:859 break; case 42: -#line 297 "dhcp6_parser.yy" // lalr1.cc:859 +#line 294 "dhcp6_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ()); } -#line 859 "dhcp6_parser.cc" // lalr1.cc:859 +#line 849 "dhcp6_parser.cc" // lalr1.cc:859 break; case 43: -#line 304 "dhcp6_parser.yy" // lalr1.cc:859 +#line 301 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); } -#line 868 "dhcp6_parser.cc" // lalr1.cc:859 +#line 858 "dhcp6_parser.cc" // lalr1.cc:859 break; case 44: -#line 307 "dhcp6_parser.yy" // lalr1.cc:859 +#line 304 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } -#line 876 "dhcp6_parser.cc" // lalr1.cc:859 +#line 866 "dhcp6_parser.cc" // lalr1.cc:859 break; case 47: -#line 315 "dhcp6_parser.yy" // lalr1.cc:859 +#line 312 "dhcp6_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 885 "dhcp6_parser.cc" // lalr1.cc:859 +#line 875 "dhcp6_parser.cc" // lalr1.cc:859 break; case 48: -#line 319 "dhcp6_parser.yy" // lalr1.cc:859 +#line 316 "dhcp6_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); } -#line 894 "dhcp6_parser.cc" // lalr1.cc:859 +#line 884 "dhcp6_parser.cc" // lalr1.cc:859 break; case 49: -#line 326 "dhcp6_parser.yy" // lalr1.cc:859 +#line 323 "dhcp6_parser.yy" // lalr1.cc:859 { // List parsing about to start } -#line 902 "dhcp6_parser.cc" // lalr1.cc:859 +#line 892 "dhcp6_parser.cc" // lalr1.cc:859 break; case 50: -#line 328 "dhcp6_parser.yy" // lalr1.cc:859 +#line 325 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); } -#line 911 "dhcp6_parser.cc" // lalr1.cc:859 +#line 901 "dhcp6_parser.cc" // lalr1.cc:859 break; case 53: -#line 337 "dhcp6_parser.yy" // lalr1.cc:859 +#line 334 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 920 "dhcp6_parser.cc" // lalr1.cc:859 +#line 910 "dhcp6_parser.cc" // lalr1.cc:859 break; case 54: -#line 341 "dhcp6_parser.yy" // lalr1.cc:859 +#line 338 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); } -#line 929 "dhcp6_parser.cc" // lalr1.cc:859 +#line 919 "dhcp6_parser.cc" // lalr1.cc:859 break; case 55: -#line 352 "dhcp6_parser.yy" // lalr1.cc:859 +#line 349 "dhcp6_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); error(yystack_[1].location, "got unexpected keyword \"" + keyword + "\" in " + where + " map."); } -#line 940 "dhcp6_parser.cc" // lalr1.cc:859 +#line 930 "dhcp6_parser.cc" // lalr1.cc:859 break; case 56: -#line 362 "dhcp6_parser.yy" // lalr1.cc:859 +#line 359 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 951 "dhcp6_parser.cc" // lalr1.cc:859 +#line 941 "dhcp6_parser.cc" // lalr1.cc:859 break; case 57: -#line 367 "dhcp6_parser.yy" // lalr1.cc:859 +#line 364 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -960,11 +950,11 @@ namespace isc { namespace dhcp { // Dhcp6 is required ctx.require("Dhcp6", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 964 "dhcp6_parser.cc" // lalr1.cc:859 +#line 954 "dhcp6_parser.cc" // lalr1.cc:859 break; case 66: -#line 390 "dhcp6_parser.yy" // lalr1.cc:859 +#line 387 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -973,688 +963,688 @@ namespace isc { namespace dhcp { ctx.stack_.push_back(m); ctx.enter(ctx.DHCP6); } -#line 977 "dhcp6_parser.cc" // lalr1.cc:859 +#line 967 "dhcp6_parser.cc" // lalr1.cc:859 break; case 67: -#line 397 "dhcp6_parser.yy" // lalr1.cc:859 +#line 394 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 987 "dhcp6_parser.cc" // lalr1.cc:859 +#line 977 "dhcp6_parser.cc" // lalr1.cc:859 break; case 68: -#line 405 "dhcp6_parser.yy" // lalr1.cc:859 +#line 402 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Dhcp6 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 997 "dhcp6_parser.cc" // lalr1.cc:859 +#line 987 "dhcp6_parser.cc" // lalr1.cc:859 break; case 69: -#line 409 "dhcp6_parser.yy" // lalr1.cc:859 +#line 406 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed } -#line 1006 "dhcp6_parser.cc" // lalr1.cc:859 +#line 996 "dhcp6_parser.cc" // lalr1.cc:859 break; case 95: -#line 445 "dhcp6_parser.yy" // lalr1.cc:859 +#line 442 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("preferred-lifetime", prf); } -#line 1015 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1005 "dhcp6_parser.cc" // lalr1.cc:859 break; case 96: -#line 450 "dhcp6_parser.yy" // lalr1.cc:859 +#line 447 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); } -#line 1024 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1014 "dhcp6_parser.cc" // lalr1.cc:859 break; case 97: -#line 455 "dhcp6_parser.yy" // lalr1.cc:859 +#line 452 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); } -#line 1033 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1023 "dhcp6_parser.cc" // lalr1.cc:859 break; case 98: -#line 460 "dhcp6_parser.yy" // lalr1.cc:859 +#line 457 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); } -#line 1042 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1032 "dhcp6_parser.cc" // lalr1.cc:859 break; case 99: -#line 465 "dhcp6_parser.yy" // lalr1.cc:859 +#line 462 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); } -#line 1051 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1041 "dhcp6_parser.cc" // lalr1.cc:859 break; case 100: -#line 470 "dhcp6_parser.yy" // lalr1.cc:859 +#line 467 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); ctx.stack_.push_back(i); ctx.enter(ctx.INTERFACES_CONFIG); } -#line 1062 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1052 "dhcp6_parser.cc" // lalr1.cc:859 break; case 101: -#line 475 "dhcp6_parser.yy" // lalr1.cc:859 +#line 472 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1072 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1062 "dhcp6_parser.cc" // lalr1.cc:859 break; case 102: -#line 481 "dhcp6_parser.yy" // lalr1.cc:859 +#line 478 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1082 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1072 "dhcp6_parser.cc" // lalr1.cc:859 break; case 103: -#line 485 "dhcp6_parser.yy" // lalr1.cc:859 +#line 482 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed } -#line 1091 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1081 "dhcp6_parser.cc" // lalr1.cc:859 break; case 108: -#line 498 "dhcp6_parser.yy" // lalr1.cc:859 +#line 495 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1102 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1092 "dhcp6_parser.cc" // lalr1.cc:859 break; case 109: -#line 503 "dhcp6_parser.yy" // lalr1.cc:859 +#line 500 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1111 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1101 "dhcp6_parser.cc" // lalr1.cc:859 break; case 110: -#line 508 "dhcp6_parser.yy" // lalr1.cc:859 +#line 505 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); } -#line 1120 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1110 "dhcp6_parser.cc" // lalr1.cc:859 break; case 111: -#line 514 "dhcp6_parser.yy" // lalr1.cc:859 +#line 511 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.LEASE_DATABASE); } -#line 1131 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1121 "dhcp6_parser.cc" // lalr1.cc:859 break; case 112: -#line 519 "dhcp6_parser.yy" // lalr1.cc:859 +#line 516 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1142 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1132 "dhcp6_parser.cc" // lalr1.cc:859 break; case 113: -#line 526 "dhcp6_parser.yy" // lalr1.cc:859 +#line 523 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.HOSTS_DATABASE); } -#line 1153 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1143 "dhcp6_parser.cc" // lalr1.cc:859 break; case 114: -#line 531 "dhcp6_parser.yy" // lalr1.cc:859 +#line 528 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 1164 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1154 "dhcp6_parser.cc" // lalr1.cc:859 break; case 130: -#line 557 "dhcp6_parser.yy" // lalr1.cc:859 +#line 554 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1172 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1162 "dhcp6_parser.cc" // lalr1.cc:859 break; case 131: -#line 559 "dhcp6_parser.yy" // lalr1.cc:859 +#line 556 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1181 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1171 "dhcp6_parser.cc" // lalr1.cc:859 break; case 132: -#line 564 "dhcp6_parser.yy" // lalr1.cc:859 +#line 561 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1187 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1177 "dhcp6_parser.cc" // lalr1.cc:859 break; case 133: -#line 565 "dhcp6_parser.yy" // lalr1.cc:859 +#line 562 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1193 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1183 "dhcp6_parser.cc" // lalr1.cc:859 break; case 134: -#line 566 "dhcp6_parser.yy" // lalr1.cc:859 +#line 563 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1199 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1189 "dhcp6_parser.cc" // lalr1.cc:859 break; case 135: -#line 567 "dhcp6_parser.yy" // lalr1.cc:859 +#line 564 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1205 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1195 "dhcp6_parser.cc" // lalr1.cc:859 break; case 136: -#line 570 "dhcp6_parser.yy" // lalr1.cc:859 +#line 567 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1213 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1203 "dhcp6_parser.cc" // lalr1.cc:859 break; case 137: -#line 572 "dhcp6_parser.yy" // lalr1.cc:859 +#line 569 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); ctx.leave(); } -#line 1223 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1213 "dhcp6_parser.cc" // lalr1.cc:859 break; case 138: -#line 578 "dhcp6_parser.yy" // lalr1.cc:859 +#line 575 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1231 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1221 "dhcp6_parser.cc" // lalr1.cc:859 break; case 139: -#line 580 "dhcp6_parser.yy" // lalr1.cc:859 +#line 577 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); ctx.leave(); } -#line 1241 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1231 "dhcp6_parser.cc" // lalr1.cc:859 break; case 140: -#line 586 "dhcp6_parser.yy" // lalr1.cc:859 +#line 583 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1249 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1239 "dhcp6_parser.cc" // lalr1.cc:859 break; case 141: -#line 588 "dhcp6_parser.yy" // lalr1.cc:859 +#line 585 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); ctx.leave(); } -#line 1259 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1249 "dhcp6_parser.cc" // lalr1.cc:859 break; case 142: -#line 594 "dhcp6_parser.yy" // lalr1.cc:859 +#line 591 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1268 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1258 "dhcp6_parser.cc" // lalr1.cc:859 break; case 143: -#line 599 "dhcp6_parser.yy" // lalr1.cc:859 +#line 596 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1276 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1266 "dhcp6_parser.cc" // lalr1.cc:859 break; case 144: -#line 601 "dhcp6_parser.yy" // lalr1.cc:859 +#line 598 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1286 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1276 "dhcp6_parser.cc" // lalr1.cc:859 break; case 145: -#line 607 "dhcp6_parser.yy" // lalr1.cc:859 +#line 604 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); } -#line 1295 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1285 "dhcp6_parser.cc" // lalr1.cc:859 break; case 146: -#line 612 "dhcp6_parser.yy" // lalr1.cc:859 +#line 609 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); } -#line 1304 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1294 "dhcp6_parser.cc" // lalr1.cc:859 break; case 147: -#line 617 "dhcp6_parser.yy" // lalr1.cc:859 +#line 614 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); } -#line 1313 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1303 "dhcp6_parser.cc" // lalr1.cc:859 break; case 148: -#line 622 "dhcp6_parser.yy" // lalr1.cc:859 +#line 619 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); } -#line 1322 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1312 "dhcp6_parser.cc" // lalr1.cc:859 break; case 149: -#line 627 "dhcp6_parser.yy" // lalr1.cc:859 +#line 624 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1330 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1320 "dhcp6_parser.cc" // lalr1.cc:859 break; case 150: -#line 629 "dhcp6_parser.yy" // lalr1.cc:859 +#line 626 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1340 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1330 "dhcp6_parser.cc" // lalr1.cc:859 break; case 151: -#line 635 "dhcp6_parser.yy" // lalr1.cc:859 +#line 632 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1348 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1338 "dhcp6_parser.cc" // lalr1.cc:859 break; case 152: -#line 637 "dhcp6_parser.yy" // lalr1.cc:859 +#line 634 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1358 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1348 "dhcp6_parser.cc" // lalr1.cc:859 break; case 153: -#line 644 "dhcp6_parser.yy" // lalr1.cc:859 +#line 641 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("mac-sources", l); ctx.stack_.push_back(l); ctx.enter(ctx.MAC_SOURCES); } -#line 1369 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1359 "dhcp6_parser.cc" // lalr1.cc:859 break; case 154: -#line 649 "dhcp6_parser.yy" // lalr1.cc:859 +#line 646 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1378 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1368 "dhcp6_parser.cc" // lalr1.cc:859 break; case 159: -#line 662 "dhcp6_parser.yy" // lalr1.cc:859 +#line 659 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1387 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1377 "dhcp6_parser.cc" // lalr1.cc:859 break; case 160: -#line 667 "dhcp6_parser.yy" // lalr1.cc:859 +#line 664 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1396 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1386 "dhcp6_parser.cc" // lalr1.cc:859 break; case 161: -#line 672 "dhcp6_parser.yy" // lalr1.cc:859 +#line 669 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); } -#line 1407 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1397 "dhcp6_parser.cc" // lalr1.cc:859 break; case 162: -#line 677 "dhcp6_parser.yy" // lalr1.cc:859 +#line 674 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1416 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1406 "dhcp6_parser.cc" // lalr1.cc:859 break; case 168: -#line 691 "dhcp6_parser.yy" // lalr1.cc:859 +#line 688 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1425 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1415 "dhcp6_parser.cc" // lalr1.cc:859 break; case 169: -#line 696 "dhcp6_parser.yy" // lalr1.cc:859 +#line 693 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1434 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1424 "dhcp6_parser.cc" // lalr1.cc:859 break; case 170: -#line 703 "dhcp6_parser.yy" // lalr1.cc:859 +#line 700 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay-supplied-options", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1445 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1435 "dhcp6_parser.cc" // lalr1.cc:859 break; case 171: -#line 708 "dhcp6_parser.yy" // lalr1.cc:859 +#line 705 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1454 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1444 "dhcp6_parser.cc" // lalr1.cc:859 break; case 172: -#line 713 "dhcp6_parser.yy" // lalr1.cc:859 +#line 710 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 1465 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1455 "dhcp6_parser.cc" // lalr1.cc:859 break; case 173: -#line 718 "dhcp6_parser.yy" // lalr1.cc:859 +#line 715 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1474 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1464 "dhcp6_parser.cc" // lalr1.cc:859 break; case 178: -#line 731 "dhcp6_parser.yy" // lalr1.cc:859 +#line 728 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1484 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1474 "dhcp6_parser.cc" // lalr1.cc:859 break; case 179: -#line 735 "dhcp6_parser.yy" // lalr1.cc:859 +#line 732 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1494 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1484 "dhcp6_parser.cc" // lalr1.cc:859 break; case 180: -#line 741 "dhcp6_parser.yy" // lalr1.cc:859 +#line 738 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the hooks-libraries list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1504 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1494 "dhcp6_parser.cc" // lalr1.cc:859 break; case 181: -#line 745 "dhcp6_parser.yy" // lalr1.cc:859 +#line 742 "dhcp6_parser.yy" // lalr1.cc:859 { // The library hooks parameter is required ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1514 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1504 "dhcp6_parser.cc" // lalr1.cc:859 break; case 187: -#line 760 "dhcp6_parser.yy" // lalr1.cc:859 +#line 757 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1522 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1512 "dhcp6_parser.cc" // lalr1.cc:859 break; case 188: -#line 762 "dhcp6_parser.yy" // lalr1.cc:859 +#line 759 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1532 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1522 "dhcp6_parser.cc" // lalr1.cc:859 break; case 189: -#line 768 "dhcp6_parser.yy" // lalr1.cc:859 +#line 765 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1540 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1530 "dhcp6_parser.cc" // lalr1.cc:859 break; case 190: -#line 770 "dhcp6_parser.yy" // lalr1.cc:859 +#line 767 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1549 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1539 "dhcp6_parser.cc" // lalr1.cc:859 break; case 191: -#line 776 "dhcp6_parser.yy" // lalr1.cc:859 +#line 773 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.EXPIRED_LEASES_PROCESSING); } -#line 1560 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1550 "dhcp6_parser.cc" // lalr1.cc:859 break; case 192: -#line 781 "dhcp6_parser.yy" // lalr1.cc:859 +#line 778 "dhcp6_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1570 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1560 "dhcp6_parser.cc" // lalr1.cc:859 break; case 201: -#line 799 "dhcp6_parser.yy" // lalr1.cc:859 +#line 796 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); } -#line 1579 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1569 "dhcp6_parser.cc" // lalr1.cc:859 break; case 202: -#line 804 "dhcp6_parser.yy" // lalr1.cc:859 +#line 801 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); } -#line 1588 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1578 "dhcp6_parser.cc" // lalr1.cc:859 break; case 203: -#line 809 "dhcp6_parser.yy" // lalr1.cc:859 +#line 806 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); } -#line 1597 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1587 "dhcp6_parser.cc" // lalr1.cc:859 break; case 204: -#line 814 "dhcp6_parser.yy" // lalr1.cc:859 +#line 811 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); } -#line 1606 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1596 "dhcp6_parser.cc" // lalr1.cc:859 break; case 205: -#line 819 "dhcp6_parser.yy" // lalr1.cc:859 +#line 816 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); } -#line 1615 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1605 "dhcp6_parser.cc" // lalr1.cc:859 break; case 206: -#line 824 "dhcp6_parser.yy" // lalr1.cc:859 +#line 821 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); } -#line 1624 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1614 "dhcp6_parser.cc" // lalr1.cc:859 break; case 207: -#line 832 "dhcp6_parser.yy" // lalr1.cc:859 +#line 829 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet6", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET6); } -#line 1635 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1625 "dhcp6_parser.cc" // lalr1.cc:859 break; case 208: -#line 837 "dhcp6_parser.yy" // lalr1.cc:859 +#line 834 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1644 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1634 "dhcp6_parser.cc" // lalr1.cc:859 break; case 213: -#line 857 "dhcp6_parser.yy" // lalr1.cc:859 +#line 854 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1654 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1644 "dhcp6_parser.cc" // lalr1.cc:859 break; case 214: -#line 861 "dhcp6_parser.yy" // lalr1.cc:859 +#line 858 "dhcp6_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1676,261 +1666,261 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1680 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1670 "dhcp6_parser.cc" // lalr1.cc:859 break; case 215: -#line 883 "dhcp6_parser.yy" // lalr1.cc:859 +#line 880 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the subnet6 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1690 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1680 "dhcp6_parser.cc" // lalr1.cc:859 break; case 216: -#line 887 "dhcp6_parser.yy" // lalr1.cc:859 +#line 884 "dhcp6_parser.yy" // lalr1.cc:859 { // The subnet subnet6 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1700 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1690 "dhcp6_parser.cc" // lalr1.cc:859 break; case 238: -#line 920 "dhcp6_parser.yy" // lalr1.cc:859 +#line 917 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1708 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1698 "dhcp6_parser.cc" // lalr1.cc:859 break; case 239: -#line 922 "dhcp6_parser.yy" // lalr1.cc:859 +#line 919 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); } -#line 1718 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1708 "dhcp6_parser.cc" // lalr1.cc:859 break; case 240: -#line 928 "dhcp6_parser.yy" // lalr1.cc:859 +#line 925 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1726 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1716 "dhcp6_parser.cc" // lalr1.cc:859 break; case 241: -#line 930 "dhcp6_parser.yy" // lalr1.cc:859 +#line 927 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); ctx.leave(); } -#line 1736 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1726 "dhcp6_parser.cc" // lalr1.cc:859 break; case 242: -#line 936 "dhcp6_parser.yy" // lalr1.cc:859 +#line 933 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1744 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1734 "dhcp6_parser.cc" // lalr1.cc:859 break; case 243: -#line 938 "dhcp6_parser.yy" // lalr1.cc:859 +#line 935 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); ctx.leave(); } -#line 1754 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1744 "dhcp6_parser.cc" // lalr1.cc:859 break; case 244: -#line 944 "dhcp6_parser.yy" // lalr1.cc:859 +#line 941 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1762 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1752 "dhcp6_parser.cc" // lalr1.cc:859 break; case 245: -#line 946 "dhcp6_parser.yy" // lalr1.cc:859 +#line 943 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); } -#line 1772 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1762 "dhcp6_parser.cc" // lalr1.cc:859 break; case 246: -#line 952 "dhcp6_parser.yy" // lalr1.cc:859 +#line 949 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("eval-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 1783 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1773 "dhcp6_parser.cc" // lalr1.cc:859 break; case 247: -#line 957 "dhcp6_parser.yy" // lalr1.cc:859 +#line 954 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1792 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1782 "dhcp6_parser.cc" // lalr1.cc:859 break; case 248: -#line 962 "dhcp6_parser.yy" // lalr1.cc:859 +#line 959 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1800 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1790 "dhcp6_parser.cc" // lalr1.cc:859 break; case 249: -#line 964 "dhcp6_parser.yy" // lalr1.cc:859 +#line 961 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1809 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1799 "dhcp6_parser.cc" // lalr1.cc:859 break; case 250: -#line 969 "dhcp6_parser.yy" // lalr1.cc:859 +#line 966 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1815 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1805 "dhcp6_parser.cc" // lalr1.cc:859 break; case 251: -#line 970 "dhcp6_parser.yy" // lalr1.cc:859 +#line 967 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1821 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1811 "dhcp6_parser.cc" // lalr1.cc:859 break; case 252: -#line 971 "dhcp6_parser.yy" // lalr1.cc:859 +#line 968 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1827 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1817 "dhcp6_parser.cc" // lalr1.cc:859 break; case 253: -#line 974 "dhcp6_parser.yy" // lalr1.cc:859 +#line 971 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1836 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1826 "dhcp6_parser.cc" // lalr1.cc:859 break; case 254: -#line 979 "dhcp6_parser.yy" // lalr1.cc:859 +#line 976 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1845 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1835 "dhcp6_parser.cc" // lalr1.cc:859 break; case 255: -#line 987 "dhcp6_parser.yy" // lalr1.cc:859 +#line 984 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1856 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1846 "dhcp6_parser.cc" // lalr1.cc:859 break; case 256: -#line 992 "dhcp6_parser.yy" // lalr1.cc:859 +#line 989 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1865 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1855 "dhcp6_parser.cc" // lalr1.cc:859 break; case 261: -#line 1007 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1004 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1875 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1865 "dhcp6_parser.cc" // lalr1.cc:859 break; case 262: -#line 1011 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1008 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1883 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1873 "dhcp6_parser.cc" // lalr1.cc:859 break; case 280: -#line 1040 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1037 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1894 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1884 "dhcp6_parser.cc" // lalr1.cc:859 break; case 281: -#line 1045 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1042 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1903 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1893 "dhcp6_parser.cc" // lalr1.cc:859 break; case 282: -#line 1053 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1050 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1912 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1902 "dhcp6_parser.cc" // lalr1.cc:859 break; case 283: -#line 1056 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1053 "dhcp6_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 1920 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1910 "dhcp6_parser.cc" // lalr1.cc:859 break; case 288: -#line 1072 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1069 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1930 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1920 "dhcp6_parser.cc" // lalr1.cc:859 break; case 289: -#line 1076 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1073 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1938,21 +1928,21 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1942 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1932 "dhcp6_parser.cc" // lalr1.cc:859 break; case 290: -#line 1087 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1084 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-def list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1952 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1942 "dhcp6_parser.cc" // lalr1.cc:859 break; case 291: -#line 1091 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1088 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1960,348 +1950,319 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1964 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1954 "dhcp6_parser.cc" // lalr1.cc:859 break; case 305: -#line 1121 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1118 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 1973 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1963 "dhcp6_parser.cc" // lalr1.cc:859 break; case 307: -#line 1128 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1125 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1981 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1971 "dhcp6_parser.cc" // lalr1.cc:859 break; case 308: -#line 1130 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1127 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 1991 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1981 "dhcp6_parser.cc" // lalr1.cc:859 break; case 309: -#line 1136 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1133 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1999 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1989 "dhcp6_parser.cc" // lalr1.cc:859 break; case 310: -#line 1138 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1135 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 2009 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1999 "dhcp6_parser.cc" // lalr1.cc:859 break; case 311: -#line 1144 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1141 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2017 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2007 "dhcp6_parser.cc" // lalr1.cc:859 break; case 312: -#line 1146 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1143 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2027 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2017 "dhcp6_parser.cc" // lalr1.cc:859 break; case 314: -#line 1154 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1151 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2035 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2025 "dhcp6_parser.cc" // lalr1.cc:859 break; case 315: -#line 1156 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1153 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2045 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2035 "dhcp6_parser.cc" // lalr1.cc:859 break; case 316: -#line 1162 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1159 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2054 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2044 "dhcp6_parser.cc" // lalr1.cc:859 break; case 317: -#line 1171 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1168 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2065 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2055 "dhcp6_parser.cc" // lalr1.cc:859 break; case 318: -#line 1176 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1173 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2074 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2064 "dhcp6_parser.cc" // lalr1.cc:859 break; case 323: -#line 1195 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1192 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2084 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2074 "dhcp6_parser.cc" // lalr1.cc:859 break; case 324: -#line 1199 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1196 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2093 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2083 "dhcp6_parser.cc" // lalr1.cc:859 break; case 325: -#line 1207 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1204 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2103 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2093 "dhcp6_parser.cc" // lalr1.cc:859 break; case 326: -#line 1211 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1208 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2112 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2102 "dhcp6_parser.cc" // lalr1.cc:859 break; case 339: -#line 1242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1239 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2120 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2110 "dhcp6_parser.cc" // lalr1.cc:859 break; case 340: -#line 1244 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1241 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2130 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2120 "dhcp6_parser.cc" // lalr1.cc:859 break; case 343: -#line 1254 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1251 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2139 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2129 "dhcp6_parser.cc" // lalr1.cc:859 break; case 344: -#line 1259 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1256 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2148 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2138 "dhcp6_parser.cc" // lalr1.cc:859 break; case 345: -#line 1267 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1264 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2159 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2149 "dhcp6_parser.cc" // lalr1.cc:859 break; case 346: -#line 1272 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1269 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2158 "dhcp6_parser.cc" // lalr1.cc:859 break; case 351: -#line 1287 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1284 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2178 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2168 "dhcp6_parser.cc" // lalr1.cc:859 break; case 352: -#line 1291 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1288 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2188 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2178 "dhcp6_parser.cc" // lalr1.cc:859 break; case 353: -#line 1297 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1294 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2198 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2188 "dhcp6_parser.cc" // lalr1.cc:859 break; case 354: -#line 1301 "dhcp6_parser.yy" // lalr1.cc:859 +#line 1298 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 2207 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2197 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 364: -#line 1319 "dhcp6_parser.yy" // lalr1.cc:859 + case 363: +#line 1315 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2215 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2205 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 365: -#line 1321 "dhcp6_parser.yy" // lalr1.cc:859 + case 364: +#line 1317 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); ctx.leave(); } -#line 2225 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2215 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 366: -#line 1327 "dhcp6_parser.yy" // lalr1.cc:859 + case 365: +#line 1323 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2233 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2223 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 367: -#line 1329 "dhcp6_parser.yy" // lalr1.cc:859 + case 366: +#line 1325 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2242 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2232 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 368: -#line 1334 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.KNOWN_CLIENTS); -} -#line 2250 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 369: -#line 1336 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("known-clients", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2259 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 370: -#line 1342 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("only", ctx.loc2pos(yystack_[0].location))); } -#line 2265 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 371: -#line 1343 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 2271 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 372: -#line 1349 "dhcp6_parser.yy" // lalr1.cc:859 + case 367: +#line 1333 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.PD_POOLS); } -#line 2282 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2243 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 373: -#line 1354 "dhcp6_parser.yy" // lalr1.cc:859 + case 368: +#line 1338 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2291 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2252 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1369 "dhcp6_parser.yy" // lalr1.cc:859 + case 373: +#line 1353 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2301 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2262 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1373 "dhcp6_parser.yy" // lalr1.cc:859 + case 374: +#line 1357 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2309,21 +2270,21 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2313 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2274 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 380: -#line 1381 "dhcp6_parser.yy" // lalr1.cc:859 + case 375: +#line 1365 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2323 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 381: -#line 1385 "dhcp6_parser.yy" // lalr1.cc:859 + case 376: +#line 1369 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2331,1037 +2292,1037 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2335 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2296 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1410 "dhcp6_parser.yy" // lalr1.cc:859 + case 389: +#line 1393 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2343 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2304 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1412 "dhcp6_parser.yy" // lalr1.cc:859 + case 390: +#line 1395 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); ctx.leave(); } -#line 2353 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2314 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 397: -#line 1418 "dhcp6_parser.yy" // lalr1.cc:859 + case 391: +#line 1401 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); } -#line 2362 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2323 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 398: -#line 1423 "dhcp6_parser.yy" // lalr1.cc:859 + case 392: +#line 1406 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2370 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2331 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 399: -#line 1425 "dhcp6_parser.yy" // lalr1.cc:859 + case 393: +#line 1408 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); ctx.leave(); } -#line 2380 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2341 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 400: -#line 1431 "dhcp6_parser.yy" // lalr1.cc:859 + case 394: +#line 1414 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); } -#line 2389 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2350 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 401: -#line 1436 "dhcp6_parser.yy" // lalr1.cc:859 + case 395: +#line 1419 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); } -#line 2398 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2359 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1444 "dhcp6_parser.yy" // lalr1.cc:859 + case 396: +#line 1427 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2409 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2370 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1449 "dhcp6_parser.yy" // lalr1.cc:859 + case 397: +#line 1432 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2418 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2379 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 408: -#line 1462 "dhcp6_parser.yy" // lalr1.cc:859 + case 402: +#line 1445 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2428 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2389 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 409: -#line 1466 "dhcp6_parser.yy" // lalr1.cc:859 + case 403: +#line 1449 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2437 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2398 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 410: -#line 1471 "dhcp6_parser.yy" // lalr1.cc:859 + case 404: +#line 1454 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2447 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2408 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 411: -#line 1475 "dhcp6_parser.yy" // lalr1.cc:859 + case 405: +#line 1458 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2456 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2417 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1500 "dhcp6_parser.yy" // lalr1.cc:859 + case 419: +#line 1483 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2467 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2428 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1505 "dhcp6_parser.yy" // lalr1.cc:859 + case 420: +#line 1488 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2476 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2437 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1510 "dhcp6_parser.yy" // lalr1.cc:859 + case 421: +#line 1493 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefixes", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2487 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2448 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1515 "dhcp6_parser.yy" // lalr1.cc:859 + case 422: +#line 1498 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2496 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2457 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1520 "dhcp6_parser.yy" // lalr1.cc:859 + case 423: +#line 1503 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2504 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2465 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1522 "dhcp6_parser.yy" // lalr1.cc:859 + case 424: +#line 1505 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2514 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2475 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1528 "dhcp6_parser.yy" // lalr1.cc:859 + case 425: +#line 1511 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2522 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2483 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 + case 426: +#line 1513 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2532 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2493 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 + case 427: +#line 1519 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2540 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2501 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1538 "dhcp6_parser.yy" // lalr1.cc:859 + case 428: +#line 1521 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2550 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2511 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1544 "dhcp6_parser.yy" // lalr1.cc:859 + case 429: +#line 1527 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2558 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2519 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1546 "dhcp6_parser.yy" // lalr1.cc:859 + case 430: +#line 1529 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2568 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2529 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1552 "dhcp6_parser.yy" // lalr1.cc:859 + case 431: +#line 1535 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2579 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2540 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1557 "dhcp6_parser.yy" // lalr1.cc:859 + case 432: +#line 1540 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2588 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2549 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1565 "dhcp6_parser.yy" // lalr1.cc:859 + case 433: +#line 1548 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); ctx.stack_.push_back(m); ctx.enter(ctx.RELAY); } -#line 2599 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2560 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1570 "dhcp6_parser.yy" // lalr1.cc:859 + case 434: +#line 1553 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2608 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2569 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 + case 435: +#line 1558 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2616 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2577 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1577 "dhcp6_parser.yy" // lalr1.cc:859 + case 436: +#line 1560 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2626 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2587 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1586 "dhcp6_parser.yy" // lalr1.cc:859 + case 437: +#line 1569 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2637 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2598 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1591 "dhcp6_parser.yy" // lalr1.cc:859 + case 438: +#line 1574 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2646 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2607 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1600 "dhcp6_parser.yy" // lalr1.cc:859 + case 441: +#line 1583 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2656 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2617 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1604 "dhcp6_parser.yy" // lalr1.cc:859 + case 442: +#line 1587 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2666 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2627 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 459: -#line 1627 "dhcp6_parser.yy" // lalr1.cc:859 + case 453: +#line 1610 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2674 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2635 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 460: -#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 + case 454: +#line 1612 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2684 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2645 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 461: -#line 1635 "dhcp6_parser.yy" // lalr1.cc:859 + case 455: +#line 1618 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("eval-on-demand", b); } -#line 2693 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2654 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 462: -#line 1643 "dhcp6_parser.yy" // lalr1.cc:859 + case 456: +#line 1626 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER_ID); } -#line 2704 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2665 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 463: -#line 1648 "dhcp6_parser.yy" // lalr1.cc:859 + case 457: +#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2715 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2676 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 467: +#line 1651 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.DUID_TYPE); +} +#line 2684 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 468: +#line 1653 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2693 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 469: +#line 1658 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } +#line 2699 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 470: +#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } +#line 2705 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 471: +#line 1660 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } +#line 2711 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 472: +#line 1663 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("htype", htype); +} +#line 2720 "dhcp6_parser.cc" // lalr1.cc:859 break; case 473: #line 1668 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.DUID_TYPE); + ctx.enter(ctx.NO_KEYWORD); } -#line 2723 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2728 "dhcp6_parser.cc" // lalr1.cc:859 break; case 474: #line 1670 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2732 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 475: -#line 1675 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } -#line 2738 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 476: -#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } -#line 2744 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 477: -#line 1677 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } -#line 2750 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 478: -#line 1680 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("htype", htype); -} -#line 2759 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 479: -#line 1685 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 2767 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 480: -#line 1687 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("identifier", id); ctx.leave(); } -#line 2777 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2738 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 481: -#line 1693 "dhcp6_parser.yy" // lalr1.cc:859 + case 475: +#line 1676 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("time", time); } -#line 2786 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2747 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 482: -#line 1698 "dhcp6_parser.yy" // lalr1.cc:859 + case 476: +#line 1681 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enterprise-id", time); } -#line 2795 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2756 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 483: -#line 1705 "dhcp6_parser.yy" // lalr1.cc:859 + case 477: +#line 1688 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2804 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2765 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1712 "dhcp6_parser.yy" // lalr1.cc:859 + case 478: +#line 1695 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2815 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2776 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1717 "dhcp6_parser.yy" // lalr1.cc:859 + case 479: +#line 1700 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2824 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2785 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1730 "dhcp6_parser.yy" // lalr1.cc:859 + case 484: +#line 1713 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2832 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2793 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1732 "dhcp6_parser.yy" // lalr1.cc:859 + case 485: +#line 1715 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2842 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2803 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 492: -#line 1738 "dhcp6_parser.yy" // lalr1.cc:859 + case 486: +#line 1721 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2850 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2811 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 493: -#line 1740 "dhcp6_parser.yy" // lalr1.cc:859 + case 487: +#line 1723 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2860 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2821 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 494: -#line 1748 "dhcp6_parser.yy" // lalr1.cc:859 + case 488: +#line 1731 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2871 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2832 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 495: -#line 1753 "dhcp6_parser.yy" // lalr1.cc:859 + case 489: +#line 1736 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2882 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2843 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 496: -#line 1760 "dhcp6_parser.yy" // lalr1.cc:859 + case 490: +#line 1743 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2892 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2853 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 497: -#line 1764 "dhcp6_parser.yy" // lalr1.cc:859 + case 491: +#line 1747 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2902 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2863 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1791 "dhcp6_parser.yy" // lalr1.cc:859 + case 509: +#line 1774 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2911 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2872 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 + case 510: +#line 1779 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2919 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2880 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1798 "dhcp6_parser.yy" // lalr1.cc:859 + case 511: +#line 1781 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2929 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2890 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1804 "dhcp6_parser.yy" // lalr1.cc:859 + case 512: +#line 1787 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2937 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2898 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1806 "dhcp6_parser.yy" // lalr1.cc:859 + case 513: +#line 1789 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2947 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2908 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1812 "dhcp6_parser.yy" // lalr1.cc:859 + case 514: +#line 1795 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2956 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2917 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1817 "dhcp6_parser.yy" // lalr1.cc:859 + case 515: +#line 1800 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2964 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2925 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1819 "dhcp6_parser.yy" // lalr1.cc:859 + case 516: +#line 1802 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2974 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2935 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 + case 517: +#line 1808 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2983 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2944 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 + case 518: +#line 1813 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2992 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2953 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1835 "dhcp6_parser.yy" // lalr1.cc:859 + case 519: +#line 1818 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } -#line 3000 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2961 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1837 "dhcp6_parser.yy" // lalr1.cc:859 + case 520: +#line 1820 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3009 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2970 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 + case 521: +#line 1826 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 3015 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2976 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1844 "dhcp6_parser.yy" // lalr1.cc:859 + case 522: +#line 1827 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 3021 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2982 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1847 "dhcp6_parser.yy" // lalr1.cc:859 + case 523: +#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } -#line 3029 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2990 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1849 "dhcp6_parser.yy" // lalr1.cc:859 + case 524: +#line 1832 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 3039 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3000 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1855 "dhcp6_parser.yy" // lalr1.cc:859 + case 525: +#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 3048 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3009 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1860 "dhcp6_parser.yy" // lalr1.cc:859 + case 526: +#line 1843 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 3057 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3018 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1865 "dhcp6_parser.yy" // lalr1.cc:859 + case 527: +#line 1848 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 3066 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3027 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1870 "dhcp6_parser.yy" // lalr1.cc:859 + case 528: +#line 1853 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3074 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3035 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1872 "dhcp6_parser.yy" // lalr1.cc:859 + case 529: +#line 1855 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3083 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3044 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1878 "dhcp6_parser.yy" // lalr1.cc:859 + case 530: +#line 1861 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3091 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3052 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 + case 531: +#line 1864 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3099 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3060 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1884 "dhcp6_parser.yy" // lalr1.cc:859 + case 532: +#line 1867 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3107 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3068 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1887 "dhcp6_parser.yy" // lalr1.cc:859 + case 533: +#line 1870 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3115 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3076 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1890 "dhcp6_parser.yy" // lalr1.cc:859 + case 534: +#line 1873 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3124 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3085 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1896 "dhcp6_parser.yy" // lalr1.cc:859 + case 535: +#line 1879 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3132 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3093 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1898 "dhcp6_parser.yy" // lalr1.cc:859 + case 536: +#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3142 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3103 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1906 "dhcp6_parser.yy" // lalr1.cc:859 + case 537: +#line 1889 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3150 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3111 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1908 "dhcp6_parser.yy" // lalr1.cc:859 + case 538: +#line 1891 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3159 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3120 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1913 "dhcp6_parser.yy" // lalr1.cc:859 + case 539: +#line 1896 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3167 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3128 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1915 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1898 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3176 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3137 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1920 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1903 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3184 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3145 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 548: -#line 1922 "dhcp6_parser.yy" // lalr1.cc:859 + case 542: +#line 1905 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3193 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3154 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 549: -#line 1933 "dhcp6_parser.yy" // lalr1.cc:859 + case 543: +#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3204 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3165 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 550: -#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 + case 544: +#line 1921 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3213 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3174 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1955 "dhcp6_parser.yy" // lalr1.cc:859 + case 548: +#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3224 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3185 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1960 "dhcp6_parser.yy" // lalr1.cc:859 + case 549: +#line 1943 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3233 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3194 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 558: -#line 1972 "dhcp6_parser.yy" // lalr1.cc:859 + case 552: +#line 1955 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3243 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3204 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 559: -#line 1976 "dhcp6_parser.yy" // lalr1.cc:859 + case 553: +#line 1959 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3251 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3212 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1991 "dhcp6_parser.yy" // lalr1.cc:859 + case 561: +#line 1974 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3260 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3221 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 568: -#line 1996 "dhcp6_parser.yy" // lalr1.cc:859 + case 562: +#line 1979 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3268 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3229 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 569: -#line 1998 "dhcp6_parser.yy" // lalr1.cc:859 + case 563: +#line 1981 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3278 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3239 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 570: -#line 2004 "dhcp6_parser.yy" // lalr1.cc:859 + case 564: +#line 1987 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3289 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3250 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 571: -#line 2009 "dhcp6_parser.yy" // lalr1.cc:859 + case 565: +#line 1992 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3298 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3259 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 574: -#line 2018 "dhcp6_parser.yy" // lalr1.cc:859 + case 568: +#line 2001 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3308 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3269 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 575: -#line 2022 "dhcp6_parser.yy" // lalr1.cc:859 + case 569: +#line 2005 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3316 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3277 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 582: -#line 2036 "dhcp6_parser.yy" // lalr1.cc:859 + case 576: +#line 2019 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3324 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3285 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 583: -#line 2038 "dhcp6_parser.yy" // lalr1.cc:859 + case 577: +#line 2021 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3334 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3295 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 584: -#line 2044 "dhcp6_parser.yy" // lalr1.cc:859 + case 578: +#line 2027 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3343 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3304 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 585: -#line 2049 "dhcp6_parser.yy" // lalr1.cc:859 + case 579: +#line 2032 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3352 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3313 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 586: -#line 2054 "dhcp6_parser.yy" // lalr1.cc:859 + case 580: +#line 2037 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3361 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3322 "dhcp6_parser.cc" // lalr1.cc:859 break; -#line 3365 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3326 "dhcp6_parser.cc" // lalr1.cc:859 default: break; } @@ -3616,110 +3577,109 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -720; + const short int Dhcp6Parser::yypact_ninf_ = -707; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 234, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, 39, 31, 84, 118, 126, 131, - 149, 155, 191, 198, 200, 210, 227, 241, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, 31, -43, 4, 30, 35, 168, - 206, 184, 130, 52, 68, 14, -29, 252, -720, 185, - 172, 190, 211, 222, -720, -720, -720, -720, -720, 271, - -720, 43, -720, -720, -720, -720, -720, -720, -720, -720, - -720, 292, 306, 310, 328, 331, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, 333, -720, -720, - -720, 116, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, 336, 129, -720, -720, - -720, -720, -720, -720, -720, -720, -720, 337, 338, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, 169, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, 171, -720, -720, -720, -720, -720, 340, -720, 341, - 347, -720, -720, -720, -720, -720, -720, 187, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, 261, 275, -720, -720, -720, -720, -720, - -720, -720, -720, 345, -720, -720, 350, -720, -720, -720, - 351, -720, -720, 348, 354, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, 355, 356, -720, -720, - -720, -720, 381, 387, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, 189, -720, -720, -720, 388, -720, - -720, 389, -720, 390, 391, -720, -720, 392, 393, 394, - -720, -720, -720, 212, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - 31, 31, -720, 203, 395, 396, 397, 398, 399, -720, - 4, -720, 400, 401, 402, 235, 254, 255, 258, 259, - 404, 405, 408, 409, 412, 416, 417, 418, 419, 420, - 421, 270, 423, 424, 30, -720, 425, 272, 35, -720, - 427, 428, 429, 430, 431, 432, 281, 280, 435, 436, - 437, 438, 439, 168, -720, 440, 441, 206, -720, 442, - 291, 444, 293, 296, 184, -720, 449, 450, 451, 452, - 455, 456, 457, -720, 130, -720, 458, 459, 308, 461, - 462, 463, 312, -720, 68, 464, 314, 315, -720, 14, - 470, 471, 59, -720, 318, 473, 474, 323, 476, 325, - 326, 479, 480, 327, 329, 332, 482, 484, 252, -720, - -720, -720, 485, 486, 487, 31, 31, 31, -720, 488, - 489, 490, -720, -720, -720, -720, -720, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, -720, 504, - 505, -720, 508, -720, -720, 509, 510, 511, 352, 361, - 362, -720, -720, 232, 508, 364, 515, 514, -720, 367, - 253, -720, 368, -720, 369, -720, -720, -720, 508, 508, - 508, 370, 371, 372, 373, -720, 374, 375, -720, 376, - 377, 378, -720, -720, 379, -720, -720, -720, 380, 31, - -720, -720, 382, 383, -720, 384, -720, -720, 192, 366, - -720, -720, -720, 13, 385, -720, 31, 30, 410, -720, - -720, -720, 35, 53, 53, 529, 535, 536, 537, -39, - 31, -11, 538, 539, 2, 27, 217, 252, -720, -720, - 540, 541, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, 542, 465, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, 218, -720, 248, -720, -720, 249, -720, -720, -720, - -720, 546, 548, 549, 550, 551, -720, -720, -720, 256, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, 257, -720, 552, 553, -720, -720, 554, - 556, -720, -720, 555, 559, -720, -720, 557, 561, -720, - -720, -720, 82, -720, -720, -720, 560, -720, -720, -720, - 105, -720, -720, -720, -720, 143, -720, -720, 562, 564, - -720, 565, 566, 567, 568, 569, 570, 263, -720, -720, - -720, -720, -720, -720, -720, -720, -720, 571, 572, 573, - -720, -720, 264, -720, -720, -720, -720, -720, -720, -720, - -720, 265, -720, -720, -720, 273, 426, -720, 574, 575, - -720, -720, 576, 580, -720, -720, 578, 582, -720, -720, - 579, -720, 584, 410, -720, -720, 585, 586, 587, 588, - 443, 407, 445, 446, 447, 589, 590, 53, -720, -720, - 168, -720, 529, 68, -720, 535, 14, -720, 536, 119, - -720, 537, -39, -720, -720, -11, -720, 11, 538, -720, - -29, -720, 539, 453, 454, 460, 466, 467, 468, 2, - -720, 591, 592, 469, 472, 475, 27, -720, 593, 594, - 217, -720, -720, -720, 596, 583, 206, -720, 540, 184, - -720, 541, 130, -720, 542, 601, -720, 595, -720, 330, - 477, 478, 481, -720, -720, -720, -720, -720, 483, 491, - -720, 274, -720, 598, -720, 599, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - 276, -720, -720, -720, -720, -720, -720, -720, 604, -720, - -720, -720, 603, 609, -720, -720, -720, -720, -720, 283, - -720, -720, -720, -720, -720, -720, -720, -720, 207, 492, - -720, -720, -720, -720, 507, 513, -720, -720, 516, 284, - -720, 285, -720, 605, -720, 517, 607, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - 119, -720, 611, 519, -720, 11, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - 157, -720, -720, 520, -720, -720, 115, 607, -720, -720, - -720, 613, -720, -720, -720, 286, -720, -720, -720, -720, - -720, 614, 522, 615, 115, -720, 616, -720, 524, -720, - 619, -720, -720, 170, -720, -15, 619, -720, -720, 623, - 625, 626, 287, -720, -720, -720, -720, -720, -720, 630, - 532, 531, 543, -15, -720, 547, -720, -720, -720, -720, - -720 + 223, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, 70, 29, 61, 65, 73, 111, + 138, 146, 166, 168, 170, 174, 181, 198, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, 29, -44, 3, 9, 78, 160, + 87, 33, 43, 162, 53, 128, -19, 242, -707, 201, + 206, 207, 229, 268, -707, -707, -707, -707, -707, 282, + -707, 94, -707, -707, -707, -707, -707, -707, -707, -707, + -707, 291, 297, 299, 303, 307, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, 323, -707, -707, + -707, 98, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, 327, 127, -707, -707, + -707, -707, -707, -707, -707, -707, -707, 329, 335, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, 129, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + 130, -707, -707, -707, -707, 339, -707, 340, 341, -707, + -707, -707, -707, -707, 136, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + 231, 281, -707, -707, -707, -707, -707, -707, -707, -707, + 338, -707, -707, 372, -707, -707, -707, 373, -707, -707, + 370, 376, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, 377, 378, -707, -707, -707, -707, 375, + 381, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, 143, -707, -707, -707, 382, -707, -707, 383, -707, + 384, 385, -707, -707, 386, 387, 388, -707, -707, -707, + 149, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, 29, 29, -707, + 227, 389, 390, 392, 393, 394, -707, 3, -707, 395, + 396, 397, 248, 249, 251, 252, 253, 400, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 264, 415, + 416, 9, -707, 417, 266, 78, -707, 419, 420, 421, + 422, 423, 424, 275, 274, 427, 428, 432, 433, 434, + 160, -707, 435, 87, -707, 436, 287, 438, 289, 293, + 33, -707, 440, 444, 445, 446, 447, 450, 451, -707, + 43, -707, 452, 453, 304, 455, 456, 457, 306, -707, + 53, 459, 309, 311, -707, 128, 464, 465, 250, -707, + 314, 467, 468, 319, 470, 321, 322, 473, 474, 324, + 325, 326, 475, 479, 242, -707, -707, -707, 480, 478, + 481, 29, 29, 29, -707, 482, 483, 484, -707, -707, + -707, -707, -707, 380, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, -707, 497, 498, -707, 502, -707, + -707, 503, 504, 505, 333, 334, 347, -707, -707, -11, + 502, 348, 506, 507, -707, 357, -707, 360, -707, 362, + -707, -707, -707, 502, 502, 502, 363, 364, 365, 366, + -707, 367, 368, -707, 369, 371, 374, -707, -707, 379, + -707, -707, -707, 391, 29, -707, -707, 398, 399, -707, + 401, -707, -707, 216, 402, -707, -707, -707, 88, 403, + -707, 29, 9, 414, -707, -707, -707, 78, 34, 34, + 519, 521, 522, 523, -27, 29, 221, 524, 526, 157, + 49, 236, 242, -707, -707, 527, 528, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, 529, 454, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, 151, -707, 152, -707, -707, 171, -707, + -707, -707, -707, 534, 535, 536, 537, 538, -707, -707, + -707, 192, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, 233, -707, 539, 543, -707, + -707, 541, 545, -707, -707, 544, 546, -707, -707, 547, + 552, -707, -707, -707, 102, -707, -707, -707, 551, -707, + -707, -707, 257, -707, -707, -707, -707, 290, -707, -707, + 553, 555, -707, 556, 557, 558, 559, 560, 561, 235, + -707, -707, -707, -707, -707, -707, -707, -707, -707, 562, + 563, 564, -707, -707, 258, -707, -707, -707, -707, -707, + -707, -707, -707, 259, -707, -707, -707, 261, 418, -707, + 566, 567, -707, -707, 568, 570, -707, -707, 569, 573, + -707, -707, 571, -707, 565, 414, -707, -707, 574, 576, + 577, 578, 429, 430, 431, 437, 441, 580, 583, 34, + -707, -707, 160, -707, 519, 53, -707, 521, 128, -707, + 522, 194, -707, 523, -27, -707, -707, 221, -707, 44, + 524, -707, -19, -707, 526, 442, 443, 448, 449, 458, + 460, 157, -707, 584, 585, 461, 462, 463, 49, -707, + 586, 587, 236, -707, -707, -707, 588, 589, 87, -707, + 527, 33, -707, 528, 43, -707, 529, 594, -707, 572, + -707, 272, 466, 469, 471, -707, -707, -707, -707, -707, + 472, 476, -707, 267, -707, 591, -707, 592, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, 269, -707, -707, -707, -707, -707, -707, -707, + 597, -707, -707, -707, 596, 602, -707, -707, -707, -707, + -707, 270, -707, -707, -707, -707, -707, -707, -707, -707, + 68, 477, -707, -707, -707, -707, 485, 486, -707, -707, + 499, 271, -707, 277, -707, 598, -707, 501, 600, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, 194, -707, 604, 508, -707, 44, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, 302, -707, -707, 510, -707, -707, 71, 600, + -707, -707, -707, 605, -707, -707, -707, 279, -707, -707, + -707, -707, -707, 606, 516, 607, 71, -707, 608, -707, + 518, -707, 611, -707, -707, 312, -707, 123, 611, -707, + -707, 616, 617, 619, 280, -707, -707, -707, -707, -707, + -707, 622, 530, 533, 540, 123, -707, 525, -707, -707, + -707, -707, -707 }; const unsigned short int @@ -3730,528 +3690,524 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, 56, 5, 68, 7, 102, 9, 215, 11, 353, 13, - 380, 15, 410, 17, 282, 19, 290, 21, 325, 23, - 180, 25, 496, 27, 45, 39, 0, 0, 0, 0, - 0, 0, 412, 0, 292, 327, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 549, 543, 545, 547, 0, + 375, 15, 404, 17, 282, 19, 290, 21, 325, 23, + 180, 25, 490, 27, 45, 39, 0, 0, 0, 0, + 0, 0, 406, 0, 292, 327, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 543, 537, 539, 541, 0, 65, 0, 58, 60, 62, 63, 64, 61, 100, 111, 113, 0, 0, 0, 0, 0, 207, 280, 317, 255, - 153, 170, 161, 443, 172, 191, 462, 0, 484, 494, + 153, 170, 161, 437, 172, 191, 456, 0, 478, 488, 94, 0, 70, 72, 73, 74, 75, 76, 79, 80, 81, 82, 84, 83, 88, 89, 77, 78, 86, 87, 85, 90, 91, 92, 93, 108, 0, 0, 104, 106, - 107, 345, 372, 366, 238, 240, 242, 0, 0, 248, - 246, 244, 402, 439, 237, 219, 220, 221, 222, 0, + 107, 345, 367, 365, 238, 240, 242, 0, 0, 248, + 246, 244, 396, 433, 237, 219, 220, 221, 222, 0, 217, 226, 227, 228, 231, 232, 234, 229, 230, 223, - 224, 236, 225, 233, 235, 364, 368, 363, 359, 360, - 358, 0, 355, 357, 361, 362, 395, 0, 398, 0, - 0, 394, 388, 389, 387, 392, 393, 0, 382, 384, - 385, 390, 391, 386, 437, 425, 427, 429, 431, 433, - 435, 424, 423, 0, 413, 414, 418, 419, 416, 420, - 421, 422, 417, 0, 307, 143, 0, 311, 309, 314, - 0, 303, 304, 0, 293, 294, 296, 306, 297, 298, - 299, 313, 300, 301, 302, 339, 0, 0, 337, 338, - 341, 342, 0, 328, 329, 331, 332, 333, 334, 335, - 336, 187, 189, 184, 0, 182, 185, 186, 0, 516, - 518, 0, 521, 0, 0, 525, 529, 0, 0, 0, - 534, 541, 514, 0, 498, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 44, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 55, - 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 224, 236, 225, 233, 235, 363, 362, 359, 360, 358, + 0, 355, 357, 361, 389, 0, 392, 0, 0, 388, + 383, 384, 382, 387, 0, 377, 379, 380, 385, 386, + 381, 431, 419, 421, 423, 425, 427, 429, 418, 417, + 0, 407, 408, 412, 413, 410, 414, 415, 416, 411, + 0, 307, 143, 0, 311, 309, 314, 0, 303, 304, + 0, 293, 294, 296, 306, 297, 298, 299, 313, 300, + 301, 302, 339, 0, 0, 337, 338, 341, 342, 0, + 328, 329, 331, 332, 333, 334, 335, 336, 187, 189, + 184, 0, 182, 185, 186, 0, 510, 512, 0, 515, + 0, 0, 519, 523, 0, 0, 0, 528, 535, 508, + 0, 492, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 44, 0, 0, 37, + 0, 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 216, 0, 0, 0, 354, 0, - 0, 0, 0, 0, 0, 381, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 291, 0, 0, 0, 0, 326, 0, - 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, - 48, 41, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 0, 95, 96, 97, 98, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, - 0, 71, 0, 110, 105, 0, 0, 0, 0, 0, - 0, 253, 254, 0, 0, 0, 0, 0, 218, 0, - 0, 356, 0, 397, 0, 400, 401, 383, 0, 0, - 0, 0, 0, 0, 0, 415, 0, 0, 305, 0, - 0, 0, 316, 295, 0, 343, 344, 330, 0, 0, - 183, 515, 0, 0, 520, 0, 523, 524, 0, 0, - 531, 532, 533, 0, 0, 499, 0, 0, 0, 544, - 546, 548, 0, 0, 0, 209, 284, 319, 257, 0, - 45, 0, 0, 174, 0, 0, 0, 0, 49, 109, - 347, 374, 38, 367, 239, 241, 243, 250, 251, 252, - 249, 247, 245, 404, 0, 365, 370, 371, 369, 396, - 399, 438, 426, 428, 430, 432, 434, 436, 308, 144, - 312, 310, 315, 340, 188, 190, 517, 519, 522, 527, - 528, 526, 530, 537, 536, 538, 539, 540, 535, 542, - 42, 0, 554, 0, 551, 553, 0, 130, 136, 138, - 140, 0, 0, 0, 0, 0, 149, 151, 129, 0, - 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 0, 213, 0, 210, 211, 288, 0, - 285, 286, 323, 0, 320, 321, 261, 0, 258, 259, - 159, 160, 0, 155, 157, 158, 0, 168, 169, 165, - 0, 163, 166, 167, 447, 0, 445, 178, 0, 175, - 176, 0, 0, 0, 0, 0, 0, 0, 193, 195, - 196, 197, 198, 199, 200, 473, 479, 0, 0, 0, - 472, 471, 0, 464, 466, 469, 467, 468, 470, 490, - 492, 0, 486, 488, 489, 0, 51, 351, 0, 348, - 349, 378, 0, 375, 376, 408, 0, 405, 406, 441, - 0, 67, 0, 0, 550, 101, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 112, 114, - 0, 208, 0, 292, 281, 0, 327, 318, 0, 0, - 256, 0, 0, 154, 171, 0, 162, 449, 0, 444, - 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, - 192, 0, 0, 0, 0, 0, 0, 463, 0, 0, - 0, 485, 495, 53, 0, 52, 0, 346, 0, 0, - 373, 0, 412, 403, 0, 0, 440, 0, 552, 0, - 0, 0, 0, 142, 145, 146, 147, 148, 0, 0, - 116, 0, 212, 0, 287, 0, 322, 279, 276, 278, - 269, 270, 265, 266, 267, 268, 274, 275, 273, 277, - 0, 263, 271, 272, 260, 156, 164, 459, 0, 457, - 458, 456, 0, 450, 451, 453, 454, 455, 446, 0, - 177, 201, 202, 203, 204, 205, 206, 194, 0, 0, - 478, 481, 482, 465, 0, 0, 487, 50, 0, 0, - 350, 0, 377, 0, 407, 0, 0, 132, 133, 134, - 135, 131, 137, 139, 141, 150, 152, 214, 289, 324, - 0, 262, 0, 0, 448, 0, 179, 475, 476, 477, - 474, 480, 491, 493, 54, 352, 379, 409, 442, 558, - 0, 556, 264, 0, 461, 452, 0, 0, 555, 460, - 570, 0, 568, 566, 562, 0, 560, 564, 565, 563, - 557, 0, 0, 0, 0, 559, 0, 567, 0, 561, - 0, 569, 574, 0, 572, 0, 0, 571, 582, 0, - 0, 0, 0, 576, 578, 579, 580, 581, 573, 0, - 0, 0, 0, 0, 575, 0, 584, 585, 586, 577, - 583 + 0, 0, 69, 0, 0, 0, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 216, 0, 0, 354, 0, 0, 0, 0, 0, + 0, 376, 0, 0, 0, 0, 0, 0, 0, 405, + 0, 283, 0, 0, 0, 0, 0, 0, 0, 291, + 0, 0, 0, 0, 326, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 491, 48, 41, 0, 0, + 0, 0, 0, 0, 59, 0, 0, 0, 95, 96, + 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 477, 0, 0, 71, 0, 110, + 105, 0, 0, 0, 0, 0, 0, 253, 254, 0, + 0, 0, 0, 0, 218, 0, 356, 0, 391, 0, + 394, 395, 378, 0, 0, 0, 0, 0, 0, 0, + 409, 0, 0, 305, 0, 0, 0, 316, 295, 0, + 343, 344, 330, 0, 0, 183, 509, 0, 0, 514, + 0, 517, 518, 0, 0, 525, 526, 527, 0, 0, + 493, 0, 0, 0, 538, 540, 542, 0, 0, 0, + 209, 284, 319, 257, 0, 45, 0, 0, 174, 0, + 0, 0, 0, 49, 109, 347, 369, 38, 366, 239, + 241, 243, 250, 251, 252, 249, 247, 245, 398, 0, + 364, 390, 393, 432, 420, 422, 424, 426, 428, 430, + 308, 144, 312, 310, 315, 340, 188, 190, 511, 513, + 516, 521, 522, 520, 524, 530, 531, 532, 533, 534, + 529, 536, 42, 0, 548, 0, 545, 547, 0, 130, + 136, 138, 140, 0, 0, 0, 0, 0, 149, 151, + 129, 0, 115, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 0, 213, 0, 210, 211, + 288, 0, 285, 286, 323, 0, 320, 321, 261, 0, + 258, 259, 159, 160, 0, 155, 157, 158, 0, 168, + 169, 165, 0, 163, 166, 167, 441, 0, 439, 178, + 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, + 193, 195, 196, 197, 198, 199, 200, 467, 473, 0, + 0, 0, 466, 465, 0, 458, 460, 463, 461, 462, + 464, 484, 486, 0, 480, 482, 483, 0, 51, 351, + 0, 348, 349, 373, 0, 370, 371, 402, 0, 399, + 400, 435, 0, 67, 0, 0, 544, 101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 114, 0, 208, 0, 292, 281, 0, 327, 318, + 0, 0, 256, 0, 0, 154, 171, 0, 162, 443, + 0, 438, 0, 173, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 0, 0, 0, 0, 0, 0, 457, + 0, 0, 0, 479, 489, 53, 0, 52, 0, 346, + 0, 0, 368, 0, 406, 397, 0, 0, 434, 0, + 546, 0, 0, 0, 0, 142, 145, 146, 147, 148, + 0, 0, 116, 0, 212, 0, 287, 0, 322, 279, + 276, 278, 269, 270, 265, 266, 267, 268, 274, 275, + 273, 277, 0, 263, 271, 272, 260, 156, 164, 453, + 0, 451, 452, 450, 0, 444, 445, 447, 448, 449, + 440, 0, 177, 201, 202, 203, 204, 205, 206, 194, + 0, 0, 472, 475, 476, 459, 0, 0, 481, 50, + 0, 0, 350, 0, 372, 0, 401, 0, 0, 132, + 133, 134, 135, 131, 137, 139, 141, 150, 152, 214, + 289, 324, 0, 262, 0, 0, 442, 0, 179, 469, + 470, 471, 468, 474, 485, 487, 54, 352, 374, 403, + 436, 552, 0, 550, 264, 0, 455, 446, 0, 0, + 549, 454, 564, 0, 562, 560, 556, 0, 554, 558, + 559, 557, 551, 0, 0, 0, 0, 553, 0, 561, + 0, 555, 0, 563, 568, 0, 566, 0, 0, 565, + 576, 0, 0, 0, 0, 570, 572, 573, 574, 575, + 567, 0, 0, 0, 0, 0, 569, 0, 578, 579, + 580, 571, 577 }; const short int Dhcp6Parser::yypgoto_[] = { - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -8, -720, 100, -720, -720, - -720, -720, -720, -720, 49, -720, -374, -720, -720, -720, - -66, -720, -720, -720, 300, -720, -720, -720, -720, 120, - 295, -48, -44, -42, -41, -720, -720, -720, -720, -720, - 113, 294, -720, -720, -720, -720, -720, -720, -720, 117, - -87, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -73, -720, -523, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -99, -518, -720, -720, -720, -720, - -101, -720, -720, -720, -720, -720, -720, -720, -720, -107, - -720, -720, -720, -102, 247, -720, -720, -720, -720, -720, - -720, -720, -109, -720, -720, -720, -720, -720, -720, -719, - -720, -720, -720, -81, -720, -720, -720, -78, 290, -720, - -720, -716, -720, -715, -720, -38, -720, -36, -720, -713, - -720, -720, -720, -710, -720, -720, -720, -720, -86, -720, - -720, -224, 621, -720, -720, -720, -720, -720, -77, -720, - -720, -720, -76, -720, 266, -720, -56, -720, -720, -720, - -720, -720, -53, -720, -720, -720, -720, -720, -54, -720, - -720, -720, -79, -720, -720, -720, -71, -720, 297, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -74, -720, -720, -720, -84, 302, -720, -720, -40, -720, - -70, -720, -720, -720, -720, -720, -720, -75, -720, -720, - -720, -72, 334, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -69, -720, -720, -720, -68, -720, - 321, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -702, -720, -720, -720, -720, - -720, -720, -37, -720, -720, -720, -173, -720, -720, -720, - -720, -720, -720, -720, -49, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -52, -720, -720, - -720, -720, -720, -720, -720, -720, 182, 303, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - -720, -720, -720, -720, -720, -720, -720, -720, -720, -720, - 7, -720, -720, -720, -184, -720, -720, -200, -720, -720, - -720, -720, -720, -720, -210, -720, -720, -226, -720, -720, - -720, -720, -720 + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, 12, -707, 175, -707, -707, + -707, -707, -707, -707, 106, -707, -346, -707, -707, -707, + -66, -707, -707, -707, 310, -707, -707, -707, -707, 120, + 292, -62, -50, -48, -43, -707, -707, -707, -707, -707, + 117, 295, -707, -707, -707, -707, -707, -707, -707, 116, + -83, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -73, -707, -529, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -97, -514, -707, -707, -707, -707, + -96, -707, -707, -707, -707, -707, -707, -707, -707, -102, + -707, -707, -707, -99, 246, -707, -707, -707, -707, -707, + -707, -707, -106, -707, -707, -707, -707, -707, -707, -706, + -707, -707, -707, -77, -707, -707, -707, -74, 301, -707, + -707, -696, -707, -694, -707, -42, -707, -38, -707, -692, + -707, -707, -707, -683, -707, -707, -707, -707, -84, -707, + -707, -222, 609, -707, -707, -707, -707, -707, -76, -707, + -707, -707, -68, -707, 294, -707, -61, -707, -707, -707, + -707, -707, -53, -707, -707, -707, -707, -707, -54, -707, + -707, -707, -39, -707, -707, -707, -33, -707, 285, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -80, -707, -707, -707, -72, 336, -707, -707, -40, -707, + -707, -707, -707, -707, -75, -707, -707, -707, -71, 331, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -79, -707, -707, -707, -70, -707, 330, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -682, -707, -707, -707, -707, -707, -707, -37, + -707, -707, -707, -171, -707, -707, -707, -707, -707, -707, + -707, -51, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -49, -707, -707, -707, -707, -707, + -707, -707, -707, 177, 298, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, -707, -707, -707, + -707, -707, -707, -707, -707, -707, -707, 6, -707, -707, + -707, -184, -707, -707, -200, -707, -707, -707, -707, -707, + -707, -210, -707, -707, -226, -707, -707, -707, -707, -707 }; const short int Dhcp6Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 78, 37, 38, 65, 543, - 82, 83, 39, 64, 79, 80, 539, 696, 774, 775, - 120, 41, 66, 91, 92, 93, 314, 43, 67, 121, - 122, 123, 124, 125, 126, 127, 128, 322, 45, 68, - 147, 148, 149, 346, 150, 129, 323, 130, 324, 609, - 610, 611, 716, 871, 612, 717, 613, 718, 614, 719, - 615, 242, 387, 617, 618, 619, 620, 621, 725, 622, - 726, 131, 334, 642, 643, 644, 645, 132, 336, 650, - 651, 652, 653, 133, 335, 134, 338, 658, 659, 660, - 750, 61, 76, 274, 275, 276, 400, 277, 401, 135, - 339, 667, 668, 669, 670, 671, 672, 673, 674, 136, - 330, 625, 626, 627, 730, 47, 69, 169, 170, 171, - 353, 172, 354, 173, 355, 174, 360, 175, 359, 176, - 358, 550, 177, 178, 137, 333, 637, 638, 639, 739, - 820, 821, 138, 331, 55, 73, 629, 630, 631, 733, - 57, 74, 243, 244, 245, 246, 247, 248, 249, 386, - 250, 390, 251, 389, 252, 253, 391, 254, 139, 332, - 633, 634, 635, 736, 59, 75, 262, 263, 264, 265, - 266, 395, 267, 268, 269, 270, 180, 350, 698, 699, - 700, 776, 49, 70, 191, 192, 193, 365, 181, 352, - 195, 366, 558, 182, 351, 702, 703, 704, 779, 51, - 71, 207, 208, 209, 369, 210, 211, 371, 212, 213, - 183, 361, 706, 707, 708, 782, 53, 72, 223, 224, - 225, 226, 377, 227, 378, 228, 379, 229, 380, 230, - 381, 231, 382, 232, 376, 184, 362, 710, 785, 140, - 337, 655, 656, 747, 832, 833, 834, 835, 836, 882, - 837, 141, 340, 682, 683, 684, 761, 890, 685, 686, - 762, 687, 688, 142, 143, 342, 691, 692, 693, 768, - 694, 769, 144, 343, 63, 77, 293, 294, 295, 296, - 405, 297, 406, 298, 299, 408, 300, 301, 302, 411, - 581, 303, 412, 304, 305, 306, 307, 416, 588, 308, - 417, 94, 316, 95, 317, 96, 318, 97, 315, 593, - 594, 595, 712, 900, 901, 906, 915, 916, 917, 918, - 923, 919, 921, 933, 934, 935, 942, 943, 944, 949, - 945, 946, 947 + 23, 24, 25, 26, 27, 78, 37, 38, 65, 538, + 82, 83, 39, 64, 79, 80, 534, 688, 766, 767, + 120, 41, 66, 91, 92, 93, 311, 43, 67, 121, + 122, 123, 124, 125, 126, 127, 128, 319, 45, 68, + 147, 148, 149, 343, 150, 129, 320, 130, 321, 601, + 602, 603, 708, 863, 604, 709, 605, 710, 606, 711, + 607, 239, 383, 609, 610, 611, 612, 613, 717, 614, + 718, 131, 331, 634, 635, 636, 637, 132, 333, 642, + 643, 644, 645, 133, 332, 134, 335, 650, 651, 652, + 742, 61, 76, 271, 272, 273, 396, 274, 397, 135, + 336, 659, 660, 661, 662, 663, 664, 665, 666, 136, + 327, 617, 618, 619, 722, 47, 69, 169, 170, 171, + 350, 172, 351, 173, 352, 174, 357, 175, 356, 176, + 355, 545, 177, 178, 137, 330, 629, 630, 631, 731, + 812, 813, 138, 328, 55, 73, 621, 622, 623, 725, + 57, 74, 240, 241, 242, 243, 244, 245, 246, 382, + 247, 386, 248, 385, 249, 250, 387, 251, 139, 329, + 625, 626, 627, 728, 59, 75, 259, 260, 261, 262, + 263, 391, 264, 265, 266, 267, 180, 347, 690, 691, + 692, 768, 49, 70, 190, 191, 192, 362, 181, 349, + 182, 348, 694, 695, 696, 771, 51, 71, 204, 205, + 206, 365, 207, 208, 367, 209, 210, 183, 358, 698, + 699, 700, 774, 53, 72, 220, 221, 222, 223, 373, + 224, 374, 225, 375, 226, 376, 227, 377, 228, 378, + 229, 372, 184, 359, 702, 777, 140, 334, 647, 648, + 739, 824, 825, 826, 827, 828, 874, 829, 141, 337, + 674, 675, 676, 753, 882, 677, 678, 754, 679, 680, + 142, 143, 339, 683, 684, 685, 760, 686, 761, 144, + 340, 63, 77, 290, 291, 292, 293, 401, 294, 402, + 295, 296, 404, 297, 298, 299, 407, 573, 300, 408, + 301, 302, 303, 304, 412, 580, 305, 413, 94, 313, + 95, 314, 96, 315, 97, 312, 585, 586, 587, 704, + 892, 893, 898, 907, 908, 909, 910, 915, 911, 913, + 925, 926, 927, 934, 935, 936, 941, 937, 938, 939 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 90, 206, 259, 164, 187, 201, 221, 36, 241, 258, - 273, 292, 681, 649, 84, 179, 190, 204, 222, 260, - 813, 165, 261, 814, 815, 166, 818, 167, 168, 819, - 194, 205, 188, 202, 189, 203, 29, 823, 30, 28, - 31, 98, 640, 675, 99, 100, 320, 145, 146, 108, - 235, 321, 602, 235, 255, 236, 237, 256, 257, 271, - 272, 101, 102, 103, 104, 105, 106, 107, 108, 597, - 640, 647, 583, 648, 598, 599, 600, 601, 602, 603, - 604, 605, 606, 607, 234, 742, 827, 828, 743, 107, - 551, 40, 235, 661, 662, 663, 664, 665, 666, 109, - 110, 111, 112, 113, 561, 562, 563, 235, 745, 236, - 237, 746, 81, 238, 239, 240, 641, 114, 938, 344, - 115, 939, 940, 941, 345, 42, 89, 116, 676, 677, - 678, 679, 348, 44, 85, 117, 118, 349, 46, 119, - 584, 585, 586, 86, 87, 88, 748, 271, 272, 749, - 101, 102, 103, 104, 235, 106, 48, 108, 235, 89, - 907, 813, 50, 908, 814, 815, 89, 818, 108, 89, - 819, 587, 363, 936, 367, 310, 937, 364, 823, 368, - 155, 156, 89, 158, 159, 89, 32, 33, 34, 35, - 374, 309, 402, 160, 311, 375, 161, 403, 52, 101, - 102, 103, 104, 214, 163, 54, 108, 56, 89, 215, - 216, 217, 218, 219, 220, 418, 151, 58, 152, 312, - 419, 344, 108, 89, 153, 313, 711, 649, 154, 155, - 156, 157, 158, 159, 60, 196, 197, 198, 199, 200, - 153, 186, 160, 681, 108, 161, 162, 910, 62, 911, - 912, 713, 348, 163, 90, 185, 714, 715, 160, 727, - 727, 161, 153, 186, 728, 729, 759, 766, 770, 383, - 89, 760, 767, 771, 89, 319, 418, 363, 384, 880, - 160, 772, 877, 161, 881, 89, 402, 367, 374, 924, - 953, 886, 895, 896, 925, 954, 325, 164, 547, 548, - 549, 187, 420, 421, 206, 887, 888, 889, 201, 179, - 326, 556, 557, 190, 327, 165, 579, 580, 221, 166, - 204, 167, 168, 89, 689, 690, 259, 194, 241, 188, - 222, 189, 328, 258, 205, 329, 202, 341, 203, 89, - 347, 356, 357, 260, 370, 372, 261, 867, 868, 869, - 870, 373, 292, 385, 388, 392, 393, 394, 422, 396, - 397, 89, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 398, - 399, 432, 404, 407, 409, 410, 413, 414, 415, 423, - 424, 425, 426, 427, 429, 430, 431, 89, 437, 438, - 433, 434, 439, 440, 435, 436, 441, 519, 520, 521, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 452, - 453, 455, 456, 457, 458, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 469, 470, 472, 473, 474, 475, - 616, 616, 476, 478, 479, 480, 481, 608, 608, 482, - 483, 484, 486, 487, 488, 489, 490, 491, 494, 680, - 492, 292, 495, 496, 498, 499, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 513, 511, 514, 516, - 512, 575, 582, 517, 518, 522, 523, 524, 525, 526, - 527, 528, 529, 530, 531, 532, 533, 544, 590, 534, - 535, 536, 537, 538, 540, 541, 545, 546, 30, 552, - 553, 554, 555, 559, 560, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 624, 576, 577, 578, - 589, 592, 628, 632, 636, 654, 657, 697, 701, 705, - 720, 709, 721, 722, 723, 724, 732, 542, 731, 735, - 734, 737, 738, 740, 741, 794, 744, 752, 751, 753, - 754, 755, 756, 757, 758, 763, 764, 765, 778, 646, - 777, 773, 780, 781, 783, 784, 858, 786, 787, 789, - 790, 791, 792, 798, 799, 848, 849, 854, 855, 793, - 866, 795, 857, 797, 796, 865, 878, 879, 883, 841, - 842, 884, 885, 897, 899, 903, 843, 922, 926, 928, - 428, 930, 844, 845, 846, 850, 932, 950, 851, 951, - 952, 852, 872, 873, 955, 596, 874, 591, 875, 451, - 800, 623, 454, 825, 826, 840, 876, 891, 839, 500, - 847, 802, 801, 468, 616, 824, 902, 803, 804, 806, - 493, 608, 892, 259, 164, 805, 812, 241, 893, 471, - 258, 894, 898, 807, 830, 909, 179, 904, 927, 931, - 260, 829, 165, 261, 273, 822, 166, 957, 167, 168, - 956, 808, 859, 831, 233, 809, 497, 810, 811, 958, - 680, 816, 960, 817, 860, 485, 862, 861, 477, 206, - 187, 838, 905, 201, 863, 864, 221, 853, 856, 695, - 788, 515, 190, 920, 929, 204, 948, 959, 222, 0, - 0, 0, 0, 0, 0, 0, 194, 0, 188, 205, - 189, 202, 0, 203, 0, 0, 0, 0, 0, 0, + 90, 673, 256, 164, 186, 199, 218, 165, 238, 255, + 270, 289, 641, 84, 257, 179, 189, 202, 219, 166, + 98, 167, 258, 99, 100, 805, 168, 36, 187, 200, + 193, 203, 188, 201, 29, 806, 30, 807, 31, 810, + 101, 102, 103, 104, 105, 106, 107, 108, 811, 815, + 589, 632, 542, 543, 544, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 667, 268, 269, 40, 231, + 28, 108, 42, 232, 594, 109, 110, 111, 112, 113, + 44, 108, 108, 232, 194, 195, 196, 197, 198, 153, + 145, 146, 232, 114, 233, 234, 115, 317, 235, 236, + 237, 341, 318, 116, 160, 734, 342, 161, 735, 81, + 232, 117, 118, 211, 546, 119, 819, 820, 46, 212, + 213, 214, 215, 216, 217, 108, 633, 553, 554, 555, + 345, 85, 360, 363, 89, 346, 185, 361, 364, 370, + 86, 87, 88, 153, 371, 48, 398, 668, 669, 670, + 671, 399, 414, 50, 341, 705, 89, 415, 160, 703, + 706, 161, 89, 879, 880, 881, 805, 232, 252, 233, + 234, 253, 254, 52, 345, 54, 806, 56, 807, 707, + 810, 58, 32, 33, 34, 35, 89, 89, 60, 811, + 815, 101, 102, 103, 104, 719, 89, 89, 108, 107, + 720, 902, 89, 903, 904, 62, 89, 306, 151, 307, + 152, 308, 575, 576, 577, 578, 153, 154, 155, 156, + 157, 158, 159, 641, 89, 101, 102, 103, 104, 673, + 106, 160, 108, 232, 161, 162, 719, 309, 751, 379, + 89, 721, 163, 752, 579, 653, 654, 655, 656, 657, + 658, 90, 155, 156, 930, 158, 159, 931, 932, 933, + 737, 758, 762, 738, 414, 160, 759, 763, 161, 764, + 360, 310, 872, 398, 363, 869, 163, 873, 878, 887, + 370, 89, 916, 945, 380, 888, 316, 917, 946, 859, + 860, 861, 862, 740, 164, 322, 741, 186, 165, 632, + 639, 323, 640, 324, 199, 899, 179, 325, 900, 189, + 166, 326, 167, 89, 218, 928, 202, 168, 929, 416, + 417, 187, 256, 193, 238, 188, 219, 338, 200, 255, + 203, 344, 201, 353, 257, 268, 269, 571, 572, 354, + 681, 682, 258, 366, 368, 369, 381, 89, 289, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 384, 388, 389, 390, + 418, 392, 393, 394, 395, 520, 400, 403, 405, 406, + 409, 410, 411, 419, 420, 89, 421, 422, 423, 425, + 426, 427, 428, 429, 433, 430, 431, 432, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 448, 449, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 514, 515, 516, 461, 462, 463, 465, + 467, 468, 469, 470, 473, 608, 608, 471, 474, 475, + 476, 477, 600, 600, 478, 479, 481, 482, 483, 484, + 485, 486, 487, 489, 672, 490, 289, 491, 493, 494, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 508, + 505, 506, 507, 509, 511, 512, 539, 540, 513, 517, + 518, 519, 521, 522, 523, 524, 525, 526, 527, 528, + 541, 547, 529, 530, 531, 532, 567, 533, 535, 536, + 550, 548, 30, 551, 549, 552, 556, 557, 558, 559, + 560, 561, 562, 582, 563, 574, 616, 564, 620, 624, + 628, 646, 565, 649, 689, 693, 697, 701, 712, 713, + 714, 715, 716, 584, 566, 723, 724, 726, 727, 730, + 729, 568, 569, 732, 570, 733, 581, 736, 744, 743, + 745, 746, 747, 748, 749, 750, 755, 756, 757, 779, + 770, 765, 769, 773, 772, 775, 776, 858, 781, 778, + 782, 783, 784, 785, 790, 787, 786, 791, 840, 841, + 846, 847, 850, 788, 849, 789, 833, 834, 857, 870, + 871, 875, 835, 836, 876, 877, 889, 891, 895, 914, + 918, 920, 837, 922, 838, 842, 843, 844, 924, 864, + 942, 943, 865, 944, 866, 867, 947, 424, 537, 868, + 883, 638, 583, 447, 588, 615, 792, 817, 884, 885, + 450, 818, 832, 831, 495, 839, 608, 794, 793, 816, + 894, 796, 886, 600, 890, 256, 164, 795, 804, 238, + 165, 464, 255, 901, 896, 799, 822, 257, 179, 800, + 919, 923, 166, 821, 167, 258, 270, 814, 952, 168, + 492, 801, 230, 802, 488, 823, 948, 949, 803, 808, + 852, 798, 672, 809, 950, 797, 851, 856, 854, 466, + 853, 472, 186, 830, 855, 199, 897, 845, 218, 687, + 480, 780, 510, 848, 189, 912, 921, 202, 940, 951, + 219, 0, 0, 0, 0, 0, 187, 0, 193, 200, + 188, 203, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 812, 0, 0, - 0, 0, 830, 0, 807, 0, 0, 0, 0, 829, - 0, 0, 0, 0, 0, 0, 822, 0, 0, 0, - 0, 831, 808, 914, 0, 0, 809, 0, 810, 811, - 913, 0, 816, 0, 817, 0, 0, 0, 0, 0, - 0, 914, 0, 0, 0, 0, 0, 0, 913 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 804, + 0, 0, 0, 0, 822, 0, 799, 0, 0, 0, + 800, 821, 0, 0, 0, 0, 0, 0, 814, 0, + 0, 0, 801, 823, 802, 906, 0, 0, 0, 803, + 808, 0, 905, 0, 809, 0, 0, 0, 0, 0, + 0, 0, 0, 906, 0, 0, 0, 0, 0, 0, + 905 }; const short int Dhcp6Parser::yycheck_[] = { - 66, 71, 75, 69, 70, 71, 72, 15, 74, 75, - 76, 77, 535, 531, 10, 69, 70, 71, 72, 75, - 739, 69, 75, 739, 739, 69, 739, 69, 69, 739, - 70, 71, 70, 71, 70, 71, 5, 739, 7, 0, - 9, 11, 81, 16, 14, 15, 3, 12, 13, 38, - 39, 8, 25, 39, 40, 41, 42, 43, 44, 88, - 89, 31, 32, 33, 34, 35, 36, 37, 38, 16, - 81, 82, 59, 84, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 16, 3, 75, 76, 6, 37, - 464, 7, 39, 91, 92, 93, 94, 95, 96, 69, - 70, 71, 72, 73, 478, 479, 480, 39, 3, 41, - 42, 6, 155, 45, 46, 47, 155, 87, 133, 3, - 90, 136, 137, 138, 8, 7, 155, 97, 101, 102, - 103, 104, 3, 7, 130, 105, 106, 8, 7, 109, - 127, 128, 129, 139, 140, 141, 3, 88, 89, 6, - 31, 32, 33, 34, 39, 36, 7, 38, 39, 155, - 3, 880, 7, 6, 880, 880, 155, 880, 38, 155, - 880, 158, 3, 3, 3, 3, 6, 8, 880, 8, - 61, 62, 155, 64, 65, 155, 155, 156, 157, 158, - 3, 6, 3, 74, 4, 8, 77, 8, 7, 31, - 32, 33, 34, 73, 85, 7, 38, 7, 155, 79, - 80, 81, 82, 83, 84, 3, 48, 7, 50, 8, - 8, 3, 38, 155, 56, 3, 8, 745, 60, 61, - 62, 63, 64, 65, 7, 51, 52, 53, 54, 55, - 56, 57, 74, 766, 38, 77, 78, 132, 7, 134, - 135, 3, 3, 85, 320, 49, 8, 8, 74, 3, - 3, 77, 56, 57, 8, 8, 3, 3, 3, 8, - 155, 8, 8, 8, 155, 4, 3, 3, 3, 3, - 74, 8, 8, 77, 8, 155, 3, 3, 3, 3, - 3, 8, 8, 8, 8, 8, 4, 363, 66, 67, - 68, 367, 310, 311, 374, 98, 99, 100, 374, 363, - 4, 58, 59, 367, 4, 363, 124, 125, 384, 363, - 374, 363, 363, 155, 107, 108, 399, 367, 394, 367, - 384, 367, 4, 399, 374, 4, 374, 4, 374, 155, - 4, 4, 4, 399, 4, 4, 399, 17, 18, 19, - 20, 4, 418, 8, 4, 4, 8, 3, 155, 4, - 4, 155, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 8, - 3, 156, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 155, 4, 4, - 156, 156, 4, 4, 156, 156, 4, 425, 426, 427, - 4, 4, 4, 4, 4, 4, 156, 4, 4, 4, - 158, 4, 4, 4, 4, 4, 4, 156, 158, 4, - 4, 4, 4, 4, 4, 4, 4, 156, 4, 156, - 523, 524, 156, 4, 4, 4, 4, 523, 524, 4, - 4, 4, 4, 4, 156, 4, 4, 4, 4, 535, - 158, 537, 158, 158, 4, 4, 158, 4, 4, 156, - 4, 156, 156, 4, 4, 158, 4, 158, 4, 4, - 158, 499, 126, 7, 7, 7, 7, 7, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 155, 516, 7, - 7, 7, 7, 5, 5, 5, 155, 155, 7, 155, - 5, 7, 155, 155, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 155, 7, 155, 155, 155, - 155, 131, 7, 7, 7, 7, 7, 7, 7, 7, - 4, 86, 4, 4, 4, 4, 3, 457, 6, 3, - 6, 6, 3, 6, 3, 158, 6, 3, 6, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 3, 530, - 6, 155, 6, 3, 6, 3, 3, 8, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 156, - 5, 156, 6, 156, 158, 4, 8, 8, 4, 156, - 156, 8, 3, 8, 7, 4, 156, 4, 4, 4, - 320, 5, 156, 156, 156, 156, 7, 4, 156, 4, - 4, 156, 155, 155, 4, 522, 155, 517, 155, 344, - 727, 524, 348, 742, 745, 752, 155, 155, 750, 402, - 759, 732, 730, 363, 727, 741, 880, 733, 735, 738, - 394, 727, 155, 736, 730, 736, 739, 733, 155, 367, - 736, 155, 155, 739, 747, 155, 730, 158, 156, 155, - 736, 747, 730, 736, 750, 739, 730, 156, 730, 730, - 158, 739, 776, 747, 73, 739, 399, 739, 739, 156, - 766, 739, 155, 739, 778, 384, 781, 779, 374, 779, - 776, 748, 885, 779, 782, 784, 782, 766, 770, 537, - 713, 418, 776, 907, 924, 779, 936, 953, 782, -1, - -1, -1, -1, -1, -1, -1, 776, -1, 776, 779, - 776, 779, -1, 779, -1, -1, -1, -1, -1, -1, + 66, 530, 75, 69, 70, 71, 72, 69, 74, 75, + 76, 77, 526, 10, 75, 69, 70, 71, 72, 69, + 11, 69, 75, 14, 15, 731, 69, 15, 70, 71, + 70, 71, 70, 71, 5, 731, 7, 731, 9, 731, + 31, 32, 33, 34, 35, 36, 37, 38, 731, 731, + 16, 78, 63, 64, 65, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 16, 85, 86, 7, 16, + 0, 38, 7, 39, 25, 66, 67, 68, 69, 70, + 7, 38, 38, 39, 51, 52, 53, 54, 55, 56, + 12, 13, 39, 84, 41, 42, 87, 3, 45, 46, + 47, 3, 8, 94, 71, 3, 8, 74, 6, 153, + 39, 102, 103, 70, 460, 106, 72, 73, 7, 76, + 77, 78, 79, 80, 81, 38, 153, 473, 474, 475, + 3, 128, 3, 3, 153, 8, 49, 8, 8, 3, + 137, 138, 139, 56, 8, 7, 3, 98, 99, 100, + 101, 8, 3, 7, 3, 3, 153, 8, 71, 8, + 8, 74, 153, 95, 96, 97, 872, 39, 40, 41, + 42, 43, 44, 7, 3, 7, 872, 7, 872, 8, + 872, 7, 153, 154, 155, 156, 153, 153, 7, 872, + 872, 31, 32, 33, 34, 3, 153, 153, 38, 37, + 8, 130, 153, 132, 133, 7, 153, 6, 48, 3, + 50, 4, 124, 125, 126, 127, 56, 57, 58, 59, + 60, 61, 62, 737, 153, 31, 32, 33, 34, 758, + 36, 71, 38, 39, 74, 75, 3, 8, 3, 8, + 153, 8, 82, 8, 156, 88, 89, 90, 91, 92, + 93, 317, 58, 59, 131, 61, 62, 134, 135, 136, + 3, 3, 3, 6, 3, 71, 8, 8, 74, 8, + 3, 3, 3, 3, 3, 8, 82, 8, 8, 8, + 3, 153, 3, 3, 3, 8, 4, 8, 8, 17, + 18, 19, 20, 3, 360, 4, 6, 363, 360, 78, + 79, 4, 81, 4, 370, 3, 360, 4, 6, 363, + 360, 4, 360, 153, 380, 3, 370, 360, 6, 307, + 308, 363, 395, 363, 390, 363, 380, 4, 370, 395, + 370, 4, 370, 4, 395, 85, 86, 121, 122, 4, + 104, 105, 395, 4, 4, 4, 8, 153, 414, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 4, 4, 8, 3, + 153, 4, 4, 8, 3, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 153, 4, 4, 4, 4, + 4, 4, 154, 154, 4, 154, 154, 154, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 154, 4, + 4, 4, 156, 4, 4, 4, 4, 4, 4, 154, + 156, 4, 4, 421, 422, 423, 4, 4, 4, 4, + 4, 154, 4, 154, 4, 518, 519, 154, 4, 4, + 4, 4, 518, 519, 4, 4, 4, 4, 154, 4, + 4, 4, 156, 4, 530, 156, 532, 156, 4, 4, + 156, 4, 4, 154, 4, 154, 154, 4, 4, 4, + 156, 156, 156, 4, 4, 7, 153, 153, 7, 7, + 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, + 153, 153, 7, 7, 7, 7, 494, 5, 5, 5, + 153, 5, 7, 153, 7, 153, 153, 153, 153, 153, + 153, 153, 153, 511, 153, 123, 7, 153, 7, 7, + 7, 7, 153, 7, 7, 7, 7, 83, 4, 4, + 4, 4, 4, 129, 153, 6, 3, 6, 3, 3, + 6, 153, 153, 6, 153, 3, 153, 6, 3, 6, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 153, 6, 3, 6, 6, 3, 5, 4, 8, + 4, 4, 4, 154, 4, 154, 156, 4, 4, 4, + 4, 4, 3, 156, 6, 154, 154, 154, 4, 8, + 8, 4, 154, 154, 8, 3, 8, 7, 4, 4, + 4, 4, 154, 5, 154, 154, 154, 154, 7, 153, + 4, 4, 153, 4, 153, 153, 4, 317, 453, 153, + 153, 525, 512, 341, 517, 519, 719, 734, 153, 153, + 345, 737, 744, 742, 398, 751, 719, 724, 722, 733, + 872, 727, 153, 719, 153, 728, 722, 725, 731, 725, + 722, 360, 728, 153, 156, 731, 739, 728, 722, 731, + 154, 153, 722, 739, 722, 728, 742, 731, 153, 722, + 395, 731, 73, 731, 390, 739, 156, 154, 731, 731, + 770, 730, 758, 731, 154, 728, 768, 776, 773, 363, + 771, 370, 768, 740, 774, 771, 877, 758, 774, 532, + 380, 705, 414, 762, 768, 899, 916, 771, 928, 945, + 774, -1, -1, -1, -1, -1, 768, -1, 768, 771, + 768, 771, -1, 771, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 880, -1, -1, - -1, -1, 885, -1, 880, -1, -1, -1, -1, 885, - -1, -1, -1, -1, -1, -1, 880, -1, -1, -1, - -1, 885, 880, 906, -1, -1, 880, -1, 880, 880, - 906, -1, 880, -1, 880, -1, -1, -1, -1, -1, - -1, 924, -1, -1, -1, -1, -1, -1, 924 + -1, -1, -1, -1, -1, -1, -1, -1, -1, 872, + -1, -1, -1, -1, 877, -1, 872, -1, -1, -1, + 872, 877, -1, -1, -1, -1, -1, -1, 872, -1, + -1, -1, 872, 877, 872, 898, -1, -1, -1, 872, + 872, -1, 898, -1, 872, -1, -1, -1, -1, -1, + -1, -1, -1, 916, -1, -1, -1, -1, -1, -1, + 916 }; const unsigned short int Dhcp6Parser::yystos_[] = { - 0, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 0, 5, - 7, 9, 155, 156, 157, 158, 174, 175, 176, 181, - 7, 190, 7, 196, 7, 207, 7, 284, 7, 361, - 7, 378, 7, 395, 7, 313, 7, 319, 7, 343, - 7, 260, 7, 453, 182, 177, 191, 197, 208, 285, - 362, 379, 396, 314, 320, 344, 261, 454, 174, 183, - 184, 155, 179, 180, 10, 130, 139, 140, 141, 155, - 189, 192, 193, 194, 480, 482, 484, 486, 11, 14, - 15, 31, 32, 33, 34, 35, 36, 37, 38, 69, - 70, 71, 72, 73, 87, 90, 97, 105, 106, 109, - 189, 198, 199, 200, 201, 202, 203, 204, 205, 214, - 216, 240, 246, 252, 254, 268, 278, 303, 311, 337, - 418, 430, 442, 443, 451, 12, 13, 209, 210, 211, - 213, 48, 50, 56, 60, 61, 62, 63, 64, 65, - 74, 77, 78, 85, 189, 200, 201, 202, 203, 286, - 287, 288, 290, 292, 294, 296, 298, 301, 302, 337, - 355, 367, 372, 389, 414, 49, 57, 189, 294, 296, - 337, 363, 364, 365, 367, 369, 51, 52, 53, 54, - 55, 189, 294, 296, 337, 367, 369, 380, 381, 382, - 384, 385, 387, 388, 73, 79, 80, 81, 82, 83, - 84, 189, 337, 397, 398, 399, 400, 402, 404, 406, - 408, 410, 412, 311, 16, 39, 41, 42, 45, 46, - 47, 189, 230, 321, 322, 323, 324, 325, 326, 327, - 329, 331, 333, 334, 336, 40, 43, 44, 189, 230, - 325, 331, 345, 346, 347, 348, 349, 351, 352, 353, - 354, 88, 89, 189, 262, 263, 264, 266, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 189, 455, 456, 457, 458, 460, 462, 463, - 465, 466, 467, 470, 472, 473, 474, 475, 478, 6, - 3, 4, 8, 3, 195, 487, 481, 483, 485, 4, - 3, 8, 206, 215, 217, 4, 4, 4, 4, 4, - 279, 312, 338, 304, 241, 253, 247, 419, 255, 269, - 431, 4, 444, 452, 3, 8, 212, 4, 3, 8, - 356, 373, 368, 289, 291, 293, 4, 4, 299, 297, - 295, 390, 415, 3, 8, 366, 370, 3, 8, 383, - 4, 386, 4, 4, 3, 8, 413, 401, 403, 405, - 407, 409, 411, 8, 3, 8, 328, 231, 4, 332, - 330, 335, 4, 8, 3, 350, 4, 4, 8, 3, - 265, 267, 3, 8, 4, 459, 461, 4, 464, 4, - 4, 468, 471, 4, 4, 4, 476, 479, 3, 8, - 174, 174, 155, 4, 4, 4, 4, 4, 193, 4, - 4, 4, 156, 156, 156, 156, 156, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 156, 4, - 4, 199, 4, 158, 210, 4, 4, 4, 4, 4, - 4, 156, 158, 4, 4, 4, 4, 4, 287, 4, - 4, 364, 4, 156, 4, 156, 156, 381, 4, 4, - 4, 4, 4, 4, 4, 399, 4, 4, 156, 4, - 4, 4, 158, 323, 4, 158, 158, 347, 4, 4, - 263, 158, 4, 4, 156, 4, 156, 156, 4, 4, - 158, 158, 158, 4, 4, 456, 4, 7, 7, 174, - 174, 174, 7, 7, 7, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 7, 7, 7, 7, 5, 185, - 5, 5, 176, 178, 155, 155, 155, 66, 67, 68, - 300, 185, 155, 5, 7, 155, 58, 59, 371, 155, - 155, 185, 185, 185, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 174, 155, 155, 155, 124, - 125, 469, 126, 59, 127, 128, 129, 158, 477, 155, - 174, 198, 131, 488, 489, 490, 209, 16, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 189, 218, - 219, 220, 223, 225, 227, 229, 230, 232, 233, 234, - 235, 236, 238, 218, 7, 280, 281, 282, 7, 315, - 316, 317, 7, 339, 340, 341, 7, 305, 306, 307, - 81, 155, 242, 243, 244, 245, 183, 82, 84, 244, - 248, 249, 250, 251, 7, 420, 421, 7, 256, 257, - 258, 91, 92, 93, 94, 95, 96, 270, 271, 272, - 273, 274, 275, 276, 277, 16, 101, 102, 103, 104, - 189, 232, 432, 433, 434, 437, 438, 440, 441, 107, - 108, 445, 446, 447, 449, 455, 186, 7, 357, 358, - 359, 7, 374, 375, 376, 7, 391, 392, 393, 86, - 416, 8, 491, 3, 8, 8, 221, 224, 226, 228, - 4, 4, 4, 4, 4, 237, 239, 3, 8, 8, - 283, 6, 3, 318, 6, 3, 342, 6, 3, 308, - 6, 3, 3, 6, 6, 3, 6, 422, 3, 6, - 259, 6, 3, 4, 4, 4, 4, 4, 4, 3, - 8, 435, 439, 4, 4, 4, 3, 8, 448, 450, - 3, 8, 8, 155, 187, 188, 360, 6, 3, 377, - 6, 3, 394, 6, 3, 417, 8, 4, 489, 4, - 4, 4, 4, 156, 158, 156, 158, 156, 4, 4, - 219, 286, 282, 321, 317, 345, 341, 189, 200, 201, - 202, 203, 230, 278, 290, 292, 294, 296, 298, 302, - 309, 310, 337, 414, 307, 243, 249, 75, 76, 189, - 230, 337, 423, 424, 425, 426, 427, 429, 421, 262, - 258, 156, 156, 156, 156, 156, 156, 271, 4, 4, - 156, 156, 156, 433, 4, 4, 446, 6, 3, 363, - 359, 380, 376, 397, 393, 4, 5, 17, 18, 19, - 20, 222, 155, 155, 155, 155, 155, 8, 8, 8, - 3, 8, 428, 4, 8, 3, 8, 98, 99, 100, - 436, 155, 155, 155, 155, 8, 8, 8, 155, 7, - 492, 493, 310, 4, 158, 425, 494, 3, 6, 155, - 132, 134, 135, 189, 230, 495, 496, 497, 498, 500, - 493, 501, 4, 499, 3, 8, 4, 156, 4, 496, - 5, 155, 7, 502, 503, 504, 3, 6, 133, 136, - 137, 138, 505, 506, 507, 509, 510, 511, 503, 508, - 4, 4, 4, 3, 8, 4, 158, 156, 156, 506, - 155 + 0, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 0, 5, + 7, 9, 153, 154, 155, 156, 172, 173, 174, 179, + 7, 188, 7, 194, 7, 205, 7, 282, 7, 359, + 7, 373, 7, 390, 7, 311, 7, 317, 7, 341, + 7, 258, 7, 448, 180, 175, 189, 195, 206, 283, + 360, 374, 391, 312, 318, 342, 259, 449, 172, 181, + 182, 153, 177, 178, 10, 128, 137, 138, 139, 153, + 187, 190, 191, 192, 475, 477, 479, 481, 11, 14, + 15, 31, 32, 33, 34, 35, 36, 37, 38, 66, + 67, 68, 69, 70, 84, 87, 94, 102, 103, 106, + 187, 196, 197, 198, 199, 200, 201, 202, 203, 212, + 214, 238, 244, 250, 252, 266, 276, 301, 309, 335, + 413, 425, 437, 438, 446, 12, 13, 207, 208, 209, + 211, 48, 50, 56, 57, 58, 59, 60, 61, 62, + 71, 74, 75, 82, 187, 198, 199, 200, 201, 284, + 285, 286, 288, 290, 292, 294, 296, 299, 300, 335, + 353, 365, 367, 384, 409, 49, 187, 292, 294, 335, + 361, 362, 363, 365, 51, 52, 53, 54, 55, 187, + 292, 294, 335, 365, 375, 376, 377, 379, 380, 382, + 383, 70, 76, 77, 78, 79, 80, 81, 187, 335, + 392, 393, 394, 395, 397, 399, 401, 403, 405, 407, + 309, 16, 39, 41, 42, 45, 46, 47, 187, 228, + 319, 320, 321, 322, 323, 324, 325, 327, 329, 331, + 332, 334, 40, 43, 44, 187, 228, 323, 329, 343, + 344, 345, 346, 347, 349, 350, 351, 352, 85, 86, + 187, 260, 261, 262, 264, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 187, + 450, 451, 452, 453, 455, 457, 458, 460, 461, 462, + 465, 467, 468, 469, 470, 473, 6, 3, 4, 8, + 3, 193, 482, 476, 478, 480, 4, 3, 8, 204, + 213, 215, 4, 4, 4, 4, 4, 277, 310, 336, + 302, 239, 251, 245, 414, 253, 267, 426, 4, 439, + 447, 3, 8, 210, 4, 3, 8, 354, 368, 366, + 287, 289, 291, 4, 4, 297, 295, 293, 385, 410, + 3, 8, 364, 3, 8, 378, 4, 381, 4, 4, + 3, 8, 408, 396, 398, 400, 402, 404, 406, 8, + 3, 8, 326, 229, 4, 330, 328, 333, 4, 8, + 3, 348, 4, 4, 8, 3, 263, 265, 3, 8, + 4, 454, 456, 4, 459, 4, 4, 463, 466, 4, + 4, 4, 471, 474, 3, 8, 172, 172, 153, 4, + 4, 4, 4, 4, 191, 4, 4, 4, 154, 154, + 154, 154, 154, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 154, 4, 4, 197, 4, 156, + 208, 4, 4, 4, 4, 4, 4, 154, 156, 4, + 4, 4, 4, 4, 285, 4, 362, 4, 154, 4, + 154, 154, 376, 4, 4, 4, 4, 4, 4, 4, + 394, 4, 4, 154, 4, 4, 4, 156, 321, 4, + 156, 156, 345, 4, 4, 261, 156, 4, 4, 154, + 4, 154, 154, 4, 4, 156, 156, 156, 4, 4, + 451, 4, 7, 7, 172, 172, 172, 7, 7, 7, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, + 7, 7, 7, 5, 183, 5, 5, 174, 176, 153, + 153, 153, 63, 64, 65, 298, 183, 153, 5, 7, + 153, 153, 153, 183, 183, 183, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 172, 153, 153, + 153, 121, 122, 464, 123, 124, 125, 126, 127, 156, + 472, 153, 172, 196, 129, 483, 484, 485, 207, 16, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 187, 216, 217, 218, 221, 223, 225, 227, 228, 230, + 231, 232, 233, 234, 236, 216, 7, 278, 279, 280, + 7, 313, 314, 315, 7, 337, 338, 339, 7, 303, + 304, 305, 78, 153, 240, 241, 242, 243, 181, 79, + 81, 242, 246, 247, 248, 249, 7, 415, 416, 7, + 254, 255, 256, 88, 89, 90, 91, 92, 93, 268, + 269, 270, 271, 272, 273, 274, 275, 16, 98, 99, + 100, 101, 187, 230, 427, 428, 429, 432, 433, 435, + 436, 104, 105, 440, 441, 442, 444, 450, 184, 7, + 355, 356, 357, 7, 369, 370, 371, 7, 386, 387, + 388, 83, 411, 8, 486, 3, 8, 8, 219, 222, + 224, 226, 4, 4, 4, 4, 4, 235, 237, 3, + 8, 8, 281, 6, 3, 316, 6, 3, 340, 6, + 3, 306, 6, 3, 3, 6, 6, 3, 6, 417, + 3, 6, 257, 6, 3, 4, 4, 4, 4, 4, + 4, 3, 8, 430, 434, 4, 4, 4, 3, 8, + 443, 445, 3, 8, 8, 153, 185, 186, 358, 6, + 3, 372, 6, 3, 389, 6, 3, 412, 8, 4, + 484, 4, 4, 4, 4, 154, 156, 154, 156, 154, + 4, 4, 217, 284, 280, 319, 315, 343, 339, 187, + 198, 199, 200, 201, 228, 276, 288, 290, 292, 294, + 296, 300, 307, 308, 335, 409, 305, 241, 247, 72, + 73, 187, 228, 335, 418, 419, 420, 421, 422, 424, + 416, 260, 256, 154, 154, 154, 154, 154, 154, 269, + 4, 4, 154, 154, 154, 428, 4, 4, 441, 6, + 3, 361, 357, 375, 371, 392, 388, 4, 5, 17, + 18, 19, 20, 220, 153, 153, 153, 153, 153, 8, + 8, 8, 3, 8, 423, 4, 8, 3, 8, 95, + 96, 97, 431, 153, 153, 153, 153, 8, 8, 8, + 153, 7, 487, 488, 308, 4, 156, 420, 489, 3, + 6, 153, 130, 132, 133, 187, 228, 490, 491, 492, + 493, 495, 488, 496, 4, 494, 3, 8, 4, 154, + 4, 491, 5, 153, 7, 497, 498, 499, 3, 6, + 131, 134, 135, 136, 500, 501, 502, 504, 505, 506, + 498, 503, 4, 4, 4, 3, 8, 4, 156, 154, + 154, 501, 153 }; const unsigned short int Dhcp6Parser::yyr1_[] = { - 0, 159, 161, 160, 162, 160, 163, 160, 164, 160, - 165, 160, 166, 160, 167, 160, 168, 160, 169, 160, - 170, 160, 171, 160, 172, 160, 173, 160, 174, 174, - 174, 174, 174, 174, 174, 175, 177, 176, 178, 179, - 179, 180, 180, 182, 181, 183, 183, 184, 184, 186, - 185, 187, 187, 188, 188, 189, 191, 190, 192, 192, - 193, 193, 193, 193, 193, 193, 195, 194, 197, 196, - 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 200, 201, 202, 203, 204, - 206, 205, 208, 207, 209, 209, 210, 210, 212, 211, - 213, 215, 214, 217, 216, 218, 218, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 221, 220, 222, 222, 222, 222, 224, 223, 226, 225, - 228, 227, 229, 231, 230, 232, 233, 234, 235, 237, - 236, 239, 238, 241, 240, 242, 242, 243, 243, 244, - 245, 247, 246, 248, 248, 249, 249, 249, 250, 251, - 253, 252, 255, 254, 256, 256, 257, 257, 259, 258, - 261, 260, 262, 262, 262, 263, 263, 265, 264, 267, - 266, 269, 268, 270, 270, 271, 271, 271, 271, 271, - 271, 272, 273, 274, 275, 276, 277, 279, 278, 280, - 280, 281, 281, 283, 282, 285, 284, 286, 286, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 289, 288, - 291, 290, 293, 292, 295, 294, 297, 296, 299, 298, - 300, 300, 300, 301, 302, 304, 303, 305, 305, 306, - 306, 308, 307, 309, 309, 310, 310, 310, 310, 310, - 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, - 312, 311, 314, 313, 315, 315, 316, 316, 318, 317, - 320, 319, 321, 321, 322, 322, 323, 323, 323, 323, - 323, 323, 323, 323, 324, 325, 326, 328, 327, 330, - 329, 332, 331, 333, 335, 334, 336, 338, 337, 339, - 339, 340, 340, 342, 341, 344, 343, 345, 345, 346, - 346, 347, 347, 347, 347, 347, 347, 347, 348, 350, - 349, 351, 352, 353, 354, 356, 355, 357, 357, 358, - 358, 360, 359, 362, 361, 363, 363, 364, 364, 364, - 364, 364, 364, 364, 366, 365, 368, 367, 370, 369, - 371, 371, 373, 372, 374, 374, 375, 375, 377, 376, - 379, 378, 380, 380, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 383, 382, 384, 386, 385, - 387, 388, 390, 389, 391, 391, 392, 392, 394, 393, - 396, 395, 397, 397, 398, 398, 399, 399, 399, 399, - 399, 399, 399, 399, 399, 401, 400, 403, 402, 405, - 404, 407, 406, 409, 408, 411, 410, 413, 412, 415, - 414, 417, 416, 419, 418, 420, 420, 422, 421, 423, - 423, 424, 424, 425, 425, 425, 425, 425, 426, 428, - 427, 429, 431, 430, 432, 432, 433, 433, 433, 433, - 433, 433, 433, 435, 434, 436, 436, 436, 437, 439, - 438, 440, 441, 442, 444, 443, 445, 445, 446, 446, - 448, 447, 450, 449, 452, 451, 454, 453, 455, 455, - 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, - 456, 456, 456, 456, 456, 457, 459, 458, 461, 460, - 462, 464, 463, 465, 466, 468, 467, 469, 469, 471, - 470, 472, 473, 474, 476, 475, 477, 477, 477, 477, - 477, 479, 478, 481, 480, 483, 482, 485, 484, 487, - 486, 488, 488, 489, 491, 490, 492, 492, 494, 493, - 495, 495, 496, 496, 496, 496, 496, 497, 499, 498, - 501, 500, 502, 502, 504, 503, 505, 505, 506, 506, - 506, 506, 508, 507, 509, 510, 511 + 0, 157, 159, 158, 160, 158, 161, 158, 162, 158, + 163, 158, 164, 158, 165, 158, 166, 158, 167, 158, + 168, 158, 169, 158, 170, 158, 171, 158, 172, 172, + 172, 172, 172, 172, 172, 173, 175, 174, 176, 177, + 177, 178, 178, 180, 179, 181, 181, 182, 182, 184, + 183, 185, 185, 186, 186, 187, 189, 188, 190, 190, + 191, 191, 191, 191, 191, 191, 193, 192, 195, 194, + 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 198, 199, 200, 201, 202, + 204, 203, 206, 205, 207, 207, 208, 208, 210, 209, + 211, 213, 212, 215, 214, 216, 216, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 219, 218, 220, 220, 220, 220, 222, 221, 224, 223, + 226, 225, 227, 229, 228, 230, 231, 232, 233, 235, + 234, 237, 236, 239, 238, 240, 240, 241, 241, 242, + 243, 245, 244, 246, 246, 247, 247, 247, 248, 249, + 251, 250, 253, 252, 254, 254, 255, 255, 257, 256, + 259, 258, 260, 260, 260, 261, 261, 263, 262, 265, + 264, 267, 266, 268, 268, 269, 269, 269, 269, 269, + 269, 270, 271, 272, 273, 274, 275, 277, 276, 278, + 278, 279, 279, 281, 280, 283, 282, 284, 284, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 287, 286, + 289, 288, 291, 290, 293, 292, 295, 294, 297, 296, + 298, 298, 298, 299, 300, 302, 301, 303, 303, 304, + 304, 306, 305, 307, 307, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 310, 309, 312, 311, 313, 313, 314, 314, 316, 315, + 318, 317, 319, 319, 320, 320, 321, 321, 321, 321, + 321, 321, 321, 321, 322, 323, 324, 326, 325, 328, + 327, 330, 329, 331, 333, 332, 334, 336, 335, 337, + 337, 338, 338, 340, 339, 342, 341, 343, 343, 344, + 344, 345, 345, 345, 345, 345, 345, 345, 346, 348, + 347, 349, 350, 351, 352, 354, 353, 355, 355, 356, + 356, 358, 357, 360, 359, 361, 361, 362, 362, 362, + 362, 362, 362, 364, 363, 366, 365, 368, 367, 369, + 369, 370, 370, 372, 371, 374, 373, 375, 375, 376, + 376, 376, 376, 376, 376, 376, 376, 376, 376, 378, + 377, 379, 381, 380, 382, 383, 385, 384, 386, 386, + 387, 387, 389, 388, 391, 390, 392, 392, 393, 393, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 396, + 395, 398, 397, 400, 399, 402, 401, 404, 403, 406, + 405, 408, 407, 410, 409, 412, 411, 414, 413, 415, + 415, 417, 416, 418, 418, 419, 419, 420, 420, 420, + 420, 420, 421, 423, 422, 424, 426, 425, 427, 427, + 428, 428, 428, 428, 428, 428, 428, 430, 429, 431, + 431, 431, 432, 434, 433, 435, 436, 437, 439, 438, + 440, 440, 441, 441, 443, 442, 445, 444, 447, 446, + 449, 448, 450, 450, 451, 451, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 451, 451, 451, 451, 452, + 454, 453, 456, 455, 457, 459, 458, 460, 461, 463, + 462, 464, 464, 466, 465, 467, 468, 469, 471, 470, + 472, 472, 472, 472, 472, 474, 473, 476, 475, 478, + 477, 480, 479, 482, 481, 483, 483, 484, 486, 485, + 487, 487, 489, 488, 490, 490, 491, 491, 491, 491, + 491, 492, 494, 493, 496, 495, 497, 497, 499, 498, + 500, 500, 501, 501, 501, 501, 503, 502, 504, 505, + 506 }; const unsigned char @@ -4293,29 +4249,29 @@ namespace isc { namespace dhcp { 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, - 1, 1, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 3, 0, 4, - 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, + 1, 1, 1, 0, 4, 0, 4, 0, 6, 0, + 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 4, 3, 0, 4, 3, 3, 0, 6, 0, 1, + 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 6, 0, 4, 0, 6, 1, 3, 0, 4, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 0, - 4, 3, 0, 6, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 0, 4, 1, 1, 1, 3, 0, - 4, 3, 3, 3, 0, 6, 1, 3, 1, 1, - 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 0, 4, 0, 4, - 3, 0, 4, 3, 3, 0, 4, 1, 1, 0, - 4, 3, 3, 3, 0, 4, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 6, 1, 3, 1, 0, 6, 1, 3, 0, 4, - 1, 3, 1, 1, 1, 1, 1, 3, 0, 4, - 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, - 1, 1, 0, 4, 3, 3, 3 + 4, 0, 4, 0, 6, 0, 4, 0, 6, 1, + 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 0, 4, 3, 0, 6, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, + 1, 1, 3, 0, 4, 3, 3, 3, 0, 6, + 1, 3, 1, 1, 0, 4, 0, 4, 0, 6, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 0, 4, 0, 4, 3, 0, 4, 3, 3, 0, + 4, 1, 1, 0, 4, 3, 3, 3, 0, 4, + 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 6, 1, 3, 1, 0, 6, + 1, 3, 0, 4, 1, 3, 1, 1, 1, 1, + 1, 3, 0, 4, 0, 6, 1, 3, 0, 4, + 1, 3, 1, 1, 1, 1, 0, 4, 3, 3, + 3 }; @@ -4339,9 +4295,8 @@ namespace isc { namespace dhcp { "\"record-types\"", "\"encapsulate\"", "\"array\"", "\"pools\"", "\"pool\"", "\"pd-pools\"", "\"prefix\"", "\"prefix-len\"", "\"excluded-prefix\"", "\"excluded-prefix-len\"", "\"delegated-len\"", - "\"user-context\"", "\"known-clients\"", "\"only\"", "\"never\"", - "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", - "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", + "\"user-context\"", "\"subnet\"", "\"interface\"", "\"interface-id\"", + "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", "\"client-classes\"", "\"eval-client-classes\"", "\"test\"", @@ -4361,27 +4316,27 @@ namespace isc { namespace dhcp { "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", "\"override-no-update\"", "\"override-client-update\"", "\"replace-client-name\"", "\"generated-prefix\"", "\"UDP\"", "\"TCP\"", - "\"JSON\"", "\"when-present\"", "\"always\"", "\"when-not-present\"", - "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", - "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", - "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", "\"Control-agent\"", - "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", "SUB_INTERFACES6", - "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", "SUB_RESERVATION", - "SUB_OPTION_DEFS", "SUB_OPTION_DEF", "SUB_OPTION_DATA", - "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", "\"constant string\"", - "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start", - "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", - "$@11", "$@12", "$@13", "value", "sub_json", "map2", "$@14", "map_value", - "map_content", "not_empty_map", "list_generic", "$@15", "list_content", - "not_empty_list", "list_strings", "$@16", "list_strings_content", - "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@17", - "global_objects", "global_object", "dhcp6_object", "$@18", "sub_dhcp6", - "$@19", "global_params", "global_param", "preferred_lifetime", - "valid_lifetime", "renew_timer", "rebind_timer", - "decline_probation_period", "interfaces_config", "$@20", - "sub_interfaces6", "$@21", "interfaces_config_params", - "interfaces_config_param", "interfaces_list", "$@22", "re_detect", - "lease_database", "$@23", "hosts_database", "$@24", + "\"JSON\"", "\"when-present\"", "\"never\"", "\"always\"", + "\"when-not-present\"", "\"Logging\"", "\"loggers\"", + "\"output_options\"", "\"output\"", "\"debuglevel\"", "\"severity\"", + "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", + "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", + "SUB_INTERFACES6", "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", + "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", + "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", + "\"constant string\"", "\"integer\"", "\"floating point\"", + "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", + "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", "value", + "sub_json", "map2", "$@14", "map_value", "map_content", "not_empty_map", + "list_generic", "$@15", "list_content", "not_empty_list", "list_strings", + "$@16", "list_strings_content", "not_empty_list_strings", + "unknown_map_entry", "syntax_map", "$@17", "global_objects", + "global_object", "dhcp6_object", "$@18", "sub_dhcp6", "$@19", + "global_params", "global_param", "preferred_lifetime", "valid_lifetime", + "renew_timer", "rebind_timer", "decline_probation_period", + "interfaces_config", "$@20", "sub_interfaces6", "$@21", + "interfaces_config_params", "interfaces_config_param", "interfaces_list", + "$@22", "re_detect", "lease_database", "$@23", "hosts_database", "$@24", "database_map_params", "database_map_param", "database_type", "$@25", "db_type", "user", "$@26", "password", "$@27", "host", "$@28", "port", "name", "$@29", "persist", "lfc_interval", "readonly", "connect_timeout", @@ -4420,39 +4375,38 @@ namespace isc { namespace dhcp { "option_data_always_send", "pools_list", "$@64", "pools_list_content", "not_empty_pools_list", "pool_list_entry", "$@65", "sub_pool6", "$@66", "pool_params", "pool_param", "pool_entry", "$@67", "user_context", - "$@68", "known_clients", "$@69", "known_clients_value", "pd_pools_list", - "$@70", "pd_pools_list_content", "not_empty_pd_pools_list", - "pd_pool_entry", "$@71", "sub_pd_pool", "$@72", "pd_pool_params", - "pd_pool_param", "pd_prefix", "$@73", "pd_prefix_len", "excluded_prefix", - "$@74", "excluded_prefix_len", "pd_delegated_len", "reservations", - "$@75", "reservations_list", "not_empty_reservations_list", - "reservation", "$@76", "sub_reservation", "$@77", "reservation_params", - "not_empty_reservation_params", "reservation_param", "ip_addresses", - "$@78", "prefixes", "$@79", "duid", "$@80", "hw_address", "$@81", - "hostname", "$@82", "flex_id_value", "$@83", - "reservation_client_classes", "$@84", "relay", "$@85", "relay_map", - "$@86", "client_classes", "$@87", "client_classes_list", - "client_class_entry", "$@88", "client_class_params", + "$@68", "pd_pools_list", "$@69", "pd_pools_list_content", + "not_empty_pd_pools_list", "pd_pool_entry", "$@70", "sub_pd_pool", + "$@71", "pd_pool_params", "pd_pool_param", "pd_prefix", "$@72", + "pd_prefix_len", "excluded_prefix", "$@73", "excluded_prefix_len", + "pd_delegated_len", "reservations", "$@74", "reservations_list", + "not_empty_reservations_list", "reservation", "$@75", "sub_reservation", + "$@76", "reservation_params", "not_empty_reservation_params", + "reservation_param", "ip_addresses", "$@77", "prefixes", "$@78", "duid", + "$@79", "hw_address", "$@80", "hostname", "$@81", "flex_id_value", + "$@82", "reservation_client_classes", "$@83", "relay", "$@84", + "relay_map", "$@85", "client_classes", "$@86", "client_classes_list", + "client_class_entry", "$@87", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@89", "eval_on_demand", - "server_id", "$@90", "server_id_params", "server_id_param", - "server_id_type", "$@91", "duid_type", "htype", "identifier", "$@92", - "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@93", - "control_socket_params", "control_socket_param", "socket_type", "$@94", - "socket_name", "$@95", "dhcp_ddns", "$@96", "sub_dhcp_ddns", "$@97", + "client_class_name", "client_class_test", "$@88", "eval_on_demand", + "server_id", "$@89", "server_id_params", "server_id_param", + "server_id_type", "$@90", "duid_type", "htype", "identifier", "$@91", + "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@92", + "control_socket_params", "control_socket_param", "socket_type", "$@93", + "socket_name", "$@94", "dhcp_ddns", "$@95", "sub_dhcp_ddns", "$@96", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@98", "server_ip", "$@99", "server_port", - "sender_ip", "$@100", "sender_port", "max_queue_size", "ncr_protocol", - "$@101", "ncr_protocol_value", "ncr_format", "$@102", + "qualifying_suffix", "$@97", "server_ip", "$@98", "server_port", + "sender_ip", "$@99", "sender_port", "max_queue_size", "ncr_protocol", + "$@100", "ncr_protocol_value", "ncr_format", "$@101", "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@103", "replace_client_name_value", - "generated_prefix", "$@104", "dhcp4_json_object", "$@105", - "dhcpddns_json_object", "$@106", "control_agent_json_object", "$@107", - "logging_object", "$@108", "logging_params", "logging_param", "loggers", - "$@109", "loggers_entries", "logger_entry", "$@110", "logger_params", - "logger_param", "debuglevel", "severity", "$@111", "output_options_list", - "$@112", "output_options_list_content", "output_entry", "$@113", - "output_params_list", "output_params", "output", "$@114", "flush", + "replace_client_name", "$@102", "replace_client_name_value", + "generated_prefix", "$@103", "dhcp4_json_object", "$@104", + "dhcpddns_json_object", "$@105", "control_agent_json_object", "$@106", + "logging_object", "$@107", "logging_params", "logging_param", "loggers", + "$@108", "loggers_entries", "logger_entry", "$@109", "logger_params", + "logger_param", "debuglevel", "severity", "$@110", "output_options_list", + "$@111", "output_options_list_content", "output_entry", "$@112", + "output_params_list", "output_params", "output", "$@113", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4460,65 +4414,65 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp6Parser::yyrline_[] = { - 0, 241, 241, 241, 242, 242, 243, 243, 244, 244, - 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, - 250, 250, 251, 251, 252, 252, 253, 253, 261, 262, - 263, 264, 265, 266, 267, 270, 275, 275, 286, 289, - 290, 293, 297, 304, 304, 311, 312, 315, 319, 326, - 326, 333, 334, 337, 341, 352, 362, 362, 377, 378, - 382, 383, 384, 385, 386, 387, 390, 390, 405, 405, - 414, 415, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 445, 450, 455, 460, 465, - 470, 470, 481, 481, 490, 491, 494, 495, 498, 498, - 508, 514, 514, 526, 526, 538, 539, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 557, 557, 564, 565, 566, 567, 570, 570, 578, 578, - 586, 586, 594, 599, 599, 607, 612, 617, 622, 627, - 627, 635, 635, 644, 644, 654, 655, 658, 659, 662, - 667, 672, 672, 682, 683, 686, 687, 688, 691, 696, - 703, 703, 713, 713, 723, 724, 727, 728, 731, 731, - 741, 741, 751, 752, 753, 756, 757, 760, 760, 768, - 768, 776, 776, 787, 788, 791, 792, 793, 794, 795, - 796, 799, 804, 809, 814, 819, 824, 832, 832, 845, - 846, 849, 850, 857, 857, 883, 883, 894, 895, 899, - 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, - 910, 911, 912, 913, 914, 915, 916, 917, 920, 920, - 928, 928, 936, 936, 944, 944, 952, 952, 962, 962, - 969, 970, 971, 974, 979, 987, 987, 998, 999, 1003, - 1004, 1007, 1007, 1015, 1016, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, - 1040, 1040, 1053, 1053, 1062, 1063, 1066, 1067, 1072, 1072, - 1087, 1087, 1101, 1102, 1105, 1106, 1109, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1119, 1121, 1126, 1128, 1128, 1136, - 1136, 1144, 1144, 1152, 1154, 1154, 1162, 1171, 1171, 1183, - 1184, 1189, 1190, 1195, 1195, 1207, 1207, 1219, 1220, 1225, - 1226, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1240, 1242, - 1242, 1250, 1252, 1254, 1259, 1267, 1267, 1279, 1280, 1283, - 1284, 1287, 1287, 1297, 1297, 1306, 1307, 1310, 1311, 1312, - 1313, 1314, 1315, 1316, 1319, 1319, 1327, 1327, 1334, 1334, - 1342, 1343, 1349, 1349, 1361, 1362, 1365, 1366, 1369, 1369, - 1381, 1381, 1393, 1394, 1397, 1398, 1399, 1400, 1401, 1402, - 1403, 1404, 1405, 1406, 1407, 1410, 1410, 1418, 1423, 1423, - 1431, 1436, 1444, 1444, 1454, 1455, 1458, 1459, 1462, 1462, - 1471, 1471, 1480, 1481, 1484, 1485, 1489, 1490, 1491, 1492, - 1493, 1494, 1495, 1496, 1497, 1500, 1500, 1510, 1510, 1520, - 1520, 1528, 1528, 1536, 1536, 1544, 1544, 1552, 1552, 1565, - 1565, 1575, 1575, 1586, 1586, 1596, 1597, 1600, 1600, 1610, - 1611, 1614, 1615, 1618, 1619, 1620, 1621, 1622, 1625, 1627, - 1627, 1635, 1643, 1643, 1655, 1656, 1659, 1660, 1661, 1662, - 1663, 1664, 1665, 1668, 1668, 1675, 1676, 1677, 1680, 1685, - 1685, 1693, 1698, 1705, 1712, 1712, 1722, 1723, 1726, 1727, - 1730, 1730, 1738, 1738, 1748, 1748, 1760, 1760, 1770, 1771, - 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, - 1784, 1785, 1786, 1787, 1788, 1791, 1796, 1796, 1804, 1804, - 1812, 1817, 1817, 1825, 1830, 1835, 1835, 1843, 1844, 1847, - 1847, 1855, 1860, 1865, 1870, 1870, 1878, 1881, 1884, 1887, - 1890, 1896, 1896, 1906, 1906, 1913, 1913, 1920, 1920, 1933, - 1933, 1946, 1947, 1951, 1955, 1955, 1967, 1968, 1972, 1972, - 1980, 1981, 1984, 1985, 1986, 1987, 1988, 1991, 1996, 1996, - 2004, 2004, 2014, 2015, 2018, 2018, 2026, 2027, 2030, 2031, - 2032, 2033, 2036, 2036, 2044, 2049, 2054 + 0, 238, 238, 238, 239, 239, 240, 240, 241, 241, + 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, + 247, 247, 248, 248, 249, 249, 250, 250, 258, 259, + 260, 261, 262, 263, 264, 267, 272, 272, 283, 286, + 287, 290, 294, 301, 301, 308, 309, 312, 316, 323, + 323, 330, 331, 334, 338, 349, 359, 359, 374, 375, + 379, 380, 381, 382, 383, 384, 387, 387, 402, 402, + 411, 412, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 442, 447, 452, 457, 462, + 467, 467, 478, 478, 487, 488, 491, 492, 495, 495, + 505, 511, 511, 523, 523, 535, 536, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 554, 554, 561, 562, 563, 564, 567, 567, 575, 575, + 583, 583, 591, 596, 596, 604, 609, 614, 619, 624, + 624, 632, 632, 641, 641, 651, 652, 655, 656, 659, + 664, 669, 669, 679, 680, 683, 684, 685, 688, 693, + 700, 700, 710, 710, 720, 721, 724, 725, 728, 728, + 738, 738, 748, 749, 750, 753, 754, 757, 757, 765, + 765, 773, 773, 784, 785, 788, 789, 790, 791, 792, + 793, 796, 801, 806, 811, 816, 821, 829, 829, 842, + 843, 846, 847, 854, 854, 880, 880, 891, 892, 896, + 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, + 907, 908, 909, 910, 911, 912, 913, 914, 917, 917, + 925, 925, 933, 933, 941, 941, 949, 949, 959, 959, + 966, 967, 968, 971, 976, 984, 984, 995, 996, 1000, + 1001, 1004, 1004, 1012, 1013, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1037, 1037, 1050, 1050, 1059, 1060, 1063, 1064, 1069, 1069, + 1084, 1084, 1098, 1099, 1102, 1103, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1116, 1118, 1123, 1125, 1125, 1133, + 1133, 1141, 1141, 1149, 1151, 1151, 1159, 1168, 1168, 1180, + 1181, 1186, 1187, 1192, 1192, 1204, 1204, 1216, 1217, 1222, + 1223, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1237, 1239, + 1239, 1247, 1249, 1251, 1256, 1264, 1264, 1276, 1277, 1280, + 1281, 1284, 1284, 1294, 1294, 1303, 1304, 1307, 1308, 1309, + 1310, 1311, 1312, 1315, 1315, 1323, 1323, 1333, 1333, 1345, + 1346, 1349, 1350, 1353, 1353, 1365, 1365, 1377, 1378, 1381, + 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1393, + 1393, 1401, 1406, 1406, 1414, 1419, 1427, 1427, 1437, 1438, + 1441, 1442, 1445, 1445, 1454, 1454, 1463, 1464, 1467, 1468, + 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1483, + 1483, 1493, 1493, 1503, 1503, 1511, 1511, 1519, 1519, 1527, + 1527, 1535, 1535, 1548, 1548, 1558, 1558, 1569, 1569, 1579, + 1580, 1583, 1583, 1593, 1594, 1597, 1598, 1601, 1602, 1603, + 1604, 1605, 1608, 1610, 1610, 1618, 1626, 1626, 1638, 1639, + 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1651, 1651, 1658, + 1659, 1660, 1663, 1668, 1668, 1676, 1681, 1688, 1695, 1695, + 1705, 1706, 1709, 1710, 1713, 1713, 1721, 1721, 1731, 1731, + 1743, 1743, 1753, 1754, 1757, 1758, 1759, 1760, 1761, 1762, + 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1774, + 1779, 1779, 1787, 1787, 1795, 1800, 1800, 1808, 1813, 1818, + 1818, 1826, 1827, 1830, 1830, 1838, 1843, 1848, 1853, 1853, + 1861, 1864, 1867, 1870, 1873, 1879, 1879, 1889, 1889, 1896, + 1896, 1903, 1903, 1916, 1916, 1929, 1930, 1934, 1938, 1938, + 1950, 1951, 1955, 1955, 1963, 1964, 1967, 1968, 1969, 1970, + 1971, 1974, 1979, 1979, 1987, 1987, 1997, 1998, 2001, 2001, + 2009, 2010, 2013, 2014, 2015, 2016, 2019, 2019, 2027, 2032, + 2037 }; // Print the state stack on the debug stream. @@ -4553,8 +4507,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4557 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2059 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4511 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2042 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index b61d8fd79a..77187868d3 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -308,7 +308,6 @@ namespace isc { namespace dhcp { // map_value // db_type // hr_mode - // known_clients_value // duid_type // ncr_protocol_value // replace_client_name_value @@ -402,108 +401,106 @@ namespace isc { namespace dhcp { TOKEN_EXCLUDED_PREFIX_LEN = 309, TOKEN_DELEGATED_LEN = 310, TOKEN_USER_CONTEXT = 311, - TOKEN_KNOWN_CLIENTS = 312, - TOKEN_ONLY = 313, - TOKEN_NEVER = 314, - TOKEN_SUBNET = 315, - TOKEN_INTERFACE = 316, - TOKEN_INTERFACE_ID = 317, - TOKEN_ID = 318, - TOKEN_RAPID_COMMIT = 319, - TOKEN_RESERVATION_MODE = 320, - TOKEN_DISABLED = 321, - TOKEN_OUT_OF_POOL = 322, - TOKEN_ALL = 323, - TOKEN_SHARED_NETWORKS = 324, - TOKEN_MAC_SOURCES = 325, - TOKEN_RELAY_SUPPLIED_OPTIONS = 326, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 327, - TOKEN_CLIENT_CLASSES = 328, - TOKEN_EVAL_CLIENT_CLASSES = 329, - TOKEN_TEST = 330, - TOKEN_EVAL_ON_DEMAND = 331, - TOKEN_CLIENT_CLASS = 332, - TOKEN_RESERVATIONS = 333, - TOKEN_IP_ADDRESSES = 334, - TOKEN_PREFIXES = 335, - TOKEN_DUID = 336, - TOKEN_HW_ADDRESS = 337, - TOKEN_HOSTNAME = 338, - TOKEN_FLEX_ID = 339, - TOKEN_RELAY = 340, - TOKEN_IP_ADDRESS = 341, - TOKEN_HOOKS_LIBRARIES = 342, - TOKEN_LIBRARY = 343, - TOKEN_PARAMETERS = 344, - TOKEN_EXPIRED_LEASES_PROCESSING = 345, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 346, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 347, - TOKEN_HOLD_RECLAIMED_TIME = 348, - TOKEN_MAX_RECLAIM_LEASES = 349, - TOKEN_MAX_RECLAIM_TIME = 350, - TOKEN_UNWARNED_RECLAIM_CYCLES = 351, - TOKEN_SERVER_ID = 352, - TOKEN_LLT = 353, - TOKEN_EN = 354, - TOKEN_LL = 355, - TOKEN_IDENTIFIER = 356, - TOKEN_HTYPE = 357, - TOKEN_TIME = 358, - TOKEN_ENTERPRISE_ID = 359, - TOKEN_DHCP4O6_PORT = 360, - TOKEN_CONTROL_SOCKET = 361, - TOKEN_SOCKET_TYPE = 362, - TOKEN_SOCKET_NAME = 363, - TOKEN_DHCP_DDNS = 364, - TOKEN_ENABLE_UPDATES = 365, - TOKEN_QUALIFYING_SUFFIX = 366, - TOKEN_SERVER_IP = 367, - TOKEN_SERVER_PORT = 368, - TOKEN_SENDER_IP = 369, - TOKEN_SENDER_PORT = 370, - TOKEN_MAX_QUEUE_SIZE = 371, - TOKEN_NCR_PROTOCOL = 372, - TOKEN_NCR_FORMAT = 373, - TOKEN_ALWAYS_INCLUDE_FQDN = 374, - TOKEN_OVERRIDE_NO_UPDATE = 375, - TOKEN_OVERRIDE_CLIENT_UPDATE = 376, - TOKEN_REPLACE_CLIENT_NAME = 377, - TOKEN_GENERATED_PREFIX = 378, - TOKEN_UDP = 379, - TOKEN_TCP = 380, - TOKEN_JSON = 381, - TOKEN_WHEN_PRESENT = 382, - TOKEN_ALWAYS = 383, - TOKEN_WHEN_NOT_PRESENT = 384, - TOKEN_LOGGING = 385, - TOKEN_LOGGERS = 386, - TOKEN_OUTPUT_OPTIONS = 387, - TOKEN_OUTPUT = 388, - TOKEN_DEBUGLEVEL = 389, - TOKEN_SEVERITY = 390, - TOKEN_FLUSH = 391, - TOKEN_MAXSIZE = 392, - TOKEN_MAXVER = 393, - TOKEN_DHCP4 = 394, - TOKEN_DHCPDDNS = 395, - TOKEN_CONTROL_AGENT = 396, - TOKEN_TOPLEVEL_JSON = 397, - TOKEN_TOPLEVEL_DHCP6 = 398, - TOKEN_SUB_DHCP6 = 399, - TOKEN_SUB_INTERFACES6 = 400, - TOKEN_SUB_SUBNET6 = 401, - TOKEN_SUB_POOL6 = 402, - TOKEN_SUB_PD_POOL = 403, - TOKEN_SUB_RESERVATION = 404, - TOKEN_SUB_OPTION_DEFS = 405, - TOKEN_SUB_OPTION_DEF = 406, - TOKEN_SUB_OPTION_DATA = 407, - TOKEN_SUB_HOOKS_LIBRARY = 408, - TOKEN_SUB_DHCP_DDNS = 409, - TOKEN_STRING = 410, - TOKEN_INTEGER = 411, - TOKEN_FLOAT = 412, - TOKEN_BOOLEAN = 413 + TOKEN_SUBNET = 312, + TOKEN_INTERFACE = 313, + TOKEN_INTERFACE_ID = 314, + TOKEN_ID = 315, + TOKEN_RAPID_COMMIT = 316, + TOKEN_RESERVATION_MODE = 317, + TOKEN_DISABLED = 318, + TOKEN_OUT_OF_POOL = 319, + TOKEN_ALL = 320, + TOKEN_SHARED_NETWORKS = 321, + TOKEN_MAC_SOURCES = 322, + TOKEN_RELAY_SUPPLIED_OPTIONS = 323, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 324, + TOKEN_CLIENT_CLASSES = 325, + TOKEN_EVAL_CLIENT_CLASSES = 326, + TOKEN_TEST = 327, + TOKEN_EVAL_ON_DEMAND = 328, + TOKEN_CLIENT_CLASS = 329, + TOKEN_RESERVATIONS = 330, + TOKEN_IP_ADDRESSES = 331, + TOKEN_PREFIXES = 332, + TOKEN_DUID = 333, + TOKEN_HW_ADDRESS = 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_SERVER_ID = 349, + TOKEN_LLT = 350, + TOKEN_EN = 351, + TOKEN_LL = 352, + TOKEN_IDENTIFIER = 353, + TOKEN_HTYPE = 354, + TOKEN_TIME = 355, + TOKEN_ENTERPRISE_ID = 356, + TOKEN_DHCP4O6_PORT = 357, + TOKEN_CONTROL_SOCKET = 358, + TOKEN_SOCKET_TYPE = 359, + TOKEN_SOCKET_NAME = 360, + TOKEN_DHCP_DDNS = 361, + TOKEN_ENABLE_UPDATES = 362, + TOKEN_QUALIFYING_SUFFIX = 363, + TOKEN_SERVER_IP = 364, + TOKEN_SERVER_PORT = 365, + TOKEN_SENDER_IP = 366, + TOKEN_SENDER_PORT = 367, + TOKEN_MAX_QUEUE_SIZE = 368, + TOKEN_NCR_PROTOCOL = 369, + TOKEN_NCR_FORMAT = 370, + TOKEN_ALWAYS_INCLUDE_FQDN = 371, + TOKEN_OVERRIDE_NO_UPDATE = 372, + TOKEN_OVERRIDE_CLIENT_UPDATE = 373, + TOKEN_REPLACE_CLIENT_NAME = 374, + TOKEN_GENERATED_PREFIX = 375, + TOKEN_UDP = 376, + TOKEN_TCP = 377, + TOKEN_JSON = 378, + TOKEN_WHEN_PRESENT = 379, + TOKEN_NEVER = 380, + TOKEN_ALWAYS = 381, + TOKEN_WHEN_NOT_PRESENT = 382, + TOKEN_LOGGING = 383, + TOKEN_LOGGERS = 384, + TOKEN_OUTPUT_OPTIONS = 385, + TOKEN_OUTPUT = 386, + TOKEN_DEBUGLEVEL = 387, + TOKEN_SEVERITY = 388, + TOKEN_FLUSH = 389, + TOKEN_MAXSIZE = 390, + TOKEN_MAXVER = 391, + TOKEN_DHCP4 = 392, + TOKEN_DHCPDDNS = 393, + TOKEN_CONTROL_AGENT = 394, + TOKEN_TOPLEVEL_JSON = 395, + TOKEN_TOPLEVEL_DHCP6 = 396, + TOKEN_SUB_DHCP6 = 397, + TOKEN_SUB_INTERFACES6 = 398, + TOKEN_SUB_SUBNET6 = 399, + TOKEN_SUB_POOL6 = 400, + TOKEN_SUB_PD_POOL = 401, + TOKEN_SUB_RESERVATION = 402, + TOKEN_SUB_OPTION_DEFS = 403, + TOKEN_SUB_OPTION_DEF = 404, + TOKEN_SUB_OPTION_DATA = 405, + TOKEN_SUB_HOOKS_LIBRARY = 406, + TOKEN_SUB_DHCP_DDNS = 407, + TOKEN_STRING = 408, + TOKEN_INTEGER = 409, + TOKEN_FLOAT = 410, + TOKEN_BOOLEAN = 411 }; }; @@ -838,18 +835,6 @@ namespace isc { namespace dhcp { symbol_type make_USER_CONTEXT (const location_type& l); - static inline - symbol_type - make_KNOWN_CLIENTS (const location_type& l); - - static inline - symbol_type - make_ONLY (const location_type& l); - - static inline - symbol_type - make_NEVER (const location_type& l); - static inline symbol_type make_SUBNET (const location_type& l); @@ -1122,6 +1107,10 @@ namespace isc { namespace dhcp { symbol_type make_WHEN_PRESENT (const location_type& l); + static inline + symbol_type + make_NEVER (const location_type& l); + static inline symbol_type make_ALWAYS (const location_type& l); @@ -1451,12 +1440,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 858, ///< Last index in yytable_. - yynnts_ = 353, ///< Number of nonterminal symbols. + yylast_ = 850, ///< Last index in yytable_. + yynnts_ = 350, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 159 ///< Number of tokens. + yyntokens_ = 157 ///< Number of tokens. }; @@ -1514,9 +1503,9 @@ namespace isc { namespace dhcp { 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158 + 155, 156 }; - const unsigned int user_token_number_max_ = 413; + const unsigned int user_token_number_max_ = 411; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1549,30 +1538,29 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 158: // "boolean" + case 156: // "boolean" value.copy< bool > (other.value); break; - case 157: // "floating point" + case 155: // "floating point" value.copy< double > (other.value); break; - case 156: // "integer" + case 154: // "integer" value.copy< int64_t > (other.value); break; - case 155: // "constant string" + case 153: // "constant string" value.copy< std::string > (other.value); break; @@ -1593,30 +1581,29 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 158: // "boolean" + case 156: // "boolean" value.copy< bool > (v); break; - case 157: // "floating point" + case 155: // "floating point" value.copy< double > (v); break; - case 156: // "integer" + case 154: // "integer" value.copy< int64_t > (v); break; - case 155: // "constant string" + case 153: // "constant string" value.copy< std::string > (v); break; @@ -1696,30 +1683,29 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 158: // "boolean" + case 156: // "boolean" value.template destroy< bool > (); break; - case 157: // "floating point" + case 155: // "floating point" value.template destroy< double > (); break; - case 156: // "integer" + case 154: // "integer" value.template destroy< int64_t > (); break; - case 155: // "constant string" + case 153: // "constant string" value.template destroy< std::string > (); break; @@ -1746,30 +1732,29 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 174: // value - case 178: // map_value - case 222: // db_type - case 300: // hr_mode - case 371: // known_clients_value - case 436: // duid_type - case 469: // ncr_protocol_value - case 477: // replace_client_name_value + case 172: // value + case 176: // map_value + case 220: // db_type + case 298: // hr_mode + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 158: // "boolean" + case 156: // "boolean" value.move< bool > (s.value); break; - case 157: // "floating point" + case 155: // "floating point" value.move< double > (s.value); break; - case 156: // "integer" + case 154: // "integer" value.move< int64_t > (s.value); break; - case 155: // "constant string" + case 153: // "constant string" value.move< std::string > (s.value); break; @@ -1843,7 +1828,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413 + 405, 406, 407, 408, 409, 410, 411 }; return static_cast (yytoken_number_[type]); } @@ -2178,24 +2163,6 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_USER_CONTEXT, l); } - Dhcp6Parser::symbol_type - Dhcp6Parser::make_KNOWN_CLIENTS (const location_type& l) - { - return symbol_type (token::TOKEN_KNOWN_CLIENTS, l); - } - - Dhcp6Parser::symbol_type - Dhcp6Parser::make_ONLY (const location_type& l) - { - return symbol_type (token::TOKEN_ONLY, l); - } - - Dhcp6Parser::symbol_type - Dhcp6Parser::make_NEVER (const location_type& l) - { - return symbol_type (token::TOKEN_NEVER, l); - } - Dhcp6Parser::symbol_type Dhcp6Parser::make_SUBNET (const location_type& l) { @@ -2604,6 +2571,12 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_WHEN_PRESENT, l); } + Dhcp6Parser::symbol_type + Dhcp6Parser::make_NEVER (const location_type& l) + { + return symbol_type (token::TOKEN_NEVER, l); + } + Dhcp6Parser::symbol_type Dhcp6Parser::make_ALWAYS (const location_type& l) { @@ -2793,7 +2766,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2797 "dhcp6_parser.h" // lalr1.cc:377 +#line 2770 "dhcp6_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index d53ec75ef7..b7300e6c31 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201711270210 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index d19bfcb55c..ab3fae70fe 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201711270210 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index 37730a1df1..a267b6e6ca 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711270210 +// Generated 201804011245 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From ed00b40ddd584e58910a0a63172731c822216991 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 1 Apr 2018 19:27:23 +0200 Subject: [PATCH 39/52] [5374] Regen get config tests --- src/bin/dhcp4/tests/get_config_unittest.cc | 306 ++---- src/bin/dhcp6/tests/get_config_unittest.cc | 1084 ++++++++------------ 2 files changed, 501 insertions(+), 889 deletions(-) diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 16f9473a4d..c3ac6b79ae 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -1204,39 +1204,6 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" -" \"pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"known-clients\": \"never\",\n" -" \"pool\": \"192.0.3.101 - 192.0.3.150\"\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"known-clients\": \"only\",\n" -" \"pool\": \"192.0.4.101 - 192.0.4.150\"\n" -" },\n" -" {\n" -" \"pool\": \"192.0.5.101 - 192.0.5.150\"\n" -" }\n" -" ],\n" -" \"subnet\": \"192.0.0.0/16\"\n" -" }\n" -" ],\n" -" \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 43 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"rebind-timer\": 2000,\n" -" \"renew-timer\": 1000,\n" -" \"subnet4\": [\n" -" {\n" " \"id\": 123,\n" " \"pools\": [\n" " {\n" @@ -1326,7 +1293,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 44 + // CONFIGURATION 43 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1367,7 +1334,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 44 "{\n" " \"rebind-timer\": 2000,\n" " \"renew-timer\": 1000,\n" @@ -1409,6 +1376,13 @@ const char* EXTRACTED_CONFIGS[] = { " }\n" " ],\n" " \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 45 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" @@ -1419,20 +1393,13 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 47 "{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 48 -"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" " },\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 48 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1446,6 +1413,25 @@ const char* EXTRACTED_CONFIGS[] = { " \"interfaces\": [ \"*\" ]\n" " },\n" " \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 49 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet4\": [\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.2.0/24\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" " }\n", // CONFIGURATION 50 "{\n" @@ -1456,6 +1442,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" +" \"4o6-subnet\": \"2001:db8::123/45\",\n" " \"pools\": [\n" " {\n" " \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" @@ -1475,7 +1462,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" -" \"4o6-subnet\": \"2001:db8::123/45\",\n" +" \"4o6-interface\": \"ethX\",\n" " \"pools\": [\n" " {\n" " \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" @@ -1496,6 +1483,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet4\": [\n" " {\n" " \"4o6-interface\": \"ethX\",\n" +" \"4o6-subnet\": \"2001:db8::543/21\",\n" " \"pools\": [\n" " {\n" " \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" @@ -1515,27 +1503,6 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" -" \"4o6-interface\": \"ethX\",\n" -" \"4o6-subnet\": \"2001:db8::543/21\",\n" -" \"pools\": [\n" -" {\n" -" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" -" }\n" -" ],\n" -" \"subnet\": \"192.0.2.0/24\"\n" -" }\n" -" ],\n" -" \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 54 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"rebind-timer\": 2000,\n" -" \"renew-timer\": 1000,\n" -" \"subnet4\": [\n" -" {\n" " \"4o6-interface-id\": \"vlan123\",\n" " \"pools\": [\n" " {\n" @@ -1547,7 +1514,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 55 + // CONFIGURATION 54 "{\n" " \"client-classes\": [\n" " {\n" @@ -1577,7 +1544,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 56 + // CONFIGURATION 55 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1596,7 +1563,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 57 + // CONFIGURATION 56 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1616,7 +1583,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 58 + // CONFIGURATION 57 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1640,7 +1607,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 59 + // CONFIGURATION 58 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -5123,93 +5090,6 @@ const char* UNPARSED_CONFIGS[] = { " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"\",\n" " \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.1-192.0.2.100\"\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"known-clients\": \"never\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.3.101-192.0.3.150\"\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"known-clients\": \"only\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.4.101-192.0.4.150\"\n" -" },\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.5.101-192.0.5.150\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.0.0/16\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 43 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"\",\n" -" \"boot-file-name\": \"\",\n" " \"id\": 123,\n" " \"match-client-id\": true,\n" " \"next-server\": \"0.0.0.0\",\n" @@ -5388,7 +5268,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 44 + // CONFIGURATION 43 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5488,7 +5368,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 44 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5635,6 +5515,49 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" +" }\n", + // CONFIGURATION 45 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" @@ -5681,7 +5604,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 47 "{\n" -" \"decline-probation-period\": 86400,\n" +" \"decline-probation-period\": 12345,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5724,49 +5647,6 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 48 "{\n" -" \"decline-probation-period\": 12345,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 49 -"{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" @@ -5808,7 +5688,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 49 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5878,7 +5758,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 50 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5948,7 +5828,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 51 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6018,7 +5898,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 53 + // CONFIGURATION 52 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6088,7 +5968,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 54 + // CONFIGURATION 53 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6158,7 +6038,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 55 + // CONFIGURATION 54 "{\n" " \"client-classes\": [\n" " {\n" @@ -6254,7 +6134,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 56 + // CONFIGURATION 55 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6324,7 +6204,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 57 + // CONFIGURATION 56 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6395,7 +6275,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 58 + // CONFIGURATION 57 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6470,7 +6350,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 59 + // CONFIGURATION 58 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index 403bbb79d8..baa8bd9837 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -987,82 +987,6 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 32 "{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"preferred-lifetime\": 3000,\n" -" \"rebind-timer\": 2000,\n" -" \"renew-timer\": 1000,\n" -" \"subnet6\": [\n" -" {\n" -" \"pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"pool\": \"2001:db8:1::/80\"\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"known-clients\": \"never\",\n" -" \"pool\": \"2001:db8:2::/80\"\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"known-clients\": \"only\",\n" -" \"pool\": \"2001:db8:3::/80\"\n" -" },\n" -" {\n" -" \"pool\": \"2001:db8:4::/80\"\n" -" }\n" -" ],\n" -" \"subnet\": \"2001:db8:0::/40\"\n" -" }\n" -" ],\n" -" \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 33 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"preferred-lifetime\": 3000,\n" -" \"rebind-timer\": 2000,\n" -" \"renew-timer\": 1000,\n" -" \"subnet6\": [\n" -" {\n" -" \"pd-pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"delegated-len\": 64,\n" -" \"prefix\": \"2001:db8:1::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"delegated-len\": 64,\n" -" \"known-clients\": \"never\",\n" -" \"prefix\": \"2001:db8:2::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"delegated-len\": 64,\n" -" \"known-clients\": \"only\",\n" -" \"prefix\": \"2001:db8:3::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"delegated-len\": 64,\n" -" \"prefix\": \"2001:db8:4::\",\n" -" \"prefix-len\": 48\n" -" }\n" -" ],\n" -" \"subnet\": \"2001:db8::/64\"\n" -" }\n" -" ],\n" -" \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 34 -"{\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" @@ -1097,7 +1021,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 35 + // CONFIGURATION 33 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1183,7 +1107,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 36 + // CONFIGURATION 34 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1222,7 +1146,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 37 + // CONFIGURATION 35 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1234,7 +1158,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 38 + // CONFIGURATION 36 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1246,7 +1170,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 39 + // CONFIGURATION 37 "{\n" " \"preferred-lifetime\": 3000,\n" " \"rebind-timer\": 2000,\n" @@ -1290,7 +1214,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 40 + // CONFIGURATION 38 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1301,30 +1225,30 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 39 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 40 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ]\n" +" },\n" +" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 41 "{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 42 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ]\n" -" },\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 43 -"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 44 + // CONFIGURATION 42 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1339,7 +1263,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 43 "{\n" " \"client-classes\": [\n" " {\n" @@ -1370,7 +1294,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 46 + // CONFIGURATION 44 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1390,7 +1314,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 45 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1411,7 +1335,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 46 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1437,7 +1361,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 47 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1463,7 +1387,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 48 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1485,7 +1409,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 49 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -1508,7 +1432,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 50 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ]\n" @@ -4399,198 +4323,6 @@ const char* UNPARSED_CONFIGS[] = { "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8:1::/80\"\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"known-clients\": \"never\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8:2::/80\"\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"known-clients\": \"only\",\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8:3::/80\"\n" -" },\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8:4::/80\"\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/40\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 33 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [\n" -" {\n" -" \"client-class\": \"alpha\",\n" -" \"delegated-len\": 64,\n" -" \"option-data\": [ ],\n" -" \"prefix\": \"2001:db8:1::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"client-class\": \"beta\",\n" -" \"delegated-len\": 64,\n" -" \"known-clients\": \"never\",\n" -" \"option-data\": [ ],\n" -" \"prefix\": \"2001:db8:2::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"client-class\": \"gamma\",\n" -" \"delegated-len\": 64,\n" -" \"known-clients\": \"only\",\n" -" \"option-data\": [ ],\n" -" \"prefix\": \"2001:db8:3::\",\n" -" \"prefix-len\": 48\n" -" },\n" -" {\n" -" \"delegated-len\": 64,\n" -" \"option-data\": [ ],\n" -" \"prefix\": \"2001:db8:4::\",\n" -" \"prefix-len\": 48\n" -" }\n" -" ],\n" -" \"pools\": [ ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/64\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 34 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" " \"generated-prefix\": \"test.prefix\",\n" @@ -4662,7 +4394,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 35 + // CONFIGURATION 33 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4856,7 +4588,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 36 + // CONFIGURATION 34 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4953,6 +4685,110 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" +" }\n", + // CONFIGURATION 35 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 36 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 37 "{\n" @@ -4985,110 +4821,6 @@ const char* UNPARSED_CONFIGS[] = { " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" " \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 38 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 39 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" " \"interfaces\": [ ],\n" " \"re-detect\": false\n" " },\n" @@ -5199,7 +4931,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 40 + // CONFIGURATION 38 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5251,7 +4983,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 41 + // CONFIGURATION 39 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5302,6 +5034,110 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 40 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 41 +"{\n" +" \"decline-probation-period\": 12345,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 42 "{\n" @@ -5324,110 +5160,6 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"dhcp4o6-port\": 0,\n" " \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 43 -"{\n" -" \"decline-probation-period\": 12345,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" " \"hold-reclaimed-time\": 1800,\n" " \"max-reclaim-leases\": 50,\n" @@ -5459,7 +5191,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 43 "{\n" " \"client-classes\": [\n" " {\n" @@ -5548,7 +5280,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 46 + // CONFIGURATION 44 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5623,7 +5355,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 45 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5698,6 +5430,168 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" +" }\n", + // CONFIGURATION 46 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": {\n" +" \"lw4over6-bind-prefix-len\": 56,\n" +" \"lw4over6-sharing-ratio\": 64,\n" +" \"lw4over6-sysports-exclude\": true,\n" +" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" +" }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 47 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": {\n" +" \"lw4over6-bind-prefix-len\": 56,\n" +" \"lw4over6-sharing-ratio\": 64,\n" +" \"lw4over6-sysports-exclude\": true,\n" +" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" +" }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" " }\n", // CONFIGURATION 48 "{\n" @@ -5753,168 +5647,6 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"id\": 1,\n" " \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": {\n" -" \"lw4over6-bind-prefix-len\": 56,\n" -" \"lw4over6-sharing-ratio\": 64,\n" -" \"lw4over6-sysports-exclude\": true,\n" -" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" -" }\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 49 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": {\n" -" \"lw4over6-bind-prefix-len\": 56,\n" -" \"lw4over6-sharing-ratio\": 64,\n" -" \"lw4over6-sysports-exclude\": true,\n" -" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" -" }\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 50 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" " \"pd-pools\": [\n" " {\n" " \"delegated-len\": 64,\n" @@ -5938,7 +5670,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 49 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -6016,7 +5748,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 50 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" From b6d4dff8ae26c89ed0d9ed5aa2932b383f75afad Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 6 Apr 2018 00:12:52 +0200 Subject: [PATCH 40/52] [5374] Checkpoint before regen --- doc/guide/classify.xml | 18 +++--- doc/guide/dhcp4-srv.xml | 18 +++--- doc/guide/dhcp6-srv.xml | 18 +++--- src/bin/dhcp4/dhcp4_lexer.ll | 12 ++-- src/bin/dhcp4/dhcp4_messages.mes | 10 +-- src/bin/dhcp4/dhcp4_parser.yy | 20 +++--- src/bin/dhcp4/dhcp4_srv.cc | 28 ++++---- src/bin/dhcp4/dhcp4_srv.h | 14 ++-- src/bin/dhcp4/tests/classify_unittest.cc | 60 ++++++++--------- src/bin/dhcp6/dhcp6_lexer.ll | 12 ++-- src/bin/dhcp6/dhcp6_messages.mes | 10 +-- src/bin/dhcp6/dhcp6_parser.yy | 22 +++---- src/bin/dhcp6/dhcp6_srv.cc | 34 +++++----- src/bin/dhcp6/dhcp6_srv.h | 14 ++-- src/bin/dhcp6/tests/classify_unittests.cc | 60 ++++++++--------- src/lib/dhcp/pkt.cc | 6 +- src/lib/dhcp/pkt.h | 21 +++--- src/lib/dhcpsrv/client_class_def.cc | 28 ++++---- src/lib/dhcpsrv/client_class_def.h | 20 +++--- src/lib/dhcpsrv/network.cc | 18 +++--- src/lib/dhcpsrv/network.h | 18 +++--- .../parsers/client_class_def_parser.cc | 12 ++-- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 22 +++---- .../dhcpsrv/parsers/shared_network_parser.cc | 14 ++-- src/lib/dhcpsrv/pool.cc | 6 +- src/lib/dhcpsrv/pool.h | 22 +++---- .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 10 +-- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 16 ++--- .../tests/client_class_def_unittest.cc | 20 +++--- src/lib/dhcpsrv/tests/pool_unittest.cc | 64 +++++++++---------- .../tests/shared_network_parser_unittest.cc | 20 +++--- .../dhcpsrv/tests/shared_network_unittest.cc | 10 +-- 32 files changed, 339 insertions(+), 338 deletions(-) diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 1721853f0d..0a1b2baf2a 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -759,9 +759,9 @@ concatenation of the strings Configuring Classes A class contains five items: a name, a test expression, option data, - option definition and eval on-demand flag. + option definition and only-if-required flag. The name must exist and must be unique amongst all classes. The test - expression, option data and definition, and eval on-demand flag are + expression, option data and definition, and only-if-required flag are optional. @@ -786,21 +786,21 @@ concatenation of the strings Usually the test expression is evaluated before subnet selection but in some cases it is useful to evaluate it later when the subnet, shared-network or pools are known but output option - processing not yet done. The eval-on-demand flag, false by default, - allows to defer and make only on-demand the evaluation of the - test expression. + processing not yet done. The only-if-required flag, false by default, + allows to perform the evaluation of the test expression only + when it was required, i.e. in a required-client-classes list. - The eval-client-classes list which is valid for shared-network, + The required-client-classes list which is valid for shared-network, subnet and pool scope specifies the classes which are evaluated in the second pass before output option processing. The list is built in the reversed precedence order of option data, i.e. an option data in a subnet takes precedence on one - in a shared-network but an on-demand class in a subnet is added + in a shared-network but required class in a subnet is added after one in a shared-network. - The mechanism is related to the eval-on-demand flag but it is - not required that the flag was set to true. + The mechanism is related to the only-if-required flag but it is + not mandatory that the flag was set to true. diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index f37f3a69f0..479580e11f 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2095,8 +2095,8 @@ It is merely echoed by the server is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. The third step is to assign classes from host reservations. - The forth step is to build the list of on-demand classes and perform - deferred evaluation for each class of the list. + The forth step is to build the list of required classes and perform + the evaluation for each class of the list. The last step is to assign options, again possibly based on the class information. @@ -2248,23 +2248,23 @@ It is merely echoed by the server
-
- On-demand classification +
+ Required classification In some cases it is useful to limit the scope of class. Two devices are available to perform evaluation of test - expressions so assignment when it returns true only on-demand. + expressions so assignment when it was required. - The first one is the per-class eval-on-demand + The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not evaluated at the reception of a new incoming ticket. - The second is the eval-client-classes which + The second is the required-client-classes which takes a list of class names and is valid in shared-network, subnet and pool scope. Classes in these lists are evaluated after resource assignment and before output option processing. @@ -2280,7 +2280,7 @@ It is merely echoed by the server { "name": "Client_foo", "test": "'' == ''", - "eval-on-demand": true + "only-if-required": true }, ... ], @@ -2288,7 +2288,7 @@ It is merely echoed by the server { "subnet": "192.0.2.0/24", "pools": [ { "pool": "192.0.2.10 - 192.0.2.20" } ], - "eval-client-classes": [ "Client_foo" ], + "required-client-classes": [ "Client_foo" ], ... }, ... diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index a9b44ff2f2..ed7e22fa5e 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1955,8 +1955,8 @@ should include options from the isc option space: is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. The third step is to assign classes from host reservations. - The forth step is to build the list of on-demand classes and perform - deferred evaluation for each class of the list. + The forth step is to build the list of required classes and perform + the evaluation for each class of the list. The last step is to assign options again possibly based on the class information. @@ -2041,23 +2041,23 @@ should include options from the isc option space:
-
- On-demand classification +
+ Required classification In some cases it is useful to limit the scope of class. Two devices are available to perform evaluation of test - expressions so assignment when it returns true only on-demand. + expressions so assignment when it was required. - The first one is the per-class eval-on-demand + The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not evaluated at the reception of a new incoming ticket. - The second is the eval-client-classes which + The second is the required-client-classes which takes a list of class names and is valid in shared-network, subnet and pool scope. Classes in these lists are evaluated after resource assignment and before output option processing. @@ -2073,7 +2073,7 @@ should include options from the isc option space: { "name": "Client_foo", "test": "'' == ''", - "eval-on-demand": true + "only-if-required": true }, ... ], @@ -2085,7 +2085,7 @@ should include options from the isc option space: "pool": "2001:db8:1::-2001:db8:1::ffff" } ], - "eval-client-classes": [ "Client_foo" ], + "required-client-classes": [ "Client_foo" ], ... }, ... diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 05405a39ff..1e68cde4ce 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -795,14 +795,14 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"eval-client-classes\" { +\"required-client-classes\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: - return isc::dhcp::Dhcp4Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("required-client-classes", driver.loc_); } } @@ -827,12 +827,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"eval-on-demand\" { +\"only-if-required\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: - return isc::dhcp::Dhcp4Parser::make_EVAL_ON_DEMAND(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_ONLY_IF_REQUIRED(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-on-demand", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("only-if-required", driver.loc_); } } diff --git a/src/bin/dhcp4/dhcp4_messages.mes b/src/bin/dhcp4/dhcp4_messages.mes index ca29b07ccc..3f19967084 100644 --- a/src/bin/dhcp4/dhcp4_messages.mes +++ b/src/bin/dhcp4/dhcp4_messages.mes @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this @@ -59,12 +59,12 @@ which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is inconsistent. -% DHCP4_CLASS_UNKNOWN on-demand class %1 has no definition -This debug message informs that a class is listed for late evaluation but +% DHCP4_CLASS_UNDEFINED required class %1 has no definition +This debug message informs that a class is listed for required evaluation but has no definition. -% DHCP4_CLASS_UNTESTABLE on-demand class %1 has no test expression -This debug message informs that a class was listed for late evaluation but +% DHCP4_CLASS_UNTESTABLE required class %1 has no test expression +This debug message informs that a class was listed for required evaluation but its definition does not include a test expression to evaluate. % DHCP4_CLIENTID_IGNORED_FOR_LEASES %1: not using client identifier for lease allocation for subnet %2 diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 81673e4d09..498bddf91e 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -123,9 +123,9 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" - EVAL_CLIENT_CLASSES "eval-client-classes" + REQUIRED_CLIENT_CLASSES "required-client-classes" TEST "test" - EVAL_ON_DEMAND "eval-on-demand" + ONLY_IF_REQUIRED "only-if-required" CLIENT_CLASS "client-class" RESERVATIONS "reservations" @@ -911,7 +911,7 @@ subnet4_param: valid_lifetime | id | rapid_commit | client_class - | eval_client_classes + | required_client_classes | reservations | reservation_mode | relay @@ -982,9 +982,9 @@ client_class: CLIENT_CLASS { ctx.leave(); }; -eval_client_classes: EVAL_CLIENT_CLASSES { +required_client_classes: REQUIRED_CLIENT_CLASSES { ElementPtr c(new ListElement(ctx.loc2pos(@1))); - ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.back()->set("required-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } COLON list_strings { @@ -1061,7 +1061,7 @@ shared_network_param: name | relay | reservation_mode | client_class - | eval_client_classes + | required_client_classes | valid_lifetime | unknown_map_entry ; @@ -1344,7 +1344,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class - | eval_client_classes + | required_client_classes | user_context | unknown_map_entry ; @@ -1575,7 +1575,7 @@ not_empty_client_class_params: client_class_param client_class_param: client_class_name | client_class_test - | eval_on_demand + | only_if_required | option_def_list | option_data_list | next_server @@ -1594,9 +1594,9 @@ client_class_test: TEST { ctx.leave(); }; -eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { +only_if_required: ONLY_IF_REQUIRED COLON BOOLEAN { ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); - ctx.stack_.back()->set("eval-on-demand", b); + ctx.stack_.back()->set("only-if-required", b); }; // --- end of client classes --------------------------------- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 2e3f72bafa..58b547d36d 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2340,8 +2340,8 @@ Dhcpv4Srv::processDiscover(Pkt4Ptr& discover) { if (!ex.getResponse()->getYiaddr().isV4Zero()) { // Assign reserved classes. ex.setReservedClientClasses(); - // Late classification - lateClassify(ex); + // Required classification + requiredClassify(ex); buildCfgOptionList(ex); appendRequestedOptions(ex); @@ -2397,8 +2397,8 @@ Dhcpv4Srv::processRequest(Pkt4Ptr& request) { if (!ex.getResponse()->getYiaddr().isV4Zero()) { // Assign reserved classes. ex.setReservedClientClasses(); - // Late classification - lateClassify(ex); + // Required classification + requiredClassify(ex); buildCfgOptionList(ex); appendRequestedOptions(ex); @@ -2683,7 +2683,7 @@ Dhcpv4Srv::processInform(Pkt4Ptr& inform) { Pkt4Ptr ack = ex.getResponse(); ex.setReservedClientClasses(); - lateClassify(ex); + requiredClassify(ex); buildCfgOptionList(ex); appendRequestedOptions(ex); @@ -2986,8 +2986,8 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { if (!expr_ptr) { continue; } - // Not the right time if on demand - if ((*it)->getOnDemand()) { + // Not the right time if only when required + if ((*it)->getRequired()) { continue; } // Evaluate the expression which can return false (no match), @@ -3017,8 +3017,8 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { } } -void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { - // First collect on-demand classes +void Dhcpv4Srv::requiredClassify(Dhcpv4Exchange& ex) { + // First collect required classes Pkt4Ptr query = ex.getQuery(); ClientClasses classes = query->getClasses(true); Subnet4Ptr subnet = ex.getContext()->subnet_; @@ -3028,7 +3028,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { SharedNetwork4Ptr network; subnet->getSharedNetwork(network); if (network) { - const ClientClasses& to_add = network->getOnDemandClasses(); + const ClientClasses& to_add = network->getRequiredClasses(); for (ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3036,7 +3036,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { } // Followed by the subnet - const ClientClasses& to_add = subnet->getOnDemandClasses(); + const ClientClasses& to_add = subnet->getRequiredClasses(); for(ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3051,7 +3051,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { if (!addr.isV4Zero()) { PoolPtr pool = subnet->getPool(Lease::TYPE_V4, addr, false); if (pool) { - const ClientClasses& to_add = pool->getOnDemandClasses(); + const ClientClasses& to_add = pool->getRequiredClasses(); for (ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3070,7 +3070,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) { cclass != classes.cend(); ++cclass) { const ClientClassDefPtr class_def = dict->findClass(*cclass); if (!class_def) { - LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNKNOWN) + LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNDEFINED) .arg(*cclass); continue; } diff --git a/src/bin/dhcp4/dhcp4_srv.h b/src/bin/dhcp4/dhcp4_srv.h index 536ef263da..2569386d79 100644 --- a/src/bin/dhcp4/dhcp4_srv.h +++ b/src/bin/dhcp4/dhcp4_srv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -803,17 +803,17 @@ protected: /// @param pkt packet to be classified void classifyPacket(const Pkt4Ptr& pkt); - /// @brief Assigns incoming packet to zero or more classes (late pass). + /// @brief Assigns incoming packet to zero or more classes (required pass). /// - /// @note This late classification evaluates all classes which - /// were marked for this deferred/on-demand pass. Classes are - /// collected in the reversed order than output option processing. + /// @note This required classification evaluates all classes which + /// were marked for required evaluation. Classes are collected so + /// evaluated in the reversed order than output option processing. /// - /// @note The eval-on-demand flag is related because it avoids + /// @note The only-if-required flag is related because it avoids /// double evaluation (which is not forbidden). /// /// @param ex The exchange holding needed informations. - void lateClassify(Dhcpv4Exchange& ex); + void requiredClassify(Dhcpv4Exchange& ex); /// @brief Perform deferred option unpacking. /// diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 18a2230937..504ed6a577 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -56,7 +56,7 @@ namespace { /// or member(), set boot-file-name to pxelinux.0 /// /// - Configuration 3: -/// - Used for late/on-demand classification +/// - Used for required classification /// - 1 subnet: 10.0.0.0/24 /// - 1 pool: 10.0.0.10-10.0.0.100 /// - the following classes defined: @@ -185,19 +185,19 @@ const char* CONFIGS[] = { "{" " \"name\": \"pxe1\"," " \"test\": \"option[93].hex == 0x0009\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"next-server\": \"1.2.3.4\"" "}," "{" " \"name\": \"pxe2\"," " \"test\": \"option[93].hex == 0x0007\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"server-hostname\": \"deneb\"" "}," "{" " \"name\": \"pxe3\"," " \"test\": \"option[93].hex == 0x0006\"," - " \"eval-on-demand\": false," + " \"only-if-required\": false," " \"boot-file-name\": \"pxelinux.0\"" "}," "{" @@ -209,7 +209,7 @@ const char* CONFIGS[] = { " \"subnet\": \"10.0.0.0/24\", " " \"id\": 1," " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]," - " \"eval-client-classes\": [ \"pxe2\" ]" + " \"required-client-classes\": [ \"pxe2\" ]" " } ]" "}" @@ -566,7 +566,7 @@ TEST_F(ClassifyTest, fixedFieldsInformNoClasses3) { testFixedFields(CONFIGS[3], DHCPINFORM, OptionPtr(), "0.0.0.0", "", ""); } -// Class 'pxe1' is on-demand and not subject to late evaluation +// Class 'pxe1' is only-if-required and not subject to required evaluation TEST_F(ClassifyTest, fixedFieldsDiscoverNextServer3) { OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); @@ -584,7 +584,7 @@ TEST_F(ClassifyTest, fixedFieldsInformNextServer3) { } -// Class pxe2 is on-demand but the subnet requests its late evaluation +// Class pxe2 is only-if-required but the subnet requires its evaluation TEST_F(ClassifyTest, fixedFieldsDiscoverHostname3) { OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); @@ -633,7 +633,7 @@ TEST_F(ClassifyTest, fixedFieldsInformFile32) { testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "", "ipxe.efi"); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceNone) { std::string config = @@ -650,7 +650,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.1\"" @@ -659,7 +659,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.2\"" @@ -668,7 +668,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.3\"" @@ -705,7 +705,7 @@ TEST_F(ClassifyTest, precedenceNone) { EXPECT_FALSE(opt); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedencePool) { std::string config = @@ -722,7 +722,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.1\"" @@ -731,7 +731,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.2\"" @@ -740,7 +740,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.3\"" @@ -754,7 +754,7 @@ TEST_F(ClassifyTest, precedencePool) { " \"id\": 1," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" @@ -784,7 +784,7 @@ TEST_F(ClassifyTest, precedencePool) { EXPECT_EQ("10.0.0.1", addrs[0].toText()); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceSubnet) { std::string config = @@ -801,7 +801,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.1\"" @@ -810,7 +810,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.2\"" @@ -819,7 +819,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.3\"" @@ -831,10 +831,10 @@ TEST_F(ClassifyTest, precedenceSubnet) { " \"subnet4\": [ { " " \"subnet\": \"10.0.0.0/24\"," " \"id\": 1," - " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"required-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" @@ -864,7 +864,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { EXPECT_EQ("10.0.0.2", addrs[0].toText()); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceNetwork) { std::string config = @@ -881,7 +881,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.1\"" @@ -890,7 +890,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.2\"" @@ -899,7 +899,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"domain-name-servers\"," " \"data\": \"10.0.0.3\"" @@ -908,14 +908,14 @@ TEST_F(ClassifyTest, precedenceNetwork) { "]," "\"shared-networks\": [ {" " \"name\": \"frog\"," - " \"eval-client-classes\": [ \"for-network\" ]," + " \"required-client-classes\": [ \"for-network\" ]," " \"subnet4\": [ { " " \"subnet\": \"10.0.0.0/24\"," " \"id\": 1," - " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"required-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index a8ab21ed1f..d8c8afd79d 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1047,15 +1047,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"eval-client-classes\" { +\"required-client-classes\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: case isc::dhcp::Parser6Context::POOLS: case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::SHARED_NETWORK: - return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("required-client-classes", driver.loc_); } } @@ -1081,12 +1081,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"eval-on-demand\" { +\"only-if-required\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: - return isc::dhcp::Dhcp6Parser::make_EVAL_ON_DEMAND(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_ONLY_IF_REQUIRED(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("eval-on-demand", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("only-if-required", driver.loc_); } } diff --git a/src/bin/dhcp6/dhcp6_messages.mes b/src/bin/dhcp6/dhcp6_messages.mes index aececc9b71..d59ad58df5 100644 --- a/src/bin/dhcp6/dhcp6_messages.mes +++ b/src/bin/dhcp6/dhcp6_messages.mes @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this @@ -66,12 +66,12 @@ which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is inconsistent. -% DHCP6_CLASS_UNKNOWN on-demand class %1 has no definition -This debug message informs that a class is listed for late evaluation but +% DHCP6_CLASS_UNDEFINED required class %1 has no definition +This debug message informs that a class is listed for required evaluation but has no definition. -% DHCP6_CLASS_UNTESTABLE on-demand class %1 has no test expression -This debug message informs that a class was listed for late evaluation but +% DHCP6_CLASS_UNTESTABLE required class %1 has no test expression +This debug message informs that a class was listed for required evaluation but its definition does not include a test expression to evaluate. % DHCP6_COMMAND_RECEIVED received command %1, arguments: %2 diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 0720846ceb..9bfaa141d5 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -116,9 +116,9 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" - EVAL_CLIENT_CLASSES "eval-client-classes" + REQUIRED_CLIENT_CLASSES "required-client-classes" TEST "test" - EVAL_ON_DEMAND "eval-on-demand" + ONLY_IF_REQUIRED "only-if-required" CLIENT_CLASS "client-class" RESERVATIONS "reservations" @@ -906,7 +906,7 @@ subnet6_param: preferred_lifetime | id | rapid_commit | client_class - | eval_client_classes + | required_client_classes | reservations | reservation_mode | relay @@ -946,9 +946,9 @@ client_class: CLIENT_CLASS { ctx.leave(); }; -eval_client_classes: EVAL_CLIENT_CLASSES { +required_client_classes: REQUIRED_CLIENT_CLASSES { ElementPtr c(new ListElement(ctx.loc2pos(@1))); - ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.back()->set("required-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } COLON list_strings { @@ -1023,7 +1023,7 @@ shared_network_param: name | relay | reservation_mode | client_class - | eval_client_classes + | required_client_classes | preferred_lifetime | rapid_commit | valid_lifetime @@ -1307,7 +1307,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class - | eval_client_classes + | required_client_classes | user_context | unknown_map_entry ; @@ -1383,7 +1383,7 @@ pd_pool_param: pd_prefix | pd_delegated_len | option_data_list | client_class - | eval_client_classes + | required_client_classes | excluded_prefix | excluded_prefix_len | user_context @@ -1600,7 +1600,7 @@ not_empty_client_class_params: client_class_param client_class_param: client_class_name | client_class_test - | eval_on_demand + | only_if_required | option_data_list | unknown_map_entry ; @@ -1615,9 +1615,9 @@ client_class_test: TEST { ctx.leave(); }; -eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN { +only_if_required: ONLY_IF_REQUIRED COLON BOOLEAN { ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); - ctx.stack_.back()->set("eval-on-demand", b); + ctx.stack_.back()->set("only-if-required", b); }; // --- end of client classes --------------------------------- diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index cfdd446195..7c99b98b50 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2487,7 +2487,7 @@ Dhcpv6Srv::processSolicit(const Pkt6Ptr& solicit) { assignLeases(solicit, response, ctx); setReservedClientClasses(solicit, ctx); - lateClassify(solicit, ctx); + requiredClassify(solicit, ctx); copyClientOptions(solicit, response); CfgOptionList co_list; @@ -2522,7 +2522,7 @@ Dhcpv6Srv::processRequest(const Pkt6Ptr& request) { assignLeases(request, reply, ctx); setReservedClientClasses(request, ctx); - lateClassify(request, ctx); + requiredClassify(request, ctx); copyClientOptions(request, reply); CfgOptionList co_list; @@ -2553,7 +2553,7 @@ Dhcpv6Srv::processRenew(const Pkt6Ptr& renew) { extendLeases(renew, reply, ctx); setReservedClientClasses(renew, ctx); - lateClassify(renew, ctx); + requiredClassify(renew, ctx); copyClientOptions(renew, reply); CfgOptionList co_list; @@ -2584,7 +2584,7 @@ Dhcpv6Srv::processRebind(const Pkt6Ptr& rebind) { extendLeases(rebind, reply, ctx); setReservedClientClasses(rebind, ctx); - lateClassify(rebind, ctx); + requiredClassify(rebind, ctx); copyClientOptions(rebind, reply); CfgOptionList co_list; @@ -2609,7 +2609,7 @@ Dhcpv6Srv::processConfirm(const Pkt6Ptr& confirm) { AllocEngine::ClientContext6 ctx; initContext(confirm, ctx); setReservedClientClasses(confirm, ctx); - lateClassify(confirm, ctx); + requiredClassify(confirm, ctx); // Get IA_NAs from the Confirm. If there are none, the message is // invalid and must be discarded. There is nothing more to do. @@ -2703,7 +2703,7 @@ Dhcpv6Srv::processRelease(const Pkt6Ptr& release) { AllocEngine::ClientContext6 ctx; initContext(release, ctx); setReservedClientClasses(release, ctx); - lateClassify(release, ctx); + requiredClassify(release, ctx); Pkt6Ptr reply(new Pkt6(DHCPV6_REPLY, release->getTransid())); @@ -2733,7 +2733,7 @@ Dhcpv6Srv::processDecline(const Pkt6Ptr& decline) { AllocEngine::ClientContext6 ctx; initContext(decline, ctx); setReservedClientClasses(decline, ctx); - lateClassify(decline, ctx); + requiredClassify(decline, ctx); // Copy client options (client-id, also relay information if present) copyClientOptions(decline, reply); @@ -3015,7 +3015,7 @@ Dhcpv6Srv::processInfRequest(const Pkt6Ptr& inf_request) { AllocEngine::ClientContext6 ctx; initContext(inf_request, ctx); setReservedClientClasses(inf_request, ctx); - lateClassify(inf_request, ctx); + requiredClassify(inf_request, ctx); // Create a Reply packet, with the same trans-id as the client's. Pkt6Ptr reply(new Pkt6(DHCPV6_REPLY, inf_request->getTransid())); @@ -3102,8 +3102,8 @@ void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { if (!expr_ptr) { continue; } - // Not the right time if on demand - if ((*it)->getOnDemand()) { + // Not the right time if only when required + if ((*it)->getRequired()) { continue; } // Evaluate the expression which can return false (no match), @@ -3154,8 +3154,8 @@ Dhcpv6Srv::setReservedClientClasses(const Pkt6Ptr& pkt, } void -Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { - // First collect on-demand classes +Dhcpv6Srv::requiredClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { + // First collect required classes ClientClasses classes = pkt->getClasses(true); Subnet6Ptr subnet = ctx.subnet_; @@ -3164,7 +3164,7 @@ Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { SharedNetwork6Ptr network; subnet->getSharedNetwork(network); if (network) { - const ClientClasses& to_add = network->getOnDemandClasses(); + const ClientClasses& to_add = network->getRequiredClasses(); for (ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3172,7 +3172,7 @@ Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { } // Followed by the subnet - const ClientClasses& to_add = subnet->getOnDemandClasses(); + const ClientClasses& to_add = subnet->getRequiredClasses(); for(ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3187,7 +3187,7 @@ Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { resource.first, false); if (pool) { - const ClientClasses& to_add = pool->getOnDemandClasses(); + const ClientClasses& to_add = pool->getRequiredClasses(); for (ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); @@ -3206,7 +3206,7 @@ Dhcpv6Srv::lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx) { cclass != classes.cend(); ++cclass) { const ClientClassDefPtr class_def = dict->findClass(*cclass); if (!class_def) { - LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_UNKNOWN) + LOG_DEBUG(dhcp6_logger, DBG_DHCP6_BASIC, DHCP6_CLASS_UNDEFINED) .arg(*cclass); continue; } diff --git a/src/bin/dhcp6/dhcp6_srv.h b/src/bin/dhcp6/dhcp6_srv.h index a63691f8ce..4f6a68a54e 100644 --- a/src/bin/dhcp6/dhcp6_srv.h +++ b/src/bin/dhcp6/dhcp6_srv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -649,18 +649,18 @@ protected: void setReservedClientClasses(const Pkt6Ptr& pkt, const AllocEngine::ClientContext6& ctx); - /// @brief Assigns incoming packet to zero or more classes (late pass). + /// @brief Assigns incoming packet to zero or more classes (required pass). /// - /// @note This late classification evaluates all classes which - /// were marked for this deferred/on-demand pass. Classes are - /// collected in the reversed order than output option processing. + /// @note This required classification evaluates all classes which + /// were marked for required evaluation. Classes are collected so + /// evaluated in the reversed order than output option processing. /// - /// @note The eval-on-demand flag is related because it avoids + /// @note The only-if-required flag is related because it avoids /// double evaluation (which is not forbidden). /// /// @param pkt packet to be classified /// @param ctx allocation context where to get informations - void lateClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx); + void requiredClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx); /// @brief Attempts to get a MAC/hardware address using configured sources /// diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 8fc19dcce0..99611da61e 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -302,8 +302,8 @@ TEST_F(ClassifyTest, matchClassification) { EXPECT_FALSE(opt3); } -// Check that on-demand classes are not evaluated by classifyPacket -TEST_F(ClassifyTest, onDemand) { +// Check that only-if-required classes are not evaluated by classifyPacket +TEST_F(ClassifyTest, required) { IfaceMgrTestConfig test_config(true); NakedDhcpv6Srv srv(0); @@ -329,7 +329,7 @@ TEST_F(ClassifyTest, onDemand) { " \"interface\": \"eth1\" } ]," "\"client-classes\": [ " "{ \"name\": \"router\", " - " \"eval-on-demand\": true, " + " \"only-if-required\": true, " " \"option-data\": [" " { \"name\": \"ipv6-forwarding\", " " \"data\": \"true\" } ], " @@ -391,8 +391,8 @@ TEST_F(ClassifyTest, onDemand) { EXPECT_FALSE(opt3); } -// Checks that when requested on-demand classes are still (but late) evaluated -TEST_F(ClassifyTest, lateClassification) { +// Checks that when only-if-required classes are still evaluated +TEST_F(ClassifyTest, requiredClassification) { IfaceMgrTestConfig test_config(true); NakedDhcpv6Srv srv(0); @@ -415,11 +415,11 @@ TEST_F(ClassifyTest, lateClassification) { "\"subnet6\": [ " "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " " \"subnet\": \"2001:db8:1::/48\", " - " \"eval-client-classes\": [ \"router\" ], " + " \"require-client-classes\": [ \"router\" ], " " \"interface\": \"eth1\" } ]," "\"client-classes\": [ " "{ \"name\": \"router\", " - " \"eval-on-demand\": true, " + " \"only-if-required\": true, " " \"option-data\": [" " { \"name\": \"ipv6-forwarding\", " " \"data\": \"true\" } ], " @@ -1221,7 +1221,7 @@ TEST_F(ClassifyTest, member) { EXPECT_FALSE(ipf3->readBoolean()); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceNone) { std::string config = @@ -1240,7 +1240,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::1\"" @@ -1249,7 +1249,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::2\"" @@ -1258,7 +1258,7 @@ TEST_F(ClassifyTest, precedenceNone) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::3\"" @@ -1299,7 +1299,7 @@ TEST_F(ClassifyTest, precedenceNone) { EXPECT_FALSE(opt); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedencePool) { std::string config = @@ -1316,7 +1316,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::1\"" @@ -1325,7 +1325,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::2\"" @@ -1334,7 +1334,7 @@ TEST_F(ClassifyTest, precedencePool) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::3\"" @@ -1349,7 +1349,7 @@ TEST_F(ClassifyTest, precedencePool) { " \"id\": 1," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1382,7 +1382,7 @@ TEST_F(ClassifyTest, precedencePool) { EXPECT_EQ("2001:db8:1::1", addrs[0].toText()); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceSubnet) { std::string config = @@ -1399,7 +1399,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::1\"" @@ -1408,7 +1408,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::2\"" @@ -1417,7 +1417,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::3\"" @@ -1430,10 +1430,10 @@ TEST_F(ClassifyTest, precedenceSubnet) { " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1466,7 +1466,7 @@ TEST_F(ClassifyTest, precedenceSubnet) { EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); } -// This test checks the precedence order in requested late evaluation. +// This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceNetwork) { std::string config = @@ -1483,7 +1483,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-pool\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::1\"" @@ -1492,7 +1492,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-subnet\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::2\"" @@ -1501,7 +1501,7 @@ TEST_F(ClassifyTest, precedenceNetwork) { " {" " \"name\": \"for-network\"," " \"test\": \"member('all')\"," - " \"eval-on-demand\": true," + " \"only-if-required\": true," " \"option-data\": [ {" " \"name\": \"dns-servers\"," " \"data\": \"2001:db8:1::3\"" @@ -1511,14 +1511,14 @@ TEST_F(ClassifyTest, precedenceNetwork) { "\"shared-networks\": [ {" " \"name\": \"frog\"," " \"interface\": \"eth1\"," - " \"eval-client-classes\": [ \"for-network\" ]," + " \"require-client-classes\": [ \"for-network\" ]," " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"eval-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"eval-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," diff --git a/src/lib/dhcp/pkt.cc b/src/lib/dhcp/pkt.cc index a6261802d5..cc7c2739cc 100644 --- a/src/lib/dhcp/pkt.cc +++ b/src/lib/dhcp/pkt.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -97,8 +97,8 @@ Pkt::inClass(const std::string& client_class) { } void -Pkt::addClass(const std::string& client_class, bool deferred) { - ClientClasses& classes = !deferred ? classes_ : on_demand_classes_; +Pkt::addClass(const std::string& client_class, bool required) { + ClientClasses& classes = !required ? classes_ : required_classes_; if (!classes.contains(client_class)) { classes.insert(client_class); } diff --git a/src/lib/dhcp/pkt.h b/src/lib/dhcp/pkt.h index bde7a8500e..f2efc14de8 100644 --- a/src/lib/dhcp/pkt.h +++ b/src/lib/dhcp/pkt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -285,18 +285,19 @@ public: /// so I decided to stick with addClass(). /// /// @param client_class name of the class to be added - /// @param deferred the class is marked for late evaluation + /// @param required the class is marked for required evaluation void addClass(const isc::dhcp::ClientClass& client_class, - bool deferred = false); + bool required = false); /// @brief Returns the class set /// /// @note This should be used only to iterate over the class set. - /// @param deferred return classes or to be evaluated classes. - /// @return if deferred is false (the default) the claases the - /// packet belongs to else the classes which will be evaluated later. - const ClientClasses& getClasses(bool deferred = false) const { - return (!deferred ? classes_ : on_demand_classes_); + /// @param required return classes or required to be evaluated classes. + /// @return if required is false (the default) the classes the + /// packet belongs to else the classes which are required to be + /// evaluated. + const ClientClasses& getClasses(bool required = false) const { + return (!required ? classes_ : required_classes_); } /// @brief Unparsed data (in received packets). @@ -585,13 +586,13 @@ public: /// @ref addClass should be used to operate on this field. ClientClasses classes_; - /// @brief Classes which will be evaluated later. + /// @brief Classes which are required to be evaluated. /// /// The comment on @ref classes_ applies here. /// /// Before output option processing these classes will be evaluated /// and if evaluation status is true added to the previous collection. - ClientClasses on_demand_classes_; + ClientClasses required_classes_; /// @brief Collection of options present in this message. /// diff --git a/src/lib/dhcpsrv/client_class_def.cc b/src/lib/dhcpsrv/client_class_def.cc index 0b85639bf2..91c9635164 100644 --- a/src/lib/dhcpsrv/client_class_def.cc +++ b/src/lib/dhcpsrv/client_class_def.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -18,7 +18,7 @@ namespace dhcp { ClientClassDef::ClientClassDef(const std::string& name, const ExpressionPtr& match_expr, const CfgOptionPtr& cfg_option) - : name_(name), match_expr_(match_expr), on_demand_(false), + : name_(name), match_expr_(match_expr), required_(false), cfg_option_(cfg_option), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()) { @@ -38,7 +38,7 @@ ClientClassDef::ClientClassDef(const std::string& name, ClientClassDef::ClientClassDef(const ClientClassDef& rhs) : name_(rhs.name_), match_expr_(ExpressionPtr()), - on_demand_(false), cfg_option_(new CfgOption()), + required_(false), cfg_option_(new CfgOption()), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()) { if (rhs.match_expr_) { @@ -54,7 +54,7 @@ ClientClassDef::ClientClassDef(const ClientClassDef& rhs) rhs.cfg_option_->copyTo(*cfg_option_); } - on_demand_ = rhs.on_demand_; + required_ = rhs.required_; next_server_ = rhs.next_server_; sname_ = rhs.sname_; filename_ = rhs.filename_; @@ -94,13 +94,13 @@ ClientClassDef::setTest(const std::string& test) { } bool -ClientClassDef::getOnDemand() const { - return (on_demand_); +ClientClassDef::getRequired() const { + return (required_); } void -ClientClassDef::setOnDemand(bool on_demand) { - on_demand_ = on_demand; +ClientClassDef::setRequired(bool required) { + required_ = required; } const CfgOptionDefPtr& @@ -135,7 +135,7 @@ ClientClassDef::equals(const ClientClassDef& other) const { ((!cfg_option_def_ && !other.cfg_option_def_) || (cfg_option_def_ && other.cfg_option_def_ && (*cfg_option_def_ == *other.cfg_option_def_))) && - (on_demand_ == other.on_demand_) && + (required_ == other.required_) && (next_server_ == other.next_server_) && (sname_ == other.sname_) && (filename_ == other.filename_)); @@ -151,9 +151,9 @@ ClientClassDef:: toElement() const { if (!test_.empty()) { result->set("test", Element::create(test_)); } - // Set eval-on-demand - if (on_demand_) { - result->set("eval-on-demand", Element::create(on_demand_)); + // Set only-if-required + if (required_) { + result->set("only-if-required", Element::create(required_)); } // Set option-def (used only by DHCPv4) if (cfg_option_def_ && (family == AF_INET)) { @@ -200,7 +200,7 @@ void ClientClassDictionary::addClass(const std::string& name, const ExpressionPtr& match_expr, const std::string& test, - bool on_demand, + bool required, const CfgOptionPtr& cfg_option, CfgOptionDefPtr cfg_option_def, asiolink::IOAddress next_server, @@ -208,7 +208,7 @@ ClientClassDictionary::addClass(const std::string& name, const std::string& filename) { ClientClassDefPtr cclass(new ClientClassDef(name, match_expr, cfg_option)); cclass->setTest(test); - cclass->setOnDemand(on_demand); + cclass->setRequired(required); cclass->setCfgOptionDef(cfg_option_def); cclass->setNextServer(next_server); cclass->setSname(sname); diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index b38263aba2..adcfe0e664 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -82,11 +82,11 @@ public: /// @param test the original expression to assign the class void setTest(const std::string& test); - /// @brief Fetches the on demand flag - bool getOnDemand() const; + /// @brief Fetches the only if required flag + bool getRequired() const; - /// @brief Sets the on demand flag - void setOnDemand(bool on_demand); + /// @brief Sets the only if required flag + void setRequired(bool required); /// @brief Fetches the class's option definitions const CfgOptionDefPtr& getCfgOptionDef() const; @@ -188,11 +188,11 @@ private: /// this class. std::string test_; - /// @brief The on demand flag: when false (the defaul) membership + /// @brief The only if required flag: when false (the defaul) membership /// is determined during classification so is for instance /// available for subnet selection, when true membership is evaluated - /// only if asked for and is usable only for option configuration. - bool on_demand_; + /// only when required for and is usable only for option configuration. + bool required_; /// @brief The option definition configuration for this class CfgOptionDefPtr cfg_option_def_; @@ -251,7 +251,7 @@ public: /// @param name Name to assign to this class /// @param match_expr Expression the class will use to determine membership /// @param test Original version of match_expr - /// @param on_demand Original value of the on demand flag + /// @param required Original value of the only if required flag /// @param options Collection of options members should be given /// @param defs Option definitions (optional) /// @param next_server next-server value for this class (optional) @@ -262,7 +262,7 @@ public: /// dictionary. See @ref dhcp::ClientClassDef::ClientClassDef() for /// others. void addClass(const std::string& name, const ExpressionPtr& match_expr, - const std::string& test, bool on_demand, + const std::string& test, bool required, const CfgOptionPtr& options, CfgOptionDefPtr defs = CfgOptionDefPtr(), asiolink::IOAddress next_server = asiolink::IOAddress("0.0.0.0"), diff --git a/src/lib/dhcpsrv/network.cc b/src/lib/dhcpsrv/network.cc index 9ba52a8598..0c48dba822 100644 --- a/src/lib/dhcpsrv/network.cc +++ b/src/lib/dhcpsrv/network.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -37,15 +37,15 @@ Network::allowClientClass(const isc::dhcp::ClientClass& class_name) { } void -Network::deferClientClass(const isc::dhcp::ClientClass& class_name) { - if (!on_demand_classes_.contains(class_name)) { - on_demand_classes_.insert(class_name); +Network::requireClientClass(const isc::dhcp::ClientClass& class_name) { + if (!required_classes_.contains(class_name)) { + required_classes_.insert(class_name); } } const ClientClasses& -Network::getOnDemandClasses() const { - return (on_demand_classes_); +Network::getRequiredClasses() const { + return (required_classes_); } ElementPtr @@ -70,15 +70,15 @@ Network::toElement() const { map->set("client-class", Element::create(cclass)); } - // Set eval-client-classes - const ClientClasses& classes = getOnDemandClasses(); + // Set required-client-classes + const ClientClasses& classes = getRequiredClasses(); if (!classes.empty()) { ElementPtr class_list = Element::createList(); for (ClientClasses::const_iterator it = classes.cbegin(); it != classes.cend(); ++it) { class_list->add(Element::create(*it)); } - map->set("eval-client-classes", class_list); + map->set("required-client-classes", class_list); } // Set renew-timer diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index b34eb6e424..40ffe93010 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -172,13 +172,13 @@ public: /// @param class_name client class to be supported by this network void allowClientClass(const isc::dhcp::ClientClass& class_name); - /// @brief Adds class class_name to classes to be evaluated later + /// @brief Adds class class_name to classes required to be evaluated. /// - /// @param class_name client class to be evaluated later - void deferClientClass(const isc::dhcp::ClientClass& class_name); + /// @param class_name client class required to be evaluated + void requireClientClass(const isc::dhcp::ClientClass& class_name); - /// @brief Returns classes which will be evaluated later - const isc::dhcp::ClientClasses& getOnDemandClasses() const; + /// @brief Returns classes which are required to be evaluated + const isc::dhcp::ClientClasses& getRequiredClasses() const; /// @brief returns the client class /// @@ -281,11 +281,11 @@ protected: /// which means that any client is allowed, regardless of its class. ClientClass client_class_; - /// @brief On demand classes + /// @brief Required classes /// /// If the network is selected these classes will be added to the - /// incoming packet and evaluated later. - ClientClasses on_demand_classes_; + /// incoming packet and their evaluation will be required. + ClientClasses required_classes_; /// @brief a Triplet (min/default/max) holding allowed renew timer values Triplet t1_; diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc index cf4b231bbe..1e4714203a 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -132,10 +132,10 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, opts_parser.parse(options, option_data); } - // Let's try to parse the eval-on-demand flag - bool on_demand = false; - if (class_def_cfg->contains("eval-on-demand")) { - on_demand = getBoolean(class_def_cfg, "eval-on-demand"); + // Let's try to parse the only-if-required flag + bool required = false; + if (class_def_cfg->contains("only-if-required")) { + required = getBoolean(class_def_cfg, "only-if-required"); } // Let's try to parse the next-server field @@ -193,7 +193,7 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, // Add the client class definition try { - class_dictionary->addClass(name, match_expr, test, on_demand, options, + class_dictionary->addClass(name, match_expr, test, required, options, defs, next_server, sname, filename); } catch (const std::exception& ex) { isc_throw(DhcpConfigError, "Can't add class: " << ex.what() diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 4c41cbf848..ce1879f97c 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -388,8 +388,8 @@ PoolParser::parse(PoolStoragePtr pools, } } - // Try setting up on demand client classes. - ConstElementPtr class_list = pool_structure->get("eval-client-classes"); + // Try setting up required client classes. + ConstElementPtr class_list = pool_structure->get("required-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); @@ -399,7 +399,7 @@ PoolParser::parse(PoolStoragePtr pools, isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - pool->deferClientClass((*cclass)->stringValue()); + pool->requireClientClass((*cclass)->stringValue()); } } } @@ -711,8 +711,8 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params, subnet4->allowClientClass(client_class); } - // Try setting up on demand client classes. - ConstElementPtr class_list = params->get("eval-client-classes"); + // Try setting up required client classes. + ConstElementPtr class_list = params->get("required-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); @@ -722,7 +722,7 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params, isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - subnet4->deferClientClass((*cclass)->stringValue()); + subnet4->requireClientClass((*cclass)->stringValue()); } } @@ -891,7 +891,7 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { client_class_ = client_class; } - ConstElementPtr class_list = pd_pool_->get("eval-client-classes"); + ConstElementPtr class_list = pd_pool_->get("required-client-classes"); // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. @@ -932,7 +932,7 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - pool_->deferClientClass((*cclass)->stringValue()); + pool_->requireClientClass((*cclass)->stringValue()); } } @@ -1111,8 +1111,8 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params, subnet6->allowClientClass(client_class); } - // Try setting up on demand client classes. - ConstElementPtr class_list = params->get("eval-client-classes"); + // Try setting up required client classes. + ConstElementPtr class_list = params->get("required-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); @@ -1122,7 +1122,7 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params, isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - subnet6->deferClientClass((*cclass)->stringValue()); + subnet6->requireClientClass((*cclass)->stringValue()); } } diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 91c104fdef..5a04e6cd20 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -70,9 +70,9 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { } } - if (shared_network_data->contains("eval-client-classes")) { + if (shared_network_data->contains("required-client-classes")) { const std::vector& class_list = - shared_network_data->get("eval-client-classes")->listValue(); + shared_network_data->get("required-client-classes")->listValue(); for (auto cclass = class_list.cbegin(); cclass != class_list.cend(); ++cclass) { if (((*cclass)->getType() != Element::string) || @@ -80,7 +80,7 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - shared_network->deferClientClass((*cclass)->stringValue()); + shared_network->requireClientClass((*cclass)->stringValue()); } } @@ -125,9 +125,9 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { } } - if (shared_network_data->contains("eval-client-classes")) { + if (shared_network_data->contains("required-client-classes")) { const std::vector& class_list = - shared_network_data->get("eval-client-classes")->listValue(); + shared_network_data->get("required-client-classes")->listValue(); for (auto cclass = class_list.cbegin(); cclass != class_list.cend(); ++cclass) { if (((*cclass)->getType() != Element::string) || @@ -135,7 +135,7 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { isc_throw(DhcpConfigError, "invalid class name (" << (*cclass)->getPosition() << ")"); } - shared_network->deferClientClass((*cclass)->stringValue()); + shared_network->requireClientClass((*cclass)->stringValue()); } } diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index edc5db276a..2e96ee1ded 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -112,15 +112,15 @@ Pool::toElement() const { map->set("client-class", Element::create(cclass)); } - // Set eval-client-classes - const ClientClasses& classes = getOnDemandClasses(); + // Set required-client-classes + const ClientClasses& classes = getRequiredClasses(); if (!classes.empty()) { ElementPtr class_list =Element::createList(); for (ClientClasses::const_iterator it = classes.cbegin(); it != classes.cend(); ++it) { class_list->add(Element::create(*it)); } - map->set("eval-client-classes", class_list); + map->set("required-client-classes", class_list); } return (map); diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index a1ae604a8d..30d1e2f7ed 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -129,18 +129,18 @@ public: return (client_class_); } - /// @brief Adds class class_name to classes to be evaluated later + /// @brief Adds class class_name to classes required to be evaluated /// - /// @param class_name client class to be evaluated later - void deferClientClass(const ClientClass& class_name) { - if (!on_demand_classes_.contains(class_name)) { - on_demand_classes_.insert(class_name); + /// @param class_name client class required to be evaluated + void requireClientClass(const ClientClass& class_name) { + if (!required_classes_.contains(class_name)) { + required_classes_.insert(class_name); } } - /// @brief Returns classes which will be evaluated later - const ClientClasses& getOnDemandClasses() const { - return (on_demand_classes_); + /// @brief Returns classes which are required to be evaluated + const ClientClasses& getRequiredClasses() const { + return (required_classes_); } /// @brief returns the last address that was tried from this pool @@ -232,10 +232,10 @@ protected: /// @ref Network::client_class_ ClientClass client_class_; - /// @brief On demand classes + /// @brief Required classes /// - /// @ref isc::dhcp::Network::on_demand_classes - ClientClasses on_demand_classes_; + /// @ref isc::dhcp::Network::required_classes + ClientClasses required_classes_; /// @brief Pointer to the user context (may be NULL) data::ConstElementPtr user_context_; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index c142dfa520..8f8c691d87 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -739,8 +739,8 @@ TEST(CfgSubnets4Test, unparseSubnet) { subnet2->setIface("lo"); subnet2->setRelayInfo(IOAddress("10.0.0.1")); subnet3->setIface("eth1"); - subnet3->deferClientClass("foo"); - subnet3->deferClientClass("bar"); + subnet3->requireClientClass("foo"); + subnet3->requireClientClass("bar"); cfg.add(subnet1); cfg.add(subnet2); @@ -802,7 +802,7 @@ TEST(CfgSubnets4Test, unparseSubnet) { " \"reservation-mode\": \"all\",\n" " \"option-data\": [ ],\n" " \"pools\": [ ]\n," - " \"eval-client-classes\": [ \"foo\", \"bar\" ]\n" + " \"required-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -816,7 +816,7 @@ TEST(CfgSubnets4Test, unparsePool) { Pool4Ptr pool1(new Pool4(IOAddress("192.0.2.1"), IOAddress("192.0.2.10"))); Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); pool2->allowClientClass("bar"); - pool2->deferClientClass("foo"); + pool2->requireClientClass("foo"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -848,7 +848,7 @@ TEST(CfgSubnets4Test, unparsePool) { " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\",\n" " \"client-class\": \"bar\",\n" - " \"eval-client-classes\": [ \"foo\" ]\n" + " \"required-client-classes\": [ \"foo\" ]\n" " }\n" " ]\n" "} ]\n"; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index 63c3297247..6d1f6baad4 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -438,8 +438,8 @@ TEST(CfgSubnets6Test, unparseSubnet) { subnet2->setIface("lo"); subnet2->setRelayInfo(IOAddress("2001:db8:ff::2")); subnet3->setIface("eth1"); - subnet3->deferClientClass("foo"); - subnet3->deferClientClass("bar"); + subnet3->requireClientClass("foo"); + subnet3->requireClientClass("bar"); cfg.add(subnet1); cfg.add(subnet2); @@ -490,7 +490,7 @@ TEST(CfgSubnets6Test, unparseSubnet) { " \"pools\": [ ],\n" " \"pd-pools\": [ ],\n" " \"option-data\": [ ],\n" - " \"eval-client-classes\": [ \"foo\", \"bar\" ]\n" + " \"required-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -507,7 +507,7 @@ TEST(CfgSubnets6Test, unparsePool) { IOAddress("2001:db8:1::199"))); Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); pool2->allowClientClass("bar"); - pool2->deferClientClass("foo"); + pool2->requireClientClass("foo"); subnet->addPool(pool1); subnet->addPool(pool2); @@ -533,7 +533,7 @@ TEST(CfgSubnets6Test, unparsePool) { " \"pool\": \"2001:db8:1:1::/64\",\n" " \"option-data\": [ ],\n" " \"client-class\": \"bar\",\n" - " \"eval-client-classes\": [ \"foo\" ]\n" + " \"required-client-classes\": [ \"foo\" ]\n" " }\n" " ],\n" " \"pd-pools\": [ ],\n" @@ -554,7 +554,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { IOAddress("2001:db8:2::"), 48, 64)); Pool6Ptr pdpool2(new Pool6(IOAddress("2001:db8:3::"), 48, 56, IOAddress("2001:db8:3::"), 64)); - pdpool1->deferClientClass("bar"); + pdpool1->requireClientClass("bar"); pdpool2->allowClientClass("bar"); subnet->addPool(pdpool1); @@ -580,7 +580,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"prefix-len\": 48,\n" " \"delegated-len\": 64,\n" " \"option-data\": [ ],\n" - " \"eval-client-classes\": [ \"bar\" ]\n" + " \"required-client-classes\": [ \"bar\" ]\n" " },{\n" " \"prefix\": \"2001:db8:3::\",\n" " \"prefix-len\": 48,\n" diff --git a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc index 816d100c96..9d8eabb27d 100644 --- a/src/lib/dhcpsrv/tests/client_class_def_unittest.cc +++ b/src/lib/dhcpsrv/tests/client_class_def_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -142,10 +142,10 @@ TEST(ClientClassDef, copyAndEquality) { EXPECT_TRUE(*cclass == *cclass2); EXPECT_FALSE(*cclass != *cclass2); - // Verify the on_demand flag is enough to make classes not equal. - EXPECT_FALSE(cclass->getOnDemand()); - cclass2->setOnDemand(true); - EXPECT_TRUE(cclass2->getOnDemand()); + // Verify the required flag is enough to make classes not equal. + EXPECT_FALSE(cclass->getRequired()); + cclass2->setRequired(true); + EXPECT_TRUE(cclass2->getRequired()); EXPECT_FALSE(*cclass == *cclass2); EXPECT_TRUE(*cclass != *cclass2); @@ -346,7 +346,7 @@ TEST(ClientClassDef, fixedFieldsDefaults) { ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); // Let's checks that it doesn't return any nonsense - EXPECT_FALSE(cclass->getOnDemand()); + EXPECT_FALSE(cclass->getRequired()); EXPECT_FALSE(cclass->getCfgOptionDef()); string empty; ASSERT_EQ(IOAddress("0.0.0.0"), cclass->getNextServer()); @@ -369,7 +369,7 @@ TEST(ClientClassDef, fixedFieldsBasics) { // Verify we can create a class with a name, expression, and no cfg_option ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); - cclass->setOnDemand(true); + cclass->setRequired(true); string sname = "This is a very long string that can be a server name"; string filename = "this-is-a-slightly-longish-name-of-a-file.txt"; @@ -379,7 +379,7 @@ TEST(ClientClassDef, fixedFieldsBasics) { cclass->setFilename(filename); // Let's checks that it doesn't return any nonsense - EXPECT_TRUE(cclass->getOnDemand()); + EXPECT_TRUE(cclass->getRequired()); EXPECT_EQ(IOAddress("1.2.3.4"), cclass->getNextServer()); EXPECT_EQ(sname, cclass->getSname()); EXPECT_EQ(filename, cclass->getFilename()); @@ -397,7 +397,7 @@ TEST(ClientClassDef, unparseDef) { ASSERT_NO_THROW(cclass.reset(new ClientClassDef(name, expr))); std::string test = "option[12].text == 'foo'"; cclass->setTest(test); - cclass->setOnDemand(true); + cclass->setRequired(true); std::string next_server = "1.2.3.4"; cclass->setNextServer(IOAddress(next_server)); std::string sname = "my-server.example.com"; @@ -409,7 +409,7 @@ TEST(ClientClassDef, unparseDef) { std::string expected = "{\n" "\"name\": \"" + name + "\",\n" "\"test\": \"" + test + "\",\n" - "\"eval-on-demand\": true,\n" + "\"only-if-required\": true,\n" "\"next-server\": \"" + next_server + "\",\n" "\"server-hostname\": \"" + sname + "\",\n" "\"boot-file-name\": \"" + filename + "\",\n" diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index 6f6b8192f5..a0e113668b 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -230,33 +230,33 @@ TEST(Pool4Test, clientClass) { EXPECT_TRUE(pool->clientSupported(three_classes)); } -// This test checks that handling for eval-client-classes is valid. -TEST(Pool4Test, onDemandClasses) { +// This test checks that handling for required-client-classes is valid. +TEST(Pool4Test, requiredClasses) { // Create a pool. Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), IOAddress("192.0.2.255"))); - // This client starts with no deferred classes. - EXPECT_TRUE(pool->getOnDemandClasses().empty()); + // This client starts with no required classes. + EXPECT_TRUE(pool->getRequiredClasses().empty()); // Add the first class - pool->deferClientClass("router"); - EXPECT_EQ(1, pool->getOnDemandClasses().size()); + pool->requireClientClass("router"); + EXPECT_EQ(1, pool->getRequiredClasses().size()); // Add a second class - pool->deferClientClass("modem"); - EXPECT_EQ(2, pool->getOnDemandClasses().size()); - EXPECT_TRUE(pool->getOnDemandClasses().contains("router")); - EXPECT_TRUE(pool->getOnDemandClasses().contains("modem")); - EXPECT_FALSE(pool->getOnDemandClasses().contains("foo")); + pool->requireClientClass("modem"); + EXPECT_EQ(2, pool->getRequiredClasses().size()); + EXPECT_TRUE(pool->getRequiredClasses().contains("router")); + EXPECT_TRUE(pool->getRequiredClasses().contains("modem")); + EXPECT_FALSE(pool->getRequiredClasses().contains("foo")); // Check that it's ok to add the same class repeatedly - EXPECT_NO_THROW(pool->deferClientClass("foo")); - EXPECT_NO_THROW(pool->deferClientClass("foo")); - EXPECT_NO_THROW(pool->deferClientClass("foo")); + EXPECT_NO_THROW(pool->requireClientClass("foo")); + EXPECT_NO_THROW(pool->requireClientClass("foo")); + EXPECT_NO_THROW(pool->requireClientClass("foo")); - // Check that 'foo' is marked for late evaluation - EXPECT_TRUE(pool->getOnDemandClasses().contains("foo")); + // Check that 'foo' is marked for required evaluation + EXPECT_TRUE(pool->getRequiredClasses().contains("foo")); } // This test checks that handling for last allocated address/prefix is valid. @@ -625,33 +625,33 @@ TEST(Pool6Test, clientClass) { EXPECT_TRUE(pool.clientSupported(three_classes)); } -// This test checks that handling for eval-client-classes is valid. -TEST(Pool6Test, onDemandClasses) { +// This test checks that handling for required-client-classes is valid. +TEST(Pool6Test, requiredClasses) { // Create a pool. Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), IOAddress("2001:db8::2")); - // This client starts with no deferred classes. - EXPECT_TRUE(pool.getOnDemandClasses().empty()); + // This client starts with no required classes. + EXPECT_TRUE(pool.getRequiredClasses().empty()); // Add the first class - pool.deferClientClass("router"); - EXPECT_EQ(1, pool.getOnDemandClasses().size()); + pool.requireClientClass("router"); + EXPECT_EQ(1, pool.getRequiredClasses().size()); // Add a second class - pool.deferClientClass("modem"); - EXPECT_EQ(2, pool.getOnDemandClasses().size()); - EXPECT_TRUE(pool.getOnDemandClasses().contains("router")); - EXPECT_TRUE(pool.getOnDemandClasses().contains("modem")); - EXPECT_FALSE(pool.getOnDemandClasses().contains("foo")); + pool.requireClientClass("modem"); + EXPECT_EQ(2, pool.getRequiredClasses().size()); + EXPECT_TRUE(pool.getRequiredClasses().contains("router")); + EXPECT_TRUE(pool.getRequiredClasses().contains("modem")); + EXPECT_FALSE(pool.getRequiredClasses().contains("foo")); // Check that it's ok to add the same class repeatedly - EXPECT_NO_THROW(pool.deferClientClass("foo")); - EXPECT_NO_THROW(pool.deferClientClass("foo")); - EXPECT_NO_THROW(pool.deferClientClass("foo")); + EXPECT_NO_THROW(pool.requireClientClass("foo")); + EXPECT_NO_THROW(pool.requireClientClass("foo")); + EXPECT_NO_THROW(pool.requireClientClass("foo")); - // Check that 'foo' is marked for late evaluation - EXPECT_TRUE(pool.getOnDemandClasses().contains("foo")); + // Check that 'foo' is marked for required evaluation + EXPECT_TRUE(pool.getRequiredClasses().contains("foo")); } // This test checks that handling for last allocated address/prefix is valid. diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index dee9300e6a..dfb3a9db9c 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -52,7 +52,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," - " \"eval-client-classes\": []\n," + " \"required-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -73,7 +73,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," - " \"eval-client-classes\": []\n," + " \"required-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -194,7 +194,7 @@ public: " \"preferred-lifetime\": 300," " \"valid-lifetime\": 400," " \"client-class\": \"\"," - " \"eval-client-classes\": []\n," + " \"required-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -210,7 +210,7 @@ public: " \"preferred-lifetime\": 30," " \"valid-lifetime\": 40," " \"client-class\": \"\"," - " \"eval-client-classes\": []\n," + " \"required-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -283,7 +283,7 @@ TEST_F(SharedNetwork6ParserTest, clientClass) { EXPECT_EQ("alpha", network->getClientClass()); } -// This test verifies that it's possible to specify eval-client-classes +// This test verifies that it's possible to specify required-client-classes // on shared-network level. TEST_F(SharedNetwork6ParserTest, evalClientClasses) { std::string config = getWorkingConfig(); @@ -292,7 +292,7 @@ TEST_F(SharedNetwork6ParserTest, evalClientClasses) { ElementPtr class_list = Element::createList(); class_list->add(Element::create("alpha")); class_list->add(Element::create("beta")); - config_element->set("eval-client-classes", class_list); + config_element->set("required-client-classes", class_list); // Parse configuration specified above. SharedNetwork6Parser parser; @@ -300,12 +300,12 @@ TEST_F(SharedNetwork6ParserTest, evalClientClasses) { network = parser.parse(config_element); ASSERT_TRUE(network); - const ClientClasses& classes = network->getOnDemandClasses(); + const ClientClasses& classes = network->getRequiredClasses(); EXPECT_EQ(2, classes.size()); EXPECT_EQ("alpha, beta", classes.toText()); } -// This test verifies that bad eval-client-classes configs raise +// This test verifies that bad required-client-classes configs raise // expected errors. TEST_F(SharedNetwork6ParserTest, badEvalClientClasses) { std::string config = getWorkingConfig(); @@ -315,7 +315,7 @@ TEST_F(SharedNetwork6ParserTest, badEvalClientClasses) { ElementPtr class_list = Element::createList(); class_list->add(Element::create("alpha")); class_list->add(Element::create(1234)); - config_element->set("eval-client-classes", class_list); + config_element->set("required-client-classes", class_list); // Parse configuration specified above. SharedNetwork6Parser parser; diff --git a/src/lib/dhcpsrv/tests/shared_network_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_unittest.cc index 58df64673e..aefe3bc398 100644 --- a/src/lib/dhcpsrv/tests/shared_network_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -195,7 +195,7 @@ TEST(SharedNetwork4Test, unparse) { network->setValid(200); network->setMatchClientId(false); - network->deferClientClass("foo"); + network->requireClientClass("foo"); // Add several subnets. Subnet4Ptr subnet1(new Subnet4(IOAddress("10.0.0.0"), 8, 10, 20, 30, @@ -258,7 +258,7 @@ TEST(SharedNetwork4Test, unparse) { " \"valid-lifetime\": 30\n" " }\n" " ],\n" - " \"eval-client-classes\": [ \"foo\" ],\n" + " \"required-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 200\n" "}\n"; @@ -482,7 +482,7 @@ TEST(SharedNetwork6Test, unparse) { network->setPreferred(200); network->setValid(300); network->setRapidCommit(true); - network->deferClientClass("foo"); + network->requireClientClass("foo"); // Add several subnets. Subnet6Ptr subnet1(new Subnet6(IOAddress("2001:db8:1::"), 64, 10, 20, 30, @@ -538,7 +538,7 @@ TEST(SharedNetwork6Test, unparse) { " \"valid-lifetime\": 40\n" " }\n" " ],\n" - " \"eval-client-classes\": [ \"foo\" ],\n" + " \"required-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 300\n" "}\n"; From 74de17c9be5cd8b27da069117f3c7d8debe25c9a Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 5 Apr 2018 22:14:34 +0000 Subject: [PATCH 41/52] [trac5374] regen flex/bison --- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 9b6f6fb24f..ed92aca4d4 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 9f50a762d0..dc043a2f12 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index c9fb3583b8..b256062e86 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index b7300e6c31..5d9e113843 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index ab3fae70fe..4230060a35 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index a267b6e6ca..00d8018ef9 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804011245 +// Generated 201804052214 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 8819c56a43171a12a3f1c630b9f3809e086678fb Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 5 Apr 2018 22:18:09 +0000 Subject: [PATCH 42/52] [trac5374] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 1319 +++++++++++++++++---------------- src/bin/dhcp4/dhcp4_parser.cc | 73 +- src/bin/dhcp4/dhcp4_parser.h | 16 +- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 1277 +++++++++++++++---------------- src/bin/dhcp6/dhcp6_parser.cc | 12 +- src/bin/dhcp6/dhcp6_parser.h | 16 +- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 1367 insertions(+), 1358 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index b806f4a3c4..281c4814b4 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1319] = +static const flex_int16_t yy_accept[1328] = { 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, @@ -726,127 +726,128 @@ static const flex_int16_t yy_accept[1319] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 159, 157, 0, 156, 155, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 124, 0, 123, 0, 0, + 0, 159, 157, 0, 156, 155, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 124, 0, 123, 0, - 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 158, 155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 158, 155, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, - 127, 0, 0, 0, 0, 0, 0, 0, 64, 0, - 0, 0, 0, 48, 0, 0, 0, 0, 0, 81, + 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 48, 0, 0, 0, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 78, 25, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 132, + 0, 0, 0, 0, 0, 0, 0, 0, 78, 25, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 0, 128, 0, 0, 0, 91, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 0, 12, 132, 0, 129, 0, 128, 0, 0, 0, + 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 27, 0, 0, 53, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 0, 0, 0, 0, 0, 7, 0, - 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 0, 0, 53, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, + 0, 7, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 96, 67, 0, - 0, 0, 72, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 67, + 0, 0, 0, 72, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, - 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, + 0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 37, + 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, + 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 0, 0, 84, 0, + 0, 0, 0, 88, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 20, 0, 93, 0, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 45, 0, 0, 0, 0, 0, 95, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 140, 0, 46, 62, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 114, 0, 112, 0, 107, 106, 0, 19, + 0, 0, 0, 0, 0, 126, 0, 0, 77, 0, + 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 56, 0, 0, 35, 0, + 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, + 58, 41, 0, 89, 0, 0, 0, 80, 0, 0, + + 0, 0, 52, 0, 135, 0, 134, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, + 75, 0, 38, 105, 0, 0, 138, 109, 0, 0, + 0, 0, 0, 0, 23, 0, 22, 0, 115, 0, + 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 94, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, + 0, 18, 141, 44, 0, 136, 131, 0, 0, 14, + 0, 0, 122, 0, 0, 0, 0, 102, 79, 0, + 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 0, 0, 0, 0, 0, 0, 108, 0, + 101, 17, 0, 119, 0, 0, 0, 0, 118, 0, + 0, 0, 100, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, - 0, 0, 0, 0, 0, 113, 0, 0, 111, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, - 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, - 88, 70, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 82, 0, 20, - 0, 93, 0, 0, 0, 0, 0, 117, 0, 0, - 0, 45, 0, 0, 0, 0, 0, 95, 28, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 140, 46, 62, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 0, 0, 0, 0, 114, - 0, 112, 0, 107, 106, 0, 19, 0, 0, 0, - 0, 0, 126, 0, 0, 77, 0, 0, 0, 0, - 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 0, 0, 35, 0, 0, - 0, 0, 116, 0, 0, 0, 0, 0, 58, 41, - 0, 89, 0, 0, 80, 0, 0, 0, 0, 52, - - 0, 135, 0, 134, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 142, 75, 0, 38, - 105, 0, 0, 138, 109, 0, 79, 0, 0, 0, - 0, 0, 0, 23, 0, 22, 0, 115, 0, 0, - 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 36, 0, 0, 0, - 0, 0, 0, 0, 94, 0, 0, 139, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 18, 141, 44, - 0, 136, 131, 0, 0, 14, 0, 0, 0, 122, - 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 110, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 101, 17, 0, 119, - 0, 0, 0, 118, 0, 76, 0, 0, 100, 0, - 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120, 0, 0, 0, 0, 0, 0, 98, - - 103, 42, 0, 0, 0, 97, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 99, 0 + 0, 0, 0, 0, 0, 0, 0, 98, 76, 103, + 42, 0, 0, 0, 97, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 0, 99, 0 } ; static const YY_CHAR yy_ec[256] = @@ -893,314 +894,316 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1331] = +static const flex_int16_t yy_base[1340] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1682, 1683, 32, 1678, 141, 0, 201, 1683, 206, 88, - 11, 213, 1683, 1660, 114, 25, 2, 6, 1683, 1683, - 73, 11, 17, 1683, 1683, 1683, 104, 1666, 1621, 0, - 1658, 107, 1673, 217, 247, 1683, 1617, 185, 1616, 1622, - 93, 58, 1614, 91, 211, 195, 14, 273, 195, 1613, - 181, 275, 202, 209, 1622, 66, 188, 1621, 232, 272, - 299, 289, 207, 1604, 78, 298, 318, 308, 1623, 0, - 344, 359, 367, 373, 379, 1683, 0, 1683, 273, 385, - 208, 223, 196, 306, 348, 210, 1683, 1620, 1659, 1683, + 1690, 1691, 32, 1686, 141, 0, 201, 1691, 206, 88, + 11, 213, 1691, 1668, 114, 25, 2, 6, 1691, 1691, + 73, 11, 17, 1691, 1691, 1691, 104, 1674, 1629, 0, + 1666, 107, 1681, 217, 247, 1691, 1625, 185, 1624, 1630, + 93, 58, 1622, 91, 211, 195, 14, 273, 195, 1621, + 181, 275, 202, 209, 1630, 66, 188, 1629, 232, 219, + 296, 284, 207, 1612, 78, 287, 324, 305, 1631, 0, + 339, 359, 367, 374, 379, 1691, 0, 1691, 301, 344, + 223, 295, 196, 336, 348, 210, 1691, 1628, 1667, 1691, - 309, 1683, 384, 1648, 306, 1606, 1616, 351, 294, 1611, - 326, 364, 366, 373, 383, 1654, 0, 435, 371, 1598, - 1600, 1596, 1604, 74, 1600, 1589, 1590, 89, 1606, 1589, - 1598, 1598, 285, 1604, 1588, 269, 1589, 355, 1634, 1638, - 1580, 1631, 1573, 1596, 1593, 1593, 1587, 348, 1580, 1573, - 1578, 1572, 375, 1583, 1568, 1567, 1581, 306, 1567, 358, - 1583, 262, 432, 1570, 357, 1581, 1578, 1579, 1577, 1559, - 1561, 396, 1553, 1570, 1562, 0, 390, 407, 419, 401, - 409, 421, 1561, 1683, 0, 1604, 444, 1551, 1554, 434, - 409, 1562, 445, 1605, 447, 1604, 441, 1603, 1683, 485, + 322, 1691, 392, 1656, 330, 1614, 1624, 351, 366, 1619, + 363, 370, 372, 379, 241, 1662, 0, 443, 376, 1606, + 1608, 1604, 1612, 74, 1608, 1597, 1598, 89, 1614, 1597, + 1606, 1606, 366, 1597, 353, 1598, 358, 1643, 1647, 1589, + 1640, 1582, 1605, 1602, 1602, 1596, 352, 1589, 1582, 1587, + 1581, 381, 1592, 1585, 1576, 1575, 1589, 364, 1575, 382, + 1591, 266, 439, 1578, 413, 1589, 1586, 1587, 1585, 1567, + 1569, 402, 1561, 1578, 1570, 0, 389, 380, 331, 398, + 392, 414, 1569, 1691, 0, 1612, 431, 1559, 1562, 411, + 424, 1570, 438, 1613, 447, 1612, 446, 1611, 1691, 490, - 1602, 453, 1563, 1543, 1559, 1556, 1555, 429, 1596, 1590, - 1556, 1535, 1543, 1538, 1552, 1548, 1536, 1548, 1548, 1536, - 1538, 1522, 1526, 1539, 1539, 1531, 1521, 1539, 1683, 1534, - 1537, 1518, 1517, 1567, 1516, 1526, 1529, 462, 1525, 1513, - 1524, 1560, 465, 1507, 1563, 1516, 491, 1506, 1522, 1503, - 1502, 1508, 1499, 1498, 1505, 1507, 1552, 1510, 1509, 1503, - 457, 1510, 1505, 1497, 1503, 1502, 1502, 1483, 1499, 1485, - 1491, 1498, 1486, 1479, 1493, 1534, 1495, 442, 1486, 480, - 1683, 1683, 489, 1683, 1683, 1473, 0, 423, 477, 1475, - 502, 494, 1529, 1482, 487, 1683, 1527, 1683, 1521, 537, + 1610, 456, 1571, 1551, 1567, 1564, 1563, 445, 1604, 1598, + 1564, 1543, 1551, 1546, 1560, 1556, 1544, 1556, 1556, 1547, + 1531, 1535, 1548, 1548, 1540, 1530, 1548, 1691, 1543, 1546, + 1527, 1526, 1576, 1525, 1535, 1538, 460, 1534, 1522, 1533, + 1569, 472, 1516, 1572, 1509, 1524, 482, 1514, 1530, 1511, + 1510, 1516, 1507, 1506, 1513, 1515, 1560, 1518, 1517, 1511, + 311, 1518, 1513, 1505, 1495, 1510, 1509, 1509, 1490, 1506, + 1492, 1498, 1505, 1493, 1486, 1500, 1541, 1502, 419, 1493, + 482, 1691, 1691, 484, 1691, 1691, 1480, 0, 466, 478, + 1482, 527, 485, 1536, 1489, 486, 1691, 1534, 1691, 1528, - 1683, 486, 1463, 1519, 1465, 1471, 1521, 1478, 460, 1683, - 1476, 1518, 1473, 1470, 524, 1476, 1514, 1508, 1463, 1458, - 1505, 1454, 1503, 1462, 1451, 1500, 1448, 532, 1462, 1447, - 1460, 1447, 1457, 1452, 1459, 1454, 1450, 462, 1448, 1451, - 1446, 1442, 1490, 497, 507, 1484, 1683, 1436, 1435, 1434, - 1427, 1429, 1433, 1422, 1435, 535, 1480, 1435, 1432, 1436, - 1683, 1434, 1423, 1423, 1435, 1417, 1409, 1410, 1431, 1413, - 1462, 1424, 1423, 1409, 1421, 1420, 1419, 1418, 1459, 1458, - 1683, 1402, 1401, 538, 1414, 1683, 1683, 1413, 0, 1402, - 1394, 513, 1399, 1450, 1449, 1407, 1447, 1683, 1395, 1445, + 538, 1691, 482, 1470, 1526, 1472, 1478, 1528, 1485, 479, + 1691, 1483, 1525, 1480, 1477, 533, 1483, 1521, 1515, 1470, + 1465, 1462, 1511, 1470, 1459, 1508, 1456, 518, 1470, 1455, + 1468, 1455, 1465, 1460, 1467, 1462, 1458, 495, 1456, 1459, + 1454, 1450, 1498, 508, 512, 1492, 1691, 1491, 1443, 1442, + 1441, 1434, 1436, 1440, 1429, 1442, 543, 1487, 1442, 1439, + 1443, 1691, 1441, 1430, 1430, 1442, 1424, 1416, 1417, 1438, + 1429, 1419, 1468, 1430, 1429, 1415, 1427, 1426, 1425, 1424, + 1465, 1464, 1691, 1408, 1407, 520, 1420, 1691, 1691, 1419, + 0, 1408, 1400, 531, 1405, 1456, 1455, 1413, 1453, 1691, - 1683, 534, 584, 533, 1444, 1400, 1396, 1384, 1683, 1400, - 1399, 1386, 1385, 1683, 1387, 1384, 508, 1382, 1384, 1683, - 1392, 1389, 1374, 511, 1387, 1382, 565, 1389, 1371, 1420, - 1683, 1369, 1385, 1417, 1380, 1377, 1378, 1380, 1412, 1365, - 1360, 1359, 1408, 1354, 1369, 1347, 1354, 1359, 1407, 1683, - 1354, 1350, 1404, 1347, 1351, 1358, 1342, 1342, 1352, 1355, - 1344, 1339, 1683, 1394, 1683, 1338, 1349, 1386, 1333, 1338, - 1347, 1341, 1345, 1385, 1379, 1343, 1323, 1343, 1325, 1324, - 1332, 1336, 1319, 1375, 1317, 1683, 1683, 1322, 1320, 1683, - 1331, 1365, 1327, 0, 1311, 1328, 1366, 1316, 1683, 1683, + 1401, 1451, 1691, 538, 592, 532, 1450, 1406, 1402, 1390, + 1691, 1406, 1405, 1392, 1391, 1691, 1393, 1390, 527, 1388, + 1390, 1691, 1398, 1395, 1380, 1393, 1388, 565, 1395, 1377, + 1426, 1691, 1375, 1391, 1423, 1386, 1383, 1384, 1386, 1418, + 1371, 1366, 1365, 1414, 1360, 1375, 1353, 1360, 1365, 1413, + 1691, 1360, 1356, 1410, 1353, 1362, 1356, 1363, 1347, 1347, + 1357, 1360, 1349, 1344, 1691, 1399, 1691, 1343, 1354, 1391, + 1338, 1343, 1352, 1346, 1350, 1390, 1384, 1348, 1332, 1327, + 1347, 1329, 1328, 1336, 1340, 1323, 1379, 1321, 1691, 1691, + 1326, 1324, 1691, 1335, 1369, 1331, 0, 1315, 1332, 1370, - 1313, 1683, 1319, 1683, 534, 540, 566, 1683, 1316, 1304, - 1355, 1302, 1301, 1308, 1301, 1313, 1312, 1312, 1300, 1341, - 1308, 1300, 1343, 1289, 1297, 1294, 1303, 1302, 1683, 1287, - 1284, 1298, 1290, 1296, 1287, 1295, 1280, 1296, 1278, 1292, - 1290, 1273, 1267, 1272, 1287, 1284, 1285, 1282, 1323, 1280, - 1683, 1266, 1268, 1683, 1277, 1313, 1312, 1265, 568, 1274, - 1257, 1258, 1255, 1683, 1269, 1248, 1269, 1266, 1258, 1301, - 1255, 1299, 1683, 1246, 1260, 1263, 1244, 1294, 1293, 1240, - 1291, 1290, 1683, 14, 1252, 1235, 1240, 1242, 1683, 1248, - 1238, 1683, 1283, 1231, 1286, 552, 554, 526, 1236, 1279, + 1320, 1691, 1691, 1317, 1691, 1323, 1691, 538, 539, 592, + 1691, 1320, 1308, 1359, 1306, 1305, 1312, 1305, 1317, 1316, + 1316, 1304, 1345, 1312, 1304, 1347, 1293, 1309, 1308, 1691, + 1293, 1290, 1304, 1296, 1302, 1293, 1301, 1286, 1302, 1284, + 1298, 1296, 1279, 1273, 1278, 1293, 1290, 1291, 1288, 1329, + 1286, 1691, 1272, 1274, 1691, 1283, 1281, 1318, 1317, 1270, + 582, 1279, 1262, 1263, 1260, 1691, 1274, 1253, 1274, 1271, + 1263, 1306, 1260, 1304, 1691, 1251, 1265, 1264, 1267, 1248, + 1298, 1297, 1244, 1295, 1294, 1691, 14, 1256, 1239, 1244, + 1246, 1691, 1252, 1242, 1691, 1287, 1235, 1290, 546, 553, - 544, 1278, 1277, 1276, 1230, 1220, 1273, 1226, 1236, 1270, - 1233, 1227, 1214, 1222, 1224, 1264, 1263, 1267, 1224, 1223, - 1224, 1217, 1206, 1219, 1222, 1217, 1218, 1215, 1214, 1217, - 1212, 1253, 1252, 1202, 1192, 1200, 1248, 1683, 1247, 1196, - 1188, 1189, 1202, 1189, 1200, 1683, 1188, 1197, 1196, 1196, - 1236, 1179, 1188, 1181, 1192, 1169, 1173, 1224, 1171, 1181, - 1221, 1168, 1219, 560, 562, 1161, 1171, 559, 1683, 1221, - 1179, 1162, 1167, 1171, 1161, 1173, 1176, 1213, 1683, 1207, - 583, 1160, 1168, 1167, 1162, 1158, 1165, 1148, 1151, 1147, - 1164, 1159, 1147, 1143, 1150, 1144, 1196, 1153, 1141, 1155, + 540, 1240, 1283, 558, 1282, 1281, 1280, 1234, 1224, 1277, + 1230, 1240, 1274, 1237, 1231, 1218, 1226, 1269, 1273, 1230, + 1229, 1230, 1223, 1212, 1225, 1228, 1223, 1224, 1221, 1220, + 1223, 1218, 1259, 1258, 1208, 1198, 1206, 1254, 1691, 1253, + 1202, 1194, 1195, 1244, 1207, 1194, 1205, 1691, 1193, 1202, + 1201, 1201, 1241, 1184, 1193, 1186, 1197, 1174, 1178, 1229, + 1176, 1186, 1226, 1189, 1172, 1223, 560, 569, 1165, 1175, + 566, 1691, 1225, 1183, 1166, 1171, 1175, 1165, 1177, 1180, + 1217, 1691, 1211, 565, 1164, 1172, 1171, 1166, 1162, 1169, + 1152, 1155, 1151, 1168, 1163, 1151, 1147, 1154, 1148, 1200, - 1150, 1150, 1141, 1683, 1149, 1147, 1138, 1147, 1143, 1184, - 1126, 1126, 1139, 1124, 1179, 1121, 7, 1683, 1683, 86, - 218, 390, 1683, 1683, 410, 522, 538, 576, 546, 607, - 564, 614, 565, 621, 1683, 574, 578, 580, 574, 632, - 587, 577, 573, 586, 597, 592, 594, 588, 590, 591, - 591, 593, 646, 605, 610, 587, 1683, 645, 605, 595, - 610, 611, 598, 612, 1683, 631, 639, 619, 609, 656, - 621, 625, 664, 619, 614, 615, 611, 620, 615, 671, - 630, 621, 1683, 623, 634, 619, 626, 636, 637, 631, - 677, 645, 630, 631, 1683, 649, 632, 689, 634, 1683, + 1157, 1145, 1159, 1147, 1691, 1155, 1153, 1144, 1153, 1149, + 1190, 1132, 1132, 1145, 1130, 2, 5, 77, 1691, 1691, + 185, 240, 276, 1691, 1691, 317, 421, 417, 497, 578, + 519, 568, 531, 580, 550, 618, 1691, 570, 574, 576, + 570, 628, 583, 579, 575, 588, 599, 635, 595, 596, + 590, 592, 593, 593, 595, 648, 607, 612, 589, 1691, + 647, 607, 597, 612, 613, 600, 614, 1691, 633, 641, + 621, 611, 658, 623, 627, 666, 621, 616, 617, 613, + 622, 617, 673, 632, 623, 1691, 625, 636, 621, 637, + 631, 676, 644, 629, 630, 1691, 649, 632, 689, 634, - 653, 633, 651, 690, 650, 640, 658, 657, 643, 658, - 650, 657, 647, 665, 650, 1683, 658, 664, 659, 710, - 1683, 661, 666, 660, 672, 666, 665, 667, 719, 665, - 665, 722, 668, 1683, 667, 675, 673, 672, 677, 687, - 688, 693, 732, 691, 707, 712, 686, 696, 687, 739, - 684, 1683, 691, 696, 703, 744, 746, 695, 1683, 691, - 694, 693, 713, 710, 696, 704, 717, 718, 704, 712, - 721, 701, 722, 764, 1683, 719, 766, 767, 729, 731, - 719, 716, 723, 774, 723, 721, 739, 778, 730, 729, - 735, 733, 731, 784, 785, 781, 741, 1683, 746, 739, + 1691, 653, 633, 651, 690, 650, 640, 658, 657, 658, + 644, 659, 651, 658, 648, 666, 651, 1691, 659, 665, + 660, 711, 1691, 662, 667, 661, 673, 667, 678, 667, + 669, 721, 667, 667, 724, 670, 1691, 669, 677, 675, + 674, 679, 689, 690, 695, 734, 693, 709, 714, 688, + 698, 689, 741, 686, 1691, 693, 698, 706, 747, 748, + 697, 1691, 693, 696, 695, 715, 712, 717, 718, 704, + 712, 721, 701, 722, 762, 1691, 717, 766, 767, 729, + 731, 719, 716, 723, 774, 723, 721, 723, 740, 779, + 731, 730, 736, 734, 732, 785, 786, 782, 742, 1691, - 748, 736, 746, 742, 755, 1683, 738, 739, 1683, 740, - 738, 757, 758, 759, 758, 742, 747, 765, 1683, 755, - 788, 779, 751, 810, 773, 1683, 756, 771, 763, 767, - 1683, 1683, 777, 812, 761, 814, 763, 821, 817, 785, - 768, 779, 771, 777, 773, 791, 793, 1683, 791, 1683, - 793, 1683, 796, 786, 780, 792, 834, 1683, 791, 841, - 842, 1683, 843, 787, 793, 800, 842, 1683, 1683, 792, - 792, 795, 809, 796, 853, 812, 850, 804, 857, 807, - 859, 808, 861, 862, 823, 864, 808, 820, 825, 811, - 841, 870, 830, 1683, 822, 873, 822, 818, 834, 839, + 747, 740, 749, 737, 747, 745, 744, 757, 1691, 740, + 741, 1691, 742, 740, 759, 760, 761, 760, 744, 749, + 767, 1691, 757, 790, 781, 753, 812, 775, 1691, 758, + 773, 765, 769, 1691, 1691, 779, 814, 763, 816, 765, + 823, 768, 779, 771, 777, 773, 791, 792, 1691, 790, + 1691, 793, 1691, 796, 786, 779, 791, 834, 1691, 791, + 841, 784, 843, 1691, 844, 788, 794, 801, 843, 1691, + 1691, 793, 793, 796, 810, 797, 854, 813, 810, 852, + 806, 859, 809, 861, 810, 863, 864, 825, 866, 810, + 822, 827, 813, 843, 872, 832, 1691, 824, 875, 824, - 821, 879, 834, 839, 1683, 842, 832, 842, 835, 844, - 845, 842, 832, 834, 891, 840, 837, 894, 890, 833, - 850, 898, 1683, 1683, 1683, 858, 850, 860, 845, 846, - 905, 908, 854, 910, 1683, 860, 862, 913, 856, 1683, - 878, 1683, 862, 1683, 1683, 869, 1683, 919, 870, 921, - 922, 904, 1683, 882, 883, 1683, 871, 870, 873, 873, - 874, 870, 1683, 892, 878, 886, 895, 881, 896, 896, - 899, 899, 896, 901, 1683, 893, 903, 1683, 901, 906, - 907, 904, 1683, 896, 896, 902, 901, 912, 1683, 1683, - 951, 1683, 900, 906, 1683, 908, 910, 913, 924, 1683, + 820, 836, 841, 823, 881, 836, 841, 1691, 842, 835, + 844, 845, 842, 832, 834, 891, 840, 837, 894, 890, + 833, 848, 898, 1691, 854, 1691, 1691, 859, 851, 861, + 846, 848, 907, 909, 855, 911, 1691, 861, 871, 864, + 915, 858, 1691, 880, 1691, 864, 1691, 1691, 871, 1691, + 921, 872, 923, 924, 906, 1691, 884, 885, 1691, 873, + 872, 875, 875, 876, 872, 1691, 894, 880, 881, 896, + 896, 899, 899, 896, 901, 1691, 893, 903, 1691, 900, + 905, 907, 904, 1691, 896, 897, 897, 903, 902, 913, + 1691, 1691, 952, 1691, 901, 908, 908, 1691, 910, 912, - 921, 1683, 918, 1683, 941, 961, 967, 968, 912, 970, - 971, 926, 920, 974, 975, 938, 977, 973, 938, 934, - 976, 926, 931, 984, 942, 986, 946, 988, 951, 940, - 948, 993, 937, 954, 953, 937, 993, 958, 959, 959, - 946, 957, 1004, 964, 977, 964, 1683, 1683, 1008, 1683, - 1683, 957, 968, 1683, 1683, 955, 1683, 959, 1008, 953, - 958, 1016, 966, 1683, 972, 1683, 1019, 1683, 964, 979, - 984, 1683, 1018, 986, 979, 988, 976, 986, 1029, 1030, - 1031, 982, 1683, 1033, 1035, 982, 1683, 986, 1038, 983, - 985, 984, 1042, 997, 1683, 1039, 1001, 1683, 1004, 1047, + 915, 926, 1691, 923, 1691, 920, 1691, 943, 963, 969, + 970, 914, 972, 973, 928, 922, 976, 977, 973, 938, + 934, 976, 926, 931, 984, 942, 986, 946, 988, 951, + 940, 949, 949, 993, 938, 955, 954, 938, 994, 943, + 960, 961, 961, 948, 959, 1006, 966, 979, 966, 1691, + 1691, 1010, 1691, 1691, 959, 970, 1691, 1691, 960, 1009, + 954, 959, 1017, 967, 1691, 973, 1691, 1020, 1691, 965, + 980, 982, 986, 1691, 1020, 988, 981, 990, 978, 1025, + 989, 1032, 1033, 1034, 985, 1691, 1037, 1038, 985, 1691, + 989, 1041, 987, 986, 1044, 999, 1691, 1041, 1003, 1691, - 1008, 991, 993, 990, 1006, 1015, 1054, 1683, 1683, 1683, - 1050, 1683, 1683, 1015, 1052, 1683, 1016, 1007, 1014, 1683, - 1011, 1016, 1063, 1008, 1683, 1023, 1013, 1025, 1068, 1012, - 1020, 1683, 1031, 1021, 1020, 1018, 1035, 1026, 1035, 1037, - 1683, 1079, 1080, 1040, 1082, 1683, 1078, 1042, 1023, 1086, - 1045, 1088, 1047, 1048, 1091, 1050, 1683, 1683, 1055, 1683, - 1037, 1095, 1056, 1683, 1042, 1683, 1042, 1044, 1683, 1049, - 1044, 1056, 1683, 1054, 1058, 1049, 1101, 1050, 1066, 1059, - 1068, 1059, 1066, 1053, 1068, 1115, 1074, 1061, 1077, 1068, - 1082, 1078, 1683, 1122, 1123, 1124, 1081, 1080, 1081, 1683, + 1006, 1049, 1050, 1011, 994, 996, 993, 1009, 1018, 1017, + 1058, 1691, 1691, 1691, 1054, 1691, 1691, 1019, 1056, 1691, + 1010, 1017, 1691, 1014, 1019, 1066, 1011, 1691, 1691, 1026, + 1016, 1028, 1071, 1015, 1023, 1025, 1691, 1035, 1025, 1024, + 1038, 1029, 1038, 1040, 1691, 1082, 1083, 1043, 1085, 1691, + 1081, 1045, 1050, 1027, 1090, 1049, 1050, 1051, 1094, 1053, + 1691, 1691, 1058, 1691, 1040, 1098, 1043, 1060, 1691, 1046, + 1046, 1048, 1691, 1053, 1048, 1060, 1691, 1051, 1059, 1063, + 1054, 1106, 1055, 1071, 1064, 1073, 1074, 1065, 1072, 1059, + 1074, 1121, 1080, 1067, 1068, 1084, 1075, 1089, 1085, 1691, - 1683, 1683, 1128, 1072, 1088, 1683, 1126, 1077, 1076, 1078, - 1089, 1136, 1087, 1683, 1096, 1139, 1683, 1683, 1145, 1150, - 1155, 1160, 1165, 1170, 1175, 1178, 1152, 1157, 1159, 1172 + 1129, 1130, 1131, 1132, 1089, 1088, 1089, 1691, 1691, 1691, + 1691, 1136, 1080, 1096, 1691, 1134, 1085, 1084, 1086, 1097, + 1144, 1095, 1691, 1104, 1147, 1691, 1691, 1153, 1158, 1163, + 1168, 1173, 1178, 1183, 1186, 1160, 1165, 1167, 1180 } ; -static const flex_int16_t yy_def[1331] = +static const flex_int16_t yy_def[1340] = { 0, - 1319, 1319, 1320, 1320, 1319, 1319, 1319, 1319, 1319, 1319, - 1318, 1318, 1318, 1318, 1318, 1321, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1322, - 1318, 1318, 1318, 1323, 15, 1318, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1324, 45, 45, + 1328, 1328, 1329, 1329, 1328, 1328, 1328, 1328, 1328, 1328, + 1327, 1327, 1327, 1327, 1327, 1330, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, + 1327, 1327, 1327, 1332, 15, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1333, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1321, - 1318, 1318, 1318, 1318, 1318, 1318, 1325, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1322, 1318, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1330, + 1327, 1327, 1327, 1327, 1327, 1327, 1334, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, 1327, - 1323, 1318, 1318, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1326, 45, 1324, 45, 45, + 1332, 1327, 1327, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1335, 45, 1333, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1325, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1326, 1318, 1324, + 45, 45, 45, 45, 45, 1334, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1336, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1335, 1327, 1333, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1328, 45, 45, 45, - 45, 45, 45, 45, 45, 1318, 45, 1318, 45, 1324, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1337, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 1327, 45, - 1318, 45, 45, 45, 45, 45, 45, 45, 45, 1318, + 1333, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1318, 45, 45, 45, 45, 1318, 1318, 1318, 1329, 45, - 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, + 45, 45, 1327, 45, 45, 45, 45, 1327, 1327, 1327, + 1338, 45, 45, 45, 45, 45, 45, 45, 45, 1327, - 1318, 45, 1324, 45, 45, 45, 45, 45, 1318, 45, - 45, 45, 45, 1318, 45, 45, 45, 45, 45, 1318, + 45, 45, 1327, 45, 1333, 45, 45, 45, 45, 45, + 1327, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1318, + 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1327, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 1318, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1318, 1318, 45, 45, 1318, - 45, 45, 1318, 1330, 45, 45, 45, 45, 1318, 1318, + 45, 45, 45, 45, 45, 45, 45, 45, 1327, 1327, + 45, 45, 1327, 45, 45, 1327, 1339, 45, 45, 45, - 45, 1318, 45, 1318, 45, 45, 45, 1318, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, + 45, 1327, 1327, 45, 1327, 45, 1327, 45, 45, 45, + 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1318, 45, 45, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 1318, 45, - 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 1327, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, - 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, + 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1318, 1318, 45, - 45, 45, 1318, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1327, 1327, + 45, 45, 45, 1327, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1318, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 1318, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + + 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + + 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1327, 45, 45, 45, 45, 45, 45, 1327, 45, + 45, 45, 45, 1327, 1327, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, + 1327, 45, 1327, 45, 45, 45, 45, 45, 1327, 45, + 45, 45, 45, 1327, 45, 45, 45, 45, 45, 1327, + 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1327, 45, 1327, 1327, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 1327, 45, 1327, 45, 1327, 1327, 45, 1327, + 45, 45, 45, 45, 45, 1327, 45, 45, 1327, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 1327, 45, + 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, + 1327, 1327, 45, 1327, 45, 45, 45, 1327, 45, 45, + + 45, 45, 1327, 45, 1327, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 1327, 45, 1327, 1327, 45, 45, 1327, 1327, 45, 45, + 45, 45, 45, 45, 1327, 45, 1327, 45, 1327, 45, + 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1327, 45, 45, 45, 1327, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, - 1318, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, + 45, 1327, 1327, 1327, 45, 1327, 1327, 45, 45, 1327, + 45, 45, 1327, 45, 45, 45, 45, 1327, 1327, 45, + 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 1327, 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1318, 45, 45, 45, 45, 45, 45, 1318, 45, + 1327, 1327, 45, 1327, 45, 45, 45, 45, 1327, 45, + 45, 45, 1327, 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1318, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, - 45, 45, 45, 45, 45, 1318, 45, 45, 1318, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1318, 45, - 45, 45, 45, 45, 45, 1318, 45, 45, 45, 45, - 1318, 1318, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1318, 45, 1318, - 45, 1318, 45, 45, 45, 45, 45, 1318, 45, 45, - 45, 1318, 45, 45, 45, 45, 45, 1318, 1318, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1318, 45, 45, 45, 45, 45, 45, - - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 1318, 1318, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 1318, - 45, 1318, 45, 1318, 1318, 45, 1318, 45, 45, 45, - 45, 45, 1318, 45, 45, 1318, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 1318, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 1318, 1318, - 45, 1318, 45, 45, 1318, 45, 45, 45, 45, 1318, - - 45, 1318, 45, 1318, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1318, 1318, 45, 1318, - 1318, 45, 45, 1318, 1318, 45, 1318, 45, 45, 45, - 45, 45, 45, 1318, 45, 1318, 45, 1318, 45, 45, - 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 1318, 45, 45, 45, - 45, 45, 45, 45, 1318, 45, 45, 1318, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 1318, 1318, 1318, - 45, 1318, 1318, 45, 45, 1318, 45, 45, 45, 1318, - 45, 45, 45, 45, 1318, 45, 45, 45, 45, 45, - 45, 1318, 45, 45, 45, 45, 45, 45, 45, 45, - 1318, 45, 45, 45, 45, 1318, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1318, 1318, 45, 1318, - 45, 45, 45, 1318, 45, 1318, 45, 45, 1318, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1318, 45, 45, 45, 45, 45, 45, 1318, - - 1318, 1318, 45, 45, 45, 1318, 45, 45, 45, 45, - 45, 45, 45, 1318, 45, 45, 1318, 0, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318 + 45, 45, 45, 45, 45, 45, 45, 1327, 1327, 1327, + 1327, 45, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 45, 1327, 45, 45, 1327, 0, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327 } ; -static const flex_int16_t yy_nxt[1755] = +static const flex_int16_t yy_nxt[1763] = { 0, - 1318, 13, 14, 13, 1318, 15, 16, 1318, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 86, 669, - 37, 14, 37, 87, 25, 26, 38, 1318, 670, 27, + 1327, 13, 14, 13, 1327, 15, 16, 801, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 86, 672, + 37, 14, 37, 87, 25, 26, 38, 1327, 673, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, - 13, 14, 13, 13, 14, 13, 32, 40, 1318, 13, + 13, 14, 13, 13, 14, 13, 32, 40, 1327, 13, 14, 13, 33, 40, 115, 92, 93, 802, 91, 34, 35, 13, 14, 13, 95, 15, 16, 96, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, @@ -1208,8 +1211,8 @@ static const flex_int16_t yy_nxt[1755] = 39, 85, 85, 85, 28, 42, 41, 42, 42, 29, 42, 30, 83, 108, 41, 111, 94, 25, 31, 109, - 207, 162, 89, 138, 89, 163, 32, 90, 90, 90, - 208, 139, 33, 212, 213, 83, 108, 803, 111, 34, + 207, 162, 89, 137, 89, 163, 32, 90, 90, 90, + 208, 138, 33, 212, 213, 83, 108, 803, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 45, 45, 45, 45, 48, 45, 49, 50, 45, 51, 45, 52, 53, @@ -1220,181 +1223,182 @@ static const flex_int16_t yy_nxt[1755] = 74, 75, 76, 77, 78, 79, 57, 45, 45, 45, 45, 45, 81, 105, 82, 82, 82, 81, 114, 84, 84, 84, 102, 105, 81, 83, 84, 84, 84, 108, - 83, 179, 122, 112, 140, 123, 177, 83, 124, 105, - 125, 114, 126, 113, 141, 179, 142, 132, 83, 119, - 158, 178, 108, 83, 159, 120, 112, 103, 133, 179, - 83, 45, 177, 136, 160, 804, 134, 45, 135, 45, - 45, 113, 45, 182, 45, 45, 45, 178, 117, 144, - 145, 45, 45, 146, 45, 45, 90, 90, 90, 147, + 83, 179, 122, 112, 139, 123, 804, 83, 124, 105, + 125, 114, 126, 113, 140, 179, 141, 132, 83, 119, + 158, 177, 108, 83, 159, 120, 112, 103, 133, 179, + 83, 45, 147, 135, 160, 197, 148, 45, 134, 45, + 45, 113, 45, 182, 45, 45, 45, 177, 117, 143, + 144, 45, 45, 145, 45, 45, 149, 805, 197, 146, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 102, 148, 222, 45, 127, 149, - 256, 45, 128, 111, 191, 129, 130, 257, 218, 45, - 219, 114, 223, 45, 177, 45, 118, 154, 131, 150, - 112, 164, 151, 187, 152, 165, 153, 155, 166, 103, - 113, 191, 156, 157, 172, 167, 168, 85, 85, 85, - 180, 169, 193, 112, 173, 170, 249, 250, 83, 174, - 81, 187, 82, 82, 82, 89, 178, 89, 113, 190, - 90, 90, 90, 83, 81, 171, 84, 84, 84, 101, - 193, 83, 85, 85, 85, 194, 101, 83, 90, 90, + 45, 45, 45, 45, 90, 90, 90, 45, 127, 806, + 111, 45, 128, 178, 256, 129, 130, 102, 114, 45, + 164, 257, 153, 45, 165, 45, 118, 166, 131, 150, + 154, 151, 155, 152, 167, 168, 112, 156, 157, 178, + 169, 172, 85, 85, 85, 283, 113, 90, 90, 90, + 807, 173, 103, 83, 177, 366, 174, 187, 367, 112, + 81, 170, 82, 82, 82, 89, 178, 89, 283, 190, + 90, 90, 90, 83, 113, 81, 83, 84, 84, 84, + 180, 171, 85, 85, 85, 187, 191, 101, 83, 193, - 90, 195, 181, 83, 196, 190, 83, 197, 187, 225, - 237, 193, 226, 267, 238, 252, 227, 268, 253, 254, - 83, 269, 194, 280, 101, 201, 83, 196, 101, 195, - 197, 196, 101, 805, 280, 281, 202, 281, 293, 243, - 101, 244, 258, 282, 101, 282, 101, 185, 200, 200, - 200, 280, 383, 806, 276, 200, 200, 200, 200, 200, - 200, 281, 283, 284, 289, 293, 282, 292, 285, 295, - 299, 297, 338, 289, 390, 259, 260, 261, 200, 200, - 200, 200, 200, 200, 391, 308, 262, 289, 263, 295, - 264, 309, 295, 265, 297, 292, 302, 299, 300, 300, + 221, 194, 181, 83, 101, 190, 83, 195, 282, 218, + 196, 219, 224, 187, 236, 225, 222, 193, 237, 226, + 282, 83, 281, 191, 249, 250, 83, 193, 194, 385, + 201, 281, 101, 196, 282, 195, 101, 196, 283, 252, + 101, 202, 253, 254, 293, 242, 285, 243, 101, 258, + 281, 290, 101, 294, 101, 185, 200, 200, 200, 284, + 277, 286, 296, 200, 200, 200, 200, 200, 200, 268, + 338, 298, 293, 269, 290, 300, 290, 270, 808, 386, + 294, 809, 259, 260, 261, 296, 200, 200, 200, 200, + 200, 200, 350, 262, 298, 263, 296, 264, 265, 303, - 300, 349, 384, 411, 386, 300, 300, 300, 300, 300, - 300, 365, 345, 386, 366, 392, 394, 395, 397, 400, - 412, 444, 445, 339, 392, 396, 340, 386, 300, 300, - 300, 300, 300, 300, 417, 350, 387, 431, 418, 400, - 463, 397, 432, 490, 392, 451, 497, 400, 491, 351, - 403, 403, 403, 404, 518, 452, 525, 403, 403, 403, - 403, 403, 403, 505, 596, 506, 497, 453, 526, 519, - 529, 592, 597, 646, 497, 530, 598, 682, 681, 807, - 403, 403, 403, 403, 403, 403, 680, 683, 433, 686, - 505, 596, 506, 434, 507, 687, 464, 45, 45, 45, + 266, 309, 300, 301, 301, 301, 388, 310, 388, 399, + 301, 301, 301, 301, 301, 301, 394, 392, 402, 345, + 394, 339, 413, 432, 340, 493, 351, 393, 433, 388, + 494, 389, 399, 301, 301, 301, 301, 301, 301, 414, + 352, 396, 397, 419, 402, 394, 402, 420, 465, 406, + 398, 405, 405, 405, 445, 446, 452, 810, 405, 405, + 405, 405, 405, 405, 500, 500, 453, 508, 599, 509, + 530, 600, 454, 521, 434, 531, 813, 684, 814, 435, + 683, 405, 405, 405, 405, 405, 405, 648, 522, 815, + 816, 685, 500, 510, 508, 599, 509, 595, 770, 600, - 597, 681, 808, 811, 45, 45, 45, 45, 45, 45, - 647, 748, 750, 751, 680, 755, 767, 812, 749, 809, - 752, 756, 813, 810, 814, 815, 816, 45, 45, 45, - 45, 45, 45, 817, 818, 819, 820, 821, 822, 823, - 824, 825, 826, 827, 767, 828, 829, 830, 831, 832, - 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, - 863, 864, 865, 866, 867, 868, 846, 869, 870, 845, - 871, 872, 873, 874, 875, 878, 879, 880, 881, 876, + 684, 686, 601, 689, 466, 45, 45, 45, 683, 690, + 817, 751, 45, 45, 45, 45, 45, 45, 752, 753, + 754, 811, 758, 818, 649, 812, 770, 755, 759, 819, + 820, 821, 822, 823, 824, 45, 45, 45, 45, 45, + 45, 825, 826, 827, 828, 829, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, + 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 868, 869, 870, 871, 849, 872, + 873, 848, 874, 875, 876, 879, 880, 881, 882, 877, - 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, - 892, 894, 895, 896, 897, 898, 899, 900, 901, 902, - 903, 893, 904, 905, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 923, 922, 924, 925, 926, 927, 928, 929, 930, 931, - 877, 932, 933, 934, 935, 936, 937, 938, 939, 940, - 941, 942, 943, 944, 945, 946, 947, 921, 922, 948, - 949, 950, 952, 953, 954, 955, 951, 956, 957, 958, - 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, + 893, 894, 896, 897, 898, 899, 900, 901, 902, 903, + 904, 905, 895, 906, 907, 908, 909, 910, 911, 912, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 926, 925, 927, 928, 929, 930, 931, 932, + 878, 933, 934, 935, 936, 937, 938, 939, 940, 941, + 942, 943, 944, 945, 946, 947, 948, 949, 950, 924, + 925, 951, 953, 954, 955, 956, 952, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 991, 1014, 1015, 1016, 1017, - 1018, 992, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, - 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, - 1037, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1058, - 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, - 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 994, 1017, 1018, + 1019, 1020, 1021, 995, 1022, 1023, 1024, 1025, 1026, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, + 1038, 1039, 1040, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, - 1079, 1080, 1052, 1083, 1081, 1084, 1085, 1086, 1087, 1088, - 1089, 1038, 1082, 1090, 1091, 1092, 1093, 1094, 1095, 1096, - 1057, 1097, 1098, 1099, 1100, 1101, 1102, 1104, 1105, 1106, - 1107, 1103, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, - 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1105, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, - 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, - 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, - 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1145, 1172, 1173, + 1080, 1081, 1082, 1084, 1055, 1085, 1086, 1087, 1088, 1089, + 1083, 1090, 1091, 1041, 1092, 1093, 1094, 1095, 1096, 1097, + 1098, 1099, 1060, 1100, 1101, 1102, 1103, 1104, 1105, 1107, + 1108, 1109, 1110, 1106, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1108, 1130, 1131, 1132, 1133, 1134, 1135, + 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, + 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, + 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1148, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, - 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, - 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, - 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1185, - 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, - 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, - 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, - 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, + 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, + 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, + 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, + 1215, 1188, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, + 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, + 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, - 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, - 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, - 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, - 1313, 1314, 1315, 1316, 1317, 12, 12, 12, 12, 12, - 36, 36, 36, 36, 36, 80, 287, 80, 80, 80, - 99, 389, 99, 494, 99, 101, 101, 101, 101, 101, - 116, 116, 116, 116, 116, 176, 101, 176, 176, 176, - 198, 198, 198, 801, 800, 799, 798, 797, 796, 795, - 794, 793, 792, 791, 790, 789, 788, 787, 786, 785, + 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, + 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, + 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, + 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, + 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, + 1324, 1325, 1326, 12, 12, 12, 12, 12, 36, 36, + 36, 36, 36, 80, 288, 80, 80, 80, 99, 391, + 99, 497, 99, 101, 101, 101, 101, 101, 116, 116, + 116, 116, 116, 176, 101, 176, 176, 176, 198, 198, + 198, 800, 799, 798, 797, 796, 795, 794, 793, 792, - 784, 783, 782, 781, 780, 779, 778, 777, 776, 775, - 774, 773, 772, 771, 770, 769, 768, 766, 765, 764, - 763, 762, 761, 760, 759, 758, 757, 754, 753, 747, - 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, - 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, - 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, - 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, - 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, - 696, 695, 694, 693, 692, 691, 690, 689, 688, 685, - 684, 679, 678, 677, 676, 675, 674, 673, 672, 671, + 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, + 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, + 771, 769, 768, 767, 766, 765, 764, 763, 762, 761, + 760, 757, 756, 750, 749, 748, 747, 746, 745, 744, + 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, + 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, + 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, + 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, + 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, + 693, 692, 691, 688, 687, 682, 681, 680, 679, 678, - 668, 667, 666, 665, 664, 663, 662, 661, 660, 659, - 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, - 648, 645, 644, 643, 642, 641, 640, 639, 638, 637, - 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, - 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, - 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, - 606, 605, 604, 603, 602, 601, 600, 599, 595, 594, - 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, - 583, 582, 581, 580, 579, 578, 577, 576, 575, 574, - 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, + 677, 676, 675, 674, 671, 670, 669, 668, 667, 666, + 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, + 655, 654, 653, 652, 651, 650, 647, 646, 645, 644, + 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, + 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, + 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, + 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, + 603, 602, 598, 597, 596, 595, 594, 593, 592, 591, + 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, + 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, - 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, - 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, - 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, - 533, 532, 531, 528, 527, 524, 523, 522, 521, 520, - 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, - 504, 503, 502, 501, 500, 499, 498, 496, 495, 493, - 492, 489, 488, 487, 486, 485, 484, 483, 482, 481, - 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, - 470, 469, 468, 467, 466, 465, 462, 461, 460, 459, - 458, 457, 456, 455, 454, 450, 449, 448, 447, 446, + 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, + 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, + 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, + 540, 539, 538, 537, 536, 535, 534, 533, 532, 529, + 528, 527, 526, 525, 524, 523, 520, 519, 518, 517, + 516, 515, 514, 513, 512, 511, 507, 506, 505, 504, + 503, 502, 501, 499, 498, 496, 495, 492, 491, 490, + 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, + 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, + 469, 468, 467, 464, 463, 462, 461, 460, 459, 458, - 443, 442, 441, 440, 439, 438, 437, 436, 435, 430, - 429, 428, 427, 426, 425, 424, 423, 422, 421, 420, - 419, 416, 415, 414, 413, 410, 409, 408, 407, 406, - 405, 402, 401, 399, 398, 393, 388, 385, 382, 381, - 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, - 370, 369, 368, 367, 364, 363, 362, 361, 360, 359, - 358, 357, 356, 355, 354, 353, 352, 348, 347, 346, - 344, 343, 342, 341, 337, 336, 335, 334, 333, 332, - 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, - 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, + 457, 456, 455, 451, 450, 449, 448, 447, 444, 443, + 442, 441, 440, 439, 438, 437, 436, 431, 430, 429, + 428, 427, 426, 425, 424, 423, 422, 421, 418, 417, + 416, 415, 412, 411, 410, 409, 408, 407, 404, 403, + 401, 400, 395, 390, 387, 384, 383, 382, 381, 380, + 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, + 369, 368, 365, 364, 363, 362, 361, 360, 359, 358, + 357, 356, 355, 354, 353, 349, 348, 347, 346, 344, + 343, 342, 341, 337, 336, 335, 334, 333, 332, 331, + 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 311, 310, 307, 306, 305, 304, 303, 301, 199, 298, - 296, 294, 291, 290, 288, 286, 279, 278, 277, 275, - 274, 273, 272, 271, 270, 266, 255, 251, 248, 247, - 246, 245, 242, 241, 240, 239, 236, 235, 234, 233, - 232, 231, 230, 229, 228, 224, 221, 220, 217, 216, - 215, 214, 211, 210, 209, 206, 205, 204, 203, 199, - 192, 189, 188, 186, 184, 183, 175, 161, 143, 137, - 121, 110, 107, 106, 104, 43, 100, 98, 97, 88, - 43, 1318, 11, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, + 308, 307, 306, 305, 304, 302, 199, 299, 297, 295, + 292, 291, 289, 287, 280, 279, 278, 276, 275, 274, + 273, 272, 271, 267, 255, 251, 248, 247, 246, 245, + 244, 241, 240, 239, 238, 235, 234, 233, 232, 231, + 230, 229, 228, 227, 223, 220, 217, 216, 215, 214, + 211, 210, 209, 206, 205, 204, 203, 199, 192, 189, + 188, 186, 184, 183, 175, 161, 142, 136, 121, 110, + 107, 106, 104, 43, 100, 98, 97, 88, 43, 1327, + 11, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318 + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327 } ; -static const flex_int16_t yy_chk[1755] = +static const flex_int16_t yy_chk[1763] = { 0, - 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 21, 584, - 3, 3, 3, 21, 1, 1, 3, 0, 584, 1, + 0, 1, 1, 1, 0, 1, 1, 716, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 21, 587, + 3, 3, 3, 21, 1, 1, 3, 0, 587, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, @@ -1406,7 +1410,7 @@ static const flex_int16_t yy_chk[1755] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, 124, 75, 25, 66, 25, 75, 2, 25, 25, 25, - 124, 66, 2, 128, 128, 20, 51, 720, 54, 2, + 124, 66, 2, 128, 128, 20, 51, 718, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1417,174 +1421,175 @@ static const flex_int16_t yy_chk[1755] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 48, 17, 17, 17, 19, 56, 19, 19, 19, 44, 59, 22, 17, 22, 22, 22, 64, - 19, 93, 61, 55, 67, 61, 91, 22, 61, 48, + 19, 93, 61, 55, 67, 61, 721, 22, 61, 48, 61, 56, 61, 55, 67, 96, 67, 63, 17, 59, - 73, 92, 64, 19, 73, 59, 55, 44, 63, 93, - 22, 45, 91, 64, 73, 721, 63, 45, 63, 45, - 45, 55, 45, 96, 45, 45, 45, 92, 58, 69, - 69, 45, 45, 69, 45, 58, 89, 89, 89, 69, + 73, 91, 64, 19, 73, 59, 55, 44, 63, 93, + 22, 45, 70, 64, 73, 115, 70, 45, 63, 45, + 45, 55, 45, 96, 45, 45, 45, 91, 58, 69, + 69, 45, 45, 69, 45, 58, 70, 722, 115, 69, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 58, 101, 70, 136, 58, 62, 70, - 162, 58, 62, 71, 109, 62, 62, 162, 133, 58, - 133, 78, 136, 58, 94, 58, 58, 72, 62, 70, - 77, 76, 71, 105, 71, 76, 71, 72, 76, 101, - 77, 109, 72, 72, 78, 76, 76, 81, 81, 81, - 94, 76, 111, 77, 78, 77, 158, 158, 81, 78, - 82, 105, 82, 82, 82, 83, 95, 83, 77, 108, - 83, 83, 83, 82, 84, 77, 84, 84, 84, 103, - 111, 81, 85, 85, 85, 112, 103, 84, 90, 90, + 45, 45, 45, 58, 89, 89, 89, 58, 62, 723, + 71, 58, 62, 92, 162, 62, 62, 101, 78, 58, + 76, 162, 72, 58, 76, 58, 58, 76, 62, 71, + 72, 71, 72, 71, 76, 76, 77, 72, 72, 92, + 76, 78, 81, 81, 81, 179, 77, 90, 90, 90, + 726, 78, 101, 81, 94, 261, 78, 105, 261, 77, + 82, 77, 82, 82, 82, 83, 95, 83, 179, 108, + 83, 83, 83, 82, 77, 84, 81, 84, 84, 84, + 94, 77, 85, 85, 85, 105, 109, 103, 84, 111, - 90, 113, 95, 85, 114, 108, 82, 115, 119, 138, - 148, 153, 138, 165, 148, 160, 138, 165, 160, 160, - 84, 165, 112, 177, 103, 119, 85, 172, 103, 113, - 115, 114, 103, 722, 180, 178, 119, 181, 191, 153, - 103, 153, 163, 179, 103, 182, 103, 103, 118, 118, - 118, 177, 278, 725, 172, 118, 118, 118, 118, 118, - 118, 178, 180, 181, 187, 191, 179, 190, 182, 193, - 197, 195, 238, 202, 288, 163, 163, 163, 118, 118, - 118, 118, 118, 118, 288, 208, 163, 187, 163, 243, - 163, 208, 193, 163, 195, 190, 202, 197, 200, 200, + 135, 112, 95, 85, 103, 108, 82, 113, 178, 133, + 114, 133, 137, 119, 147, 137, 135, 152, 147, 137, + 181, 84, 177, 109, 158, 158, 85, 111, 112, 279, + 119, 180, 103, 172, 178, 113, 103, 114, 182, 160, + 103, 119, 160, 160, 190, 152, 181, 152, 103, 163, + 177, 187, 103, 191, 103, 103, 118, 118, 118, 180, + 172, 182, 193, 118, 118, 118, 118, 118, 118, 165, + 237, 195, 190, 165, 187, 197, 202, 165, 727, 279, + 191, 728, 163, 163, 163, 193, 118, 118, 118, 118, + 118, 118, 247, 163, 195, 163, 242, 163, 163, 202, - 200, 247, 278, 309, 280, 200, 200, 200, 200, 200, - 200, 261, 243, 283, 261, 289, 291, 291, 292, 295, - 309, 338, 338, 238, 302, 291, 238, 280, 200, 200, - 200, 200, 200, 200, 315, 247, 283, 328, 315, 345, - 356, 292, 328, 384, 289, 344, 392, 295, 384, 247, - 300, 300, 300, 302, 417, 344, 424, 300, 300, 300, - 300, 300, 300, 402, 505, 402, 404, 345, 424, 417, - 427, 507, 506, 559, 392, 427, 507, 598, 597, 726, - 300, 300, 300, 300, 300, 300, 596, 598, 328, 601, - 402, 505, 402, 328, 404, 601, 356, 403, 403, 403, + 163, 208, 197, 200, 200, 200, 281, 208, 284, 293, + 200, 200, 200, 200, 200, 200, 290, 289, 296, 242, + 303, 237, 310, 328, 237, 386, 247, 289, 328, 281, + 386, 284, 293, 200, 200, 200, 200, 200, 200, 310, + 247, 292, 292, 316, 345, 290, 296, 316, 357, 303, + 292, 301, 301, 301, 338, 338, 344, 729, 301, 301, + 301, 301, 301, 301, 394, 406, 344, 404, 508, 404, + 428, 509, 345, 419, 328, 428, 731, 600, 732, 328, + 599, 301, 301, 301, 301, 301, 301, 561, 419, 733, + 734, 601, 394, 406, 404, 508, 404, 510, 684, 509, - 506, 597, 727, 729, 403, 403, 403, 403, 403, 403, - 559, 664, 665, 665, 596, 668, 681, 730, 664, 728, - 665, 668, 731, 728, 732, 733, 734, 403, 403, 403, - 403, 403, 403, 736, 737, 738, 739, 740, 741, 742, - 743, 744, 745, 746, 681, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, - 763, 764, 766, 767, 768, 769, 770, 771, 772, 773, - 774, 775, 776, 777, 778, 779, 780, 781, 782, 784, - 785, 786, 787, 788, 789, 790, 767, 791, 792, 766, - 793, 794, 796, 797, 798, 799, 801, 802, 803, 798, + 600, 601, 510, 604, 357, 405, 405, 405, 599, 604, + 735, 667, 405, 405, 405, 405, 405, 405, 667, 668, + 668, 730, 671, 736, 561, 730, 684, 668, 671, 738, + 739, 740, 741, 742, 743, 405, 405, 405, 405, 405, + 405, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 761, 762, 763, + 764, 765, 766, 767, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 787, 788, 789, 790, 791, 792, 793, 770, 794, + 795, 769, 797, 798, 799, 800, 802, 803, 804, 799, - 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, - 814, 815, 817, 818, 819, 820, 822, 823, 824, 825, - 826, 814, 827, 828, 829, 830, 831, 832, 833, 835, - 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, - 847, 846, 848, 849, 850, 851, 853, 854, 855, 856, - 798, 857, 858, 860, 861, 862, 863, 864, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 845, 846, 874, - 876, 877, 878, 879, 880, 881, 877, 882, 883, 884, - 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, - 895, 896, 897, 899, 900, 901, 902, 903, 904, 905, + 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, + 815, 816, 817, 819, 820, 821, 822, 824, 825, 826, + 827, 828, 816, 829, 830, 831, 832, 833, 834, 835, + 836, 838, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 848, 850, 849, 851, 852, 853, 854, 856, 857, + 799, 858, 859, 860, 861, 863, 864, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 877, 848, + 849, 878, 879, 880, 881, 882, 878, 883, 884, 885, + 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, + 896, 897, 898, 899, 901, 902, 903, 904, 905, 906, - 907, 908, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 920, 921, 922, 923, 924, 925, 927, 928, 929, - 930, 933, 934, 935, 936, 937, 938, 939, 940, 941, - 942, 943, 944, 945, 946, 921, 947, 949, 951, 953, - 954, 922, 955, 956, 957, 959, 960, 961, 963, 964, - 965, 966, 967, 970, 971, 972, 973, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 907, 908, 910, 911, 913, 914, 915, 916, 917, 918, + 919, 920, 921, 923, 924, 925, 926, 927, 928, 930, + 931, 932, 933, 936, 937, 938, 939, 940, 941, 942, + 943, 944, 945, 946, 947, 948, 950, 924, 952, 954, + 955, 956, 957, 925, 958, 960, 961, 962, 963, 965, + 966, 967, 968, 969, 972, 973, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1019, 1020, 991, 1022, 1021, 1026, 1027, 1028, 1029, 1030, - 1031, 977, 1021, 1032, 1033, 1034, 1036, 1037, 1038, 1039, - 996, 1041, 1043, 1046, 1048, 1049, 1050, 1051, 1052, 1054, - 1055, 1050, 1057, 1058, 1059, 1060, 1061, 1062, 1064, 1065, - 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1076, - 1077, 1052, 1079, 1080, 1081, 1082, 1084, 1085, 1086, 1087, - 1088, 1091, 1093, 1094, 1096, 1097, 1098, 1099, 1101, 1103, - 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1105, 1132, 1133, + 1020, 1021, 1022, 1023, 994, 1025, 1028, 1029, 1030, 1031, + 1022, 1032, 1033, 980, 1034, 1035, 1036, 1038, 1039, 1040, + 1041, 1042, 999, 1044, 1046, 1049, 1051, 1052, 1053, 1054, + 1055, 1057, 1058, 1053, 1060, 1061, 1062, 1063, 1064, 1065, + 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1077, + 1078, 1080, 1081, 1055, 1082, 1083, 1085, 1086, 1087, 1088, + 1089, 1090, 1093, 1095, 1096, 1097, 1099, 1100, 1101, 1102, + 1104, 1106, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, + 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1108, - 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1145, 1146, 1149, 1152, 1153, 1156, 1158, 1159, 1160, - 1161, 1162, 1163, 1165, 1167, 1169, 1170, 1171, 1173, 1174, - 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1145, - 1185, 1186, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1196, - 1197, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, - 1211, 1214, 1215, 1217, 1218, 1219, 1221, 1222, 1223, 1224, - 1226, 1227, 1228, 1229, 1230, 1231, 1233, 1234, 1235, 1236, - 1237, 1238, 1239, 1240, 1242, 1243, 1244, 1245, 1247, 1248, - 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1259, 1261, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 1145, 1146, 1147, 1148, 1149, 1152, 1155, 1156, 1159, 1160, + 1161, 1162, 1163, 1164, 1166, 1168, 1170, 1171, 1172, 1173, + 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, + 1185, 1148, 1187, 1188, 1189, 1191, 1192, 1193, 1194, 1195, + 1196, 1198, 1199, 1201, 1202, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1211, 1215, 1218, 1219, 1221, 1222, 1224, + 1225, 1226, 1227, 1230, 1231, 1232, 1233, 1234, 1235, 1236, + 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1246, 1247, 1248, + 1249, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, - 1262, 1263, 1265, 1267, 1268, 1270, 1271, 1272, 1274, 1275, - 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, - 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1294, 1295, 1296, - 1297, 1298, 1299, 1303, 1304, 1305, 1307, 1308, 1309, 1310, - 1311, 1312, 1313, 1315, 1316, 1319, 1319, 1319, 1319, 1319, - 1320, 1320, 1320, 1320, 1320, 1321, 1327, 1321, 1321, 1321, - 1322, 1328, 1322, 1329, 1322, 1323, 1323, 1323, 1323, 1323, - 1324, 1324, 1324, 1324, 1324, 1325, 1330, 1325, 1325, 1325, - 1326, 1326, 1326, 716, 715, 714, 713, 712, 711, 710, - 709, 708, 707, 706, 705, 703, 702, 701, 700, 699, + 1260, 1263, 1265, 1266, 1267, 1268, 1270, 1271, 1272, 1274, + 1275, 1276, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, + 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, + 1296, 1297, 1298, 1299, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1312, 1313, 1314, 1316, 1317, 1318, 1319, 1320, 1321, + 1322, 1324, 1325, 1328, 1328, 1328, 1328, 1328, 1329, 1329, + 1329, 1329, 1329, 1330, 1336, 1330, 1330, 1330, 1331, 1337, + 1331, 1338, 1331, 1332, 1332, 1332, 1332, 1332, 1333, 1333, + 1333, 1333, 1333, 1334, 1339, 1334, 1334, 1334, 1335, 1335, + 1335, 715, 714, 713, 712, 711, 710, 709, 708, 707, - 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, - 688, 687, 686, 685, 684, 683, 682, 680, 678, 677, - 676, 675, 674, 673, 672, 671, 670, 667, 666, 663, - 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, - 652, 651, 650, 649, 648, 647, 645, 644, 643, 642, - 641, 640, 639, 637, 636, 635, 634, 633, 632, 631, - 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, - 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, - 610, 609, 608, 607, 606, 605, 604, 603, 602, 600, - 599, 595, 594, 593, 591, 590, 588, 587, 586, 585, + 706, 704, 703, 702, 701, 700, 699, 698, 697, 696, + 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, + 685, 683, 681, 680, 679, 678, 677, 676, 675, 674, + 673, 670, 669, 666, 665, 664, 663, 662, 661, 660, + 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, + 649, 647, 646, 645, 644, 643, 642, 641, 640, 638, + 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, + 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, + 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, + 607, 606, 605, 603, 602, 598, 597, 596, 594, 593, - 582, 581, 580, 579, 578, 577, 576, 575, 574, 572, - 571, 570, 569, 568, 567, 566, 565, 563, 562, 561, - 560, 558, 557, 556, 555, 553, 552, 550, 549, 548, - 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, - 537, 536, 535, 534, 533, 532, 531, 530, 528, 527, - 526, 525, 524, 523, 522, 521, 520, 519, 518, 517, - 516, 515, 514, 513, 512, 511, 510, 509, 503, 501, - 498, 497, 496, 495, 493, 492, 491, 489, 488, 485, - 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, - 474, 473, 472, 471, 470, 469, 468, 467, 466, 464, + 591, 590, 589, 588, 585, 584, 583, 582, 581, 580, + 579, 578, 577, 576, 574, 573, 572, 571, 570, 569, + 568, 567, 565, 564, 563, 562, 560, 559, 558, 557, + 556, 554, 553, 551, 550, 549, 548, 547, 546, 545, + 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, + 534, 533, 532, 531, 529, 528, 527, 526, 525, 524, + 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, + 513, 512, 506, 504, 501, 500, 499, 498, 496, 495, + 494, 492, 491, 488, 487, 486, 485, 484, 483, 482, + 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, - 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, - 452, 451, 449, 448, 447, 446, 445, 444, 443, 442, - 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, - 430, 429, 428, 426, 425, 423, 422, 421, 419, 418, - 416, 415, 413, 412, 411, 410, 408, 407, 406, 405, - 400, 399, 397, 396, 395, 394, 393, 391, 390, 388, - 385, 383, 382, 380, 379, 378, 377, 376, 375, 374, - 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, - 363, 362, 360, 359, 358, 357, 355, 354, 353, 352, - 351, 350, 349, 348, 346, 343, 342, 341, 340, 339, + 471, 470, 469, 468, 466, 464, 463, 462, 461, 460, + 459, 458, 457, 456, 455, 454, 453, 452, 450, 449, + 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, + 438, 437, 436, 435, 434, 433, 431, 430, 429, 427, + 426, 425, 424, 423, 421, 420, 418, 417, 415, 414, + 413, 412, 410, 409, 408, 407, 402, 401, 399, 398, + 397, 396, 395, 393, 392, 390, 387, 385, 384, 382, + 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, + 371, 370, 369, 368, 367, 366, 365, 364, 363, 361, + 360, 359, 358, 356, 355, 354, 353, 352, 351, 350, - 337, 336, 335, 334, 333, 332, 331, 330, 329, 327, - 326, 325, 324, 323, 322, 321, 320, 319, 318, 317, - 316, 314, 313, 312, 311, 308, 307, 306, 305, 304, - 303, 299, 297, 294, 293, 290, 286, 279, 277, 276, - 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, - 265, 264, 263, 262, 260, 259, 258, 257, 256, 255, - 254, 253, 252, 251, 250, 249, 248, 246, 245, 244, - 242, 241, 240, 239, 237, 236, 235, 234, 233, 232, - 231, 230, 228, 227, 226, 225, 224, 223, 222, 221, - 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, + 349, 348, 346, 343, 342, 341, 340, 339, 337, 336, + 335, 334, 333, 332, 331, 330, 329, 327, 326, 325, + 324, 323, 322, 321, 320, 319, 318, 317, 315, 314, + 313, 312, 309, 308, 307, 306, 305, 304, 300, 298, + 295, 294, 291, 287, 280, 278, 277, 276, 275, 274, + 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, + 263, 262, 260, 259, 258, 257, 256, 255, 254, 253, + 252, 251, 250, 249, 248, 246, 245, 244, 243, 241, + 240, 239, 238, 236, 235, 234, 233, 232, 231, 230, + 229, 227, 226, 225, 224, 223, 222, 221, 220, 219, - 210, 209, 207, 206, 205, 204, 203, 201, 198, 196, - 194, 192, 189, 188, 186, 183, 175, 174, 173, 171, - 170, 169, 168, 167, 166, 164, 161, 159, 157, 156, - 155, 154, 152, 151, 150, 149, 147, 146, 145, 144, - 143, 142, 141, 140, 139, 137, 135, 134, 132, 131, - 130, 129, 127, 126, 125, 123, 122, 121, 120, 116, - 110, 107, 106, 104, 99, 98, 79, 74, 68, 65, - 60, 53, 50, 49, 47, 43, 41, 39, 38, 24, - 14, 11, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, + 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, + 207, 206, 205, 204, 203, 201, 198, 196, 194, 192, + 189, 188, 186, 183, 175, 174, 173, 171, 170, 169, + 168, 167, 166, 164, 161, 159, 157, 156, 155, 154, + 153, 151, 150, 149, 148, 146, 145, 144, 143, 142, + 141, 140, 139, 138, 136, 134, 132, 131, 130, 129, + 127, 126, 125, 123, 122, 121, 120, 116, 110, 107, + 106, 104, 99, 98, 79, 74, 68, 65, 60, 53, + 50, 49, 47, 43, 41, 39, 38, 24, 14, 11, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, - 1318, 1318, 1318, 1318 + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 1327, 1327 } ; static yy_state_type yy_last_accepting_state; @@ -1664,7 +1669,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg) -#line 1667 "dhcp4_lexer.cc" +#line 1672 "dhcp4_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1690,8 +1695,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1693 "dhcp4_lexer.cc" -#line 1694 "dhcp4_lexer.cc" +#line 1698 "dhcp4_lexer.cc" +#line 1699 "dhcp4_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2017,7 +2022,7 @@ YY_DECL } -#line 2020 "dhcp4_lexer.cc" +#line 2025 "dhcp4_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2046,13 +2051,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1319 ) + if ( yy_current_state >= 1328 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1318 ); + while ( yy_current_state != 1327 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2993,9 +2998,9 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: - return isc::dhcp::Dhcp4Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("required-client-classes", driver.loc_); } } YY_BREAK @@ -3032,9 +3037,9 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: - return isc::dhcp::Dhcp4Parser::make_EVAL_ON_DEMAND(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_ONLY_IF_REQUIRED(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("eval-on-demand", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("only-if-required", driver.loc_); } } YY_BREAK @@ -4084,7 +4089,7 @@ YY_RULE_SETUP #line 1632 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4087 "dhcp4_lexer.cc" +#line 4092 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4403,7 +4408,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1319 ) + if ( yy_current_state >= 1328 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4436,11 +4441,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1319 ) + if ( yy_current_state >= 1328 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1318); + yy_is_jam = (yy_current_state == 1327); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index 3a8e831125..a92d7ad01a 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -1863,7 +1863,7 @@ namespace isc { namespace dhcp { #line 985 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.back()->set("required-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } @@ -2688,7 +2688,7 @@ namespace isc { namespace dhcp { #line 1597 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("eval-on-demand", b); + ctx.stack_.back()->set("only-if-required", b); } #line 2694 "dhcp4_parser.cc" // lalr1.cc:859 break; @@ -4213,37 +4213,38 @@ namespace isc { namespace dhcp { "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"eval-client-classes\"", "\"test\"", - "\"eval-on-demand\"", "\"client-class\"", "\"reservations\"", "\"duid\"", - "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", "\"hostname\"", - "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", - "\"library\"", "\"parameters\"", "\"expired-leases-processing\"", - "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"", - "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"", - "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"", - "\"dhcp4o6-port\"", "\"control-socket\"", "\"socket-type\"", - "\"socket-name\"", "\"dhcp-ddns\"", "\"enable-updates\"", - "\"qualifying-suffix\"", "\"server-ip\"", "\"server-port\"", - "\"sender-ip\"", "\"sender-port\"", "\"max-queue-size\"", - "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", - "\"override-no-update\"", "\"override-client-update\"", - "\"replace-client-name\"", "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", - "\"when-present\"", "\"never\"", "\"always\"", "\"when-not-present\"", - "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", - "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", - "\"maxver\"", "\"Dhcp6\"", "\"DhcpDdns\"", "\"Control-agent\"", - "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", "SUB_DHCP4", "SUB_INTERFACES4", - "SUB_SUBNET4", "SUB_POOL4", "SUB_RESERVATION", "SUB_OPTION_DEFS", - "SUB_OPTION_DEF", "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", - "SUB_DHCP_DDNS", "\"constant string\"", "\"integer\"", - "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2", - "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", - "value", "sub_json", "map2", "$@13", "map_value", "map_content", - "not_empty_map", "list_generic", "$@14", "list_content", - "not_empty_list", "list_strings", "$@15", "list_strings_content", - "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@16", - "global_objects", "global_object", "dhcp4_object", "$@17", "sub_dhcp4", - "$@18", "global_params", "global_param", "valid_lifetime", "renew_timer", + "\"client-classes\"", "\"required-client-classes\"", "\"test\"", + "\"only-if-required\"", "\"client-class\"", "\"reservations\"", + "\"duid\"", "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", + "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", + "\"hooks-libraries\"", "\"library\"", "\"parameters\"", + "\"expired-leases-processing\"", "\"reclaim-timer-wait-time\"", + "\"flush-reclaimed-timer-wait-time\"", "\"hold-reclaimed-time\"", + "\"max-reclaim-leases\"", "\"max-reclaim-time\"", + "\"unwarned-reclaim-cycles\"", "\"dhcp4o6-port\"", "\"control-socket\"", + "\"socket-type\"", "\"socket-name\"", "\"dhcp-ddns\"", + "\"enable-updates\"", "\"qualifying-suffix\"", "\"server-ip\"", + "\"server-port\"", "\"sender-ip\"", "\"sender-port\"", + "\"max-queue-size\"", "\"ncr-protocol\"", "\"ncr-format\"", + "\"always-include-fqdn\"", "\"override-no-update\"", + "\"override-client-update\"", "\"replace-client-name\"", + "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", "\"when-present\"", + "\"never\"", "\"always\"", "\"when-not-present\"", "\"Logging\"", + "\"loggers\"", "\"output_options\"", "\"output\"", "\"debuglevel\"", + "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp6\"", + "\"DhcpDdns\"", "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", + "SUB_DHCP4", "SUB_INTERFACES4", "SUB_SUBNET4", "SUB_POOL4", + "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", + "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", + "\"constant string\"", "\"integer\"", "\"floating point\"", + "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", + "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "value", "sub_json", + "map2", "$@13", "map_value", "map_content", "not_empty_map", + "list_generic", "$@14", "list_content", "not_empty_list", "list_strings", + "$@15", "list_strings_content", "not_empty_list_strings", + "unknown_map_entry", "syntax_map", "$@16", "global_objects", + "global_object", "dhcp4_object", "$@17", "sub_dhcp4", "$@18", + "global_params", "global_param", "valid_lifetime", "renew_timer", "rebind_timer", "decline_probation_period", "echo_client_id", "match_client_id", "interfaces_config", "$@19", "interfaces_config_params", "interfaces_config_param", "sub_interfaces4", @@ -4269,7 +4270,7 @@ namespace isc { namespace dhcp { "sub_subnet4", "$@42", "subnet4_params", "subnet4_param", "subnet", "$@43", "subnet_4o6_interface", "$@44", "subnet_4o6_interface_id", "$@45", "subnet_4o6_subnet", "$@46", "interface", "$@47", "interface_id", - "$@48", "client_class", "$@49", "eval_client_classes", "$@50", + "$@48", "client_class", "$@49", "required_client_classes", "$@50", "reservation_mode", "$@51", "hr_mode", "id", "rapid_commit", "shared_networks", "$@52", "shared_networks_content", "shared_networks_list", "shared_network", "$@53", @@ -4300,7 +4301,7 @@ namespace isc { namespace dhcp { "$@86", "client_classes", "$@87", "client_classes_list", "client_class_entry", "$@88", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@89", "eval_on_demand", + "client_class_name", "client_class_test", "$@89", "only_if_required", "dhcp4o6_port", "control_socket", "$@90", "control_socket_params", "control_socket_param", "control_socket_type", "$@91", "control_socket_name", "$@92", "dhcp_ddns", "$@93", "sub_dhcp_ddns", @@ -4415,7 +4416,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4419 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 4420 "dhcp4_parser.cc" // lalr1.cc:1167 #line 1959 "dhcp4_parser.yy" // lalr1.cc:1168 diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index cbbf327d31..ce3ceae8af 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -421,9 +421,9 @@ namespace isc { namespace dhcp { TOKEN_ALL = 328, TOKEN_HOST_RESERVATION_IDENTIFIERS = 329, TOKEN_CLIENT_CLASSES = 330, - TOKEN_EVAL_CLIENT_CLASSES = 331, + TOKEN_REQUIRED_CLIENT_CLASSES = 331, TOKEN_TEST = 332, - TOKEN_EVAL_ON_DEMAND = 333, + TOKEN_ONLY_IF_REQUIRED = 333, TOKEN_CLIENT_CLASS = 334, TOKEN_RESERVATIONS = 335, TOKEN_DUID = 336, @@ -909,7 +909,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_EVAL_CLIENT_CLASSES (const location_type& l); + make_REQUIRED_CLIENT_CLASSES (const location_type& l); static inline symbol_type @@ -917,7 +917,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_EVAL_ON_DEMAND (const location_type& l); + make_ONLY_IF_REQUIRED (const location_type& l); static inline symbol_type @@ -2257,9 +2257,9 @@ namespace isc { namespace dhcp { } Dhcp4Parser::symbol_type - Dhcp4Parser::make_EVAL_CLIENT_CLASSES (const location_type& l) + Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES (const location_type& l) { - return symbol_type (token::TOKEN_EVAL_CLIENT_CLASSES, l); + return symbol_type (token::TOKEN_REQUIRED_CLIENT_CLASSES, l); } Dhcp4Parser::symbol_type @@ -2269,9 +2269,9 @@ namespace isc { namespace dhcp { } Dhcp4Parser::symbol_type - Dhcp4Parser::make_EVAL_ON_DEMAND (const location_type& l) + Dhcp4Parser::make_ONLY_IF_REQUIRED (const location_type& l) { - return symbol_type (token::TOKEN_EVAL_ON_DEMAND, l); + return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, l); } Dhcp4Parser::symbol_type diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index ed92aca4d4..85dd979f34 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052217 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index dc043a2f12..6cbc86a65e 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052217 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index b256062e86..3392eb1c97 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052217 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index c1abb4cd62..257468871a 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1300] = +static const flex_int16_t yy_accept[1309] = { 0, 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, 165, 163, 10, 11, 163, 1, 157, 154, 157, 157, @@ -726,125 +726,126 @@ static const flex_int16_t yy_accept[1300] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 162, 160, 0, 159, 158, 0, 0, 0, - 0, 0, 0, 0, 124, 0, 0, 27, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 162, 160, 0, 159, 158, 0, 0, + 0, 0, 0, 0, 0, 124, 0, 0, 27, 0, - 0, 0, 87, 0, 0, 0, 0, 0, 0, 47, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 87, 0, 0, 0, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 161, 158, 0, 0, - 0, 0, 0, 0, 0, 0, 28, 0, 0, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 161, 158, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, - 67, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 30, 0, 0, 0, 0, 0, 88, 0, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 76, 0, 51, 0, 0, 0, 0, 0, + 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 104, 129, 43, 0, - 48, 0, 0, 0, 0, 0, 0, 143, 36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, + 129, 43, 0, 48, 0, 0, 0, 0, 0, 0, - 33, 0, 32, 0, 0, 0, 117, 0, 0, 0, + 143, 36, 0, 33, 0, 32, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 0, 0, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 113, 0, 0, 0, 0, 7, 34, + 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 45, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, + 0, 7, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, - 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, - 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, + 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, - + 0, 0, 78, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 122, 93, 0, 0, 0, 97, - 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 62, 0, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, - 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 49, 70, 0, - 0, 0, 108, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 123, - - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 114, 99, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 110, 127, 0, 38, 0, - 119, 0, 0, 0, 0, 0, 0, 20, 0, 0, - 64, 0, 0, 0, 0, 121, 46, 0, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, - 65, 86, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 59, 0, 0, 0, 17, 15, 0, 141, - 140, 0, 0, 0, 0, 0, 29, 0, 103, 0, - 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, - 107, 0, 53, 0, 0, 0, 19, 0, 0, 0, - 0, 0, 82, 60, 0, 115, 0, 0, 0, 106, - 0, 0, 77, 0, 145, 0, 0, 0, 0, 0, - 0, 0, 75, 0, 130, 0, 0, 0, 0, 0, + 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 122, 93, 0, 0, 0, + 97, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 111, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 70, 0, 0, 0, 108, 0, 0, 0, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + + 16, 0, 123, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 114, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 110, 127, 0, 38, + 0, 119, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 64, 0, 0, 0, 0, 121, 46, 0, + 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, + 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, + 0, 0, 65, 86, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 59, 0, 0, 0, 0, 17, + 15, 0, 141, 140, 0, 0, 0, 0, 0, 29, + 0, 103, 0, 0, 0, 0, 0, 0, 138, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, + 0, 107, 0, 53, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 82, 60, 0, 115, 0, 0, + 0, 0, 106, 0, 0, 77, 0, 145, 0, 0, + 0, 0, 0, 0, 0, 75, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 101, 0, 56, 139, 0, 12, - 0, 105, 0, 0, 0, 0, 0, 0, 0, 41, - 0, 40, 18, 0, 0, 94, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 58, 0, 0, 54, - 0, 0, 73, 0, 0, 0, 0, 0, 120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 63, 0, 35, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 136, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 101, 0, 56, + 139, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 41, 0, 40, 18, 0, 0, 0, 94, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 54, 0, 73, 0, 0, 0, 0, 0, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 63, 0, 35, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 136, 105, - 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 0, 22, 57, 0, + 0, 0, 0, 0, 21, 0, 74, 0, 0, 134, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 0, 22, 57, 0, 0, 0, 0, 21, - 0, 102, 74, 0, 0, 134, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 90, 0, 0, 0, 0, 0, - 132, 137, 61, 0, 0, 0, 131, 0, 0, 0, - 0, 0, 0, 0, 91, 0, 0, 133, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, + 0, 90, 0, 0, 0, 0, 0, 0, 132, 102, + 137, 61, 0, 0, 0, 131, 0, 0, 0, 0, + 0, 0, 0, 91, 0, 0, 133, 0 } ; static const YY_CHAR yy_ec[256] = @@ -891,321 +892,321 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1312] = +static const flex_int16_t yy_base[1321] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1663, 1664, 32, 1659, 141, 0, 201, 1664, 206, 88, - 11, 213, 1664, 1641, 114, 25, 2, 6, 1664, 1664, - 73, 11, 17, 1664, 1664, 1664, 104, 1647, 1602, 0, - 1639, 107, 1654, 217, 241, 1664, 185, 1598, 1604, 1624, + 1673, 1674, 32, 1669, 141, 0, 201, 1674, 206, 88, + 11, 213, 1674, 1651, 114, 25, 2, 6, 1674, 1674, + 73, 11, 17, 1674, 1674, 1674, 104, 1657, 1612, 0, + 1649, 107, 1664, 217, 241, 1674, 185, 1608, 1614, 1634, 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 67, 231, 1605, 187, 268, 1604, 274, 188, 293, - 270, 296, 1587, 78, 294, 313, 323, 1606, 0, 335, - 352, 373, 378, 381, 1664, 0, 1664, 267, 295, 343, - 344, 312, 346, 349, 327, 1664, 1603, 1642, 1664, 237, + 269, 64, 231, 1615, 187, 75, 1614, 274, 188, 290, + 278, 297, 1597, 195, 298, 317, 324, 1616, 0, 345, + 352, 373, 380, 358, 1674, 0, 1674, 267, 295, 296, + 324, 283, 325, 346, 340, 1674, 1613, 1652, 1674, 384, - 1664, 373, 367, 1590, 1600, 1639, 373, 377, 249, 1594, - 373, 380, 377, 383, 384, 1637, 0, 429, 393, 1581, - 1589, 74, 1585, 1574, 1575, 401, 1591, 1574, 1583, 377, - 1590, 200, 307, 1576, 362, 1564, 1620, 308, 1567, 1618, - 1560, 1583, 1580, 1580, 1574, 193, 1567, 1560, 1565, 1559, - 420, 1570, 1555, 1554, 1568, 399, 1604, 1553, 404, 1565, - 1568, 1552, 438, 406, 1566, 1563, 1564, 1562, 1544, 1549, - 1545, 1537, 1554, 1546, 0, 424, 435, 443, 436, 450, - 444, 1545, 1664, 0, 459, 1536, 1539, 1664, 447, 442, - 1664, 1591, 1546, 462, 1589, 463, 1588, 459, 1587, 1664, + 1674, 385, 361, 1600, 1610, 1649, 368, 220, 249, 1604, + 366, 370, 371, 377, 304, 1647, 0, 436, 377, 1591, + 1599, 361, 1595, 1584, 1585, 365, 1601, 1584, 1593, 370, + 200, 373, 1587, 383, 1575, 1631, 406, 1578, 1629, 1571, + 1594, 1591, 1591, 1585, 272, 1578, 1571, 1576, 1570, 382, + 1581, 1574, 1565, 1564, 1578, 378, 1614, 1563, 405, 1575, + 1578, 1562, 433, 407, 1576, 1573, 1574, 1572, 1554, 1559, + 1555, 1547, 1564, 1556, 0, 435, 436, 428, 436, 444, + 446, 1555, 1674, 0, 465, 1546, 1549, 1674, 440, 457, + 1674, 1601, 1556, 464, 1599, 471, 1598, 470, 1597, 1674, - 503, 1586, 486, 1547, 1542, 1541, 362, 1582, 1576, 1542, - 1521, 1529, 1535, 1523, 1537, 1533, 1534, 1534, 1529, 1521, - 1520, 1522, 1506, 1510, 1523, 1523, 1515, 1505, 1508, 1522, - 1664, 1508, 1516, 1519, 1500, 1499, 1549, 1498, 1508, 1546, - 491, 1507, 1495, 1506, 1542, 483, 1546, 1499, 9, 1489, - 1505, 1486, 1488, 1484, 1490, 1481, 1480, 1493, 1486, 1488, - 1492, 1491, 1485, 80, 1492, 1487, 1479, 1485, 1485, 1466, - 1482, 1468, 1474, 1481, 1469, 1462, 1476, 1475, 1478, 1460, - 1468, 487, 1664, 1664, 488, 1664, 1664, 1455, 0, 455, - 1457, 517, 489, 1511, 1664, 1464, 473, 1664, 1509, 1664, + 514, 1596, 480, 1557, 1552, 1551, 447, 1592, 1586, 1552, + 1531, 1539, 1545, 1533, 1547, 1543, 1544, 1544, 1539, 1531, + 1533, 1517, 1521, 1534, 1534, 1526, 1516, 1519, 1533, 1674, + 1519, 1527, 1530, 1511, 1510, 1560, 1509, 1519, 1557, 492, + 1518, 1506, 1517, 1553, 483, 1557, 1494, 1509, 9, 1499, + 1515, 1496, 1498, 1494, 1500, 1491, 1490, 1503, 1496, 1498, + 1502, 1501, 1495, 80, 1502, 1497, 1489, 1479, 1494, 1494, + 1475, 1491, 1477, 1483, 1490, 1478, 1471, 1485, 1484, 1487, + 1469, 1477, 486, 1674, 1674, 493, 1674, 1674, 1464, 0, + 474, 1466, 491, 495, 1520, 1674, 1473, 472, 1674, 1518, - 1503, 543, 1664, 476, 1445, 1455, 1505, 1462, 460, 1664, - 1460, 1502, 1457, 1454, 1455, 396, 1459, 1497, 1447, 1442, - 1439, 1488, 1434, 1436, 1485, 1444, 1433, 1482, 1430, 549, - 1443, 1443, 1426, 1427, 1440, 1427, 1437, 1432, 1439, 1434, - 1419, 478, 1428, 1431, 1426, 1422, 1470, 192, 509, 1664, - 1417, 1416, 1409, 1411, 1415, 1404, 1411, 1416, 514, 1461, - 1416, 523, 1413, 1417, 1415, 1404, 1404, 1416, 1398, 1390, - 1391, 1412, 1394, 1406, 1405, 1391, 1403, 1402, 1401, 1400, - 1441, 1440, 1439, 1383, 490, 1396, 1664, 1664, 1395, 0, - 511, 1383, 1434, 1433, 1391, 1431, 1664, 1379, 1429, 1664, + 1674, 1512, 550, 1674, 477, 1454, 1464, 1514, 1471, 488, + 1674, 1469, 1511, 1466, 1463, 1464, 402, 1468, 1506, 1456, + 1451, 1448, 1444, 1446, 1495, 1454, 1443, 1492, 1440, 544, + 1453, 1453, 1436, 1437, 1450, 1437, 1447, 1442, 1449, 1444, + 1429, 395, 1438, 1441, 1436, 1432, 1480, 497, 490, 1674, + 1474, 1426, 1425, 1418, 1420, 1424, 1413, 1420, 1425, 515, + 1470, 1425, 474, 1422, 1426, 1424, 1413, 1413, 1425, 1407, + 1399, 1400, 1421, 1412, 1402, 1414, 1413, 1399, 1411, 1410, + 1409, 1408, 1449, 1448, 1447, 1391, 541, 1404, 1674, 1674, + 1403, 0, 491, 1391, 1442, 1441, 1399, 1439, 1674, 1387, - 542, 598, 520, 1428, 1370, 1664, 1386, 1385, 1372, 1371, - 1664, 1373, 1370, 1382, 1378, 1366, 1368, 1664, 1374, 1359, - 1361, 535, 1372, 1370, 1365, 572, 1372, 1354, 1403, 1664, - 1352, 1368, 1400, 1404, 1362, 1356, 1358, 1359, 1361, 1393, - 1346, 1341, 1340, 1342, 1335, 1350, 1328, 1335, 1340, 1388, - 1664, 1335, 1331, 1385, 1333, 1340, 1325, 1335, 1338, 1327, - 1326, 1321, 1664, 1376, 1664, 1320, 1319, 1312, 1329, 1366, - 1313, 1318, 1327, 1321, 1325, 573, 1360, 1324, 1304, 1307, - 1306, 1314, 1318, 1301, 1357, 1299, 1664, 1664, 1664, 1304, - 1664, 1314, 1348, 1310, 0, 1351, 1301, 1664, 1664, 1298, + 1437, 1674, 548, 594, 549, 1436, 1378, 1674, 1394, 1393, + 1380, 1379, 1674, 1381, 1378, 1390, 1386, 1374, 1376, 1674, + 1382, 1367, 1369, 1380, 1378, 1373, 573, 1380, 1362, 1411, + 1674, 1360, 1376, 1408, 1412, 1370, 1364, 1366, 1367, 1369, + 1401, 1354, 1349, 1348, 1350, 1343, 1358, 1336, 1343, 1348, + 1396, 1674, 1343, 1339, 1393, 1346, 1340, 1347, 1332, 1342, + 1345, 1334, 1333, 1328, 1674, 1383, 1674, 1327, 1326, 1319, + 1336, 1373, 1320, 1325, 1334, 1328, 1332, 575, 1367, 1331, + 1315, 1310, 1313, 1312, 1320, 1324, 1307, 1363, 1305, 1674, + 1674, 1674, 1310, 1674, 1320, 1354, 1316, 0, 1357, 1307, - 1664, 1304, 1664, 546, 547, 589, 1664, 1342, 1289, 1288, - 1295, 1288, 1300, 1299, 1283, 1298, 1328, 1295, 1331, 1277, - 1279, 1284, 1281, 1289, 1289, 1288, 1664, 1273, 1270, 1284, - 1276, 1282, 1273, 1281, 1664, 1266, 1277, 1281, 1263, 1277, - 1275, 1258, 1252, 1257, 1254, 1269, 1270, 1267, 1308, 1265, - 1664, 1251, 1253, 1664, 1299, 1298, 555, 1261, 1244, 1245, - 1250, 1241, 1664, 1255, 1241, 591, 1233, 1254, 1251, 1243, - 1286, 1240, 1284, 1664, 1232, 1230, 1244, 1247, 1279, 1278, - 1225, 1276, 1275, 1664, 580, 1237, 1226, 1228, 1664, 1664, - 1271, 1219, 1274, 568, 515, 553, 1233, 1267, 1266, 1265, + 1674, 1674, 1304, 1674, 1310, 1674, 486, 552, 576, 1674, + 1348, 1295, 1294, 1301, 1294, 1306, 1305, 1289, 1304, 1334, + 1301, 1337, 1283, 1285, 1297, 1297, 1296, 1674, 1281, 1278, + 1292, 1284, 1290, 1281, 1289, 1674, 1274, 1285, 1289, 1271, + 1285, 1283, 1266, 1260, 1265, 1262, 1277, 1278, 1275, 1316, + 1273, 1674, 1259, 1261, 1674, 1269, 1306, 1305, 561, 1268, + 1251, 1252, 1257, 1248, 1674, 1262, 1248, 582, 1240, 1261, + 1258, 1250, 1293, 1247, 1291, 1674, 1239, 1237, 1251, 1250, + 1253, 1285, 1284, 1231, 1282, 1281, 1674, 584, 1243, 1232, + 1234, 1674, 1674, 1277, 1225, 1280, 568, 543, 540, 1239, - 1219, 1209, 1262, 1224, 1214, 1259, 1222, 1204, 1212, 1214, - 1213, 1253, 1216, 1251, 1255, 1212, 1211, 1212, 1205, 1194, - 1207, 1210, 1205, 1200, 1205, 1202, 1201, 1204, 1199, 1240, - 1239, 1183, 1179, 1187, 1235, 1664, 1234, 1183, 1175, 1190, - 1177, 1664, 1177, 1186, 1185, 1185, 1169, 1224, 1167, 1180, - 1664, 1172, 1164, 1173, 1166, 1177, 1154, 1158, 1209, 1156, - 1154, 1165, 1205, 1152, 310, 557, 1146, 1156, 569, 1664, - 1206, 1164, 1153, 1157, 1164, 1201, 1664, 1195, 573, 1148, - 1156, 1148, 1139, 1142, 1138, 1155, 1150, 1138, 1149, 1133, - 1135, 1187, 1133, 1147, 1128, 1141, 1141, 1176, 1131, 1664, + 1273, 1272, 1271, 1225, 1215, 1268, 1230, 1220, 1265, 1228, + 1210, 1218, 1220, 1224, 1259, 1263, 1220, 1219, 1220, 1213, + 1202, 1215, 1218, 1213, 1208, 1213, 1210, 1209, 1212, 1207, + 1248, 1247, 1191, 1187, 1195, 1243, 1674, 1242, 1191, 1183, + 1234, 1197, 1184, 1674, 1184, 1193, 1192, 1192, 1176, 1231, + 1174, 1187, 1674, 1179, 1171, 1180, 1173, 1184, 1161, 1165, + 1216, 1163, 1161, 1172, 1212, 1175, 1158, 562, 570, 1152, + 1162, 569, 1674, 1212, 1170, 1159, 1163, 1170, 1207, 1674, + 1201, 589, 1154, 1162, 1154, 1145, 1148, 1144, 1161, 1156, + 1144, 1155, 1139, 1141, 1193, 1139, 1153, 1134, 1184, 1139, - 1139, 1137, 1128, 1137, 1133, 1174, 1116, 1116, 1129, 1128, - 1113, 1168, 1110, 1111, 1664, 1664, 1125, 1122, 1125, 1664, - 1664, 1124, 1109, 581, 1108, 1106, 17, 202, 332, 410, - 1664, 367, 475, 495, 540, 505, 529, 531, 604, 565, - 555, 559, 569, 574, 587, 582, 577, 579, 591, 582, - 635, 600, 605, 583, 1664, 641, 590, 605, 605, 1664, - 624, 632, 612, 602, 616, 609, 604, 605, 601, 610, - 605, 656, 662, 611, 1664, 623, 608, 624, 616, 626, - 616, 628, 622, 667, 635, 620, 621, 1664, 640, 623, - 625, 681, 626, 1664, 645, 625, 643, 682, 642, 632, + 1674, 1147, 1145, 1136, 1145, 1141, 1182, 1124, 1124, 1137, + 1136, 1121, 1176, 1118, 1119, 1674, 1674, 1133, 1130, 1133, + 1674, 1674, 1132, 1117, 63, 580, 68, 182, 249, 202, + 308, 416, 1674, 364, 428, 500, 563, 513, 533, 549, + 619, 575, 570, 566, 576, 580, 591, 633, 593, 587, + 589, 601, 591, 644, 604, 609, 586, 1674, 644, 593, + 608, 608, 1674, 627, 636, 616, 606, 620, 613, 608, + 609, 605, 614, 609, 660, 666, 615, 1674, 627, 612, + 628, 618, 630, 624, 669, 637, 621, 622, 1674, 641, + 625, 627, 683, 628, 1674, 647, 627, 645, 684, 644, - 650, 634, 649, 641, 637, 655, 640, 1664, 1664, 648, - 693, 648, 1664, 656, 651, 702, 1664, 653, 658, 652, - 654, 666, 660, 658, 711, 657, 713, 714, 660, 1664, - 659, 667, 665, 664, 678, 679, 680, 696, 701, 675, - 685, 671, 678, 683, 690, 731, 732, 681, 685, 1664, - 680, 698, 696, 734, 683, 691, 687, 705, 706, 692, - 700, 709, 689, 710, 750, 753, 1664, 708, 755, 756, - 718, 720, 703, 705, 712, 763, 712, 727, 766, 718, - 722, 720, 718, 771, 772, 724, 774, 770, 730, 1664, - 735, 728, 737, 731, 726, 736, 732, 1664, 727, 1664, + 634, 652, 651, 637, 652, 644, 640, 658, 643, 1674, + 1674, 651, 696, 651, 1674, 659, 654, 705, 1674, 656, + 661, 655, 657, 669, 663, 673, 662, 715, 661, 717, + 718, 664, 1674, 663, 671, 669, 668, 682, 683, 684, + 700, 705, 679, 689, 675, 682, 687, 694, 735, 736, + 685, 689, 1674, 685, 703, 700, 738, 689, 707, 708, + 694, 702, 711, 691, 712, 752, 753, 1674, 708, 757, + 758, 720, 722, 705, 707, 714, 765, 714, 713, 730, + 769, 721, 725, 723, 721, 774, 775, 727, 777, 773, + 733, 1674, 738, 731, 740, 734, 729, 739, 737, 736, - 1664, 728, 726, 745, 746, 747, 729, 734, 741, 774, - 765, 737, 796, 741, 757, 749, 753, 1664, 1664, 763, - 761, 747, 748, 806, 761, 803, 771, 768, 755, 766, - 758, 764, 760, 779, 780, 1664, 1664, 778, 1664, 780, - 1664, 765, 785, 775, 825, 780, 822, 1664, 779, 829, - 1664, 830, 779, 786, 828, 1664, 1664, 788, 1664, 779, - 779, 782, 796, 783, 794, 841, 800, 838, 844, 845, - 794, 847, 848, 809, 793, 805, 795, 825, 854, 814, - 1664, 856, 805, 801, 817, 822, 810, 862, 821, 1664, - 823, 825, 815, 824, 826, 819, 828, 829, 826, 816, + 1674, 731, 1674, 1674, 732, 730, 749, 750, 751, 733, + 738, 745, 778, 769, 741, 801, 746, 761, 753, 757, + 1674, 1674, 767, 765, 751, 752, 810, 765, 770, 757, + 768, 760, 766, 762, 780, 781, 1674, 1674, 780, 1674, + 782, 1674, 767, 786, 776, 827, 782, 824, 1674, 781, + 773, 832, 1674, 833, 782, 789, 831, 1674, 1674, 791, + 1674, 782, 782, 785, 799, 786, 797, 844, 803, 800, + 842, 848, 849, 798, 851, 852, 813, 797, 809, 799, + 829, 858, 818, 1674, 860, 809, 805, 821, 826, 814, + 866, 825, 1674, 827, 826, 828, 821, 830, 831, 828, - 818, 875, 824, 877, 822, 879, 1664, 817, 833, 883, - 1664, 1664, 833, 843, 828, 844, 830, 889, 891, 837, - 893, 853, 1664, 845, 847, 899, 1664, 1664, 845, 1664, - 1664, 852, 902, 853, 904, 886, 1664, 864, 1664, 851, - 850, 853, 853, 854, 912, 1664, 857, 914, 866, 875, - 871, 862, 877, 877, 880, 880, 877, 882, 1664, 874, - 1664, 884, 1664, 885, 887, 884, 1664, 875, 881, 880, - 892, 892, 1664, 1664, 931, 1664, 896, 881, 887, 1664, - 892, 903, 1664, 900, 1664, 919, 939, 945, 889, 947, - 948, 903, 1664, 950, 1664, 913, 952, 892, 949, 914, + 818, 820, 877, 826, 879, 824, 881, 1674, 819, 834, + 884, 840, 1674, 1674, 836, 846, 831, 847, 834, 893, + 894, 840, 896, 855, 1674, 848, 858, 851, 903, 1674, + 1674, 849, 1674, 1674, 856, 906, 857, 908, 890, 1674, + 868, 1674, 855, 854, 857, 857, 858, 916, 1674, 861, + 918, 873, 864, 879, 879, 882, 882, 879, 884, 1674, + 876, 1674, 886, 1674, 887, 888, 885, 1674, 878, 878, + 884, 883, 895, 895, 1674, 1674, 934, 1674, 899, 884, + 891, 891, 1674, 896, 907, 1674, 904, 1674, 923, 943, + 949, 893, 951, 952, 907, 1674, 954, 1674, 894, 951, - 910, 952, 902, 907, 960, 918, 962, 963, 926, 915, - 966, 910, 927, 912, 928, 912, 968, 969, 934, 920, - 931, 978, 950, 937, 1664, 981, 1664, 1664, 930, 1664, - 927, 1664, 984, 932, 981, 926, 931, 990, 940, 1664, - 946, 1664, 1664, 937, 952, 1664, 990, 958, 951, 952, - 961, 948, 950, 960, 1003, 954, 1664, 1005, 952, 1664, - 957, 953, 1664, 961, 956, 955, 1013, 968, 1664, 1010, - 972, 975, 1018, 961, 963, 971, 961, 977, 971, 987, - 1026, 1664, 1022, 1664, 987, 1024, 988, 989, 980, 987, - 1664, 984, 989, 1036, 981, 1664, 985, 997, 998, 1041, + 916, 912, 954, 904, 909, 962, 920, 964, 965, 928, + 917, 926, 969, 913, 930, 915, 930, 915, 971, 972, + 921, 938, 924, 935, 982, 954, 941, 1674, 985, 1674, + 1674, 934, 1674, 987, 935, 984, 929, 934, 993, 943, + 1674, 949, 1674, 1674, 940, 955, 957, 1674, 994, 962, + 955, 956, 965, 952, 954, 1001, 965, 1008, 959, 1674, + 1010, 958, 1674, 962, 1674, 965, 960, 959, 1017, 972, + 1674, 1014, 976, 979, 1022, 1023, 966, 968, 976, 966, + 982, 976, 992, 991, 1032, 1674, 1028, 1674, 993, 1030, + 994, 985, 992, 1674, 989, 994, 1041, 986, 1674, 1674, - 985, 986, 994, 1664, 1005, 995, 994, 992, 998, 1010, - 1001, 1010, 1012, 1664, 1054, 1014, 1056, 1057, 1664, 1053, - 1013, 1018, 999, 1062, 1021, 1064, 1065, 1024, 1025, 1068, - 1027, 1664, 1032, 1664, 1664, 1014, 1020, 1073, 1034, 1664, - 1020, 1664, 1664, 1020, 1022, 1664, 1027, 1022, 1034, 1030, - 1664, 1033, 1037, 1028, 1080, 1029, 1045, 1038, 1033, 1048, - 1039, 1046, 1033, 1048, 1095, 1054, 1097, 1042, 1058, 1049, - 1063, 1059, 1664, 1103, 1664, 1104, 1105, 1062, 1061, 1062, - 1664, 1664, 1664, 1109, 1053, 1069, 1664, 1107, 1058, 1057, - 1059, 1070, 1117, 1068, 1664, 1077, 1120, 1664, 1664, 1126, + 990, 1002, 1003, 1046, 990, 991, 999, 1001, 1674, 1011, + 1001, 1000, 1003, 1015, 1006, 1015, 1017, 1674, 1059, 1019, + 1061, 1062, 1674, 1058, 1018, 1023, 1028, 1005, 1068, 1027, + 1070, 1029, 1030, 1073, 1032, 1674, 1037, 1674, 1674, 1019, + 1025, 1078, 1023, 1040, 1674, 1026, 1674, 1026, 1028, 1674, + 1033, 1028, 1040, 1036, 1674, 1032, 1040, 1044, 1035, 1087, + 1036, 1052, 1045, 1040, 1055, 1056, 1047, 1054, 1041, 1056, + 1103, 1062, 1105, 1050, 1051, 1067, 1058, 1072, 1068, 1674, + 1112, 1674, 1113, 1114, 1115, 1072, 1071, 1072, 1674, 1674, + 1674, 1674, 1119, 1063, 1079, 1674, 1117, 1068, 1067, 1069, - 1131, 1136, 1141, 1146, 1151, 1156, 1159, 1133, 1138, 1140, - 1153 + 1080, 1127, 1078, 1674, 1087, 1130, 1674, 1674, 1136, 1141, + 1146, 1151, 1156, 1161, 1166, 1169, 1143, 1148, 1150, 1163 } ; -static const flex_int16_t yy_def[1312] = +static const flex_int16_t yy_def[1321] = { 0, - 1300, 1300, 1301, 1301, 1300, 1300, 1300, 1300, 1300, 1300, - 1299, 1299, 1299, 1299, 1299, 1302, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1303, - 1299, 1299, 1299, 1304, 15, 1299, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1305, 45, 45, + 1309, 1309, 1310, 1310, 1309, 1309, 1309, 1309, 1309, 1309, + 1308, 1308, 1308, 1308, 1308, 1311, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1312, + 1308, 1308, 1308, 1313, 15, 1308, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1314, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1302, 1299, - 1299, 1299, 1299, 1299, 1299, 1306, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1303, 1299, 1304, + 45, 45, 45, 45, 45, 45, 45, 45, 1311, 1308, + 1308, 1308, 1308, 1308, 1308, 1315, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1312, 1308, 1313, - 1299, 1299, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1307, 45, 1305, 45, 45, + 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1316, 45, 1314, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1306, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1308, 45, 45, 45, 1299, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 1307, 1299, + 45, 45, 45, 45, 1315, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1317, 45, 45, 45, 1308, 45, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 1316, 1308, - 1305, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1314, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1309, 45, - 45, 45, 45, 45, 1299, 45, 45, 1299, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1318, + 45, 45, 45, 45, 45, 1308, 45, 45, 1308, 45, - 45, 1305, 1299, 45, 45, 45, 45, 45, 45, 1299, + 1308, 45, 1314, 1308, 45, 45, 45, 45, 45, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 1299, 1299, 1310, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 1308, 1308, + 1308, 1319, 45, 45, 45, 45, 45, 45, 1308, 45, - 45, 1305, 45, 45, 45, 1299, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 1299, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, + 45, 1308, 45, 1314, 45, 45, 45, 1308, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, + 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1308, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 1299, 1299, 45, - 1299, 45, 45, 1299, 1311, 45, 45, 1299, 1299, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 1308, 1308, 45, 1308, 45, 45, 1308, 1320, 45, 45, - 1299, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, + 1308, 1308, 45, 1308, 45, 1308, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, - 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 1299, 45, 45, 45, 45, 45, 45, - 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1299, 45, 45, 45, 45, 1299, 1299, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1308, 45, 45, 1308, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, + 45, 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, - 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, + 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1299, 1299, 45, 45, 45, 1299, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1299, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, - 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, - - 45, 45, 45, 45, 45, 45, 45, 1299, 1299, 45, - 45, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 45, 45, 45, 45, 45, 45, 1299, 45, 1299, - - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1299, 1299, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1299, 1299, 45, 1299, 45, - 1299, 45, 45, 45, 45, 45, 45, 1299, 45, 45, - 1299, 45, 45, 45, 45, 1299, 1299, 45, 1299, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, - 1299, 1299, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1299, 45, 45, 45, 1299, 1299, 45, 1299, - 1299, 45, 45, 45, 45, 45, 1299, 45, 1299, 45, - 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1299, 45, - 1299, 45, 1299, 45, 45, 45, 1299, 45, 45, 45, - 45, 45, 1299, 1299, 45, 1299, 45, 45, 45, 1299, - 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, - 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1308, 1308, 45, 45, 45, + 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 1308, 45, 45, 45, 1308, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + + 1308, 45, 1308, 1308, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1308, 1308, 45, 1308, + 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, + 45, 45, 1308, 45, 45, 45, 45, 1308, 1308, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 1308, 1308, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1308, 45, 45, 45, 45, 1308, + 1308, 45, 1308, 1308, 45, 45, 45, 45, 45, 1308, + 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 45, 1308, 45, 1308, 45, 45, 45, 1308, 45, 45, + 45, 45, 45, 45, 1308, 1308, 45, 1308, 45, 45, + 45, 45, 1308, 45, 45, 1308, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 1308, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1299, 45, 1299, 1299, 45, 1299, - 45, 1299, 45, 45, 45, 45, 45, 45, 45, 1299, - 45, 1299, 1299, 45, 45, 1299, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 45, 45, 1299, - 45, 45, 1299, 45, 45, 45, 45, 45, 1299, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1299, 45, 1299, 45, 45, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 1299, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 1308, + 1308, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 1308, 45, 1308, 1308, 45, 45, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 45, 45, 1308, 45, 1308, 45, 45, 45, 45, 45, + 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1308, 45, 1308, 45, 45, + 45, 45, 45, 1308, 45, 45, 45, 45, 1308, 1308, - 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1299, 45, 45, 45, 45, 1299, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1308, 45, 1308, 1308, 45, + 45, 45, 45, 45, 1308, 45, 1308, 45, 45, 1308, + 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1299, 45, 1299, 1299, 45, 45, 45, 45, 1299, - 45, 1299, 1299, 45, 45, 1299, 45, 45, 45, 45, - 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1299, 45, 1299, 45, 45, 45, 45, 45, - 1299, 1299, 1299, 45, 45, 45, 1299, 45, 45, 45, - 45, 45, 45, 45, 1299, 45, 45, 1299, 0, 1299, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 1308, + 1308, 1308, 45, 45, 45, 1308, 45, 45, 45, 45, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299 + 45, 45, 45, 1308, 45, 45, 1308, 0, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308 } ; -static const flex_int16_t yy_nxt[1736] = +static const flex_int16_t yy_nxt[1746] = { 0, - 1299, 13, 14, 13, 1299, 15, 16, 1299, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 85, 352, - 37, 14, 37, 86, 25, 26, 38, 806, 1299, 27, + 1308, 13, 14, 13, 1308, 15, 16, 1308, 17, 18, + 19, 20, 21, 22, 22, 22, 23, 24, 85, 353, + 37, 14, 37, 86, 25, 26, 38, 1308, 1308, 27, 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, - 13, 14, 13, 13, 14, 13, 32, 40, 1299, 13, - 14, 13, 33, 40, 115, 91, 92, 353, 90, 34, + 13, 14, 13, 13, 14, 13, 32, 40, 1308, 13, + 14, 13, 33, 40, 115, 91, 92, 354, 90, 34, 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, 13, 108, 39, 90, 25, 26, 13, 14, 13, 27, 39, 84, 84, 84, 28, 42, 41, 42, 42, 29, 42, 30, 82, 107, 41, 111, 93, 25, 31, 108, - 206, 162, 88, 130, 88, 163, 32, 89, 89, 89, - 207, 131, 33, 132, 368, 82, 107, 369, 111, 34, + 130, 137, 88, 803, 88, 806, 32, 89, 89, 89, + 131, 138, 33, 139, 369, 82, 107, 370, 111, 34, 35, 44, 44, 44, 45, 45, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 45, 48, 49, 50, 51, 45, 52, 53, @@ -1216,179 +1217,180 @@ static const flex_int16_t yy_nxt[1736] = 73, 74, 75, 76, 77, 78, 57, 45, 45, 45, 45, 45, 80, 103, 81, 81, 81, 80, 109, 83, 83, 83, 101, 114, 80, 82, 83, 83, 83, 121, - 82, 146, 122, 112, 123, 147, 124, 82, 240, 103, - 452, 103, 101, 113, 135, 221, 114, 110, 82, 136, - 453, 107, 137, 82, 191, 148, 112, 102, 222, 241, - 82, 45, 807, 45, 45, 45, 45, 119, 45, 45, - 45, 113, 117, 120, 107, 45, 45, 102, 45, 45, - 89, 89, 89, 192, 45, 133, 45, 45, 45, 45, + 82, 145, 122, 112, 123, 146, 124, 82, 162, 103, + 807, 103, 163, 113, 134, 220, 114, 110, 82, 135, + 190, 107, 136, 82, 191, 147, 112, 102, 221, 808, + 82, 45, 809, 45, 45, 45, 45, 119, 45, 45, + 45, 113, 117, 120, 107, 45, 45, 190, 45, 45, + 89, 89, 89, 192, 45, 132, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 89, 89, - 89, 45, 125, 231, 138, 45, 126, 111, 152, 127, - 128, 142, 143, 45, 139, 144, 140, 45, 153, 45, - 118, 145, 129, 154, 155, 112, 149, 808, 150, 156, - 151, 164, 157, 158, 165, 113, 114, 178, 84, 84, - 84, 166, 167, 159, 223, 232, 160, 168, 112, 82, - 169, 747, 178, 80, 170, 81, 81, 81, 748, 114, - 224, 176, 177, 113, 176, 178, 82, 177, 100, 172, - 171, 88, 82, 88, 173, 100, 89, 89, 89, 80, - 181, 83, 83, 83, 84, 84, 84, 176, 177, 82, + 89, 45, 125, 810, 111, 45, 126, 239, 178, 127, + 128, 141, 142, 45, 176, 143, 151, 45, 198, 45, + 118, 144, 129, 148, 152, 149, 153, 150, 240, 112, + 156, 154, 155, 157, 158, 164, 178, 114, 165, 113, + 176, 198, 177, 176, 159, 166, 167, 160, 84, 84, + 84, 168, 112, 80, 169, 81, 81, 81, 170, 82, + 114, 84, 84, 84, 177, 178, 82, 113, 177, 179, + 172, 88, 82, 88, 171, 173, 89, 89, 89, 101, + 100, 80, 82, 83, 83, 83, 189, 100, 185, 82, - 179, 189, 82, 180, 185, 82, 415, 190, 198, 194, - 416, 195, 196, 100, 197, 809, 226, 100, 308, 227, - 217, 100, 218, 228, 309, 82, 810, 189, 82, 100, - 185, 198, 185, 100, 190, 100, 184, 194, 195, 219, - 196, 197, 201, 201, 201, 211, 212, 202, 261, 201, - 201, 201, 201, 201, 201, 213, 194, 282, 203, 251, - 252, 255, 269, 283, 256, 257, 270, 284, 284, 282, - 271, 294, 201, 201, 201, 201, 201, 201, 283, 290, - 293, 262, 263, 264, 246, 282, 297, 299, 301, 283, - 284, 287, 265, 391, 266, 491, 267, 285, 294, 268, + 180, 195, 194, 181, 82, 82, 196, 206, 197, 211, + 212, 230, 417, 217, 185, 218, 418, 207, 194, 213, + 222, 811, 189, 812, 102, 100, 185, 82, 195, 100, + 194, 202, 219, 100, 196, 197, 223, 225, 251, 252, + 226, 100, 203, 261, 227, 100, 245, 100, 184, 201, + 201, 201, 285, 231, 446, 447, 201, 201, 201, 201, + 201, 201, 255, 270, 284, 256, 257, 271, 283, 283, + 285, 272, 284, 294, 813, 285, 262, 263, 264, 201, + 201, 201, 201, 201, 201, 291, 295, 265, 298, 266, + 284, 267, 268, 288, 269, 300, 283, 286, 287, 302, - 492, 342, 290, 408, 286, 399, 290, 297, 293, 297, - 299, 387, 387, 396, 391, 301, 302, 302, 302, 463, - 409, 811, 391, 302, 302, 302, 302, 302, 302, 304, - 349, 393, 394, 399, 387, 388, 396, 445, 446, 679, - 395, 399, 812, 403, 496, 813, 302, 302, 302, 302, - 302, 302, 343, 496, 430, 344, 402, 402, 402, 431, - 642, 814, 679, 402, 402, 402, 402, 402, 402, 454, - 467, 504, 496, 505, 468, 464, 594, 527, 574, 595, - 522, 506, 528, 575, 815, 670, 402, 402, 402, 402, - 402, 402, 523, 816, 590, 671, 651, 643, 504, 596, + 291, 294, 342, 309, 401, 395, 396, 298, 291, 310, + 389, 298, 393, 295, 397, 393, 597, 389, 300, 398, + 465, 469, 401, 305, 499, 470, 302, 303, 303, 303, + 349, 410, 401, 389, 303, 303, 303, 303, 303, 303, + 390, 393, 398, 597, 405, 453, 494, 814, 411, 431, + 455, 495, 499, 343, 432, 454, 344, 303, 303, 303, + 303, 303, 303, 404, 404, 404, 644, 682, 815, 816, + 404, 404, 404, 404, 404, 404, 466, 507, 528, 508, + 576, 593, 499, 529, 598, 577, 599, 653, 817, 673, + 682, 683, 654, 404, 404, 404, 404, 404, 404, 674, - 505, 652, 678, 594, 680, 432, 762, 595, 749, 817, - 433, 45, 45, 45, 681, 750, 818, 819, 45, 45, - 45, 45, 45, 45, 802, 753, 820, 821, 803, 822, - 678, 754, 823, 824, 762, 825, 826, 827, 653, 829, - 830, 45, 45, 45, 45, 45, 45, 831, 832, 828, - 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 839, - 862, 863, 838, 864, 865, 866, 867, 870, 871, 872, - 873, 868, 874, 875, 876, 877, 878, 879, 880, 881, + 433, 684, 681, 645, 507, 434, 508, 45, 45, 45, + 509, 818, 598, 750, 45, 45, 45, 45, 45, 45, + 751, 752, 765, 804, 819, 756, 820, 805, 753, 655, + 681, 757, 821, 822, 823, 824, 825, 45, 45, 45, + 45, 45, 45, 826, 827, 828, 829, 830, 832, 833, + 765, 834, 835, 836, 837, 838, 839, 840, 841, 831, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 842, 865, 841, 866, 867, 868, 871, + 872, 873, 874, 869, 875, 876, 877, 878, 879, 880, - 882, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 893, 883, 894, 895, 896, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 910, 912, - 911, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 869, 924, 925, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 936, 910, 911, 937, 938, - 939, 941, 943, 944, 945, 940, 946, 947, 948, 949, - 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 881, 882, 883, 884, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 885, 896, 897, 898, 899, 900, + 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, + 911, 912, 913, 915, 914, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 870, 925, 926, 927, 928, 929, + 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, + 913, 914, 940, 942, 944, 945, 946, 941, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 980, 981, 982, 942, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 978, 1000, 1001, 1002, 1003, 1004, 979, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, - 1059, 1060, 1061, 1062, 1063, 1064, 1036, 1065, 1067, 1068, - 1069, 1070, 1071, 1072, 1073, 1066, 1074, 1075, 1076, 1026, + 979, 980, 981, 982, 983, 943, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 981, 1003, 1004, 1005, 1006, + 1007, 982, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 1027, 1028, 1030, 1031, 1032, 1033, 1034, 1035, 1036, + 1037, 1038, 1039, 1040, 1041, 1042, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, + 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1068, + 1039, 1069, 1070, 1071, 1072, 1073, 1067, 1074, 1075, 1076, - 1077, 1078, 1079, 1040, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 1086, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, - 1145, 1146, 1147, 1148, 1149, 1123, 1150, 1151, 1152, 1153, - 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, - 1165, 1166, 1167, 1168, 1164, 1169, 1170, 1171, 1172, 1173, + 1077, 1078, 1079, 1029, 1080, 1081, 1082, 1043, 1083, 1084, + 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, + 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1089, 1112, 1113, + 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, + 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1126, + 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, + 1163, 1164, 1165, 1167, 1168, 1169, 1170, 1166, 1171, 1172, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, - 1184, 1185, 1158, 1186, 1187, 1188, 1189, 1190, 1191, 1192, - 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, - 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, - 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, - 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, - 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, - 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, + 1183, 1184, 1185, 1186, 1187, 1188, 1161, 1189, 1190, 1191, + 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, + 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, + 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, - 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, - 1293, 1294, 1295, 1296, 1297, 1298, 12, 12, 12, 12, - 12, 36, 36, 36, 36, 36, 79, 289, 79, 79, - 79, 98, 390, 98, 495, 98, 100, 100, 100, 100, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, + 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, + 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, + 1302, 1303, 1304, 1305, 1306, 1307, 12, 12, 12, 12, + 12, 36, 36, 36, 36, 36, 79, 290, 79, 79, + 79, 98, 392, 98, 498, 98, 100, 100, 100, 100, 100, 116, 116, 116, 116, 116, 175, 100, 175, 175, - 175, 199, 199, 199, 805, 804, 801, 800, 799, 798, - 797, 796, 795, 794, 793, 792, 791, 790, 789, 788, - 787, 786, 785, 784, 783, 782, 781, 780, 779, 778, - 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, + 175, 199, 199, 199, 802, 801, 800, 799, 798, 797, + 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, + 786, 785, 784, 783, 782, 781, 780, 779, 778, 777, - 767, 766, 765, 764, 763, 761, 760, 759, 758, 757, - 756, 755, 752, 751, 746, 745, 744, 743, 742, 741, - 740, 739, 738, 737, 736, 735, 734, 733, 732, 731, - 730, 729, 728, 727, 726, 725, 724, 723, 722, 721, - 720, 719, 718, 717, 716, 715, 714, 713, 712, 711, - 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, - 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, - 690, 689, 688, 687, 686, 685, 684, 683, 682, 677, - 676, 675, 674, 673, 672, 669, 668, 667, 666, 665, - 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, + 776, 775, 774, 773, 772, 771, 770, 769, 768, 767, + 766, 764, 763, 762, 761, 760, 759, 758, 755, 754, + 749, 748, 747, 746, 745, 744, 743, 742, 741, 740, + 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, + 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, + 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, + 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, + 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, + 689, 688, 687, 686, 685, 680, 679, 678, 677, 676, + 675, 672, 671, 670, 669, 668, 667, 666, 665, 664, - 654, 650, 649, 648, 647, 646, 645, 644, 641, 640, - 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, - 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, - 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, - 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, - 599, 598, 597, 593, 592, 591, 590, 589, 588, 587, - 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, - 576, 573, 572, 571, 570, 569, 568, 567, 566, 565, - 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, - 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, + 663, 662, 661, 660, 659, 658, 657, 656, 652, 651, + 650, 649, 648, 647, 646, 643, 642, 641, 640, 639, + 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, + 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, + 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, + 608, 607, 606, 605, 604, 603, 602, 601, 600, 596, + 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, + 585, 584, 583, 582, 581, 580, 579, 578, 575, 574, + 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, + 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, - 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, - 534, 533, 532, 531, 530, 529, 526, 525, 524, 521, - 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, - 510, 509, 508, 507, 503, 502, 501, 500, 499, 498, - 497, 494, 493, 490, 489, 488, 487, 486, 485, 484, - 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, - 473, 472, 471, 470, 469, 466, 465, 462, 461, 460, - 459, 458, 457, 456, 455, 451, 450, 449, 448, 447, - 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, - 434, 429, 428, 427, 426, 425, 424, 423, 422, 421, + 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, + 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, + 533, 532, 531, 530, 527, 526, 525, 524, 523, 522, + 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, + 511, 510, 506, 505, 504, 503, 502, 501, 500, 497, + 496, 493, 492, 491, 490, 489, 488, 487, 486, 485, + 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, + 474, 473, 472, 471, 468, 467, 464, 463, 462, 461, + 460, 459, 458, 457, 456, 452, 451, 450, 449, 448, + 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, - 420, 419, 418, 417, 414, 413, 412, 411, 410, 407, - 406, 405, 404, 401, 400, 398, 397, 392, 389, 386, - 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, - 375, 374, 373, 372, 371, 370, 367, 366, 365, 364, - 363, 362, 361, 360, 359, 358, 357, 356, 355, 354, - 351, 350, 348, 347, 346, 345, 341, 340, 339, 338, - 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, - 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, - 317, 316, 315, 314, 313, 312, 311, 310, 307, 306, - 305, 303, 200, 300, 298, 296, 295, 292, 291, 288, + 435, 430, 429, 428, 427, 426, 425, 424, 423, 422, + 421, 420, 419, 416, 415, 414, 413, 412, 409, 408, + 407, 406, 403, 402, 400, 399, 394, 391, 388, 387, + 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, + 376, 375, 374, 373, 372, 371, 368, 367, 366, 365, + 364, 363, 362, 361, 360, 359, 358, 357, 356, 355, + 352, 351, 350, 348, 347, 346, 345, 341, 340, 339, + 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, + 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, + 318, 317, 316, 315, 314, 313, 312, 311, 308, 307, - 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, - 260, 259, 258, 254, 253, 250, 249, 248, 247, 245, - 244, 243, 242, 239, 238, 237, 236, 235, 234, 233, - 230, 229, 225, 220, 216, 215, 214, 210, 209, 208, + 306, 304, 200, 301, 299, 297, 296, 293, 292, 289, + 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, + 260, 259, 258, 254, 253, 250, 249, 248, 247, 246, + 244, 243, 242, 241, 238, 237, 236, 235, 234, 233, + 232, 229, 228, 224, 216, 215, 214, 210, 209, 208, 205, 204, 200, 193, 188, 187, 186, 183, 182, 174, - 161, 141, 134, 106, 105, 104, 43, 99, 97, 96, - 87, 43, 1299, 11, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 161, 140, 133, 106, 105, 104, 43, 99, 97, 96, + 87, 43, 1308, 11, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299 + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308 } ; -static const flex_int16_t yy_chk[1736] = +static const flex_int16_t yy_chk[1746] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 249, - 3, 3, 3, 21, 1, 1, 3, 727, 0, 1, + 3, 3, 3, 21, 1, 1, 3, 0, 0, 1, 4, 4, 4, 13, 1, 13, 4, 27, 28, 1, 57, 1, 5, 5, 5, 26, 32, 1, 1, 33, 6, 6, 6, 7, 7, 7, 1, 7, 0, 8, @@ -1399,8 +1401,8 @@ static const flex_int16_t yy_chk[1736] = 6, 20, 20, 20, 2, 37, 9, 37, 42, 2, 42, 2, 20, 51, 10, 54, 31, 2, 2, 52, - 122, 74, 25, 62, 25, 74, 2, 25, 25, 25, - 122, 62, 2, 62, 264, 20, 51, 264, 54, 2, + 62, 66, 25, 725, 25, 727, 2, 25, 25, 25, + 62, 66, 2, 66, 264, 20, 51, 264, 54, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1411,172 +1413,173 @@ static const flex_int16_t yy_chk[1736] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 47, 17, 17, 17, 19, 53, 19, 19, 19, 44, 56, 22, 17, 22, 22, 22, 60, - 19, 69, 60, 55, 60, 69, 60, 22, 146, 47, - 348, 59, 100, 55, 65, 132, 56, 53, 17, 65, - 348, 63, 65, 19, 109, 69, 55, 44, 132, 146, - 22, 45, 728, 45, 45, 45, 45, 59, 45, 45, - 45, 55, 58, 59, 63, 45, 45, 100, 45, 58, + 19, 69, 60, 55, 60, 69, 60, 22, 74, 47, + 728, 59, 74, 55, 65, 131, 56, 53, 17, 65, + 108, 63, 65, 19, 109, 69, 55, 44, 131, 729, + 22, 45, 730, 45, 45, 45, 45, 59, 45, 45, + 45, 55, 58, 59, 63, 45, 45, 108, 45, 58, 88, 88, 88, 109, 45, 63, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 58, 89, 89, - 89, 58, 61, 138, 66, 58, 61, 70, 71, 61, - 61, 68, 68, 58, 66, 68, 66, 58, 71, 58, - 58, 68, 61, 71, 71, 76, 70, 729, 70, 72, - 70, 75, 72, 72, 75, 76, 77, 92, 80, 80, - 80, 75, 75, 72, 133, 138, 72, 75, 76, 80, - 76, 665, 95, 81, 76, 81, 81, 81, 665, 77, - 133, 90, 91, 76, 93, 92, 81, 94, 102, 77, - 76, 82, 80, 82, 77, 102, 82, 82, 82, 83, - 95, 83, 83, 83, 84, 84, 84, 90, 91, 81, + 89, 58, 61, 731, 70, 58, 61, 145, 92, 61, + 61, 68, 68, 58, 90, 68, 71, 58, 115, 58, + 58, 68, 61, 70, 71, 70, 71, 70, 145, 76, + 72, 71, 71, 72, 72, 75, 92, 77, 75, 76, + 90, 115, 91, 93, 72, 75, 75, 72, 80, 80, + 80, 75, 76, 81, 76, 81, 81, 81, 76, 80, + 77, 84, 84, 84, 94, 95, 81, 76, 91, 93, + 77, 82, 84, 82, 76, 77, 82, 82, 82, 100, + 102, 83, 80, 83, 83, 83, 107, 102, 103, 81, - 93, 107, 83, 94, 103, 84, 316, 108, 115, 111, - 316, 112, 113, 102, 114, 730, 135, 102, 207, 135, - 130, 102, 130, 135, 207, 83, 732, 107, 84, 102, - 119, 115, 103, 102, 108, 102, 102, 111, 112, 130, - 113, 114, 118, 118, 118, 126, 126, 119, 163, 118, - 118, 118, 118, 118, 118, 126, 151, 176, 119, 156, - 156, 159, 164, 177, 159, 159, 164, 178, 181, 179, - 164, 190, 118, 118, 118, 118, 118, 118, 180, 185, - 189, 163, 163, 163, 151, 176, 194, 196, 198, 177, - 178, 181, 163, 290, 163, 385, 163, 179, 190, 163, + 94, 112, 111, 95, 83, 84, 113, 122, 114, 126, + 126, 137, 317, 130, 119, 130, 317, 122, 150, 126, + 132, 732, 107, 734, 100, 102, 103, 83, 112, 102, + 111, 119, 130, 102, 113, 114, 132, 134, 156, 156, + 134, 102, 119, 163, 134, 102, 150, 102, 102, 118, + 118, 118, 178, 137, 342, 342, 118, 118, 118, 118, + 118, 118, 159, 164, 177, 159, 159, 164, 176, 179, + 181, 164, 180, 189, 735, 178, 163, 163, 163, 118, + 118, 118, 118, 118, 118, 185, 190, 163, 194, 163, + 177, 163, 163, 181, 163, 196, 176, 179, 180, 198, - 385, 241, 185, 309, 180, 297, 203, 246, 189, 194, - 196, 282, 285, 293, 304, 198, 201, 201, 201, 359, - 309, 733, 290, 201, 201, 201, 201, 201, 201, 203, - 246, 292, 292, 297, 282, 285, 293, 342, 342, 595, - 292, 349, 734, 304, 391, 735, 201, 201, 201, 201, - 201, 201, 241, 403, 330, 241, 302, 302, 302, 330, - 557, 736, 595, 302, 302, 302, 302, 302, 302, 349, - 362, 401, 391, 401, 362, 359, 504, 426, 476, 505, - 422, 403, 426, 476, 737, 585, 302, 302, 302, 302, - 302, 302, 422, 738, 506, 585, 566, 557, 401, 506, + 203, 189, 240, 207, 298, 293, 293, 245, 185, 207, + 283, 194, 291, 190, 293, 305, 507, 286, 196, 294, + 360, 363, 349, 203, 393, 363, 198, 201, 201, 201, + 245, 310, 298, 283, 201, 201, 201, 201, 201, 201, + 286, 291, 294, 507, 305, 348, 387, 736, 310, 330, + 349, 387, 393, 240, 330, 348, 240, 201, 201, 201, + 201, 201, 201, 303, 303, 303, 559, 598, 737, 738, + 303, 303, 303, 303, 303, 303, 360, 403, 427, 403, + 478, 509, 405, 427, 508, 478, 509, 568, 739, 588, + 598, 599, 568, 303, 303, 303, 303, 303, 303, 588, - 401, 566, 594, 504, 596, 330, 679, 505, 666, 739, - 330, 402, 402, 402, 596, 666, 740, 741, 402, 402, - 402, 402, 402, 402, 724, 669, 742, 743, 724, 744, - 594, 669, 745, 746, 679, 747, 748, 749, 566, 750, - 751, 402, 402, 402, 402, 402, 402, 752, 753, 749, - 754, 756, 757, 758, 759, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 771, 772, 773, 774, 776, - 777, 778, 779, 780, 781, 782, 783, 784, 785, 762, - 786, 787, 761, 789, 790, 791, 792, 793, 795, 796, - 797, 792, 798, 799, 800, 801, 802, 803, 804, 805, + 330, 599, 597, 559, 403, 330, 403, 404, 404, 404, + 405, 740, 508, 668, 404, 404, 404, 404, 404, 404, + 668, 669, 682, 726, 741, 672, 742, 726, 669, 568, + 597, 672, 743, 744, 745, 746, 747, 404, 404, 404, + 404, 404, 404, 748, 749, 750, 751, 752, 753, 754, + 682, 755, 756, 757, 759, 760, 761, 762, 764, 752, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 779, 780, 781, 782, 783, 784, 785, + 786, 787, 788, 765, 790, 764, 791, 792, 793, 794, + 796, 797, 798, 793, 799, 800, 801, 802, 803, 804, - 806, 807, 810, 811, 812, 814, 815, 816, 818, 819, - 820, 806, 821, 822, 823, 824, 825, 826, 827, 828, - 829, 831, 832, 833, 834, 835, 836, 837, 838, 840, - 839, 841, 842, 843, 844, 845, 846, 847, 848, 849, - 851, 852, 792, 853, 854, 855, 856, 857, 858, 859, - 860, 861, 862, 863, 864, 865, 838, 839, 866, 868, - 869, 870, 871, 872, 873, 869, 874, 875, 876, 877, - 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, - 888, 889, 891, 892, 893, 894, 895, 896, 897, 899, - 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, + 805, 806, 807, 808, 809, 812, 813, 814, 816, 817, + 818, 820, 821, 822, 808, 823, 824, 825, 826, 827, + 828, 829, 830, 831, 832, 834, 835, 836, 837, 838, + 839, 840, 841, 843, 842, 844, 845, 846, 847, 848, + 849, 850, 851, 852, 793, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, 867, 869, + 841, 842, 870, 871, 872, 873, 874, 870, 875, 876, + 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, + 887, 888, 889, 890, 891, 893, 894, 895, 896, 897, + 898, 899, 900, 902, 905, 906, 907, 908, 909, 910, - 912, 913, 914, 870, 915, 916, 917, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, - 933, 910, 934, 935, 938, 940, 942, 911, 943, 944, - 945, 946, 947, 949, 950, 952, 953, 954, 955, 958, - 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 982, 983, 984, 985, 986, 987, 988, 989, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1008, 978, 1009, 1010, 1013, - 1014, 1015, 1016, 1017, 1018, 1009, 1019, 1020, 1021, 968, + 911, 912, 913, 914, 915, 871, 916, 917, 918, 919, + 920, 923, 924, 925, 926, 927, 928, 929, 930, 931, + 932, 933, 934, 935, 936, 913, 939, 941, 943, 944, + 945, 914, 946, 947, 948, 950, 951, 952, 954, 955, + 956, 957, 960, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 985, 986, 987, 988, 989, + 990, 991, 992, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1009, 1010, 1011, + 981, 1012, 1015, 1016, 1017, 1018, 1010, 1019, 1020, 1021, - 1022, 1024, 1025, 982, 1026, 1029, 1032, 1033, 1034, 1035, - 1036, 1038, 1040, 1041, 1042, 1043, 1044, 1045, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, - 1060, 1062, 1064, 1036, 1065, 1066, 1068, 1069, 1070, 1071, - 1072, 1075, 1077, 1078, 1079, 1081, 1082, 1084, 1086, 1087, - 1088, 1089, 1090, 1091, 1092, 1094, 1096, 1097, 1098, 1099, - 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1086, 1115, 1116, 1117, 1118, - 1119, 1120, 1121, 1122, 1123, 1124, 1126, 1129, 1131, 1133, - 1134, 1135, 1136, 1137, 1133, 1138, 1139, 1141, 1144, 1145, + 1022, 1023, 1024, 971, 1026, 1027, 1028, 985, 1029, 1032, + 1035, 1036, 1037, 1038, 1039, 1041, 1043, 1044, 1045, 1046, + 1047, 1048, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, + 1058, 1059, 1061, 1063, 1065, 1066, 1067, 1039, 1069, 1070, + 1071, 1072, 1073, 1074, 1077, 1079, 1080, 1081, 1082, 1084, + 1085, 1087, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1097, + 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1089, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, + 1129, 1132, 1134, 1135, 1136, 1137, 1138, 1134, 1139, 1140, - 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, - 1158, 1159, 1123, 1161, 1162, 1164, 1165, 1166, 1167, 1168, - 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, - 1180, 1181, 1183, 1185, 1186, 1187, 1188, 1189, 1190, 1192, - 1193, 1194, 1195, 1197, 1198, 1199, 1200, 1201, 1202, 1203, - 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1215, - 1216, 1217, 1218, 1220, 1221, 1222, 1223, 1224, 1225, 1226, - 1227, 1228, 1229, 1230, 1231, 1233, 1236, 1237, 1238, 1239, - 1241, 1244, 1245, 1247, 1248, 1249, 1250, 1252, 1253, 1254, - 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, + 1142, 1145, 1146, 1147, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1161, 1126, 1162, 1164, 1166, + 1167, 1168, 1169, 1170, 1172, 1173, 1174, 1175, 1176, 1177, + 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1187, 1189, + 1190, 1191, 1192, 1193, 1195, 1196, 1197, 1198, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1208, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1219, 1220, 1221, 1222, 1224, 1225, + 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, + 1237, 1240, 1241, 1242, 1243, 1244, 1246, 1248, 1249, 1251, + 1252, 1253, 1254, 1256, 1257, 1258, 1259, 1260, 1261, 1262, - 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1274, 1276, - 1277, 1278, 1279, 1280, 1284, 1285, 1286, 1288, 1289, 1290, - 1291, 1292, 1293, 1294, 1296, 1297, 1300, 1300, 1300, 1300, - 1300, 1301, 1301, 1301, 1301, 1301, 1302, 1308, 1302, 1302, - 1302, 1303, 1309, 1303, 1310, 1303, 1304, 1304, 1304, 1304, - 1304, 1305, 1305, 1305, 1305, 1305, 1306, 1311, 1306, 1306, - 1306, 1307, 1307, 1307, 726, 725, 723, 722, 719, 718, - 717, 714, 713, 712, 711, 710, 709, 708, 707, 706, - 705, 704, 703, 702, 701, 699, 698, 697, 696, 695, - 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1281, 1283, 1284, + 1285, 1286, 1287, 1288, 1293, 1294, 1295, 1297, 1298, 1299, + 1300, 1301, 1302, 1303, 1305, 1306, 1309, 1309, 1309, 1309, + 1309, 1310, 1310, 1310, 1310, 1310, 1311, 1317, 1311, 1311, + 1311, 1312, 1318, 1312, 1319, 1312, 1313, 1313, 1313, 1313, + 1313, 1314, 1314, 1314, 1314, 1314, 1315, 1320, 1315, 1315, + 1315, 1316, 1316, 1316, 724, 723, 720, 719, 718, 715, + 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, + 704, 703, 702, 700, 699, 698, 697, 696, 695, 694, - 684, 683, 682, 681, 680, 678, 676, 675, 674, 673, - 672, 671, 668, 667, 664, 663, 662, 661, 660, 659, - 658, 657, 656, 655, 654, 653, 652, 650, 649, 648, - 647, 646, 645, 644, 643, 641, 640, 639, 638, 637, - 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, - 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, - 605, 604, 603, 602, 601, 600, 599, 598, 597, 593, - 592, 591, 588, 587, 586, 583, 582, 581, 580, 579, - 578, 577, 576, 575, 573, 572, 571, 570, 569, 568, + 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, + 683, 681, 679, 678, 677, 676, 675, 674, 671, 670, + 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, + 657, 656, 655, 654, 652, 651, 650, 649, 648, 647, + 646, 645, 643, 642, 641, 640, 639, 638, 636, 635, + 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, + 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, + 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, + 604, 603, 602, 601, 600, 596, 595, 594, 591, 590, + 589, 586, 585, 584, 583, 582, 581, 580, 579, 578, - 567, 565, 564, 562, 561, 560, 559, 558, 556, 555, - 553, 552, 550, 549, 548, 547, 546, 545, 544, 543, - 542, 541, 540, 539, 538, 537, 536, 534, 533, 532, - 531, 530, 529, 528, 526, 525, 524, 523, 522, 521, - 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, - 510, 509, 508, 502, 500, 497, 496, 494, 493, 492, - 490, 486, 485, 484, 483, 482, 481, 480, 479, 478, - 477, 475, 474, 473, 472, 471, 470, 469, 468, 467, - 466, 464, 462, 461, 460, 459, 458, 457, 456, 455, - 454, 453, 452, 450, 449, 448, 447, 446, 445, 444, + 577, 575, 574, 573, 572, 571, 570, 569, 567, 566, + 564, 563, 562, 561, 560, 558, 557, 556, 554, 553, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 539, 538, 537, 535, 534, 533, 532, 531, + 530, 529, 527, 526, 525, 524, 523, 522, 521, 520, + 519, 518, 517, 516, 515, 514, 513, 512, 511, 505, + 503, 500, 499, 497, 496, 495, 493, 489, 488, 487, + 486, 485, 484, 483, 482, 481, 480, 479, 477, 476, + 475, 474, 473, 472, 471, 470, 469, 468, 466, 464, + 463, 462, 461, 460, 459, 458, 457, 456, 455, 454, - 443, 442, 441, 440, 439, 438, 437, 436, 435, 434, - 433, 432, 431, 429, 428, 427, 425, 424, 423, 421, - 420, 419, 417, 416, 415, 414, 413, 412, 410, 409, - 408, 407, 405, 404, 399, 398, 396, 395, 394, 393, - 392, 389, 386, 384, 383, 382, 381, 380, 379, 378, + 453, 451, 450, 449, 448, 447, 446, 445, 444, 443, + 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, + 432, 430, 429, 428, 426, 425, 424, 423, 422, 421, + 419, 418, 417, 416, 415, 414, 412, 411, 410, 409, + 407, 406, 401, 400, 398, 397, 396, 395, 394, 391, + 388, 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, - 367, 366, 365, 364, 363, 361, 360, 358, 357, 356, + 367, 366, 365, 364, 362, 361, 359, 358, 357, 356, 355, 354, 353, 352, 351, 347, 346, 345, 344, 343, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, - 331, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 319, 318, 317, 315, 314, 313, 312, 311, 308, - 307, 306, 305, 301, 299, 296, 294, 291, 288, 281, + 331, 329, 328, 327, 326, 325, 324, 323, 322, 321, + 320, 319, 318, 316, 315, 314, 313, 312, 309, 308, + 307, 306, 302, 300, 297, 295, 292, 289, 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, - 248, 247, 245, 244, 243, 242, 240, 239, 238, 237, - 236, 235, 234, 233, 232, 230, 229, 228, 227, 226, + 248, 247, 246, 244, 243, 242, 241, 239, 238, 237, + 236, 235, 234, 233, 232, 231, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 206, 205, - 204, 202, 199, 197, 195, 193, 192, 187, 186, 182, + 204, 202, 199, 197, 195, 193, 192, 187, 186, 182, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, - 162, 161, 160, 158, 157, 155, 154, 153, 152, 150, - 149, 148, 147, 145, 144, 143, 142, 141, 140, 139, - 137, 136, 134, 131, 129, 128, 127, 125, 124, 123, + 162, 161, 160, 158, 157, 155, 154, 153, 152, 151, + 149, 148, 147, 146, 144, 143, 142, 141, 140, 139, + 138, 136, 135, 133, 129, 128, 127, 125, 124, 123, 121, 120, 116, 110, 106, 105, 104, 98, 97, 78, 73, 67, 64, 50, 49, 48, 43, 41, 39, 38, - 24, 14, 11, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, + 24, 14, 11, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299 + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 1308, 1308, 1308, 1308, 1308 } ; static yy_state_type yy_last_accepting_state; @@ -1657,7 +1660,7 @@ using namespace isc::dhcp; /* To avoid the call to exit... oops! */ #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg) -#line 1660 "dhcp6_lexer.cc" +#line 1663 "dhcp6_lexer.cc" /* noyywrap disables automatic rewinding for the next file to parse. Since we always parse only a single string, there's no need to do any wraps. And using yywrap requires linking with -lfl, which provides the default yywrap @@ -1683,8 +1686,8 @@ using namespace isc::dhcp; by moving it ahead by yyleng bytes. yyleng specifies the length of the currently matched token. */ #define YY_USER_ACTION driver.loc_.columns(yyleng); -#line 1686 "dhcp6_lexer.cc" -#line 1687 "dhcp6_lexer.cc" +#line 1689 "dhcp6_lexer.cc" +#line 1690 "dhcp6_lexer.cc" #define INITIAL 0 #define COMMENT 1 @@ -2012,7 +2015,7 @@ YY_DECL } -#line 2015 "dhcp6_lexer.cc" +#line 2018 "dhcp6_lexer.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2041,13 +2044,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1300 ) + if ( yy_current_state >= 1309 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1299 ); + while ( yy_current_state != 1308 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -3316,9 +3319,9 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::POOLS: case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::SHARED_NETWORK: - return isc::dhcp::Dhcp6Parser::make_EVAL_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("eval-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("required-client-classes", driver.loc_); } } YY_BREAK @@ -3356,9 +3359,9 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: - return isc::dhcp::Dhcp6Parser::make_EVAL_ON_DEMAND(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_ONLY_IF_REQUIRED(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("eval-on-demand", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("only-if-required", driver.loc_); } } YY_BREAK @@ -4107,7 +4110,7 @@ YY_RULE_SETUP #line 1653 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4110 "dhcp6_lexer.cc" +#line 4113 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4426,7 +4429,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1300 ) + if ( yy_current_state >= 1309 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4459,11 +4462,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1300 ) + if ( yy_current_state >= 1309 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1299); + yy_is_jam = (yy_current_state == 1308); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index e7b0bdd6b7..bb33626754 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -1765,7 +1765,7 @@ namespace isc { namespace dhcp { #line 949 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("eval-client-classes", c); + ctx.stack_.back()->set("required-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } @@ -2648,7 +2648,7 @@ namespace isc { namespace dhcp { #line 1618 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("eval-on-demand", b); + ctx.stack_.back()->set("only-if-required", b); } #line 2654 "dhcp6_parser.cc" // lalr1.cc:859 break; @@ -4299,8 +4299,8 @@ namespace isc { namespace dhcp { "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"eval-client-classes\"", "\"test\"", - "\"eval-on-demand\"", "\"client-class\"", "\"reservations\"", + "\"client-classes\"", "\"required-client-classes\"", "\"test\"", + "\"only-if-required\"", "\"client-class\"", "\"reservations\"", "\"ip-addresses\"", "\"prefixes\"", "\"duid\"", "\"hw-address\"", "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", "\"parameters\"", @@ -4356,7 +4356,7 @@ namespace isc { namespace dhcp { "subnet6_list_content", "not_empty_subnet6_list", "subnet6", "$@42", "sub_subnet6", "$@43", "subnet6_params", "subnet6_param", "subnet", "$@44", "interface", "$@45", "interface_id", "$@46", "client_class", - "$@47", "eval_client_classes", "$@48", "reservation_mode", "$@49", + "$@47", "required_client_classes", "$@48", "reservation_mode", "$@49", "hr_mode", "id", "rapid_commit", "shared_networks", "$@50", "shared_networks_content", "shared_networks_list", "shared_network", "$@51", "shared_network_params", "shared_network_param", @@ -4388,7 +4388,7 @@ namespace isc { namespace dhcp { "relay_map", "$@85", "client_classes", "$@86", "client_classes_list", "client_class_entry", "$@87", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@88", "eval_on_demand", + "client_class_name", "client_class_test", "$@88", "only_if_required", "server_id", "$@89", "server_id_params", "server_id_param", "server_id_type", "$@90", "duid_type", "htype", "identifier", "$@91", "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@92", diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index 77187868d3..212cc47755 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -415,9 +415,9 @@ namespace isc { namespace dhcp { TOKEN_RELAY_SUPPLIED_OPTIONS = 323, TOKEN_HOST_RESERVATION_IDENTIFIERS = 324, TOKEN_CLIENT_CLASSES = 325, - TOKEN_EVAL_CLIENT_CLASSES = 326, + TOKEN_REQUIRED_CLIENT_CLASSES = 326, TOKEN_TEST = 327, - TOKEN_EVAL_ON_DEMAND = 328, + TOKEN_ONLY_IF_REQUIRED = 328, TOKEN_CLIENT_CLASS = 329, TOKEN_RESERVATIONS = 330, TOKEN_IP_ADDRESSES = 331, @@ -893,7 +893,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_EVAL_CLIENT_CLASSES (const location_type& l); + make_REQUIRED_CLIENT_CLASSES (const location_type& l); static inline symbol_type @@ -901,7 +901,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_EVAL_ON_DEMAND (const location_type& l); + make_ONLY_IF_REQUIRED (const location_type& l); static inline symbol_type @@ -2248,9 +2248,9 @@ namespace isc { namespace dhcp { } Dhcp6Parser::symbol_type - Dhcp6Parser::make_EVAL_CLIENT_CLASSES (const location_type& l) + Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES (const location_type& l) { - return symbol_type (token::TOKEN_EVAL_CLIENT_CLASSES, l); + return symbol_type (token::TOKEN_REQUIRED_CLIENT_CLASSES, l); } Dhcp6Parser::symbol_type @@ -2260,9 +2260,9 @@ namespace isc { namespace dhcp { } Dhcp6Parser::symbol_type - Dhcp6Parser::make_EVAL_ON_DEMAND (const location_type& l) + Dhcp6Parser::make_ONLY_IF_REQUIRED (const location_type& l) { - return symbol_type (token::TOKEN_EVAL_ON_DEMAND, l); + return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, l); } Dhcp6Parser::symbol_type diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index 5d9e113843..fc25296efd 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052218 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 4230060a35..b1a0b3e8fe 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052218 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index 00d8018ef9..a884c50715 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804052214 +// Generated 201804052218 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From be3540582945f32fa1cd7ecb8b3a9e1af37a5897 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 6 Apr 2018 10:12:49 +0200 Subject: [PATCH 43/52] [5374] spelling (in test code) --- src/bin/dhcp6/dhcp6_srv.cc | 2 +- src/bin/dhcp6/tests/classify_unittests.cc | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 7c99b98b50..1f823e54c9 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -3173,7 +3173,7 @@ Dhcpv6Srv::requiredClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx // Followed by the subnet const ClientClasses& to_add = subnet->getRequiredClasses(); - for(ClientClasses::const_iterator cclass = to_add.cbegin(); + for (ClientClasses::const_iterator cclass = to_add.cbegin(); cclass != to_add.cend(); ++cclass) { classes.insert(*cclass); } diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 99611da61e..573738c15b 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -415,7 +415,7 @@ TEST_F(ClassifyTest, requiredClassification) { "\"subnet6\": [ " "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " " \"subnet\": \"2001:db8:1::/48\", " - " \"require-client-classes\": [ \"router\" ], " + " \"required-client-classes\": [ \"router\" ], " " \"interface\": \"eth1\" } ]," "\"client-classes\": [ " "{ \"name\": \"router\", " @@ -1349,7 +1349,7 @@ TEST_F(ClassifyTest, precedencePool) { " \"id\": 1," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"require-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1430,10 +1430,10 @@ TEST_F(ClassifyTest, precedenceSubnet) { " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"require-client-classes\": [ \"for-subnet\" ]," + " \"required-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"require-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1511,14 +1511,14 @@ TEST_F(ClassifyTest, precedenceNetwork) { "\"shared-networks\": [ {" " \"name\": \"frog\"," " \"interface\": \"eth1\"," - " \"require-client-classes\": [ \"for-network\" ]," + " \"required-client-classes\": [ \"for-network\" ]," " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"require-client-classes\": [ \"for-subnet\" ]," + " \"required-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"require-client-classes\": [ \"for-pool\" ]" + " \"required-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," From 339f45b6b915ed995c471713fbcf536395eb34c9 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 6 Apr 2018 16:22:09 +0200 Subject: [PATCH 44/52] [5374] Addressed non test comments - checkpoint before regen --- doc/Makefile.am | 2 + doc/examples/kea4/classify2.json | 149 ++++++++++++++++++ doc/examples/kea6/classify2.json | 121 ++++++++++++++ doc/guide/classify.xml | 18 ++- doc/guide/dhcp4-srv.xml | 71 +++++++-- doc/guide/dhcp6-srv.xml | 63 ++++++-- src/bin/dhcp4/dhcp4_lexer.ll | 6 +- src/bin/dhcp4/dhcp4_parser.yy | 12 +- src/bin/dhcp4/tests/classify_unittest.cc | 14 +- src/bin/dhcp4/tests/parser_unittest.cc | 3 +- src/bin/dhcp6/dhcp6_lexer.ll | 6 +- src/bin/dhcp6/dhcp6_parser.yy | 14 +- src/bin/dhcp6/tests/classify_unittests.cc | 14 +- src/bin/dhcp6/tests/parser_unittest.cc | 3 +- src/lib/dhcpsrv/network.cc | 4 +- src/lib/dhcpsrv/network.h | 2 +- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 8 +- .../dhcpsrv/parsers/shared_network_parser.cc | 8 +- src/lib/dhcpsrv/pool.cc | 13 +- .../dhcpsrv/tests/cfg_subnets4_unittest.cc | 4 +- .../dhcpsrv/tests/cfg_subnets6_unittest.cc | 6 +- src/lib/dhcpsrv/tests/pool_unittest.cc | 4 +- .../tests/shared_network_parser_unittest.cc | 16 +- .../dhcpsrv/tests/shared_network_unittest.cc | 4 +- src/lib/eval/eval.dox | 8 +- src/lib/eval/eval_context.h | 12 +- 26 files changed, 468 insertions(+), 117 deletions(-) create mode 100644 doc/examples/kea4/classify2.json create mode 100644 doc/examples/kea6/classify2.json diff --git a/doc/Makefile.am b/doc/Makefile.am index 2be574a095..c39619a795 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -18,6 +18,7 @@ nobase_dist_doc_DATA += examples/kea4/advanced.json nobase_dist_doc_DATA += examples/kea4/backends.json nobase_dist_doc_DATA += examples/kea4/cassandra.json nobase_dist_doc_DATA += examples/kea4/classify.json +nobase_dist_doc_DATA += examples/kea4/classify2.json nobase_dist_doc_DATA += examples/kea4/dhcpv4-over-dhcpv6.json nobase_dist_doc_DATA += examples/kea4/hooks.json nobase_dist_doc_DATA += examples/kea4/leases-expiration.json @@ -33,6 +34,7 @@ nobase_dist_doc_DATA += examples/kea6/advanced.json nobase_dist_doc_DATA += examples/kea6/backends.json nobase_dist_doc_DATA += examples/kea6/cassandra.json nobase_dist_doc_DATA += examples/kea6/classify.json +nobase_dist_doc_DATA += examples/kea6/classify2.json nobase_dist_doc_DATA += examples/kea6/dhcpv4-over-dhcpv6.json nobase_dist_doc_DATA += examples/kea6/duid.json nobase_dist_doc_DATA += examples/kea6/hooks.json diff --git a/doc/examples/kea4/classify2.json b/doc/examples/kea4/classify2.json new file mode 100644 index 0000000000..626d5c9ffb --- /dev/null +++ b/doc/examples/kea4/classify2.json @@ -0,0 +1,149 @@ +// This is an example configuration file for the DHCPv4 server in Kea. +// The purpose of this example is to showcase how clients can be classified +// with advanced features. + +{ "Dhcp4": { + +// Kea is told to listen on ethX interface only. + "interfaces-config": { + "interfaces": [ "ethX" ] + }, + +// Let's use the simplest backend: memfile and use some reasonable values +// for timers. They are of no concern for the classification demonstration. + "lease-database": { "type": "memfile" }, + "renew-timer": 1000, + "rebind-timer": 2000, + "valid-lifetime": 4000, + +// This list defines several classes that incoming packets can be assigned to. +// One packet can belong to zero or more classes. + "client-classes": [ + +// This class is required by the second subnet and is evaluated only +// if it is required. The test expression returns true. +// Note it is not possible to depend on VoIP class because it is not yet +// defined. + { + "name": "second_subnet", + "only-if-required": true, + "test": "member('ALL')", + "option-data": [{ + "name": "domain-name-servers", + "data": "127.0.0.1" + }] + }, + +// Let's classify all incoming DISCOVER (message type 1) to a separate +// class. + { + "name": "discovers", + "test": "pkt4.msgtype == 1" + }, + +// Clients are supposed to set the transaction-id field to a random value. +// Clients that send it with 0 are most likely broken. Let's mark them +// as such. + { + "name": "broken", + "test": "pkt4.transid == 0" + }, + +// Let's pick VoIP phones. Those that send their class identifiers +// as Aastra, should belong to VoIP class. For a list of all options, +// see www.iana.org/assignments/bootp-dhcp-parameters/. +// In this particular class, we want to set specific values +// of certain DHCPv4 fields. If the incoming packet matches the +// test, those fields will be set in outgoing responses. +// The option 43 is defined to encapsulate suboption in the aastra space. + { + "name": "VoIP", + "test": "substring(option[60].hex,0,6) == 'Aastra'", + "next-server": "192.0.2.254", + "server-hostname": "hal9000", + "boot-file-name": "/dev/null", + "option-def": [ { + "name": "vendor-encapsulated-options", + "code": 43, + "type": "empty", + "encapsulate": "aastra" } ] + }, + +// Both a VoIP phone (by evaluation or host reservation) and has a host +// reservation. + { + "name": "VoIP_host", + "test": "member('VoIP') and member('KNOWN')", + "server-hostname": "hal9001" + } + + ], + +// The following list defines subnets. For some subnets we defined +// a class that is allowed in that subnet. If not specified, +// everyone is allowed. When a class is specified, only packets belonging +// to that class are allowed for that subnet. + "subnet4": [ + { +// This one is for VoIP devices only. + "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ], + "subnet": "192.0.2.0/24", + "client-class": "VoIP", + "interface": "ethX" + }, +// This one doesn't have any client-class specified, so everyone +// is allowed in. The normal subnet selection rules still apply, +// though. There is also a static class reservation for a client +// using MAC address 1a:1b:1c:1d:1e:1f. This client will always +// be assigned to this class. + { + "pools": [ { "pool": "192.0.3.1 - 192.0.3.200" } ], + "subnet": "192.0.3.0/24", + "reservations": [ + { + "hw-address": "1a:1b:1c:1d:1e:1f", + "client-classes": [ "VoIP" ] + } ], + "interface": "ethX" + }, + +// The following list defines a subnet with pools. For some pools +// we defined a class that is allowed in that pool. If not specified +// everyone is allowed. When a class is specified, only packets belonging +// to that class are allowed for that pool. + { + "pools": [ + { +// This one is for VoIP devices only. + "pool": "192.0.4.1 - 192.0.4.200", + "client-class": "VoIP" + }, +// This one doesn't have any client-class specified, so everyone +// is allowed in. + { + "pool": "192.0.5.1 - 192.0.5.200" + } ], + "subnet": "192.0.4.0/23", + "interface": "ethY" + } + ] +}, + +// The following configures logging. It assumes that messages with at +// least informational level (info, warn, error and fatal) should be +// logged to stdout. +"Logging": { + "loggers": [ + { + "name": "kea-dhcp4", + "output_options": [ + { + "output": "stdout" + } + ], + "severity": "INFO" + } + ] +} + +} diff --git a/doc/examples/kea6/classify2.json b/doc/examples/kea6/classify2.json new file mode 100644 index 0000000000..aa6a7bd4df --- /dev/null +++ b/doc/examples/kea6/classify2.json @@ -0,0 +1,121 @@ +// This is an example configuration file for the DHCPv4 server in Kea. +// The purpose of this example is to showcase how clients can be classified. + +{ "Dhcp6": + +{ +// Kea is told to listen on ethX interface only. + "interfaces-config": { + "interfaces": [ "ethX" ] + }, + +// Let's use the simplest backend: memfile and use some reasonable values +// for timers. They are of no concern for the classification demonstration. + "lease-database": { + "type": "memfile", + "lfc-interval": 3600 + }, + "renew-timer": 1000, + "rebind-timer": 2000, + "preferred-lifetime": 3000, + "valid-lifetime": 4000, + +// This list defines several classes that incoming packets can be assigned to. +// One packet can belong to zero or more classes. + "client-classes": [ + +// This class is required by the second subnet and is evaluated only +// if it is required. The test expression returns true. +// Note it is not possible to depend on cable-modems class because it +// is not yet defined. + { + "name": "second_subnet", + "only-if-required": true, + "test": "member('ALL')", + "option-data": [{ + "name": "dns-servers", + "data": "2001:db8::1" + }] + }, + +// Let's classify all incoming RENEW (message type 5) to a separate +// class. + { + "name": "renews", + "test": "pkt6.msgtype == 5" + }, + +// Let's pick cable modems. In this simple example we'll assume the device +// is a cable modem if it sends a vendor option with enterprise-id equal +// to 4491. + { + "name": "cable-modems", + "test": "vendor.enterprise == 4491" + }, + +// Both a cable modem (by evaluation or host reservation) and has a host +// reservation. + { + "name": "cable-modem-hosts", + "test": "member('cable-modems') and member('KNOWN')" + } + + ], + + +// The following list defines subnets. Each subnet consists of at +// least subnet and pool entries. + "subnet6": [ + { + "pools": [ { "pool": "2001:db8:1::/80" } ], + "subnet": "2001:db8:1::/64", + "client-class": "cable-modems", + "interface": "ethX" + }, +// The following subnet contains a class reservation for a client using +// DUID 01:02:03:04:05:0A:0B:0C:0D:0E. This client will always be assigned +// to this class. + { + "pools": [ { "pool": "2001:db8:2::/80" } ], + "subnet": "2001:db8:2::/64", + "reservations": [ + { + "duid": "01:02:03:04:05:0A:0B:0C:0D:0E", + "client-classes": [ "cable-modems" ] + } ], + "interface": "ethX" + }, +// The following subnet contains a pool with a class constraint: only +// clients which belong to the class are allowed to use this pool. + { + "pools": [ + { + "pool": "2001:db8:3::/80", + "client-class": "cable-modems" + } ], + "subnet": "2001:db8:4::/64", + "interface": "ethY" + } + + ] +}, + +// The following configures logging. It assumes that messages with at +// least informational level (info, warn, error and fatal) should be +// logged to stdout. +"Logging": { + "loggers": [ + { + "name": "kea-dhcp6", + "output_options": [ + { + "output": "stdout" + } + ], + "debuglevel": 0, + "severity": "INFO" + } + ] +} + +} diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 0a1b2baf2a..06e7beebf6 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -131,8 +131,10 @@ - Beginning with 1.4 client classes follow now the insertion order - (vs. alphabetical order in previous versions). + Beginning with Kea 1.4.0 release, client classes follow the order + in which they are specified in the configuration + (vs. alphabetical order in previous versions), or for required + classes the order they are required. @@ -184,6 +186,14 @@ belongs to, and the KNOWN class. By convention builtin classes names begin with all caps. + + Currently recognized builtin class names are ALL and KNOWN + and prefixes VENDOR_CLASS_, AFTER_ and EXTERNAL_. The AFTER_ prefix + is a provision for a not yet written hook, the EXTERNAL_ prefix + can be freely used: builtin classes are implicitly defined so + never raise warnings because they do not appear in the configuration. + +
@@ -788,11 +798,11 @@ concatenation of the strings subnet, shared-network or pools are known but output option processing not yet done. The only-if-required flag, false by default, allows to perform the evaluation of the test expression only - when it was required, i.e. in a required-client-classes list. + when it was required, i.e. in a require-client-classes list. - The required-client-classes list which is valid for shared-network, + The require-client-classes list which is valid for shared-network, subnet and pool scope specifies the classes which are evaluated in the second pass before output option processing. The list is built in the reversed precedence order of option diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 479580e11f..7fed462b7b 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2064,8 +2064,9 @@ It is merely echoed by the server the DHCP message processing, including the assignment of leases from different pools, the assignment of different options (or different values of the same options) etc. In the current release of the software however, there are - only three mechanisms that take advantage of client classification: - subnet selection, assignment of different options, and, for cable modems, there + only some mechanisms that take advantage of client classification: + private options and option 43 deferred unpacking, subnet selection, + pool selection, assignment of different options, and, for cable modems, there are specific options for use with the TFTP server address and the boot file field. @@ -2091,19 +2092,24 @@ It is merely echoed by the server - The process of doing classification is conducted in five steps. The first step + The process of doing classification is conducted in several steps. The first step is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. - The third step is to assign classes from host reservations. - The forth step is to build the list of required classes and perform - the evaluation for each class of the list. + The third step is to assign classes from host reservations and + evaluate class expressions depending on the "KNOWN" class. + After the list of required classes is built and each class of the list + has its expression evaluated: when it returns true the packet is added + as a member of the class. The last step is to assign options, again possibly based on the class information. + More complete and detailed description is available in + . - There are two methods of doing classification. The first is automatic and relies - on examining the values in the vendor class options. Information from these + There are two main methods of doing classification. The first is automatic and relies + on examining the values in the vendor class options or existence of a + host reservation. Information from these options is extracted and a class name is constructed from it and added to the class list for the packet. The second allows you to specify an expression that is evaluated for each packet. If the result is true the packet is @@ -2155,11 +2161,12 @@ It is merely echoed by the server If there are multiple classes defined and an incoming packet is matched - to multiple classes, the class which is defined first is used. + to multiple classes, the class which is evaluated first is used. - In versions before 1.4 the alphabetical order was used. + In Kea versions prior to 1.4.0 the alphabetical order of class names was used. + Starting from Kea 1.4.0 the classes are ordered as specified in the configuration.
@@ -2260,13 +2267,15 @@ It is merely echoed by the server The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not - evaluated at the reception of a new incoming ticket. + evaluated at the reception of a new incoming ticket but + later and only if the class evaluation is required. - The second is the required-client-classes which + The second is the require-client-classes which takes a list of class names and is valid in shared-network, - subnet and pool scope. Classes in these lists are evaluated + subnet and pool scope. Classes in these lists are marked as + required and evaluated after resource assignment and before output option processing. @@ -2279,7 +2288,7 @@ It is merely echoed by the server "client-classes": [ { "name": "Client_foo", - "test": "'' == ''", + "test": "member('ALL')", "only-if-required": true }, ... @@ -2288,7 +2297,7 @@ It is merely echoed by the server { "subnet": "192.0.2.0/24", "pools": [ { "pool": "192.0.2.10 - 192.0.2.20" } ], - "required-client-classes": [ "Client_foo" ], + "require-client-classes": [ "Client_foo" ], ... }, ... @@ -2296,6 +2305,23 @@ It is merely echoed by the server ... } + + + Required evaluation can be used to express complex dependencies + including for instance subnet membership, and to reverse the + precedence: if you set an option-data in a subnet it takes + precedence over an option-data in a class. When you move the + option-data to a (only-if) required class and require it in + the subnet a class evaluted or set before takes precedence. + + + + Required evaluation is also available at shared-network and + pool levels. The order required classes are considered is + shared-network, subnet and pool, i.e. the opposite order + option-data are processed. + +
@@ -3392,7 +3418,7 @@ It is merely echoed by the server to configure the server to assign classes to a client based on the content of the options that this client sends to the server. Host reservations mechanisms also allow for statically assigning classes to the clients. - The definitions of these classes must exist in the Kea + The definitions of these classes should exist in the Kea configuration. The following configuration snippet shows how to specify that a client belongs to classes reserved-class1 and reserved-class2. Those classes are associated with @@ -3438,7 +3464,18 @@ It is merely echoed by the server Static class assignments, as shown above, can be used in conjunction - with classification using expressions. + with classification using expressions. The "KNOWN" builtin class is + added to the packet and any class depending on it directly or indirectly + and not only-if-required is evaluted. + + + + If you want to force the evaluation of a class expression after + the host reservation lookup, for instance because of a dependency on + "reserved-class1" from the previous example, you should add a + "member('KNOWN')" in the expression. + +
diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index ed7e22fa5e..9a671c2def 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1924,8 +1924,8 @@ should include options from the isc option space: the DHCP message processing, including the assignment of leases from different pools, the assignment of different options (or different values of the same options) etc. In the current release of the software however, there are - only two mechanisms that take advantage of client classification: - subnet selection and assignment of different options. + only some mechanisms that take advantage of client classification: + subnet selection, pool selection, and assignment of different options. @@ -1951,19 +1951,24 @@ should include options from the isc option space: - The process of doing classification is conducted in five steps. The first step + The process of doing classification is conducted in several steps. The first step is to assess an incoming packet and assign it to zero or more classes. The second step is to choose a subnet, possibly based on the class information. - The third step is to assign classes from host reservations. - The forth step is to build the list of required classes and perform - the evaluation for each class of the list. + The third step is to assign classes from host reservations and + evaluate class expressions depending on the "KNOWN" class. + After the list of required classes is built and each class of the list + has its expression evaluated: when it returns true the packet is added + as a member of the class. The last step is to assign options again possibly based on the class information. + More complete and detailed description is available in + . - There are two methods of doing classification. The first is automatic and relies - on examining the values in the vendor class options. Information from these + There are two main methods of doing classification. The first is automatic and relies + on examining the values in the vendor class options or existence of a + host reservation. Information from these options is extracted and a class name is constructed from it and added to the class list for the packet. The second allows you to specify an expression that is evaluated for each packet. If the result is true the packet is @@ -2053,13 +2058,15 @@ should include options from the isc option space: The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not - evaluated at the reception of a new incoming ticket. + evaluated at the reception of a new incoming ticket but + later and only if the class evaluation is required. - The second is the required-client-classes which + The second is the require-client-classes which takes a list of class names and is valid in shared-network, - subnet and pool scope. Classes in these lists are evaluated + subnet and pool scope. Classes in these lists are marked as + required and evaluated after resource assignment and before output option processing. @@ -2072,7 +2079,7 @@ should include options from the isc option space: "client-classes": [ { "name": "Client_foo", - "test": "'' == ''", + "test": "member('ALL')", "only-if-required": true }, ... @@ -2085,7 +2092,7 @@ should include options from the isc option space: "pool": "2001:db8:1::-2001:db8:1::ffff" } ], - "required-client-classes": [ "Client_foo" ], + "require-client-classes": [ "Client_foo" ], ... }, ... @@ -2093,6 +2100,23 @@ should include options from the isc option space: ... } + + + Required evaluation can be used to express complex dependencies + including for instance subnet membership, and to reverse the + precedence: if you set an option-data in a subnet it takes + precedence over an option-data in a class. When you move the + option-data to a (only-if) required class and require it in + the subnet a class evaluted or set before takes precedence. + + + + Required evaluation is also available at shared-network and + pool/pd-pool levels. The order required classes are considered is + shared-network, subnet and (pd-)pool, i.e. the opposite order + option-data are processed. + +
@@ -2960,7 +2984,18 @@ should include options from the isc option space: Static class assignments, as shown above, can be used in conjunction - with classification using expressions. + with classification using expressions. The "KNOWN" builtin class is + added to the packet and any class depending on it directly or indirectly + and not only-if-required is evaluted. + + + + If you want to force the evaluation of a class expression after + the host reservation lookup, for instance because of a dependency on + "reserved-class1" from the previous example, you should add a + "member('KNOWN')" in the expression. + +
diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 1e68cde4ce..74570b2b23 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -795,14 +795,14 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"required-client-classes\" { +\"require-client-classes\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: - return isc::dhcp::Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_REQUIRE_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("required-client-classes", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("require-client-classes", driver.loc_); } } diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 498bddf91e..d503708e29 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -123,7 +123,7 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" - REQUIRED_CLIENT_CLASSES "required-client-classes" + REQUIRE_CLIENT_CLASSES "require-client-classes" TEST "test" ONLY_IF_REQUIRED "only-if-required" CLIENT_CLASS "client-class" @@ -911,7 +911,7 @@ subnet4_param: valid_lifetime | id | rapid_commit | client_class - | required_client_classes + | require_client_classes | reservations | reservation_mode | relay @@ -982,9 +982,9 @@ client_class: CLIENT_CLASS { ctx.leave(); }; -required_client_classes: REQUIRED_CLIENT_CLASSES { +require_client_classes: REQUIRE_CLIENT_CLASSES { ElementPtr c(new ListElement(ctx.loc2pos(@1))); - ctx.stack_.back()->set("required-client-classes", c); + ctx.stack_.back()->set("require-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } COLON list_strings { @@ -1061,7 +1061,7 @@ shared_network_param: name | relay | reservation_mode | client_class - | required_client_classes + | require_client_classes | valid_lifetime | unknown_map_entry ; @@ -1344,7 +1344,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class - | required_client_classes + | require_client_classes | user_context | unknown_map_entry ; diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 504ed6a577..7e9e2d8f32 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -209,7 +209,7 @@ const char* CONFIGS[] = { " \"subnet\": \"10.0.0.0/24\", " " \"id\": 1," " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]," - " \"required-client-classes\": [ \"pxe2\" ]" + " \"require-client-classes\": [ \"pxe2\" ]" " } ]" "}" @@ -754,7 +754,7 @@ TEST_F(ClassifyTest, precedencePool) { " \"id\": 1," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" @@ -831,10 +831,10 @@ TEST_F(ClassifyTest, precedenceSubnet) { " \"subnet4\": [ { " " \"subnet\": \"10.0.0.0/24\"," " \"id\": 1," - " \"required-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" @@ -908,14 +908,14 @@ TEST_F(ClassifyTest, precedenceNetwork) { "]," "\"shared-networks\": [ {" " \"name\": \"frog\"," - " \"required-client-classes\": [ \"for-network\" ]," + " \"require-client-classes\": [ \"for-network\" ]," " \"subnet4\": [ { " " \"subnet\": \"10.0.0.0/24\"," " \"id\": 1," - " \"required-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"10.0.0.10-10.0.0.100\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]" diff --git a/src/bin/dhcp4/tests/parser_unittest.cc b/src/bin/dhcp4/tests/parser_unittest.cc index adadbe9676..eefc89cab1 100644 --- a/src/bin/dhcp4/tests/parser_unittest.cc +++ b/src/bin/dhcp4/tests/parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -244,6 +244,7 @@ TEST(ParserTest, file) { "backends.json", "cassandra.json", "classify.json", + "classify2.json", "dhcpv4-over-dhcpv6.json", "hooks.json", "leases-expiration.json", diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index d8c8afd79d..c9a52e6913 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1047,15 +1047,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } -\"required-client-classes\" { +\"require-client-classes\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: case isc::dhcp::Parser6Context::POOLS: case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::SHARED_NETWORK: - return isc::dhcp::Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_REQUIRE_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("required-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("require-client-classes", driver.loc_); } } diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 9bfaa141d5..ab3f2b3109 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -116,7 +116,7 @@ using namespace std; HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers" CLIENT_CLASSES "client-classes" - REQUIRED_CLIENT_CLASSES "required-client-classes" + REQUIRE_CLIENT_CLASSES "require-client-classes" TEST "test" ONLY_IF_REQUIRED "only-if-required" CLIENT_CLASS "client-class" @@ -906,7 +906,7 @@ subnet6_param: preferred_lifetime | id | rapid_commit | client_class - | required_client_classes + | require_client_classes | reservations | reservation_mode | relay @@ -946,9 +946,9 @@ client_class: CLIENT_CLASS { ctx.leave(); }; -required_client_classes: REQUIRED_CLIENT_CLASSES { +require_client_classes: REQUIRE_CLIENT_CLASSES { ElementPtr c(new ListElement(ctx.loc2pos(@1))); - ctx.stack_.back()->set("required-client-classes", c); + ctx.stack_.back()->set("require-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } COLON list_strings { @@ -1023,7 +1023,7 @@ shared_network_param: name | relay | reservation_mode | client_class - | required_client_classes + | require_client_classes | preferred_lifetime | rapid_commit | valid_lifetime @@ -1307,7 +1307,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list | client_class - | required_client_classes + | require_client_classes | user_context | unknown_map_entry ; @@ -1383,7 +1383,7 @@ pd_pool_param: pd_prefix | pd_delegated_len | option_data_list | client_class - | required_client_classes + | require_client_classes | excluded_prefix | excluded_prefix_len | user_context diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 573738c15b..99611da61e 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -415,7 +415,7 @@ TEST_F(ClassifyTest, requiredClassification) { "\"subnet6\": [ " "{ \"pools\": [ { \"pool\": \"2001:db8:1::/64\" } ], " " \"subnet\": \"2001:db8:1::/48\", " - " \"required-client-classes\": [ \"router\" ], " + " \"require-client-classes\": [ \"router\" ], " " \"interface\": \"eth1\" } ]," "\"client-classes\": [ " "{ \"name\": \"router\", " @@ -1349,7 +1349,7 @@ TEST_F(ClassifyTest, precedencePool) { " \"id\": 1," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1430,10 +1430,10 @@ TEST_F(ClassifyTest, precedenceSubnet) { " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"required-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," @@ -1511,14 +1511,14 @@ TEST_F(ClassifyTest, precedenceNetwork) { "\"shared-networks\": [ {" " \"name\": \"frog\"," " \"interface\": \"eth1\"," - " \"required-client-classes\": [ \"for-network\" ]," + " \"require-client-classes\": [ \"for-network\" ]," " \"subnet6\": [ { " " \"subnet\": \"2001:db8:1::/64\"," " \"id\": 1," - " \"required-client-classes\": [ \"for-subnet\" ]," + " \"require-client-classes\": [ \"for-subnet\" ]," " \"pools\": [ { " " \"pool\": \"2001:db8:1::1 - 2001:db8:1::64\"," - " \"required-client-classes\": [ \"for-pool\" ]" + " \"require-client-classes\": [ \"for-pool\" ]" " } ]" " } ]" "} ]," diff --git a/src/bin/dhcp6/tests/parser_unittest.cc b/src/bin/dhcp6/tests/parser_unittest.cc index fdc9c85f38..b221dd760e 100644 --- a/src/bin/dhcp6/tests/parser_unittest.cc +++ b/src/bin/dhcp6/tests/parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -248,6 +248,7 @@ TEST(ParserTest, file) { configs.push_back("backends.json"); configs.push_back("cassandra.json"); configs.push_back("classify.json"); + configs.push_back("classify2.json"); configs.push_back("dhcpv4-over-dhcpv6.json"); configs.push_back("duid.json"); configs.push_back("hooks.json"); diff --git a/src/lib/dhcpsrv/network.cc b/src/lib/dhcpsrv/network.cc index 0c48dba822..78b289810e 100644 --- a/src/lib/dhcpsrv/network.cc +++ b/src/lib/dhcpsrv/network.cc @@ -70,7 +70,7 @@ Network::toElement() const { map->set("client-class", Element::create(cclass)); } - // Set required-client-classes + // Set require-client-classes const ClientClasses& classes = getRequiredClasses(); if (!classes.empty()) { ElementPtr class_list = Element::createList(); @@ -78,7 +78,7 @@ Network::toElement() const { it != classes.cend(); ++it) { class_list->add(Element::create(*it)); } - map->set("required-client-classes", class_list); + map->set("require-client-classes", class_list); } // Set renew-timer diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index 40ffe93010..dacaa317ca 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -277,7 +277,7 @@ protected: /// @brief Optional definition of a client class /// /// If defined, only clients belonging to that class will be allowed to use - /// this particular network. The default value for this is an empty list, + /// this particular network. The default value for this is an empty string, /// which means that any client is allowed, regardless of its class. ClientClass client_class_; diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index ce1879f97c..d064b123dc 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -389,7 +389,7 @@ PoolParser::parse(PoolStoragePtr pools, } // Try setting up required client classes. - ConstElementPtr class_list = pool_structure->get("required-client-classes"); + ConstElementPtr class_list = pool_structure->get("require-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); @@ -712,7 +712,7 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params, } // Try setting up required client classes. - ConstElementPtr class_list = params->get("required-client-classes"); + ConstElementPtr class_list = params->get("require-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); @@ -891,7 +891,7 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { client_class_ = client_class; } - ConstElementPtr class_list = pd_pool_->get("required-client-classes"); + ConstElementPtr class_list = pd_pool_->get("require-client-classes"); // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. @@ -1112,7 +1112,7 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params, } // Try setting up required client classes. - ConstElementPtr class_list = params->get("required-client-classes"); + ConstElementPtr class_list = params->get("require-client-classes"); if (class_list) { const std::vector& classes = class_list->listValue(); for (auto cclass = classes.cbegin(); diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 5a04e6cd20..7270699002 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -70,9 +70,9 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { } } - if (shared_network_data->contains("required-client-classes")) { + if (shared_network_data->contains("require-client-classes")) { const std::vector& class_list = - shared_network_data->get("required-client-classes")->listValue(); + shared_network_data->get("require-client-classes")->listValue(); for (auto cclass = class_list.cbegin(); cclass != class_list.cend(); ++cclass) { if (((*cclass)->getType() != Element::string) || @@ -125,9 +125,9 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { } } - if (shared_network_data->contains("required-client-classes")) { + if (shared_network_data->contains("require-client-classes")) { const std::vector& class_list = - shared_network_data->get("required-client-classes")->listValue(); + shared_network_data->get("require-client-classes")->listValue(); for (auto cclass = class_list.cbegin(); cclass != class_list.cend(); ++cclass) { if (((*cclass)->getType() != Element::string) || diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index 2e96ee1ded..e2d239938d 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -27,14 +27,7 @@ bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { } bool Pool::clientSupported(const ClientClasses& classes) const { - if (client_class_.empty()) { - // There is no class defined for this pool, so we do - // support everyone. - return (true); - } else if (classes.contains(client_class_)) { - return (true); - } - return (false); + return (client_class_.empty() || classes.contains(client_class_)); } void Pool::allowClientClass(const ClientClass& class_name) { @@ -112,7 +105,7 @@ Pool::toElement() const { map->set("client-class", Element::create(cclass)); } - // Set required-client-classes + // Set require-client-classes const ClientClasses& classes = getRequiredClasses(); if (!classes.empty()) { ElementPtr class_list =Element::createList(); @@ -120,7 +113,7 @@ Pool::toElement() const { it != classes.cend(); ++it) { class_list->add(Element::create(*it)); } - map->set("required-client-classes", class_list); + map->set("require-client-classes", class_list); } return (map); diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index 8f8c691d87..cb6a96626c 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -802,7 +802,7 @@ TEST(CfgSubnets4Test, unparseSubnet) { " \"reservation-mode\": \"all\",\n" " \"option-data\": [ ],\n" " \"pools\": [ ]\n," - " \"required-client-classes\": [ \"foo\", \"bar\" ]\n" + " \"require-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -848,7 +848,7 @@ TEST(CfgSubnets4Test, unparsePool) { " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\",\n" " \"client-class\": \"bar\",\n" - " \"required-client-classes\": [ \"foo\" ]\n" + " \"require-client-classes\": [ \"foo\" ]\n" " }\n" " ]\n" "} ]\n"; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index 6d1f6baad4..227c60e175 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -490,7 +490,7 @@ TEST(CfgSubnets6Test, unparseSubnet) { " \"pools\": [ ],\n" " \"pd-pools\": [ ],\n" " \"option-data\": [ ],\n" - " \"required-client-classes\": [ \"foo\", \"bar\" ]\n" + " \"require-client-classes\": [ \"foo\", \"bar\" ]\n" "} ]\n"; runToElementTest(expected, cfg); } @@ -533,7 +533,7 @@ TEST(CfgSubnets6Test, unparsePool) { " \"pool\": \"2001:db8:1:1::/64\",\n" " \"option-data\": [ ],\n" " \"client-class\": \"bar\",\n" - " \"required-client-classes\": [ \"foo\" ]\n" + " \"require-client-classes\": [ \"foo\" ]\n" " }\n" " ],\n" " \"pd-pools\": [ ],\n" @@ -580,7 +580,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"prefix-len\": 48,\n" " \"delegated-len\": 64,\n" " \"option-data\": [ ],\n" - " \"required-client-classes\": [ \"bar\" ]\n" + " \"require-client-classes\": [ \"bar\" ]\n" " },{\n" " \"prefix\": \"2001:db8:3::\",\n" " \"prefix-len\": 48,\n" diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index a0e113668b..494e40663b 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -230,7 +230,7 @@ TEST(Pool4Test, clientClass) { EXPECT_TRUE(pool->clientSupported(three_classes)); } -// This test checks that handling for required-client-classes is valid. +// This test checks that handling for require-client-classes is valid. TEST(Pool4Test, requiredClasses) { // Create a pool. Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), @@ -625,7 +625,7 @@ TEST(Pool6Test, clientClass) { EXPECT_TRUE(pool.clientSupported(three_classes)); } -// This test checks that handling for required-client-classes is valid. +// This test checks that handling for require-client-classes is valid. TEST(Pool6Test, requiredClasses) { // Create a pool. Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index dfb3a9db9c..193428ac24 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -52,7 +52,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," - " \"required-client-classes\": []\n," + " \"require-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -73,7 +73,7 @@ public: " \"server-hostname\": \"\"," " \"boot-file-name\": \"\"," " \"client-class\": \"\"," - " \"required-client-classes\": []\n," + " \"require-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"4o6-interface\": \"\"," " \"4o6-interface-id\": \"\"," @@ -194,7 +194,7 @@ public: " \"preferred-lifetime\": 300," " \"valid-lifetime\": 400," " \"client-class\": \"\"," - " \"required-client-classes\": []\n," + " \"require-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -210,7 +210,7 @@ public: " \"preferred-lifetime\": 30," " \"valid-lifetime\": 40," " \"client-class\": \"\"," - " \"required-client-classes\": []\n," + " \"require-client-classes\": []\n," " \"reservation-mode\": \"all\"," " \"decline-probation-period\": 86400," " \"dhcp4o6-port\": 0," @@ -283,7 +283,7 @@ TEST_F(SharedNetwork6ParserTest, clientClass) { EXPECT_EQ("alpha", network->getClientClass()); } -// This test verifies that it's possible to specify required-client-classes +// This test verifies that it's possible to specify require-client-classes // on shared-network level. TEST_F(SharedNetwork6ParserTest, evalClientClasses) { std::string config = getWorkingConfig(); @@ -292,7 +292,7 @@ TEST_F(SharedNetwork6ParserTest, evalClientClasses) { ElementPtr class_list = Element::createList(); class_list->add(Element::create("alpha")); class_list->add(Element::create("beta")); - config_element->set("required-client-classes", class_list); + config_element->set("require-client-classes", class_list); // Parse configuration specified above. SharedNetwork6Parser parser; @@ -305,7 +305,7 @@ TEST_F(SharedNetwork6ParserTest, evalClientClasses) { EXPECT_EQ("alpha, beta", classes.toText()); } -// This test verifies that bad required-client-classes configs raise +// This test verifies that bad require-client-classes configs raise // expected errors. TEST_F(SharedNetwork6ParserTest, badEvalClientClasses) { std::string config = getWorkingConfig(); @@ -315,7 +315,7 @@ TEST_F(SharedNetwork6ParserTest, badEvalClientClasses) { ElementPtr class_list = Element::createList(); class_list->add(Element::create("alpha")); class_list->add(Element::create(1234)); - config_element->set("required-client-classes", class_list); + config_element->set("require-client-classes", class_list); // Parse configuration specified above. SharedNetwork6Parser parser; diff --git a/src/lib/dhcpsrv/tests/shared_network_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_unittest.cc index aefe3bc398..9b74d3a591 100644 --- a/src/lib/dhcpsrv/tests/shared_network_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_unittest.cc @@ -258,7 +258,7 @@ TEST(SharedNetwork4Test, unparse) { " \"valid-lifetime\": 30\n" " }\n" " ],\n" - " \"required-client-classes\": [ \"foo\" ],\n" + " \"require-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 200\n" "}\n"; @@ -538,7 +538,7 @@ TEST(SharedNetwork6Test, unparse) { " \"valid-lifetime\": 40\n" " }\n" " ],\n" - " \"required-client-classes\": [ \"foo\" ],\n" + " \"require-client-classes\": [ \"foo\" ],\n" " \"valid-lifetime\": 300\n" "}\n"; diff --git a/src/lib/eval/eval.dox b/src/lib/eval/eval.dox index db29baa9aa..64efbb4c87 100644 --- a/src/lib/eval/eval.dox +++ b/src/lib/eval/eval.dox @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -22,10 +22,10 @@ EvalContext::expression. Parameters to the @ref isc::eval::EvalContext class constructor are - the universe to choose between DHCPv4 and DHCPv6 for dependent expressions, - and a closure which checks if a client class is already known used + the universe to choose between DHCPv4 and DHCPv6 for DHCP version + dependent expressions, and a function used by the parser to accept only already known or built-in client - class names in client class membership expressions. This closure defaults + class names in client class membership expressions. This function defaults to accept all client class names. Internally, the parser code is generated by flex and bison. These two diff --git a/src/lib/eval/eval_context.h b/src/lib/eval/eval_context.h index 7690db1504..dac140510d 100644 --- a/src/lib/eval/eval_context.h +++ b/src/lib/eval/eval_context.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -41,17 +41,19 @@ public: PARSER_STRING ///< expression is expected to evaluate to string } ParserType; + /// @brief Type of the check known function. + typedef std::function CheckKnown; /// @brief Default constructor. /// /// @param option_universe Option universe: DHCPv4 or DHCPv6. This is used /// by the parser to determine which option definitions set should be used /// to map option names to option codes. - /// @param check_known A closure called to check if a client class + /// @param check_known A function called to check if a client class /// used for membership is already known. If it is not the parser /// will fail: only backward or built-in references are accepted. EvalContext(const Option::Universe& option_universe, - std::function check_known = acceptAll); + CheckKnown check_known = acceptAll); /// @brief destructor virtual ~EvalContext(); @@ -198,8 +200,8 @@ public: /// set should be used to map option name to option code. Option::Universe option_universe_; - /// @brief Closure to check if a client class is already known - std::function check_known_; + /// @brief Function to check if a client class is already known + CheckKnown check_known_; }; From c78317c046ef982c0267092ae9cad198aeeb9d78 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 6 Apr 2018 14:23:38 +0000 Subject: [PATCH 45/52] [trac5374] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 730 +++++++++++++++++----------------- src/bin/dhcp4/dhcp4_parser.cc | 6 +- src/bin/dhcp4/dhcp4_parser.h | 8 +- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 722 ++++++++++++++++----------------- src/bin/dhcp6/dhcp6_parser.cc | 6 +- src/bin/dhcp6/dhcp6_parser.h | 8 +- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 746 insertions(+), 746 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 281c4814b4..f491d88d04 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1328] = +static const flex_int16_t yy_accept[1327] = { 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 162, 160, 10, 11, 160, 1, 154, 151, 154, 154, @@ -845,9 +845,9 @@ static const flex_int16_t yy_accept[1328] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, - 0, 0, 0, 0, 0, 0, 0, 98, 76, 103, - 42, 0, 0, 0, 97, 0, 0, 0, 0, 0, - 0, 0, 65, 0, 0, 99, 0 + 0, 76, 0, 0, 0, 0, 0, 98, 103, 42, + 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 99, 0 } ; static const YY_CHAR yy_ec[256] = @@ -894,316 +894,316 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1340] = +static const flex_int16_t yy_base[1339] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1690, 1691, 32, 1686, 141, 0, 201, 1691, 206, 88, - 11, 213, 1691, 1668, 114, 25, 2, 6, 1691, 1691, - 73, 11, 17, 1691, 1691, 1691, 104, 1674, 1629, 0, - 1666, 107, 1681, 217, 247, 1691, 1625, 185, 1624, 1630, - 93, 58, 1622, 91, 211, 195, 14, 273, 195, 1621, - 181, 275, 202, 209, 1630, 66, 188, 1629, 232, 219, - 296, 284, 207, 1612, 78, 287, 324, 305, 1631, 0, - 339, 359, 367, 374, 379, 1691, 0, 1691, 301, 344, - 223, 295, 196, 336, 348, 210, 1691, 1628, 1667, 1691, + 1689, 1690, 32, 1685, 141, 0, 201, 1690, 206, 88, + 11, 213, 1690, 1667, 114, 25, 2, 6, 1690, 1690, + 73, 11, 17, 1690, 1690, 1690, 104, 1673, 1628, 0, + 1665, 107, 1680, 217, 247, 1690, 1624, 185, 1623, 1629, + 93, 58, 1621, 91, 211, 195, 14, 273, 195, 1620, + 181, 275, 202, 209, 1629, 66, 188, 1628, 232, 219, + 296, 284, 207, 1611, 78, 287, 324, 305, 1630, 0, + 339, 359, 367, 374, 379, 1690, 0, 1690, 301, 344, + 223, 295, 196, 336, 348, 210, 1690, 1627, 1666, 1690, - 322, 1691, 392, 1656, 330, 1614, 1624, 351, 366, 1619, - 363, 370, 372, 379, 241, 1662, 0, 443, 376, 1606, - 1608, 1604, 1612, 74, 1608, 1597, 1598, 89, 1614, 1597, - 1606, 1606, 366, 1597, 353, 1598, 358, 1643, 1647, 1589, - 1640, 1582, 1605, 1602, 1602, 1596, 352, 1589, 1582, 1587, - 1581, 381, 1592, 1585, 1576, 1575, 1589, 364, 1575, 382, - 1591, 266, 439, 1578, 413, 1589, 1586, 1587, 1585, 1567, - 1569, 402, 1561, 1578, 1570, 0, 389, 380, 331, 398, - 392, 414, 1569, 1691, 0, 1612, 431, 1559, 1562, 411, - 424, 1570, 438, 1613, 447, 1612, 446, 1611, 1691, 490, + 322, 1690, 392, 1655, 330, 1613, 1623, 351, 366, 1618, + 363, 370, 372, 379, 241, 1661, 0, 443, 376, 1605, + 1607, 1603, 1611, 74, 1607, 1596, 1597, 89, 1613, 1596, + 1605, 1605, 366, 1596, 353, 1597, 358, 1642, 1646, 1588, + 1639, 1581, 1604, 1601, 1601, 1595, 352, 1588, 1581, 1586, + 1580, 381, 1591, 1584, 1575, 1574, 1588, 364, 1574, 382, + 1590, 266, 439, 1577, 413, 1588, 1585, 1586, 1584, 1566, + 1568, 402, 1560, 1577, 1569, 0, 389, 380, 331, 398, + 392, 414, 1568, 1690, 0, 1611, 431, 1558, 1561, 411, + 424, 1569, 438, 1612, 447, 1611, 446, 1610, 1690, 490, - 1610, 456, 1571, 1551, 1567, 1564, 1563, 445, 1604, 1598, - 1564, 1543, 1551, 1546, 1560, 1556, 1544, 1556, 1556, 1547, - 1531, 1535, 1548, 1548, 1540, 1530, 1548, 1691, 1543, 1546, - 1527, 1526, 1576, 1525, 1535, 1538, 460, 1534, 1522, 1533, - 1569, 472, 1516, 1572, 1509, 1524, 482, 1514, 1530, 1511, - 1510, 1516, 1507, 1506, 1513, 1515, 1560, 1518, 1517, 1511, - 311, 1518, 1513, 1505, 1495, 1510, 1509, 1509, 1490, 1506, - 1492, 1498, 1505, 1493, 1486, 1500, 1541, 1502, 419, 1493, - 482, 1691, 1691, 484, 1691, 1691, 1480, 0, 466, 478, - 1482, 527, 485, 1536, 1489, 486, 1691, 1534, 1691, 1528, + 1609, 456, 1570, 1550, 1566, 1563, 1562, 445, 1603, 1597, + 1563, 1542, 1550, 1545, 1559, 1555, 1543, 1555, 1555, 1546, + 1530, 1534, 1547, 1547, 1539, 1529, 1547, 1690, 1542, 1545, + 1526, 1525, 1575, 1524, 1534, 1537, 460, 1533, 1521, 1532, + 1568, 472, 1515, 1571, 1508, 1523, 482, 1513, 1529, 1510, + 1509, 1515, 1506, 1505, 1512, 1514, 1559, 1517, 1516, 1510, + 311, 1517, 1512, 1504, 1494, 1509, 1508, 1508, 1489, 1505, + 1491, 1497, 1504, 1492, 1485, 1499, 1540, 1501, 419, 1492, + 482, 1690, 1690, 484, 1690, 1690, 1479, 0, 466, 478, + 1481, 527, 485, 1535, 1488, 486, 1690, 1533, 1690, 1527, - 538, 1691, 482, 1470, 1526, 1472, 1478, 1528, 1485, 479, - 1691, 1483, 1525, 1480, 1477, 533, 1483, 1521, 1515, 1470, - 1465, 1462, 1511, 1470, 1459, 1508, 1456, 518, 1470, 1455, - 1468, 1455, 1465, 1460, 1467, 1462, 1458, 495, 1456, 1459, - 1454, 1450, 1498, 508, 512, 1492, 1691, 1491, 1443, 1442, - 1441, 1434, 1436, 1440, 1429, 1442, 543, 1487, 1442, 1439, - 1443, 1691, 1441, 1430, 1430, 1442, 1424, 1416, 1417, 1438, - 1429, 1419, 1468, 1430, 1429, 1415, 1427, 1426, 1425, 1424, - 1465, 1464, 1691, 1408, 1407, 520, 1420, 1691, 1691, 1419, - 0, 1408, 1400, 531, 1405, 1456, 1455, 1413, 1453, 1691, + 538, 1690, 482, 1469, 1525, 1471, 1477, 1527, 1484, 479, + 1690, 1482, 1524, 1479, 1476, 533, 1482, 1520, 1514, 1469, + 1464, 1461, 1510, 1469, 1458, 1507, 1455, 518, 1469, 1454, + 1467, 1454, 1464, 1459, 1466, 1461, 1457, 495, 1455, 1458, + 1453, 1449, 1497, 508, 512, 1491, 1690, 1490, 1442, 1441, + 1440, 1433, 1435, 1439, 1428, 1441, 543, 1486, 1441, 1438, + 1442, 1690, 1440, 1429, 1429, 1441, 1423, 1415, 1416, 1437, + 1428, 1418, 1467, 1429, 1428, 1414, 1426, 1425, 1424, 1423, + 1464, 1463, 1690, 1407, 1406, 520, 1419, 1690, 1690, 1418, + 0, 1407, 1399, 531, 1404, 1455, 1454, 1412, 1452, 1690, - 1401, 1451, 1691, 538, 592, 532, 1450, 1406, 1402, 1390, - 1691, 1406, 1405, 1392, 1391, 1691, 1393, 1390, 527, 1388, - 1390, 1691, 1398, 1395, 1380, 1393, 1388, 565, 1395, 1377, - 1426, 1691, 1375, 1391, 1423, 1386, 1383, 1384, 1386, 1418, - 1371, 1366, 1365, 1414, 1360, 1375, 1353, 1360, 1365, 1413, - 1691, 1360, 1356, 1410, 1353, 1362, 1356, 1363, 1347, 1347, - 1357, 1360, 1349, 1344, 1691, 1399, 1691, 1343, 1354, 1391, - 1338, 1343, 1352, 1346, 1350, 1390, 1384, 1348, 1332, 1327, - 1347, 1329, 1328, 1336, 1340, 1323, 1379, 1321, 1691, 1691, - 1326, 1324, 1691, 1335, 1369, 1331, 0, 1315, 1332, 1370, + 1400, 1450, 1690, 538, 592, 532, 1449, 1405, 1401, 1389, + 1690, 1405, 1404, 1391, 1390, 1690, 1392, 1389, 527, 1387, + 1389, 1690, 1397, 1394, 1379, 1392, 1387, 565, 1394, 1376, + 1425, 1690, 1374, 1390, 1422, 1385, 1382, 1383, 1385, 1417, + 1370, 1365, 1364, 1413, 1359, 1374, 1352, 1359, 1364, 1412, + 1690, 1359, 1355, 1409, 1352, 1361, 1355, 1362, 1346, 1346, + 1356, 1359, 1348, 1343, 1690, 1398, 1690, 1342, 1353, 1390, + 1337, 1342, 1351, 1345, 1349, 1389, 1383, 1347, 1331, 1326, + 1346, 1328, 1327, 1335, 1339, 1322, 1378, 1320, 1690, 1690, + 1325, 1323, 1690, 1334, 1368, 1330, 0, 1314, 1331, 1369, - 1320, 1691, 1691, 1317, 1691, 1323, 1691, 538, 539, 592, - 1691, 1320, 1308, 1359, 1306, 1305, 1312, 1305, 1317, 1316, - 1316, 1304, 1345, 1312, 1304, 1347, 1293, 1309, 1308, 1691, - 1293, 1290, 1304, 1296, 1302, 1293, 1301, 1286, 1302, 1284, - 1298, 1296, 1279, 1273, 1278, 1293, 1290, 1291, 1288, 1329, - 1286, 1691, 1272, 1274, 1691, 1283, 1281, 1318, 1317, 1270, - 582, 1279, 1262, 1263, 1260, 1691, 1274, 1253, 1274, 1271, - 1263, 1306, 1260, 1304, 1691, 1251, 1265, 1264, 1267, 1248, - 1298, 1297, 1244, 1295, 1294, 1691, 14, 1256, 1239, 1244, - 1246, 1691, 1252, 1242, 1691, 1287, 1235, 1290, 546, 553, + 1319, 1690, 1690, 1316, 1690, 1322, 1690, 538, 539, 592, + 1690, 1319, 1307, 1358, 1305, 1304, 1311, 1304, 1316, 1315, + 1315, 1303, 1344, 1311, 1303, 1346, 1292, 1308, 1307, 1690, + 1292, 1289, 1303, 1295, 1301, 1292, 1300, 1285, 1301, 1283, + 1297, 1295, 1278, 1272, 1277, 1292, 1289, 1290, 1287, 1328, + 1285, 1690, 1271, 1273, 1690, 1282, 1280, 1317, 1316, 1269, + 582, 1278, 1261, 1262, 1259, 1690, 1273, 1252, 1273, 1270, + 1262, 1305, 1259, 1303, 1690, 1250, 1264, 1263, 1266, 1247, + 1297, 1296, 1243, 1294, 1293, 1690, 14, 1255, 1238, 1243, + 1245, 1690, 1251, 1241, 1690, 1286, 1234, 1289, 546, 553, - 540, 1240, 1283, 558, 1282, 1281, 1280, 1234, 1224, 1277, - 1230, 1240, 1274, 1237, 1231, 1218, 1226, 1269, 1273, 1230, - 1229, 1230, 1223, 1212, 1225, 1228, 1223, 1224, 1221, 1220, - 1223, 1218, 1259, 1258, 1208, 1198, 1206, 1254, 1691, 1253, - 1202, 1194, 1195, 1244, 1207, 1194, 1205, 1691, 1193, 1202, - 1201, 1201, 1241, 1184, 1193, 1186, 1197, 1174, 1178, 1229, - 1176, 1186, 1226, 1189, 1172, 1223, 560, 569, 1165, 1175, - 566, 1691, 1225, 1183, 1166, 1171, 1175, 1165, 1177, 1180, - 1217, 1691, 1211, 565, 1164, 1172, 1171, 1166, 1162, 1169, - 1152, 1155, 1151, 1168, 1163, 1151, 1147, 1154, 1148, 1200, + 540, 1239, 1282, 558, 1281, 1280, 1279, 1233, 1223, 1276, + 1229, 1239, 1273, 1236, 1230, 1217, 1225, 1268, 1272, 1229, + 1228, 1229, 1222, 1211, 1224, 1227, 1222, 1223, 1220, 1219, + 1222, 1217, 1258, 1257, 1207, 1197, 1205, 1253, 1690, 1252, + 1201, 1193, 1194, 1243, 1206, 1193, 1204, 1690, 1192, 1201, + 1200, 1200, 1240, 1183, 1192, 1185, 1196, 1173, 1177, 1228, + 1175, 1185, 1225, 1224, 1171, 1222, 560, 569, 1164, 1174, + 566, 1690, 1224, 1182, 1165, 1170, 1174, 1164, 1176, 1179, + 1216, 1690, 1210, 565, 1163, 1171, 1170, 1165, 1161, 1168, + 1151, 1154, 1150, 1167, 1162, 1150, 1146, 1153, 1147, 1199, - 1157, 1145, 1159, 1147, 1691, 1155, 1153, 1144, 1153, 1149, - 1190, 1132, 1132, 1145, 1130, 2, 5, 77, 1691, 1691, - 185, 240, 276, 1691, 1691, 317, 421, 417, 497, 578, - 519, 568, 531, 580, 550, 618, 1691, 570, 574, 576, - 570, 628, 583, 579, 575, 588, 599, 635, 595, 596, - 590, 592, 593, 593, 595, 648, 607, 612, 589, 1691, - 647, 607, 597, 612, 613, 600, 614, 1691, 633, 641, + 1156, 1144, 1158, 1146, 1690, 1154, 1152, 1143, 1152, 1148, + 1189, 1131, 1131, 1144, 1129, 2, 5, 77, 1690, 1690, + 185, 240, 276, 1690, 1690, 317, 421, 417, 497, 578, + 519, 568, 531, 580, 550, 618, 1690, 570, 574, 576, + 570, 628, 583, 579, 575, 588, 599, 600, 595, 596, + 590, 592, 593, 593, 595, 648, 607, 612, 589, 1690, + 647, 607, 597, 612, 613, 600, 614, 1690, 633, 641, 621, 611, 658, 623, 627, 666, 621, 616, 617, 613, - 622, 617, 673, 632, 623, 1691, 625, 636, 621, 637, - 631, 676, 644, 629, 630, 1691, 649, 632, 689, 634, + 622, 617, 673, 632, 623, 1690, 625, 636, 621, 637, + 631, 676, 644, 629, 630, 1690, 649, 632, 689, 634, - 1691, 653, 633, 651, 690, 650, 640, 658, 657, 658, - 644, 659, 651, 658, 648, 666, 651, 1691, 659, 665, - 660, 711, 1691, 662, 667, 661, 673, 667, 678, 667, - 669, 721, 667, 667, 724, 670, 1691, 669, 677, 675, + 1690, 653, 633, 651, 690, 650, 640, 658, 657, 658, + 644, 659, 651, 658, 648, 666, 651, 1690, 659, 665, + 660, 711, 1690, 662, 667, 661, 673, 667, 669, 667, + 669, 721, 667, 667, 724, 670, 1690, 669, 677, 675, 674, 679, 689, 690, 695, 734, 693, 709, 714, 688, - 698, 689, 741, 686, 1691, 693, 698, 706, 747, 748, - 697, 1691, 693, 696, 695, 715, 712, 717, 718, 704, - 712, 721, 701, 722, 762, 1691, 717, 766, 767, 729, + 698, 689, 741, 686, 1690, 693, 698, 706, 747, 748, + 697, 1690, 693, 696, 695, 715, 712, 717, 718, 704, + 712, 721, 701, 722, 762, 1690, 717, 766, 767, 729, 731, 719, 716, 723, 774, 723, 721, 723, 740, 779, - 731, 730, 736, 734, 732, 785, 786, 782, 742, 1691, + 731, 730, 736, 734, 732, 785, 786, 782, 742, 1690, - 747, 740, 749, 737, 747, 745, 744, 757, 1691, 740, - 741, 1691, 742, 740, 759, 760, 761, 760, 744, 749, - 767, 1691, 757, 790, 781, 753, 812, 775, 1691, 758, - 773, 765, 769, 1691, 1691, 779, 814, 763, 816, 765, - 823, 768, 779, 771, 777, 773, 791, 792, 1691, 790, - 1691, 793, 1691, 796, 786, 779, 791, 834, 1691, 791, - 841, 784, 843, 1691, 844, 788, 794, 801, 843, 1691, - 1691, 793, 793, 796, 810, 797, 854, 813, 810, 852, + 747, 740, 749, 737, 747, 748, 744, 757, 1690, 740, + 741, 1690, 742, 740, 759, 760, 761, 760, 744, 749, + 767, 1690, 757, 790, 781, 753, 812, 775, 1690, 758, + 773, 765, 769, 1690, 1690, 779, 814, 763, 816, 765, + 823, 768, 779, 771, 777, 773, 791, 792, 1690, 790, + 1690, 793, 1690, 796, 786, 779, 791, 834, 1690, 791, + 841, 784, 843, 1690, 844, 788, 794, 801, 843, 1690, + 1690, 793, 793, 796, 810, 797, 854, 813, 814, 852, 806, 859, 809, 861, 810, 863, 864, 825, 866, 810, - 822, 827, 813, 843, 872, 832, 1691, 824, 875, 824, + 822, 827, 813, 843, 872, 832, 1690, 824, 875, 824, - 820, 836, 841, 823, 881, 836, 841, 1691, 842, 835, + 820, 836, 841, 823, 881, 836, 841, 1690, 842, 835, 844, 845, 842, 832, 834, 891, 840, 837, 894, 890, - 833, 848, 898, 1691, 854, 1691, 1691, 859, 851, 861, - 846, 848, 907, 909, 855, 911, 1691, 861, 871, 864, - 915, 858, 1691, 880, 1691, 864, 1691, 1691, 871, 1691, - 921, 872, 923, 924, 906, 1691, 884, 885, 1691, 873, - 872, 875, 875, 876, 872, 1691, 894, 880, 881, 896, - 896, 899, 899, 896, 901, 1691, 893, 903, 1691, 900, - 905, 907, 904, 1691, 896, 897, 897, 903, 902, 913, - 1691, 1691, 952, 1691, 901, 908, 908, 1691, 910, 912, + 833, 848, 898, 1690, 854, 1690, 1690, 859, 851, 861, + 846, 848, 907, 909, 855, 911, 1690, 861, 862, 864, + 915, 858, 1690, 880, 1690, 864, 1690, 1690, 871, 1690, + 921, 872, 923, 924, 906, 1690, 884, 885, 1690, 873, + 872, 875, 875, 876, 872, 1690, 894, 880, 881, 896, + 896, 899, 899, 896, 901, 1690, 893, 903, 1690, 900, + 905, 907, 904, 1690, 896, 897, 897, 903, 902, 913, + 1690, 1690, 952, 1690, 901, 902, 908, 1690, 910, 912, - 915, 926, 1691, 923, 1691, 920, 1691, 943, 963, 969, + 915, 926, 1690, 923, 1690, 920, 1690, 943, 963, 969, 970, 914, 972, 973, 928, 922, 976, 977, 973, 938, 934, 976, 926, 931, 984, 942, 986, 946, 988, 951, - 940, 949, 949, 993, 938, 955, 954, 938, 994, 943, - 960, 961, 961, 948, 959, 1006, 966, 979, 966, 1691, - 1691, 1010, 1691, 1691, 959, 970, 1691, 1691, 960, 1009, - 954, 959, 1017, 967, 1691, 973, 1691, 1020, 1691, 965, - 980, 982, 986, 1691, 1020, 988, 981, 990, 978, 1025, - 989, 1032, 1033, 1034, 985, 1691, 1037, 1038, 985, 1691, - 989, 1041, 987, 986, 1044, 999, 1691, 1041, 1003, 1691, + 940, 949, 949, 993, 938, 955, 954, 938, 994, 995, + 960, 961, 961, 948, 959, 1006, 966, 979, 966, 1690, + 1690, 1010, 1690, 1690, 959, 970, 1690, 1690, 960, 1009, + 954, 959, 1017, 967, 1690, 973, 1690, 1020, 1690, 965, + 980, 982, 986, 1690, 1020, 988, 981, 990, 978, 990, + 989, 1032, 1033, 1034, 985, 1690, 1037, 1038, 985, 1690, + 989, 1041, 987, 986, 1044, 999, 1690, 1041, 1003, 1690, - 1006, 1049, 1050, 1011, 994, 996, 993, 1009, 1018, 1017, - 1058, 1691, 1691, 1691, 1054, 1691, 1691, 1019, 1056, 1691, - 1010, 1017, 1691, 1014, 1019, 1066, 1011, 1691, 1691, 1026, - 1016, 1028, 1071, 1015, 1023, 1025, 1691, 1035, 1025, 1024, - 1038, 1029, 1038, 1040, 1691, 1082, 1083, 1043, 1085, 1691, - 1081, 1045, 1050, 1027, 1090, 1049, 1050, 1051, 1094, 1053, - 1691, 1691, 1058, 1691, 1040, 1098, 1043, 1060, 1691, 1046, - 1046, 1048, 1691, 1053, 1048, 1060, 1691, 1051, 1059, 1063, - 1054, 1106, 1055, 1071, 1064, 1073, 1074, 1065, 1072, 1059, - 1074, 1121, 1080, 1067, 1068, 1084, 1075, 1089, 1085, 1691, + 1006, 1049, 1050, 1011, 994, 996, 993, 1009, 1018, 1008, + 1058, 1690, 1690, 1690, 1054, 1690, 1690, 1019, 1056, 1690, + 1010, 1017, 1690, 1014, 1019, 1066, 1011, 1690, 1690, 1026, + 1016, 1028, 1071, 1015, 1023, 1036, 1690, 1035, 1025, 1024, + 1038, 1029, 1038, 1040, 1690, 1082, 1083, 1043, 1085, 1690, + 1081, 1045, 1032, 1027, 1090, 1049, 1050, 1051, 1094, 1053, + 1690, 1690, 1058, 1690, 1040, 1098, 1043, 1060, 1690, 1046, + 1046, 1048, 1690, 1053, 1048, 1060, 1690, 1065, 1059, 1063, + 1054, 1106, 1055, 1071, 1064, 1059, 1074, 1065, 1072, 1059, + 1074, 1121, 1080, 1123, 1068, 1084, 1075, 1089, 1085, 1690, - 1129, 1130, 1131, 1132, 1089, 1088, 1089, 1691, 1691, 1691, - 1691, 1136, 1080, 1096, 1691, 1134, 1085, 1084, 1086, 1097, - 1144, 1095, 1691, 1104, 1147, 1691, 1691, 1153, 1158, 1163, - 1168, 1173, 1178, 1183, 1186, 1160, 1165, 1167, 1180 + 1129, 1690, 1130, 1131, 1088, 1087, 1088, 1690, 1690, 1690, + 1135, 1079, 1095, 1690, 1133, 1084, 1083, 1085, 1096, 1143, + 1094, 1690, 1103, 1146, 1690, 1690, 1152, 1157, 1162, 1167, + 1172, 1177, 1182, 1185, 1159, 1164, 1166, 1179 } ; -static const flex_int16_t yy_def[1340] = +static const flex_int16_t yy_def[1339] = { 0, - 1328, 1328, 1329, 1329, 1328, 1328, 1328, 1328, 1328, 1328, - 1327, 1327, 1327, 1327, 1327, 1330, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, - 1327, 1327, 1327, 1332, 15, 1327, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1333, 45, 45, + 1327, 1327, 1328, 1328, 1327, 1327, 1327, 1327, 1327, 1327, + 1326, 1326, 1326, 1326, 1326, 1329, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1330, + 1326, 1326, 1326, 1331, 15, 1326, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1332, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1330, - 1327, 1327, 1327, 1327, 1327, 1327, 1334, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, 1327, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1329, + 1326, 1326, 1326, 1326, 1326, 1326, 1333, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1330, 1326, - 1332, 1327, 1327, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1335, 45, 1333, 45, 45, + 1331, 1326, 1326, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1334, 45, 1332, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1334, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1336, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1335, 1327, 1333, + 45, 45, 45, 45, 45, 1333, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1335, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1334, 1326, 1332, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1337, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 1327, 45, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1336, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 1326, 45, - 1333, 1327, 45, 45, 45, 45, 45, 45, 45, 45, - 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1332, 1326, 45, 45, 45, 45, 45, 45, 45, 45, + 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1327, 45, 45, 45, 45, 1327, 1327, 1327, - 1338, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 45, 45, 1326, 45, 45, 45, 45, 1326, 1326, 1326, + 1337, 45, 45, 45, 45, 45, 45, 45, 45, 1326, - 45, 45, 1327, 45, 1333, 45, 45, 45, 45, 45, - 1327, 45, 45, 45, 45, 1327, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1326, 45, 1332, 45, 45, 45, 45, 45, + 1326, 45, 45, 45, 45, 1326, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1327, 45, 1327, 45, 45, 45, + 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1326, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1327, 1327, - 45, 45, 1327, 45, 45, 1327, 1339, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1326, 1326, + 45, 45, 1326, 45, 45, 1326, 1338, 45, 45, 45, - 45, 1327, 1327, 45, 1327, 45, 1327, 45, 45, 45, - 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 45, 1326, 1326, 45, 1326, 45, 1326, 45, 45, 45, + 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, - 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, - 45, 1327, 45, 45, 1327, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 1326, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, + 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, + 45, 1326, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, - 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1326, 45, + 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1327, 1327, - 45, 45, 45, 1327, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1326, 1326, + 45, 45, 45, 1326, 1326, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, - 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1326, + 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, - 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, - 45, 45, 1327, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, + 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1327, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, + 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1326, - 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 45, 45, 45, 45, 45, 45, 1327, 45, - 45, 45, 45, 1327, 1327, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1327, 45, - 1327, 45, 1327, 45, 45, 45, 45, 45, 1327, 45, - 45, 45, 45, 1327, 45, 45, 45, 45, 45, 1327, - 1327, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1326, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 45, 45, 45, 45, 1326, 45, + 45, 45, 45, 1326, 1326, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1326, 45, + 1326, 45, 1326, 45, 45, 45, 45, 45, 1326, 45, + 45, 45, 45, 1326, 45, 45, 45, 45, 45, 1326, + 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1327, 45, 1327, 1327, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, - 45, 45, 1327, 45, 1327, 45, 1327, 1327, 45, 1327, - 45, 45, 45, 45, 45, 1327, 45, 45, 1327, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 1327, 45, - 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, - 1327, 1327, 45, 1327, 45, 45, 45, 1327, 45, 45, + 45, 45, 45, 1326, 45, 1326, 1326, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, + 45, 45, 1326, 45, 1326, 45, 1326, 1326, 45, 1326, + 45, 45, 45, 45, 45, 1326, 45, 45, 1326, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 1326, 45, + 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, + 1326, 1326, 45, 1326, 45, 45, 45, 1326, 45, 45, - 45, 45, 1327, 45, 1327, 45, 1327, 45, 45, 45, + 45, 45, 1326, 45, 1326, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, - 1327, 45, 1327, 1327, 45, 45, 1327, 1327, 45, 45, - 45, 45, 45, 45, 1327, 45, 1327, 45, 1327, 45, - 45, 45, 45, 1327, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1327, 45, 45, 45, 1327, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 1327, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1326, + 1326, 45, 1326, 1326, 45, 45, 1326, 1326, 45, 45, + 45, 45, 45, 45, 1326, 45, 1326, 45, 1326, 45, + 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1326, 45, 45, 45, 1326, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1327, 1327, 1327, 45, 1327, 1327, 45, 45, 1327, - 45, 45, 1327, 45, 45, 45, 45, 1327, 1327, 45, - 45, 45, 45, 45, 45, 45, 1327, 45, 45, 45, - 45, 45, 45, 45, 1327, 45, 45, 45, 45, 1327, + 45, 1326, 1326, 1326, 45, 1326, 1326, 45, 45, 1326, + 45, 45, 1326, 45, 45, 45, 45, 1326, 1326, 45, + 45, 45, 45, 45, 45, 45, 1326, 45, 45, 45, + 45, 45, 45, 45, 1326, 45, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1327, 1327, 45, 1327, 45, 45, 45, 45, 1327, 45, - 45, 45, 1327, 45, 45, 45, 1327, 45, 45, 45, + 1326, 1326, 45, 1326, 45, 45, 45, 45, 1326, 45, + 45, 45, 1326, 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1327, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1326, - 45, 45, 45, 45, 45, 45, 45, 1327, 1327, 1327, - 1327, 45, 45, 45, 1327, 45, 45, 45, 45, 45, - 45, 45, 1327, 45, 45, 1327, 0, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327 + 45, 1326, 45, 45, 45, 45, 45, 1326, 1326, 1326, + 45, 45, 45, 1326, 45, 45, 45, 45, 45, 45, + 45, 1326, 45, 45, 1326, 0, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326 } ; -static const flex_int16_t yy_nxt[1763] = +static const flex_int16_t yy_nxt[1762] = { 0, - 1327, 13, 14, 13, 1327, 15, 16, 801, 17, 18, + 1326, 13, 14, 13, 1326, 15, 16, 801, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 86, 672, - 37, 14, 37, 87, 25, 26, 38, 1327, 673, 27, + 37, 14, 37, 87, 25, 26, 38, 1326, 673, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, - 13, 14, 13, 13, 14, 13, 32, 40, 1327, 13, + 13, 14, 13, 13, 14, 13, 32, 40, 1326, 13, 14, 13, 33, 40, 115, 92, 93, 802, 91, 34, 35, 13, 14, 13, 95, 15, 16, 96, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, @@ -1324,77 +1324,77 @@ static const flex_int16_t yy_nxt[1763] = 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, - 1324, 1325, 1326, 12, 12, 12, 12, 12, 36, 36, - 36, 36, 36, 80, 288, 80, 80, 80, 99, 391, - 99, 497, 99, 101, 101, 101, 101, 101, 116, 116, - 116, 116, 116, 176, 101, 176, 176, 176, 198, 198, - 198, 800, 799, 798, 797, 796, 795, 794, 793, 792, + 1324, 1325, 12, 12, 12, 12, 12, 36, 36, 36, + 36, 36, 80, 288, 80, 80, 80, 99, 391, 99, + 497, 99, 101, 101, 101, 101, 101, 116, 116, 116, + 116, 116, 176, 101, 176, 176, 176, 198, 198, 198, + 800, 799, 798, 797, 796, 795, 794, 793, 792, 791, - 791, 790, 789, 788, 787, 786, 785, 784, 783, 782, - 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, - 771, 769, 768, 767, 766, 765, 764, 763, 762, 761, - 760, 757, 756, 750, 749, 748, 747, 746, 745, 744, - 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, - 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, - 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, - 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, - 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, - 693, 692, 691, 688, 687, 682, 681, 680, 679, 678, + 790, 789, 788, 787, 786, 785, 784, 783, 782, 781, + 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, + 769, 768, 767, 766, 765, 764, 763, 762, 761, 760, + 757, 756, 750, 749, 748, 747, 746, 745, 744, 743, + 742, 741, 740, 739, 738, 737, 736, 735, 734, 733, + 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, + 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, + 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, + 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, + 692, 691, 688, 687, 682, 681, 680, 679, 678, 677, - 677, 676, 675, 674, 671, 670, 669, 668, 667, 666, - 665, 664, 663, 662, 661, 660, 659, 658, 657, 656, - 655, 654, 653, 652, 651, 650, 647, 646, 645, 644, - 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, - 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, - 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, - 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, - 603, 602, 598, 597, 596, 595, 594, 593, 592, 591, - 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, - 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, + 676, 675, 674, 671, 670, 669, 668, 667, 666, 665, + 664, 663, 662, 661, 660, 659, 658, 657, 656, 655, + 654, 653, 652, 651, 650, 647, 646, 645, 644, 643, + 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, + 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, + 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, + 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, + 602, 598, 597, 596, 595, 594, 593, 592, 591, 590, + 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, + 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, - 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, - 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, - 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, - 540, 539, 538, 537, 536, 535, 534, 533, 532, 529, - 528, 527, 526, 525, 524, 523, 520, 519, 518, 517, - 516, 515, 514, 513, 512, 511, 507, 506, 505, 504, - 503, 502, 501, 499, 498, 496, 495, 492, 491, 490, - 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, - 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, - 469, 468, 467, 464, 463, 462, 461, 460, 459, 458, + 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, + 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, + 549, 548, 547, 546, 545, 544, 543, 542, 541, 540, + 539, 538, 537, 536, 535, 534, 533, 532, 529, 528, + 527, 526, 525, 524, 523, 520, 519, 518, 517, 516, + 515, 514, 513, 512, 511, 507, 506, 505, 504, 503, + 502, 501, 499, 498, 496, 495, 492, 491, 490, 489, + 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, + 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, + 468, 467, 464, 463, 462, 461, 460, 459, 458, 457, - 457, 456, 455, 451, 450, 449, 448, 447, 444, 443, - 442, 441, 440, 439, 438, 437, 436, 431, 430, 429, - 428, 427, 426, 425, 424, 423, 422, 421, 418, 417, - 416, 415, 412, 411, 410, 409, 408, 407, 404, 403, - 401, 400, 395, 390, 387, 384, 383, 382, 381, 380, - 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, - 369, 368, 365, 364, 363, 362, 361, 360, 359, 358, - 357, 356, 355, 354, 353, 349, 348, 347, 346, 344, - 343, 342, 341, 337, 336, 335, 334, 333, 332, 331, - 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, + 456, 455, 451, 450, 449, 448, 447, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 431, 430, 429, 428, + 427, 426, 425, 424, 423, 422, 421, 418, 417, 416, + 415, 412, 411, 410, 409, 408, 407, 404, 403, 401, + 400, 395, 390, 387, 384, 383, 382, 381, 380, 379, + 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, + 368, 365, 364, 363, 362, 361, 360, 359, 358, 357, + 356, 355, 354, 353, 349, 348, 347, 346, 344, 343, + 342, 341, 337, 336, 335, 334, 333, 332, 331, 330, + 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, - 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, - 308, 307, 306, 305, 304, 302, 199, 299, 297, 295, - 292, 291, 289, 287, 280, 279, 278, 276, 275, 274, - 273, 272, 271, 267, 255, 251, 248, 247, 246, 245, - 244, 241, 240, 239, 238, 235, 234, 233, 232, 231, - 230, 229, 228, 227, 223, 220, 217, 216, 215, 214, - 211, 210, 209, 206, 205, 204, 203, 199, 192, 189, - 188, 186, 184, 183, 175, 161, 142, 136, 121, 110, - 107, 106, 104, 43, 100, 98, 97, 88, 43, 1327, - 11, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 319, 318, 317, 316, 315, 314, 313, 312, 311, 308, + 307, 306, 305, 304, 302, 199, 299, 297, 295, 292, + 291, 289, 287, 280, 279, 278, 276, 275, 274, 273, + 272, 271, 267, 255, 251, 248, 247, 246, 245, 244, + 241, 240, 239, 238, 235, 234, 233, 232, 231, 230, + 229, 228, 227, 223, 220, 217, 216, 215, 214, 211, + 210, 209, 206, 205, 204, 203, 199, 192, 189, 188, + 186, 184, 183, 175, 161, 142, 136, 121, 110, 107, + 106, 104, 43, 100, 98, 97, 88, 43, 1326, 11, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327 + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326 } ; -static const flex_int16_t yy_chk[1763] = +static const flex_int16_t yy_chk[1762] = { 0, 0, 1, 1, 1, 0, 1, 1, 716, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 587, @@ -1520,76 +1520,76 @@ static const flex_int16_t yy_chk[1763] = 1260, 1263, 1265, 1266, 1267, 1268, 1270, 1271, 1272, 1274, 1275, 1276, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, - 1296, 1297, 1298, 1299, 1301, 1302, 1303, 1304, 1305, 1306, - 1307, 1312, 1313, 1314, 1316, 1317, 1318, 1319, 1320, 1321, - 1322, 1324, 1325, 1328, 1328, 1328, 1328, 1328, 1329, 1329, - 1329, 1329, 1329, 1330, 1336, 1330, 1330, 1330, 1331, 1337, - 1331, 1338, 1331, 1332, 1332, 1332, 1332, 1332, 1333, 1333, - 1333, 1333, 1333, 1334, 1339, 1334, 1334, 1334, 1335, 1335, - 1335, 715, 714, 713, 712, 711, 710, 709, 708, 707, + 1296, 1297, 1298, 1299, 1301, 1303, 1304, 1305, 1306, 1307, + 1311, 1312, 1313, 1315, 1316, 1317, 1318, 1319, 1320, 1321, + 1323, 1324, 1327, 1327, 1327, 1327, 1327, 1328, 1328, 1328, + 1328, 1328, 1329, 1335, 1329, 1329, 1329, 1330, 1336, 1330, + 1337, 1330, 1331, 1331, 1331, 1331, 1331, 1332, 1332, 1332, + 1332, 1332, 1333, 1338, 1333, 1333, 1333, 1334, 1334, 1334, + 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, - 706, 704, 703, 702, 701, 700, 699, 698, 697, 696, - 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, - 685, 683, 681, 680, 679, 678, 677, 676, 675, 674, - 673, 670, 669, 666, 665, 664, 663, 662, 661, 660, - 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, - 649, 647, 646, 645, 644, 643, 642, 641, 640, 638, - 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, - 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, - 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, - 607, 606, 605, 603, 602, 598, 597, 596, 594, 593, + 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, + 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, + 683, 681, 680, 679, 678, 677, 676, 675, 674, 673, + 670, 669, 666, 665, 664, 663, 662, 661, 660, 659, + 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, + 647, 646, 645, 644, 643, 642, 641, 640, 638, 637, + 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, + 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, + 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, + 606, 605, 603, 602, 598, 597, 596, 594, 593, 591, - 591, 590, 589, 588, 585, 584, 583, 582, 581, 580, - 579, 578, 577, 576, 574, 573, 572, 571, 570, 569, - 568, 567, 565, 564, 563, 562, 560, 559, 558, 557, - 556, 554, 553, 551, 550, 549, 548, 547, 546, 545, - 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, - 534, 533, 532, 531, 529, 528, 527, 526, 525, 524, - 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, - 513, 512, 506, 504, 501, 500, 499, 498, 496, 495, - 494, 492, 491, 488, 487, 486, 485, 484, 483, 482, - 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, + 590, 589, 588, 585, 584, 583, 582, 581, 580, 579, + 578, 577, 576, 574, 573, 572, 571, 570, 569, 568, + 567, 565, 564, 563, 562, 560, 559, 558, 557, 556, + 554, 553, 551, 550, 549, 548, 547, 546, 545, 544, + 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, + 533, 532, 531, 529, 528, 527, 526, 525, 524, 523, + 522, 521, 520, 519, 518, 517, 516, 515, 514, 513, + 512, 506, 504, 501, 500, 499, 498, 496, 495, 494, + 492, 491, 488, 487, 486, 485, 484, 483, 482, 481, + 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, - 471, 470, 469, 468, 466, 464, 463, 462, 461, 460, - 459, 458, 457, 456, 455, 454, 453, 452, 450, 449, - 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, - 438, 437, 436, 435, 434, 433, 431, 430, 429, 427, - 426, 425, 424, 423, 421, 420, 418, 417, 415, 414, - 413, 412, 410, 409, 408, 407, 402, 401, 399, 398, - 397, 396, 395, 393, 392, 390, 387, 385, 384, 382, - 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, - 371, 370, 369, 368, 367, 366, 365, 364, 363, 361, - 360, 359, 358, 356, 355, 354, 353, 352, 351, 350, + 470, 469, 468, 466, 464, 463, 462, 461, 460, 459, + 458, 457, 456, 455, 454, 453, 452, 450, 449, 448, + 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, + 437, 436, 435, 434, 433, 431, 430, 429, 427, 426, + 425, 424, 423, 421, 420, 418, 417, 415, 414, 413, + 412, 410, 409, 408, 407, 402, 401, 399, 398, 397, + 396, 395, 393, 392, 390, 387, 385, 384, 382, 381, + 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, + 370, 369, 368, 367, 366, 365, 364, 363, 361, 360, + 359, 358, 356, 355, 354, 353, 352, 351, 350, 349, - 349, 348, 346, 343, 342, 341, 340, 339, 337, 336, - 335, 334, 333, 332, 331, 330, 329, 327, 326, 325, - 324, 323, 322, 321, 320, 319, 318, 317, 315, 314, - 313, 312, 309, 308, 307, 306, 305, 304, 300, 298, - 295, 294, 291, 287, 280, 278, 277, 276, 275, 274, - 273, 272, 271, 270, 269, 268, 267, 266, 265, 264, - 263, 262, 260, 259, 258, 257, 256, 255, 254, 253, - 252, 251, 250, 249, 248, 246, 245, 244, 243, 241, - 240, 239, 238, 236, 235, 234, 233, 232, 231, 230, - 229, 227, 226, 225, 224, 223, 222, 221, 220, 219, + 348, 346, 343, 342, 341, 340, 339, 337, 336, 335, + 334, 333, 332, 331, 330, 329, 327, 326, 325, 324, + 323, 322, 321, 320, 319, 318, 317, 315, 314, 313, + 312, 309, 308, 307, 306, 305, 304, 300, 298, 295, + 294, 291, 287, 280, 278, 277, 276, 275, 274, 273, + 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, + 262, 260, 259, 258, 257, 256, 255, 254, 253, 252, + 251, 250, 249, 248, 246, 245, 244, 243, 241, 240, + 239, 238, 236, 235, 234, 233, 232, 231, 230, 229, + 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, - 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, - 207, 206, 205, 204, 203, 201, 198, 196, 194, 192, - 189, 188, 186, 183, 175, 174, 173, 171, 170, 169, - 168, 167, 166, 164, 161, 159, 157, 156, 155, 154, - 153, 151, 150, 149, 148, 146, 145, 144, 143, 142, - 141, 140, 139, 138, 136, 134, 132, 131, 130, 129, - 127, 126, 125, 123, 122, 121, 120, 116, 110, 107, - 106, 104, 99, 98, 79, 74, 68, 65, 60, 53, - 50, 49, 47, 43, 41, 39, 38, 24, 14, 11, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, + 217, 216, 215, 214, 213, 212, 211, 210, 209, 207, + 206, 205, 204, 203, 201, 198, 196, 194, 192, 189, + 188, 186, 183, 175, 174, 173, 171, 170, 169, 168, + 167, 166, 164, 161, 159, 157, 156, 155, 154, 153, + 151, 150, 149, 148, 146, 145, 144, 143, 142, 141, + 140, 139, 138, 136, 134, 132, 131, 130, 129, 127, + 126, 125, 123, 122, 121, 120, 116, 110, 107, 106, + 104, 99, 98, 79, 74, 68, 65, 60, 53, 50, + 49, 47, 43, 41, 39, 38, 24, 14, 11, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327 + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, + 1326 } ; static yy_state_type yy_last_accepting_state; @@ -2051,13 +2051,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1328 ) + if ( yy_current_state >= 1327 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1327 ); + while ( yy_current_state != 1326 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2998,9 +2998,9 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: - return isc::dhcp::Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_REQUIRE_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("required-client-classes", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("require-client-classes", driver.loc_); } } YY_BREAK @@ -4408,7 +4408,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1328 ) + if ( yy_current_state >= 1327 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4441,11 +4441,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1328 ) + if ( yy_current_state >= 1327 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1327); + yy_is_jam = (yy_current_state == 1326); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index a92d7ad01a..b6fb5323a4 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -1863,7 +1863,7 @@ namespace isc { namespace dhcp { #line 985 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("required-client-classes", c); + ctx.stack_.back()->set("require-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } @@ -4213,7 +4213,7 @@ namespace isc { namespace dhcp { "\"subnet\"", "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"required-client-classes\"", "\"test\"", + "\"client-classes\"", "\"require-client-classes\"", "\"test\"", "\"only-if-required\"", "\"client-class\"", "\"reservations\"", "\"duid\"", "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", @@ -4270,7 +4270,7 @@ namespace isc { namespace dhcp { "sub_subnet4", "$@42", "subnet4_params", "subnet4_param", "subnet", "$@43", "subnet_4o6_interface", "$@44", "subnet_4o6_interface_id", "$@45", "subnet_4o6_subnet", "$@46", "interface", "$@47", "interface_id", - "$@48", "client_class", "$@49", "required_client_classes", "$@50", + "$@48", "client_class", "$@49", "require_client_classes", "$@50", "reservation_mode", "$@51", "hr_mode", "id", "rapid_commit", "shared_networks", "$@52", "shared_networks_content", "shared_networks_list", "shared_network", "$@53", diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index ce3ceae8af..5c714193ed 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -421,7 +421,7 @@ namespace isc { namespace dhcp { TOKEN_ALL = 328, TOKEN_HOST_RESERVATION_IDENTIFIERS = 329, TOKEN_CLIENT_CLASSES = 330, - TOKEN_REQUIRED_CLIENT_CLASSES = 331, + TOKEN_REQUIRE_CLIENT_CLASSES = 331, TOKEN_TEST = 332, TOKEN_ONLY_IF_REQUIRED = 333, TOKEN_CLIENT_CLASS = 334, @@ -909,7 +909,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_REQUIRED_CLIENT_CLASSES (const location_type& l); + make_REQUIRE_CLIENT_CLASSES (const location_type& l); static inline symbol_type @@ -2257,9 +2257,9 @@ namespace isc { namespace dhcp { } Dhcp4Parser::symbol_type - Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES (const location_type& l) + Dhcp4Parser::make_REQUIRE_CLIENT_CLASSES (const location_type& l) { - return symbol_type (token::TOKEN_REQUIRED_CLIENT_CLASSES, l); + return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, l); } Dhcp4Parser::symbol_type diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 85dd979f34..151cf81093 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201804052217 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 6cbc86a65e..ad49fa5f89 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201804052217 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index 3392eb1c97..8467d55e10 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804052217 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index 257468871a..1725a39a09 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -700,7 +700,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1309] = +static const flex_int16_t yy_accept[1308] = { 0, 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, 165, 163, 10, 11, 163, 1, 157, 154, 157, 157, @@ -842,10 +842,10 @@ static const flex_int16_t yy_accept[1309] = 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, - 0, 90, 0, 0, 0, 0, 0, 0, 132, 102, - 137, 61, 0, 0, 0, 131, 0, 0, 0, 0, + 0, 90, 102, 0, 0, 0, 0, 0, 132, 137, + 61, 0, 0, 0, 131, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 0, 0, 133, 0 + 0, 0, 91, 0, 0, 133, 0 } ; static const YY_CHAR yy_ec[256] = @@ -892,312 +892,312 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1321] = +static const flex_int16_t yy_base[1320] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1673, 1674, 32, 1669, 141, 0, 201, 1674, 206, 88, - 11, 213, 1674, 1651, 114, 25, 2, 6, 1674, 1674, - 73, 11, 17, 1674, 1674, 1674, 104, 1657, 1612, 0, - 1649, 107, 1664, 217, 241, 1674, 185, 1608, 1614, 1634, + 1672, 1673, 32, 1668, 141, 0, 201, 1673, 206, 88, + 11, 213, 1673, 1650, 114, 25, 2, 6, 1673, 1673, + 73, 11, 17, 1673, 1673, 1673, 104, 1656, 1611, 0, + 1648, 107, 1663, 217, 241, 1673, 185, 1607, 1613, 1633, 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 64, 231, 1615, 187, 75, 1614, 274, 188, 290, - 278, 297, 1597, 195, 298, 317, 324, 1616, 0, 345, - 352, 373, 380, 358, 1674, 0, 1674, 267, 295, 296, - 324, 283, 325, 346, 340, 1674, 1613, 1652, 1674, 384, + 269, 64, 231, 1614, 187, 75, 1613, 274, 188, 290, + 278, 297, 1596, 195, 298, 317, 324, 1615, 0, 345, + 352, 373, 380, 358, 1673, 0, 1673, 267, 295, 296, + 324, 283, 325, 346, 340, 1673, 1612, 1651, 1673, 384, - 1674, 385, 361, 1600, 1610, 1649, 368, 220, 249, 1604, - 366, 370, 371, 377, 304, 1647, 0, 436, 377, 1591, - 1599, 361, 1595, 1584, 1585, 365, 1601, 1584, 1593, 370, - 200, 373, 1587, 383, 1575, 1631, 406, 1578, 1629, 1571, - 1594, 1591, 1591, 1585, 272, 1578, 1571, 1576, 1570, 382, - 1581, 1574, 1565, 1564, 1578, 378, 1614, 1563, 405, 1575, - 1578, 1562, 433, 407, 1576, 1573, 1574, 1572, 1554, 1559, - 1555, 1547, 1564, 1556, 0, 435, 436, 428, 436, 444, - 446, 1555, 1674, 0, 465, 1546, 1549, 1674, 440, 457, - 1674, 1601, 1556, 464, 1599, 471, 1598, 470, 1597, 1674, + 1673, 385, 361, 1599, 1609, 1648, 368, 220, 249, 1603, + 366, 370, 371, 377, 304, 1646, 0, 436, 377, 1590, + 1598, 361, 1594, 1583, 1584, 365, 1600, 1583, 1592, 370, + 200, 373, 1586, 383, 1574, 1630, 406, 1577, 1628, 1570, + 1593, 1590, 1590, 1584, 272, 1577, 1570, 1575, 1569, 382, + 1580, 1573, 1564, 1563, 1577, 378, 1613, 1562, 405, 1574, + 1577, 1561, 433, 407, 1575, 1572, 1573, 1571, 1553, 1558, + 1554, 1546, 1563, 1555, 0, 435, 436, 428, 436, 444, + 446, 1554, 1673, 0, 465, 1545, 1548, 1673, 440, 457, + 1673, 1600, 1555, 464, 1598, 471, 1597, 470, 1596, 1673, - 514, 1596, 480, 1557, 1552, 1551, 447, 1592, 1586, 1552, - 1531, 1539, 1545, 1533, 1547, 1543, 1544, 1544, 1539, 1531, - 1533, 1517, 1521, 1534, 1534, 1526, 1516, 1519, 1533, 1674, - 1519, 1527, 1530, 1511, 1510, 1560, 1509, 1519, 1557, 492, - 1518, 1506, 1517, 1553, 483, 1557, 1494, 1509, 9, 1499, - 1515, 1496, 1498, 1494, 1500, 1491, 1490, 1503, 1496, 1498, - 1502, 1501, 1495, 80, 1502, 1497, 1489, 1479, 1494, 1494, - 1475, 1491, 1477, 1483, 1490, 1478, 1471, 1485, 1484, 1487, - 1469, 1477, 486, 1674, 1674, 493, 1674, 1674, 1464, 0, - 474, 1466, 491, 495, 1520, 1674, 1473, 472, 1674, 1518, + 514, 1595, 480, 1556, 1551, 1550, 447, 1591, 1585, 1551, + 1530, 1538, 1544, 1532, 1546, 1542, 1543, 1543, 1538, 1530, + 1532, 1516, 1520, 1533, 1533, 1525, 1515, 1518, 1532, 1673, + 1518, 1526, 1529, 1510, 1509, 1559, 1508, 1518, 1556, 492, + 1517, 1505, 1516, 1552, 483, 1556, 1493, 1508, 9, 1498, + 1514, 1495, 1497, 1493, 1499, 1490, 1489, 1502, 1495, 1497, + 1501, 1500, 1494, 80, 1501, 1496, 1488, 1478, 1493, 1493, + 1474, 1490, 1476, 1482, 1489, 1477, 1470, 1484, 1483, 1486, + 1468, 1476, 486, 1673, 1673, 493, 1673, 1673, 1463, 0, + 474, 1465, 491, 495, 1519, 1673, 1472, 472, 1673, 1517, - 1674, 1512, 550, 1674, 477, 1454, 1464, 1514, 1471, 488, - 1674, 1469, 1511, 1466, 1463, 1464, 402, 1468, 1506, 1456, - 1451, 1448, 1444, 1446, 1495, 1454, 1443, 1492, 1440, 544, - 1453, 1453, 1436, 1437, 1450, 1437, 1447, 1442, 1449, 1444, - 1429, 395, 1438, 1441, 1436, 1432, 1480, 497, 490, 1674, - 1474, 1426, 1425, 1418, 1420, 1424, 1413, 1420, 1425, 515, - 1470, 1425, 474, 1422, 1426, 1424, 1413, 1413, 1425, 1407, - 1399, 1400, 1421, 1412, 1402, 1414, 1413, 1399, 1411, 1410, - 1409, 1408, 1449, 1448, 1447, 1391, 541, 1404, 1674, 1674, - 1403, 0, 491, 1391, 1442, 1441, 1399, 1439, 1674, 1387, + 1673, 1511, 550, 1673, 477, 1453, 1463, 1513, 1470, 488, + 1673, 1468, 1510, 1465, 1462, 1463, 402, 1467, 1505, 1455, + 1450, 1447, 1443, 1445, 1494, 1453, 1442, 1491, 1439, 544, + 1452, 1452, 1435, 1436, 1449, 1436, 1446, 1441, 1448, 1443, + 1428, 395, 1437, 1440, 1435, 1431, 1479, 497, 490, 1673, + 1473, 1425, 1424, 1417, 1419, 1423, 1412, 1419, 1424, 515, + 1469, 1424, 474, 1421, 1425, 1423, 1412, 1412, 1424, 1406, + 1398, 1399, 1420, 1411, 1401, 1413, 1412, 1398, 1410, 1409, + 1408, 1407, 1448, 1447, 1446, 1390, 541, 1403, 1673, 1673, + 1402, 0, 491, 1390, 1441, 1440, 1398, 1438, 1673, 1386, - 1437, 1674, 548, 594, 549, 1436, 1378, 1674, 1394, 1393, - 1380, 1379, 1674, 1381, 1378, 1390, 1386, 1374, 1376, 1674, - 1382, 1367, 1369, 1380, 1378, 1373, 573, 1380, 1362, 1411, - 1674, 1360, 1376, 1408, 1412, 1370, 1364, 1366, 1367, 1369, - 1401, 1354, 1349, 1348, 1350, 1343, 1358, 1336, 1343, 1348, - 1396, 1674, 1343, 1339, 1393, 1346, 1340, 1347, 1332, 1342, - 1345, 1334, 1333, 1328, 1674, 1383, 1674, 1327, 1326, 1319, - 1336, 1373, 1320, 1325, 1334, 1328, 1332, 575, 1367, 1331, - 1315, 1310, 1313, 1312, 1320, 1324, 1307, 1363, 1305, 1674, - 1674, 1674, 1310, 1674, 1320, 1354, 1316, 0, 1357, 1307, + 1436, 1673, 548, 594, 549, 1435, 1377, 1673, 1393, 1392, + 1379, 1378, 1673, 1380, 1377, 1389, 1385, 1373, 1375, 1673, + 1381, 1366, 1368, 1379, 1377, 1372, 573, 1379, 1361, 1410, + 1673, 1359, 1375, 1407, 1411, 1369, 1363, 1365, 1366, 1368, + 1400, 1353, 1348, 1347, 1349, 1342, 1357, 1335, 1342, 1347, + 1395, 1673, 1342, 1338, 1392, 1345, 1339, 1346, 1331, 1341, + 1344, 1333, 1332, 1327, 1673, 1382, 1673, 1326, 1325, 1318, + 1335, 1372, 1319, 1324, 1333, 1327, 1331, 575, 1366, 1330, + 1314, 1309, 1312, 1311, 1319, 1323, 1306, 1362, 1304, 1673, + 1673, 1673, 1309, 1673, 1319, 1353, 1315, 0, 1356, 1306, - 1674, 1674, 1304, 1674, 1310, 1674, 486, 552, 576, 1674, - 1348, 1295, 1294, 1301, 1294, 1306, 1305, 1289, 1304, 1334, - 1301, 1337, 1283, 1285, 1297, 1297, 1296, 1674, 1281, 1278, - 1292, 1284, 1290, 1281, 1289, 1674, 1274, 1285, 1289, 1271, - 1285, 1283, 1266, 1260, 1265, 1262, 1277, 1278, 1275, 1316, - 1273, 1674, 1259, 1261, 1674, 1269, 1306, 1305, 561, 1268, - 1251, 1252, 1257, 1248, 1674, 1262, 1248, 582, 1240, 1261, - 1258, 1250, 1293, 1247, 1291, 1674, 1239, 1237, 1251, 1250, - 1253, 1285, 1284, 1231, 1282, 1281, 1674, 584, 1243, 1232, - 1234, 1674, 1674, 1277, 1225, 1280, 568, 543, 540, 1239, + 1673, 1673, 1303, 1673, 1309, 1673, 486, 552, 576, 1673, + 1347, 1294, 1293, 1300, 1293, 1305, 1304, 1288, 1303, 1333, + 1300, 1336, 1282, 1284, 1296, 1296, 1295, 1673, 1280, 1277, + 1291, 1283, 1289, 1280, 1288, 1673, 1273, 1284, 1288, 1270, + 1284, 1282, 1265, 1259, 1264, 1261, 1276, 1277, 1274, 1315, + 1272, 1673, 1258, 1260, 1673, 1268, 1305, 1304, 561, 1267, + 1250, 1251, 1256, 1247, 1673, 1261, 1247, 582, 1239, 1260, + 1257, 1249, 1292, 1246, 1290, 1673, 1238, 1236, 1250, 1249, + 1252, 1284, 1283, 1230, 1281, 1280, 1673, 584, 1242, 1231, + 1233, 1673, 1673, 1276, 1224, 1279, 568, 543, 540, 1238, - 1273, 1272, 1271, 1225, 1215, 1268, 1230, 1220, 1265, 1228, - 1210, 1218, 1220, 1224, 1259, 1263, 1220, 1219, 1220, 1213, - 1202, 1215, 1218, 1213, 1208, 1213, 1210, 1209, 1212, 1207, - 1248, 1247, 1191, 1187, 1195, 1243, 1674, 1242, 1191, 1183, - 1234, 1197, 1184, 1674, 1184, 1193, 1192, 1192, 1176, 1231, - 1174, 1187, 1674, 1179, 1171, 1180, 1173, 1184, 1161, 1165, - 1216, 1163, 1161, 1172, 1212, 1175, 1158, 562, 570, 1152, - 1162, 569, 1674, 1212, 1170, 1159, 1163, 1170, 1207, 1674, - 1201, 589, 1154, 1162, 1154, 1145, 1148, 1144, 1161, 1156, - 1144, 1155, 1139, 1141, 1193, 1139, 1153, 1134, 1184, 1139, + 1272, 1271, 1270, 1224, 1214, 1267, 1229, 1219, 1264, 1227, + 1209, 1217, 1219, 1223, 1258, 1262, 1219, 1218, 1219, 1212, + 1201, 1214, 1217, 1212, 1207, 1212, 1209, 1208, 1211, 1206, + 1247, 1246, 1190, 1186, 1194, 1242, 1673, 1241, 1190, 1182, + 1233, 1196, 1183, 1673, 1183, 1192, 1191, 1191, 1175, 1230, + 1173, 1186, 1673, 1178, 1170, 1179, 1172, 1183, 1160, 1164, + 1215, 1162, 1160, 1171, 1211, 1210, 1157, 562, 570, 1151, + 1161, 569, 1673, 1211, 1169, 1158, 1162, 1169, 1206, 1673, + 1200, 589, 1153, 1161, 1153, 1144, 1147, 1143, 1160, 1155, + 1143, 1154, 1138, 1140, 1192, 1138, 1152, 1133, 1183, 1138, - 1674, 1147, 1145, 1136, 1145, 1141, 1182, 1124, 1124, 1137, - 1136, 1121, 1176, 1118, 1119, 1674, 1674, 1133, 1130, 1133, - 1674, 1674, 1132, 1117, 63, 580, 68, 182, 249, 202, - 308, 416, 1674, 364, 428, 500, 563, 513, 533, 549, - 619, 575, 570, 566, 576, 580, 591, 633, 593, 587, - 589, 601, 591, 644, 604, 609, 586, 1674, 644, 593, - 608, 608, 1674, 627, 636, 616, 606, 620, 613, 608, - 609, 605, 614, 609, 660, 666, 615, 1674, 627, 612, - 628, 618, 630, 624, 669, 637, 621, 622, 1674, 641, - 625, 627, 683, 628, 1674, 647, 627, 645, 684, 644, + 1673, 1146, 1144, 1135, 1144, 1140, 1181, 1123, 1123, 1136, + 1135, 1120, 1175, 1117, 1118, 1673, 1673, 1132, 1129, 1132, + 1673, 1673, 1131, 1116, 63, 580, 68, 182, 249, 202, + 308, 416, 1673, 364, 428, 500, 563, 513, 533, 549, + 619, 575, 570, 566, 576, 580, 591, 598, 593, 587, + 589, 601, 591, 644, 604, 609, 586, 1673, 644, 593, + 608, 608, 1673, 627, 636, 616, 606, 620, 613, 608, + 609, 605, 614, 609, 660, 666, 615, 1673, 627, 612, + 628, 618, 630, 624, 669, 637, 621, 622, 1673, 641, + 625, 627, 683, 628, 1673, 647, 627, 645, 684, 644, - 634, 652, 651, 637, 652, 644, 640, 658, 643, 1674, - 1674, 651, 696, 651, 1674, 659, 654, 705, 1674, 656, - 661, 655, 657, 669, 663, 673, 662, 715, 661, 717, - 718, 664, 1674, 663, 671, 669, 668, 682, 683, 684, + 634, 652, 651, 637, 652, 644, 640, 658, 643, 1673, + 1673, 651, 696, 651, 1673, 659, 654, 705, 1673, 656, + 661, 655, 657, 669, 663, 664, 662, 715, 661, 717, + 718, 664, 1673, 663, 671, 669, 668, 682, 683, 684, 700, 705, 679, 689, 675, 682, 687, 694, 735, 736, - 685, 689, 1674, 685, 703, 700, 738, 689, 707, 708, - 694, 702, 711, 691, 712, 752, 753, 1674, 708, 757, + 685, 689, 1673, 685, 703, 700, 738, 689, 707, 708, + 694, 702, 711, 691, 712, 752, 753, 1673, 708, 757, 758, 720, 722, 705, 707, 714, 765, 714, 713, 730, 769, 721, 725, 723, 721, 774, 775, 727, 777, 773, - 733, 1674, 738, 731, 740, 734, 729, 739, 737, 736, + 733, 1673, 738, 731, 740, 734, 729, 739, 740, 736, - 1674, 731, 1674, 1674, 732, 730, 749, 750, 751, 733, + 1673, 731, 1673, 1673, 732, 730, 749, 750, 751, 733, 738, 745, 778, 769, 741, 801, 746, 761, 753, 757, - 1674, 1674, 767, 765, 751, 752, 810, 765, 770, 757, - 768, 760, 766, 762, 780, 781, 1674, 1674, 780, 1674, - 782, 1674, 767, 786, 776, 827, 782, 824, 1674, 781, - 773, 832, 1674, 833, 782, 789, 831, 1674, 1674, 791, - 1674, 782, 782, 785, 799, 786, 797, 844, 803, 800, + 1673, 1673, 767, 765, 751, 752, 810, 765, 770, 757, + 768, 760, 766, 762, 780, 781, 1673, 1673, 780, 1673, + 782, 1673, 767, 786, 776, 827, 782, 824, 1673, 781, + 773, 832, 1673, 833, 782, 789, 831, 1673, 1673, 791, + 1673, 782, 782, 785, 799, 786, 797, 844, 803, 804, 842, 848, 849, 798, 851, 852, 813, 797, 809, 799, - 829, 858, 818, 1674, 860, 809, 805, 821, 826, 814, - 866, 825, 1674, 827, 826, 828, 821, 830, 831, 828, + 829, 858, 818, 1673, 860, 809, 805, 821, 826, 814, + 866, 825, 1673, 827, 826, 828, 821, 830, 831, 828, - 818, 820, 877, 826, 879, 824, 881, 1674, 819, 834, - 884, 840, 1674, 1674, 836, 846, 831, 847, 834, 893, - 894, 840, 896, 855, 1674, 848, 858, 851, 903, 1674, - 1674, 849, 1674, 1674, 856, 906, 857, 908, 890, 1674, - 868, 1674, 855, 854, 857, 857, 858, 916, 1674, 861, - 918, 873, 864, 879, 879, 882, 882, 879, 884, 1674, - 876, 1674, 886, 1674, 887, 888, 885, 1674, 878, 878, - 884, 883, 895, 895, 1674, 1674, 934, 1674, 899, 884, - 891, 891, 1674, 896, 907, 1674, 904, 1674, 923, 943, - 949, 893, 951, 952, 907, 1674, 954, 1674, 894, 951, + 818, 820, 877, 826, 879, 824, 881, 1673, 819, 834, + 884, 840, 1673, 1673, 836, 846, 831, 847, 834, 893, + 894, 840, 896, 855, 1673, 848, 849, 851, 903, 1673, + 1673, 849, 1673, 1673, 856, 906, 857, 908, 890, 1673, + 868, 1673, 855, 854, 857, 857, 858, 916, 1673, 861, + 918, 873, 864, 879, 879, 882, 882, 879, 884, 1673, + 876, 1673, 886, 1673, 887, 888, 885, 1673, 878, 878, + 884, 883, 895, 895, 1673, 1673, 934, 1673, 899, 884, + 885, 891, 1673, 896, 907, 1673, 904, 1673, 923, 943, + 949, 893, 951, 952, 907, 1673, 954, 1673, 894, 951, 916, 912, 954, 904, 909, 962, 920, 964, 965, 928, 917, 926, 969, 913, 930, 915, 930, 915, 971, 972, - 921, 938, 924, 935, 982, 954, 941, 1674, 985, 1674, - 1674, 934, 1674, 987, 935, 984, 929, 934, 993, 943, - 1674, 949, 1674, 1674, 940, 955, 957, 1674, 994, 962, - 955, 956, 965, 952, 954, 1001, 965, 1008, 959, 1674, - 1010, 958, 1674, 962, 1674, 965, 960, 959, 1017, 972, - 1674, 1014, 976, 979, 1022, 1023, 966, 968, 976, 966, - 982, 976, 992, 991, 1032, 1674, 1028, 1674, 993, 1030, - 994, 985, 992, 1674, 989, 994, 1041, 986, 1674, 1674, + 973, 938, 924, 935, 982, 954, 941, 1673, 985, 1673, + 1673, 934, 1673, 987, 935, 984, 929, 934, 993, 943, + 1673, 949, 1673, 1673, 940, 955, 957, 1673, 994, 962, + 955, 956, 965, 952, 954, 966, 965, 1008, 959, 1673, + 1010, 958, 1673, 962, 1673, 965, 960, 959, 1017, 972, + 1673, 1014, 976, 979, 1022, 1023, 966, 968, 976, 966, + 982, 976, 992, 982, 1032, 1673, 1028, 1673, 993, 1030, + 994, 985, 992, 1673, 989, 994, 1041, 986, 1673, 1673, - 990, 1002, 1003, 1046, 990, 991, 999, 1001, 1674, 1011, - 1001, 1000, 1003, 1015, 1006, 1015, 1017, 1674, 1059, 1019, - 1061, 1062, 1674, 1058, 1018, 1023, 1028, 1005, 1068, 1027, - 1070, 1029, 1030, 1073, 1032, 1674, 1037, 1674, 1674, 1019, - 1025, 1078, 1023, 1040, 1674, 1026, 1674, 1026, 1028, 1674, - 1033, 1028, 1040, 1036, 1674, 1032, 1040, 1044, 1035, 1087, - 1036, 1052, 1045, 1040, 1055, 1056, 1047, 1054, 1041, 1056, - 1103, 1062, 1105, 1050, 1051, 1067, 1058, 1072, 1068, 1674, - 1112, 1674, 1113, 1114, 1115, 1072, 1071, 1072, 1674, 1674, - 1674, 1674, 1119, 1063, 1079, 1674, 1117, 1068, 1067, 1069, + 990, 1002, 1003, 1046, 990, 991, 999, 1012, 1673, 1011, + 1001, 1000, 1003, 1015, 1006, 1015, 1017, 1673, 1059, 1019, + 1061, 1062, 1673, 1058, 1018, 1023, 1010, 1005, 1068, 1027, + 1070, 1029, 1030, 1073, 1032, 1673, 1037, 1673, 1673, 1019, + 1025, 1078, 1023, 1040, 1673, 1026, 1673, 1026, 1028, 1673, + 1033, 1028, 1040, 1036, 1673, 1046, 1040, 1044, 1035, 1087, + 1036, 1052, 1045, 1040, 1041, 1056, 1047, 1054, 1041, 1056, + 1103, 1062, 1105, 1106, 1051, 1067, 1058, 1072, 1068, 1673, + 1112, 1673, 1673, 1113, 1114, 1071, 1070, 1071, 1673, 1673, + 1673, 1118, 1062, 1078, 1673, 1116, 1067, 1066, 1068, 1079, - 1080, 1127, 1078, 1674, 1087, 1130, 1674, 1674, 1136, 1141, - 1146, 1151, 1156, 1161, 1166, 1169, 1143, 1148, 1150, 1163 + 1126, 1077, 1673, 1086, 1129, 1673, 1673, 1135, 1140, 1145, + 1150, 1155, 1160, 1165, 1168, 1142, 1147, 1149, 1162 } ; -static const flex_int16_t yy_def[1321] = +static const flex_int16_t yy_def[1320] = { 0, - 1309, 1309, 1310, 1310, 1309, 1309, 1309, 1309, 1309, 1309, - 1308, 1308, 1308, 1308, 1308, 1311, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1312, - 1308, 1308, 1308, 1313, 15, 1308, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1314, 45, 45, + 1308, 1308, 1309, 1309, 1308, 1308, 1308, 1308, 1308, 1308, + 1307, 1307, 1307, 1307, 1307, 1310, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1311, + 1307, 1307, 1307, 1312, 15, 1307, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1313, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1311, 1308, - 1308, 1308, 1308, 1308, 1308, 1315, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1312, 1308, 1313, + 45, 45, 45, 45, 45, 45, 45, 45, 1310, 1307, + 1307, 1307, 1307, 1307, 1307, 1314, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1311, 1307, 1312, - 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1316, 45, 1314, 45, 45, + 1307, 1307, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1315, 45, 1313, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1315, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1317, 45, 45, 45, 1308, 45, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 1316, 1308, + 45, 45, 45, 45, 1314, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1316, 45, 45, 45, 1307, 45, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 1315, 1307, - 1314, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1313, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1318, - 45, 45, 45, 45, 45, 1308, 45, 45, 1308, 45, + 45, 45, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1317, + 45, 45, 45, 45, 45, 1307, 45, 45, 1307, 45, - 1308, 45, 1314, 1308, 45, 45, 45, 45, 45, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1307, 45, 1313, 1307, 45, 45, 45, 45, 45, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1308, 1308, - 1308, 1319, 45, 45, 45, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1307, 1307, + 1307, 1318, 45, 45, 45, 45, 45, 45, 1307, 45, - 45, 1308, 45, 1314, 45, 45, 45, 1308, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 1308, + 45, 1307, 45, 1313, 45, 45, 45, 1307, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1308, 45, 1308, 45, 45, 45, + 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1307, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, - 1308, 1308, 45, 1308, 45, 45, 1308, 1320, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, + 1307, 1307, 45, 1307, 45, 45, 1307, 1319, 45, 45, - 1308, 1308, 45, 1308, 45, 1308, 45, 45, 45, 1308, + 1307, 1307, 45, 1307, 45, 1307, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, - 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1308, 45, 45, 1308, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1308, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, - 45, 1308, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 1307, 45, 45, 1307, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, + 45, 1307, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1308, 45, 45, 45, - 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, + 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 1308, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1308, 1308, 45, 45, 45, - 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1307, 1307, 45, 45, 45, + 1307, 1307, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, - 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1307, 45, + 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, - 1308, 45, 45, 45, 1308, 45, 45, 45, 1308, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, + 1307, 45, 45, 45, 1307, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1308, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, - 1308, 45, 1308, 1308, 45, 45, 45, 45, 45, 45, + 1307, 45, 1307, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1308, 1308, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1308, 1308, 45, 1308, - 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, - 45, 45, 1308, 45, 45, 45, 45, 1308, 1308, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1307, 1307, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1307, 1307, 45, 1307, + 45, 1307, 45, 45, 45, 45, 45, 45, 1307, 45, + 45, 45, 1307, 45, 45, 45, 45, 1307, 1307, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1308, 45, 45, 45, 45, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, - 45, 45, 1308, 1308, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1308, 45, 45, 45, 45, 1308, - 1308, 45, 1308, 1308, 45, 45, 45, 45, 45, 1308, - 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, - 45, 1308, 45, 1308, 45, 45, 45, 1308, 45, 45, - 45, 45, 45, 45, 1308, 1308, 45, 1308, 45, 45, - 45, 45, 1308, 45, 45, 1308, 45, 1308, 45, 45, - 45, 45, 45, 45, 45, 1308, 45, 1308, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, + 45, 45, 1307, 1307, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1307, 45, 45, 45, 45, 1307, + 1307, 45, 1307, 1307, 45, 45, 45, 45, 45, 1307, + 45, 1307, 45, 45, 45, 45, 45, 45, 1307, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, + 45, 1307, 45, 1307, 45, 45, 45, 1307, 45, 45, + 45, 45, 45, 45, 1307, 1307, 45, 1307, 45, 45, + 45, 45, 1307, 45, 45, 1307, 45, 1307, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 1308, - 1308, 45, 1308, 45, 45, 45, 45, 45, 45, 45, - 1308, 45, 1308, 1308, 45, 45, 45, 1308, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, - 45, 45, 1308, 45, 1308, 45, 45, 45, 45, 45, - 1308, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1308, 45, 1308, 45, 45, - 45, 45, 45, 1308, 45, 45, 45, 45, 1308, 1308, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 1307, + 1307, 45, 1307, 45, 45, 45, 45, 45, 45, 45, + 1307, 45, 1307, 1307, 45, 45, 45, 1307, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, + 45, 45, 1307, 45, 1307, 45, 45, 45, 45, 45, + 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 1307, 45, 45, + 45, 45, 45, 1307, 45, 45, 45, 45, 1307, 1307, - 45, 45, 45, 45, 45, 45, 45, 45, 1308, 45, - 45, 45, 45, 45, 45, 45, 45, 1308, 45, 45, - 45, 45, 1308, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1308, 45, 1308, 1308, 45, - 45, 45, 45, 45, 1308, 45, 1308, 45, 45, 1308, - 45, 45, 45, 45, 1308, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1307, 45, + 45, 45, 45, 45, 45, 45, 45, 1307, 45, 45, + 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1307, 45, 1307, 1307, 45, + 45, 45, 45, 45, 1307, 45, 1307, 45, 45, 1307, + 45, 45, 45, 45, 1307, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1308, - 45, 1308, 45, 45, 45, 45, 45, 45, 1308, 1308, - 1308, 1308, 45, 45, 45, 1308, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1307, + 45, 1307, 1307, 45, 45, 45, 45, 45, 1307, 1307, + 1307, 45, 45, 45, 1307, 45, 45, 45, 45, 45, - 45, 45, 45, 1308, 45, 45, 1308, 0, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308 + 45, 45, 1307, 45, 45, 1307, 0, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307 } ; -static const flex_int16_t yy_nxt[1746] = +static const flex_int16_t yy_nxt[1745] = { 0, - 1308, 13, 14, 13, 1308, 15, 16, 1308, 17, 18, + 1307, 13, 14, 13, 1307, 15, 16, 1307, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 85, 353, - 37, 14, 37, 86, 25, 26, 38, 1308, 1308, 27, + 37, 14, 37, 86, 25, 26, 38, 1307, 1307, 27, 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, - 13, 14, 13, 13, 14, 13, 32, 40, 1308, 13, + 13, 14, 13, 13, 14, 13, 32, 40, 1307, 13, 14, 13, 33, 40, 115, 91, 92, 354, 90, 34, 35, 13, 14, 13, 94, 15, 16, 95, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 13, 14, @@ -1316,77 +1316,77 @@ static const flex_int16_t yy_nxt[1746] = 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, - 1302, 1303, 1304, 1305, 1306, 1307, 12, 12, 12, 12, - 12, 36, 36, 36, 36, 36, 79, 290, 79, 79, - 79, 98, 392, 98, 498, 98, 100, 100, 100, 100, - 100, 116, 116, 116, 116, 116, 175, 100, 175, 175, - 175, 199, 199, 199, 802, 801, 800, 799, 798, 797, - 796, 795, 794, 793, 792, 791, 790, 789, 788, 787, - 786, 785, 784, 783, 782, 781, 780, 779, 778, 777, + 1302, 1303, 1304, 1305, 1306, 12, 12, 12, 12, 12, + 36, 36, 36, 36, 36, 79, 290, 79, 79, 79, + 98, 392, 98, 498, 98, 100, 100, 100, 100, 100, + 116, 116, 116, 116, 116, 175, 100, 175, 175, 175, + 199, 199, 199, 802, 801, 800, 799, 798, 797, 796, + 795, 794, 793, 792, 791, 790, 789, 788, 787, 786, + 785, 784, 783, 782, 781, 780, 779, 778, 777, 776, - 776, 775, 774, 773, 772, 771, 770, 769, 768, 767, - 766, 764, 763, 762, 761, 760, 759, 758, 755, 754, - 749, 748, 747, 746, 745, 744, 743, 742, 741, 740, - 739, 738, 737, 736, 735, 734, 733, 732, 731, 730, - 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, - 719, 718, 717, 716, 715, 714, 713, 712, 711, 710, - 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, - 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, - 689, 688, 687, 686, 685, 680, 679, 678, 677, 676, - 675, 672, 671, 670, 669, 668, 667, 666, 665, 664, + 775, 774, 773, 772, 771, 770, 769, 768, 767, 766, + 764, 763, 762, 761, 760, 759, 758, 755, 754, 749, + 748, 747, 746, 745, 744, 743, 742, 741, 740, 739, + 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, + 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, + 718, 717, 716, 715, 714, 713, 712, 711, 710, 709, + 708, 707, 706, 705, 704, 703, 702, 701, 700, 699, + 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, + 688, 687, 686, 685, 680, 679, 678, 677, 676, 675, + 672, 671, 670, 669, 668, 667, 666, 665, 664, 663, - 663, 662, 661, 660, 659, 658, 657, 656, 652, 651, - 650, 649, 648, 647, 646, 643, 642, 641, 640, 639, - 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, - 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, - 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, - 608, 607, 606, 605, 604, 603, 602, 601, 600, 596, - 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, - 585, 584, 583, 582, 581, 580, 579, 578, 575, 574, - 573, 572, 571, 570, 569, 568, 567, 566, 565, 564, - 563, 562, 561, 560, 559, 558, 557, 556, 555, 554, + 662, 661, 660, 659, 658, 657, 656, 652, 651, 650, + 649, 648, 647, 646, 643, 642, 641, 640, 639, 638, + 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, + 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, + 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, + 607, 606, 605, 604, 603, 602, 601, 600, 596, 595, + 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, + 584, 583, 582, 581, 580, 579, 578, 575, 574, 573, + 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, + 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, - 553, 552, 551, 550, 549, 548, 547, 546, 545, 544, - 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, - 533, 532, 531, 530, 527, 526, 525, 524, 523, 522, - 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, - 511, 510, 506, 505, 504, 503, 502, 501, 500, 497, - 496, 493, 492, 491, 490, 489, 488, 487, 486, 485, - 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, - 474, 473, 472, 471, 468, 467, 464, 463, 462, 461, - 460, 459, 458, 457, 456, 452, 451, 450, 449, 448, - 445, 444, 443, 442, 441, 440, 439, 438, 437, 436, + 552, 551, 550, 549, 548, 547, 546, 545, 544, 543, + 542, 541, 540, 539, 538, 537, 536, 535, 534, 533, + 532, 531, 530, 527, 526, 525, 524, 523, 522, 521, + 520, 519, 518, 517, 516, 515, 514, 513, 512, 511, + 510, 506, 505, 504, 503, 502, 501, 500, 497, 496, + 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, + 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, + 473, 472, 471, 468, 467, 464, 463, 462, 461, 460, + 459, 458, 457, 456, 452, 451, 450, 449, 448, 445, + 444, 443, 442, 441, 440, 439, 438, 437, 436, 435, - 435, 430, 429, 428, 427, 426, 425, 424, 423, 422, - 421, 420, 419, 416, 415, 414, 413, 412, 409, 408, - 407, 406, 403, 402, 400, 399, 394, 391, 388, 387, - 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, - 376, 375, 374, 373, 372, 371, 368, 367, 366, 365, - 364, 363, 362, 361, 360, 359, 358, 357, 356, 355, - 352, 351, 350, 348, 347, 346, 345, 341, 340, 339, - 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, - 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, - 318, 317, 316, 315, 314, 313, 312, 311, 308, 307, + 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, + 420, 419, 416, 415, 414, 413, 412, 409, 408, 407, + 406, 403, 402, 400, 399, 394, 391, 388, 387, 386, + 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, + 375, 374, 373, 372, 371, 368, 367, 366, 365, 364, + 363, 362, 361, 360, 359, 358, 357, 356, 355, 352, + 351, 350, 348, 347, 346, 345, 341, 340, 339, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 312, 311, 308, 307, 306, - 306, 304, 200, 301, 299, 297, 296, 293, 292, 289, - 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, - 260, 259, 258, 254, 253, 250, 249, 248, 247, 246, - 244, 243, 242, 241, 238, 237, 236, 235, 234, 233, - 232, 229, 228, 224, 216, 215, 214, 210, 209, 208, - 205, 204, 200, 193, 188, 187, 186, 183, 182, 174, - 161, 140, 133, 106, 105, 104, 43, 99, 97, 96, - 87, 43, 1308, 11, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 304, 200, 301, 299, 297, 296, 293, 292, 289, 282, + 281, 280, 279, 278, 277, 276, 275, 274, 273, 260, + 259, 258, 254, 253, 250, 249, 248, 247, 246, 244, + 243, 242, 241, 238, 237, 236, 235, 234, 233, 232, + 229, 228, 224, 216, 215, 214, 210, 209, 208, 205, + 204, 200, 193, 188, 187, 186, 183, 182, 174, 161, + 140, 133, 106, 105, 104, 43, 99, 97, 96, 87, + 43, 1307, 11, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308 + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307 } ; -static const flex_int16_t yy_chk[1746] = +static const flex_int16_t yy_chk[1745] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 249, @@ -1510,76 +1510,76 @@ static const flex_int16_t yy_chk[1746] = 1252, 1253, 1254, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, - 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1281, 1283, 1284, - 1285, 1286, 1287, 1288, 1293, 1294, 1295, 1297, 1298, 1299, - 1300, 1301, 1302, 1303, 1305, 1306, 1309, 1309, 1309, 1309, - 1309, 1310, 1310, 1310, 1310, 1310, 1311, 1317, 1311, 1311, - 1311, 1312, 1318, 1312, 1319, 1312, 1313, 1313, 1313, 1313, - 1313, 1314, 1314, 1314, 1314, 1314, 1315, 1320, 1315, 1315, - 1315, 1316, 1316, 1316, 724, 723, 720, 719, 718, 715, - 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, - 704, 703, 702, 700, 699, 698, 697, 696, 695, 694, + 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1281, 1284, 1285, + 1286, 1287, 1288, 1292, 1293, 1294, 1296, 1297, 1298, 1299, + 1300, 1301, 1302, 1304, 1305, 1308, 1308, 1308, 1308, 1308, + 1309, 1309, 1309, 1309, 1309, 1310, 1316, 1310, 1310, 1310, + 1311, 1317, 1311, 1318, 1311, 1312, 1312, 1312, 1312, 1312, + 1313, 1313, 1313, 1313, 1313, 1314, 1319, 1314, 1314, 1314, + 1315, 1315, 1315, 724, 723, 720, 719, 718, 715, 714, + 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, + 703, 702, 700, 699, 698, 697, 696, 695, 694, 693, - 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, - 683, 681, 679, 678, 677, 676, 675, 674, 671, 670, - 667, 666, 665, 664, 663, 662, 661, 660, 659, 658, - 657, 656, 655, 654, 652, 651, 650, 649, 648, 647, - 646, 645, 643, 642, 641, 640, 639, 638, 636, 635, - 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, - 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, - 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, - 604, 603, 602, 601, 600, 596, 595, 594, 591, 590, - 589, 586, 585, 584, 583, 582, 581, 580, 579, 578, + 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, + 681, 679, 678, 677, 676, 675, 674, 671, 670, 667, + 666, 665, 664, 663, 662, 661, 660, 659, 658, 657, + 656, 655, 654, 652, 651, 650, 649, 648, 647, 646, + 645, 643, 642, 641, 640, 639, 638, 636, 635, 634, + 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, + 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, + 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, + 603, 602, 601, 600, 596, 595, 594, 591, 590, 589, + 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, - 577, 575, 574, 573, 572, 571, 570, 569, 567, 566, - 564, 563, 562, 561, 560, 558, 557, 556, 554, 553, - 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, - 541, 540, 539, 538, 537, 535, 534, 533, 532, 531, - 530, 529, 527, 526, 525, 524, 523, 522, 521, 520, - 519, 518, 517, 516, 515, 514, 513, 512, 511, 505, - 503, 500, 499, 497, 496, 495, 493, 489, 488, 487, - 486, 485, 484, 483, 482, 481, 480, 479, 477, 476, - 475, 474, 473, 472, 471, 470, 469, 468, 466, 464, - 463, 462, 461, 460, 459, 458, 457, 456, 455, 454, + 575, 574, 573, 572, 571, 570, 569, 567, 566, 564, + 563, 562, 561, 560, 558, 557, 556, 554, 553, 551, + 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, + 540, 539, 538, 537, 535, 534, 533, 532, 531, 530, + 529, 527, 526, 525, 524, 523, 522, 521, 520, 519, + 518, 517, 516, 515, 514, 513, 512, 511, 505, 503, + 500, 499, 497, 496, 495, 493, 489, 488, 487, 486, + 485, 484, 483, 482, 481, 480, 479, 477, 476, 475, + 474, 473, 472, 471, 470, 469, 468, 466, 464, 463, + 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, - 453, 451, 450, 449, 448, 447, 446, 445, 444, 443, - 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, - 432, 430, 429, 428, 426, 425, 424, 423, 422, 421, - 419, 418, 417, 416, 415, 414, 412, 411, 410, 409, - 407, 406, 401, 400, 398, 397, 396, 395, 394, 391, - 388, 386, 385, 384, 383, 382, 381, 380, 379, 378, - 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, - 367, 366, 365, 364, 362, 361, 359, 358, 357, 356, - 355, 354, 353, 352, 351, 347, 346, 345, 344, 343, - 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, + 451, 450, 449, 448, 447, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, + 430, 429, 428, 426, 425, 424, 423, 422, 421, 419, + 418, 417, 416, 415, 414, 412, 411, 410, 409, 407, + 406, 401, 400, 398, 397, 396, 395, 394, 391, 388, + 386, 385, 384, 383, 382, 381, 380, 379, 378, 377, + 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, + 366, 365, 364, 362, 361, 359, 358, 357, 356, 355, + 354, 353, 352, 351, 347, 346, 345, 344, 343, 341, + 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, - 331, 329, 328, 327, 326, 325, 324, 323, 322, 321, - 320, 319, 318, 316, 315, 314, 313, 312, 309, 308, - 307, 306, 302, 300, 297, 295, 292, 289, 282, 281, - 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, - 270, 269, 268, 267, 266, 265, 263, 262, 261, 260, - 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, - 248, 247, 246, 244, 243, 242, 241, 239, 238, 237, - 236, 235, 234, 233, 232, 231, 229, 228, 227, 226, - 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, - 215, 214, 213, 212, 211, 210, 209, 208, 206, 205, + 329, 328, 327, 326, 325, 324, 323, 322, 321, 320, + 319, 318, 316, 315, 314, 313, 312, 309, 308, 307, + 306, 302, 300, 297, 295, 292, 289, 282, 281, 280, + 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, + 269, 268, 267, 266, 265, 263, 262, 261, 260, 259, + 258, 257, 256, 255, 254, 253, 252, 251, 250, 248, + 247, 246, 244, 243, 242, 241, 239, 238, 237, 236, + 235, 234, 233, 232, 231, 229, 228, 227, 226, 225, + 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, + 214, 213, 212, 211, 210, 209, 208, 206, 205, 204, - 204, 202, 199, 197, 195, 193, 192, 187, 186, 182, - 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, - 162, 161, 160, 158, 157, 155, 154, 153, 152, 151, - 149, 148, 147, 146, 144, 143, 142, 141, 140, 139, - 138, 136, 135, 133, 129, 128, 127, 125, 124, 123, - 121, 120, 116, 110, 106, 105, 104, 98, 97, 78, - 73, 67, 64, 50, 49, 48, 43, 41, 39, 38, - 24, 14, 11, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, + 202, 199, 197, 195, 193, 192, 187, 186, 182, 174, + 173, 172, 171, 170, 169, 168, 167, 166, 165, 162, + 161, 160, 158, 157, 155, 154, 153, 152, 151, 149, + 148, 147, 146, 144, 143, 142, 141, 140, 139, 138, + 136, 135, 133, 129, 128, 127, 125, 124, 123, 121, + 120, 116, 110, 106, 105, 104, 98, 97, 78, 73, + 67, 64, 50, 49, 48, 43, 41, 39, 38, 24, + 14, 11, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, - 1308, 1308, 1308, 1308, 1308 + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1307, 1307, 1307, 1307 } ; static yy_state_type yy_last_accepting_state; @@ -2044,13 +2044,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1309 ) + if ( yy_current_state >= 1308 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1308 ); + while ( yy_current_state != 1307 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -3319,9 +3319,9 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::POOLS: case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::SHARED_NETWORK: - return isc::dhcp::Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_REQUIRE_CLIENT_CLASSES(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("required-client-classes", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("require-client-classes", driver.loc_); } } YY_BREAK @@ -4429,7 +4429,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1309 ) + if ( yy_current_state >= 1308 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4462,11 +4462,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1309 ) + if ( yy_current_state >= 1308 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1308); + yy_is_jam = (yy_current_state == 1307); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index bb33626754..34dbfe5ecb 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -1765,7 +1765,7 @@ namespace isc { namespace dhcp { #line 949 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("required-client-classes", c); + ctx.stack_.back()->set("require-client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } @@ -4299,7 +4299,7 @@ namespace isc { namespace dhcp { "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"required-client-classes\"", "\"test\"", + "\"client-classes\"", "\"require-client-classes\"", "\"test\"", "\"only-if-required\"", "\"client-class\"", "\"reservations\"", "\"ip-addresses\"", "\"prefixes\"", "\"duid\"", "\"hw-address\"", "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", @@ -4356,7 +4356,7 @@ namespace isc { namespace dhcp { "subnet6_list_content", "not_empty_subnet6_list", "subnet6", "$@42", "sub_subnet6", "$@43", "subnet6_params", "subnet6_param", "subnet", "$@44", "interface", "$@45", "interface_id", "$@46", "client_class", - "$@47", "required_client_classes", "$@48", "reservation_mode", "$@49", + "$@47", "require_client_classes", "$@48", "reservation_mode", "$@49", "hr_mode", "id", "rapid_commit", "shared_networks", "$@50", "shared_networks_content", "shared_networks_list", "shared_network", "$@51", "shared_network_params", "shared_network_param", diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index 212cc47755..a3ffd9ede0 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -415,7 +415,7 @@ namespace isc { namespace dhcp { TOKEN_RELAY_SUPPLIED_OPTIONS = 323, TOKEN_HOST_RESERVATION_IDENTIFIERS = 324, TOKEN_CLIENT_CLASSES = 325, - TOKEN_REQUIRED_CLIENT_CLASSES = 326, + TOKEN_REQUIRE_CLIENT_CLASSES = 326, TOKEN_TEST = 327, TOKEN_ONLY_IF_REQUIRED = 328, TOKEN_CLIENT_CLASS = 329, @@ -893,7 +893,7 @@ namespace isc { namespace dhcp { static inline symbol_type - make_REQUIRED_CLIENT_CLASSES (const location_type& l); + make_REQUIRE_CLIENT_CLASSES (const location_type& l); static inline symbol_type @@ -2248,9 +2248,9 @@ namespace isc { namespace dhcp { } Dhcp6Parser::symbol_type - Dhcp6Parser::make_REQUIRED_CLIENT_CLASSES (const location_type& l) + Dhcp6Parser::make_REQUIRE_CLIENT_CLASSES (const location_type& l) { - return symbol_type (token::TOKEN_REQUIRED_CLIENT_CLASSES, l); + return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, l); } Dhcp6Parser::symbol_type diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index fc25296efd..e2446254dc 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201804052218 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index b1a0b3e8fe..ae5967d920 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201804052218 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index a884c50715..75bd52db7f 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201804052218 +// Generated 201804061423 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 6418fa8a42500af085816fb1283ff28f283f44db Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 7 Apr 2018 15:15:41 +0200 Subject: [PATCH 46/52] [5374] Checkpoint for regen before tests --- src/bin/dhcp4/dhcp4_srv.cc | 3 +++ src/bin/dhcp6/dhcp6_srv.cc | 4 +++- src/lib/dhcpsrv/client_class_def.cc | 20 +++++++++++++---- src/lib/dhcpsrv/client_class_def.h | 14 +++++++----- .../parsers/client_class_def_parser.cc | 9 ++++---- .../dhcpsrv/parsers/client_class_def_parser.h | 6 ++--- src/lib/eval/eval.dox | 2 +- src/lib/eval/eval_context.cc | 10 ++++----- src/lib/eval/eval_context.h | 20 ++++++++--------- src/lib/eval/parser.cc | 6 ++--- src/lib/eval/parser.yy | 8 +++---- src/lib/eval/tests/context_unittest.cc | 22 +++++++++---------- 12 files changed, 73 insertions(+), 51 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 58b547d36d..7dacea7cfc 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -2970,6 +2970,9 @@ void Dhcpv4Srv::classifyByVendor(const Pkt4Ptr& pkt) { } void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) { + // All packets belongs to ALL. + pkt->addClass("ALL"); + // First phase: built-in vendor class processing classifyByVendor(pkt); diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 1f823e54c9..c25e9d49d0 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -3084,7 +3084,9 @@ void Dhcpv6Srv::classifyByVendor(const Pkt6Ptr& pkt, std::string& classes) { } void Dhcpv6Srv::classifyPacket(const Pkt6Ptr& pkt) { - string classes = ""; + // All packets belongs to ALL + pkt->addClass("ALL"); + string classes = "ALL "; // First phase: built-in vendor class processing classifyByVendor(pkt, classes); diff --git a/src/lib/dhcpsrv/client_class_def.cc b/src/lib/dhcpsrv/client_class_def.cc index 91c9635164..6937df72a2 100644 --- a/src/lib/dhcpsrv/client_class_def.cc +++ b/src/lib/dhcpsrv/client_class_def.cc @@ -292,6 +292,11 @@ ClientClassDictionary::toElement() const { return (result); } +std::list +builtinNames = { + "ALL", "KNOWN" +}; + std::list builtinPrefixes = { "VENDOR_CLASS_", "AFTER_", "EXTERNAL_" @@ -299,6 +304,13 @@ builtinPrefixes = { bool isClientClassBuiltIn(const ClientClass& client_class) { + for (std::list::const_iterator bn = builtinNames.cbegin(); + bn != builtinNames.cend(); ++bn) { + if (client_class == *bn) { + return true; + } + } + for (std::list::const_iterator bt = builtinPrefixes.cbegin(); bt != builtinPrefixes.cend(); ++bt) { if (client_class.size() <= bt->size()) { @@ -314,9 +326,9 @@ isClientClassBuiltIn(const ClientClass& client_class) { } bool -isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, - const ClientClass& client_class) { - // First check built-in prefixes +isClientClassDefined(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class) { + // First check built-in classes if (isClientClassBuiltIn(client_class)) { return (true); } @@ -327,7 +339,7 @@ isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, return (true); } - // Unknown... + // Not defined... return (false); } diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index adcfe0e664..44b38bbeca 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -340,6 +340,10 @@ private: /// @brief Defines a pointer to a ClientClassDictionary typedef boost::shared_ptr ClientClassDictionaryPtr; +/// @brief List of built-in client class names. +/// i.e. ALL and KNOWN. +extern std::list builtinNames; + /// @brief List of built-in client class prefixes /// i.e. VENDOR_CLASS_, AFTER_ and EXTERNAL_. extern std::list builtinPrefixes; @@ -351,14 +355,14 @@ extern std::list builtinPrefixes; bool isClientClassBuiltIn(const ClientClass& client_class); -/// @brief Check if a client class name is already known, -/// i.e. beginning by a built-in prefix or in the dictionary, +/// @brief Check if a client class name is already defined, +/// i.e. is built-in or in the dictionary, /// /// @param class_dictionary A class dictionary where to look for. /// @param client_class A client class name to look for. -/// @return true if known or built-in, false if not. -bool isClientClassKnown(ClientClassDictionaryPtr& class_dictionary, - const ClientClass& client_class); +/// @return true if defined or built-in, false if not. +bool isClientClassDefined(ClientClassDictionaryPtr& class_dictionary, + const ClientClass& client_class); } // namespace isc::dhcp } // namespace isc diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc index 1e4714203a..c6012a23e0 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.cc +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.cc @@ -37,7 +37,7 @@ void ExpressionParser::parse(ExpressionPtr& expression, ConstElementPtr expression_cfg, uint16_t family, - std::function check_known) { + EvalContext::CheckDefined check_defined) { if (expression_cfg->getType() != Element::string) { isc_throw(DhcpConfigError, "expression [" << expression_cfg->str() << "] must be a string, at (" @@ -50,7 +50,7 @@ ExpressionParser::parse(ExpressionPtr& expression, expression_cfg->getValue(value); try { EvalContext eval_ctx(family == AF_INET ? Option::V4 : Option::V6, - check_known); + check_defined); eval_ctx.parseString(value); expression.reset(new Expression()); *expression = eval_ctx.expression; @@ -84,8 +84,9 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary, if (test_cfg) { ExpressionParser parser; using std::placeholders::_1; - auto check_known = std::bind(isClientClassKnown, class_dictionary, _1); - parser.parse(match_expr, test_cfg, family, check_known); + auto check_defined = + std::bind(isClientClassDefined, class_dictionary, _1); + parser.parse(match_expr, test_cfg, family, check_defined); test = test_cfg->stringValue(); } diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.h b/src/lib/dhcpsrv/parsers/client_class_def_parser.h index 4723f480f4..f490f08f6c 100644 --- a/src/lib/dhcpsrv/parsers/client_class_def_parser.h +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015, 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -67,13 +67,13 @@ public: /// @param expression variable in which to store the new expression /// @param expression_cfg the configuration entry to be parsed. /// @param family the address family of the expression. - /// @param check_known a closure to check if a client class is known. + /// @param check_defined a closure to check if a client class is defined. /// /// @throw DhcpConfigError if parsing was unsuccessful. void parse(ExpressionPtr& expression, isc::data::ConstElementPtr expression_cfg, uint16_t family, - std::function check_known = + isc::eval::EvalContext::CheckDefined check_defined = isc::eval::EvalContext::acceptAll); }; diff --git a/src/lib/eval/eval.dox b/src/lib/eval/eval.dox index 64efbb4c87..4f7d814273 100644 --- a/src/lib/eval/eval.dox +++ b/src/lib/eval/eval.dox @@ -24,7 +24,7 @@ Parameters to the @ref isc::eval::EvalContext class constructor are the universe to choose between DHCPv4 and DHCPv6 for DHCP version dependent expressions, and a function used - by the parser to accept only already known or built-in client + by the parser to accept only already defined or built-in client class names in client class membership expressions. This function defaults to accept all client class names. diff --git a/src/lib/eval/eval_context.cc b/src/lib/eval/eval_context.cc index 72570dffb0..5deeb5fe24 100644 --- a/src/lib/eval/eval_context.cc +++ b/src/lib/eval/eval_context.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -17,9 +17,9 @@ #include EvalContext::EvalContext(const Option::Universe& option_universe, - std::function check_known) + CheckDefined check_defined) : trace_scanning_(false), trace_parsing_(false), - option_universe_(option_universe), check_known_(check_known) + option_universe_(option_universe), check_defined_(check_defined) { } @@ -190,8 +190,8 @@ EvalContext::fromUint32(const uint32_t integer) { } bool -EvalContext::isClientClassKnown(const ClientClass& client_class) { - return (check_known_(client_class)); +EvalContext::isClientClassDefined(const ClientClass& client_class) { + return (check_defined_(client_class)); } void diff --git a/src/lib/eval/eval_context.h b/src/lib/eval/eval_context.h index dac140510d..bd47ae791e 100644 --- a/src/lib/eval/eval_context.h +++ b/src/lib/eval/eval_context.h @@ -41,19 +41,19 @@ public: PARSER_STRING ///< expression is expected to evaluate to string } ParserType; - /// @brief Type of the check known function. - typedef std::function CheckKnown; + /// @brief Type of the check defined function. + typedef std::function CheckDefined; /// @brief Default constructor. /// /// @param option_universe Option universe: DHCPv4 or DHCPv6. This is used /// by the parser to determine which option definitions set should be used /// to map option names to option codes. - /// @param check_known A function called to check if a client class - /// used for membership is already known. If it is not the parser + /// @param check_defined A function called to check if a client class + /// used for membership is already defined. If it is not the parser /// will fail: only backward or built-in references are accepted. EvalContext(const Option::Universe& option_universe, - CheckKnown check_known = acceptAll); + CheckDefined check_defined = acceptAll); /// @brief destructor virtual ~EvalContext(); @@ -181,11 +181,11 @@ public: return (option_universe_); } - /// @brief Check if a client class is already known + /// @brief Check if a client class is already defined /// /// @param client_class the client class name to check - /// @return true if the client class is known, false if not - bool isClientClassKnown(const ClientClass& client_class); + /// @return true if the client class is defined, false if not + bool isClientClassDefined(const ClientClass& client_class); private: /// @brief Flag determining scanner debugging. @@ -200,8 +200,8 @@ public: /// set should be used to map option name to option code. Option::Universe option_universe_; - /// @brief Function to check if a client class is already known - CheckKnown check_known_; + /// @brief Function to check if a client class is already defined. + CheckDefined check_defined_; }; diff --git a/src/lib/eval/parser.cc b/src/lib/eval/parser.cc index 5e65909e5e..7f6290134a 100644 --- a/src/lib/eval/parser.cc +++ b/src/lib/eval/parser.cc @@ -873,11 +873,11 @@ namespace isc { namespace eval { // // This token will check if the packet is a member of // the specified client class. - // To avoid loops at evaluation only already known and + // To avoid loops at evaluation only already defined and // built-in classes are allowed. std::string cc = yystack_[1].value.as< std::string > (); - if (!ctx.isClientClassKnown(cc)) { - error(yystack_[1].location, "Unknown client class '" + cc + "'"); + if (!ctx.isClientClassDefined(cc)) { + error(yystack_[1].location, "Not defined client class '" + cc + "'"); } TokenPtr member(new TokenMember(cc)); ctx.expression.push_back(member); diff --git a/src/lib/eval/parser.yy b/src/lib/eval/parser.yy index b7d52a9af5..f9f0261627 100644 --- a/src/lib/eval/parser.yy +++ b/src/lib/eval/parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -219,11 +219,11 @@ bool_expr : "(" bool_expr ")" // // This token will check if the packet is a member of // the specified client class. - // To avoid loops at evaluation only already known and + // To avoid loops at evaluation only already defined and // built-in classes are allowed. std::string cc = $3; - if (!ctx.isClientClassKnown(cc)) { - error(@3, "Unknown client class '" + cc + "'"); + if (!ctx.isClientClassDefined(cc)) { + error(@3, "Not defined client class '" + cc + "'"); } TokenPtr member(new TokenMember(cc)); ctx.expression.push_back(member); diff --git a/src/lib/eval/tests/context_unittest.cc b/src/lib/eval/tests/context_unittest.cc index f4a6d71334..ab487cc138 100644 --- a/src/lib/eval/tests/context_unittest.cc +++ b/src/lib/eval/tests/context_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -409,14 +409,14 @@ public: /// expected. /// /// @param expr expression to be parsed - /// @param check_known closure checking if the client class is known + /// @param check_defined closure checking if the client class is defined /// @param exp_client_class expected client class name to be parsed /// @param exp_tokens expected number of tokens void testMember(const std::string& expr, - std::function check_known, + EvalContext::CheckDefined check_defined, const std::string& exp_client_class, int exp_tokens) { - EvalContext eval(Option::V6, check_known); + EvalContext eval(Option::V6, check_defined); // parse the expression try { @@ -1119,23 +1119,23 @@ TEST_F(EvalContextTest, relay6FieldError) { ":1.8: Nest level invalid for DHCPv4 packets"); } -// Tests parsing of member with known class +// Tests parsing of member with defined class TEST_F(EvalContextTest, member) { - auto check_known = [](const ClientClass& cc) { return (cc == "foo"); }; - testMember("member('foo')", check_known, "foo", 1); + auto check_defined = [](const ClientClass& cc) { return (cc == "foo"); }; + testMember("member('foo')", check_defined, "foo", 1); } -// Test parsing of member with unknown class +// Test parsing of member with not defined class TEST_F(EvalContextTest, memberError) { - auto check_known = [](const ClientClass& cc) { return (cc == "foo"); }; - EvalContext eval(Option::V6, check_known); + auto check_defined = [](const ClientClass& cc) { return (cc == "foo"); }; + EvalContext eval(Option::V6, check_defined); parsed_ = false; try { parsed_ = eval.parseString("member('bar')"); FAIL() << "Expected EvalParseError but nothing was raised"; } catch (const EvalParseError& ex) { - EXPECT_EQ(":1.8-12: Unknown client class 'bar'", + EXPECT_EQ(":1.8-12: Not defined client class 'bar'", std::string(ex.what())); EXPECT_FALSE(parsed_); } From d095150bd984702c4aba38fd49669ab0c8cf9b6e Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 7 Apr 2018 13:17:18 +0000 Subject: [PATCH 47/52] [trac5374] regen bison --- src/lib/eval/location.hh | 2 +- src/lib/eval/position.hh | 2 +- src/lib/eval/stack.hh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/eval/location.hh b/src/lib/eval/location.hh index 6c10901951..22ec0b9db3 100644 --- a/src/lib/eval/location.hh +++ b/src/lib/eval/location.hh @@ -1,4 +1,4 @@ -// Generated 201711270203 +// Generated 201804071317 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/lib/eval/position.hh b/src/lib/eval/position.hh index 01a150e6ab..6ded477bdc 100644 --- a/src/lib/eval/position.hh +++ b/src/lib/eval/position.hh @@ -1,4 +1,4 @@ -// Generated 201711270203 +// Generated 201804071317 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/lib/eval/stack.hh b/src/lib/eval/stack.hh index 0304add897..e6755364e8 100644 --- a/src/lib/eval/stack.hh +++ b/src/lib/eval/stack.hh @@ -1,4 +1,4 @@ -// Generated 201711270203 +// Generated 201804071317 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 2de90c470587804b61924a46b21ef4439905ef71 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 7 Apr 2018 18:32:01 +0200 Subject: [PATCH 48/52] [5374] Checkpoint: HA tests --- src/bin/dhcp4/tests/classify_unittest.cc | 164 ++++++++++++++++++++- src/bin/dhcp4/tests/dhcp4_client.cc | 28 +++- src/bin/dhcp4/tests/dhcp4_client.h | 15 +- src/bin/dhcp6/tests/classify_unittests.cc | 170 ++++++++++++++++++++++ src/bin/dhcp6/tests/dhcp6_client.cc | 27 +++- src/bin/dhcp6/tests/dhcp6_client.h | 13 +- 6 files changed, 412 insertions(+), 5 deletions(-) diff --git a/src/bin/dhcp4/tests/classify_unittest.cc b/src/bin/dhcp4/tests/classify_unittest.cc index 7e9e2d8f32..227abd7fa5 100644 --- a/src/bin/dhcp4/tests/classify_unittest.cc +++ b/src/bin/dhcp4/tests/classify_unittest.cc @@ -64,6 +64,17 @@ namespace { /// option[93].hex == 0x0007, set server-hostname to deneb /// option[93].hex == 0x0006, set boot-file-name to pxelinux.0 /// option[93].hex == 0x0001, set boot-file-name to ipxe.efi +/// +/// - Configuration 4: +/// - Used for complex membership (example taken from HA) +/// - 1 subnet: 10.0.0.0/24 +/// - 4 pools: 10.0.0.10-10.0.0.49, 10.0.0.60-10.0.0.99, +/// 10.0.0.110-10.0.0.149, 10.0.0.1.60-10.0.0.199 +/// - 4 classes to compose: +/// server1 and server2 for each HA server +/// option[93].hex == 0x0009 aka telephones +/// option[93].hex == 0x0007 aka computers +/// const char* CONFIGS[] = { // Configuration 0 "{ \"interfaces-config\": {" @@ -211,7 +222,58 @@ const char* CONFIGS[] = { " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ]," " \"require-client-classes\": [ \"pxe2\" ]" " } ]" - "}" + "}", + + // Configuration 4 + "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"valid-lifetime\": 600," + "\"client-classes\": [" + "{" + " \"name\": \"server1\"" + "}," + "{" + " \"name\": \"server2\"" + "}," + "{" + " \"name\": \"telephones\"," + " \"test\": \"option[93].hex == 0x0009\"" + "}," + "{" + " \"name\": \"computers\"," + " \"test\": \"option[93].hex == 0x0007\"" + "}," + "{" + " \"name\": \"server1_and_telephones\"," + " \"test\": \"member('server1') and member('telephones')\"" + "}," + "{" + " \"name\": \"server1_and_computers\"," + " \"test\": \"member('server1') and member('computers')\"" + "}," + "{" + " \"name\": \"server2_and_telephones\"," + " \"test\": \"member('server2') and member('telephones')\"" + "}," + "{" + " \"name\": \"server2_and_computers\"," + " \"test\": \"member('server2') and member('computers')\"" + "} ]," + "\"subnet4\": [ { " + " \"subnet\": \"10.0.0.0/24\", " + " \"id\": 1," + " \"pools\": [ " + " { \"pool\": \"10.0.0.10-10.0.0.49\"," + " \"client-class\": \"server1_and_telephones\" }," + " { \"pool\": \"10.0.0.60-10.0.0.99\"," + " \"client-class\": \"server1_and_computers\" }," + " { \"pool\": \"10.0.0.110-10.0.0.149\"," + " \"client-class\": \"server2_and_telephones\" }," + " { \"pool\": \"10.0.0.160-10.0.0.199\"," + " \"client-class\": \"server2_and_computers\" } ]" + " } ]" + "}", }; @@ -633,6 +695,106 @@ TEST_F(ClassifyTest, fixedFieldsInformFile32) { testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "", "ipxe.efi"); } +// This test checks the complex membership from HA with server1 telephone. +TEST_F(ClassifyTest, server1Telephone) { + Dhcp4Client client(Dhcp4Client::SELECTING); + + // Configure DHCP server. + configure(CONFIGS[4], *client.getServer()); + + // Add option. + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + client.addExtraOption(pxe); + + // Add server1 + client.addClass("server1"); + + // Get an address + client.doDORA(); + + // Check response. + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the first pool. + EXPECT_EQ("10.0.0.10", resp->getYiaddr().toText()); +} + +// This test checks the complex membership from HA with server1 computer. +TEST_F(ClassifyTest, server1computer) { + Dhcp4Client client(Dhcp4Client::SELECTING); + + // Configure DHCP server. + configure(CONFIGS[4], *client.getServer()); + + // Add option. + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); + client.addExtraOption(pxe); + + // Add server1 + client.addClass("server1"); + + // Get an address + client.doDORA(); + + // Check response. + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the second pool. + EXPECT_EQ("10.0.0.60", resp->getYiaddr().toText()); +} + +// This test checks the complex membership from HA with server2 telephone. +TEST_F(ClassifyTest, server2Telephone) { + Dhcp4Client client(Dhcp4Client::SELECTING); + + // Configure DHCP server. + configure(CONFIGS[4], *client.getServer()); + + // Add option. + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0009)); + client.addExtraOption(pxe); + + // Add server2 + client.addClass("server2"); + + // Get an address + client.doDORA(); + + // Check response. + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the third pool. + EXPECT_EQ("10.0.0.110", resp->getYiaddr().toText()); +} + +// This test checks the complex membership from HA with server2 computer. +TEST_F(ClassifyTest, server2computer) { + Dhcp4Client client(Dhcp4Client::SELECTING); + + // Configure DHCP server. + configure(CONFIGS[4], *client.getServer()); + + // Add option. + OptionPtr pxe(new OptionInt(Option::V4, 93, 0x0007)); + client.addExtraOption(pxe); + + // Add server2 + client.addClass("server2"); + + // Get an address + client.doDORA(); + + // Check response. + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the forth pool. + EXPECT_EQ("10.0.0.160", resp->getYiaddr().toText()); +} + // This test checks the precedence order in required evaluation. // This order is: shared-network > subnet > pools TEST_F(ClassifyTest, precedenceNone) { diff --git a/src/bin/dhcp4/tests/dhcp4_client.cc b/src/bin/dhcp4/tests/dhcp4_client.cc index c117ba4320..8475989105 100644 --- a/src/bin/dhcp4/tests/dhcp4_client.cc +++ b/src/bin/dhcp4/tests/dhcp4_client.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -238,6 +238,14 @@ Dhcp4Client::appendExtraOptions() { } } +void +Dhcp4Client::appendClasses() { + for (ClientClasses::const_iterator cclass = classes_.cbegin(); + cclass != classes_.cend(); ++cclass) { + context_.query_->addClass(*cclass); + } +} + void Dhcp4Client::doDiscover(const boost::shared_ptr& requested_addr) { context_.query_ = createMsg(DHCPDISCOVER); @@ -255,6 +263,7 @@ Dhcp4Client::doDiscover(const boost::shared_ptr& requested_addr) { context_.query_->setCiaddr(ciaddr_.get()); } appendExtraOptions(); + appendClasses(); // Send the message to the server. sendMsg(context_.query_); @@ -277,6 +286,8 @@ Dhcp4Client::doInform(const bool set_ciaddr) { appendPRL(); // Any other options to be sent by a client. appendExtraOptions(); + // Add classes. + appendClasses(); // The client sending a DHCPINFORM message has an IP address obtained // by some other means, e.g. static configuration. The lease which we // are using here is most likely set by the createLease method. @@ -396,6 +407,8 @@ Dhcp4Client::doRequest() { appendClientId(); // Any other options to be sent by a client. appendExtraOptions(); + // Add classes. + appendClasses(); // Send the message to the server. sendMsg(context_.query_); // Expect response. @@ -518,6 +531,12 @@ Dhcp4Client::sendMsg(const Pkt4Ptr& msg) { msg_copy->setRemoteAddr(msg->getLocalAddr()); msg_copy->setLocalAddr(dest_addr_); msg_copy->setIface(iface_name_); + // Copy classes + const ClientClasses& classes = msg->getClasses(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + msg_copy->addClass(*cclass); + } srv_->fakeReceive(msg_copy); srv_->run(); } @@ -536,6 +555,13 @@ Dhcp4Client::addExtraOption(const OptionPtr& opt) { extra_options_.insert(std::make_pair(opt->getType(), opt)); } +void +Dhcp4Client::addClass(const ClientClass& client_class) { + if (!classes_.contains(client_class)) { + classes_.insert(client_class); + } +} + } // end of namespace isc::dhcp::test } // end of namespace isc::dhcp } // end of namespace isc diff --git a/src/bin/dhcp4/tests/dhcp4_client.h b/src/bin/dhcp4/tests/dhcp4_client.h index a30b7d821f..887ddd98b1 100644 --- a/src/bin/dhcp4/tests/dhcp4_client.h +++ b/src/bin/dhcp4/tests/dhcp4_client.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -369,12 +369,22 @@ public: /// @param opt additional option to be sent void addExtraOption(const OptionPtr& opt); + /// @brief Add a client class. + /// + /// @param client_class name of the class to be added. + void addClass(const ClientClass& client_class); + private: /// @brief Appends extra options, previously added with addExtraOption() /// /// @brief Copies options from extra_options_ into outgoing message void appendExtraOptions(); + /// @brief Appends extra classes, previously added with addClass() + /// + /// @brief Add client classes from classes_ to incoming message + void appendClasses(); + /// @brief Creates and adds Requested IP Address option to the client's /// query. /// @@ -491,6 +501,9 @@ private: /// @brief Extra options the client will send. OptionCollection extra_options_; + + /// @brief Extra classes to add to the query. + ClientClasses classes_; }; } // end of namespace isc::dhcp::test diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 99611da61e..6ca129a4bb 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -46,6 +46,27 @@ namespace { /// the 'foo' value. /// - There is one subnet specified 2001:db8:1::/48 with pool of /// IPv6 addresses. +/// +/// - Configuration 1: +/// - Used for complex membership (example taken from HA) +/// - 1 subnet: 2001:db8:1::/48 +/// - 4 pools: 2001:db8:1:1::/64, 2001:db8:1:2::/64, +/// 2001:db8:1:3::/64 and 2001:db8:1:4::/64 +/// - 4 classes to compose: +/// server1 and server2 for each HA server +/// option 1234 'foo' aka telephones +/// option 1234 'bar' aka computers +/// +/// - Configuration 2: +/// - Used for complex membership (example taken from HA) and pd-pools +/// - 1 subnet: 2001:db8::/32 +/// - 4 pd-pools: 2001:db8:1::/48, 2001:db8:2::/48, +/// 2001:db8:3::/48 and 2001:db8:4::/48 +/// - 4 classes to compose: +/// server1 and server2 for each HA server +/// option 1234 'foo' aka telephones +/// option 1234 'bar' aka computers +/// const char* CONFIGS[] = { // Configuration 0 "{ \"interfaces-config\": {" @@ -104,7 +125,128 @@ const char* CONFIGS[] = { " \"client-classes\": [ \"reserved-class1\", \"reserved-class2\" ]" " } ]" " } ]," + "\"valid-lifetime\": 4000 }", + + // Configuration 1 + "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"option-def\": [ " + "{" + " \"name\": \"host-name\"," + " \"code\": 1234," + " \"type\": \"string\"" + "} ]," + "\"client-classes\": [" + "{" + " \"name\": \"server1\"" + "}," + "{" + " \"name\": \"server2\"" + "}," + "{" + " \"name\": \"telephones\"," + " \"test\": \"option[host-name].text == 'foo'\"" + "}," + "{" + " \"name\": \"computers\"," + " \"test\": \"option[host-name].text == 'bar'\"" + "}," + "{" + " \"name\": \"server1_and_telephones\"," + " \"test\": \"member('server1') and member('telephones')\"" + "}," + "{" + " \"name\": \"server1_and_computers\"," + " \"test\": \"member('server1') and member('computers')\"" + "}," + "{" + " \"name\": \"server2_and_telephones\"," + " \"test\": \"member('server2') and member('telephones')\"" + "}," + "{" + " \"name\": \"server2_and_computers\"," + " \"test\": \"member('server2') and member('computers')\"" + "}" + "]," + "\"subnet6\": [ " + "{ \"subnet\": \"2001:db8:1::/48\", " + " \"interface\": \"eth1\"," + " \"pools\": [ " + " { \"pool\": \"2001:db8:1:1::/64\"," + " \"client-class\": \"server1_and_telephones\" }," + " { \"pool\": \"2001:db8:1:2::/64\"," + " \"client-class\": \"server1_and_computers\" }," + " { \"pool\": \"2001:db8:1:3::/64\"," + " \"client-class\": \"server2_and_telephones\" }," + " { \"pool\": \"2001:db8:1:4::/64\"," + " \"client-class\": \"server2_and_computers\" } ]" + " } ]," + "\"valid-lifetime\": 4000 }", + + // Configuration 2 + "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"option-def\": [ " + "{" + " \"name\": \"host-name\"," + " \"code\": 1234," + " \"type\": \"string\"" + "} ]," + "\"client-classes\": [" + "{" + " \"name\": \"server1\"" + "}," + "{" + " \"name\": \"server2\"" + "}," + "{" + " \"name\": \"telephones\"," + " \"test\": \"option[host-name].text == 'foo'\"" + "}," + "{" + " \"name\": \"computers\"," + " \"test\": \"option[host-name].text == 'bar'\"" + "}," + "{" + " \"name\": \"server1_and_telephones\"," + " \"test\": \"member('server1') and member('telephones')\"" + "}," + "{" + " \"name\": \"server1_and_computers\"," + " \"test\": \"member('server1') and member('computers')\"" + "}," + "{" + " \"name\": \"server2_and_telephones\"," + " \"test\": \"member('server2') and member('telephones')\"" + "}," + "{" + " \"name\": \"server2_and_computers\"," + " \"test\": \"member('server2') and member('computers')\"" + "}" + "]," + "\"subnet6\": [ " + "{ \"subnet\": \"2001:db8::/32\", " + " \"interface\": \"eth1\"," + " \"pools\": [ " + " { \"pool\": \"2001:db8:1::/48\"," + " \"client-class\": \"server1_and_telephones\" }," + " { \"pool\": \"2001:db8:2::/48\"," + " \"client-class\": \"server1_and_computers\" }," + " { \"pool\": \"2001:db8:3::/48\"," + " \"client-class\": \"server2_and_telephones\" }," + " { \"pool\": \"2001:db8:4::/48\"," + " \"client-class\": \"server2_and_computers\" } ]" + " } ]," "\"valid-lifetime\": 4000 }" + }; /// @brief Test fixture class for testing client classification by the @@ -1551,4 +1693,32 @@ TEST_F(ClassifyTest, precedenceNetwork) { EXPECT_EQ("2001:db8:1::3", addrs[0].toText()); } +// This test checks the complex membership from HA with server1 telephone. +TEST_F(ClassifyTest, server1Telephone) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestAddress(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + client.addExtraOption(hostname); + + // Add server1 + client.addClass("server1"); + + // Load the config and perform a SARR + configure(CONFIGS[1], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the first pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:1:1::", lease_client.addr_.toText()); +} + } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/dhcp6_client.cc b/src/bin/dhcp6/tests/dhcp6_client.cc index f32189d294..8ab931cd6c 100644 --- a/src/bin/dhcp6/tests/dhcp6_client.cc +++ b/src/bin/dhcp6/tests/dhcp6_client.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -423,6 +423,12 @@ Dhcp6Client::createMsg(const uint8_t msg_type) { } } + // Add classes. + for (ClientClasses::const_iterator cclass = classes_.cbegin(); + cclass != classes_.cend(); ++cclass) { + msg->addClass(*cclass); + } + return (msg); } @@ -930,6 +936,13 @@ Dhcp6Client::sendMsg(const Pkt6Ptr& msg) { msg_copy->setLocalAddr(dest_addr_); msg_copy->setIface(iface_name_); + // Copy classes + const ClientClasses& classes = msg->getClasses(); + for (ClientClasses::const_iterator cclass = classes.cbegin(); + cclass != classes.cend(); ++cclass) { + msg_copy->addClass(*cclass); + } + srv_->fakeReceive(msg_copy); srv_->run(); } @@ -969,6 +982,18 @@ Dhcp6Client::clearExtraOptions() { extra_options_.clear(); } +void +Dhcp6Client::addClass(const ClientClass& client_class) { + if (!classes_.contains(client_class)) { + classes_.insert(client_class); + } +} + +void +Dhcp6Client::clearClasses() { + classes_.clear(); +} + void Dhcp6Client::printConfiguration() const { diff --git a/src/bin/dhcp6/tests/dhcp6_client.h b/src/bin/dhcp6/tests/dhcp6_client.h index 3402bc6c26..80ff2c37c1 100644 --- a/src/bin/dhcp6/tests/dhcp6_client.h +++ b/src/bin/dhcp6/tests/dhcp6_client.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -753,6 +753,14 @@ public: /// @brief Configures the client to not send any extra options. void clearExtraOptions(); + /// @brief Add a client class. + /// + /// @param client_class name of the class to be added. + void addClass(const ClientClass& client_class); + + /// @brief Configures the client to not add client classes. + void clearClasses(); + /// @brief Debugging method the prints currently held configuration /// /// @todo: This is mostly useful when debugging tests. This method @@ -927,6 +935,9 @@ private: /// @brief Interface id. OptionPtr interface_id_; + + /// @brief Extra classes to add to the query. + ClientClasses classes_; }; } // end of namespace isc::dhcp::test From 317b6afe7d6777240cc678c3eec5c5d7d5732e0b Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 8 Apr 2018 00:37:01 +0200 Subject: [PATCH 49/52] [5374] Finished to address comments --- .../dhcp4/tests/shared_network_unittest.cc | 240 ++++-------------- src/bin/dhcp6/tests/classify_unittests.cc | 214 +++++++++++++++- .../dhcp6/tests/shared_network_unittest.cc | 240 ++++-------------- .../tests/client_class_def_parser_unittest.cc | 38 ++- 4 files changed, 330 insertions(+), 402 deletions(-) diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index 2c92453ab8..293e8506c0 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1205,6 +1205,41 @@ public: ASSERT_NO_FATAL_FAILURE(verifyAssignedStats()); } + /// @brief Check precedence. + /// + /// @param config the configuration. + /// @param ns_address expected name server address. + void testPrecedence(const std::string& config, const std::string& ns_address) { + // Create client and set MAC address to the one that has a reservation. + Dhcp4Client client(Dhcp4Client::SELECTING); + client.setIfaceName("eth1"); + client.setHWAddress("aa:bb:cc:dd:ee:ff"); + // Request domain-name-servers. + client.requestOptions(DHO_DOMAIN_NAME_SERVERS); + + // Create server configuration. + configure(config, *client.getServer()); + + // Perform a DORA. + doDORA(client, "192.0.2.28", "192.0.2.28"); + + // Check response. + Pkt4Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + EXPECT_EQ(DHCPACK, resp->getType()); + EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); + + // Check domain-name-servers option. + OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); + ASSERT_TRUE(opt); + Option4AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ(ns_address, addrs[0].toText()); + } + /// @brief Destructor. virtual ~Dhcpv4SharedNetworkTest() { StatsMgr::instance().removeAll(); @@ -2091,34 +2126,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceGlobal) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.1", addrs[0].toText()); + testPrecedence(config, "192.0.2.1"); } // Verify option processing precedence @@ -2173,34 +2181,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceClass) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.2", addrs[0].toText()); + testPrecedence(config, "192.0.2.2"); } // Verify option processing precedence @@ -2265,35 +2246,8 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceClasses) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); // Class order is the insert order - EXPECT_EQ("192.0.2.2", addrs[0].toText()); + testPrecedence(config, "192.0.2.2"); } // Verify option processing precedence @@ -2354,34 +2308,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceNetwork) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.3", addrs[0].toText()); + testPrecedence(config, "192.0.2.3"); } // Verify option processing precedence @@ -2448,34 +2375,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceSubnet) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.4", addrs[0].toText()); + testPrecedence(config, "192.0.2.4"); } // Verify option processing precedence @@ -2548,34 +2448,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedencePool) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.5", addrs[0].toText()); + testPrecedence(config, "192.0.2.5"); } // Verify option processing precedence @@ -2654,34 +2527,7 @@ TEST_F(Dhcpv4SharedNetworkTest, precedenceReservation) { " ]" "}"; - // Create client and set MAC address to the one that has a reservation. - Dhcp4Client client(Dhcp4Client::SELECTING); - client.setIfaceName("eth1"); - client.setHWAddress("aa:bb:cc:dd:ee:ff"); - // Request domain-name-servers - client.requestOptions(DHO_DOMAIN_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform a DORA - doDORA(client, "192.0.2.28", "192.0.2.28"); - - // Check response - Pkt4Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - EXPECT_EQ(DHCPACK, resp->getType()); - EXPECT_EQ("192.0.2.28", resp->getYiaddr().toText()); - - // Check domain-name-servers option - OptionPtr opt = resp->getOption(DHO_DOMAIN_NAME_SERVERS); - ASSERT_TRUE(opt); - Option4AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("192.0.2.6", addrs[0].toText()); + testPrecedence(config, "192.0.2.6"); } } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 6ca129a4bb..c7d90acdbd 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -235,14 +235,18 @@ const char* CONFIGS[] = { "\"subnet6\": [ " "{ \"subnet\": \"2001:db8::/32\", " " \"interface\": \"eth1\"," - " \"pools\": [ " - " { \"pool\": \"2001:db8:1::/48\"," + " \"pd-pools\": [ " + " { \"prefix\": \"2001:db8:1::\"," + " \"prefix-len\": 48, \"delegated-len\": 64," " \"client-class\": \"server1_and_telephones\" }," - " { \"pool\": \"2001:db8:2::/48\"," + " { \"prefix\": \"2001:db8:2::\"," + " \"prefix-len\": 48, \"delegated-len\": 64," " \"client-class\": \"server1_and_computers\" }," - " { \"pool\": \"2001:db8:3::/48\"," + " { \"prefix\": \"2001:db8:3::\"," + " \"prefix-len\": 48, \"delegated-len\": 64," " \"client-class\": \"server2_and_telephones\" }," - " { \"pool\": \"2001:db8:4::/48\"," + " { \"prefix\": \"2001:db8:4::\"," + " \"prefix-len\": 48, \"delegated-len\": 64," " \"client-class\": \"server2_and_computers\" } ]" " } ]," "\"valid-lifetime\": 4000 }" @@ -1721,4 +1725,204 @@ TEST_F(ClassifyTest, server1Telephone) { EXPECT_EQ("2001:db8:1:1::", lease_client.addr_.toText()); } +// This test checks the complex membership from HA with server1 computer. +TEST_F(ClassifyTest, server1Computer) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestAddress(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "bar")); + client.addExtraOption(hostname); + + // Add server1 + client.addClass("server1"); + + // Load the config and perform a SARR + configure(CONFIGS[1], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the second pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:1:2::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server2 telephone. +TEST_F(ClassifyTest, server2Telephone) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestAddress(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + client.addExtraOption(hostname); + + // Add server2 + client.addClass("server2"); + + // Load the config and perform a SARR + configure(CONFIGS[1], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the third pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:1:3::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server2 computer. +TEST_F(ClassifyTest, server2Computer) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestAddress(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "bar")); + client.addExtraOption(hostname); + + // Add server2 + client.addClass("server2"); + + // Load the config and perform a SARR + configure(CONFIGS[1], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The address is from the forth pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:1:4::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server1 telephone +// with prefixes. +TEST_F(ClassifyTest, pDserver1Telephone) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestPrefix(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + client.addExtraOption(hostname); + + // Add server1 + client.addClass("server1"); + + // Load the config and perform a SARR + configure(CONFIGS[2], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The prefix is from the first pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:1::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server1 computer +// with prefix. +TEST_F(ClassifyTest, pDserver1Computer) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestPrefix(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "bar")); + client.addExtraOption(hostname); + + // Add server1 + client.addClass("server1"); + + // Load the config and perform a SARR + configure(CONFIGS[2], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The prefix is from the second pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:2::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server2 telephone +// with prefixes. +TEST_F(ClassifyTest, pDserver2Telephone) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestPrefix(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "foo")); + client.addExtraOption(hostname); + + // Add server2 + client.addClass("server2"); + + // Load the config and perform a SARR + configure(CONFIGS[2], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The prefix is from the third pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:3::", lease_client.addr_.toText()); +} + +// This test checks the complex membership from HA with server2 computer +// with prefix. +TEST_F(ClassifyTest, pDserver2Computer) { + // Create a client. + Dhcp6Client client; + client.setInterface("eth1"); + ASSERT_NO_THROW(client.requestPrefix(0xabca0)); + + // Add option. + OptionStringPtr hostname(new OptionString(Option::V6, 1234, "bar")); + client.addExtraOption(hostname); + + // Add server2 + client.addClass("server2"); + + // Load the config and perform a SARR + configure(CONFIGS[2], *client.getServer()); + ASSERT_NO_THROW(client.doSARR()); + + // Check response + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // The prefix is from the forth pool. + ASSERT_EQ(1, client.getLeaseNum()); + Lease6 lease_client = client.getLease(0); + EXPECT_EQ("2001:db8:4::", lease_client.addr_.toText()); +} + } // end of anonymous namespace diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index 1f12e76e9f..800db9cc55 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1452,6 +1452,41 @@ public: } } + /// @brief Check precedence. + /// + /// @param config the configuration. + /// @param ns_address expected name server address. + void testPrecedence(const std::string& config, const std::string& ns_address) { + // Create client and set DUID to the one that has a reservation. + Dhcp6Client client; + client.setInterface("eth1"); + client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); + client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); + // Request dns-servers. + client.requestOption(D6O_NAME_SERVERS); + + // Create server configuration. + configure(config, *client.getServer()); + + // Perform SARR. + ASSERT_NO_THROW(client.doSARR()); + + // Check response. + EXPECT_EQ(1, client.getLeaseNum()); + Pkt6Ptr resp = client.getContext().response_; + ASSERT_TRUE(resp); + + // Check dns-servers option. + OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); + ASSERT_TRUE(opt); + Option6AddrLstPtr servers = + boost::dynamic_pointer_cast(opt); + ASSERT_TRUE(servers); + auto addrs = servers->getAddresses(); + ASSERT_EQ(1, addrs.size()); + EXPECT_EQ(ns_address, addrs[0].toText()); + } + /// @brief Destructor. virtual ~Dhcpv6SharedNetworkTest() { StatsMgr::instance().removeAll(); @@ -2469,34 +2504,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceGlobal) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::1", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::1"); } // Verify option processing precedence @@ -2547,34 +2555,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceClass) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::2"); } // Verify option processing precedence @@ -2635,35 +2616,8 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceClasses) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); // Class order is the insert order - EXPECT_EQ("2001:db8:1::2", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::2"); } // Verify option processing precedence @@ -2720,34 +2674,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceNetworkClass) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::3", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::3"); } // Verify option processing precedence @@ -2810,34 +2737,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceSubnet) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::4", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::4"); } // Verify option processing precedence @@ -2906,34 +2806,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedencePool) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::5", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::5"); } // Verify option processing precedence @@ -3008,34 +2881,7 @@ TEST_F(Dhcpv6SharedNetworkTest, precedenceReservation) { " ]" "}"; - // Create client and set DUID to the one that has a reservation. - Dhcp6Client client; - client.setInterface("eth1"); - client.setDUID("00:03:00:01:aa:bb:cc:dd:ee:ff"); - client.requestAddress(0xabca, IOAddress("2001:db8:1::28")); - // Request dns-servers - client.requestOption(D6O_NAME_SERVERS); - - // Create server configuration - configure(config, *client.getServer()); - - // Perform SARR - ASSERT_NO_THROW(client.doSARR()); - - // Check response - EXPECT_EQ(1, client.getLeaseNum()); - Pkt6Ptr resp = client.getContext().response_; - ASSERT_TRUE(resp); - - // Check dns-servers option - OptionPtr opt = resp->getOption(D6O_NAME_SERVERS); - ASSERT_TRUE(opt); - Option6AddrLstPtr servers = - boost::dynamic_pointer_cast(opt); - ASSERT_TRUE(servers); - auto addrs = servers->getAddresses(); - ASSERT_EQ(1, addrs.size()); - EXPECT_EQ("2001:db8:1::6", addrs[0].toText()); + testPrecedence(config, "2001:db8:1::6"); } } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc b/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc index 474c551f25..d3af6cf043 100644 --- a/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -925,8 +925,8 @@ TEST_F(ClientClassDefListParserTest, dependentList) { EXPECT_EQ("three", cclass->getName()); } -// Verifies that forward dependencies will not parse. -TEST_F(ClientClassDefListParserTest, dependentForwardError) { +// Verifies that not defined dependencies will not parse. +TEST_F(ClientClassDefListParserTest, dependentNotDefined) { std::string cfg_text = "[ \n" " { \n" @@ -938,4 +938,36 @@ TEST_F(ClientClassDefListParserTest, dependentForwardError) { EXPECT_THROW(parseClientClassDefList(cfg_text, AF_INET6), DhcpConfigError); } +// Verifies that forward dependencies will not parse. +TEST_F(ClientClassDefListParserTest, dependentForwardError) { + std::string cfg_text = + "[ \n" + " { \n" + " \"name\": \"one\", \n" + " \"test\": \"member('foo')\" \n" + " }, \n" + " { \n" + " \"name\": \"foo\" \n" + " } \n" + "] \n"; + + EXPECT_THROW(parseClientClassDefList(cfg_text, AF_INET6), DhcpConfigError); +} + +// Verifies that backward dependencies will parse. +TEST_F(ClientClassDefListParserTest, dependentBackward) { + std::string cfg_text = + "[ \n" + " { \n" + " \"name\": \"foo\" \n" + " }, \n" + " { \n" + " \"name\": \"one\", \n" + " \"test\": \"member('foo')\" \n" + " } \n" + "] \n"; + + EXPECT_NO_THROW(parseClientClassDefList(cfg_text, AF_INET6)); +} + } // end of anonymous namespace From 422df21fb6682b21b1a5afb74f88d298ef780bcd Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Mon, 9 Apr 2018 16:50:53 +0200 Subject: [PATCH 50/52] [5374] Some corrections in the new client classification text of User Guide. --- doc/guide/classify.xml | 55 ++++++++++++++++++++--------------------- doc/guide/dhcp4-srv.xml | 38 ++++++++++++++-------------- doc/guide/dhcp6-srv.xml | 40 +++++++++++++++--------------- 3 files changed, 66 insertions(+), 67 deletions(-) diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 06e7beebf6..4e800f327f 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -29,8 +29,8 @@ - At the opposite some clients can be grouped into a client class for - instance to get a common option. + Conversely, different clients can be grouped into a client class to get a + common option. @@ -38,7 +38,7 @@ serveral ways: - Implicitely using a vendor class option or another builtin condition. + Implicitly, using a vendor class option or another builtin condition. Using an expression which evaluates to true. @@ -55,10 +55,8 @@ It is envisaged that client classification will be used for changing the behavior of almost any part of the DHCP message - processing, including the assignment of leases from different - pools, the assignment of different options (or different values - of the same options) etc. In the current release of the software - however, there are only five mechanisms that take advantage of + processing. In the current release of the software however, + there are only five mechanisms that take advantage of client classification: subnet selection, pool selection, definition of DHCPv4 private (codes 224-254) and code 43 options, assignment of different options and, for DHCPv4 cable @@ -76,11 +74,11 @@ Vendor class options are processed. - Classes with matching expressions and not marked for later - evaluation are processed in the order they are defined in the - configuration: the boolean expression is evaluated and when it - returns true ("match") the incoming packet is associated to the - class. + Classes with matching expressions and not marked for later ("on + request") evaluation are processed in the order they are defined + in the configuration: the boolean expression is evaluated and + when it returns true ("match") the incoming packet is associated + to the class. If a private or code 43 DHCPv4 option is received, decoding it @@ -89,7 +87,7 @@ Choose a subnet, possibly based on the class information when - some subnets are guarded. More exactly: When choosing a subnet, + some subnets are guarded. More precisely: when choosing a subnet, the server will iterate over all of the subnets that are feasible given the information found in the packet (client address, relay address etc). It will use the first subnet it @@ -111,14 +109,13 @@ class. - If needed resources from pools are assigned, possibly based on the + If needed, resources from pools are assigned, possibly based on the class information when some pools are reserved to class members. - Process required evaluation in the order classes are required - which uses the reverse precedence of option data: first shared - network, after the subnet and to finish pools assigned resources - belongs too. + Evaluate classes marked as "required" in the order in which they + are listed as required: first shared network, then the subnet + and to finally pools assigned resources belong too. Assign options, again possibly based on the class information @@ -133,15 +130,15 @@ Beginning with Kea 1.4.0 release, client classes follow the order in which they are specified in the configuration - (vs. alphabetical order in previous versions), or for required - classes the order they are required. + (vs. alphabetical order in previous releases). Required classes + follow the order in which they are required. - When determining which options to include in the response the + When determining which options to include in the response, the server will examine the union of options from all of the - assigned classes. In the case two or more classes include the + assigned classes. In case when two or more classes include the same option, the value from the first class examined will be used, and classes are examined in the order they were associated so ALL is always the first class and matching required classes @@ -182,16 +179,17 @@ packet will belong to class "VENDOR_CLASS_docsis3.0". - Other examples are the ALL class what all incoming packets - belongs to, and the KNOWN class. By convention builtin classes - names begin with all caps. + Other examples are: the ALL class which all incoming packets + belong to, and the KNOWN class assigned when host reservations exist + for the particular client. By convention, builtin classes' names + begin with all capital letters. Currently recognized builtin class names are ALL and KNOWN and prefixes VENDOR_CLASS_, AFTER_ and EXTERNAL_. The AFTER_ prefix is a provision for a not yet written hook, the EXTERNAL_ prefix can be freely used: builtin classes are implicitly defined so - never raise warnings because they do not appear in the configuration. + never raise warnings if they do not appear in the configuration.
@@ -236,7 +234,7 @@ Dependencies between classes are checked too: for instance forward dependencies are rejected when the configuration is parsed: - an expression can only depends on already defined classes (including + an expression can only depend on already defined classes (including builtin classes) and which are evaluated in a previous or the same evaluation phase. This does not apply to the KNOWN class. @@ -798,7 +796,8 @@ concatenation of the strings subnet, shared-network or pools are known but output option processing not yet done. The only-if-required flag, false by default, allows to perform the evaluation of the test expression only - when it was required, i.e. in a require-client-classes list. + when it was required, i.e. in a require-client-classes list of the + selected subnet, shared-network or pool. diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 7fed462b7b..2429651262 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2061,10 +2061,8 @@ It is merely echoed by the server In certain cases it is useful to differentiate between different types of clients and treat them accordingly. It is envisaged that client classification will be used for changing the behavior of almost any part of - the DHCP message processing, including the assignment of leases from different - pools, the assignment of different options (or different values of the same - options) etc. In the current release of the software however, there are - only some mechanisms that take advantage of client classification: + the DHCP message processing. In the current release of the software however, + there are only some mechanisms that take advantage of client classification: private options and option 43 deferred unpacking, subnet selection, pool selection, assignment of different options, and, for cable modems, there are specific options for use with the TFTP server address and the boot file field. @@ -2111,7 +2109,7 @@ It is merely echoed by the server on examining the values in the vendor class options or existence of a host reservation. Information from these options is extracted and a class name is constructed from it and added to - the class list for the packet. The second allows you to specify an expression + the class list for the packet. The second allows for specifying an expression that is evaluated for each packet. If the result is true the packet is a member of the class. @@ -2256,31 +2254,33 @@ It is merely echoed by the server
- Required classification + Required Classification - In some cases it is useful to limit the scope of class. - Two devices are available to perform evaluation of test - expressions so assignment when it was required. + In some cases it is useful to limit the scope of a class to + a shared-network, subnet or pool. There are two parameters + which are used to limit the scope of the class by instructing + the server to perform evaluation of test expressions when + required. The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not - evaluated at the reception of a new incoming ticket but - later and only if the class evaluation is required. + evaluated at the reception of the incoming packet but later and + only if the class evaluation is required. The second is the require-client-classes which takes a list of class names and is valid in shared-network, subnet and pool scope. Classes in these lists are marked as - required and evaluated - after resource assignment and before output option processing. + required and evaluated after selection of this specific + shared-network/subnet/pool and before output option processing. - In this example a class is assigned to the incoming packet + In this example, a class is assigned to the incoming packet when the specified subnet is used. @@ -2307,17 +2307,17 @@ It is merely echoed by the server - Required evaluation can be used to express complex dependencies - including for instance subnet membership, and to reverse the + Required evaluation can be used to express complex dependencies, + for example, subnet membership. It can also be used to reverse the precedence: if you set an option-data in a subnet it takes precedence over an option-data in a class. When you move the - option-data to a (only-if) required class and require it in - the subnet a class evaluted or set before takes precedence. + option-data to a required class and require it in + the subnet, a class evaluted earlier may take precedence. Required evaluation is also available at shared-network and - pool levels. The order required classes are considered is + pool levels. The order in which required classes are considered is: shared-network, subnet and pool, i.e. the opposite order option-data are processed. diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 9a671c2def..50c59aefed 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1921,10 +1921,8 @@ should include options from the isc option space: In certain cases it is useful to differentiate between different types of clients and treat them accordingly. It is envisaged that client classification will be used for changing the behavior of almost any part of - the DHCP message processing, including the assignment of leases from different - pools, the assignment of different options (or different values of the same - options) etc. In the current release of the software however, there are - only some mechanisms that take advantage of client classification: + the DHCP message processing. In the current release of the software however, + there are only some mechanisms that take advantage of client classification: subnet selection, pool selection, and assignment of different options. @@ -1970,7 +1968,7 @@ should include options from the isc option space: on examining the values in the vendor class options or existence of a host reservation. Information from these options is extracted and a class name is constructed from it and added to - the class list for the packet. The second allows you to specify an expression + the class list for the packet. The second allows for specifying an expression that is evaluated for each packet. If the result is true the packet is a member of the class. @@ -2049,29 +2047,31 @@ should include options from the isc option space:
Required classification - In some cases it is useful to limit the scope of class. - Two devices are available to perform evaluation of test - expressions so assignment when it was required. + In some cases it is useful to limit the scope of a class to + a shared-network, subnet or pool. There are two parameters + which are used to limit the scope of the class by instructing + the server to perform evaluation of test expressions when + required. The first one is the per-class only-if-required flag which is false by default. When it is set to true the test expression of the class is not - evaluated at the reception of a new incoming ticket but - later and only if the class evaluation is required. + evaluated at the reception of the incoming packet but later and + only if the class evaluation is required. The second is the require-client-classes which takes a list of class names and is valid in shared-network, subnet and pool scope. Classes in these lists are marked as - required and evaluated - after resource assignment and before output option processing. + required and evaluated after selection of this specific + shared-network/subnet/pool and before output option processing. - In this example a class is assigned to the incoming packet + In this example, a class is assigned to the incoming packet when the specified subnet is used. @@ -2102,19 +2102,19 @@ should include options from the isc option space: - Required evaluation can be used to express complex dependencies - including for instance subnet membership, and to reverse the + Required evaluation can be used to express complex dependencies, + for example, subnet membership. It can also be used to reverse the precedence: if you set an option-data in a subnet it takes precedence over an option-data in a class. When you move the - option-data to a (only-if) required class and require it in - the subnet a class evaluted or set before takes precedence. + option-data to a required class and require it in + the subnet, a class evaluted earlier may take precedence. Required evaluation is also available at shared-network and - pool/pd-pool levels. The order required classes are considered is - shared-network, subnet and (pd-)pool, i.e. the opposite order - option-data are processed. + pool/pd-pool levels. The order in which required classes are + considered is: shared-network, subnet and (pd-)pool, i.e. + the opposite order option-data are processed.
From dec1eb86dfb758d2b4b04386b1c13ba6191bcf55 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Mon, 9 Apr 2018 17:34:26 +0200 Subject: [PATCH 51/52] [5374] Doxygen correction in client_class_def.h. --- src/lib/dhcpsrv/client_class_def.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/dhcpsrv/client_class_def.h b/src/lib/dhcpsrv/client_class_def.h index 44b38bbeca..98d9bc5ba1 100644 --- a/src/lib/dhcpsrv/client_class_def.h +++ b/src/lib/dhcpsrv/client_class_def.h @@ -188,10 +188,10 @@ private: /// this class. std::string test_; - /// @brief The only if required flag: when false (the defaul) membership - /// is determined during classification so is for instance - /// available for subnet selection, when true membership is evaluated - /// only when required for and is usable only for option configuration. + /// @brief The only-if-required flag: when false (the default) membership + /// is determined during classification so is available, of instance, + /// for subnet selection. When true, membership is evaluated + /// only when required and is usable only for option configuration. bool required_; /// @brief The option definition configuration for this class From 44f874d62668affec952a2cac723577412fc0f3c Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Tue, 10 Apr 2018 16:42:38 +0200 Subject: [PATCH 52/52] [5374] Addressed comments --- doc/examples/kea4/classify2.json | 3 ++- doc/examples/kea6/classify.json | 2 +- doc/examples/kea6/classify2.json | 5 +++-- doc/guide/classify.xml | 17 +++++++++-------- doc/guide/dhcp4-srv.xml | 4 ++-- doc/guide/dhcp6-srv.xml | 4 ++-- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/doc/examples/kea4/classify2.json b/doc/examples/kea4/classify2.json index 626d5c9ffb..fca82e2ab8 100644 --- a/doc/examples/kea4/classify2.json +++ b/doc/examples/kea4/classify2.json @@ -104,7 +104,8 @@ "hw-address": "1a:1b:1c:1d:1e:1f", "client-classes": [ "VoIP" ] } ], - "interface": "ethX" + "interface": "ethX", + "require-client-classes": [ "second_subnet" ] }, // The following list defines a subnet with pools. For some pools diff --git a/doc/examples/kea6/classify.json b/doc/examples/kea6/classify.json index b6e184b618..2fd3256c21 100644 --- a/doc/examples/kea6/classify.json +++ b/doc/examples/kea6/classify.json @@ -1,4 +1,4 @@ -// This is an example configuration file for the DHCPv4 server in Kea. +// This is an example configuration file for the DHCPv6 server in Kea. // The purpose of this example is to showcase how clients can be classified. { "Dhcp6": diff --git a/doc/examples/kea6/classify2.json b/doc/examples/kea6/classify2.json index aa6a7bd4df..f931ecbfd1 100644 --- a/doc/examples/kea6/classify2.json +++ b/doc/examples/kea6/classify2.json @@ -1,4 +1,4 @@ -// This is an example configuration file for the DHCPv4 server in Kea. +// This is an example configuration file for the DHCPv6 server in Kea. // The purpose of this example is to showcase how clients can be classified. { "Dhcp6": @@ -83,7 +83,8 @@ "duid": "01:02:03:04:05:0A:0B:0C:0D:0E", "client-classes": [ "cable-modems" ] } ], - "interface": "ethX" + "interface": "ethX", + "require-client-classes": [ "second_subnet" ] }, // The following subnet contains a pool with a class constraint: only // clients which belong to the class are allowed to use this pool. diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index 4e800f327f..49f58a7a05 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -75,10 +75,10 @@ Classes with matching expressions and not marked for later ("on - request") evaluation are processed in the order they are defined - in the configuration: the boolean expression is evaluated and - when it returns true ("match") the incoming packet is associated - to the class. + request" or depending on the KNOWN builtin class) evaluation are + processed in the order they are defined in the configuration: + the boolean expression is evaluated and when it returns true + ("match") the incoming packet is associated to the class. If a private or code 43 DHCPv4 option is received, decoding it @@ -101,16 +101,17 @@ of the host reservation. - Classes with matching expressions using directly or indirectly on - the KNOWN builtin class and not marked for only when required + Classes with matching expressions using directly or indirectly + the KNOWN builtin class and not marked for later ("on request") evaluation are processed in the order they are defined in the configuration: the boolean expression is evaluated and when it returns true ("match") the incoming packet is associated to the class. - If needed, resources from pools are assigned, possibly based on the - class information when some pools are reserved to class members. + If needed, addresses and prefixes from pools are assigned, + possibly based on the class information when some pools are + reserved to class members. Evaluate classes marked as "required" in the order in which they diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 2429651262..54b285af5c 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2312,7 +2312,7 @@ It is merely echoed by the server precedence: if you set an option-data in a subnet it takes precedence over an option-data in a class. When you move the option-data to a required class and require it in - the subnet, a class evaluted earlier may take precedence. + the subnet, a class evaluated earlier may take precedence. @@ -3466,7 +3466,7 @@ It is merely echoed by the server Static class assignments, as shown above, can be used in conjunction with classification using expressions. The "KNOWN" builtin class is added to the packet and any class depending on it directly or indirectly - and not only-if-required is evaluted. + and not only-if-required is evaluated. diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 50c59aefed..16ef42e1e7 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -2107,7 +2107,7 @@ should include options from the isc option space: precedence: if you set an option-data in a subnet it takes precedence over an option-data in a class. When you move the option-data to a required class and require it in - the subnet, a class evaluted earlier may take precedence. + the subnet, a class evaluated earlier may take precedence. @@ -2986,7 +2986,7 @@ should include options from the isc option space: Static class assignments, as shown above, can be used in conjunction with classification using expressions. The "KNOWN" builtin class is added to the packet and any class depending on it directly or indirectly - and not only-if-required is evaluted. + and not only-if-required is evaluated.