.. _net_app_api: Network Application API ####################### The Network Application (net-app) API allows applications to: **Initialize** The application for networking use. This means, for example, that if the application needs to have an IPv4 address, and if DHCPv4 is enabled, then the net-app API will make sure that the device will get an IPv4 address before the application is started. **Set** Various options for the networking subsystem. This means that if the user has set options like IP addresses, IEEE 802.15.4 channel etc. in the project configuration file, then those settings are applied to the system before the application starts. **Create** A simple TCP/UDP server or client application. The net-app API has functions that make it easy to create a simple TCP or UDP based network application. The net-app API also provides transparent TLS and DTLS support for the application. The net-app API functionality is enabled by :option:`CONFIG_NET_APP` option. The current net-app API implementation is still experimental and may change and improve in future releases. Initialization ############## The net-app API provides a :cpp:func:`net_app_init()` function that can configure the networking subsystem for the application. The following configuration options control this configuration: :option:`CONFIG_NET_APP_AUTO_INIT` automatically configures the system according to other configuration options. The user does not need to call :cpp:func:`net_app_init()` in this case as that function will be automatically called when the system boots. This option is enabled by default. :option:`CONFIG_NET_APP_INIT_TIMEOUT` specifies how long to wait for the network configuration during the system boot. For example, if DHCPv4 is enabled, and if the IPv4 address discovery takes too long or the DHCPv4 server is not found, the system will resume booting after this number of seconds. :option:`CONFIG_NET_APP_NEED_IPV6` specifies that the application needs IPv6 connectivity. The :cpp:func:`net_app_init()` function will wait until it is able to setup an IPv6 address for the system before continuing. This means that the IPv6 duplicate address detection (DAD) has finished and the system has properly setup the IPv6 address. :option:`CONFIG_NET_APP_NEED_IPV6_ROUTER` specifies that the application needs IPv6 router connectivity; i.e., it needs access to external networks (such as the Internet). The :cpp:func:`net_app_init()` function will wait until it receives a router advertisement (RA) message from the IPv6 router before continuing. :option:`CONFIG_NET_APP_NEED_IPV4` specifies that the application needs IPv4 connectivity. The :cpp:func:`net_app_init()` function will wait, unless a static IP address is configured, until it is able to setup an IPv4 address for the network subsystem. Setup ##### Various system level network configuration options can be added to the project configuration file. These settings are enabled by the :option:`CONFIG_NET_APP_SETTINGS` configuration option. This option is disabled by default, and other net-app options may also be disabled by default if generic support for the networking feature is disabled. For example, the IPv6 net-app options are only available if generic IPv6 support is enabled. :option:`CONFIG_NET_APP_MY_IPV6_ADDR` This option sets a static IPv6 address for the system. This is typically only useful in device testing as normally the system should use SLAAC (IPv6 Stateless Address Auto Configuration), which is enabled by default in the system. The system can be configured to use multiple IPv6 addresses; this is controlled by the :option:`CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT` configuration option. :option:`CONFIG_NET_APP_PEER_IPV6_ADDR` This option specifies what is the peer device IPv6 address. This is only useful when testing client/server type applications. This peer address is typically used as a parameter when calling :cpp:func:`net_app_connect()`. :option:`CONFIG_NET_APP_MY_IPV4_ADDR` This option sets a static IPv4 address for the system. This is typically useful only in device testing as normally the system should use DHCPv4 to discover the IPv4 address. :option:`CONFIG_NET_APP_PEER_IPV4_ADDR` This option specifies what is the peer device IPv4 address. This is only useful when testing client/server type applications. This peer address is typically used as a parameter when connecting to other device. The following options are only available if IEEE 802.15.4 wireless network technology support is enabled. :option:`CONFIG_NET_APP_IEEE802154_DEV_NAME` This option specifies the name of the IEEE 802.15.4 device. :option:`CONFIG_NET_APP_IEEE802154_PAN_ID` This option specifies the used PAN identifier. Note that the PAN id can be changed at runtime if needed. :option:`CONFIG_NET_APP_IEEE802154_CHANNEL` This option specifies the used radio channel. Note that the used channel can be changed at runtime if needed. :option:`CONFIG_NET_APP_IEEE802154_RADIO_TX_POWER` This option specifies the initial radio TX power level. The TX power level can be changed at runtime if needed. :option:`CONFIG_NET_APP_IEEE802154_SECURITY_KEY` This option specifies the initially used security key. The security key can be changed at runtime if needed. :option:`CONFIG_NET_APP_IEEE802154_SECURITY_KEY_MODE` This option specifies the initially used security key mode. The security key mode can be changed at runtime if needed. :option:`CONFIG_NET_APP_IEEE802154_SECURITY_LEVEL` This option specifies the initially used security level. The used security level can be changed at runtime if needed. Client / Server Applications ############################ The net-app API provides functions that enable the application to create client / server applications easily. If needed, the applications can have the communication secured by TLS (for TCP connections) or DTLS (for UDP connections) automatically. A simple **TCP server** application would make the following net-app API function calls: * :cpp:func:`net_app_init_tcp_server()` to configure a local address and TCP port. * :cpp:func:`net_app_set_cb()` to configure callback functions to invoke in response to events, such as data reception. * :cpp:func:`net_app_server_tls()` will optionally setup the system for secured connections. To enable the TLS server, also call the :cpp:func:`net_app_server_tls_enable()` function. * :cpp:func:`net_app_listen()` will start listening for new client connections. Creating a **UDP server** is also very easy: * :cpp:func:`net_app_init_udp_server()` to configure a local address and UDP port. * :cpp:func:`net_app_set_cb()` to configure callback functions to invoke in response to events, such as data reception. * :cpp:func:`net_app_server_tls()` will optionally setup the system for secured connections. To enable the DTLS server, also call the :cpp:func:`net_app_server_tls_enable()` function. * :cpp:func:`net_app_listen()` will start listening for new client connections. If the server wants to stop listening for connections, it can call :cpp:func:`net_app_release()`. After this, if the application wants to start listening for incoming connections again, it must call the server initialization functions. For TLS/DTLS connections, the server can be disabled by a call to :cpp:func:`net_app_server_tls_disable()`. There are separate enable/disable functions for TLS support because we need a separate crypto thread for calling mbedtls crypto API functions. The enable/disable TLS functions will either create the TLS thread or kill it. A simple **TCP client** application would make the following net-app API function calls: * :cpp:func:`net_app_init_tcp_client()` to configure a local address, peer address and TCP port. If the DNS resolver support is enabled in the project configuration file, then the peer address can be given as a hostname, and the API tries to resolve it to IP address before connecting. * :cpp:func:`net_app_set_cb()` to configure callback functions to invoke in response to events, such as data reception. * :cpp:func:`net_app_client_tls()` will optionally setup the system for secured connections. The TLS crypto thread will be automatically created when the application calls :cpp:func:`net_app_connect()` function. * :cpp:func:`net_app_connect()` will initiate a new connection to the peer host. Creating a **UDP client** is also very easy: * :cpp:func:`net_app_init_udp_client()` to configure a local address, peer address and UDP port. If peer name is a hostname, then it will be automatically resolved to IP address if DNS resolver is enabled. * :cpp:func:`net_app_set_cb()` to configure callback functions to invoke in response to events, such as data reception. * :cpp:func:`net_app_client_tls()` will optionally setup the system for secured connections. The DTLS crypto thread will be automatically created when the application calls :cpp:func:`net_app_connect()` function. * :cpp:func:`net_app_connect()` will initiate a new connection to the peer host. As the UDP is connectionless protocol, this function is very simple and it will just call the connected callback if that is defined. As both the ``echo_server`` and ``echo_client`` applications use net-app API functions, please see those applications for more detailed usage examples. The `net-tools`_ project has information how to test the system if TLS and DTLS support is enabled. See the **README** file in that project for more information. .. _`net-tools`: https://github.com/zephyrproject-rtos/net-tools