in nimble/host/mesh/src/cfg_cli.c [551:623]
static int mod_pub_status(struct bt_mesh_model *model,
struct bt_mesh_msg_ctx *ctx,
struct os_mbuf*buf)
{
uint16_t mod_id, cid, elem_addr;
struct mod_pub_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 != 12U) && (buf->om_len != 14U)) {
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_PUB_STATUS, ctx->addr,
(void **)¶m)) {
BT_WARN("Unexpected Model Pub Status message");
return -ENOENT;
}
if (param->cid != CID_NVAL) {
if (buf->om_len < 14) {
BT_WARN("Unexpected Mod Pub Status with SIG Model");
return -ENOENT;
}
cid = sys_get_le16(&buf->om_data[10]);
mod_id = sys_get_le16(&buf->om_data[12]);
} else {
if (buf->om_len > 12) {
BT_WARN("Unexpected Mod Pub Status with Vendor Model");
return -ENOENT;
}
cid = CID_NVAL;
mod_id = sys_get_le16(&buf->om_data[10]);
}
if (mod_id != param->mod_id || cid != param->cid) {
BT_WARN("Mod Pub Model ID or Company ID mismatch");
return -ENOENT;
}
status = net_buf_simple_pull_u8(buf);
elem_addr = net_buf_simple_pull_le16(buf);
if (elem_addr != param->elem_addr) {
BT_WARN("Model Pub Status for unexpected element (0x%04x)",
elem_addr);
return -ENOENT;
}
if (param->status) {
*param->status = status;
}
if (param->pub) {
param->pub->addr = net_buf_simple_pull_le16(buf);
param->pub->app_idx = net_buf_simple_pull_le16(buf);
param->pub->cred_flag = (param->pub->app_idx & BIT(12));
param->pub->app_idx &= BIT_MASK(12);
param->pub->ttl = net_buf_simple_pull_u8(buf);
param->pub->period = net_buf_simple_pull_u8(buf);
param->pub->transmit = net_buf_simple_pull_u8(buf);
}
bt_mesh_msg_ack_ctx_rx(&cli->ack_ctx);
return 0;
}