diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-09-29 02:50:06 +0200 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-09-29 02:50:06 +0200 | 
| commit | 4652763c85dd48bc0607caba75f94e79aab78841 (patch) | |
| tree | b3a6c9b9f64a1831b0e32891ff193a857efebbf0 | |
| parent | 8772b6de43b3b2f43f51953911c9ff42925b58bb (diff) | |
Improve reading of local and remote extended features
| -rw-r--r-- | tools/hciconfig.c | 8 | ||||
| -rw-r--r-- | tools/hcitool.c | 44 | 
2 files changed, 33 insertions, 19 deletions
| 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) { | 
