summaryrefslogtreecommitdiffstats
path: root/doc/sphinx/grammar
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sphinx/grammar')
-rw-r--r--doc/sphinx/grammar/grammar-ca-parser.rst253
-rw-r--r--doc/sphinx/grammar/grammar-d2-parser.rst310
-rw-r--r--doc/sphinx/grammar/grammar-dhcp4-parser.rst997
-rw-r--r--doc/sphinx/grammar/grammar-dhcp6-parser.rst1049
-rw-r--r--doc/sphinx/grammar/grammar-netconf-parser.rst221
-rw-r--r--doc/sphinx/grammar/grammar.rst44
6 files changed, 2874 insertions, 0 deletions
diff --git a/doc/sphinx/grammar/grammar-ca-parser.rst b/doc/sphinx/grammar/grammar-ca-parser.rst
new file mode 100644
index 0000000..880d44b
--- /dev/null
+++ b/doc/sphinx/grammar/grammar-ca-parser.rst
@@ -0,0 +1,253 @@
+This grammar is generated from ``agent_parser.yy``. See :ref:`kea-ctrl-agent` for more details.
+
+.. code-block:: BNF
+ :linenos:
+
+ Grammar
+
+ $accept ::= start EOF
+
+ start ::= START_JSON json
+
+ start ::= START_AGENT agent_syntax_map
+
+ start ::= START_SUB_AGENT sub_agent
+
+ sub_agent ::= "{" global_params "}"
+
+ json ::= value
+
+ value ::= INTEGER
+ | FLOAT
+ | BOOLEAN
+ | STRING
+ | NULL
+ | map
+ | list_generic
+
+ map ::= "{" map_content "}"
+
+ map_value ::= map
+
+ map_content ::=
+ | not_empty_map
+
+ not_empty_map ::= STRING ":" value
+ | not_empty_map "," STRING ":" value
+ | not_empty_map ","
+
+ list_generic ::= "[" list_content "]"
+
+ list_content ::=
+ | not_empty_list
+
+ not_empty_list ::= value
+ | not_empty_list "," value
+ | not_empty_list ","
+
+ unknown_map_entry ::= STRING ":"
+
+ agent_syntax_map ::= "{" global_object "}"
+
+ global_object ::= "Control-agent" ":" "{" global_params "}"
+ | global_object_comma
+
+ global_object_comma ::= global_object ","
+
+ global_params ::= global_param
+ | global_params "," global_param
+ | global_params ","
+
+ global_param ::= http_host
+ | http_port
+ | trust_anchor
+ | cert_file
+ | key_file
+ | cert_required
+ | authentication
+ | control_sockets
+ | hooks_libraries
+ | loggers
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ http_host ::= "http-host" ":" STRING
+
+ http_port ::= "http-port" ":" INTEGER
+
+ trust_anchor ::= "trust-anchor" ":" STRING
+
+ cert_file ::= "cert-file" ":" STRING
+
+ key_file ::= "key-file" ":" STRING
+
+ cert_required ::= "cert-required" ":" BOOLEAN
+
+ user_context ::= "user-context" ":" map_value
+
+ comment ::= "comment" ":" STRING
+
+ hooks_libraries ::= "hooks-libraries" ":" "[" hooks_libraries_list "]"
+
+ hooks_libraries_list ::=
+ | not_empty_hooks_libraries_list
+
+ not_empty_hooks_libraries_list ::= hooks_library
+ | not_empty_hooks_libraries_list "," hooks_library
+ | not_empty_hooks_libraries_list ","
+
+ hooks_library ::= "{" hooks_params "}"
+
+ hooks_params ::= hooks_param
+ | hooks_params "," hooks_param
+ | hooks_params ","
+ | unknown_map_entry
+
+ hooks_param ::= library
+ | parameters
+
+ library ::= "library" ":" STRING
+
+ parameters ::= "parameters" ":" map_value
+
+ control_sockets ::= "control-sockets" ":" "{" control_sockets_params "}"
+
+ control_sockets_params ::= control_socket
+ | control_sockets_params "," control_socket
+ | control_sockets_params ","
+
+ control_socket ::= dhcp4_server_socket
+ | dhcp6_server_socket
+ | d2_server_socket
+ | unknown_map_entry
+
+ dhcp4_server_socket ::= "dhcp4" ":" "{" control_socket_params "}"
+
+ dhcp6_server_socket ::= "dhcp6" ":" "{" control_socket_params "}"
+
+ d2_server_socket ::= "d2" ":" "{" control_socket_params "}"
+
+ control_socket_params ::= control_socket_param
+ | control_socket_params "," control_socket_param
+ | control_socket_params ","
+
+ control_socket_param ::= socket_name
+ | socket_type
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ socket_name ::= "socket-name" ":" STRING
+
+ socket_type ::= "socket-type" ":" socket_type_value
+
+ socket_type_value ::= "unix"
+
+ authentication ::= "authentication" ":" "{" auth_params "}"
+
+ auth_params ::= auth_param
+ | auth_params "," auth_param
+ | auth_params ","
+
+ auth_param ::= auth_type
+ | realm
+ | directory
+ | clients
+ | comment
+ | user_context
+ | unknown_map_entry
+
+ auth_type ::= "type" ":" auth_type_value
+
+ auth_type_value ::= "basic"
+
+ realm ::= "realm" ":" STRING
+
+ directory ::= "directory" ":" STRING
+
+ clients ::= "clients" ":" "[" clients_list "]"
+
+ clients_list ::=
+ | not_empty_clients_list
+
+ not_empty_clients_list ::= basic_auth
+ | not_empty_clients_list "," basic_auth
+ | not_empty_clients_list ","
+
+ basic_auth ::= "{" clients_params "}"
+
+ clients_params ::= clients_param
+ | clients_params "," clients_param
+ | clients_params ","
+
+ clients_param ::= user
+ | user_file
+ | password
+ | password_file
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ user ::= "user" ":" STRING
+
+ user_file ::= "user-file" ":" STRING
+
+ password ::= "password" ":" STRING
+
+ password_file ::= "password-file" ":" STRING
+
+ loggers ::= "loggers" ":" "[" loggers_entries "]"
+
+ loggers_entries ::= logger_entry
+ | loggers_entries "," logger_entry
+ | loggers_entries ","
+
+ logger_entry ::= "{" logger_params "}"
+
+ logger_params ::= logger_param
+ | logger_params "," logger_param
+ | logger_params ","
+
+ logger_param ::= name
+ | output_options_list
+ | debuglevel
+ | severity
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ name ::= "name" ":" STRING
+
+ debuglevel ::= "debuglevel" ":" INTEGER
+
+ severity ::= "severity" ":" STRING
+
+ output_options_list ::= "output_options" ":" "[" output_options_list_content "]"
+
+ output_options_list_content ::= output_entry
+ | output_options_list_content "," output_entry
+ | output_options_list_content ","
+
+ output_entry ::= "{" output_params_list "}"
+
+ output_params_list ::= output_params
+ | output_params_list "," output_params
+ | output_params_list ","
+
+ output_params ::= output
+ | flush
+ | maxsize
+ | maxver
+ | pattern
+
+ output ::= "output" ":" STRING
+
+ flush ::= "flush" ":" BOOLEAN
+
+ maxsize ::= "maxsize" ":" INTEGER
+
+ maxver ::= "maxver" ":" INTEGER
+
+ pattern ::= "pattern" ":" STRING
+
diff --git a/doc/sphinx/grammar/grammar-d2-parser.rst b/doc/sphinx/grammar/grammar-d2-parser.rst
new file mode 100644
index 0000000..4f02ab0
--- /dev/null
+++ b/doc/sphinx/grammar/grammar-d2-parser.rst
@@ -0,0 +1,310 @@
+This grammar is generated from ``d2_parser.yy``. See :ref:`dhcp-ddns-server` for more details.
+
+.. code-block:: BNF
+ :linenos:
+
+ Grammar
+
+ $accept ::= start EOF
+
+ start ::= TOPLEVEL_JSON sub_json
+
+ start ::= TOPLEVEL_DHCPDDNS syntax_map
+
+ start ::= SUB_DHCPDDNS sub_dhcpddns
+
+ start ::= SUB_TSIG_KEY sub_tsig_key
+
+ start ::= SUB_TSIG_KEYS sub_tsig_keys
+
+ start ::= SUB_DDNS_DOMAIN sub_ddns_domain
+
+ start ::= SUB_DDNS_DOMAINS sub_ddns_domains
+
+ start ::= SUB_DNS_SERVER sub_dns_server
+
+ start ::= SUB_DNS_SERVERS sub_dns_servers
+
+ start ::= SUB_HOOKS_LIBRARY sub_hooks_library
+
+ value ::= INTEGER
+ | FLOAT
+ | BOOLEAN
+ | STRING
+ | NULL
+ | map2
+ | list_generic
+
+ sub_json ::= value
+
+ map2 ::= "{" map_content "}"
+
+ map_value ::= map2
+
+ map_content ::=
+ | not_empty_map
+
+ not_empty_map ::= STRING ":" value
+ | not_empty_map "," STRING ":" value
+ | not_empty_map ","
+
+ list_generic ::= "[" list_content "]"
+
+ list_content ::=
+ | not_empty_list
+
+ not_empty_list ::= value
+ | not_empty_list "," value
+ | not_empty_list ","
+
+ unknown_map_entry ::= STRING ":"
+
+ syntax_map ::= "{" global_object "}"
+
+ global_object ::= "DhcpDdns" ":" "{" dhcpddns_params "}"
+ | global_object_comma
+
+ global_object_comma ::= global_object ","
+
+ sub_dhcpddns ::= "{" dhcpddns_params "}"
+
+ dhcpddns_params ::= dhcpddns_param
+ | dhcpddns_params "," dhcpddns_param
+ | dhcpddns_params ","
+
+ dhcpddns_param ::= ip_address
+ | port
+ | dns_server_timeout
+ | ncr_protocol
+ | ncr_format
+ | forward_ddns
+ | reverse_ddns
+ | tsig_keys
+ | control_socket
+ | hooks_libraries
+ | loggers
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ ip_address ::= "ip-address" ":" STRING
+
+ port ::= "port" ":" INTEGER
+
+ dns_server_timeout ::= "dns-server-timeout" ":" INTEGER
+
+ ncr_protocol ::= "ncr-protocol" ":" ncr_protocol_value
+
+ ncr_protocol_value ::= "UDP"
+ | "TCP"
+
+ ncr_format ::= "ncr-format" ":" "JSON"
+
+ user_context ::= "user-context" ":" map_value
+
+ comment ::= "comment" ":" STRING
+
+ forward_ddns ::= "forward-ddns" ":" "{" ddns_mgr_params "}"
+
+ reverse_ddns ::= "reverse-ddns" ":" "{" ddns_mgr_params "}"
+
+ ddns_mgr_params ::=
+ | not_empty_ddns_mgr_params
+
+ not_empty_ddns_mgr_params ::= ddns_mgr_param
+ | ddns_mgr_params "," ddns_mgr_param
+ | ddns_mgr_params ","
+
+ ddns_mgr_param ::= ddns_domains
+ | unknown_map_entry
+
+ ddns_domains ::= "ddns-domains" ":" "[" ddns_domain_list "]"
+
+ sub_ddns_domains ::= "[" ddns_domain_list "]"
+
+ ddns_domain_list ::=
+ | not_empty_ddns_domain_list
+
+ not_empty_ddns_domain_list ::= ddns_domain
+ | not_empty_ddns_domain_list "," ddns_domain
+ | not_empty_ddns_domain_list ","
+
+ ddns_domain ::= "{" ddns_domain_params "}"
+
+ sub_ddns_domain ::= "{" ddns_domain_params "}"
+
+ ddns_domain_params ::= ddns_domain_param
+ | ddns_domain_params "," ddns_domain_param
+ | ddns_domain_params ","
+
+ ddns_domain_param ::= ddns_domain_name
+ | ddns_key_name
+ | dns_servers
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ ddns_domain_name ::= "name" ":" STRING
+
+ ddns_key_name ::= "key-name" ":" STRING
+
+ dns_servers ::= "dns-servers" ":" "[" dns_server_list "]"
+
+ sub_dns_servers ::= "[" dns_server_list "]"
+
+ dns_server_list ::= dns_server
+ | dns_server_list "," dns_server
+ | dns_server_list ","
+
+ dns_server ::= "{" dns_server_params "}"
+
+ sub_dns_server ::= "{" dns_server_params "}"
+
+ dns_server_params ::= dns_server_param
+ | dns_server_params "," dns_server_param
+ | dns_server_params ","
+
+ dns_server_param ::= dns_server_hostname
+ | dns_server_ip_address
+ | dns_server_port
+ | ddns_key_name
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ dns_server_hostname ::= "hostname" ":" STRING
+
+ dns_server_ip_address ::= "ip-address" ":" STRING
+
+ dns_server_port ::= "port" ":" INTEGER
+
+ tsig_keys ::= "tsig-keys" ":" "[" tsig_keys_list "]"
+
+ sub_tsig_keys ::= "[" tsig_keys_list "]"
+
+ tsig_keys_list ::=
+ | not_empty_tsig_keys_list
+
+ not_empty_tsig_keys_list ::= tsig_key
+ | not_empty_tsig_keys_list "," tsig_key
+ | not_empty_tsig_keys_list ","
+
+ tsig_key ::= "{" tsig_key_params "}"
+
+ sub_tsig_key ::= "{" tsig_key_params "}"
+
+ tsig_key_params ::= tsig_key_param
+ | tsig_key_params "," tsig_key_param
+ | tsig_key_params ","
+
+ tsig_key_param ::= tsig_key_name
+ | tsig_key_algorithm
+ | tsig_key_digest_bits
+ | tsig_key_secret
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ tsig_key_name ::= "name" ":" STRING
+
+ tsig_key_algorithm ::= "algorithm" ":" STRING
+
+ tsig_key_digest_bits ::= "digest-bits" ":" INTEGER
+
+ tsig_key_secret ::= "secret" ":" STRING
+
+ control_socket ::= "control-socket" ":" "{" control_socket_params "}"
+
+ control_socket_params ::= control_socket_param
+ | control_socket_params "," control_socket_param
+ | control_socket_params ","
+
+ control_socket_param ::= control_socket_type
+ | control_socket_name
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ control_socket_type ::= "socket-type" ":" STRING
+
+ control_socket_name ::= "socket-name" ":" STRING
+
+ hooks_libraries ::= "hooks-libraries" ":" "[" hooks_libraries_list "]"
+
+ hooks_libraries_list ::=
+ | not_empty_hooks_libraries_list
+
+ not_empty_hooks_libraries_list ::= hooks_library
+ | not_empty_hooks_libraries_list "," hooks_library
+ | not_empty_hooks_libraries_list ","
+
+ hooks_library ::= "{" hooks_params "}"
+
+ sub_hooks_library ::= "{" hooks_params "}"
+
+ hooks_params ::= hooks_param
+ | hooks_params "," hooks_param
+ | hooks_params ","
+ | unknown_map_entry
+
+ hooks_param ::= library
+ | parameters
+
+ library ::= "library" ":" STRING
+
+ parameters ::= "parameters" ":" map_value
+
+ loggers ::= "loggers" ":" "[" loggers_entries "]"
+
+ loggers_entries ::= logger_entry
+ | loggers_entries "," logger_entry
+ | loggers_entries ","
+
+ logger_entry ::= "{" logger_params "}"
+
+ logger_params ::= logger_param
+ | logger_params "," logger_param
+ | logger_params ","
+
+ logger_param ::= name
+ | output_options_list
+ | debuglevel
+ | severity
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ name ::= "name" ":" STRING
+
+ debuglevel ::= "debuglevel" ":" INTEGER
+
+ severity ::= "severity" ":" STRING
+
+ output_options_list ::= "output_options" ":" "[" output_options_list_content "]"
+
+ output_options_list_content ::= output_entry
+ | output_options_list_content "," output_entry
+ | output_options_list_content ","
+
+ output_entry ::= "{" output_params_list "}"
+
+ output_params_list ::= output_params
+ | output_params_list "," output_params
+ | output_params_list ","
+
+ output_params ::= output
+ | flush
+ | maxsize
+ | maxver
+ | pattern
+
+ output ::= "output" ":" STRING
+
+ flush ::= "flush" ":" BOOLEAN
+
+ maxsize ::= "maxsize" ":" INTEGER
+
+ maxver ::= "maxver" ":" INTEGER
+
+ pattern ::= "pattern" ":" STRING
+
diff --git a/doc/sphinx/grammar/grammar-dhcp4-parser.rst b/doc/sphinx/grammar/grammar-dhcp4-parser.rst
new file mode 100644
index 0000000..94e9891
--- /dev/null
+++ b/doc/sphinx/grammar/grammar-dhcp4-parser.rst
@@ -0,0 +1,997 @@
+This grammar is generated from ``dhcp4_parser.yy``. See :ref:`dhcp4` for more details.
+
+.. code-block:: BNF
+ :linenos:
+
+ Grammar
+
+ $accept ::= start EOF
+
+ start ::= TOPLEVEL_JSON sub_json
+
+ start ::= TOPLEVEL_DHCP4 syntax_map
+
+ start ::= SUB_DHCP4 sub_dhcp4
+
+ start ::= SUB_INTERFACES4 sub_interfaces4
+
+ start ::= SUB_SUBNET4 sub_subnet4
+
+ start ::= SUB_POOL4 sub_pool4
+
+ start ::= SUB_RESERVATION sub_reservation
+
+ start ::= SUB_OPTION_DEFS sub_option_def_list
+
+ start ::= SUB_OPTION_DEF sub_option_def
+
+ start ::= SUB_OPTION_DATA sub_option_data
+
+ start ::= SUB_HOOKS_LIBRARY sub_hooks_library
+
+ start ::= SUB_DHCP_DDNS sub_dhcp_ddns
+
+ start ::= SUB_CONFIG_CONTROL sub_config_control
+
+ value ::= INTEGER
+ | FLOAT
+ | BOOLEAN
+ | STRING
+ | NULL
+ | map2
+ | list_generic
+
+ sub_json ::= value
+
+ map2 ::= "{" map_content "}"
+
+ map_value ::= map2
+
+ map_content ::=
+ | not_empty_map
+
+ not_empty_map ::= STRING ":" value
+ | not_empty_map "," STRING ":" value
+ | not_empty_map ","
+
+ list_generic ::= "[" list_content "]"
+
+ list_content ::=
+ | not_empty_list
+
+ not_empty_list ::= value
+ | not_empty_list "," value
+ | not_empty_list ","
+
+ list_strings ::= "[" list_strings_content "]"
+
+ list_strings_content ::=
+ | not_empty_list_strings
+
+ not_empty_list_strings ::= STRING
+ | not_empty_list_strings "," STRING
+ | not_empty_list_strings ","
+
+ unknown_map_entry ::= STRING ":"
+
+ syntax_map ::= "{" global_object "}"
+
+ global_object ::= "Dhcp4" ":" "{" global_params "}"
+ | global_object_comma
+
+ global_object_comma ::= global_object ","
+
+ sub_dhcp4 ::= "{" global_params "}"
+
+ global_params ::= global_param
+ | global_params "," global_param
+ | global_params ","
+
+ global_param ::= valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | renew_timer
+ | rebind_timer
+ | decline_probation_period
+ | subnet4_list
+ | shared_networks
+ | interfaces_config
+ | lease_database
+ | hosts_database
+ | hosts_databases
+ | host_reservation_identifiers
+ | client_classes
+ | option_def_list
+ | option_data_list
+ | hooks_libraries
+ | expired_leases_processing
+ | dhcp4o6_port
+ | control_socket
+ | dhcp_queue_control
+ | dhcp_ddns
+ | echo_client_id
+ | match_client_id
+ | authoritative
+ | next_server
+ | server_hostname
+ | boot_file_name
+ | user_context
+ | comment
+ | sanity_checks
+ | reservations
+ | config_control
+ | server_tag
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | loggers
+ | hostname_char_set
+ | hostname_char_replacement
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | store_extended_info
+ | statistic_default_sample_count
+ | statistic_default_sample_age
+ | dhcp_multi_threading
+ | early_global_reservations_lookup
+ | ip_reservations_unique
+ | reservations_lookup_first
+ | compatibility
+ | parked_packet_limit
+ | unknown_map_entry
+
+ valid_lifetime ::= "valid-lifetime" ":" INTEGER
+
+ min_valid_lifetime ::= "min-valid-lifetime" ":" INTEGER
+
+ max_valid_lifetime ::= "max-valid-lifetime" ":" INTEGER
+
+ renew_timer ::= "renew-timer" ":" INTEGER
+
+ rebind_timer ::= "rebind-timer" ":" INTEGER
+
+ calculate_tee_times ::= "calculate-tee-times" ":" BOOLEAN
+
+ t1_percent ::= "t1-percent" ":" FLOAT
+
+ t2_percent ::= "t2-percent" ":" FLOAT
+
+ cache_threshold ::= "cache-threshold" ":" FLOAT
+
+ cache_max_age ::= "cache-max-age" ":" INTEGER
+
+ decline_probation_period ::= "decline-probation-period" ":" INTEGER
+
+ server_tag ::= "server-tag" ":" STRING
+
+ parked_packet_limit ::= "parked-packet-limit" ":" INTEGER
+
+ echo_client_id ::= "echo-client-id" ":" BOOLEAN
+
+ match_client_id ::= "match-client-id" ":" BOOLEAN
+
+ authoritative ::= "authoritative" ":" BOOLEAN
+
+ ddns_send_updates ::= "ddns-send-updates" ":" BOOLEAN
+
+ ddns_override_no_update ::= "ddns-override-no-update" ":" BOOLEAN
+
+ ddns_override_client_update ::= "ddns-override-client-update" ":" BOOLEAN
+
+ ddns_replace_client_name ::= "ddns-replace-client-name" ":" ddns_replace_client_name_value
+
+ ddns_replace_client_name_value ::= "when-present"
+ | "never"
+ | "always"
+ | "when-not-present"
+ | BOOLEAN
+
+ ddns_generated_prefix ::= "ddns-generated-prefix" ":" STRING
+
+ ddns_qualifying_suffix ::= "ddns-qualifying-suffix" ":" STRING
+
+ ddns_update_on_renew ::= "ddns-update-on-renew" ":" BOOLEAN
+
+ ddns_use_conflict_resolution ::= "ddns-use-conflict-resolution" ":" BOOLEAN
+
+ hostname_char_set ::= "hostname-char-set" ":" STRING
+
+ hostname_char_replacement ::= "hostname-char-replacement" ":" STRING
+
+ store_extended_info ::= "store-extended-info" ":" BOOLEAN
+
+ statistic_default_sample_count ::= "statistic-default-sample-count" ":" INTEGER
+
+ statistic_default_sample_age ::= "statistic-default-sample-age" ":" INTEGER
+
+ early_global_reservations_lookup ::= "early-global-reservations-lookup" ":" BOOLEAN
+
+ ip_reservations_unique ::= "ip-reservations-unique" ":" BOOLEAN
+
+ reservations_lookup_first ::= "reservations-lookup-first" ":" BOOLEAN
+
+ interfaces_config ::= "interfaces-config" ":" "{" interfaces_config_params "}"
+
+ interfaces_config_params ::= interfaces_config_param
+ | interfaces_config_params "," interfaces_config_param
+ | interfaces_config_params ","
+
+ interfaces_config_param ::= interfaces_list
+ | dhcp_socket_type
+ | outbound_interface
+ | re_detect
+ | service_sockets_require_all
+ | service_sockets_retry_wait_time
+ | service_sockets_max_retries
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ sub_interfaces4 ::= "{" interfaces_config_params "}"
+
+ interfaces_list ::= "interfaces" ":" list_strings
+
+ dhcp_socket_type ::= "dhcp-socket-type" ":" socket_type
+
+ socket_type ::= "raw"
+ | "udp"
+
+ outbound_interface ::= "outbound-interface" ":" outbound_interface_value
+
+ outbound_interface_value ::= "same-as-inbound"
+ | "use-routing"
+
+ re_detect ::= "re-detect" ":" BOOLEAN
+
+ service_sockets_require_all ::= "service-sockets-require-all" ":" BOOLEAN
+
+ service_sockets_retry_wait_time ::= "service-sockets-retry-wait-time" ":" INTEGER
+
+ service_sockets_max_retries ::= "service-sockets-max-retries" ":" INTEGER
+
+ lease_database ::= "lease-database" ":" "{" database_map_params "}"
+
+ sanity_checks ::= "sanity-checks" ":" "{" sanity_checks_params "}"
+
+ sanity_checks_params ::= sanity_checks_param
+ | sanity_checks_params "," sanity_checks_param
+ | sanity_checks_params ","
+
+ sanity_checks_param ::= lease_checks
+
+ lease_checks ::= "lease-checks" ":" STRING
+
+ hosts_database ::= "hosts-database" ":" "{" database_map_params "}"
+
+ hosts_databases ::= "hosts-databases" ":" "[" database_list "]"
+
+ database_list ::=
+ | not_empty_database_list
+
+ not_empty_database_list ::= database
+ | not_empty_database_list "," database
+ | not_empty_database_list ","
+
+ database ::= "{" database_map_params "}"
+
+ database_map_params ::= database_map_param
+ | database_map_params "," database_map_param
+ | database_map_params ","
+
+ database_map_param ::= database_type
+ | user
+ | password
+ | host
+ | port
+ | name
+ | persist
+ | lfc_interval
+ | readonly
+ | connect_timeout
+ | max_reconnect_tries
+ | reconnect_wait_time
+ | on_fail
+ | max_row_errors
+ | trust_anchor
+ | cert_file
+ | key_file
+ | cipher_list
+ | unknown_map_entry
+
+ database_type ::= "type" ":" db_type
+
+ db_type ::= "memfile"
+ | "mysql"
+ | "postgresql"
+
+ user ::= "user" ":" STRING
+
+ password ::= "password" ":" STRING
+
+ host ::= "host" ":" STRING
+
+ port ::= "port" ":" INTEGER
+
+ name ::= "name" ":" STRING
+
+ persist ::= "persist" ":" BOOLEAN
+
+ lfc_interval ::= "lfc-interval" ":" INTEGER
+
+ readonly ::= "readonly" ":" BOOLEAN
+
+ connect_timeout ::= "connect-timeout" ":" INTEGER
+
+ max_reconnect_tries ::= "max-reconnect-tries" ":" INTEGER
+
+ reconnect_wait_time ::= "reconnect-wait-time" ":" INTEGER
+
+ on_fail ::= "on-fail" ":" on_fail_mode
+
+ on_fail_mode ::= "stop-retry-exit"
+ | "serve-retry-exit"
+ | "serve-retry-continue"
+
+ max_row_errors ::= "max-row-errors" ":" INTEGER
+
+ trust_anchor ::= "trust-anchor" ":" STRING
+
+ cert_file ::= "cert-file" ":" STRING
+
+ key_file ::= "key-file" ":" STRING
+
+ cipher_list ::= "cipher-list" ":" STRING
+
+ host_reservation_identifiers ::= "host-reservation-identifiers" ":" "[" host_reservation_identifiers_list "]"
+
+ host_reservation_identifiers_list ::= host_reservation_identifier
+ | host_reservation_identifiers_list "," host_reservation_identifier
+ | host_reservation_identifiers_list ","
+
+ host_reservation_identifier ::= duid_id
+ | hw_address_id
+ | circuit_id
+ | client_id
+ | flex_id
+
+ duid_id ::= "duid"
+
+ hw_address_id ::= "hw-address"
+
+ circuit_id ::= "circuit-id"
+
+ client_id ::= "client-id"
+
+ flex_id ::= "flex-id"
+
+ dhcp_multi_threading ::= "multi-threading" ":" "{" multi_threading_params "}"
+
+ multi_threading_params ::= multi_threading_param
+ | multi_threading_params "," multi_threading_param
+ | multi_threading_params ","
+
+ multi_threading_param ::= enable_multi_threading
+ | thread_pool_size
+ | packet_queue_size
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ enable_multi_threading ::= "enable-multi-threading" ":" BOOLEAN
+
+ thread_pool_size ::= "thread-pool-size" ":" INTEGER
+
+ packet_queue_size ::= "packet-queue-size" ":" INTEGER
+
+ hooks_libraries ::= "hooks-libraries" ":" "[" hooks_libraries_list "]"
+
+ hooks_libraries_list ::=
+ | not_empty_hooks_libraries_list
+
+ not_empty_hooks_libraries_list ::= hooks_library
+ | not_empty_hooks_libraries_list "," hooks_library
+ | not_empty_hooks_libraries_list ","
+
+ hooks_library ::= "{" hooks_params "}"
+
+ sub_hooks_library ::= "{" hooks_params "}"
+
+ hooks_params ::= hooks_param
+ | hooks_params "," hooks_param
+ | hooks_params ","
+ | unknown_map_entry
+
+ hooks_param ::= library
+ | parameters
+
+ library ::= "library" ":" STRING
+
+ parameters ::= "parameters" ":" map_value
+
+ expired_leases_processing ::= "expired-leases-processing" ":" "{" expired_leases_params "}"
+
+ expired_leases_params ::= expired_leases_param
+ | expired_leases_params "," expired_leases_param
+ | expired_leases_params ","
+
+ expired_leases_param ::= reclaim_timer_wait_time
+ | flush_reclaimed_timer_wait_time
+ | hold_reclaimed_time
+ | max_reclaim_leases
+ | max_reclaim_time
+ | unwarned_reclaim_cycles
+
+ reclaim_timer_wait_time ::= "reclaim-timer-wait-time" ":" INTEGER
+
+ flush_reclaimed_timer_wait_time ::= "flush-reclaimed-timer-wait-time" ":" INTEGER
+
+ hold_reclaimed_time ::= "hold-reclaimed-time" ":" INTEGER
+
+ max_reclaim_leases ::= "max-reclaim-leases" ":" INTEGER
+
+ max_reclaim_time ::= "max-reclaim-time" ":" INTEGER
+
+ unwarned_reclaim_cycles ::= "unwarned-reclaim-cycles" ":" INTEGER
+
+ subnet4_list ::= "subnet4" ":" "[" subnet4_list_content "]"
+
+ subnet4_list_content ::=
+ | not_empty_subnet4_list
+
+ not_empty_subnet4_list ::= subnet4
+ | not_empty_subnet4_list "," subnet4
+ | not_empty_subnet4_list ","
+
+ subnet4 ::= "{" subnet4_params "}"
+
+ sub_subnet4 ::= "{" subnet4_params "}"
+
+ subnet4_params ::= subnet4_param
+ | subnet4_params "," subnet4_param
+ | subnet4_params ","
+
+ subnet4_param ::= valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | pools_list
+ | subnet
+ | interface
+ | id
+ | client_class
+ | require_client_classes
+ | reservations
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | relay
+ | match_client_id
+ | authoritative
+ | next_server
+ | server_hostname
+ | boot_file_name
+ | subnet_4o6_interface
+ | subnet_4o6_interface_id
+ | subnet_4o6_subnet
+ | user_context
+ | comment
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | hostname_char_set
+ | hostname_char_replacement
+ | store_extended_info
+ | unknown_map_entry
+
+ subnet ::= "subnet" ":" STRING
+
+ subnet_4o6_interface ::= "4o6-interface" ":" STRING
+
+ subnet_4o6_interface_id ::= "4o6-interface-id" ":" STRING
+
+ subnet_4o6_subnet ::= "4o6-subnet" ":" STRING
+
+ interface ::= "interface" ":" STRING
+
+ client_class ::= "client-class" ":" STRING
+
+ require_client_classes ::= "require-client-classes" ":" list_strings
+
+ reservations_global ::= "reservations-global" ":" BOOLEAN
+
+ reservations_in_subnet ::= "reservations-in-subnet" ":" BOOLEAN
+
+ reservations_out_of_pool ::= "reservations-out-of-pool" ":" BOOLEAN
+
+ reservation_mode ::= "reservation-mode" ":" hr_mode
+
+ hr_mode ::= "disabled"
+ | "out-of-pool"
+ | "global"
+ | "all"
+
+ id ::= "id" ":" INTEGER
+
+ shared_networks ::= "shared-networks" ":" "[" shared_networks_content "]"
+
+ shared_networks_content ::=
+ | shared_networks_list
+
+ shared_networks_list ::= shared_network
+ | shared_networks_list "," shared_network
+ | shared_networks_list ","
+
+ shared_network ::= "{" shared_network_params "}"
+
+ shared_network_params ::= shared_network_param
+ | shared_network_params "," shared_network_param
+ | shared_network_params ","
+
+ shared_network_param ::= name
+ | subnet4_list
+ | interface
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | match_client_id
+ | authoritative
+ | next_server
+ | server_hostname
+ | boot_file_name
+ | relay
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | client_class
+ | require_client_classes
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | user_context
+ | comment
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | hostname_char_set
+ | hostname_char_replacement
+ | store_extended_info
+ | unknown_map_entry
+
+ option_def_list ::= "option-def" ":" "[" option_def_list_content "]"
+
+ sub_option_def_list ::= "{" option_def_list "}"
+
+ option_def_list_content ::=
+ | not_empty_option_def_list
+
+ not_empty_option_def_list ::= option_def_entry
+ | not_empty_option_def_list "," option_def_entry
+ | not_empty_option_def_list ","
+
+ option_def_entry ::= "{" option_def_params "}"
+
+ sub_option_def ::= "{" option_def_params "}"
+
+ option_def_params ::=
+ | not_empty_option_def_params
+
+ not_empty_option_def_params ::= option_def_param
+ | not_empty_option_def_params "," option_def_param
+ | not_empty_option_def_params ","
+
+ option_def_param ::= option_def_name
+ | option_def_code
+ | option_def_type
+ | option_def_record_types
+ | option_def_space
+ | option_def_encapsulate
+ | option_def_array
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ option_def_name ::= name
+
+ code ::= "code" ":" INTEGER
+
+ option_def_code ::= code
+
+ option_def_type ::= "type" ":" STRING
+
+ option_def_record_types ::= "record-types" ":" STRING
+
+ space ::= "space" ":" STRING
+
+ option_def_space ::= space
+
+ option_def_encapsulate ::= "encapsulate" ":" STRING
+
+ option_def_array ::= "array" ":" BOOLEAN
+
+ option_data_list ::= "option-data" ":" "[" option_data_list_content "]"
+
+ option_data_list_content ::=
+ | not_empty_option_data_list
+
+ not_empty_option_data_list ::= option_data_entry
+ | not_empty_option_data_list "," option_data_entry
+ | not_empty_option_data_list ","
+
+ option_data_entry ::= "{" option_data_params "}"
+
+ sub_option_data ::= "{" option_data_params "}"
+
+ option_data_params ::=
+ | not_empty_option_data_params
+
+ not_empty_option_data_params ::= option_data_param
+ | not_empty_option_data_params "," option_data_param
+ | not_empty_option_data_params ","
+
+ option_data_param ::= option_data_name
+ | option_data_data
+ | option_data_code
+ | option_data_space
+ | option_data_csv_format
+ | option_data_always_send
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ option_data_name ::= name
+
+ option_data_data ::= "data" ":" STRING
+
+ option_data_code ::= code
+
+ option_data_space ::= space
+
+ option_data_csv_format ::= "csv-format" ":" BOOLEAN
+
+ option_data_always_send ::= "always-send" ":" BOOLEAN
+
+ pools_list ::= "pools" ":" "[" pools_list_content "]"
+
+ pools_list_content ::=
+ | not_empty_pools_list
+
+ not_empty_pools_list ::= pool_list_entry
+ | not_empty_pools_list "," pool_list_entry
+ | not_empty_pools_list ","
+
+ pool_list_entry ::= "{" pool_params "}"
+
+ sub_pool4 ::= "{" pool_params "}"
+
+ pool_params ::= pool_param
+ | pool_params "," pool_param
+ | pool_params ","
+
+ pool_param ::= pool_entry
+ | option_data_list
+ | client_class
+ | require_client_classes
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ pool_entry ::= "pool" ":" STRING
+
+ user_context ::= "user-context" ":" map_value
+
+ comment ::= "comment" ":" STRING
+
+ reservations ::= "reservations" ":" "[" reservations_list "]"
+
+ reservations_list ::=
+ | not_empty_reservations_list
+
+ not_empty_reservations_list ::= reservation
+ | not_empty_reservations_list "," reservation
+ | not_empty_reservations_list ","
+
+ reservation ::= "{" reservation_params "}"
+
+ sub_reservation ::= "{" reservation_params "}"
+
+ reservation_params ::=
+ | not_empty_reservation_params
+
+ not_empty_reservation_params ::= reservation_param
+ | not_empty_reservation_params "," reservation_param
+ | not_empty_reservation_params ","
+
+ reservation_param ::= duid
+ | reservation_client_classes
+ | client_id_value
+ | circuit_id_value
+ | flex_id_value
+ | ip_address
+ | hw_address
+ | hostname
+ | option_data_list
+ | next_server
+ | server_hostname
+ | boot_file_name
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ next_server ::= "next-server" ":" STRING
+
+ server_hostname ::= "server-hostname" ":" STRING
+
+ boot_file_name ::= "boot-file-name" ":" STRING
+
+ ip_address ::= "ip-address" ":" STRING
+
+ ip_addresses ::= "ip-addresses" ":" list_strings
+
+ duid ::= "duid" ":" STRING
+
+ hw_address ::= "hw-address" ":" STRING
+
+ client_id_value ::= "client-id" ":" STRING
+
+ circuit_id_value ::= "circuit-id" ":" STRING
+
+ flex_id_value ::= "flex-id" ":" STRING
+
+ hostname ::= "hostname" ":" STRING
+
+ reservation_client_classes ::= "client-classes" ":" list_strings
+
+ relay ::= "relay" ":" "{" relay_map "}"
+
+ relay_map ::= ip_address
+ | ip_addresses
+
+ client_classes ::= "client-classes" ":" "[" client_classes_list "]"
+
+ client_classes_list ::= client_class_entry
+ | client_classes_list "," client_class_entry
+ | client_classes_list ","
+
+ client_class_entry ::= "{" client_class_params "}"
+
+ client_class_params ::=
+ | not_empty_client_class_params
+
+ not_empty_client_class_params ::= client_class_param
+ | not_empty_client_class_params "," client_class_param
+ | not_empty_client_class_params ","
+
+ client_class_param ::= client_class_name
+ | client_class_test
+ | only_if_required
+ | option_def_list
+ | option_data_list
+ | next_server
+ | server_hostname
+ | boot_file_name
+ | user_context
+ | comment
+ | unknown_map_entry
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+
+ client_class_name ::= name
+
+ client_class_test ::= "test" ":" STRING
+
+ only_if_required ::= "only-if-required" ":" BOOLEAN
+
+ dhcp4o6_port ::= "dhcp4o6-port" ":" INTEGER
+
+ control_socket ::= "control-socket" ":" "{" control_socket_params "}"
+
+ control_socket_params ::= control_socket_param
+ | control_socket_params "," control_socket_param
+ | control_socket_params ","
+
+ control_socket_param ::= control_socket_type
+ | control_socket_name
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ control_socket_type ::= "socket-type" ":" STRING
+
+ control_socket_name ::= "socket-name" ":" STRING
+
+ dhcp_queue_control ::= "dhcp-queue-control" ":" "{" queue_control_params "}"
+
+ queue_control_params ::= queue_control_param
+ | queue_control_params "," queue_control_param
+ | queue_control_params ","
+
+ queue_control_param ::= enable_queue
+ | queue_type
+ | capacity
+ | user_context
+ | comment
+ | arbitrary_map_entry
+
+ enable_queue ::= "enable-queue" ":" BOOLEAN
+
+ queue_type ::= "queue-type" ":" STRING
+
+ capacity ::= "capacity" ":" INTEGER
+
+ arbitrary_map_entry ::= STRING ":" value
+
+ dhcp_ddns ::= "dhcp-ddns" ":" "{" dhcp_ddns_params "}"
+
+ sub_dhcp_ddns ::= "{" dhcp_ddns_params "}"
+
+ dhcp_ddns_params ::= dhcp_ddns_param
+ | dhcp_ddns_params "," dhcp_ddns_param
+ | dhcp_ddns_params ","
+
+ dhcp_ddns_param ::= enable_updates
+ | server_ip
+ | server_port
+ | sender_ip
+ | sender_port
+ | max_queue_size
+ | ncr_protocol
+ | ncr_format
+ | dep_override_no_update
+ | dep_override_client_update
+ | dep_replace_client_name
+ | dep_generated_prefix
+ | dep_qualifying_suffix
+ | dep_hostname_char_set
+ | dep_hostname_char_replacement
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ enable_updates ::= "enable-updates" ":" BOOLEAN
+
+ server_ip ::= "server-ip" ":" STRING
+
+ server_port ::= "server-port" ":" INTEGER
+
+ sender_ip ::= "sender-ip" ":" STRING
+
+ sender_port ::= "sender-port" ":" INTEGER
+
+ max_queue_size ::= "max-queue-size" ":" INTEGER
+
+ ncr_protocol ::= "ncr-protocol" ":" ncr_protocol_value
+
+ ncr_protocol_value ::= "udp"
+ | "tcp"
+
+ ncr_format ::= "ncr-format" ":" "JSON"
+
+ dep_qualifying_suffix ::= "qualifying-suffix" ":" STRING
+
+ dep_override_no_update ::= "override-no-update" ":" BOOLEAN
+
+ dep_override_client_update ::= "override-client-update" ":" BOOLEAN
+
+ dep_replace_client_name ::= "replace-client-name" ":" ddns_replace_client_name_value
+
+ dep_generated_prefix ::= "generated-prefix" ":" STRING
+
+ dep_hostname_char_set ::= "hostname-char-set" ":" STRING
+
+ dep_hostname_char_replacement ::= "hostname-char-replacement" ":" STRING
+
+ config_control ::= "config-control" ":" "{" config_control_params "}"
+
+ sub_config_control ::= "{" config_control_params "}"
+
+ config_control_params ::= config_control_param
+ | config_control_params "," config_control_param
+ | config_control_params ","
+
+ config_control_param ::= config_databases
+ | config_fetch_wait_time
+
+ config_databases ::= "config-databases" ":" "[" database_list "]"
+
+ config_fetch_wait_time ::= "config-fetch-wait-time" ":" INTEGER
+
+ loggers ::= "loggers" ":" "[" loggers_entries "]"
+
+ loggers_entries ::= logger_entry
+ | loggers_entries "," logger_entry
+ | loggers_entries ","
+
+ logger_entry ::= "{" logger_params "}"
+
+ logger_params ::= logger_param
+ | logger_params "," logger_param
+ | logger_params ","
+
+ logger_param ::= name
+ | output_options_list
+ | debuglevel
+ | severity
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ debuglevel ::= "debuglevel" ":" INTEGER
+
+ severity ::= "severity" ":" STRING
+
+ output_options_list ::= "output_options" ":" "[" output_options_list_content "]"
+
+ output_options_list_content ::= output_entry
+ | output_options_list_content "," output_entry
+ | output_options_list_content ","
+
+ output_entry ::= "{" output_params_list "}"
+
+ output_params_list ::= output_params
+ | output_params_list "," output_params
+ | output_params_list ","
+
+ output_params ::= output
+ | flush
+ | maxsize
+ | maxver
+ | pattern
+
+ output ::= "output" ":" STRING
+
+ flush ::= "flush" ":" BOOLEAN
+
+ maxsize ::= "maxsize" ":" INTEGER
+
+ maxver ::= "maxver" ":" INTEGER
+
+ pattern ::= "pattern" ":" STRING
+
+ compatibility ::= "compatibility" ":" "{" compatibility_params "}"
+
+ compatibility_params ::= compatibility_param
+ | compatibility_params "," compatibility_param
+ | compatibility_params ","
+
+ compatibility_param ::= lenient_option_parsing
+ | unknown_map_entry
+
+ lenient_option_parsing ::= "lenient-option-parsing" ":" BOOLEAN
+
diff --git a/doc/sphinx/grammar/grammar-dhcp6-parser.rst b/doc/sphinx/grammar/grammar-dhcp6-parser.rst
new file mode 100644
index 0000000..b9d4b79
--- /dev/null
+++ b/doc/sphinx/grammar/grammar-dhcp6-parser.rst
@@ -0,0 +1,1049 @@
+This grammar is generated from ``dhcp6_parser.yy``. See :ref:`dhcp6` for more details.
+
+.. code-block:: BNF
+ :linenos:
+
+ Grammar
+
+ $accept ::= start EOF
+
+ start ::= TOPLEVEL_JSON sub_json
+
+ start ::= TOPLEVEL_DHCP6 syntax_map
+
+ start ::= SUB_DHCP6 sub_dhcp6
+
+ start ::= SUB_INTERFACES6 sub_interfaces6
+
+ start ::= SUB_SUBNET6 sub_subnet6
+
+ start ::= SUB_POOL6 sub_pool6
+
+ start ::= SUB_PD_POOL sub_pd_pool
+
+ start ::= SUB_RESERVATION sub_reservation
+
+ start ::= SUB_OPTION_DEFS sub_option_def_list
+
+ start ::= SUB_OPTION_DEF sub_option_def
+
+ start ::= SUB_OPTION_DATA sub_option_data
+
+ start ::= SUB_HOOKS_LIBRARY sub_hooks_library
+
+ start ::= SUB_DHCP_DDNS sub_dhcp_ddns
+
+ start ::= SUB_CONFIG_CONTROL sub_config_control
+
+ value ::= INTEGER
+ | FLOAT
+ | BOOLEAN
+ | STRING
+ | NULL
+ | map2
+ | list_generic
+
+ sub_json ::= value
+
+ map2 ::= "{" map_content "}"
+
+ map_value ::= map2
+
+ map_content ::=
+ | not_empty_map
+
+ not_empty_map ::= STRING ":" value
+ | not_empty_map "," STRING ":" value
+ | not_empty_map ","
+
+ list_generic ::= "[" list_content "]"
+
+ list_content ::=
+ | not_empty_list
+
+ not_empty_list ::= value
+ | not_empty_list "," value
+ | not_empty_list ","
+
+ list_strings ::= "[" list_strings_content "]"
+
+ list_strings_content ::=
+ | not_empty_list_strings
+
+ not_empty_list_strings ::= STRING
+ | not_empty_list_strings "," STRING
+ | not_empty_list_strings ","
+
+ unknown_map_entry ::= STRING ":"
+
+ syntax_map ::= "{" global_object "}"
+
+ global_object ::= "Dhcp6" ":" "{" global_params "}"
+ | global_object_comma
+
+ global_object_comma ::= global_object ","
+
+ sub_dhcp6 ::= "{" global_params "}"
+
+ global_params ::= global_param
+ | global_params "," global_param
+ | global_params ","
+
+ global_param ::= data_directory
+ | preferred_lifetime
+ | min_preferred_lifetime
+ | max_preferred_lifetime
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | renew_timer
+ | rebind_timer
+ | decline_probation_period
+ | subnet6_list
+ | shared_networks
+ | interfaces_config
+ | lease_database
+ | hosts_database
+ | hosts_databases
+ | mac_sources
+ | relay_supplied_options
+ | host_reservation_identifiers
+ | client_classes
+ | option_def_list
+ | option_data_list
+ | hooks_libraries
+ | expired_leases_processing
+ | server_id
+ | dhcp4o6_port
+ | control_socket
+ | dhcp_queue_control
+ | dhcp_ddns
+ | user_context
+ | comment
+ | sanity_checks
+ | reservations
+ | config_control
+ | server_tag
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | loggers
+ | hostname_char_set
+ | hostname_char_replacement
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | store_extended_info
+ | statistic_default_sample_count
+ | statistic_default_sample_age
+ | dhcp_multi_threading
+ | early_global_reservations_lookup
+ | ip_reservations_unique
+ | reservations_lookup_first
+ | compatibility
+ | parked_packet_limit
+ | unknown_map_entry
+
+ data_directory ::= "data-directory" ":" STRING
+
+ preferred_lifetime ::= "preferred-lifetime" ":" INTEGER
+
+ min_preferred_lifetime ::= "min-preferred-lifetime" ":" INTEGER
+
+ max_preferred_lifetime ::= "max-preferred-lifetime" ":" INTEGER
+
+ valid_lifetime ::= "valid-lifetime" ":" INTEGER
+
+ min_valid_lifetime ::= "min-valid-lifetime" ":" INTEGER
+
+ max_valid_lifetime ::= "max-valid-lifetime" ":" INTEGER
+
+ renew_timer ::= "renew-timer" ":" INTEGER
+
+ rebind_timer ::= "rebind-timer" ":" INTEGER
+
+ calculate_tee_times ::= "calculate-tee-times" ":" BOOLEAN
+
+ t1_percent ::= "t1-percent" ":" FLOAT
+
+ t2_percent ::= "t2-percent" ":" FLOAT
+
+ cache_threshold ::= "cache-threshold" ":" FLOAT
+
+ cache_max_age ::= "cache-max-age" ":" INTEGER
+
+ decline_probation_period ::= "decline-probation-period" ":" INTEGER
+
+ ddns_send_updates ::= "ddns-send-updates" ":" BOOLEAN
+
+ ddns_override_no_update ::= "ddns-override-no-update" ":" BOOLEAN
+
+ ddns_override_client_update ::= "ddns-override-client-update" ":" BOOLEAN
+
+ ddns_replace_client_name ::= "ddns-replace-client-name" ":" ddns_replace_client_name_value
+
+ ddns_replace_client_name_value ::= "when-present"
+ | "never"
+ | "always"
+ | "when-not-present"
+ | BOOLEAN
+
+ ddns_generated_prefix ::= "ddns-generated-prefix" ":" STRING
+
+ ddns_qualifying_suffix ::= "ddns-qualifying-suffix" ":" STRING
+
+ ddns_update_on_renew ::= "ddns-update-on-renew" ":" BOOLEAN
+
+ ddns_use_conflict_resolution ::= "ddns-use-conflict-resolution" ":" BOOLEAN
+
+ hostname_char_set ::= "hostname-char-set" ":" STRING
+
+ hostname_char_replacement ::= "hostname-char-replacement" ":" STRING
+
+ store_extended_info ::= "store-extended-info" ":" BOOLEAN
+
+ statistic_default_sample_count ::= "statistic-default-sample-count" ":" INTEGER
+
+ statistic_default_sample_age ::= "statistic-default-sample-age" ":" INTEGER
+
+ server_tag ::= "server-tag" ":" STRING
+
+ parked_packet_limit ::= "parked-packet-limit" ":" INTEGER
+
+ early_global_reservations_lookup ::= "early-global-reservations-lookup" ":" BOOLEAN
+
+ ip_reservations_unique ::= "ip-reservations-unique" ":" BOOLEAN
+
+ reservations_lookup_first ::= "reservations-lookup-first" ":" BOOLEAN
+
+ interfaces_config ::= "interfaces-config" ":" "{" interfaces_config_params "}"
+
+ sub_interfaces6 ::= "{" interfaces_config_params "}"
+
+ interfaces_config_params ::= interfaces_config_param
+ | interfaces_config_params "," interfaces_config_param
+ | interfaces_config_params ","
+
+ interfaces_config_param ::= interfaces_list
+ | re_detect
+ | service_sockets_require_all
+ | service_sockets_retry_wait_time
+ | service_sockets_max_retries
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ interfaces_list ::= "interfaces" ":" list_strings
+
+ re_detect ::= "re-detect" ":" BOOLEAN
+
+ service_sockets_require_all ::= "service-sockets-require-all" ":" BOOLEAN
+
+ service_sockets_retry_wait_time ::= "service-sockets-retry-wait-time" ":" INTEGER
+
+ service_sockets_max_retries ::= "service-sockets-max-retries" ":" INTEGER
+
+ lease_database ::= "lease-database" ":" "{" database_map_params "}"
+
+ hosts_database ::= "hosts-database" ":" "{" database_map_params "}"
+
+ hosts_databases ::= "hosts-databases" ":" "[" database_list "]"
+
+ database_list ::=
+ | not_empty_database_list
+
+ not_empty_database_list ::= database
+ | not_empty_database_list "," database
+ | not_empty_database_list ","
+
+ database ::= "{" database_map_params "}"
+
+ database_map_params ::= database_map_param
+ | database_map_params "," database_map_param
+ | database_map_params ","
+
+ database_map_param ::= database_type
+ | user
+ | password
+ | host
+ | port
+ | name
+ | persist
+ | lfc_interval
+ | readonly
+ | connect_timeout
+ | max_reconnect_tries
+ | reconnect_wait_time
+ | on_fail
+ | max_row_errors
+ | trust_anchor
+ | cert_file
+ | key_file
+ | cipher_list
+ | unknown_map_entry
+
+ database_type ::= "type" ":" db_type
+
+ db_type ::= "memfile"
+ | "mysql"
+ | "postgresql"
+
+ user ::= "user" ":" STRING
+
+ password ::= "password" ":" STRING
+
+ host ::= "host" ":" STRING
+
+ port ::= "port" ":" INTEGER
+
+ name ::= "name" ":" STRING
+
+ persist ::= "persist" ":" BOOLEAN
+
+ lfc_interval ::= "lfc-interval" ":" INTEGER
+
+ readonly ::= "readonly" ":" BOOLEAN
+
+ connect_timeout ::= "connect-timeout" ":" INTEGER
+
+ reconnect_wait_time ::= "reconnect-wait-time" ":" INTEGER
+
+ on_fail ::= "on-fail" ":" on_fail_mode
+
+ on_fail_mode ::= "stop-retry-exit"
+ | "serve-retry-exit"
+ | "serve-retry-continue"
+
+ max_row_errors ::= "max-row-errors" ":" INTEGER
+
+ max_reconnect_tries ::= "max-reconnect-tries" ":" INTEGER
+
+ trust_anchor ::= "trust-anchor" ":" STRING
+
+ cert_file ::= "cert-file" ":" STRING
+
+ key_file ::= "key-file" ":" STRING
+
+ cipher_list ::= "cipher-list" ":" STRING
+
+ sanity_checks ::= "sanity-checks" ":" "{" sanity_checks_params "}"
+
+ sanity_checks_params ::= sanity_checks_param
+ | sanity_checks_params "," sanity_checks_param
+ | sanity_checks_params ","
+
+ sanity_checks_param ::= lease_checks
+
+ lease_checks ::= "lease-checks" ":" STRING
+
+ mac_sources ::= "mac-sources" ":" "[" mac_sources_list "]"
+
+ mac_sources_list ::= mac_sources_value
+ | mac_sources_list "," mac_sources_value
+ | mac_sources_list ","
+
+ mac_sources_value ::= duid_id
+ | string_id
+
+ duid_id ::= "duid"
+
+ string_id ::= STRING
+
+ host_reservation_identifiers ::= "host-reservation-identifiers" ":" "[" host_reservation_identifiers_list "]"
+
+ host_reservation_identifiers_list ::= host_reservation_identifier
+ | host_reservation_identifiers_list "," host_reservation_identifier
+ | host_reservation_identifiers_list ","
+
+ host_reservation_identifier ::= duid_id
+ | hw_address_id
+ | flex_id
+
+ hw_address_id ::= "hw-address"
+
+ flex_id ::= "flex-id"
+
+ relay_supplied_options ::= "relay-supplied-options" ":" "[" list_content "]"
+
+ dhcp_multi_threading ::= "multi-threading" ":" "{" multi_threading_params "}"
+
+ multi_threading_params ::= multi_threading_param
+ | multi_threading_params "," multi_threading_param
+ | multi_threading_params ","
+
+ multi_threading_param ::= enable_multi_threading
+ | thread_pool_size
+ | packet_queue_size
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ enable_multi_threading ::= "enable-multi-threading" ":" BOOLEAN
+
+ thread_pool_size ::= "thread-pool-size" ":" INTEGER
+
+ packet_queue_size ::= "packet-queue-size" ":" INTEGER
+
+ hooks_libraries ::= "hooks-libraries" ":" "[" hooks_libraries_list "]"
+
+ hooks_libraries_list ::=
+ | not_empty_hooks_libraries_list
+
+ not_empty_hooks_libraries_list ::= hooks_library
+ | not_empty_hooks_libraries_list "," hooks_library
+ | not_empty_hooks_libraries_list ","
+
+ hooks_library ::= "{" hooks_params "}"
+
+ sub_hooks_library ::= "{" hooks_params "}"
+
+ hooks_params ::= hooks_param
+ | hooks_params "," hooks_param
+ | hooks_params ","
+ | unknown_map_entry
+
+ hooks_param ::= library
+ | parameters
+
+ library ::= "library" ":" STRING
+
+ parameters ::= "parameters" ":" map_value
+
+ expired_leases_processing ::= "expired-leases-processing" ":" "{" expired_leases_params "}"
+
+ expired_leases_params ::= expired_leases_param
+ | expired_leases_params "," expired_leases_param
+ | expired_leases_params ","
+
+ expired_leases_param ::= reclaim_timer_wait_time
+ | flush_reclaimed_timer_wait_time
+ | hold_reclaimed_time
+ | max_reclaim_leases
+ | max_reclaim_time
+ | unwarned_reclaim_cycles
+
+ reclaim_timer_wait_time ::= "reclaim-timer-wait-time" ":" INTEGER
+
+ flush_reclaimed_timer_wait_time ::= "flush-reclaimed-timer-wait-time" ":" INTEGER
+
+ hold_reclaimed_time ::= "hold-reclaimed-time" ":" INTEGER
+
+ max_reclaim_leases ::= "max-reclaim-leases" ":" INTEGER
+
+ max_reclaim_time ::= "max-reclaim-time" ":" INTEGER
+
+ unwarned_reclaim_cycles ::= "unwarned-reclaim-cycles" ":" INTEGER
+
+ subnet6_list ::= "subnet6" ":" "[" subnet6_list_content "]"
+
+ subnet6_list_content ::=
+ | not_empty_subnet6_list
+
+ not_empty_subnet6_list ::= subnet6
+ | not_empty_subnet6_list "," subnet6
+ | not_empty_subnet6_list ","
+
+ subnet6 ::= "{" subnet6_params "}"
+
+ sub_subnet6 ::= "{" subnet6_params "}"
+
+ subnet6_params ::= subnet6_param
+ | subnet6_params "," subnet6_param
+ | subnet6_params ","
+
+ subnet6_param ::= preferred_lifetime
+ | min_preferred_lifetime
+ | max_preferred_lifetime
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | pools_list
+ | pd_pools_list
+ | subnet
+ | interface
+ | interface_id
+ | id
+ | rapid_commit
+ | client_class
+ | require_client_classes
+ | reservations
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | relay
+ | user_context
+ | comment
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | hostname_char_set
+ | hostname_char_replacement
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | store_extended_info
+ | unknown_map_entry
+
+ subnet ::= "subnet" ":" STRING
+
+ interface ::= "interface" ":" STRING
+
+ interface_id ::= "interface-id" ":" STRING
+
+ client_class ::= "client-class" ":" STRING
+
+ require_client_classes ::= "require-client-classes" ":" list_strings
+
+ reservations_global ::= "reservations-global" ":" BOOLEAN
+
+ reservations_in_subnet ::= "reservations-in-subnet" ":" BOOLEAN
+
+ reservations_out_of_pool ::= "reservations-out-of-pool" ":" BOOLEAN
+
+ reservation_mode ::= "reservation-mode" ":" hr_mode
+
+ hr_mode ::= "disabled"
+ | "out-of-pool"
+ | "global"
+ | "all"
+
+ id ::= "id" ":" INTEGER
+
+ rapid_commit ::= "rapid-commit" ":" BOOLEAN
+
+ shared_networks ::= "shared-networks" ":" "[" shared_networks_content "]"
+
+ shared_networks_content ::=
+ | shared_networks_list
+
+ shared_networks_list ::= shared_network
+ | shared_networks_list "," shared_network
+ | shared_networks_list ","
+
+ shared_network ::= "{" shared_network_params "}"
+
+ shared_network_params ::= shared_network_param
+ | shared_network_params "," shared_network_param
+ | shared_network_params ","
+
+ shared_network_param ::= name
+ | subnet6_list
+ | interface
+ | interface_id
+ | renew_timer
+ | rebind_timer
+ | option_data_list
+ | relay
+ | reservation_mode
+ | reservations_global
+ | reservations_in_subnet
+ | reservations_out_of_pool
+ | client_class
+ | require_client_classes
+ | preferred_lifetime
+ | min_preferred_lifetime
+ | max_preferred_lifetime
+ | rapid_commit
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | user_context
+ | comment
+ | calculate_tee_times
+ | t1_percent
+ | t2_percent
+ | cache_threshold
+ | cache_max_age
+ | hostname_char_set
+ | hostname_char_replacement
+ | ddns_send_updates
+ | ddns_override_no_update
+ | ddns_override_client_update
+ | ddns_replace_client_name
+ | ddns_generated_prefix
+ | ddns_qualifying_suffix
+ | ddns_update_on_renew
+ | ddns_use_conflict_resolution
+ | store_extended_info
+ | unknown_map_entry
+
+ option_def_list ::= "option-def" ":" "[" option_def_list_content "]"
+
+ sub_option_def_list ::= "{" option_def_list "}"
+
+ option_def_list_content ::=
+ | not_empty_option_def_list
+
+ not_empty_option_def_list ::= option_def_entry
+ | not_empty_option_def_list "," option_def_entry
+ | not_empty_option_def_list ","
+
+ option_def_entry ::= "{" option_def_params "}"
+
+ sub_option_def ::= "{" option_def_params "}"
+
+ option_def_params ::=
+ | not_empty_option_def_params
+
+ not_empty_option_def_params ::= option_def_param
+ | not_empty_option_def_params "," option_def_param
+ | not_empty_option_def_params ","
+
+ option_def_param ::= option_def_name
+ | option_def_code
+ | option_def_type
+ | option_def_record_types
+ | option_def_space
+ | option_def_encapsulate
+ | option_def_array
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ option_def_name ::= name
+
+ code ::= "code" ":" INTEGER
+
+ option_def_code ::= code
+
+ option_def_type ::= "type" ":" STRING
+
+ option_def_record_types ::= "record-types" ":" STRING
+
+ space ::= "space" ":" STRING
+
+ option_def_space ::= space
+
+ option_def_encapsulate ::= "encapsulate" ":" STRING
+
+ option_def_array ::= "array" ":" BOOLEAN
+
+ option_data_list ::= "option-data" ":" "[" option_data_list_content "]"
+
+ option_data_list_content ::=
+ | not_empty_option_data_list
+
+ not_empty_option_data_list ::= option_data_entry
+ | not_empty_option_data_list "," option_data_entry
+ | not_empty_option_data_list ","
+
+ option_data_entry ::= "{" option_data_params "}"
+
+ sub_option_data ::= "{" option_data_params "}"
+
+ option_data_params ::=
+ | not_empty_option_data_params
+
+ not_empty_option_data_params ::= option_data_param
+ | not_empty_option_data_params "," option_data_param
+ | not_empty_option_data_params ","
+
+ option_data_param ::= option_data_name
+ | option_data_data
+ | option_data_code
+ | option_data_space
+ | option_data_csv_format
+ | option_data_always_send
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ option_data_name ::= name
+
+ option_data_data ::= "data" ":" STRING
+
+ option_data_code ::= code
+
+ option_data_space ::= space
+
+ option_data_csv_format ::= "csv-format" ":" BOOLEAN
+
+ option_data_always_send ::= "always-send" ":" BOOLEAN
+
+ pools_list ::= "pools" ":" "[" pools_list_content "]"
+
+ pools_list_content ::=
+ | not_empty_pools_list
+
+ not_empty_pools_list ::= pool_list_entry
+ | not_empty_pools_list "," pool_list_entry
+ | not_empty_pools_list ","
+
+ pool_list_entry ::= "{" pool_params "}"
+
+ sub_pool6 ::= "{" pool_params "}"
+
+ pool_params ::= pool_param
+ | pool_params "," pool_param
+ | pool_params ","
+
+ pool_param ::= pool_entry
+ | option_data_list
+ | client_class
+ | require_client_classes
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ pool_entry ::= "pool" ":" STRING
+
+ user_context ::= "user-context" ":" map_value
+
+ comment ::= "comment" ":" STRING
+
+ pd_pools_list ::= "pd-pools" ":" "[" pd_pools_list_content "]"
+
+ pd_pools_list_content ::=
+ | not_empty_pd_pools_list
+
+ not_empty_pd_pools_list ::= pd_pool_entry
+ | not_empty_pd_pools_list "," pd_pool_entry
+ | not_empty_pd_pools_list ","
+
+ pd_pool_entry ::= "{" pd_pool_params "}"
+
+ sub_pd_pool ::= "{" pd_pool_params "}"
+
+ pd_pool_params ::= pd_pool_param
+ | pd_pool_params "," pd_pool_param
+ | pd_pool_params ","
+
+ pd_pool_param ::= pd_prefix
+ | pd_prefix_len
+ | pd_delegated_len
+ | option_data_list
+ | client_class
+ | require_client_classes
+ | excluded_prefix
+ | excluded_prefix_len
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ pd_prefix ::= "prefix" ":" STRING
+
+ pd_prefix_len ::= "prefix-len" ":" INTEGER
+
+ excluded_prefix ::= "excluded-prefix" ":" STRING
+
+ excluded_prefix_len ::= "excluded-prefix-len" ":" INTEGER
+
+ pd_delegated_len ::= "delegated-len" ":" INTEGER
+
+ reservations ::= "reservations" ":" "[" reservations_list "]"
+
+ reservations_list ::=
+ | not_empty_reservations_list
+
+ not_empty_reservations_list ::= reservation
+ | not_empty_reservations_list "," reservation
+ | not_empty_reservations_list ","
+
+ reservation ::= "{" reservation_params "}"
+
+ sub_reservation ::= "{" reservation_params "}"
+
+ reservation_params ::=
+ | not_empty_reservation_params
+
+ not_empty_reservation_params ::= reservation_param
+ | not_empty_reservation_params "," reservation_param
+ | not_empty_reservation_params ","
+
+ reservation_param ::= duid
+ | reservation_client_classes
+ | ip_addresses
+ | prefixes
+ | hw_address
+ | hostname
+ | flex_id_value
+ | option_data_list
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ ip_addresses ::= "ip-addresses" ":" list_strings
+
+ prefixes ::= "prefixes" ":" list_strings
+
+ duid ::= "duid" ":" STRING
+
+ hw_address ::= "hw-address" ":" STRING
+
+ hostname ::= "hostname" ":" STRING
+
+ flex_id_value ::= "flex-id" ":" STRING
+
+ reservation_client_classes ::= "client-classes" ":" list_strings
+
+ relay ::= "relay" ":" "{" relay_map "}"
+
+ relay_map ::= ip_address
+ | ip_addresses
+
+ ip_address ::= "ip-address" ":" STRING
+
+ client_classes ::= "client-classes" ":" "[" client_classes_list "]"
+
+ client_classes_list ::= client_class_entry
+ | client_classes_list "," client_class_entry
+ | client_classes_list ","
+
+ client_class_entry ::= "{" client_class_params "}"
+
+ client_class_params ::=
+ | not_empty_client_class_params
+
+ not_empty_client_class_params ::= client_class_param
+ | not_empty_client_class_params "," client_class_param
+ | not_empty_client_class_params ","
+
+ client_class_param ::= client_class_name
+ | client_class_test
+ | only_if_required
+ | option_data_list
+ | user_context
+ | comment
+ | preferred_lifetime
+ | min_preferred_lifetime
+ | max_preferred_lifetime
+ | valid_lifetime
+ | min_valid_lifetime
+ | max_valid_lifetime
+ | unknown_map_entry
+
+ client_class_name ::= name
+
+ client_class_test ::= "test" ":" STRING
+
+ only_if_required ::= "only-if-required" ":" BOOLEAN
+
+ server_id ::= "server-id" ":" "{" server_id_params "}"
+
+ server_id_params ::= server_id_param
+ | server_id_params "," server_id_param
+ | server_id_params ","
+
+ server_id_param ::= server_id_type
+ | identifier
+ | time
+ | htype
+ | enterprise_id
+ | persist
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ server_id_type ::= "type" ":" duid_type
+
+ duid_type ::= "LLT"
+ | "EN"
+ | "LL"
+
+ htype ::= "htype" ":" INTEGER
+
+ identifier ::= "identifier" ":" STRING
+
+ time ::= "time" ":" INTEGER
+
+ enterprise_id ::= "enterprise-id" ":" INTEGER
+
+ dhcp4o6_port ::= "dhcp4o6-port" ":" INTEGER
+
+ control_socket ::= "control-socket" ":" "{" control_socket_params "}"
+
+ control_socket_params ::= control_socket_param
+ | control_socket_params "," control_socket_param
+ | control_socket_params ","
+
+ control_socket_param ::= socket_type
+ | socket_name
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ socket_type ::= "socket-type" ":" STRING
+
+ socket_name ::= "socket-name" ":" STRING
+
+ dhcp_queue_control ::= "dhcp-queue-control" ":" "{" queue_control_params "}"
+
+ queue_control_params ::= queue_control_param
+ | queue_control_params "," queue_control_param
+ | queue_control_params ","
+
+ queue_control_param ::= enable_queue
+ | queue_type
+ | capacity
+ | user_context
+ | comment
+ | arbitrary_map_entry
+
+ enable_queue ::= "enable-queue" ":" BOOLEAN
+
+ queue_type ::= "queue-type" ":" STRING
+
+ capacity ::= "capacity" ":" INTEGER
+
+ arbitrary_map_entry ::= STRING ":" value
+
+ dhcp_ddns ::= "dhcp-ddns" ":" "{" dhcp_ddns_params "}"
+
+ sub_dhcp_ddns ::= "{" dhcp_ddns_params "}"
+
+ dhcp_ddns_params ::= dhcp_ddns_param
+ | dhcp_ddns_params "," dhcp_ddns_param
+ | dhcp_ddns_params ","
+
+ dhcp_ddns_param ::= enable_updates
+ | server_ip
+ | server_port
+ | sender_ip
+ | sender_port
+ | max_queue_size
+ | ncr_protocol
+ | ncr_format
+ | dep_override_no_update
+ | dep_override_client_update
+ | dep_replace_client_name
+ | dep_generated_prefix
+ | dep_qualifying_suffix
+ | dep_hostname_char_set
+ | dep_hostname_char_replacement
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ enable_updates ::= "enable-updates" ":" BOOLEAN
+
+ dep_qualifying_suffix ::= "qualifying-suffix" ":" STRING
+
+ server_ip ::= "server-ip" ":" STRING
+
+ server_port ::= "server-port" ":" INTEGER
+
+ sender_ip ::= "sender-ip" ":" STRING
+
+ sender_port ::= "sender-port" ":" INTEGER
+
+ max_queue_size ::= "max-queue-size" ":" INTEGER
+
+ ncr_protocol ::= "ncr-protocol" ":" ncr_protocol_value
+
+ ncr_protocol_value ::= "UDP"
+ | "TCP"
+
+ ncr_format ::= "ncr-format" ":" "JSON"
+
+ dep_override_no_update ::= "override-no-update" ":" BOOLEAN
+
+ dep_override_client_update ::= "override-client-update" ":" BOOLEAN
+
+ dep_replace_client_name ::= "replace-client-name" ":" ddns_replace_client_name_value
+
+ dep_generated_prefix ::= "generated-prefix" ":" STRING
+
+ dep_hostname_char_set ::= "hostname-char-set" ":" STRING
+
+ dep_hostname_char_replacement ::= "hostname-char-replacement" ":" STRING
+
+ config_control ::= "config-control" ":" "{" config_control_params "}"
+
+ sub_config_control ::= "{" config_control_params "}"
+
+ config_control_params ::= config_control_param
+ | config_control_params "," config_control_param
+ | config_control_params ","
+
+ config_control_param ::= config_databases
+ | config_fetch_wait_time
+
+ config_databases ::= "config-databases" ":" "[" database_list "]"
+
+ config_fetch_wait_time ::= "config-fetch-wait-time" ":" INTEGER
+
+ loggers ::= "loggers" ":" "[" loggers_entries "]"
+
+ loggers_entries ::= logger_entry
+ | loggers_entries "," logger_entry
+ | loggers_entries ","
+
+ logger_entry ::= "{" logger_params "}"
+
+ logger_params ::= logger_param
+ | logger_params "," logger_param
+ | logger_params ","
+
+ logger_param ::= name
+ | output_options_list
+ | debuglevel
+ | severity
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ debuglevel ::= "debuglevel" ":" INTEGER
+
+ severity ::= "severity" ":" STRING
+
+ output_options_list ::= "output_options" ":" "[" output_options_list_content "]"
+
+ output_options_list_content ::= output_entry
+ | output_options_list_content "," output_entry
+ | output_options_list_content ","
+
+ output_entry ::= "{" output_params_list "}"
+
+ output_params_list ::= output_params
+ | output_params_list "," output_params
+ | output_params_list ","
+
+ output_params ::= output
+ | flush
+ | maxsize
+ | maxver
+ | pattern
+
+ output ::= "output" ":" STRING
+
+ flush ::= "flush" ":" BOOLEAN
+
+ maxsize ::= "maxsize" ":" INTEGER
+
+ maxver ::= "maxver" ":" INTEGER
+
+ pattern ::= "pattern" ":" STRING
+
+ compatibility ::= "compatibility" ":" "{" compatibility_params "}"
+
+ compatibility_params ::= compatibility_param
+ | compatibility_params "," compatibility_param
+ | compatibility_params ","
+
+ compatibility_param ::= lenient_option_parsing
+ | unknown_map_entry
+
+ lenient_option_parsing ::= "lenient-option-parsing" ":" BOOLEAN
+
diff --git a/doc/sphinx/grammar/grammar-netconf-parser.rst b/doc/sphinx/grammar/grammar-netconf-parser.rst
new file mode 100644
index 0000000..0594706
--- /dev/null
+++ b/doc/sphinx/grammar/grammar-netconf-parser.rst
@@ -0,0 +1,221 @@
+This grammar is generated from ``netconf_parser.yy``. See :ref:`netconf` for more details.
+
+.. code-block:: BNF
+ :linenos:
+
+ Grammar
+
+ $accept ::= start EOF
+
+ start ::= START_JSON json
+
+ start ::= START_NETCONF netconf_syntax_map
+
+ start ::= START_SUB_NETCONF sub_netconf
+
+ sub_netconf ::= "{" global_params "}"
+
+ json ::= value
+
+ value ::= INTEGER
+ | FLOAT
+ | BOOLEAN
+ | STRING
+ | NULL
+ | map
+ | list_generic
+
+ map ::= "{" map_content "}"
+
+ map_value ::= map
+
+ map_content ::=
+ | not_empty_map
+
+ not_empty_map ::= STRING ":" value
+ | not_empty_map "," STRING ":" value
+ | not_empty_map ","
+
+ list_generic ::= "[" list_content "]"
+
+ list_content ::=
+ | not_empty_list
+
+ not_empty_list ::= value
+ | not_empty_list "," value
+ | not_empty_list ","
+
+ unknown_map_entry ::= STRING ":"
+
+ netconf_syntax_map ::= "{" global_object "}"
+
+ global_object ::= "Netconf" ":" "{" global_params "}"
+ | global_object_comma
+
+ global_object_comma ::= global_object ","
+
+ global_params ::=
+ | not_empty_global_params
+
+ not_empty_global_params ::= global_param
+ | not_empty_global_params "," global_param
+ | not_empty_global_params ","
+
+ global_param ::= boot_update
+ | subscribe_changes
+ | validate_changes
+ | managed_servers
+ | hooks_libraries
+ | loggers
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ boot_update ::= "boot-update" ":" BOOLEAN
+
+ subscribe_changes ::= "subscribe-changes" ":" BOOLEAN
+
+ validate_changes ::= "validate-changes" ":" BOOLEAN
+
+ user_context ::= "user-context" ":" map_value
+
+ comment ::= "comment" ":" STRING
+
+ hooks_libraries ::= "hooks-libraries" ":" "[" hooks_libraries_list "]"
+
+ hooks_libraries_list ::=
+ | not_empty_hooks_libraries_list
+
+ not_empty_hooks_libraries_list ::= hooks_library
+ | not_empty_hooks_libraries_list "," hooks_library
+ | not_empty_hooks_libraries_list ","
+
+ hooks_library ::= "{" hooks_params "}"
+
+ hooks_params ::= hooks_param
+ | hooks_params "," hooks_param
+ | hooks_params ","
+ | unknown_map_entry
+
+ hooks_param ::= library
+ | parameters
+
+ library ::= "library" ":" STRING
+
+ parameters ::= "parameters" ":" map_value
+
+ managed_servers ::= "managed-servers" ":" "{" servers_entries "}"
+
+ servers_entries ::=
+ | not_empty_servers_entries
+
+ not_empty_servers_entries ::= server_entry
+ | not_empty_servers_entries "," server_entry
+ | not_empty_servers_entries ","
+
+ server_entry ::= dhcp4_server
+ | dhcp6_server
+ | d2_server
+ | ca_server
+ | unknown_map_entry
+
+ dhcp4_server ::= "dhcp4" ":" "{" managed_server_params "}"
+
+ dhcp6_server ::= "dhcp6" ":" "{" managed_server_params "}"
+
+ d2_server ::= "d2" ":" "{" managed_server_params "}"
+
+ ca_server ::= "ca" ":" "{" managed_server_params "}"
+
+ managed_server_params ::= managed_server_param
+ | managed_server_params "," managed_server_param
+ | managed_server_params ","
+
+ managed_server_param ::= model
+ | boot_update
+ | subscribe_changes
+ | validate_changes
+ | control_socket
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ model ::= "model" ":" STRING
+
+ control_socket ::= "control-socket" ":" "{" control_socket_params "}"
+
+ control_socket_params ::= control_socket_param
+ | control_socket_params "," control_socket_param
+ | control_socket_params ","
+
+ control_socket_param ::= socket_type
+ | socket_name
+ | socket_url
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ socket_type ::= "socket-type" ":" socket_type_value
+
+ socket_type_value ::= "unix"
+ | "http"
+ | "stdout"
+
+ socket_name ::= "socket-name" ":" STRING
+
+ socket_url ::= "socket-url" ":" STRING
+
+ loggers ::= "loggers" ":" "[" loggers_entries "]"
+
+ loggers_entries ::= logger_entry
+ | loggers_entries "," logger_entry
+ | loggers_entries ","
+
+ logger_entry ::= "{" logger_params "}"
+
+ logger_params ::= logger_param
+ | logger_params "," logger_param
+ | logger_params ","
+
+ logger_param ::= name
+ | output_options_list
+ | debuglevel
+ | severity
+ | user_context
+ | comment
+ | unknown_map_entry
+
+ name ::= "name" ":" STRING
+
+ debuglevel ::= "debuglevel" ":" INTEGER
+
+ severity ::= "severity" ":" STRING
+
+ output_options_list ::= "output_options" ":" "[" output_options_list_content "]"
+
+ output_options_list_content ::= output_entry
+ | output_options_list_content "," output_entry
+ | output_options_list_content ","
+
+ output_entry ::= "{" output_params_list "}"
+
+ output_params_list ::= output_params
+ | output_params_list "," output_params
+ | output_params_list ","
+
+ output_params ::= output
+ | flush
+ | maxsize
+ | maxver
+ | pattern
+
+ output ::= "output" ":" STRING
+
+ flush ::= "flush" ":" BOOLEAN
+
+ maxsize ::= "maxsize" ":" INTEGER
+
+ maxver ::= "maxver" ":" INTEGER
+
+ pattern ::= "pattern" ":" STRING
+
diff --git a/doc/sphinx/grammar/grammar.rst b/doc/sphinx/grammar/grammar.rst
new file mode 100644
index 0000000..d8f77b0
--- /dev/null
+++ b/doc/sphinx/grammar/grammar.rst
@@ -0,0 +1,44 @@
+..
+ Copyright (C) 2021-2022 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
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ See the COPYRIGHT file distributed with this work for additional
+ information regarding copyright ownership.
+
+.. _bnf-grammar:
+
+Kea Configuration File Syntax (BNF)
+===================================
+
+Kea consists of several daemons, each with its own configuration syntax. The following sections
+provide a complete syntax of all possible parameters, written in Backus-Naur Form (BNF).
+See this `Wikipedia article on BNF <https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form>`_ for
+more information.
+
+BNF Grammar for DHCPv4
+----------------------
+
+.. include:: grammar-dhcp4-parser.rst
+
+BNF Grammar for DHCPv6
+----------------------
+
+.. include:: grammar-dhcp6-parser.rst
+
+BNF Grammar for Control Agent
+-----------------------------
+
+.. include:: grammar-ca-parser.rst
+
+BNF Grammar for DHCP-DDNS
+-------------------------
+
+.. include:: grammar-d2-parser.rst
+
+BNF Grammar for the Kea NETCONF Agent
+-------------------------------------
+
+.. include:: grammar-netconf-parser.rst