blob: 63a6f6ef375ba6375ba6fd43f04e8c0091cd87cc [file] [log] [blame]
.. _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