LCOV - code coverage report
Current view: top level - zephyr/bluetooth/mesh - access.h Hit Total Coverage
Test: new.info Lines: 221 245 90.2 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /** @file
       2             :  *  @brief Access layer APIs.
       3             :  */
       4             : 
       5             : /*
       6             :  * Copyright (c) 2017 Intel Corporation
       7             :  *
       8             :  * SPDX-License-Identifier: Apache-2.0
       9             :  */
      10             : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_ACCESS_H_
      11             : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_ACCESS_H_
      12             : 
      13             : #include <zephyr/sys/util.h>
      14             : #include <zephyr/settings/settings.h>
      15             : #include <zephyr/bluetooth/mesh/msg.h>
      16             : 
      17             : /* Internal macros used to initialize array members */
      18           0 : #define BT_MESH_KEY_UNUSED_ELT_(IDX, _) BT_MESH_KEY_UNUSED
      19           0 : #define BT_MESH_ADDR_UNASSIGNED_ELT_(IDX, _) BT_MESH_ADDR_UNASSIGNED
      20           0 : #define BT_MESH_UUID_UNASSIGNED_ELT_(IDX, _) NULL
      21           0 : #define BT_MESH_MODEL_KEYS_UNUSED(_keys)                        \
      22             :         { LISTIFY(_keys, BT_MESH_KEY_UNUSED_ELT_, (,)) }
      23           0 : #define BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps)                  \
      24             :         { LISTIFY(_grps, BT_MESH_ADDR_UNASSIGNED_ELT_, (,)) }
      25             : #if CONFIG_BT_MESH_LABEL_COUNT > 0
      26             : #define BT_MESH_MODEL_UUIDS_UNASSIGNED()                        \
      27             :         .uuids = (const uint8_t *[]){ LISTIFY(CONFIG_BT_MESH_LABEL_COUNT, \
      28             :                                      BT_MESH_UUID_UNASSIGNED_ELT_, (,)) },
      29             : #else
      30           0 : #define BT_MESH_MODEL_UUIDS_UNASSIGNED()
      31             : #endif
      32             : 
      33           0 : #define BT_MESH_MODEL_RUNTIME_INIT(_user_data)                  \
      34             :         .rt = &(struct bt_mesh_model_rt_ctx){ .user_data = (_user_data) },
      35             : 
      36             : /**
      37             :  * @brief Access layer
      38             :  * @defgroup bt_mesh_access Access layer
      39             :  * @ingroup bt_mesh
      40             :  * @{
      41             :  */
      42             : 
      43             : #ifdef __cplusplus
      44             : extern "C" {
      45             : #endif
      46             : 
      47             : /**
      48             :  * @name Group addresses
      49             :  * @{
      50             :  */
      51           1 : #define BT_MESH_ADDR_UNASSIGNED    0x0000   /**< unassigned */
      52           1 : #define BT_MESH_ADDR_ALL_NODES     0xffff   /**< all-nodes */
      53           1 : #define BT_MESH_ADDR_RELAYS        0xfffe   /**< all-relays */
      54           1 : #define BT_MESH_ADDR_FRIENDS       0xfffd   /**< all-friends */
      55           1 : #define BT_MESH_ADDR_PROXIES       0xfffc   /**< all-proxies */
      56           1 : #define BT_MESH_ADDR_DFW_NODES     0xfffb   /**< all-directed-forwarding-nodes */
      57           1 : #define BT_MESH_ADDR_IP_NODES      0xfffa   /**< all-ipt-nodes */
      58           1 : #define BT_MESH_ADDR_IP_BR_ROUTERS 0xfff9   /**< all-ipt-border-routers */
      59             : /**
      60             :  * @}
      61             :  */
      62             : 
      63             : /**
      64             :  * @name Predefined key indexes
      65             :  * @{
      66             :  */
      67           1 : #define BT_MESH_KEY_UNUSED        0xffff          /**< Key unused */
      68           1 : #define BT_MESH_KEY_ANY           0xffff          /**< Any key index */
      69           1 : #define BT_MESH_KEY_DEV           0xfffe          /**< Device key */
      70           1 : #define BT_MESH_KEY_DEV_LOCAL     BT_MESH_KEY_DEV /**< Local device key */
      71           1 : #define BT_MESH_KEY_DEV_REMOTE    0xfffd          /**< Remote device key */
      72           1 : #define BT_MESH_KEY_DEV_ANY       0xfffc          /**< Any device key */
      73             : /**
      74             :  * @}
      75             :  */
      76             : 
      77             : /**
      78             :  * Check if a Bluetooth Mesh address is a unicast address.
      79             :  */
      80           1 : #define BT_MESH_ADDR_IS_UNICAST(addr) ((addr) && (addr) < 0x8000)
      81             : /**
      82             :  * Check if a Bluetooth Mesh address is a group address.
      83             :  */
      84           1 : #define BT_MESH_ADDR_IS_GROUP(addr) ((addr) >= 0xc000 && (addr) < 0xff00)
      85             : /**
      86             :  * Check if a Bluetooth Mesh address is a fixed group address.
      87             :  */
      88           1 : #define BT_MESH_ADDR_IS_FIXED_GROUP(addr) ((addr) >= 0xff00 && (addr) < 0xffff)
      89             : /**
      90             :  * Check if a Bluetooth Mesh address is a virtual address.
      91             :  */
      92           1 : #define BT_MESH_ADDR_IS_VIRTUAL(addr) ((addr) >= 0x8000 && (addr) < 0xc000)
      93             : /**
      94             :  * Check if a Bluetooth Mesh address is an RFU address.
      95             :  */
      96           1 : #define BT_MESH_ADDR_IS_RFU(addr) ((addr) >= 0xff00 && (addr) <= 0xfff8)
      97             : 
      98             : /**
      99             :  * Check if a Bluetooth Mesh key is a device key.
     100             :  */
     101           1 : #define BT_MESH_IS_DEV_KEY(key) (key == BT_MESH_KEY_DEV_LOCAL || \
     102             :                                  key == BT_MESH_KEY_DEV_REMOTE)
     103             : 
     104             : /** Maximum size of an access message segment (in octets). */
     105           1 : #define BT_MESH_APP_SEG_SDU_MAX   12
     106             : 
     107             : /** Maximum payload size of an unsegmented access message (in octets). */
     108           1 : #define BT_MESH_APP_UNSEG_SDU_MAX 15
     109             : 
     110             : /** Maximum number of segments supported for incoming messages. */
     111             : #if defined(CONFIG_BT_MESH_RX_SEG_MAX)
     112             : #define BT_MESH_RX_SEG_MAX CONFIG_BT_MESH_RX_SEG_MAX
     113             : #else
     114           1 : #define BT_MESH_RX_SEG_MAX 0
     115             : #endif
     116             : 
     117             : /** Maximum number of segments supported for outgoing messages. */
     118             : #if defined(CONFIG_BT_MESH_TX_SEG_MAX)
     119             : #define BT_MESH_TX_SEG_MAX CONFIG_BT_MESH_TX_SEG_MAX
     120             : #else
     121           1 : #define BT_MESH_TX_SEG_MAX 0
     122             : #endif
     123             : 
     124             : /** Maximum possible payload size of an outgoing access message (in octets). */
     125           1 : #define BT_MESH_TX_SDU_MAX        MAX((BT_MESH_TX_SEG_MAX *             \
     126             :                                        BT_MESH_APP_SEG_SDU_MAX),        \
     127             :                                       BT_MESH_APP_UNSEG_SDU_MAX)
     128             : 
     129             : /** Maximum possible payload size of an incoming access message (in octets). */
     130           1 : #define BT_MESH_RX_SDU_MAX        MAX((BT_MESH_RX_SEG_MAX *             \
     131             :                                        BT_MESH_APP_SEG_SDU_MAX),        \
     132             :                                       BT_MESH_APP_UNSEG_SDU_MAX)
     133             : 
     134             : /** Helper to define a mesh element within an array.
     135             :  *
     136             :  *  In case the element has no SIG or Vendor models the helper
     137             :  *  macro BT_MESH_MODEL_NONE can be given instead.
     138             :  *
     139             :  *  @param _loc       Location Descriptor.
     140             :  *  @param _mods      Array of models.
     141             :  *  @param _vnd_mods  Array of vendor models.
     142             :  */
     143           1 : #define BT_MESH_ELEM(_loc, _mods, _vnd_mods)                            \
     144             : {                                                                       \
     145             :         .rt               = &(struct bt_mesh_elem_rt_ctx) { 0 },    \
     146             :         .loc              = (_loc),                                     \
     147             :         .model_count      = ARRAY_SIZE(_mods),                          \
     148             :         .vnd_model_count  = ARRAY_SIZE(_vnd_mods),                      \
     149             :         .models           = (_mods),                                    \
     150             :         .vnd_models       = (_vnd_mods),                                \
     151             : }
     152             : 
     153             : /** Abstraction that describes a Mesh Element */
     154           1 : struct bt_mesh_elem {
     155             :         /** Mesh Element runtime information */
     156           1 :         struct bt_mesh_elem_rt_ctx {
     157             :                 /** Unicast Address. Set at runtime during provisioning. */
     158           1 :                 uint16_t addr;
     159           0 :         } * const rt;
     160             : 
     161             :         /** Location Descriptor (GATT Bluetooth Namespace Descriptors) */
     162           1 :         const uint16_t loc;
     163             :         /** The number of SIG models in this element */
     164           1 :         const uint8_t model_count;
     165             :         /** The number of vendor models in this element */
     166           1 :         const uint8_t vnd_model_count;
     167             : 
     168             :         /** The list of SIG models in this element */
     169           1 :         const struct bt_mesh_model * const models;
     170             :         /** The list of vendor models in this element */
     171           1 :         const struct bt_mesh_model * const vnd_models;
     172             : };
     173             : 
     174             : /**
     175             :  * @name Foundation Models
     176             :  * @{
     177             :  */
     178             : /** Configuration Server */
     179           1 : #define BT_MESH_MODEL_ID_CFG_SRV                   0x0000
     180             : /** Configuration Client */
     181           1 : #define BT_MESH_MODEL_ID_CFG_CLI                   0x0001
     182             : /** Health Server */
     183           1 : #define BT_MESH_MODEL_ID_HEALTH_SRV                0x0002
     184             : /** Health Client */
     185           1 : #define BT_MESH_MODEL_ID_HEALTH_CLI                0x0003
     186             : /** Remote Provisioning Server */
     187           1 : #define BT_MESH_MODEL_ID_REMOTE_PROV_SRV           0x0004
     188             : /** Remote Provisioning Client */
     189           1 : #define BT_MESH_MODEL_ID_REMOTE_PROV_CLI           0x0005
     190             : /** Bridge Configuration Sever */
     191           1 : #define BT_MESH_MODEL_ID_BRG_CFG_SRV               0x0008
     192             : /** Bridge Configuration Client */
     193           1 : #define BT_MESH_MODEL_ID_BRG_CFG_CLI               0x0009
     194             : /** Private Beacon Server */
     195           1 : #define BT_MESH_MODEL_ID_PRIV_BEACON_SRV           0x000a
     196             : /** Private Beacon Client */
     197           1 : #define BT_MESH_MODEL_ID_PRIV_BEACON_CLI           0x000b
     198             : /** SAR Configuration Server */
     199           1 : #define BT_MESH_MODEL_ID_SAR_CFG_SRV               0x000e
     200             : /** SAR Configuration Client */
     201           1 : #define BT_MESH_MODEL_ID_SAR_CFG_CLI               0x000f
     202             : /** Opcodes Aggregator Server */
     203           1 : #define BT_MESH_MODEL_ID_OP_AGG_SRV                0x0010
     204             : /** Opcodes Aggregator Client */
     205           1 : #define BT_MESH_MODEL_ID_OP_AGG_CLI                0x0011
     206             : /** Large Composition Data Server */
     207           1 : #define BT_MESH_MODEL_ID_LARGE_COMP_DATA_SRV       0x0012
     208             : /** Large Composition Data Client */
     209           1 : #define BT_MESH_MODEL_ID_LARGE_COMP_DATA_CLI       0x0013
     210             : /** Solicitation PDU RPL Configuration Client */
     211           1 : #define BT_MESH_MODEL_ID_SOL_PDU_RPL_SRV           0x0014
     212             : /** Solicitation PDU RPL Configuration Server */
     213           1 : #define BT_MESH_MODEL_ID_SOL_PDU_RPL_CLI           0x0015
     214             : /** Private Proxy Server */
     215           1 : #define BT_MESH_MODEL_ID_ON_DEMAND_PROXY_SRV       0x000c
     216             : /** Private Proxy Client */
     217           1 : #define BT_MESH_MODEL_ID_ON_DEMAND_PROXY_CLI       0x000d
     218             : /**
     219             :  * @}
     220             :  */
     221             : 
     222             : /**
     223             :  * @name Models from the Mesh Model Specification
     224             :  * @{
     225             :  */
     226             : /** Generic OnOff Server */
     227           1 : #define BT_MESH_MODEL_ID_GEN_ONOFF_SRV             0x1000
     228             : /** Generic OnOff Client */
     229           1 : #define BT_MESH_MODEL_ID_GEN_ONOFF_CLI             0x1001
     230             : /** Generic Level Server */
     231           1 : #define BT_MESH_MODEL_ID_GEN_LEVEL_SRV             0x1002
     232             : /** Generic Level Client */
     233           1 : #define BT_MESH_MODEL_ID_GEN_LEVEL_CLI             0x1003
     234             : /** Generic Default Transition Time Server */
     235           1 : #define BT_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV    0x1004
     236             : /** Generic Default Transition Time Client */
     237           1 : #define BT_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_CLI    0x1005
     238             : /** Generic Power OnOff Server */
     239           1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV       0x1006
     240             : /** Generic Power OnOff Setup Server */
     241           1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_SETUP_SRV 0x1007
     242             : /** Generic Power OnOff Client */
     243           1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_CLI       0x1008
     244             : /** Generic Power Level Server */
     245           1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV       0x1009
     246             : /** Generic Power Level Setup Server */
     247           1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_SETUP_SRV 0x100a
     248             : /** Generic Power Level Client */
     249           1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_CLI       0x100b
     250             : /** Generic Battery Server */
     251           1 : #define BT_MESH_MODEL_ID_GEN_BATTERY_SRV           0x100c
     252             : /** Generic Battery Client */
     253           1 : #define BT_MESH_MODEL_ID_GEN_BATTERY_CLI           0x100d
     254             : /** Generic Location Server */
     255           1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_SRV          0x100e
     256             : /** Generic Location Setup Server */
     257           1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_SETUPSRV     0x100f
     258             : /** Generic Location Client */
     259           1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_CLI          0x1010
     260             : /** Generic Admin Property Server */
     261           1 : #define BT_MESH_MODEL_ID_GEN_ADMIN_PROP_SRV        0x1011
     262             : /** Generic Manufacturer Property Server */
     263           1 : #define BT_MESH_MODEL_ID_GEN_MANUFACTURER_PROP_SRV 0x1012
     264             : /** Generic User Property Server */
     265           1 : #define BT_MESH_MODEL_ID_GEN_USER_PROP_SRV         0x1013
     266             : /** Generic Client Property Server */
     267           1 : #define BT_MESH_MODEL_ID_GEN_CLIENT_PROP_SRV       0x1014
     268             : /** Generic Property Client */
     269           1 : #define BT_MESH_MODEL_ID_GEN_PROP_CLI              0x1015
     270             : /** Sensor Server */
     271           1 : #define BT_MESH_MODEL_ID_SENSOR_SRV                0x1100
     272             : /** Sensor Setup Server */
     273           1 : #define BT_MESH_MODEL_ID_SENSOR_SETUP_SRV          0x1101
     274             : /** Sensor Client */
     275           1 : #define BT_MESH_MODEL_ID_SENSOR_CLI                0x1102
     276             : /** Time Server */
     277           1 : #define BT_MESH_MODEL_ID_TIME_SRV                  0x1200
     278             : /** Time Setup Server */
     279           1 : #define BT_MESH_MODEL_ID_TIME_SETUP_SRV            0x1201
     280             : /** Time Client */
     281           1 : #define BT_MESH_MODEL_ID_TIME_CLI                  0x1202
     282             : /** Scene Server */
     283           1 : #define BT_MESH_MODEL_ID_SCENE_SRV                 0x1203
     284             : /** Scene Setup Server */
     285           1 : #define BT_MESH_MODEL_ID_SCENE_SETUP_SRV           0x1204
     286             : /** Scene Client */
     287           1 : #define BT_MESH_MODEL_ID_SCENE_CLI                 0x1205
     288             : /** Scheduler Server */
     289           1 : #define BT_MESH_MODEL_ID_SCHEDULER_SRV             0x1206
     290             : /** Scheduler Setup Server */
     291           1 : #define BT_MESH_MODEL_ID_SCHEDULER_SETUP_SRV       0x1207
     292             : /** Scheduler Client */
     293           1 : #define BT_MESH_MODEL_ID_SCHEDULER_CLI             0x1208
     294             : /** Light Lightness Server */
     295           1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV       0x1300
     296             : /** Light Lightness Setup Server */
     297           1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_SETUP_SRV 0x1301
     298             : /** Light Lightness Client */
     299           1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_CLI       0x1302
     300             : /** Light CTL Server */
     301           1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_SRV             0x1303
     302             : /** Light CTL Setup Server */
     303           1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_SETUP_SRV       0x1304
     304             : /** Light CTL Client */
     305           1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_CLI             0x1305
     306             : /** Light CTL Temperature Server */
     307           1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV        0x1306
     308             : /** Light HSL Server */
     309           1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SRV             0x1307
     310             : /** Light HSL Setup Server */
     311           1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SETUP_SRV       0x1308
     312             : /** Light HSL Client */
     313           1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_CLI             0x1309
     314             : /** Light HSL Hue Server */
     315           1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV         0x130a
     316             : /** Light HSL Saturation Server */
     317           1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV         0x130b
     318             : /** Light xyL Server */
     319           1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_SRV             0x130c
     320             : /** Light xyL Setup Server */
     321           1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_SETUP_SRV       0x130d
     322             : /** Light xyL Client */
     323           1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_CLI             0x130e
     324             : /** Light LC Server */
     325           1 : #define BT_MESH_MODEL_ID_LIGHT_LC_SRV              0x130f
     326             : /** Light LC Setup Server */
     327           1 : #define BT_MESH_MODEL_ID_LIGHT_LC_SETUPSRV         0x1310
     328             : /** Light LC Client */
     329           1 : #define BT_MESH_MODEL_ID_LIGHT_LC_CLI              0x1311
     330             : /**
     331             :  * @}
     332             :  */
     333             : 
     334             : /**
     335             :  * @name Models from the Mesh Binary Large Object Transfer Model Specification
     336             :  * @{
     337             :  */
     338             : /** BLOB Transfer Server */
     339           1 : #define BT_MESH_MODEL_ID_BLOB_SRV                  0x1400
     340             : /** BLOB Transfer Client */
     341           1 : #define BT_MESH_MODEL_ID_BLOB_CLI                  0x1401
     342             : /**
     343             :  * @}
     344             :  */
     345             : 
     346             : /**
     347             :  *  @name Models from the Mesh Device Firmware Update Model Specification
     348             :  * @{
     349             :  */
     350             : /** Firmware Update Server */
     351           1 : #define BT_MESH_MODEL_ID_DFU_SRV                   0x1402
     352             : /** Firmware Update Client */
     353           1 : #define BT_MESH_MODEL_ID_DFU_CLI                   0x1403
     354             : /** Firmware Distribution Server */
     355           1 : #define BT_MESH_MODEL_ID_DFD_SRV                   0x1404
     356             : /** Firmware Distribution Client */
     357           1 : #define BT_MESH_MODEL_ID_DFD_CLI                   0x1405
     358             : /**
     359             :  * @}
     360             :  */
     361             : 
     362             : /** Model opcode handler. */
     363           1 : struct bt_mesh_model_op {
     364             :         /** OpCode encoded using the BT_MESH_MODEL_OP_* macros */
     365           1 :         const uint32_t  opcode;
     366             : 
     367             :         /** Message length. If the message has variable length then this value
     368             :          *  indicates minimum message length and should be positive. Handler
     369             :          *  function should verify precise length based on the contents of the
     370             :          *  message. If the message has fixed length then this value should
     371             :          *  be negative. Use BT_MESH_LEN_* macros when defining this value.
     372             :          */
     373           1 :         const ssize_t len;
     374             : 
     375             :         /** @brief Handler function for this opcode.
     376             :          *
     377             :          *  @param model Model instance receiving the message.
     378             :          *  @param ctx   Message context for the message.
     379             :          *  @param buf   Message buffer containing the message payload, not
     380             :          *               including the opcode.
     381             :          *
     382             :          *  @return Zero on success or (negative) error code otherwise.
     383             :          */
     384           1 :         int (*const func)(const struct bt_mesh_model *model,
     385             :                           struct bt_mesh_msg_ctx *ctx,
     386             :                           struct net_buf_simple *buf);
     387             : };
     388             : 
     389           0 : #define BT_MESH_MODEL_OP_1(b0) (b0)
     390           0 : #define BT_MESH_MODEL_OP_2(b0, b1) (((b0) << 8) | (b1))
     391           0 : #define BT_MESH_MODEL_OP_3(b0, cid) ((((b0) << 16) | 0xc00000) | (cid))
     392             : 
     393             : /** Macro for encoding exact message length for fixed-length messages.  */
     394           1 : #define BT_MESH_LEN_EXACT(len) (-len)
     395             : /** Macro for encoding minimum message length for variable-length messages.  */
     396           1 : #define BT_MESH_LEN_MIN(len) (len)
     397             : 
     398             : /** End of the opcode list. Must always be present. */
     399           1 : #define BT_MESH_MODEL_OP_END { 0, 0, NULL }
     400             : 
     401             : #if !defined(__cplusplus) || defined(__DOXYGEN__)
     402             : /**
     403             :  * @brief Helper to define an empty opcode list.
     404             :  *
     405             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     406             :  * not C++.
     407             :  */
     408           1 : #define BT_MESH_MODEL_NO_OPS ((struct bt_mesh_model_op []) \
     409             :                               { BT_MESH_MODEL_OP_END })
     410             : 
     411             : /**
     412             :  *  @brief Helper to define an empty model array
     413             :  *
     414             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     415             :  * not C++.
     416             :  */
     417           1 : #define BT_MESH_MODEL_NONE ((const struct bt_mesh_model []){})
     418             : 
     419             : /**
     420             :  *  @brief Composition data SIG model entry with callback functions
     421             :  *         with specific number of keys & groups.
     422             :  *
     423             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     424             :  * not C++.
     425             :  *
     426             :  *  @param _id        Model ID.
     427             :  *  @param _op        Array of model opcode handlers.
     428             :  *  @param _pub       Model publish parameters.
     429             :  *  @param _user_data User data for the model.
     430             :  *  @param _keys      Number of keys that can be bound to the model.
     431             :  *                    Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_KEY_COUNT}.
     432             :  *  @param _grps      Number of addresses that the model can be subscribed to.
     433             :  *                    Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_GROUP_COUNT}.
     434             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     435             :  */
     436           1 : #define BT_MESH_MODEL_CNT_CB(_id, _op, _pub, _user_data, _keys, _grps, _cb)     \
     437             : {                                                                               \
     438             :         .id = (_id),                                                            \
     439             :         BT_MESH_MODEL_RUNTIME_INIT(_user_data)                                  \
     440             :         .pub = _pub,                                                            \
     441             :         .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(_keys),                 \
     442             :         .keys_cnt = _keys,                                                      \
     443             :         .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps),         \
     444             :         .groups_cnt = _grps,                                                    \
     445             :         BT_MESH_MODEL_UUIDS_UNASSIGNED()                                        \
     446             :         .op = _op,                                                              \
     447             :         .cb = _cb,                                                              \
     448             : }
     449             : 
     450             : /**
     451             :  *  @brief Composition data vendor model entry with callback functions
     452             :  *         with specific number of keys & groups.
     453             :  *
     454             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     455             :  * not C++.
     456             :  *
     457             :  *  @param _company   Company ID.
     458             :  *  @param _id        Model ID.
     459             :  *  @param _op        Array of model opcode handlers.
     460             :  *  @param _pub       Model publish parameters.
     461             :  *  @param _user_data User data for the model.
     462             :  *  @param _keys      Number of keys that can be bound to the model.
     463             :  *                    Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_KEY_COUNT}.
     464             :  *  @param _grps      Number of addresses that the model can be subscribed to.
     465             :  *                    Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_GROUP_COUNT}.
     466             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     467             :  */
     468           1 : #define BT_MESH_MODEL_CNT_VND_CB(_company, _id, _op, _pub, _user_data, _keys, _grps, _cb)       \
     469             : {                                                                                               \
     470             :         .vnd.company = (_company),                                                              \
     471             :         .vnd.id = (_id),                                                                        \
     472             :         BT_MESH_MODEL_RUNTIME_INIT(_user_data)                                                  \
     473             :         .op = _op,                                                                              \
     474             :         .pub = _pub,                                                                            \
     475             :         .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(_keys),                                 \
     476             :         .keys_cnt = _keys,                                                                      \
     477             :         .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps),                         \
     478             :         .groups_cnt = _grps,                                                                    \
     479             :         BT_MESH_MODEL_UUIDS_UNASSIGNED()                                                        \
     480             :         .cb = _cb,                                                                              \
     481             : }
     482             : 
     483             : /**
     484             :  *  @brief Composition data SIG model entry with callback functions.
     485             :  *
     486             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     487             :  * not C++.
     488             :  *
     489             :  *  @param _id        Model ID.
     490             :  *  @param _op        Array of model opcode handlers.
     491             :  *  @param _pub       Model publish parameters.
     492             :  *  @param _user_data User data for the model.
     493             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     494             :  */
     495           1 : #define BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, _cb)       \
     496             :         BT_MESH_MODEL_CNT_CB(_id, _op, _pub, _user_data,        \
     497             :                              CONFIG_BT_MESH_MODEL_KEY_COUNT,    \
     498             :                              CONFIG_BT_MESH_MODEL_GROUP_COUNT, _cb)
     499             : 
     500             : 
     501             : /**
     502             :  *
     503             :  *  @brief Composition data SIG model entry with callback functions and metadata.
     504             :  *
     505             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     506             :  * not C++.
     507             :  *
     508             :  *  @param _id        Model ID.
     509             :  *  @param _op        Array of model opcode handlers.
     510             :  *  @param _pub       Model publish parameters.
     511             :  *  @param _user_data User data for the model.
     512             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     513             :  *  @param _metadata  Metadata structure. Used if @kconfig{CONFIG_BT_MESH_LARGE_COMP_DATA_SRV}
     514             :  *                    is enabled.
     515             :  */
     516             : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV)
     517             : #define BT_MESH_MODEL_METADATA_CB(_id, _op, _pub, _user_data, _cb, _metadata)                    \
     518             : {                                                                            \
     519             :         .id = (_id),                                                         \
     520             :         BT_MESH_MODEL_RUNTIME_INIT(_user_data)                               \
     521             :         .pub = _pub,                                                         \
     522             :         .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(CONFIG_BT_MESH_MODEL_KEY_COUNT), \
     523             :         .keys_cnt = CONFIG_BT_MESH_MODEL_KEY_COUNT,                          \
     524             :         .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(CONFIG_BT_MESH_MODEL_GROUP_COUNT), \
     525             :         .groups_cnt = CONFIG_BT_MESH_MODEL_GROUP_COUNT,                      \
     526             :         BT_MESH_MODEL_UUIDS_UNASSIGNED()                                     \
     527             :         .op = _op,                                                           \
     528             :         .cb = _cb,                                                           \
     529             :         .metadata = _metadata,                                               \
     530             : }
     531             : #else
     532           1 : #define BT_MESH_MODEL_METADATA_CB(_id, _op, _pub, _user_data, _cb, _metadata)  \
     533             :         BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, _cb)
     534             : #endif
     535             : 
     536             : /**
     537             :  *
     538             :  *  @brief Composition data vendor model entry with callback functions.
     539             :  *
     540             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     541             :  * not C++.
     542             :  *
     543             :  *  @param _company   Company ID.
     544             :  *  @param _id        Model ID.
     545             :  *  @param _op        Array of model opcode handlers.
     546             :  *  @param _pub       Model publish parameters.
     547             :  *  @param _user_data User data for the model.
     548             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     549             :  */
     550           1 : #define BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, _cb) \
     551             :         BT_MESH_MODEL_CNT_VND_CB(_company, _id, _op, _pub, _user_data,  \
     552             :                                  CONFIG_BT_MESH_MODEL_KEY_COUNT,        \
     553             :                                  CONFIG_BT_MESH_MODEL_GROUP_COUNT, _cb)
     554             : 
     555             : /**
     556             :  *
     557             :  *  @brief Composition data vendor model entry with callback functions and metadata.
     558             :  *
     559             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     560             :  * not C++.
     561             :  *
     562             :  *  @param _company   Company ID.
     563             :  *  @param _id        Model ID.
     564             :  *  @param _op        Array of model opcode handlers.
     565             :  *  @param _pub       Model publish parameters.
     566             :  *  @param _user_data User data for the model.
     567             :  *  @param _cb        Callback structure, or NULL to keep no callbacks.
     568             :  *  @param _metadata  Metadata structure. Used if @kconfig{CONFIG_BT_MESH_LARGE_COMP_DATA_SRV}
     569             :  *                    is enabled.
     570             :  */
     571             : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV)
     572             : #define BT_MESH_MODEL_VND_METADATA_CB(_company, _id, _op, _pub, _user_data, _cb, _metadata)      \
     573             : {                                                                            \
     574             :         .vnd.company = (_company),                                           \
     575             :         .vnd.id = (_id),                                                     \
     576             :         BT_MESH_MODEL_RUNTIME_INIT(_user_data)                               \
     577             :         .op = _op,                                                           \
     578             :         .pub = _pub,                                                         \
     579             :         .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(CONFIG_BT_MESH_MODEL_KEY_COUNT), \
     580             :         .keys_cnt = CONFIG_BT_MESH_MODEL_KEY_COUNT,                          \
     581             :         .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(CONFIG_BT_MESH_MODEL_GROUP_COUNT), \
     582             :         .groups_cnt = CONFIG_BT_MESH_MODEL_GROUP_COUNT,                      \
     583             :         BT_MESH_MODEL_UUIDS_UNASSIGNED()                                     \
     584             :         .cb = _cb,                                                           \
     585             :         .metadata = _metadata,                                               \
     586             : }
     587             : #else
     588           1 : #define BT_MESH_MODEL_VND_METADATA_CB(_company, _id, _op, _pub, _user_data, _cb, _metadata)      \
     589             :         BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, _cb)
     590             : #endif
     591             : /**
     592             :  *  @brief Composition data SIG model entry.
     593             :  *
     594             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     595             :  * not C++.
     596             :  *
     597             :  *  @param _id        Model ID.
     598             :  *  @param _op        Array of model opcode handlers.
     599             :  *  @param _pub       Model publish parameters.
     600             :  *  @param _user_data User data for the model.
     601             :  */
     602           1 : #define BT_MESH_MODEL(_id, _op, _pub, _user_data)                              \
     603             :         BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, NULL)
     604             : 
     605             : /**
     606             :  *  @brief Composition data vendor model entry.
     607             :  *
     608             :  * This macro uses compound literal feature of C99 standard and thus is available only from C,
     609             :  * not C++.
     610             :  *
     611             :  *  @param _company   Company ID.
     612             :  *  @param _id        Model ID.
     613             :  *  @param _op        Array of model opcode handlers.
     614             :  *  @param _pub       Model publish parameters.
     615             :  *  @param _user_data User data for the model.
     616             :  */
     617           1 : #define BT_MESH_MODEL_VND(_company, _id, _op, _pub, _user_data)                \
     618             :         BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, NULL)
     619             : #endif /* !defined(__cplusplus) || defined(__DOXYGEN__) */
     620             : 
     621             : /**
     622             :  *  @brief Encode transmission count & interval steps.
     623             :  *
     624             :  *  @param count   Number of retransmissions (first transmission is excluded).
     625             :  *  @param int_ms  Interval steps in milliseconds. Must be greater than 0,
     626             :  *                 less than or equal to 320, and a multiple of 10.
     627             :  *
     628             :  *  @return Mesh transmit value that can be used e.g. for the default
     629             :  *          values of the configuration model data.
     630             :  */
     631           1 : #define BT_MESH_TRANSMIT(count, int_ms) ((count) | (((int_ms / 10) - 1) << 3))
     632             : 
     633             : /**
     634             :  *  @brief Decode transmit count from a transmit value.
     635             :  *
     636             :  *  @param transmit Encoded transmit count & interval value.
     637             :  *
     638             :  *  @return Transmission count (actual transmissions is N + 1).
     639             :  */
     640           1 : #define BT_MESH_TRANSMIT_COUNT(transmit) (((transmit) & (uint8_t)BIT_MASK(3)))
     641             : 
     642             : /**
     643             :  *  @brief Decode transmit interval from a transmit value.
     644             :  *
     645             :  *  @param transmit Encoded transmit count & interval value.
     646             :  *
     647             :  *  @return Transmission interval in milliseconds.
     648             :  */
     649           1 : #define BT_MESH_TRANSMIT_INT(transmit) ((((transmit) >> 3) + 1) * 10)
     650             : 
     651             : /**
     652             :  *  @brief Encode Publish Retransmit count & interval steps.
     653             :  *
     654             :  *  @param count  Number of retransmissions (first transmission is excluded).
     655             :  *  @param int_ms Interval steps in milliseconds. Must be greater than 0 and a
     656             :  *                multiple of 50.
     657             :  *
     658             :  *  @return Mesh transmit value that can be used e.g. for the default
     659             :  *          values of the configuration model data.
     660             :  */
     661           1 : #define BT_MESH_PUB_TRANSMIT(count, int_ms) BT_MESH_TRANSMIT(count,           \
     662             :                                                              (int_ms) / 5)
     663             : 
     664             : /**
     665             :  *  @brief Decode Publish Retransmit count from a given value.
     666             :  *
     667             :  *  @param transmit Encoded Publish Retransmit count & interval value.
     668             :  *
     669             :  *  @return Retransmission count (actual transmissions is N + 1).
     670             :  */
     671           1 : #define BT_MESH_PUB_TRANSMIT_COUNT(transmit) BT_MESH_TRANSMIT_COUNT(transmit)
     672             : 
     673             : /**
     674             :  *  @brief Decode Publish Retransmit interval from a given value.
     675             :  *
     676             :  *  @param transmit Encoded Publish Retransmit count & interval value.
     677             :  *
     678             :  *  @return Transmission interval in milliseconds.
     679             :  */
     680           1 : #define BT_MESH_PUB_TRANSMIT_INT(transmit) ((((transmit) >> 3) + 1) * 50)
     681             : 
     682             : /**
     683             :  * @brief Get total number of messages within one publication interval including initial
     684             :  * publication.
     685             :  *
     686             :  * @param pub Model publication context.
     687             :  *
     688             :  * @return total number of messages.
     689             :  */
     690           1 : #define BT_MESH_PUB_MSG_TOTAL(pub) (BT_MESH_PUB_TRANSMIT_COUNT((pub)->retransmit) + 1)
     691             : 
     692             : /**
     693             :  * @brief Get message number within one publication interval.
     694             :  *
     695             :  * Meant to be used inside @ref bt_mesh_model_pub.update.
     696             :  *
     697             :  * @param pub Model publication context.
     698             :  *
     699             :  * @return message number starting from 1.
     700             :  */
     701           1 : #define BT_MESH_PUB_MSG_NUM(pub) (BT_MESH_PUB_TRANSMIT_COUNT((pub)->retransmit) + 1 - (pub)->count)
     702             : 
     703             : /** Model publication context.
     704             :  *
     705             :  *  The context should primarily be created using the
     706             :  *  BT_MESH_MODEL_PUB_DEFINE macro.
     707             :  */
     708           1 : struct bt_mesh_model_pub {
     709             :         /** The model the context belongs to. Initialized by the stack. */
     710           1 :         const struct bt_mesh_model *mod;
     711             : 
     712           1 :         uint16_t addr;          /**< Publish Address. */
     713           1 :         const uint8_t *uuid;    /**< Label UUID if Publish Address is Virtual Address. */
     714           1 :         uint16_t key:12,        /**< Publish AppKey Index. */
     715           1 :                  cred:1,        /**< Friendship Credentials Flag. */
     716           1 :                  send_rel:1,    /**< Force reliable sending (segment acks) */
     717           1 :                  fast_period:1, /**< Use FastPeriodDivisor */
     718           1 :                  retr_update:1; /**< Call update callback on every retransmission. */
     719             : 
     720           1 :         uint8_t  ttl;          /**< Publish Time to Live. */
     721           1 :         uint8_t  retransmit;   /**< Retransmit Count & Interval Steps. */
     722           1 :         uint8_t  period;       /**< Publish Period. */
     723           1 :         uint8_t  period_div:4, /**< Divisor for the Period. */
     724           1 :                  count:4;      /**< Transmissions left. */
     725             : 
     726           1 :         uint8_t delayable:1;   /**< Use random delay for publishing. */
     727             : 
     728           1 :         uint32_t period_start; /**< Start of the current period. */
     729             : 
     730             :         /** @brief Publication buffer, containing the publication message.
     731             :          *
     732             :          *  This will get correctly created when the publication context
     733             :          *  has been defined using the BT_MESH_MODEL_PUB_DEFINE macro.
     734             :          *
     735             :          *      BT_MESH_MODEL_PUB_DEFINE(name, update, size);
     736             :          */
     737           1 :         struct net_buf_simple *msg;
     738             : 
     739             :         /** @brief Callback for updating the publication buffer.
     740             :          *
     741             :          *  When set to NULL, the model is assumed not to support
     742             :          *  periodic publishing. When set to non-NULL the callback
     743             :          *  will be called periodically and is expected to update
     744             :          *  @ref bt_mesh_model_pub.msg with a valid publication
     745             :          *  message.
     746             :          *
     747             :          *  If the callback returns non-zero, the publication is skipped
     748             :          *  and will resume on the next periodic publishing interval.
     749             :          *
     750             :          *  When @ref bt_mesh_model_pub.retr_update is set to 1,
     751             :          *  the callback will be called on every retransmission.
     752             :          *
     753             :          *  @param mod The Model the Publication Context belongs to.
     754             :          *
     755             :          *  @return Zero on success or (negative) error code otherwise.
     756             :          */
     757           1 :         int (*update)(const struct bt_mesh_model *mod);
     758             : 
     759             :         /** Publish Period Timer. Only for stack-internal use. */
     760           1 :         struct k_work_delayable timer;
     761             : };
     762             : 
     763             : /**
     764             :  *  Define a model publication context.
     765             :  *
     766             :  *  @param _name Variable name given to the context.
     767             :  *  @param _update Optional message update callback (may be NULL).
     768             :  *  @param _msg_len Length of the publication message.
     769             :  */
     770           1 : #define BT_MESH_MODEL_PUB_DEFINE(_name, _update, _msg_len) \
     771             :         NET_BUF_SIMPLE_DEFINE_STATIC(bt_mesh_pub_msg_##_name, _msg_len); \
     772             :         static struct bt_mesh_model_pub _name = { \
     773             :                 .msg = &bt_mesh_pub_msg_##_name, \
     774             :                 .update = _update, \
     775             :         }
     776             : 
     777             : /** Models Metadata Entry struct
     778             :  *
     779             :  *  The struct should primarily be created using the
     780             :  *  BT_MESH_MODELS_METADATA_ENTRY macro.
     781             :  */
     782           1 : struct bt_mesh_models_metadata_entry {
     783             :         /* Length of the metadata */
     784           0 :         const uint16_t len;
     785             : 
     786             :         /* ID of the metadata */
     787           0 :         const uint16_t id;
     788             : 
     789             :         /* Pointer to raw data */
     790           0 :         const void * const data;
     791             : };
     792             : 
     793             : /**
     794             :  *
     795             :  *  Initialize a Models Metadata entry structure in a list.
     796             :  *
     797             :  *  @param _len Length of the metadata entry.
     798             :  *  @param _id ID of the Models Metadata entry.
     799             :  *  @param _data Pointer to a contiguous memory that contains the metadata.
     800             :  */
     801           1 : #define BT_MESH_MODELS_METADATA_ENTRY(_len, _id, _data)                         \
     802             :         {                                                                      \
     803             :                 .len = (_len), .id = _id, .data = _data,                       \
     804             :         }
     805             : 
     806             : /** Helper to define an empty Models metadata array */
     807           1 : #define BT_MESH_MODELS_METADATA_NONE NULL
     808             : 
     809             : /** End of the Models Metadata list. Must always be present. */
     810           1 : #define BT_MESH_MODELS_METADATA_END { 0, 0, NULL }
     811             : 
     812             : /** Model callback functions. */
     813           1 : struct bt_mesh_model_cb {
     814             :         /** @brief Set value handler of user data tied to the model.
     815             :          *
     816             :          *  @sa settings_handler::h_set
     817             :          *
     818             :          *  @param model   Model to set the persistent data of.
     819             :          *  @param name    Name/key of the settings item.
     820             :          *  @param len_rd  The size of the data found in the backend.
     821             :          *  @param read_cb Function provided to read the data from the backend.
     822             :          *  @param cb_arg  Arguments for the read function provided by the
     823             :          *                 backend.
     824             :          *
     825             :          *  @return 0 on success, error otherwise.
     826             :          */
     827           1 :         int (*const settings_set)(const struct bt_mesh_model *model,
     828             :                                   const char *name, size_t len_rd,
     829             :                                   settings_read_cb read_cb, void *cb_arg);
     830             : 
     831             :         /** @brief Callback called when the mesh is started.
     832             :          *
     833             :          *  This handler gets called after the node has been provisioned, or
     834             :          *  after all mesh data has been loaded from persistent storage.
     835             :          *
     836             :          *  When this callback fires, the mesh model may start its behavior,
     837             :          *  and all Access APIs are ready for use.
     838             :          *
     839             :          *  @param model      Model this callback belongs to.
     840             :          *
     841             :          *  @return 0 on success, error otherwise.
     842             :          */
     843           1 :         int (*const start)(const struct bt_mesh_model *model);
     844             : 
     845             :         /** @brief Model init callback.
     846             :          *
     847             :          *  Called on every model instance during mesh initialization.
     848             :          *
     849             :          *  If any of the model init callbacks return an error, the Mesh
     850             :          *  subsystem initialization will be aborted, and the error will be
     851             :          *  returned to the caller of @ref bt_mesh_init.
     852             :          *
     853             :          *  @param model Model to be initialized.
     854             :          *
     855             :          *  @return 0 on success, error otherwise.
     856             :          */
     857           1 :         int (*const init)(const struct bt_mesh_model *model);
     858             : 
     859             :         /** @brief Model reset callback.
     860             :          *
     861             :          *  Called when the mesh node is reset. All model data is deleted on
     862             :          *  reset, and the model should clear its state.
     863             :          *
     864             :          *  @note If the model stores any persistent data, this needs to be
     865             :          *  erased manually.
     866             :          *
     867             :          *  @param model Model this callback belongs to.
     868             :          */
     869           1 :         void (*const reset)(const struct bt_mesh_model *model);
     870             : 
     871             :         /** @brief Callback used to store pending model's user data.
     872             :          *
     873             :          *  Triggered by @ref bt_mesh_model_data_store_schedule.
     874             :          *
     875             :          *  To store the user data, call @ref bt_mesh_model_data_store.
     876             :          *
     877             :          *  @param model Model this callback belongs to.
     878             :          */
     879           1 :         void (*const pending_store)(const struct bt_mesh_model *model);
     880             : };
     881             : 
     882             : /** Vendor model ID */
     883           1 : struct bt_mesh_mod_id_vnd {
     884             :         /** Vendor's company ID */
     885           1 :         uint16_t company;
     886             :         /** Model ID */
     887           1 :         uint16_t id;
     888             : };
     889             : 
     890             : /** Abstraction that describes a Mesh Model instance */
     891           1 : struct bt_mesh_model {
     892             :         union {
     893             :                 /** SIG model ID */
     894           1 :                 const uint16_t id;
     895             :                 /** Vendor model ID */
     896           1 :                 const struct bt_mesh_mod_id_vnd vnd;
     897           0 :         };
     898             : 
     899             :         /* Model runtime information */
     900           0 :         struct bt_mesh_model_rt_ctx {
     901           0 :                 uint8_t  elem_idx;   /* Belongs to Nth element */
     902           0 :                 uint8_t  mod_idx;    /* Is the Nth model in the element */
     903           0 :                 uint16_t flags;      /* Model flags for internal bookkeeping */
     904             : 
     905             : #ifdef CONFIG_BT_MESH_MODEL_EXTENSIONS
     906             :                 /* Pointer to the next model in a model extension list. */
     907           0 :                 const struct bt_mesh_model *next;
     908             : #endif
     909             :                 /** Model-specific user data */
     910           1 :                 void *user_data;
     911           0 :         } * const rt;
     912             : 
     913             :         /** Model Publication */
     914           1 :         struct bt_mesh_model_pub * const pub;
     915             : 
     916             :         /** AppKey List */
     917           1 :         uint16_t * const keys;
     918           0 :         const uint16_t keys_cnt;
     919             : 
     920             :         /** Subscription List (group or virtual addresses) */
     921           1 :         uint16_t * const groups;
     922           0 :         const uint16_t groups_cnt;
     923             : 
     924             : #if (CONFIG_BT_MESH_LABEL_COUNT > 0) || defined(__DOXYGEN__)
     925             :         /** List of Label UUIDs the model is subscribed to. */
     926           1 :         const uint8_t ** const uuids;
     927             : #endif
     928             : 
     929             :         /** Opcode handler list */
     930           1 :         const struct bt_mesh_model_op * const op;
     931             : 
     932             :         /** Model callback structure. */
     933           1 :         const struct bt_mesh_model_cb * const cb;
     934             : 
     935             : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV) || defined(__DOXYGEN__)
     936             :         /* Pointer to the array of model metadata entries. */
     937           0 :         const struct bt_mesh_models_metadata_entry * const metadata;
     938             : #endif
     939             : };
     940             : 
     941             : /** Callback structure for monitoring model message sending */
     942           1 : struct bt_mesh_send_cb {
     943             :         /** @brief Handler called at the start of the transmission.
     944             :          *
     945             :          *  @param duration The duration of the full transmission.
     946             :          *  @param err      Error occurring during sending.
     947             :          *  @param cb_data  Callback data, as passed to the send API.
     948             :          */
     949           1 :         void (*start)(uint16_t duration, int err, void *cb_data);
     950             :         /** @brief Handler called at the end of the transmission.
     951             :          *
     952             :          *  @param err     Error occurring during sending.
     953             :          *  @param cb_data Callback data, as passed to the send API.
     954             :          */
     955           1 :         void (*end)(int err, void *cb_data);
     956             : };
     957             : 
     958             : 
     959             : /** Special TTL value to request using configured default TTL */
     960           1 : #define BT_MESH_TTL_DEFAULT 0xff
     961             : 
     962             : /** Maximum allowed TTL value */
     963           1 : #define BT_MESH_TTL_MAX     0x7f
     964             : 
     965             : /** @brief Send an Access Layer message.
     966             :  *
     967             :  *  @param model   Mesh (client) Model that the message belongs to.
     968             :  *  @param ctx     Message context, includes keys, TTL, etc.
     969             :  *  @param msg     Access Layer payload (the actual message to be sent).
     970             :  *  @param cb      Optional "message sent" callback.
     971             :  *  @param cb_data User data to be passed to the callback.
     972             :  *
     973             :  *  @return 0 on success, or (negative) error code on failure.
     974             :  */
     975           1 : int bt_mesh_model_send(const struct bt_mesh_model *model,
     976             :                        struct bt_mesh_msg_ctx *ctx,
     977             :                        struct net_buf_simple *msg,
     978             :                        const struct bt_mesh_send_cb *cb,
     979             :                        void *cb_data);
     980             : 
     981             : /** @brief Send a model publication message.
     982             :  *
     983             :  *  Before calling this function, the user needs to ensure that the model
     984             :  *  publication message (@ref bt_mesh_model_pub.msg) contains a valid
     985             :  *  message to be sent. Note that this API is only to be used for
     986             :  *  non-period publishing. For periodic publishing the app only needs
     987             :  *  to make sure that @ref bt_mesh_model_pub.msg contains a valid message
     988             :  *  whenever the @ref bt_mesh_model_pub.update callback is called.
     989             :  *
     990             :  *  @param model Mesh (client) Model that's publishing the message.
     991             :  *
     992             :  *  @return 0 on success, or (negative) error code on failure.
     993             :  */
     994           1 : int bt_mesh_model_publish(const struct bt_mesh_model *model);
     995             : 
     996             : /** @brief Check if a message is being retransmitted.
     997             :  *
     998             :  * Meant to be used inside the @ref bt_mesh_model_pub.update callback.
     999             :  *
    1000             :  * @param model Mesh Model that supports publication.
    1001             :  *
    1002             :  * @return true if this is a retransmission, false if this is a first publication.
    1003             :  */
    1004           1 : static inline bool bt_mesh_model_pub_is_retransmission(const struct bt_mesh_model *model)
    1005             : {
    1006             :         return model->pub->count != BT_MESH_PUB_TRANSMIT_COUNT(model->pub->retransmit);
    1007             : }
    1008             : 
    1009             : /** @brief Get the element that a model belongs to.
    1010             :  *
    1011             :  *  @param mod Mesh model.
    1012             :  *
    1013             :  *  @return Pointer to the element that the given model belongs to.
    1014             :  */
    1015           1 : const struct bt_mesh_elem *bt_mesh_model_elem(const struct bt_mesh_model *mod);
    1016             : 
    1017             : /** @brief Find a SIG model.
    1018             :  *
    1019             :  *  @param elem Element to search for the model in.
    1020             :  *  @param id   Model ID of the model.
    1021             :  *
    1022             :  *  @return A pointer to the Mesh model matching the given parameters, or NULL
    1023             :  *          if no SIG model with the given ID exists in the given element.
    1024             :  */
    1025           1 : const struct bt_mesh_model *bt_mesh_model_find(const struct bt_mesh_elem *elem,
    1026             :                                                uint16_t id);
    1027             : 
    1028             : /** @brief Find a vendor model.
    1029             :  *
    1030             :  *  @param elem    Element to search for the model in.
    1031             :  *  @param company Company ID of the model.
    1032             :  *  @param id      Model ID of the model.
    1033             :  *
    1034             :  *  @return A pointer to the Mesh model matching the given parameters, or NULL
    1035             :  *          if no vendor model with the given ID exists in the given element.
    1036             :  */
    1037           1 : const struct bt_mesh_model *bt_mesh_model_find_vnd(const struct bt_mesh_elem *elem,
    1038             :                                                    uint16_t company, uint16_t id);
    1039             : 
    1040             : /** @brief Get whether the model is in the primary element of the device.
    1041             :  *
    1042             :  *  @param mod Mesh model.
    1043             :  *
    1044             :  *  @return true if the model is on the primary element, false otherwise.
    1045             :  */
    1046           1 : static inline bool bt_mesh_model_in_primary(const struct bt_mesh_model *mod)
    1047             : {
    1048             :         return (mod->rt->elem_idx == 0);
    1049             : }
    1050             : 
    1051             : /** @brief Immediately store the model's user data in persistent storage.
    1052             :  *
    1053             :  *  @param mod      Mesh model.
    1054             :  *  @param vnd      This is a vendor model.
    1055             :  *  @param name     Name/key of the settings item. Only
    1056             :  *                  @ref SETTINGS_MAX_DIR_DEPTH bytes will be used at most.
    1057             :  *  @param data     Model data to store, or NULL to delete any model data.
    1058             :  *  @param data_len Length of the model data.
    1059             :  *
    1060             :  *  @return 0 on success, or (negative) error code on failure.
    1061             :  */
    1062           1 : int bt_mesh_model_data_store(const struct bt_mesh_model *mod, bool vnd,
    1063             :                              const char *name, const void *data,
    1064             :                              size_t data_len);
    1065             : 
    1066             : /** @brief Schedule the model's user data store in persistent storage.
    1067             :  *
    1068             :  *  This function triggers the @ref bt_mesh_model_cb.pending_store callback
    1069             :  *  for the corresponding model after delay defined by
    1070             :  *  @kconfig{CONFIG_BT_MESH_STORE_TIMEOUT}.
    1071             :  *
    1072             :  *  The delay is global for all models. Once scheduled, the callback can
    1073             :  *  not be re-scheduled until previous schedule completes.
    1074             :  *
    1075             :  *  @param mod      Mesh model.
    1076             :  */
    1077           1 : void bt_mesh_model_data_store_schedule(const struct bt_mesh_model *mod);
    1078             : 
    1079             : /** @brief Let a model extend another.
    1080             :  *
    1081             :  *  Mesh models may be extended to reuse their functionality, forming a more
    1082             :  *  complex model. A Mesh model may extend any number of models, in any element.
    1083             :  *  The extensions may also be nested, ie a model that extends another may
    1084             :  *  itself be extended.
    1085             :  *
    1086             :  *  A set of models that extend each other form a model extension list.
    1087             :  *
    1088             :  *  All models in an extension list share one subscription list per element. The
    1089             :  *  access layer will utilize the combined subscription list of all models in an
    1090             :  *  extension list and element, giving the models extended subscription list
    1091             :  *  capacity.
    1092             :  *
    1093             :  * If @kconfig{CONFIG_BT_MESH_COMP_PAGE_1} is enabled, it is not allowed to call
    1094             :  * this function before the @ref bt_mesh_model_cb.init callback is called
    1095             :  * for both models, except if it is called as part of the final callback.
    1096             :  *
    1097             :  *  @param extending_mod      Mesh model that is extending the base model.
    1098             :  *  @param base_mod           The model being extended.
    1099             :  *
    1100             :  *  @retval 0 Successfully extended the base_mod model.
    1101             :  */
    1102           1 : int bt_mesh_model_extend(const struct bt_mesh_model *extending_mod,
    1103             :                          const struct bt_mesh_model *base_mod);
    1104             : 
    1105             : /** @brief Let a model correspond to another.
    1106             :  *
    1107             :  *  Mesh models may correspond to each other, which means that if one is present,
    1108             :  *  other must be present too. A Mesh model may correspond to any number of models,
    1109             :  *  in any element. All models connected together via correspondence form single
    1110             :  *  Correspondence Group, which has it's unique Correspondence ID. Information about
    1111             :  *  Correspondence is used to construct Composition Data Page 1.
    1112             :  *
    1113             :  *  This function must be called on already initialized base_mod. Because this function
    1114             :  *  is designed to be called in corresponding_mod initializer, this means that base_mod
    1115             :  *  shall be initialized before corresponding_mod is.
    1116             :  *
    1117             :  *  @param corresponding_mod  Mesh model that is corresponding to the base model.
    1118             :  *  @param base_mod           The model being corresponded to.
    1119             :  *
    1120             :  *  @retval 0 Successfully saved correspondence to the base_mod model.
    1121             :  *  @retval -ENOMEM   There is no more space to save this relation.
    1122             :  *  @retval -ENOTSUP  Composition Data Page 1 is not supported.
    1123             :  */
    1124             : 
    1125           1 : int bt_mesh_model_correspond(const struct bt_mesh_model *corresponding_mod,
    1126             :                              const struct bt_mesh_model *base_mod);
    1127             : 
    1128             : /** @brief Check if model is extended by another model.
    1129             :  *
    1130             :  *  @param model The model to check.
    1131             :  *
    1132             :  *  @retval true If model is extended by another model, otherwise false
    1133             :  */
    1134           1 : bool bt_mesh_model_is_extended(const struct bt_mesh_model *model);
    1135             : 
    1136             : /** @brief Indicate that the composition data will change on next bootup.
    1137             :  *
    1138             :  *  Tell the config server that the composition data is expected to change on
    1139             :  *  the next bootup, and the current composition data should be backed up.
    1140             :  *
    1141             :  *  @return Zero on success or (negative) error code otherwise.
    1142             :  */
    1143           1 : int bt_mesh_comp_change_prepare(void);
    1144             : 
    1145             : /** @brief Indicate that the metadata will change on next bootup.
    1146             :  *
    1147             :  *  Tell the config server that the models metadata is expected to change on
    1148             :  *  the next bootup, and the current models metadata should be backed up.
    1149             :  *
    1150             :  *  @return Zero on success or (negative) error code otherwise.
    1151             :  */
    1152           1 : int bt_mesh_models_metadata_change_prepare(void);
    1153             : 
    1154             : /** Node Composition */
    1155           1 : struct bt_mesh_comp {
    1156           1 :         uint16_t cid; /**< Company ID */
    1157           1 :         uint16_t pid; /**< Product ID */
    1158           1 :         uint16_t vid; /**< Version ID */
    1159             : 
    1160           1 :         size_t elem_count; /**< The number of elements in this device. */
    1161           1 :         const struct bt_mesh_elem *elem; /**< List of elements. */
    1162             : };
    1163             : 
    1164             : /** Composition data page 2 record. */
    1165           1 : struct bt_mesh_comp2_record {
    1166             :         /** Mesh profile ID. */
    1167           1 :         uint16_t id;
    1168             :         /** Mesh Profile Version. */
    1169             :         struct {
    1170             :                 /** Major version. */
    1171           1 :                 uint8_t x;
    1172             :                 /** Minor version. */
    1173           1 :                 uint8_t y;
    1174             :                 /** Z version. */
    1175           1 :                 uint8_t z;
    1176           1 :         } version;
    1177             :         /** Element offset count. */
    1178           1 :         uint8_t elem_offset_cnt;
    1179             :         /** Element offset list. */
    1180           1 :         const uint8_t *elem_offset;
    1181             :         /** Length of additional data. */
    1182           1 :         uint16_t data_len;
    1183             :         /** Additional data. */
    1184           1 :         const void *data;
    1185             : };
    1186             : 
    1187             : /** Node Composition data page 2 */
    1188           1 : struct bt_mesh_comp2 {
    1189             :         /** The number of Mesh Profile records on a device. */
    1190           1 :         size_t record_cnt;
    1191             :         /** List of records. */
    1192           1 :         const struct bt_mesh_comp2_record *record;
    1193             : };
    1194             : 
    1195             : /** @brief Register composition data page 2 of the device.
    1196             :  *
    1197             :  *  Register Mesh Profiles information (Ref section 3.12 in
    1198             :  *  Bluetooth SIG Assigned Numbers) for composition data
    1199             :  *  page 2 of the device.
    1200             :  *
    1201             :  *  @note There must be at least one record present in @c comp2
    1202             :  *
    1203             :  *  @param comp2 Pointer to composition data page 2.
    1204             :  *
    1205             :  *  @return Zero on success or (negative) error code otherwise.
    1206             :  */
    1207           1 : int bt_mesh_comp2_register(const struct bt_mesh_comp2 *comp2);
    1208             : 
    1209             : #ifdef __cplusplus
    1210             : }
    1211             : #endif
    1212             : 
    1213             : /**
    1214             :  * @}
    1215             :  */
    1216             : 
    1217             : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_ACCESS_H_ */

Generated by: LCOV version 1.14