/**
 * @mainpage About
 *
 * libnetconf2 is a NETCONF library in C handling NETCONF authentication and all NETCONF
 * RPC communication both server and client-side. Note that NETCONF datastore implementation
 * is not a part of this library. The library supports both NETCONF 1.0
 * ([RFC 4741](https://tools.ietf.org/html/rfc4741)) as well as NETCONF 1.1
 * ([RFC 6241](https://tools.ietf.org/html/rfc6241)).
 *
 * @section about-features Main Features
 *
 * - Creating SSH ([RFC 4742](https://tools.ietf.org/html/rfc4742), [RFC 6242](https://tools.ietf.org/html/rfc6242)),
 *   using [libssh](https://www.libssh.org/), or TLS ([RFC 7589](https://tools.ietf.org/html/rfc7589)),
 *   using [OpenSSL](https://www.openssl.org/), authenticated NETCONF sessions.
 * - Creating NETCONF sessions with a pre-established transport protocol
 *   (using this mechanism the communication can be tunneled through sshd(8), for instance).
 * - Creating NETCONF Call Home sessions ([RFC 8071](https://tools.ietf.org/html/rfc8071)).
 * - Creating, sending, receiving, and replying to RPCs ([RFC 4741](https://tools.ietf.org/html/rfc4741),
 *   [RFC 6241](https://tools.ietf.org/html/rfc6241)).
 * - Creating, sending and receiving NETCONF Event Notifications ([RFC 5277](https://tools.ietf.org/html/rfc5277)).
 * - Configuring the NETCONF server based on the [ietf-netconf-server](https://datatracker.ietf.org/doc/html/draft-ietf-netconf-netconf-client-server-29) YANG module
 *
 * @section about-license License
 *
 * Copyright (c) 2015-2021 CESNET, z.s.p.o.
 *
 * (The BSD 3-Clause License)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name of the Company nor the names of its contributors
 *    may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 */

/**
 * @page howto How To ...
 *
 * - @subpage howtoinit
 * - @subpage howtoclient
 * - @subpage howtoserver
 * - @subpage howtoclientcomm
 * - @subpage howtoservercomm
 * - @subpage howtotimeouts
 */

/**
 * @page howtoinit Init and Thread-safety Information
 *
 * Before working with the library, it must be initialized using ::nc_client_init()
 * and/or ::nc_server_init(). To prevent any reachable memory at the end of your
 * application, there are complementary destroy functions
 * (::nc_server_destroy() and ::nc_client_destroy() available). If your
 * application is multi-threaded, call the destroy functions in the main thread,
 * after all the other threads have ended.
 *
 * If _libnetconf2_ is used in accordance with this information, there should
 * not be memory leaks of any kind at program exit. For thread-safety details
 * of _libssh_, _libssl_, and _libcrypto_, please refer to the corresponding project
 * documentation. _libnetconf2_ thread-safety information is below.
 *
 * Client
 * ------
 *
 * Optionally, a client can specify two alternative ways to get schemas needed when connecting
 * with a server. The primary way is to read local files in searchpath (and its subdirectories)
 * specified via ::nc_client_set_schema_searchpath(). Alternatively, _libnetconf2_ can use callback
 * provided via ::nc_client_set_schema_callback(). If these ways do not succeed and the server
 * implements NETCONF \<get-schema\> operation, the schema is retrieved from the server and stored
 * locally into the searchpath (if specified) for a future use. If none of these methods succeed to
 * load particular schema, the data from this schema are ignored during the communication with the
 * server.
 *
 * Besides the mentioned setters, there are many other @ref howtoclientssh "SSH", @ref howtoclienttls "TLS"
 * and @ref howtoclientch "Call Home" getter/setter functions to manipulate with various settings. All these
 * settings are internally placed in a thread-specific context so they are independent and
 * initialized to the default values within each new thread. However, the context can be shared among
 * the threads using ::nc_client_get_thread_context() and ::nc_client_set_thread_context() functions. In such
 * a case, be careful and avoid concurrent execution of the mentioned setters/getters and functions
 * creating connection (no matter if it is a standard NETCONF connection or Call Home).
 *
 * In the client, it is always thread-safe to work with a NETCONF session in a single thread since the client
 * settings are thread-specific as described above. Generally, one can access a session in several threads
 * as well but there is little incentive to do so.
 *
 * Server
 * ------
 *
 * Server is __FULLY__ thread-safe meaning you can set all the (thread-shared in contrast to
 * client) options simultaneously while listening for or accepting new sessions or
 * polling the existing ones. It is even safe to poll one session in several
 * pollsession structures or one pollsession structure in several threads. Generally,
 * servers can use more threads without any problems as long as they keep their workflow sane
 * (behavior such as freeing sessions only after no thread uses them or similar).
 *
 * Functions List
 * --------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_client_init()
 * - ::nc_client_destroy()
 *
 * - ::nc_client_set_schema_searchpath()
 * - ::nc_client_get_schema_searchpath()
 * - ::nc_client_set_schema_callback()
 * - ::nc_client_get_schema_callback()
 *
 * - ::nc_client_set_thread_context()
 * - ::nc_client_get_thread_context()
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_init()
 * - ::nc_server_destroy()
 */

