.. _bluetooth_mesh_dfd_srv:

Firmware Distribution Server
############################

The Firmware Distribution Server model implements the Distributor role for the
:ref:`bluetooth_mesh_dfu` subsystem. It extends the :ref:`bluetooth_mesh_blob_srv`, which it uses to
receive the firmware image binary from the Initiator node. It also instantiates a
:ref:`bluetooth_mesh_dfu_cli`, which it uses to distribute firmware updates throughout the mesh
network.

.. note::

   Currently, the Firmware Distribution Server supports out-of-band (OOB) retrieval of firmware
   images over SMP service only.

The Firmware Distribution Server does not have an API of its own, but relies on a Firmware
Distribution Client model on a different device to give it information and trigger image
distribution and upload.

Firmware slots
**************

The Firmware Distribution Server is capable of storing multiple firmware images for distribution.
Each slot contains a separate firmware image with metadata, and can be distributed to other mesh
nodes in the network in any order. The contents, format and size of the firmware images are vendor
specific, and may contain data from other vendors. The application should never attempt to execute
or modify them.

The slots are managed remotely by a Firmware Distribution Client, which can both upload new slots
and delete old ones. The application is notified of changes to the slots through the Firmware
Distribution Server's callbacks (:cpp:type:`bt_mesh_fd_srv_cb`). While the metadata for each
firmware slot is stored internally, the application must provide a :ref:`bluetooth_mesh_blob_stream`
for reading and writing the firmware image.

API reference
*************

.. doxygengroup:: bt_mesh_dfd_srv
