1 /* 2 * Copyright (c) 2021 Nordic Semiconductor ASA 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** 8 * @file 9 * @defgroup bt_mesh_dfu_metadata Bluetooth Mesh Device Firmware Update (DFU) metadata 10 * @ingroup bt_mesh_dfu 11 * @{ 12 * @brief Common types and functions for the Bluetooth Mesh DFU metadata. 13 */ 14 15 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__ 16 #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__ 17 18 #include <stdint.h> 19 20 #include <sys/types.h> 21 22 #include <zephyr/kernel.h> 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 /** Firmware version. */ 29 struct bt_mesh_dfu_metadata_fw_ver { 30 /** Firmware major version. */ 31 uint8_t major; 32 /** Firmware minor version. */ 33 uint8_t minor; 34 /** Firmware revision. */ 35 uint16_t revision; 36 /** Firmware build number. */ 37 uint32_t build_num; 38 }; 39 40 /** Firmware core type. */ 41 enum bt_mesh_dfu_metadata_fw_core_type { 42 /** Application core. */ 43 BT_MESH_DFU_FW_CORE_TYPE_APP = BIT(0), 44 /** Network core. */ 45 BT_MESH_DFU_FW_CORE_TYPE_NETWORK = BIT(1), 46 /** Application-specific BLOB. */ 47 BT_MESH_DFU_FW_CORE_TYPE_APP_SPECIFIC_BLOB = BIT(2), 48 }; 49 50 /** Firmware metadata. */ 51 struct bt_mesh_dfu_metadata { 52 /** New firmware version. */ 53 struct bt_mesh_dfu_metadata_fw_ver fw_ver; 54 /** New firmware size. */ 55 uint32_t fw_size; 56 /** New firmware core type. */ 57 enum bt_mesh_dfu_metadata_fw_core_type fw_core_type; 58 /** Hash of incoming Composition Data. */ 59 uint32_t comp_hash; 60 /** New number of node elements. */ 61 uint16_t elems; 62 /** Application-specific data for new firmware. This field is optional. */ 63 uint8_t *user_data; 64 /** Length of the application-specific field. */ 65 uint32_t user_data_len; 66 }; 67 68 /** @brief Decode a firmware metadata from a network buffer. 69 * 70 * @param buf Buffer containing a raw metadata to be decoded. 71 * @param metadata Pointer to a metadata structure to be filled. 72 * 73 * @return 0 on success, or (negative) error code otherwise. 74 */ 75 int bt_mesh_dfu_metadata_decode(struct net_buf_simple *buf, 76 struct bt_mesh_dfu_metadata *metadata); 77 78 /** @brief Encode a firmware metadata into a network buffer. 79 * 80 * @param metadata Firmware metadata to be encoded. 81 * @param buf Buffer to store the encoded metadata. 82 * 83 * @return 0 on success, or (negative) error code otherwise. 84 */ 85 int bt_mesh_dfu_metadata_encode(const struct bt_mesh_dfu_metadata *metadata, 86 struct net_buf_simple *buf); 87 88 /** @brief Compute hash of the Composition Data state. 89 * 90 * The format of the Composition Data is defined in MshPRTv1.1: 4.2.2.1. 91 * 92 * @param buf Pointer to buffer holding Composition Data. 93 * @param key 128-bit key to be used in the hash computation. 94 * @param hash Pointer to a memory location to which the hash will be stored. 95 * 96 * @return 0 on success, or (negative) error code otherwise. 97 */ 98 int bt_mesh_dfu_metadata_comp_hash_get(struct net_buf_simple *buf, uint8_t *key, uint32_t *hash); 99 100 /** @brief Compute hash of the Composition Data Page 0 of this device. 101 * 102 * @param key 128-bit key to be used in the hash computation. 103 * @param hash Pointer to a memory location to which the hash will be stored. 104 * 105 * @return 0 on success, or (negative) error code otherwise. 106 */ 107 int bt_mesh_dfu_metadata_comp_hash_local_get(uint8_t *key, uint32_t *hash); 108 109 #ifdef __cplusplus 110 } 111 #endif 112 113 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__ */ 114 115 /** @} */ 116