/**
 * @page howtoclient Client sessions
 *
 * To connect to a NETCONF server, a NETCONF session must be established,
 * which requires a working transport session. It is possible to create
 * NETCONF sessions with SSH (using _libssh_) or TLS (using _libssl/libcrypto_)
 * as the underlying transport protocol. It is also possible to establish
 * the transport protocol outside _libnetconf2_ and then provide these file
 * descriptors (FD) for full NETCONF session creation.
 *
 * There are a lot of options for both an SSH and a TLS client. All of them
 * have setters and getters so that there is no need to duplicate them in
 * a client.
 *
 * @anchor howtoclientssh
 * SSH
 * ===
 *
 * Connecting to a server using SSH does not strictly require to set any
 * options, there are sensible default values for all the basic ones.
 * Except all the SSH options, optionally some authetication callbacks can be set,
 * which are particulary useful in automated clients (passwords cannot be
 * asked a user) or simply if any additional information is retrieved some
 * other way than from standard terminal input.
 *
 * Having the default options or changing any unsuitable ones, there are 2 functions
 * to use for a new server connection. ::nc_connect_ssh() is the standard function
 * that creates sessions using the set options. If there are some options, which
 * cannot be changed with the provided API, there is ::nc_connect_libssh() available.
 * It requires a _libssh_ session, in which all the SSH options can be modified
 * and even the connection established. This allows for full customization and
 * should fit any specific situation.
 *
 * New NETCONF sessions can also be created on existing authenticated SSH sessions.
 * There is a new SSH channel needed, on which the NETCONF session is then created.
 * Use ::nc_connect_ssh_channel() for this purpose.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_client_ssh_set_auth_password_clb()
 * - ::nc_client_ssh_get_auth_password_clb()
 * - ::nc_client_ssh_set_auth_interactive_clb()
 * - ::nc_client_ssh_get_auth_interactive_clb()
 * - ::nc_client_ssh_set_auth_privkey_passphrase_clb()
 * - ::nc_client_ssh_get_auth_privkey_passphrase_clb()
 * - ::nc_client_ssh_add_keypair()
 * - ::nc_client_ssh_del_keypair()
 * - ::nc_client_ssh_get_keypair_count()
 * - ::nc_client_ssh_get_keypair()
 * - ::nc_client_ssh_set_auth_pref()
 * - ::nc_client_ssh_get_auth_pref()
 * - ::nc_client_ssh_set_username()
 * - ::nc_client_ssh_get_username()
 *
 * - ::nc_connect_ssh()
 * - ::nc_connect_libssh()
 * - ::nc_connect_ssh_channel()
 *
 * @anchor howtoclienttls
 * TLS
 * ===
 *
 * To connect to a server using TLS, there must be some client identification
 * options set. Client must specify its certificate with a private key using
 * ::nc_client_tls_set_cert_key_paths(). Also, the Certificate Authority of
 * a server certificate must be considered trusted. Paths to all the trusted
 * CA certificates can be set by ::nc_client_tls_set_trusted_ca_paths().
 *
 * Then there are again 2 functions for connecting, ::nc_connect_tls() being
 * the standard way of connecting. ::nc_connect_libssl() again enables
 * to customize the TLS session in every way _libssl_ allows.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_client_tls_set_cert_key_paths()
 * - ::nc_client_tls_get_cert_key_paths()
 * - ::nc_client_tls_set_trusted_ca_paths()
 * - ::nc_client_tls_get_trusted_ca_paths()
 * - ::nc_client_tls_set_crl_paths()
 * - ::nc_client_tls_get_crl_paths()
 *
 * - ::nc_connect_tls()
 * - ::nc_connect_libssl()
 *
 *
 * FD and UNIX socket
 * ==================
 *
 * If you authenticated the connection using some tunneling software, you
 * can pass its file descriptors to _libnetconf2_ using ::nc_connect_inout(),
 * which will continue to establish a full NETCONF session. To connect locally
 * on a UNIX socket avoiding  all cryptography use ::nc_connect_unix().
 *
 * Funtions List
 * -------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_connect_inout()
 * - ::nc_connect_unix()
 *
 *
 * @anchor howtoclientch
 * Call Home
 * =========
 *
 * Call Home needs the same options set as standard SSH or TLS and the functions
 * reflect it exactly. However, to accept a connection, the client must first
 * specify addresses and ports, which to listen on by ::nc_client_ssh_ch_add_bind_listen()
 * and ::nc_client_tls_ch_add_bind_listen(). Then connections can be
 * accepted using ::nc_accept_callhome().
 *
 * Functions List
 * --------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_client_ssh_ch_set_auth_password_clb()
 * - ::nc_client_ssh_ch_set_auth_interactive_clb()
 * - ::nc_client_ssh_ch_set_auth_privkey_passphrase_clb()
 * - ::nc_client_ssh_ch_add_bind_listen()
 * - ::nc_client_ssh_ch_del_bind()
 * - ::nc_client_ssh_ch_add_keypair()
 * - ::nc_client_ssh_ch_del_keypair()
 * - ::nc_client_ssh_ch_get_keypair_count()
 * - ::nc_client_ssh_ch_get_keypair()
 * - ::nc_client_ssh_ch_set_auth_pref()
 * - ::nc_client_ssh_ch_get_auth_pref()
 * - ::nc_client_ssh_ch_set_username()
 * - ::nc_client_ssh_ch_get_username()
 *
 * - ::nc_client_tls_ch_add_bind_listen()
 * - ::nc_client_tls_ch_del_bind()
 * - ::nc_client_tls_ch_set_cert_key_paths()
 * - ::nc_client_tls_ch_get_cert_key_paths()
 * - ::nc_client_tls_ch_set_trusted_ca_paths()
 * - ::nc_client_tls_ch_get_trusted_ca_paths()
 * - ::nc_client_tls_ch_set_crl_paths()
 * - ::nc_client_tls_ch_get_crl_paths()
 *
 * - ::nc_accept_callhome()
 *
 *
 * Cleanup
 * =======
 *
 * These options and the schema searchpath are stored in dynamically
 * allocated memory. They are freed as a part of [destroying the client](@ref howtoinit).
 */

