diff options
Diffstat (limited to 'host')
-rw-r--r-- | host/libubertooth/src/ubertooth.c | 21 | ||||
-rw-r--r-- | host/libubertooth/src/ubertooth.h | 1 | ||||
-rw-r--r-- | host/libubertooth/src/ubertooth_control.c | 13 | ||||
-rw-r--r-- | host/libubertooth/src/ubertooth_control.h | 1 | ||||
-rw-r--r-- | host/libubertooth/src/ubertooth_interface.h | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-afh.c | 5 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-btle.c | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-dump.c | 5 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-ego.c | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-follow.c | 5 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-rx.c | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-scan.c | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-specan.c | 4 | ||||
-rw-r--r-- | host/ubertooth-tools/src/ubertooth-util.c | 15 |
14 files changed, 87 insertions, 3 deletions
diff --git a/host/libubertooth/src/ubertooth.c b/host/libubertooth/src/ubertooth.c index 6b9297b..db8ddac 100644 --- a/host/libubertooth/src/ubertooth.c +++ b/host/libubertooth/src/ubertooth.c @@ -609,3 +609,24 @@ ubertooth_t* ubertooth_start(int ubertooth_device) return ut; } + +int ubertooth_check_api(ubertooth_t *ut) { + int r; + + r = cmd_api_version(ut->devh); + if (r < 0) { + fprintf(stderr, "Ubertooth running very old firmware found.\n"); + fprintf(stderr, "Please upgrade to latest released firmware.\n"); + ubertooth_stop(ut); + return -1; + } + else if (r < UBERTOOTH_API_VERSION) { + fprintf(stderr, "Ubertooth API version %d found, libubertooth requires %d.\n", + r, UBERTOOTH_API_VERSION); + fprintf(stderr, "Please upgrade to latest released firmware.\n"); + ubertooth_stop(ut); + return -1; + } + + return 0; +} diff --git a/host/libubertooth/src/ubertooth.h b/host/libubertooth/src/ubertooth.h index cab4de6..c6905fc 100644 --- a/host/libubertooth/src/ubertooth.h +++ b/host/libubertooth/src/ubertooth.h @@ -83,6 +83,7 @@ ubertooth_t* ubertooth_init(); int ubertooth_connect(ubertooth_t* ut, int ubertooth_device); ubertooth_t* ubertooth_start(int ubertooth_device); void ubertooth_stop(ubertooth_t* ut); +int ubertooth_check_api(ubertooth_t *ut); void ubertooth_set_timeout(ubertooth_t* ut, int seconds); int ubertooth_bulk_init(ubertooth_t* ut); diff --git a/host/libubertooth/src/ubertooth_control.c b/host/libubertooth/src/ubertooth_control.c index f849eac..219ceeb 100644 --- a/host/libubertooth/src/ubertooth_control.c +++ b/host/libubertooth/src/ubertooth_control.c @@ -996,6 +996,19 @@ int cmd_hop(struct libusb_device_handle* devh) return 0; } +int32_t cmd_api_version(struct libusb_device_handle* devh) { + unsigned char data[4]; + int r; + + r = libusb_control_transfer(devh, CTRL_IN, UBERTOOTH_GET_API_VERSION, 0, 0, + data, 4, 3000); + if (r < 0) { + show_libusb_error(r); + return r; + } + return data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24; +} + int ubertooth_cmd_sync(struct libusb_device_handle* devh, uint8_t type, uint8_t command, diff --git a/host/libubertooth/src/ubertooth_control.h b/host/libubertooth/src/ubertooth_control.h index 2892f50..9740ecc 100644 --- a/host/libubertooth/src/ubertooth_control.h +++ b/host/libubertooth/src/ubertooth_control.h @@ -145,5 +145,6 @@ int cmd_set_jam_mode(struct libusb_device_handle* devh, int mode); int cmd_ego(struct libusb_device_handle* devh, int mode); int cmd_afh(struct libusb_device_handle* devh); int cmd_hop(struct libusb_device_handle* devh); +int32_t cmd_api_version(struct libusb_device_handle* devh); #endif /* __UBERTOOTH_CONTROL_H__ */ diff --git a/host/libubertooth/src/ubertooth_interface.h b/host/libubertooth/src/ubertooth_interface.h index 5facc22..f30d99d 100644 --- a/host/libubertooth/src/ubertooth_interface.h +++ b/host/libubertooth/src/ubertooth_interface.h @@ -24,6 +24,9 @@ #include <stdint.h> +// increment on every API change +#define UBERTOOTH_API_VERSION 0 + #define DMA_SIZE 50 #define NUM_BREDR_CHANNELS 79 @@ -100,6 +103,7 @@ enum ubertooth_usb_commands { UBERTOOTH_AFH = 61, UBERTOOTH_HOP = 62, UBERTOOTH_TRIM_CLOCK = 63, + UBERTOOTH_GET_API_VERSION = 64, }; enum jam_modes { diff --git a/host/ubertooth-tools/src/ubertooth-afh.c b/host/ubertooth-tools/src/ubertooth-afh.c index fd81d4b..202ea1d 100644 --- a/host/ubertooth-tools/src/ubertooth-afh.c +++ b/host/ubertooth-tools/src/ubertooth-afh.c @@ -57,6 +57,7 @@ int main(int argc, char* argv[]) uint8_t use_r_format = 0; ubertooth_t* ut = NULL; + int r; while ((opt=getopt(argc,argv,"rhVl:u:U:e:a:t:m:")) != EOF) { switch(opt) { @@ -124,6 +125,10 @@ int main(int argc, char* argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Clean up on exit. */ register_cleanup_handler(ut); diff --git a/host/ubertooth-tools/src/ubertooth-btle.c b/host/ubertooth-tools/src/ubertooth-btle.c index fbbc89a..b026130 100644 --- a/host/ubertooth-tools/src/ubertooth-btle.c +++ b/host/ubertooth-tools/src/ubertooth-btle.c @@ -237,6 +237,10 @@ int main(int argc, char *argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Clean up on exit. */ register_cleanup_handler(ut); diff --git a/host/ubertooth-tools/src/ubertooth-dump.c b/host/ubertooth-tools/src/ubertooth-dump.c index feb6850..8fcb8cd 100644 --- a/host/ubertooth-tools/src/ubertooth-dump.c +++ b/host/ubertooth-tools/src/ubertooth-dump.c @@ -53,6 +53,7 @@ int main(int argc, char *argv[]) char ubertooth_device = -1; ubertooth_t* ut = NULL; + int r; while ((opt=getopt(argc,argv,"bhclU:d:")) != EOF) { switch(opt) { @@ -89,6 +90,10 @@ int main(int argc, char *argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Clean up on exit. */ register_cleanup_handler(ut); diff --git a/host/ubertooth-tools/src/ubertooth-ego.c b/host/ubertooth-tools/src/ubertooth-ego.c index fe6704e..0f8c5cc 100644 --- a/host/ubertooth-tools/src/ubertooth-ego.c +++ b/host/ubertooth-tools/src/ubertooth-ego.c @@ -84,6 +84,10 @@ int main(int argc, char *argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Clean up on exit. */ register_cleanup_handler(ut); diff --git a/host/ubertooth-tools/src/ubertooth-follow.c b/host/ubertooth-tools/src/ubertooth-follow.c index 2e7ffb2..d3a4d01 100644 --- a/host/ubertooth-tools/src/ubertooth-follow.c +++ b/host/ubertooth-tools/src/ubertooth-follow.c @@ -225,6 +225,11 @@ int main(int argc, char *argv[]) usage(); return 1; } + + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + cmd_set_bdaddr(ut->devh, btbb_piconet_get_bdaddr(pn)); if(afh_enabled) cmd_set_afh_map(ut->devh, afh_map); diff --git a/host/ubertooth-tools/src/ubertooth-rx.c b/host/ubertooth-tools/src/ubertooth-rx.c index dcd3fb3..ba92ab7 100644 --- a/host/ubertooth-tools/src/ubertooth-rx.c +++ b/host/ubertooth-tools/src/ubertooth-rx.c @@ -149,6 +149,10 @@ int main(int argc, char* argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + r = btbb_init(max_ac_errors); if (r < 0) return r; diff --git a/host/ubertooth-tools/src/ubertooth-scan.c b/host/ubertooth-tools/src/ubertooth-scan.c index 23f6596..502d2ba 100644 --- a/host/ubertooth-tools/src/ubertooth-scan.c +++ b/host/ubertooth-tools/src/ubertooth-scan.c @@ -239,6 +239,10 @@ int main(int argc, char *argv[]) usage(); return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Set sweep mode - otherwise AFH map is useless */ cmd_set_channel(ut->devh, 9999); diff --git a/host/ubertooth-tools/src/ubertooth-specan.c b/host/ubertooth-tools/src/ubertooth-specan.c index d1b3a92..72021d9 100644 --- a/host/ubertooth-tools/src/ubertooth-specan.c +++ b/host/ubertooth-tools/src/ubertooth-specan.c @@ -147,6 +147,10 @@ int main(int argc, char *argv[]) return 1; } + r = ubertooth_check_api(ut); + if (r < 0) + return 1; + /* Clean up on exit. */ register_cleanup_handler(ut); diff --git a/host/ubertooth-tools/src/ubertooth-util.c b/host/ubertooth-tools/src/ubertooth-util.c index 21f5349..0e8adc0 100644 --- a/host/ubertooth-tools/src/ubertooth-util.c +++ b/host/ubertooth-tools/src/ubertooth-util.c @@ -71,7 +71,7 @@ int main(int argc, char *argv[]) int do_range_test, do_repeater, do_firmware, do_board_id; int do_range_result, do_all_leds, do_identify; int do_set_squelch, do_get_squelch, squelch_level; - int do_something, do_compile_info; + int do_something, do_compile_info, do_api_check; char ubertooth_device = -1; /* set command states to negative as a starter @@ -82,9 +82,9 @@ int main(int argc, char *argv[]) do_range_test= do_repeater= do_firmware= do_board_id= -1; do_range_result= do_all_leds= do_identify= -1; do_set_squelch= -1, do_get_squelch= -1; squelch_level= 0; - do_something= 0; do_compile_info= -1; + do_something= 0; do_compile_info= -1, do_api_check = 0; - while ((opt=getopt(argc,argv,"U:hnmefiIprsStvbl::a::C::c::d::q::z::9V")) != EOF) { + while ((opt=getopt(argc,argv,"U:hnmefiIprsStvbl::a::C::c::d::q::z::9VA")) != EOF) { switch(opt) { case 'U': ubertooth_device = atoi(optarg); @@ -180,6 +180,9 @@ int main(int argc, char *argv[]) case 'V': do_compile_info = 0; break; + case 'A': + do_api_check = 1; + break; case 'h': default: usage(); @@ -320,6 +323,12 @@ int main(int argc, char *argv[]) r = cmd_get_squelch(ut->devh); printf("Squelch set to %d\n", (int8_t)r); } + if (do_api_check) { + r = ubertooth_check_api(ut); + if (r == 0) { + printf("Ubertooth is running latest API (%d)\n", UBERTOOTH_API_VERSION); + } + } if(do_something) { unsigned char buf[4] = { 0x55, 0x55, 0x55, 0x55 }; cmd_do_something(ut->devh, NULL, 0); |