static int cmd_get_comp()

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;
}