/**
 * @page howtoserver Server sessions
 *
 * Init
 * ====
 *
 * Server must start with [initialization](@ref howtoinit). Its capabilities are
 * determined by the context used when accepting new NETCONF sessions. Few capabilities that
 * cannot be learnt from the context are set with separate functions
 * ::nc_server_set_capab_withdefaults() and generally ::nc_server_set_capability().
 *
 * Context does not only determine server modules, but its overall
 * functionality as well. For every RPC the server should support,
 * an nc_rpc_clb callback should be set on that node in the context using ::nc_set_rpc_callback().
 * Server then calls these as appropriate [during poll](@ref howtoservercomm).
 *
 * Just like in the [client](@ref howtoclient), you can let _libnetconf2_
 * establish SSH or TLS transport or do it yourself and only provide the file
 * descriptors of the connection.
 *
 * To be able to accept any connections, the server must first be configured.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_set_capab_withdefaults()
 * - ::nc_server_set_capability()
 * - ::nc_server_endpt_count()
 * - ::nc_server_add_endpt_unix_socket_listen()
 * - ::nc_server_del_endpt_unix_socket()
 *
 * Server Configuration
 * ===
 *
 * To successfully accept connections on a server, you first need to configure it.
 * The *libnetconf2* server natively supports the *ietf-netconf-server YANG* module.
 * This allows for a bigger scaling and flexibility of the *NETCONF* server.
 * By using *ietf-netconf-server YANG* data you can express network configurations
 * in a standardized and hierarchical format, enabling you to define complex network
 * structures with greater ease.
 *
 * The process of configuring a server is comprised of two steps. The first step is creating the
 * configuration data and the second is applying it. The server supports two forms of the configuration
 * data - *YANG data* and *YANG diff*.
 *
 * YANG data
 * ---
 * Configuring the server using YANG data simplifies the management of network services.
 * With YANG data, you build a structured configuration tree and apply it as a whole.
 * This approach is user-friendly, allowing you to modify the configuration by adding or deleting nodes,
 * and then deploying the updated configuration tree in its entirety, providing a way to manage your server's settings.
 * The *libnetconf2* library exports API functions that can help you with creation or deletion of the *YANG* data.
 *
 * YANG diff
 * ---
 * YANG diff, enriched with operation attributes, offers advanced configuration control.
 * It empowers the user to make precise changes within the configuration tree,
 * enabling operations like specific node deletions, additions, and modifications.
 * On the other hand, unlike YANG data, YANG diff represents only a subtree of the
 * changes expecting the whole configuration to be managed externally.
 * For example this is done by the tool [sysrepo](https://www.sysrepo.org/).
 *
 * Usage
 * ---
 * To be able to configure the server, the required models first need to be implemented.
 * To do this, see ::nc_server_config_load_modules().
 * Not all of the *ietf-netconf-server* (and all of its associated modules) features are enabled.
 * If you wish to see which features are enabled, extract them from the context after calling the mentioned function.
 *
 * If you wish not to create the __YANG data__ yourself, you may use the library's functions to do this for you.
 * For example ::nc_server_config_add_address_port() creates __YANG data__ corresponding to an SSH/TLS endpoint.
 * You can then apply this data by calling ::nc_server_config_setup_data() (or ::nc_server_config_setup_diff() for diff).
 * See *examples/server.c* for a simple example.
 *
 * You may also create entries in the keystore or truststore. For example the asymmetric key and certificate entries
 * in the keystore can be then referenced as the SSH hostkeys or TLS server certificates, respectively.
 * As for the truststore, you may create public key and certificate entries, which can then be used
 * as SSH user's public keys or TLS server's end-entity/trust-anchor certificates, respectively.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_config_load_modules()
 * - ::nc_server_config_setup_diff()
 * - ::nc_server_config_setup_data()
 * - ::nc_server_config_setup_path()
 *
 * - ::nc_server_config_add_address_port()
 * - ::nc_server_config_del_endpt()
 * - ::nc_server_config_add_keystore_asym_key()
 * - ::nc_server_config_del_keystore_asym_key()
 * - ::nc_server_config_add_keystore_cert()
 * - ::nc_server_config_del_keystore_cert()
 * - ::nc_server_config_add_truststore_pubkey()
 * - ::nc_server_config_del_truststore_pubkey()
 * - ::nc_server_config_add_truststore_cert()
 * - ::nc_server_config_del_truststore_cert()
 *
 * SSH
 * ===
 *
 * To successfully accept an SSH session you must configure at least one host key.
 * You may create this data yourself or by using ::nc_server_config_add_ssh_hostkey().
 *
 * On top of that, each SSH endpoint can define it's own authorized clients and their authentication methods.
 * For example if you wish to create an SSH user that can authenticate using a password, use ::nc_server_config_add_ssh_user_password().
 * Another option for authorized clients is to reference another endpoint's clients, however be careful not to create a cyclic reference
 * (see ::nc_server_config_add_ssh_endpoint_client_ref()). An authorized client MUST authenticate to all of it's configured authentication methods.
 *
 * \anchor ln2doc_pubkey
 * The Public Key authentication method is supported. If you wish to use this method, you need to specify the given user's
 * public keys, which will be compared with the key(s) presented by the SSH client when authenticating. One option is to configure
 * the public keys directly in the ietf-netconf-server YANG data (inline-definition). Other option is to configure the keys' data
 * in the ietf-trustore module's YANG data and then reference them (truststore-reference). The final option is to set the global
 * path to file with public keys. This path may contain special tokens, see ::nc_server_ssh_set_authkey_path_format().
 * If the path is set and the use-system-keys container is present in the data for the client wishing to authenticate,
 * then the keys from the file will be used for authentication.
 *
 * \anchor ln2doc_kbdint
 * The Keyboard Interactive authentication method is also supported. It can be done in three ways.
 * If libpam is found, Linux PAM is used to handle the authentication. You need to specify the service name using ::nc_server_ssh_set_pam_conf_filename().
 * Else if the standard functions for accessing local users are found on the system, they are used. The only Keyboard Interactive challenge will be the given
 * user's password (that is if he's found on the system).
 * Either way, you can always define your own callback to perform the authentication, see ::nc_server_ssh_set_interactive_auth_clb().
 * The callback has a higher priority than the other two methods.
 *
 * There are also some other optional settings.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_config_add_ssh_hostkey()
 * - ::nc_server_config_del_ssh_hostkey()
 * - ::nc_server_config_add_ssh_keystore_ref()
 * - ::nc_server_config_del_ssh_keystore_ref()
 *
 * - ::nc_server_config_add_ssh_user_pubkey()
 * - ::nc_server_config_del_ssh_user_pubkey()
 * - ::nc_server_config_add_ssh_user_password()
 * - ::nc_server_config_del_ssh_user_password()
 * - ::nc_server_config_add_ssh_user_interactive()
 * - ::nc_server_config_del_ssh_user_interactive()
 * - ::nc_server_config_del_ssh_user()
 * - ::nc_server_config_add_ssh_truststore_ref()
 * - ::nc_server_config_del_ssh_truststore_ref()
 * - ::nc_server_config_add_ssh_endpoint_client_ref()
 * - ::nc_server_config_del_ssh_endpoint_client_ref()
 *
 * - ::nc_server_ssh_set_authkey_path_format()
 * - ::nc_server_ssh_set_pam_conf_filename()
 * - ::nc_server_ssh_set_interactive_auth_clb()
 *
 * TLS
 * ===
 *
 * TLS works with endpoints too, but its options differ
 * significantly from the SSH ones, especially in the _cert-to-name_
 * options that TLS uses to derive usernames from client certificates.
 *
 * If you wish to listen on a TLS endpoint, you need to configure the endpoint's
 * server certificate (see ::nc_server_config_add_tls_server_cert()).
 *
 * To accept client certificates, they must first be considered trusted.
 * For each TLS endpoint you may configure two types of client certificates.
 * The first type are end-entity (client) certificates. These are certificates that belong
 * to given clients. These certificates need to be trusted.
 * The second type are trust-anchor (certificate authority) certificates,
 * which carry over the trust (a chain of trust).
 * Another option is to reference another TLS endpoint's end-entity certificates, however be careful not to create a cyclic reference
 * (see ::nc_server_config_add_tls_endpoint_client_ref()).
 *
 * Then, from each trusted client certificate a username must be derived
 * for the NETCONF session. This is accomplished by finding a matching
 * _cert-to-name_ entry.
 *
 * There are some further options. For example you can configure the TLS
 * version and ciphers to be used. You may also choose to use a Certificate
 * Revocation List.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_config_add_tls_server_cert()
 * - ::nc_server_config_del_tls_server_cert()
 * - ::nc_server_config_add_tls_keystore_ref()
 * - ::nc_server_config_del_tls_keystore_ref()
 *
 * - ::nc_server_config_add_tls_client_cert()
 * - ::nc_server_config_del_tls_client_cert()
 * - ::nc_server_config_add_tls_client_cert_truststore_ref()
 * - ::nc_server_config_del_tls_client_cert_truststore_ref()
 * - ::nc_server_config_add_tls_ca_cert()
 * - ::nc_server_config_del_tls_ca_cert()
 * - ::nc_server_config_add_tls_ca_cert_truststore_ref()
 * - ::nc_server_config_del_tls_ca_cert_truststore_ref()
 * - ::nc_server_config_add_tls_endpoint_client_ref()
 * - ::nc_server_config_del_tls_endpoint_client_ref()
 * - ::nc_server_config_add_tls_ctn()
 * - ::nc_server_config_del_tls_ctn()
 *
 * FD
 * ==
 *
 * If you used a tunneling software, which does its own authentication,
 * you can accept a NETCONF session on its file descriptors with
 * ::nc_accept_inout().
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_accept_inout()
 *
 *
 * Call Home
 * =========
 *
 * _Call Home_ works with endpoints just like standard sessions, but
 * the options are organized a bit differently and endpoints are added
 * for CH clients.
 * You may choose one of two approaches for creating a new Call Home
 * session (or in other words making a server connect to a client).
 * The first is to set all the required callbacks
 * by calling ::nc_server_ch_set_dispatch_data(). By setting the callbacks,
 * the server will automatically start connecting to a client, whenever
 * a new Call Home client is created.
 * The second approach is to create the Call Home thread manually.
 * To do this, you need to call ::nc_connect_ch_client_dispatch(),
 * which then creates a new thread and the server will start to connect.
 * Unix socket _Call Home_ sessions are not supported.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_server_config_add_ch_address_port()
 * - ::nc_server_config_del_ch_client()
 * - ::nc_server_config_del_ch_endpt()
 * - ::nc_server_config_add_ch_persistent()
 * - ::nc_server_config_add_ch_period()
 * - ::nc_server_config_del_ch_period()
 * - ::nc_server_config_add_ch_anchor_time()
 * - ::nc_server_config_del_ch_anchor_time()
 * - ::nc_server_config_add_ch_idle_timeout()
 * - ::nc_server_config_del_ch_idle_timeout()
 * - ::nc_server_config_add_ch_reconnect_strategy()
 * - ::nc_server_config_del_ch_reconnect_strategy()
 *
 * - ::nc_server_config_add_ch_ssh_hostkey()
 * - ::nc_server_config_del_ch_ssh_hostkey()
 * - ::nc_server_config_add_ch_ssh_keystore_ref()
 * - ::nc_server_config_del_ch_ssh_keystore_ref()
 * - ::nc_server_config_add_ch_ssh_user_pubkey()
 * - ::nc_server_config_del_ch_ssh_user_pubkey()
 * - ::nc_server_config_add_ch_ssh_user_password()
 * - ::nc_server_config_del_ch_ssh_user_password()
 * - ::nc_server_config_add_ch_ssh_user_interactive()
 * - ::nc_server_config_del_ch_ssh_user_interactive()
 * - ::nc_server_config_del_ch_ssh_user()
 * - ::nc_server_config_add_ch_ssh_truststore_ref()
 * - ::nc_server_config_del_ch_ssh_truststore_ref()
 *
 * - ::nc_server_config_add_ch_tls_server_cert()
 * - ::nc_server_config_del_ch_tls_server_cert()
 * - ::nc_server_config_add_ch_tls_keystore_ref()
 * - ::nc_server_config_del_ch_tls_keystore_ref()
 * - ::nc_server_config_add_ch_tls_client_cert()
 * - ::nc_server_config_del_ch_tls_client_cert()
 * - ::nc_server_config_add_ch_tls_client_cert_truststore_ref()
 * - ::nc_server_config_del_ch_tls_client_cert_truststore_ref()
 * - ::nc_server_config_add_ch_tls_ca_cert()
 * - ::nc_server_config_del_ch_tls_ca_cert()
 * - ::nc_server_config_add_ch_tls_ca_cert_truststore_ref()
 * - ::nc_server_config_del_ch_tls_ca_cert_truststore_ref()
 * - ::nc_server_config_add_ch_tls_ctn()
 * - ::nc_server_config_del_ch_tls_ctn()
 *
 * Connecting And Cleanup
 * ======================
 *
 * When accepting connections with ::nc_accept(), all the endpoints are examined
 * and the first with a pending connection is used. To remove all CH clients,
 * endpoints, and free any used dynamic memory, [destroy](@ref howtoinit) the server.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_accept()
 */

