/**
 * @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()
 *
 * 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.
 * The variant for UNIX socket is ::nc_server_config_add_unix_socket(). 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_add_unix_socket()
 * - ::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.
 *
 * 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()
 *
 * 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.
 *
 * Lastly, monitoring of these sessions is up to the application.
 *
 * 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
 */
