diff options
| -rw-r--r-- | tools/pskey.c | 163 | 
1 files changed, 125 insertions, 38 deletions
| diff --git a/tools/pskey.c b/tools/pskey.c index bf044dd3..b1f6a319 100644 --- a/tools/pskey.c +++ b/tools/pskey.c @@ -48,8 +48,107 @@  #define CSR_TYPE_UINT16	3  #define CSR_TYPE_UINT32	4 +enum { +	NONE = 0, +	LIST, +	READ, +}; +  static int transient = 0; +static int cmd_list(int dd, int argc, char *argv[]) +{ +	uint8_t array[8]; +	uint16_t length, seqnum = 0x0000, pskey = 0x0000; +	int err; + +	while (1) { +		memset(array, 0, sizeof(array)); +		array[0] = pskey & 0xff; +		array[1] = pskey >> 8; + +		err = csr_read_varid_complex(dd, seqnum++, +				CSR_VARID_PS_NEXT, array, sizeof(array)); +		if (err < 0) +			break; + +		pskey = array[4] + (array[5] << 8); +		if (pskey == 0x0000) +			break; + +		memset(array, 0, sizeof(array)); +		array[0] = pskey & 0xff; +		array[1] = pskey >> 8; + +		err = csr_read_varid_complex(dd, seqnum++, +				CSR_VARID_PS_SIZE, array, sizeof(array)); +		if (err < 0) +			continue; + +		length = array[2] + (array[3] << 8); + +		printf("0x%04x - %s (%d bytes)\n", pskey, +					csr_pskeytostr(pskey), length * 2); +	} + +	return 0; +} + +static int cmd_read(int dd, int argc, char *argv[]) +{ +	uint8_t array[256]; +	uint16_t length, seqnum = 0x0000, pskey = 0x0000; +	char *str, val[7]; +	int i, err; + +	while (1) { +		memset(array, 0, sizeof(array)); +		array[0] = pskey & 0xff; +		array[1] = pskey >> 8; + +		err = csr_read_varid_complex(dd, seqnum++, +				CSR_VARID_PS_NEXT, array, 8); +		if (err < 0) +			break; + +		pskey = array[4] + (array[5] << 8); +		if (pskey == 0x0000) +			break; + +		memset(array, 0, sizeof(array)); +		array[0] = pskey & 0xff; +		array[1] = pskey >> 8; + +		err = csr_read_varid_complex(dd, seqnum++, +				CSR_VARID_PS_SIZE, array, 8); +		if (err < 0) +			continue; + +		length = array[2] + (array[3] << 8); +		if (length > sizeof(array) / 2) +			continue; + +		err = csr_read_pskey_complex(dd, seqnum++, pskey, +						0x0000, array, length * 2); +		if (err < 0) +			continue; + +		str = csr_pskeytoval(pskey); +		if (!strcasecmp(str, "UNKNOWN")) { +			sprintf(val, "0x%04x", pskey); +			str = NULL; +		} + +		printf("// %s%s\n&%04x =", str ? "PSKEY_" : "",  +						str ? str : val, pskey); +		for (i = 0; i < length; i++) +			printf(" %02x%02x", array[i * 2 + 1], array[i * 2]); +		printf("\n"); +	} + +	return 0; +} +  static int pskey_size(uint16_t pskey)  {  	switch (pskey) { @@ -215,7 +314,8 @@ static void usage(void)  	printf("pskey - Utility for changing CSR persistent storage\n\n");  	printf("Usage:\n"  		"\tpskey [-i <dev>] [-r] [-t] <key> [value]\n" -		"\tpskey [-i <dev>] --list\n\n"); +		"\tpskey [-i <dev>] --list\n" +		"\tpskey [-i <dev>] --read\n\n");  	printf("Keys:\n\t");  	for (i = 0; storage[i].pskey; i++) { @@ -233,7 +333,8 @@ static struct option main_options[] = {  	{ "device",	1, 0, 'i' },  	{ "reset",	0, 0, 'r' },  	{ "transient",	0, 0, 't' }, -	{ "list",	0, 0, 'l' }, +	{ "list",	0, 0, 'L' }, +	{ "read",	0, 0, 'R' },  	{ "help",	0, 0, 'h' },  	{ 0, 0, 0, 0 }  }; @@ -242,9 +343,9 @@ int main(int argc, char *argv[])  {  	struct hci_dev_info di;  	struct hci_version ver; -	int i, err, dd, opt, dev = 0, list = 0, reset = 0; +	int i, err, dd, opt, dev = 0, reset = 0, mode = NONE; -	while ((opt=getopt_long(argc, argv, "+i:rtlh", main_options, NULL)) != -1) { +	while ((opt=getopt_long(argc, argv, "+i:rtLRh", main_options, NULL)) != -1) {  		switch (opt) {  		case 'i':  			dev = hci_devid(optarg); @@ -262,8 +363,12 @@ int main(int argc, char *argv[])  			transient = 1;  			break; -		case 'l': -			list = 1; +		case 'L': +			mode = LIST; +			break; + +		case 'R': +			mode = READ;  			break;  		case 'h': @@ -277,7 +382,7 @@ int main(int argc, char *argv[])  	argv += optind;  	optind = 0; -	if (!list && argc < 1) { +	if (mode == NONE && argc < 1) {  		usage();  		exit(1);  	} @@ -309,42 +414,24 @@ int main(int argc, char *argv[])  		exit(1);  	} -	if (list) { -		uint8_t array[8]; -		uint16_t length, seqnum = 0x0000, pskey = 0x0000; -		int err; - -		while (1) { -			memset(array, 0, sizeof(array)); -			array[0] = pskey & 0xff; -			array[1] = pskey >> 8; - -			err = csr_read_varid_complex(dd, seqnum++, -					CSR_VARID_PS_NEXT, array, sizeof(array)); -			if (err < 0) -				break; - -			pskey = array[4] + (array[5] << 8); -			if (pskey == 0x0000) -				break; - -			memset(array, 0, sizeof(array)); -			array[0] = pskey & 0xff; -			array[1] = pskey >> 8; - -			err = csr_read_varid_complex(dd, seqnum++, -					CSR_VARID_PS_SIZE, array, sizeof(array)); -			if (err < 0) -				continue; +	if (mode > 0) { +		switch (mode) { +		case LIST: +			err = cmd_list(dd, argc, argv); +			break; -			length = array[2] + (array[3] << 8); +		case READ: +			err = cmd_read(dd, argc, argv); +			break; -			printf("0x%04x - %s (%d bytes)\n", pskey, -					csr_pskeytostr(pskey), length * 2); +		default: +			usage(); +			err = -1; +			break;  		}  		hci_close_dev(dd); -		exit(0); +		exit(err < 0 ? 1 : 0);  	}  	for (i = 0; storage[i].pskey; i++) { | 