/**
 * @page howtoclientcomm Client communication
 *
 * To send RPCs on a session, you simply create an RPC, send it using ::nc_send_rpc(),
 * and then wait for a reply using ::nc_recv_reply(). If you are subscribed, there are 2 ways
 * of receiving notifications. Either you wait for them the same way
 * as for standard replies with ::nc_recv_notif() or you create a dispatcher
 * with ::nc_recv_notif_dispatch() that asynchronously (in a separate thread)
 * reads notifications and passes them to your callback.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_client.h__.
 *
 * - ::nc_rpc_act_generic()
 * - ::nc_rpc_act_generic_xml()
 * - ::nc_rpc_getconfig()
 * - ::nc_rpc_edit()
 * - ::nc_rpc_copy()
 * - ::nc_rpc_delete()
 * - ::nc_rpc_lock()
 * - ::nc_rpc_unlock()
 * - ::nc_rpc_get()
 * - ::nc_rpc_kill()
 * - ::nc_rpc_commit()
 * - ::nc_rpc_discard()
 * - ::nc_rpc_cancel()
 * - ::nc_rpc_validate()
 * - ::nc_rpc_getschema()
 * - ::nc_rpc_subscribe()
 * - ::nc_rpc_getdata()
 * - ::nc_rpc_editdata()
 * - ::nc_rpc_establishsub()
 * - ::nc_rpc_modifysub()
 * - ::nc_rpc_deletesub()
 * - ::nc_rpc_killsub()
 * - ::nc_rpc_establishpush_periodic()
 * - ::nc_rpc_establishpush_onchange()
 * - ::nc_rpc_modifypush_periodic()
 * - ::nc_rpc_modifypush_onchange()
 * - ::nc_rpc_resyncsub()
 *
 * - ::nc_send_rpc()
 * - ::nc_recv_reply()
 * - ::nc_recv_notif()
 * - ::nc_recv_notif_dispatch()
 */

