LCOV - code coverage report
Current view: top level - zephyr/bluetooth/mesh - blob_srv.h Coverage Total Hit
Test: new.info Lines: 43.8 % 32 14
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2020 Nordic Semiconductor ASA
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_
       8              : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_
       9              : 
      10              : #include <zephyr/bluetooth/mesh/access.h>
      11              : #include <zephyr/bluetooth/mesh/blob.h>
      12              : 
      13              : #ifdef __cplusplus
      14              : extern "C" {
      15              : #endif
      16              : 
      17              : /**
      18              :  * @defgroup bt_mesh_blob_srv Bluetooth Mesh BLOB Transfer Server model API
      19              :  * @ingroup bt_mesh
      20              :  * @{
      21              :  */
      22              : 
      23              : struct bt_mesh_blob_srv;
      24              : 
      25              : /**
      26              :  *
      27              :  *  @brief Max number of blocks in a single transfer.
      28              :  */
      29              : #if defined(CONFIG_BT_MESH_BLOB_SRV)
      30              : #define BT_MESH_BLOB_BLOCKS_MAX                                                \
      31              :         (DIV_ROUND_UP(CONFIG_BT_MESH_BLOB_SIZE_MAX,                        \
      32              :                           CONFIG_BT_MESH_BLOB_BLOCK_SIZE_MIN))
      33              : #else
      34            1 : #define BT_MESH_BLOB_BLOCKS_MAX 1
      35              : #endif
      36              : 
      37              : /**
      38              :  *
      39              :  *  @brief BLOB Transfer Server model composition data entry.
      40              :  *
      41              :  *  @param _srv Pointer to a @ref bt_mesh_blob_srv instance.
      42              :  */
      43            1 : #define BT_MESH_MODEL_BLOB_SRV(_srv)                                           \
      44              :         BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_BLOB_SRV, _bt_mesh_blob_srv_op,      \
      45              :                          NULL, _srv, &_bt_mesh_blob_srv_cb)
      46              : 
      47              : /** @brief BLOB Transfer Server model event handlers.
      48              :  *
      49              :  *  All callbacks are optional.
      50              :  */
      51            1 : struct bt_mesh_blob_srv_cb {
      52              :         /** @brief Transfer start callback.
      53              :          *
      54              :          *  Called when the transfer has started with the prepared BLOB ID.
      55              :          *
      56              :          *  @param srv  BLOB Transfer Server instance.
      57              :          *  @param ctx  Message context for the incoming start message. The
      58              :          *              entire transfer will be sent from the same source
      59              :          *              address.
      60              :          *  @param xfer Transfer parameters.
      61              :          *
      62              :          *  @return 0 on success, or (negative) error code to reject the
      63              :          *          transfer.
      64              :          */
      65            1 :         int (*start)(struct bt_mesh_blob_srv *srv, struct bt_mesh_msg_ctx *ctx,
      66              :                      struct bt_mesh_blob_xfer *xfer);
      67              : 
      68              :         /** @brief Transfer end callback.
      69              :          *
      70              :          *  Called when the transfer ends, either because it was cancelled, or
      71              :          *  because it finished successfully. A new transfer may be prepared.
      72              :          *
      73              :          *  @note The transfer may end before it's started if the start
      74              :          *        parameters are invalid.
      75              :          *
      76              :          *  @param srv     BLOB Transfer Server instance.
      77              :          *  @param id      BLOB ID of the cancelled transfer.
      78              :          *  @param success Whether the transfer was successful.
      79              :          */
      80            1 :         void (*end)(struct bt_mesh_blob_srv *srv, uint64_t id, bool success);
      81              : 
      82              :         /** @brief Transfer suspended callback.
      83              :          *
      84              :          *  Called if the Server timed out while waiting for a transfer packet.
      85              :          *  A suspended transfer may resume later from the start of the current
      86              :          *  block. Any received chunks in the current block should be discarded,
      87              :          *  they will be received again if the transfer resumes.
      88              :          *
      89              :          *  The transfer will call @c resumed again when resuming.
      90              :          *
      91              :          *  @note The BLOB Transfer Server does not run a timer in the suspended state,
      92              :          *        and it's up to the application to determine whether the
      93              :          *        transfer should be permanently cancelled. Without interaction,
      94              :          *        the transfer will be suspended indefinitely, and the BLOB Transfer
      95              :          *        Server will not accept any new transfers.
      96              :          *
      97              :          *  @param srv BLOB Transfer Server instance.
      98              :          */
      99            1 :         void (*suspended)(struct bt_mesh_blob_srv *srv);
     100              : 
     101              :         /** @brief Transfer resume callback.
     102              :          *
     103              :          *  Called if the transfer is resumed after being suspended.
     104              :          *
     105              :          *  @param srv BLOB Transfer Server instance.
     106              :          */
     107            1 :         void (*resume)(struct bt_mesh_blob_srv *srv);
     108              : 
     109              :         /** @brief Transfer recovery callback.
     110              :          *
     111              :          *  Called when the Bluetooth Mesh subsystem is started if the device is rebooted
     112              :          *  in the middle of a transfer.
     113              :          *
     114              :          *  Transfers will not be resumed after a reboot if this callback is not
     115              :          *  defined.
     116              :          *
     117              :          *  @param srv  BLOB Transfer Server instance.
     118              :          *  @param xfer Transfer to resume.
     119              :          *  @param io   BLOB stream return parameter. Must be set to a valid
     120              :          *              BLOB stream by the callback.
     121              :          *
     122              :          *  @return 0 on success, or (negative) error code to abandon the
     123              :          *          transfer.
     124              :          */
     125            1 :         int (*recover)(struct bt_mesh_blob_srv *srv,
     126              :                        struct bt_mesh_blob_xfer *xfer,
     127              :                        const struct bt_mesh_blob_io **io);
     128              : };
     129              : 
     130              : /** @brief BLOB Transfer Server model instance. */
     131            1 : struct bt_mesh_blob_srv {
     132              :         /** Event handler callbacks. */
     133            1 :         const struct bt_mesh_blob_srv_cb *cb;
     134              : 
     135              :         /* Runtime state: */
     136            0 :         const struct bt_mesh_blob_io *io;
     137            0 :         struct k_work_delayable rx_timeout;
     138            0 :         struct bt_mesh_blob_block block;
     139            0 :         const struct bt_mesh_model *mod;
     140            0 :         enum bt_mesh_blob_xfer_phase phase;
     141              : 
     142            0 :         struct bt_mesh_blob_srv_state {
     143            0 :                 struct bt_mesh_blob_xfer xfer;
     144            0 :                 uint16_t cli;
     145            0 :                 uint16_t app_idx;
     146            0 :                 uint16_t timeout_base;
     147            0 :                 uint16_t mtu_size;
     148            0 :                 uint8_t ttl;
     149              : 
     150              :                 /* Bitfield of pending blocks. */
     151            0 :                 ATOMIC_DEFINE(blocks, BT_MESH_BLOB_BLOCKS_MAX);
     152            0 :         } state;
     153              : 
     154              :         /* Pull mode (Pull BLOB Transfer Mode) behavior. */
     155              :         struct {
     156            0 :                 uint16_t chunk_idx;
     157            0 :                 struct k_work_delayable report;
     158            0 :         } pull;
     159              : };
     160              : 
     161              : /** @brief Prepare BLOB Transfer Server for an incoming transfer.
     162              :  *
     163              :  *  Before a BLOB Transfer Server can receive a transfer, the transfer must be prepared
     164              :  *  through some application level mechanism. The BLOB Transfer Server will only accept
     165              :  *  incoming transfers with a matching BLOB ID.
     166              :  *
     167              :  *  @param srv          BLOB Transfer Server instance.
     168              :  *  @param id           BLOB ID to accept.
     169              :  *  @param io           BLOB stream to write the incoming BLOB to.
     170              :  *  @param ttl          Time to live value to use in responses to the BLOB Transfer Client.
     171              :  *  @param timeout_base Extra time for the Client to respond in addition to the
     172              :  *                      base 10 seconds, in 10-second increments.
     173              :  *
     174              :  *  @return 0 on success, or (negative) error code on failure.
     175              :  */
     176            1 : int bt_mesh_blob_srv_recv(struct bt_mesh_blob_srv *srv, uint64_t id,
     177              :                           const struct bt_mesh_blob_io *io, uint8_t ttl,
     178              :                           uint16_t timeout_base);
     179              : 
     180              : /** @brief Cancel the current BLOB transfer.
     181              :  *
     182              :  *  Tells the BLOB Transfer Client to drop this device from the list of Targets for the
     183              :  *  current transfer. Note that the client may continue sending the transfer to
     184              :  *  other Targets.
     185              :  *
     186              :  *  @param srv BLOB Transfer Server instance.
     187              :  *
     188              :  *  @return 0 on success, or (negative) error code on failure.
     189              :  */
     190            1 : int bt_mesh_blob_srv_cancel(struct bt_mesh_blob_srv *srv);
     191              : 
     192              : /** @brief Get the current state of the BLOB Transfer Server.
     193              :  *
     194              :  *  @param srv BLOB Transfer Server instance.
     195              :  *
     196              :  *  @return true if the BLOB Transfer Server is currently participating in a transfer,
     197              :  *          false otherwise.
     198              :  */
     199            1 : bool bt_mesh_blob_srv_is_busy(const struct bt_mesh_blob_srv *srv);
     200              : 
     201              : /** @brief Get the current progress of the active transfer in percent.
     202              :  *
     203              :  *  @param srv BLOB Transfer Server instance.
     204              :  *
     205              :  *  @return The current transfer progress, or 0 if no transfer is active.
     206              :  */
     207            1 : uint8_t bt_mesh_blob_srv_progress(const struct bt_mesh_blob_srv *srv);
     208              : 
     209              : /** @cond INTERNAL_HIDDEN */
     210              : extern const struct bt_mesh_model_op _bt_mesh_blob_srv_op[];
     211              : extern const struct bt_mesh_model_cb _bt_mesh_blob_srv_cb;
     212              : /** @endcond */
     213              : 
     214              : /** @} */
     215              : 
     216              : #ifdef __cplusplus
     217              : }
     218              : #endif
     219              : 
     220              : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_ */
        

Generated by: LCOV version 2.0-1