c84a277992c135841ff527c0171180e2ddc831f9
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / include / oal-mesh.h
1 /*
2  * Open Adaptation Layer (OAL)
3  *
4  * Copyright (c) 2019 -2020 Samsung Electronics Co., Ltd All Rights Reserved.
5  *
6  * @author: Anupam Roy <anupam.r@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #ifndef OAL_MESH_H_
23 #define OAL_MESH_H_
24
25 #include <oal-manager.h>
26
27 /* Start of BLE Mesh structures and enum declarations */
28
29 #define OAL_MESH_DEVKEY_MSG_BUF_MAX 2048
30 #define OAL_MESH_MSG_BUF_MAX 2048
31
32 /* Mesh Key Operation Enums (For Appkey & NetKey) */
33 typedef enum {
34         OAL_MESH_KEY_ADD = 0,
35         OAL_MESH_KEY_UPDATE,
36         OAL_MESH_KEY_DELETE
37 } oal_mesh_key_op_e;
38
39 /* Mesh Authentication types */
40 typedef enum {
41         /*< Output authentication request types */
42         OAL_MESH_AUTH_ALPHANUMERIC_DISPLAY = 0,
43         OAL_MESH_AUTH_NUMERIC_DISPLAY,
44         OAL_MESH_AUTH_PUSH_COUNT_DISPLAY,
45         OAL_MESH_AUTH_TWIST_COUNT_DISPLAY,
46
47         /*< Input authentication request types */
48         OAL_MESH_AUTH_REQ_ALPHANUMERIC_INPUT,
49         OAL_MESH_AUTH_REQ_NUMERIC_INPUT,
50         OAL_MESH_AUTH_REQ_BLINK_COUNT_INPUT,
51         OAL_MESH_AUTH_REQ_BEEP_COUNT_INPUT,
52         OAL_MESH_AUTH_REQ_VIBRATE_COUNT_INPUT,
53
54         /**< OOB Key Inputs */
55         OAL_MESH_AUTH_REQ_OOB_PUBLIC_KEY_INPUT,
56         OAL_MESH_AUTH_REQ_OOB_STATIC_KEY_INPUT
57 } oal_mesh_variant_authentication_e;
58
59  /* Mesh Enumerations of 2 octet OUT OOB Actions */
60 typedef enum {
61         OAL_MESH_OUT_OOB_METHOD_BLINK            = 0x01,
62         OAL_MESH_OUT_OOB_METHOD_BEEP             = 0x02,
63         OAL_MESH_OUT_OOB_METHOD_VIBRATE          = 0x04,
64         OAL_MESH_OUT_OOB_METHOD_NUMERIC          = 0x08,
65         OAL_MESH_OUT_OOB_METHOD_ALPHANUMERIC     = 0x10,
66         /* bit 5 ~ 15 : RFU */
67 } oal_mesh_output_oob_action_e;
68
69  /* Mesh Enumerations of 2 octet IN OOB Actions */
70 typedef enum {
71         OAL_MESH_IN_OOB_METHOD_PUSH              = 0x01,
72         OAL_MESH_IN_OOB_METHOD_TWIST             = 0x02,
73         OAL_MESH_IN_OOB_METHOD_NUMERIC           = 0x04,
74         OAL_MESH_IN_OOB_METHOD_ALPHANUMERIC      = 0x08,
75         /* bit 4 ~ 15 : RFU */
76 } oal_mesh_input_oob_action_e;
77
78 /* Mesh strcuture of Mesh Provisioning Capabilities */
79 typedef struct {
80         /**< Indicates Public Key for ECC Key exchange, can be fetched OOB */
81         bool public_oob;
82         /**< Indicates Static Key for authentication, can be fetched OOB */
83         bool static_oob;
84         /**< Indicates support for bitmap combination of OUT-OOB actions */
85         oal_mesh_output_oob_action_e out_oob;
86         /**< Indicates support for bitmap combination of IN-OOB actions */
87         oal_mesh_input_oob_action_e  in_oob;
88 } oal_mesh_capabilities_t;
89
90 /* Mesh  Unprovisioned Device Scan result */
91 typedef struct {
92         int rssi;
93         oal_uuid_t dev_uuid;
94         /* 2-octet OOB info */
95         uint8_t oob_info[2];
96         /* 4-octet URI Hash info */
97         uint8_t uri_hash[4];
98 } oal_mesh_scan_result_t;
99
100 /* Mesh Scan Parameters */
101 typedef struct {
102         uint32_t seconds;
103         /* Structure may be expanded in future to support more scan parameters*/
104 } oal_mesh_scan_params_t;
105
106 /* Mesh Node Properties */
107 typedef struct {
108         uint16_t companyid;
109         uint16_t vendorid;
110         uint16_t versionid;
111         uint16_t crpl;
112         int relay;
113         int frnd;
114         int proxy;
115         int lpn;
116 } oal_mesh_vendor_info_t;
117
118 /* Mesh Model: 2 bytes for BT SIG Model & 4 bytes for Vendor Model */
119 typedef struct {
120         uint16_t elem_index;
121         uint32_t model_id;
122 } oal_mesh_model_t;
123
124 /* Mesh Element structure */
125 typedef struct {
126         uint16_t index;
127         uint16_t num_models;
128 } oal_mesh_element_t;
129
130 /* Mesh Node structure */
131 typedef struct {
132         oal_mesh_vendor_info_t vendor_info;
133         uint16_t num_elements;
134         uint16_t primary_unicast;
135         oal_uuid_t uuid;
136         union {
137                 uint8_t u8[8];
138                 uint64_t u64;
139         } token;
140 } oal_mesh_node_t;
141
142 typedef struct {
143         oal_status_t status;
144 } event_mesh_network_proxy_added_t;
145
146 typedef struct {
147         oal_status_t status;
148         uint8_t token[8];
149         oal_uuid_t uuid;
150 } event_mesh_network_attached_t;
151
152 typedef struct {
153         oal_status_t status;
154         uint8_t token[8];
155         oal_uuid_t uuid;
156 } event_mesh_network_destroyed_t;
157
158 typedef struct {
159         oal_status_t status;
160         oal_uuid_t net_uuid;
161         oal_mesh_scan_result_t result;
162 } event_mesh_scan_result_t;
163
164 typedef struct {
165         oal_status_t status;
166         oal_uuid_t net_uuid;
167 } event_mesh_scan_status_t;
168
169 typedef struct {
170         oal_status_t status;
171         oal_uuid_t net_uuid;
172         oal_uuid_t dev_uuid;
173 } event_mesh_provisioning_status_t;
174
175 typedef struct {
176         oal_uuid_t net_uuid;
177         uint8_t count;
178 } event_mesh_provisioning_data_requested_t;
179
180 typedef struct {
181         oal_uuid_t net_uuid;
182         oal_mesh_variant_authentication_e auth_type;
183         /* MAX length of Auth value is 50 */
184         char auth_value[50 + 1];
185 } event_mesh_authentication_requested_t;
186
187 typedef struct {
188         oal_status_t status;
189         int reason;
190         oal_uuid_t net_uuid;
191         oal_uuid_t dev_uuid;
192         uint16_t unicast;
193         uint8_t count;
194 } event_mesh_provisioning_finished_t;
195
196 typedef struct {
197         oal_status_t status;
198         oal_uuid_t net_uuid;
199         oal_mesh_key_op_e op;
200         uint16_t key_idx;
201 } event_mesh_netkey_operation_t;
202
203 typedef struct {
204         oal_status_t status;
205         oal_uuid_t net_uuid;
206         oal_mesh_key_op_e op;
207         uint16_t net_idx;
208         uint16_t app_idx;
209 } event_mesh_appkey_operation_t;
210
211 typedef struct {
212         oal_uuid_t net_uuid;
213         /* Source means the node which sent the DevKey Message*/
214         uint16_t source;
215         bool remote;
216         uint16_t subnet;
217         uint16_t data_len;
218         uint8_t data[OAL_MESH_DEVKEY_MSG_BUF_MAX];
219 } event_mesh_devkey_message_t;
220
221 typedef struct {
222         oal_uuid_t net_uuid;
223         uint16_t source; /* address of remote element which sent msg */
224         uint16_t dest; /* address of local element which received msg*/
225         uint16_t key_idx;
226         uint16_t data_len;
227         uint8_t data[OAL_MESH_MSG_BUF_MAX];
228 } event_mesh_message_t;
229
230
231 /**
232  * @brief Enables Bluetooth Mesh Stack
233  *
234  * @remarks  Application will be able to BLE Mesh features.
235  * @remarks  Initializes Bluetooth Mesh HAL interface.
236  *
237  */
238 oal_status_t mesh_enable(void);
239
240 /**
241  * @brief Disables Bluetooth Mesh Stack
242  *
243  * @remarks  De-Initializes Bluetooth Mesh HAL interface.
244  * @remarks  Application will not be able to BLE Mesh features.
245  *
246  * @pre OAL API should be enabled with mesh_enable().
247  *
248  * @see  mesh_enable()
249  */
250 oal_status_t mesh_disable(void);
251
252 /**
253  * @brief Register the BLE Mesh Node
254  *
255  * @remarks  Application will register the Mesh Provisioner node
256  * or Device node
257  *
258  * @pre OAl API should be enabled with mesh_enable().
259  *
260  * @see  mesh_enable()
261  */
262 oal_status_t mesh_register_node(oal_mesh_node_t *node,
263                 GSList *model_list, bool is_provisioner);
264
265
266 /**
267  * @brief Destroy or leave Network
268  *
269  * @remarks Stack will remove the local node entry
270  *
271  * @pre OAl API should be enabled with mesh_enable().
272  *
273  * @see  mesh_enable()
274  * @see  mesh_register_node()
275  */
276 oal_status_t mesh_network_destroy(oal_uuid_t* network_uuid);
277
278 /**
279  * @brief Request Stack to release Network resources
280  *
281  * @remarks Stack will remove only yhe DBUS resources of local node
282  *
283  * @pre OAl API should be enabled with mesh_enable().
284  *
285  * @see  mesh_enable()
286  * @see  mesh_register_node()
287  */
288 oal_status_t mesh_network_release(oal_uuid_t* network_uuid);
289
290 /**
291  * @brief Delete Remote Node configuration
292  *
293  * @remarks Stack will remove the Remote node entry
294  *
295  * @pre OAl API should be enabled with mesh_enable().
296  *
297  * @see  mesh_enable()
298  */
299 oal_status_t mesh_delete_remote_node(oal_uuid_t* network_uuid,
300                 uint16_t unicast, uint16_t num_elements);
301
302 /**
303  * @brief UnRegister the BLE Mesh Node
304  *
305  * @remarks  Application will unregister the Mesh Provisioner
306  * node or Device node
307  *
308  * @pre OAl API should be enabled with mesh_enable().
309  *
310  * @see  mesh_enable()
311  * @see  mesh_register_node()
312  */
313 oal_status_t mesh_deregister_node(oal_mesh_node_t *node);
314
315 /**
316  * @brief Local Network Subnet Operations by Mesh Provisioner Node
317  *
318  * @remarks  Application can Create/Delete/Update subnets in
319  * local key database
320  *
321  * @pre OAl API should be enabled with mesh_enable().
322  *
323  * @see  mesh_enable()
324  * @see  mesh_network_subnet_execute()
325  */
326 oal_status_t mesh_network_subnet_execute(oal_uuid_t* network_uuid,
327                 oal_mesh_key_op_e operation, uint16_t net_index);
328
329 /**
330  * @brief Local Network Appkey Operations by Mesh Provisioner Node
331  *
332  * @remarks  Application can Create/Delete/Update Appkeys, bound to
333  * netkeys in local key database
334  *
335  * @pre OAl API should be enabled with mesh_enable().
336  *
337  * @see  mesh_enable()
338  * @see  mesh_network_subnet_execute()
339  * @see  mesh_network_subnet_execute()
340  */
341 oal_status_t mesh_network_appkey_execute(oal_uuid_t* network_uuid,
342                 oal_mesh_key_op_e operation,
343                         uint16_t net_index, uint16_t app_index);
344
345 /**
346  * @brief Discover unprovisioned device
347  *
348  * @remarks  Provisioner application can discover Unprovisioned Device
349  * beaons which want to Join Mesh network
350  * @remarks  scan params structure is defined for forward compatibility.
351  * Currently only single parameter (seconds) is supported
352  *
353  * @pre OAl API should be enabled with mesh_enable().
354  *
355  * @see  mesh_enable()
356  * @see  mesh_network_start_scan()
357  */
358 oal_status_t mesh_network_start_scan(oal_uuid_t* network_uuid,
359                 oal_mesh_scan_params_t *params);
360
361 /**
362  * @brief Cancel unprovisionined Device scanning
363  *
364  * @see  mesh_enable()
365  * @see  mesh_network_start_scan()
366  */
367 oal_status_t mesh_network_scan_cancel(oal_uuid_t* network_uuid);
368
369 /**
370  * @brief Set Provisioning capabilities
371  *
372  * @remarks  Provisioner application should set the capabilities
373  * before initiating device provision. Provisioning parameters are
374  * chosen based on combination of provisioner & device's capabilities
375  *
376  * @pre OAl API should be enabled with mesh_enable().
377  *
378  * @see  mesh_enable()
379  */
380 oal_status_t mesh_network_set_provisioning_capabilities(
381                 oal_uuid_t *network_uuid, oal_mesh_capabilities_t *caps);
382
383 /**
384  * @brief Security provision a device to Mesh Network
385  *
386  * @remarks  Provisioner application can provision device after
387  * scanning for device beacons.
388  * @remarks  Provisioner application should set the Provisioning
389  * capabilities before starting provision.
390  *
391  * @pre OAl API should be enabled with mesh_enable().
392  *
393  * @see  mesh_enable()
394  * @see  mesh_network_set_provisioning_capabilities()
395  * @see  mesh_network_provision_device()
396  */
397 oal_status_t mesh_network_provision_device(oal_uuid_t* network_uuid,
398                 oal_uuid_t *dev_uuid);
399
400
401 /**
402  * @brief Send data for provisioning like NetKey, Primary unicast
403  *
404  * @see  mesh_enable()
405  */
406 oal_status_t mesh_network_send_provisioning_data(oal_uuid_t* network_uuid,
407                 uint16_t netkey_idx, uint16_t unicast);
408
409 /**
410  * @brief Send Reply to Ongoing Security Provisioning
411  *
412  * @remarks  Tizen supports only one Provisioning or Join
413  * Call simulatneously.
414  *
415  * @pre OAl API should be enabled with mesh_enable().
416  *
417  * @see  mesh_enable()
418  * @see  mesh_network_provision_device()
419  * @see  cb_mesh_authentication_request()
420  */
421 oal_status_t mesh_authentication_reply(oal_mesh_variant_authentication_e type,
422                 const char* auth_value);
423
424 /**
425  * @brief Cancels an ongoing security provisioning
426  *
427  * @remarks  Mesh stack does not support Cancelling Ongoing
428  * provisiong currently.
429  *
430  * @pre OAl API should be enabled with mesh_enable().
431  *
432  * @see  mesh_enable()
433  * @see  mesh_network_provision_device()
434  */
435 oal_status_t mesh_provisioning_cancel(oal_uuid_t *local_device_uuid);
436
437 /**
438  * @brief Sends Configuration Client message originated from Local Node
439  *
440  * @remarks Local Configuration client can send message to both local
441  * & remote Configuration Server.
442  *
443  * @pre OAl API should be enabled with mesh_enable().
444  *
445  * @see  mesh_enable()
446  * @see  cb_mesh_conf_message()
447  */
448 oal_status_t mesh_conf_send_message(oal_uuid_t *network_uuid,
449                 uint16_t dest, bool is_devkey_remote,
450                         uint16_t netkey_idx, uint8_t *buf, int len);
451
452 /**
453  * @brief Sends Configuration Client Key (NetKey & AppKey Add/Update)
454  * messages originated from Local Node
455  *
456  * @remarks Local Configuration client can send message to both
457   * local & remote Configuration Server.
458  *
459  * @pre OAl API should be enabled with mesh_enable().
460  *
461  * @see  mesh_enable()
462  * @see  cb_mesh_conf_message()
463  */
464 oal_status_t mesh_conf_send_key_message(oal_uuid_t *network_uuid,
465                 uint16_t dest, bool is_netkey,
466                         bool is_update, int key_idx, int netkey_idx);
467
468
469 /**
470  * @brief Sends Application message to be encrypted with appplication key
471  *
472  * @remarks These messages are generated by Models, which are
473  * implemented by Tizen Application.
474  * @remarks Tizen Mesh Framework will not handle these mesages directly
475  * and only transport these to and from application.
476  *
477  * @pre OAl API should be enabled with mesh_enable().
478  *
479  * @see  mesh_enable()
480  * @see cb_mesh_model_message()
481  */
482 oal_status_t mesh_model_send_message(oal_uuid_t *network_uuid,
483                 uint16_t dest, uint16_t appkey_idx, uint8_t *buf, int len);
484
485 #endif /* OAL_MESH_H_ */