/**
 * @page howtoservercomm Server communication
 *
 * Once at least one session is established, an nc_pollsession structure
 * should be created with ::nc_ps_new(), filled with the session using
 * ::nc_ps_add_session() and finally polled with ::nc_ps_poll(). Based on
 * the return value from the poll, further actions can be taken. More
 * sessions can be polled at the same time and any requests received on
 * the sessions are [handled internally](@ref howtoserver).
 *
 * If an SSH NETCONF session asks for a new channel, you can accept
 * this request with ::nc_ps_accept_ssh_channel() or ::nc_session_accept_ssh_channel()
 * depending on the structure you want to use as the argument.
 *
 * Functions List
 * --------------
 *
 * Available in __nc_server.h__.
 *
 * - ::nc_ps_new()
 * - ::nc_ps_add_session()
 * - ::nc_ps_del_session()
 * - ::nc_ps_session_count()
 * - ::nc_ps_free()
 *
 * - ::nc_ps_poll()
 * - ::nc_ps_clear()
 * - ::nc_ps_accept_ssh_channel()
 * - ::nc_session_accept_ssh_channel()
 */

/**
 * @page howtotimeouts Timeouts
 *
 * There are several timeouts which are used throughout _libnetconf2_ to
 * assure that it will never indefinitely hang on any operation. Normally,
 * you should not need to worry about them much because they are set by
 * default to reasonable values for common systems. However, if your
 * platform is not common (embedded, ...), adjusting these timeouts may
 * save a lot of debugging and time.
 *
 * Compile Options
 * ---------------
 *
 * You can adjust active and inactive read timeout using `cmake` variables.
 * For details look into `README.md`.
 *
 * Configurable timeouts
 * ---------------------
 *
 * Once a new connection is established including transport protocol negotiations,
 * _hello_ message is exchanged. You can set how long will the server wait for
 * receiving this message from a client before dropping it.
 *
 * Having a NETCONF session working, it may not communicate for a longer time.
 * To free up some resources, it is possible to adjust the maximum idle period
 * of a session before it is disconnected. In _Call Home_, for both a persistent
 * and periodic connection can this idle timeout be specified separately for each
 * client. Lastly, SSH user authentication timeout can be also modified. It is the time
 * a client has to successfully authenticate after connecting before it is disconnected.
 *
 * These timeouts can be toggled by applying corresponding configuration data.
 */

/**
 * @defgroup misc Miscellaneous
 * @brief Miscellaneous macros, types, structure and functions for a generic use by both server and client applications.
 */

/**
 * @defgroup client Client
 * @brief NETCONF client functionality.
 */

/**
 * @defgroup server Server
 * @brief NETCONF server functionality.
 * @{
 * @} Server
 */
