1 /*
2  * Copyright (c) 2020 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__
8 #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__
9 
10 #include <sys/types.h>
11 
12 #include <zephyr/kernel.h>
13 #include <zephyr/bluetooth/mesh/blob.h>
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 /**
20  * @defgroup bt_mesh_dfu Bluetooth Mesh Device Firmware Update
21  * @ingroup bt_mesh
22  * @{
23  */
24 
25 #ifndef CONFIG_BT_MESH_DFU_FWID_MAXLEN
26 #define CONFIG_BT_MESH_DFU_FWID_MAXLEN 0
27 #endif
28 
29 #ifndef CONFIG_BT_MESH_DFU_METADATA_MAXLEN
30 #define CONFIG_BT_MESH_DFU_METADATA_MAXLEN 0
31 #endif
32 
33 #ifndef CONFIG_BT_MESH_DFU_URI_MAXLEN
34 #define CONFIG_BT_MESH_DFU_URI_MAXLEN 0
35 #endif
36 
37 #ifndef CONFIG_BT_MESH_DFU_SLOT_CNT
38 #define CONFIG_BT_MESH_DFU_SLOT_CNT 0
39 #endif
40 
41 /** DFU transfer phase. */
42 enum bt_mesh_dfu_phase {
43 	/** Ready to start a Receive Firmware procedure. */
44 	BT_MESH_DFU_PHASE_IDLE,
45 
46 	/** The Transfer BLOB procedure failed. */
47 	BT_MESH_DFU_PHASE_TRANSFER_ERR,
48 
49 	/** The Receive Firmware procedure is being executed.  */
50 	BT_MESH_DFU_PHASE_TRANSFER_ACTIVE,
51 
52 	/** The Verify Firmware procedure is being executed. */
53 	BT_MESH_DFU_PHASE_VERIFY,
54 
55 	/** The Verify Firmware procedure completed successfully. */
56 	BT_MESH_DFU_PHASE_VERIFY_OK,
57 
58 	/** The Verify Firmware procedure failed. */
59 	BT_MESH_DFU_PHASE_VERIFY_FAIL,
60 
61 	/** The Apply New Firmware procedure is being executed. */
62 	BT_MESH_DFU_PHASE_APPLYING,
63 
64 	/** Firmware transfer has been canceled. */
65 	BT_MESH_DFU_PHASE_TRANSFER_CANCELED,
66 
67 	/** Firmware applying succeeded. */
68 	BT_MESH_DFU_PHASE_APPLY_SUCCESS,
69 
70 	/** Firmware applying failed. */
71 	BT_MESH_DFU_PHASE_APPLY_FAIL,
72 
73 	/** Phase of a node was not yet retrieved. */
74 	BT_MESH_DFU_PHASE_UNKNOWN,
75 };
76 
77 
78 /** DFU status. */
79 enum bt_mesh_dfu_status {
80 	/** The message was processed successfully. */
81 	BT_MESH_DFU_SUCCESS,
82 
83 	/** Insufficient resources on the node */
84 	BT_MESH_DFU_ERR_RESOURCES,
85 
86 	/** The operation cannot be performed while the Server is in the current
87 	 *  phase.
88 	 */
89 	BT_MESH_DFU_ERR_WRONG_PHASE,
90 
91 	/** An internal error occurred on the node. */
92 	BT_MESH_DFU_ERR_INTERNAL,
93 
94 	/** The message contains a firmware index value that is not expected. */
95 	BT_MESH_DFU_ERR_FW_IDX,
96 
97 	/** The metadata check failed. */
98 	BT_MESH_DFU_ERR_METADATA,
99 
100 	/** The Server cannot start a firmware update. */
101 	BT_MESH_DFU_ERR_TEMPORARILY_UNAVAILABLE,
102 
103 	/** Another BLOB transfer is in progress. */
104 	BT_MESH_DFU_ERR_BLOB_XFER_BUSY,
105 };
106 
107 /** Expected effect of a DFU transfer. */
108 enum bt_mesh_dfu_effect {
109 	/** No changes to node Composition Data. */
110 	BT_MESH_DFU_EFFECT_NONE,
111 
112 	/** Node Composition Data changed and the node does not support remote
113 	 *  provisioning.
114 	 */
115 	BT_MESH_DFU_EFFECT_COMP_CHANGE_NO_RPR,
116 
117 	/** Node Composition Data changed, and remote provisioning is supported.
118 	 *  The node supports remote provisioning and Composition Data Page
119 	 *  0x80. Page 0x80 contains different Composition Data than Page 0x0.
120 	 */
121 	BT_MESH_DFU_EFFECT_COMP_CHANGE,
122 
123 	/** Node will be unprovisioned after the update. */
124 	BT_MESH_DFU_EFFECT_UNPROV,
125 };
126 
127 /** Action for DFU iteration callbacks. */
128 enum bt_mesh_dfu_iter {
129 	/** Stop iterating. */
130 	BT_MESH_DFU_ITER_STOP,
131 
132 	/** Continue iterating. */
133 	BT_MESH_DFU_ITER_CONTINUE,
134 };
135 
136 /** DFU image instance.
137  *
138  *  Each DFU image represents a single updatable firmware image.
139  */
140 struct bt_mesh_dfu_img {
141 	/** Firmware ID. */
142 	const void *fwid;
143 
144 	/** Length of the firmware ID. */
145 	size_t fwid_len;
146 
147 	/** Update URI, or NULL. */
148 	const char *uri;
149 };
150 
151 /** DFU image slot for DFU distribution. */
152 struct bt_mesh_dfu_slot {
153 	/** Size of the firmware in bytes. */
154 	size_t size;
155 	/** Length of the firmware ID. */
156 	size_t fwid_len;
157 	/** Length of the metadata. */
158 	size_t metadata_len;
159 	/** Firmware ID. */
160 	uint8_t fwid[CONFIG_BT_MESH_DFU_FWID_MAXLEN];
161 	/** Metadata. */
162 	uint8_t metadata[CONFIG_BT_MESH_DFU_METADATA_MAXLEN];
163 };
164 
165 /** @} */
166 
167 #ifdef __cplusplus
168 }
169 #endif
170 
171 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__ */
172