.. _ip_stack_overview:

Overview
########

Supported Features
******************

The networking IP stack is modular and highly configurable via build-time
configuration options. You can minimize system memory consumption by enabling
only those network features required by your application. Almost all features
can be disabled if not needed.

* **IPv6** The support for IPv6 is enabled by default. Various IPv6 sub-options
  can be enabled or disabled depending on networking needs.

  * Developer can set the number of unicast and multicast IPv6 addresses that
    are active at the same time.
  * The IPv6 address for the device can be set either statically or
    dynamically using SLAAC (Stateless Address Auto Configuration) (RFC 4862).
  * The system also supports multiple IPv6 prefixes and the maximum
    IPv6 prefix count can be configured at build time.
  * The IPv6 neighbor cache can be disabled if not needed, and its size can be
    configured at build time.
  * The IPv6 neighbor discovery support (RFC 4861) is enabled by default.
  * Multicast Listener Discovery v2 support (RFC 3810) is enabled by default.
  * IPv6 header compression (6lo) is available for IPv6 connectivity for
    Bluetooth IPSP (RFC 7668) and IEEE 802.15.4 networks (RFC 4944).

* **IPv4** The legacy IPv4 is supported by the networking stack. It cannot be
  used by IEEE 802.15.4 or Bluetooth IPSP as those network technologies support
  only IPv6. IPv4 can be used in ethernet based networks. By default IPv4
  support is disabled.

  * DHCP (Dynamic Host Configuration Protocol) client is supported (RFC 2131).
  * The IPv4 address can also be configured manually. Static IPv4 addresses
    are supported by default.

* **Dual stack support.** The networking stack allows a developer to configure
  the system to use both IPv6 and IPv4 at the same time.

* **UDP** User Datagram Protocol (RFC 768) is supported. The developer can
  send UDP datagrams (client side support) or create a listener to receive
  UDP packets destined to certain port (server side support).

* **TCP** Transmission Control Protocol (RFC 793) is supported. Both server
  and client roles can be used the the application. The amount of TCP sockets
  that are available to applications can be configured at build time.

* **BSD Sockets API** Experimental support for a subset of a BSD Sockets
  compatible API is implemented. Both blocking and non-blocking DGRAM (UDP)
  and STREAM (TCP) sockets are supported.

* **Secure Sockets API** Experimental support for TLS/DTLS secure protocols and
  configuration options for sockets API. Secure functions for the implementation
  are provided by mbedTLS library.

* **MQTT** Message Queue Telemetry Transport (ISO/IEC PRF 20922) is supported.
  A sample :ref:`mqtt-publisher-sample` client application for MQTT v3.1.1 is
  implemented.

* **CoAP** Constrained Application Protocol (RFC 7252) is supported.
  Both :ref:`coap-client-sample` and :ref:`coap-server-sample` sample
  applications are implemented.

* **LWM2M** OMA Lightweight Machine-to-Machine Protocol (V1.0 Feb 2017) is
  supported via the "Register Device" API (Register, De-Register and Update)
  and has template implementations for Security, Server, Device Management and
  Firmware objects.   DTLS and Bootstrap support are currently not supported.
  :ref:`lwm2m-client-sample` implements the library as an example.

* **DNS** Domain Name Service (RFC 1035) client functionality is supported.
  Applications can use an API to query domain name information or IP addresses
  from the DNS server. Both IPv4 (A) and IPv6 (AAAA) records can be queried.

* **Network Management API.** Applications can use network management API to
  listen management events generated by core stack when for example IP address
  is added to the device, or network interface is coming up etc.

* **Multiple Network Technologies.** The Zephyr OS can be configured to
  support multiple network technologies at the same time simply by enabling
  them in Kconfig: for example, Ethernet and 802.15.4 support. Note that no
  automatic IP routing functionality is provided between these technologies.
  Applications can send data according to their needs to desired network
  interface.

* **Minimal Copy Network Buffer Management.** It is possible to have minimal
  copy network data path. This means that the system tries to avoid copying
  application data when it is sent to the network. For some technologies it
  is even possible to have zero-copy data path from application to device
  driver.

* **Virtual LAN support.** Virtual LANs (VLANs) allow partitioning of physical
  ethernet networks into logical networks. See :ref:`vlan_interface` for more
  details.

* **Network traffic classification.** The sent and received network packets can
  be prioritized depending on application needs.
  See :ref:`traffic-class-support` for more details.

* **Time Sensitive Networking.** The gPTP (generalized Precision Time Protocol)
  is supported. See :ref:`gptp_interface` for more details.

Additionally these network technologies (link layers) are supported in
Zephyr OS v1.7 and later:

* IEEE 802.15.4
* Bluetooth
* Ethernet
* SLIP (IP over serial line). Used for testing with QEMU. It provides
  ethernet interface to host system (like Linux) and test applications
  can be run in Linux host and send network data to Zephyr OS device.

Source Tree Layout
******************

The networking stack source code tree is organized as follows:

``subsys/net/ip/``
  This is where the IP stack code is located.

``subsys/net/l2/``
  This is where the IP stack layer 2 code is located. This includes generic
  support for Bluetooth IPSP adaptation, Ethernet, IEEE 802.15.4 and WiFI.

``subsys/net/lib/``
  Application-level protocols (DNS, MQTT, etc.) and additional stack
  components (BSD Sockets, etc.).

``include/net/``
  Public API header files. These are the header files applications need
  to include to use IP networking functionality.

``samples/net/``
  Sample networking code. This is a good reference to get started with
  network application development.

``tests/net/``
  Test applications. These applications are used to verify the
  functionality of the IP stack, but are not the best
  source for sample code (see ``samples/net`` instead).
