diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 003fb0de86b5be9f18888672340d16e6c1be758f..82558c2f9283a2fc7cdd13bfc8461d95c2cf3e18 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -243,6 +243,33 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"memfile\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::DATABASE_TYPE: + return isc::dhcp::Dhcp4Parser::make_MEMFILE(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("memfile", driver.loc_); + } +} + +\"mysql\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::DATABASE_TYPE: + return isc::dhcp::Dhcp4Parser::make_MYSQL(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("mysql", driver.loc_); + } +} + +\"postgresql\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::DATABASE_TYPE: + return isc::dhcp::Dhcp4Parser::make_POSTGRESQL(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("postgresql", driver.loc_); + } +} + \"user\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -293,6 +320,16 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"connect-timeout\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::LEASE_DATABASE: + case isc::dhcp::Parser4Context::HOSTS_DATABASE: + return isc::dhcp::Dhcp4Parser::make_CONNECT_TIMEOUT(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("connect-timeout", driver.loc_); + } +} + \"valid-lifetime\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 3c1a4d9179173dadf681a485851070cc96dd7fdd..ebc785af966be9e6d45ab4d520d709a4b2682793 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -63,12 +63,16 @@ using namespace std; LEASE_DATABASE "lease-database" HOSTS_DATABASE "hosts-database" TYPE "type" + MEMFILE "memfile" + MYSQL "mysql" + POSTGRESQL "postgresql" USER "user" PASSWORD "password" HOST "host" PERSIST "persist" LFC_INTERVAL "lfc-interval" READONLY "readonly" + CONNECT_TIMEOUT "connect-timeout" VALID_LIFETIME "valid-lifetime" RENEW_TIMER "renew-timer" @@ -179,6 +183,7 @@ using namespace std; %token BOOLEAN "boolean" %type value +%type db_type %printer { yyoutput << $$; } <*>; @@ -476,17 +481,22 @@ database_map_param: database_type | persist | lfc_interval | readonly + | connect_timeout | unknown_map_entry ; database_type: TYPE { - ctx.enter(ctx.NO_KEYWORD); -} COLON STRING { - ElementPtr prf(new StringElement($4, ctx.loc2pos(@4))); - ctx.stack_.back()->set("type", prf); + ctx.enter(ctx.DATABASE_TYPE); +} COLON db_type { + ctx.stack_.back()->set("type", $4); ctx.leave(); }; +db_type: MEMFILE { $$ = ElementPtr(new StringElement("memfile", ctx.loc2pos(@1))); } + | MYSQL { $$ = ElementPtr(new StringElement("mysql", ctx.loc2pos(@1))); } + | POSTGRESQL { $$ = ElementPtr(new StringElement("postgresql", ctx.loc2pos(@1))); } + ; + user: USER { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { @@ -534,9 +544,9 @@ readonly: READONLY COLON BOOLEAN { ctx.stack_.back()->set("readonly", n); }; -duid_id : DUID { - ElementPtr duid(new StringElement("duid", ctx.loc2pos(@1))); - ctx.stack_.back()->add(duid); +connect_timeout: CONNECT_TIMEOUT COLON INTEGER { + ElementPtr n(new IntElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("connect-timeout", n); }; host_reservation_identifiers: HOST_RESERVATION_IDENTIFIERS { @@ -559,6 +569,11 @@ host_reservation_identifier: duid_id | client_id ; +duid_id : DUID { + ElementPtr duid(new StringElement("duid", ctx.loc2pos(@1))); + ctx.stack_.back()->add(duid); +}; + hw_address_id : HW_ADDRESS { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(@1))); ctx.stack_.back()->add(hwaddr); diff --git a/src/bin/dhcp4/parser_context.cc b/src/bin/dhcp4/parser_context.cc index 909e6e5192f38884b485bdf9400330ef7dd63c3d..c87b0a3ebd165edabfd145b3905d67ef444e3956 100644 --- a/src/bin/dhcp4/parser_context.cc +++ b/src/bin/dhcp4/parser_context.cc @@ -131,6 +131,8 @@ Parser4Context::contextName() return ("lease-database"); case HOSTS_DATABASE: return ("hosts-database"); + case DATABASE_TYPE: + return ("database-type"); case HOST_RESERVATION_IDENTIFIERS: return ("host-reservation-identifiers"); case HOOKS_LIBRARIES: diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index 2a3ae9ec273f5bbf60f2ff78cc9d4805f3080ce6..329062d86327bb8b157dc02ec858022e5e677ee6 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -199,6 +199,9 @@ public: /// Used while parsing Dhcp4/hosts-database structures. HOSTS_DATABASE, + /// Used while parsing Dhcp4/*-database/type. + DATABASE_TYPE, + /// Used while parsing Dhcp4/host-reservation-identifiers. HOST_RESERVATION_IDENTIFIERS, diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 340cc20caee23247ffcace98c679e2bd4a03acfa..5d2d2b5752d7071c7cc393859c48a77835d73344 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -237,6 +237,33 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"memfile\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::DATABASE_TYPE: + return isc::dhcp::Dhcp6Parser::make_MEMFILE(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("memfile", driver.loc_); + } +} + +\"mysql\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::DATABASE_TYPE: + return isc::dhcp::Dhcp6Parser::make_MYSQL(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("mysql", driver.loc_); + } +} + +\"postgresql\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::DATABASE_TYPE: + return isc::dhcp::Dhcp6Parser::make_POSTGRESQL(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("postgresql", driver.loc_); + } +} + \"user\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -288,6 +315,16 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"connect-timeout\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::LEASE_DATABASE: + case isc::dhcp::Parser6Context::HOSTS_DATABASE: + return isc::dhcp::Dhcp6Parser::make_CONNECT_TIMEOUT(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("connect-timeout", driver.loc_); + } +} + \"preferred-lifetime\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 32548f43ae74d3e23e42737ab8fcfb0af2fa8b4c..f93d62788bafb441e590800bb77bd6efe5e42fa5 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -56,12 +56,16 @@ using namespace std; LEASE_DATABASE "lease-database" HOSTS_DATABASE "hosts-database" TYPE "type" + MEMFILE "memfile" + MYSQL "mysql" + POSTGRESQL "postgresql" USER "user" PASSWORD "password" HOST "host" PERSIST "persist" LFC_INTERVAL "lfc-interval" READONLY "readonly" + CONNECT_TIMEOUT "connect-timeout" PREFERRED_LIFETIME "preferred-lifetime" VALID_LIFETIME "valid-lifetime" @@ -188,6 +192,7 @@ using namespace std; %token BOOLEAN "boolean" %type value +%type db_type %type duid_type %printer { yyoutput << $$; } <*>; @@ -466,17 +471,22 @@ database_map_param: database_type | persist | lfc_interval | readonly + | connect_timeout | unknown_map_entry ; database_type: TYPE { - ctx.enter(ctx.NO_KEYWORD); -} COLON STRING { - ElementPtr prf(new StringElement($4, ctx.loc2pos(@4))); - ctx.stack_.back()->set("type", prf); + ctx.enter(ctx.DATABASE_TYPE); +} COLON db_type { + ctx.stack_.back()->set("type", $4); ctx.leave(); }; +db_type: MEMFILE { $$ = ElementPtr(new StringElement("memfile", ctx.loc2pos(@1))); } + | MYSQL { $$ = ElementPtr(new StringElement("mysql", ctx.loc2pos(@1))); } + | POSTGRESQL { $$ = ElementPtr(new StringElement("postgresql", ctx.loc2pos(@1))); } + ; + user: USER { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { @@ -524,6 +534,11 @@ readonly: READONLY COLON BOOLEAN { ctx.stack_.back()->set("readonly", n); }; +connect_timeout: CONNECT_TIMEOUT COLON INTEGER { + ElementPtr n(new IntElement($3, ctx.loc2pos(@3))); + ctx.stack_.back()->set("connect-timeout", n); +}; + mac_sources: MAC_SOURCES { ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("mac-sources", l); diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index 8b1687711f04ebf68ad84228eaa2e6804e35e5de..961d48b982acac8ad7634da46b6704bb52a1f84b 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -131,6 +131,8 @@ Parser6Context::contextName() return ("lease-database"); case HOSTS_DATABASE: return ("hosts-database"); + case DATABASE_TYPE: + return ("database-type"); case MAC_SOURCES: return ("mac-sources"); case HOST_RESERVATION_IDENTIFIERS: diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 1e10fca2afca0fafd21152888573f06be7869bd7..ded4bd5d508e39e00396cdaae032c5f499d8293b 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -202,6 +202,9 @@ public: /// Used while parsing Dhcp6/hosts-database structures. HOSTS_DATABASE, + /// Used while parsing Dhcp6/*-database/type. + DATABASE_TYPE, + /// Used while parsing Dhcp6/mac-sources structures. MAC_SOURCES,