This is initial implementation of Proxy solicitation procedure. This includes: - support for sending and receiving Solicitation PDUs - On-Demand Private Proxy functionality (Server and Client) controlling behaviour of node after receiving Solicitation PDU - Solicitation PDU RPL Configuration (Server and Client), which manages Replay Protection List for Solicitation PDUs. Proxy Solicitation allows to enable advertising of Proxy service on node by sending Solicitation PDUs. These PDUs are not part of Mesh messages; instead, these are non-connectable, undirected advertising PDUs with their own format, containing Proxy Solicitation UUID. Signed-off-by: Krzysztof Kopyściński <krzysztof.kopyscinski@codecoup.pl>
95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/*
|
|
* Copyright (c) 2022 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/bluetooth/mesh.h>
|
|
|
|
#include "access.h"
|
|
#include "cfg.h"
|
|
#include "foundation.h"
|
|
|
|
#define LOG_LEVEL CONFIG_BT_MESH_MODEL_LOG_LEVEL
|
|
#include <zephyr/logging/log.h>
|
|
LOG_MODULE_REGISTER(bt_mesh_od_priv_proxy_srv);
|
|
|
|
static int proxy_status_rsp(struct bt_mesh_model *mod,
|
|
struct bt_mesh_msg_ctx *ctx)
|
|
{
|
|
BT_MESH_MODEL_BUF_DEFINE(buf, OP_OD_PRIV_PROXY_STATUS, 1);
|
|
bt_mesh_model_msg_init(&buf, OP_OD_PRIV_PROXY_STATUS);
|
|
|
|
net_buf_simple_add_u8(&buf, bt_mesh_od_priv_proxy_get());
|
|
|
|
bt_mesh_model_send(mod, ctx, &buf, NULL, NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int handle_proxy_get(struct bt_mesh_model *mod,
|
|
struct bt_mesh_msg_ctx *ctx,
|
|
struct net_buf_simple *buf)
|
|
{
|
|
LOG_DBG("");
|
|
|
|
proxy_status_rsp(mod, ctx);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int handle_proxy_set(struct bt_mesh_model *mod,
|
|
struct bt_mesh_msg_ctx *ctx,
|
|
struct net_buf_simple *buf)
|
|
{
|
|
uint8_t state;
|
|
|
|
LOG_DBG("");
|
|
|
|
state = net_buf_simple_pull_u8(buf);
|
|
LOG_DBG("state %d", state);
|
|
|
|
bt_mesh_od_priv_proxy_set(state);
|
|
proxy_status_rsp(mod, ctx);
|
|
|
|
return 0;
|
|
}
|
|
|
|
const struct bt_mesh_model_op _bt_mesh_od_priv_proxy_srv_op[] = {
|
|
{ OP_OD_PRIV_PROXY_GET, BT_MESH_LEN_EXACT(0), handle_proxy_get },
|
|
{ OP_OD_PRIV_PROXY_SET, BT_MESH_LEN_EXACT(1), handle_proxy_set },
|
|
|
|
BT_MESH_MODEL_OP_END
|
|
};
|
|
|
|
static int od_priv_proxy_srv_init(struct bt_mesh_model *mod)
|
|
{
|
|
struct bt_mesh_model *priv_beacon_srv = bt_mesh_model_find(
|
|
bt_mesh_model_elem(mod), BT_MESH_MODEL_ID_PRIV_BEACON_SRV);
|
|
struct bt_mesh_model *sol_pdu_rpl_srv = bt_mesh_model_find(
|
|
bt_mesh_model_elem(mod), BT_MESH_MODEL_ID_SOL_PDU_RPL_SRV);
|
|
|
|
if (priv_beacon_srv == NULL) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
if (!bt_mesh_model_in_primary(mod)) {
|
|
LOG_ERR("On-Demand Private Proxy server not in primary element");
|
|
return -EINVAL;
|
|
}
|
|
|
|
mod->keys[0] = BT_MESH_KEY_DEV_LOCAL;
|
|
mod->flags |= BT_MESH_MOD_DEVKEY_ONLY;
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_MODEL_EXTENSIONS)) {
|
|
bt_mesh_model_extend(mod, priv_beacon_srv);
|
|
bt_mesh_model_correspond(mod, sol_pdu_rpl_srv);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
const struct bt_mesh_model_cb _bt_mesh_od_priv_proxy_srv_cb = {
|
|
.init = od_priv_proxy_srv_init,
|
|
};
|