in nimble/host/mesh/src/cfg_cli.c [634:686]
static int mod_sub_status(struct bt_mesh_model *model,
struct bt_mesh_msg_ctx *ctx,
struct os_mbuf*buf)
{
uint16_t elem_addr, sub_addr, mod_id, cid;
struct mod_sub_param *param;
uint8_t status;
BT_DBG("net_idx 0x%04x app_idx 0x%04x src 0x%04x len %u: %s",
ctx->net_idx, ctx->app_idx, ctx->addr, buf->om_len,
bt_hex(buf->om_data, buf->om_len));
if ((buf->om_len != 7U) && (buf->om_len != 9U)) {
BT_ERR("The message size for the application opcode is incorrect.");
return -EINVAL;
}
if (!bt_mesh_msg_ack_ctx_match(&cli->ack_ctx, OP_MOD_SUB_STATUS, ctx->addr,
(void **)¶m)) {
return -ENOENT;
}
status = net_buf_simple_pull_u8(buf);
elem_addr = net_buf_simple_pull_le16(buf);
sub_addr = net_buf_simple_pull_le16(buf);
if (buf->om_len >= 4) {
cid = net_buf_simple_pull_le16(buf);
} else {
cid = CID_NVAL;
}
mod_id = net_buf_simple_pull_le16(buf);
if (param->elem_addr != elem_addr || param->mod_id != mod_id ||
(param->expect_sub && *param->expect_sub != sub_addr) ||
param->cid != cid) {
BT_WARN("Model Subscription Status parameters did not match");
return -ENOENT;
}
if (param->sub_addr) {
*param->sub_addr = sub_addr;
}
if (param->status) {
*param->status = status;
}
bt_mesh_msg_ack_ctx_rx(&cli->ack_ctx);
return 0;
}