From 4652763c85dd48bc0607caba75f94e79aab78841 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 29 Sep 2008 02:50:06 +0200 Subject: Improve reading of local and remote extended features --- tools/hciconfig.c | 8 +++++--- tools/hcitool.c | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 19 deletions(-) (limited to 'tools') diff --git a/tools/hciconfig.c b/tools/hciconfig.c index 2055b2bb..25dda601 100644 --- a/tools/hciconfig.c +++ b/tools/hciconfig.c @@ -358,7 +358,7 @@ static void cmd_scomtu(int ctl, int hdev, char *opt) static void cmd_features(int ctl, int hdev, char *opt) { - uint8_t max_page, features[8]; + uint8_t features[8], max_page = 0; char *tmp; int i, dd; @@ -382,17 +382,19 @@ static void cmd_features(int ctl, int hdev, char *opt) } print_dev_hdr(&di); - tmp = lmp_featurestostr(di.features, "\t\t", 63); printf("\tFeatures%s: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", (max_page > 0) ? " page 0" : "", features[0], features[1], features[2], features[3], features[4], features[5], features[6], features[7]); + + tmp = lmp_featurestostr(di.features, "\t\t", 63); printf("%s\n", tmp); bt_free(tmp); for (i = 1; i <= max_page; i++) { - if (hci_read_local_ext_features(dd, 1, &max_page, features, 1000) < 0) + if (hci_read_local_ext_features(dd, i, NULL, + features, 1000) < 0) continue; printf("\tFeatures page %d: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " diff --git a/tools/hcitool.c b/tools/hcitool.c index 896328c6..1b9663eb 100644 --- a/tools/hcitool.c +++ b/tools/hcitool.c @@ -823,12 +823,12 @@ static void cmd_info(int dev_id, int argc, char **argv) { bdaddr_t bdaddr; uint16_t handle; - uint8_t max_page, features[8]; - char name[249], oui[9], *comp; + uint8_t features[8], max_page = 0; + char name[249], oui[9], *comp, *tmp; struct hci_version version; struct hci_dev_info di; struct hci_conn_info_req *cr; - int opt, dd, cc = 0; + int i, opt, dd, cc = 0; for_each_opt(opt, info_options, NULL) { switch (opt) { @@ -917,20 +917,32 @@ static void cmd_info(int dev_id, int argc, char **argv) bt_free(ver); } - if (hci_read_remote_features(dd, handle, features, 20000) == 0) { - char *tmp = lmp_featurestostr(features, "\t\t", 63); - printf("\tFeatures: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n%s\n", - features[0], features[1], features[2], features[3], - features[4], features[5], features[6], features[7], tmp); - bt_free(tmp); - } + memset(features, 0, sizeof(features)); + hci_read_remote_features(dd, handle, features, 20000); + + if ((di.features[7] & LMP_EXT_FEAT) && (features[7] & LMP_EXT_FEAT)) + hci_read_remote_ext_features(dd, handle, 0, &max_page, + features, 20000); + + printf("\tFeatures%s: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " + "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", + (max_page > 0) ? " page 0" : "", + features[0], features[1], features[2], features[3], + features[4], features[5], features[6], features[7]); - if ((di.features[7] & LMP_EXT_FEAT) && (features[7] & LMP_EXT_FEAT)) { - if (hci_read_remote_ext_features(dd, handle, 0, - &max_page, features, 20000) == 0) - if (max_page > 0) - printf("\tExtended features: %d page%s\n", - max_page, max_page > 1 ? "s" : ""); + tmp = lmp_featurestostr(features, "\t\t", 63); + printf("%s\n", tmp); + bt_free(tmp); + + for (i = 1; i <= max_page; i++) { + if (hci_read_remote_ext_features(dd, handle, i, NULL, + features, 20000) < 0) + continue; + + printf("\tFeatures page %d: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " + "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", i, + features[0], features[1], features[2], features[3], + features[4], features[5], features[6], features[7]); } if (cc) { -- cgit