2017-06-16 12:30:54 +03:00
|
|
|
/* Bluetooth Mesh */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 2017 Intel Corporation
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <zephyr.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include <net/buf.h>
|
|
|
|
#include <bluetooth/bluetooth.h>
|
|
|
|
#include <bluetooth/conn.h>
|
2018-08-16 13:51:24 +03:00
|
|
|
#include <bluetooth/uuid.h>
|
2017-06-16 12:30:54 +03:00
|
|
|
#include <bluetooth/mesh.h>
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_MESH_DEBUG)
|
2018-07-17 10:35:52 +03:00
|
|
|
#define LOG_MODULE_NAME bt_mesh_main
|
2017-06-16 12:30:54 +03:00
|
|
|
#include "common/log.h"
|
|
|
|
|
|
|
|
#include "test.h"
|
|
|
|
#include "adv.h"
|
|
|
|
#include "prov.h"
|
|
|
|
#include "net.h"
|
|
|
|
#include "beacon.h"
|
|
|
|
#include "lpn.h"
|
|
|
|
#include "friend.h"
|
|
|
|
#include "transport.h"
|
|
|
|
#include "access.h"
|
|
|
|
#include "foundation.h"
|
|
|
|
#include "proxy.h"
|
2018-05-07 12:23:37 +03:00
|
|
|
#include "settings.h"
|
2017-06-16 12:30:54 +03:00
|
|
|
#include "mesh.h"
|
|
|
|
|
|
|
|
int bt_mesh_provision(const u8_t net_key[16], u16_t net_idx,
|
2018-05-11 11:16:47 +03:00
|
|
|
u8_t flags, u32_t iv_index, u16_t addr,
|
|
|
|
const u8_t dev_key[16])
|
2017-06-16 12:30:54 +03:00
|
|
|
{
|
|
|
|
int err;
|
|
|
|
|
|
|
|
BT_INFO("Primary Element: 0x%04x", addr);
|
2017-11-05 21:45:24 +02:00
|
|
|
BT_DBG("net_idx 0x%04x flags 0x%02x iv_index 0x%04x",
|
|
|
|
net_idx, flags, iv_index);
|
2017-06-16 12:30:54 +03:00
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT)) {
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh_proxy_prov_disable();
|
|
|
|
}
|
|
|
|
|
|
|
|
err = bt_mesh_net_create(net_idx, flags, net_key, iv_index);
|
|
|
|
if (err) {
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT)) {
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh_proxy_prov_enable();
|
|
|
|
}
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2018-05-11 11:16:47 +03:00
|
|
|
bt_mesh.seq = 0;
|
2017-06-16 12:30:54 +03:00
|
|
|
|
|
|
|
bt_mesh_comp_provision(addr);
|
|
|
|
|
|
|
|
memcpy(bt_mesh.dev_key, dev_key, 16);
|
|
|
|
|
2018-05-07 12:23:37 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
|
|
|
|
BT_DBG("Storing network information persistently");
|
2018-05-08 23:34:56 +03:00
|
|
|
bt_mesh_store_net();
|
2018-05-07 12:23:37 +03:00
|
|
|
bt_mesh_store_subnet(&bt_mesh.sub[0]);
|
2018-05-15 14:35:07 +03:00
|
|
|
bt_mesh_store_iv(false);
|
2018-05-07 12:23:37 +03:00
|
|
|
}
|
|
|
|
|
2018-05-07 15:04:21 +03:00
|
|
|
bt_mesh_net_start();
|
2017-11-14 18:45:32 +02:00
|
|
|
|
2017-06-16 12:30:54 +03:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void bt_mesh_reset(void)
|
|
|
|
{
|
2018-05-07 14:14:02 +03:00
|
|
|
if (!bt_mesh.valid) {
|
2017-11-13 20:52:26 +02:00
|
|
|
return;
|
2017-06-16 12:30:54 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bt_mesh.iv_index = 0;
|
|
|
|
bt_mesh.seq = 0;
|
|
|
|
bt_mesh.iv_update = 0;
|
2017-11-20 14:51:32 +02:00
|
|
|
bt_mesh.pending_update = 0;
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh.valid = 0;
|
2018-05-15 14:35:07 +03:00
|
|
|
bt_mesh.ivu_duration = 0;
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh.ivu_initiator = 0;
|
|
|
|
|
2018-05-15 14:35:07 +03:00
|
|
|
k_delayed_work_cancel(&bt_mesh.ivu_timer);
|
2017-06-16 12:30:54 +03:00
|
|
|
|
2017-11-20 14:51:32 +02:00
|
|
|
bt_mesh_cfg_reset();
|
|
|
|
|
|
|
|
bt_mesh_rx_reset();
|
|
|
|
bt_mesh_tx_reset();
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_LOW_POWER)) {
|
2017-11-17 13:06:09 +02:00
|
|
|
bt_mesh_lpn_disable(true);
|
2017-06-16 12:30:54 +03:00
|
|
|
}
|
|
|
|
|
2017-11-27 21:02:38 +02:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_FRIEND)) {
|
|
|
|
bt_mesh_friend_clear_net_idx(BT_MESH_KEY_ANY);
|
|
|
|
}
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_GATT_PROXY)) {
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh_proxy_gatt_disable();
|
|
|
|
}
|
|
|
|
|
2018-05-08 09:21:57 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
|
|
|
|
bt_mesh_clear_net();
|
|
|
|
}
|
|
|
|
|
2018-09-11 19:09:03 -07:00
|
|
|
(void)memset(bt_mesh.dev_key, 0, sizeof(bt_mesh.dev_key));
|
2017-06-16 12:30:54 +03:00
|
|
|
|
2017-11-13 20:52:26 +02:00
|
|
|
bt_mesh_scan_disable();
|
|
|
|
bt_mesh_beacon_disable();
|
|
|
|
|
2018-06-26 11:29:24 +03:00
|
|
|
bt_mesh_comp_unprovision();
|
|
|
|
|
2017-11-13 20:52:26 +02:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PROV)) {
|
|
|
|
bt_mesh_prov_reset();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool bt_mesh_is_provisioned(void)
|
|
|
|
{
|
2018-05-07 14:14:02 +03:00
|
|
|
return bt_mesh.valid;
|
2017-11-13 20:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers)
|
|
|
|
{
|
|
|
|
if (bt_mesh_is_provisioned()) {
|
|
|
|
return -EALREADY;
|
|
|
|
}
|
|
|
|
|
2018-08-16 13:51:24 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_DEBUG)) {
|
|
|
|
const struct bt_mesh_prov *prov = bt_mesh_prov_get();
|
|
|
|
struct bt_uuid_128 uuid = { .uuid.type = BT_UUID_TYPE_128 };
|
|
|
|
|
|
|
|
memcpy(uuid.val, prov->uuid, 16);
|
|
|
|
BT_INFO("Device UUID: %s", bt_uuid_str(&uuid.uuid));
|
|
|
|
}
|
|
|
|
|
2017-11-13 20:52:26 +02:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
|
|
|
|
(bearers & BT_MESH_PROV_ADV)) {
|
2017-06-16 12:30:54 +03:00
|
|
|
/* Make sure we're scanning for provisioning inviations */
|
|
|
|
bt_mesh_scan_enable();
|
|
|
|
/* Enable unprovisioned beacon sending */
|
|
|
|
bt_mesh_beacon_enable();
|
|
|
|
}
|
2017-11-13 20:52:26 +02:00
|
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
|
|
|
|
(bearers & BT_MESH_PROV_GATT)) {
|
|
|
|
bt_mesh_proxy_prov_enable();
|
|
|
|
bt_mesh_adv_update();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2017-06-16 12:30:54 +03:00
|
|
|
}
|
|
|
|
|
2017-11-13 20:52:26 +02:00
|
|
|
int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers)
|
2017-06-16 12:30:54 +03:00
|
|
|
{
|
2017-11-13 20:52:26 +02:00
|
|
|
if (bt_mesh_is_provisioned()) {
|
|
|
|
return -EALREADY;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
|
|
|
|
(bearers & BT_MESH_PROV_ADV)) {
|
|
|
|
bt_mesh_beacon_disable();
|
|
|
|
bt_mesh_scan_disable();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
|
|
|
|
(bearers & BT_MESH_PROV_GATT)) {
|
|
|
|
bt_mesh_proxy_prov_disable();
|
|
|
|
bt_mesh_adv_update();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2017-06-16 12:30:54 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
int bt_mesh_init(const struct bt_mesh_prov *prov,
|
|
|
|
const struct bt_mesh_comp *comp)
|
|
|
|
{
|
|
|
|
int err;
|
|
|
|
|
|
|
|
err = bt_mesh_test();
|
|
|
|
if (err) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
err = bt_mesh_comp_register(comp);
|
|
|
|
if (err) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PROV)) {
|
2017-11-02 13:50:29 +01:00
|
|
|
err = bt_mesh_prov_init(prov);
|
|
|
|
if (err) {
|
|
|
|
return err;
|
|
|
|
}
|
2017-06-16 12:30:54 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bt_mesh_net_init();
|
|
|
|
bt_mesh_trans_init();
|
|
|
|
bt_mesh_beacon_init();
|
|
|
|
bt_mesh_adv_init();
|
|
|
|
|
2017-08-09 09:21:11 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_PROXY)) {
|
2017-06-16 12:30:54 +03:00
|
|
|
bt_mesh_proxy_init();
|
|
|
|
}
|
|
|
|
|
2018-05-07 22:22:30 +03:00
|
|
|
if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
|
|
|
|
bt_mesh_settings_init();
|
|
|
|
}
|
|
|
|
|
2017-06-16 12:30:54 +03:00
|
|
|
return 0;
|
|
|
|
}
|