in nimble/host/mesh/src/shell.c [997:1073]
static int cmd_get_comp(int argc, char *argv[])
{
struct os_mbuf *buf = NET_BUF_SIMPLE(BT_MESH_RX_SDU_MAX);
struct bt_mesh_comp_p0_elem elem;
struct bt_mesh_comp_p0 comp;
uint8_t page = 0x00;
int err = 0;
if (argc > 1) {
page = strtol(argv[1], NULL, 0);
}
net_buf_simple_init(buf, 0);
err = bt_mesh_cfg_comp_data_get(net.net_idx, net.dst, page, &page,
buf);
if (err) {
printk("Getting composition failed (err %d)\n", err);
goto done;
}
if (page != 0x00) {
printk("Got page 0x%02x. No parser available.",
page);
goto done;
}
err = bt_mesh_comp_p0_get(&comp, buf);
if (err) {
printk("Getting composition failed (err %d)\n", err);
goto done;
}
printk("Got Composition Data for 0x%04x:", net.dst);
printk("\tCID 0x%04x", comp.cid);
printk("\tPID 0x%04x", comp.pid);
printk("\tVID 0x%04x", comp.vid);
printk("\tCRPL 0x%04x", comp.crpl);
printk("\tFeatures 0x%04x", comp.feat);
while (bt_mesh_comp_p0_elem_pull(&comp, &elem)) {
int i;
printk("\tElement @ 0x%04x:", elem.loc);
if (elem.nsig) {
printk("\t\tSIG Models:\n");
} else {
printk("\t\tNo SIG Models\n");
}
for (i = 0; i < elem.nsig; i++) {
uint16_t mod_id = bt_mesh_comp_p0_elem_mod(&elem, i);
printk("\t\t\t0x%04x\n", mod_id);
}
if (elem.nvnd) {
printk("\t\tVendor Models:\n");
} else {
printk("\t\tNo Vendor Models\n");
}
for (i = 0; i < elem.nvnd; i++) {
struct bt_mesh_mod_id_vnd mod =
bt_mesh_comp_p0_elem_mod_vnd(&elem, i);
printk("\t\t\tCompany 0x%04x: 0x%04x",
mod.company, mod.id);
}
}
if (buf->om_len) {
printk("\t\t...truncated data!");
}
done:
os_mbuf_free_chain(buf);
return err;
}