From 6df6a611ec5e040a0bfc72f3592de79c5cd3fcf6 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 16 Jun 2018 22:11:28 +0200 Subject: [PATCH] monitor: Add support for providing fallback manufacturer --- monitor/main.c | 8 +++++++- monitor/packet.c | 27 +++++++++++++++++++-------- monitor/packet.h | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/monitor/main.c b/monitor/main.c index c4204f4fd..5fa87ea3f 100644 --- a/monitor/main.c +++ b/monitor/main.c @@ -67,6 +67,7 @@ static void usage(void) "\t-i, --index Show only specified controller\n" "\t-d, --tty Read data from TTY\n" "\t-B, --tty-speed Set TTY speed (default 115200)\n" + "\t-V, --vendor Set default company identifier\n" "\t-t, --time Show time instead of time offset\n" "\t-T, --date Show time and date information\n" "\t-S, --sco Dump SCO traffic\n" @@ -85,6 +86,7 @@ static const struct option main_options[] = { { "index", required_argument, NULL, 'i' }, { "tty", required_argument, NULL, 'd' }, { "tty-speed", required_argument, NULL, 'B' }, + { "vendor", required_argument, NULL, 'V' }, { "time", no_argument, NULL, 't' }, { "date", no_argument, NULL, 'T' }, { "sco", no_argument, NULL, 'S' }, @@ -120,7 +122,7 @@ int main(int argc, char *argv[]) int opt; struct sockaddr_un addr; - opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:tTSAEPvh", + opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:V:tTSAEPvh", main_options, NULL); if (opt < 0) break; @@ -166,6 +168,10 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } break; + case 'V': + str = optarg; + packet_set_fallback_manufacturer(atoi(str)); + break; case 't': filter_mask &= ~PACKET_FILTER_SHOW_TIME_OFFSET; filter_mask |= PACKET_FILTER_SHOW_TIME; diff --git a/monitor/packet.c b/monitor/packet.c index 2cc8762c0..cba740791 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -100,14 +100,15 @@ #define COLOR_PHY_PACKET COLOR_BLUE +#define UNKNOWN_MANUFACTURER 0xffff + static time_t time_offset = ((time_t) -1); static int priority_level = BTSNOOP_PRIORITY_INFO; static unsigned long filter_mask = 0; static bool index_filter = false; static uint16_t index_number = 0; static uint16_t index_current = 0; - -#define UNKNOWN_MANUFACTURER 0xffff +static uint16_t fallback_manufacturer = UNKNOWN_MANUFACTURER; #define CTRL_RAW 0x0000 #define CTRL_USER 0x0001 @@ -276,6 +277,16 @@ struct index_data { static struct index_data index_list[MAX_INDEX]; +void packet_set_fallback_manufacturer(uint16_t manufacturer) +{ + int i; + + for (i = 0; i < MAX_INDEX; i++) + index_list[i].manufacturer = manufacturer; + + fallback_manufacturer = manufacturer; +} + static void print_packet(struct timeval *tv, struct ucred *cred, char ident, uint16_t index, const char *channel, const char *color, const char *label, @@ -3994,7 +4005,7 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, if (index < MAX_INDEX) { index_list[index].type = ni->type; memcpy(index_list[index].bdaddr, ni->bdaddr, 6); - index_list[index].manufacturer = UNKNOWN_MANUFACTURER; + index_list[index].manufacturer = fallback_manufacturer; } addr2str(ni->bdaddr, str); @@ -4058,7 +4069,7 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, if (index < MAX_INDEX) manufacturer = index_list[index].manufacturer; else - manufacturer = UNKNOWN_MANUFACTURER; + manufacturer = fallback_manufacturer; packet_vendor_diag(tv, index, manufacturer, data, size); break; @@ -8370,7 +8381,7 @@ static const char *current_vendor_str(void) if (index_current < MAX_INDEX) manufacturer = index_list[index_current].manufacturer; else - manufacturer = UNKNOWN_MANUFACTURER; + manufacturer = fallback_manufacturer; switch (manufacturer) { case 2: @@ -8389,7 +8400,7 @@ static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf) if (index_current < MAX_INDEX) manufacturer = index_list[index_current].manufacturer; else - manufacturer = UNKNOWN_MANUFACTURER; + manufacturer = fallback_manufacturer; switch (manufacturer) { case 2: @@ -8408,7 +8419,7 @@ static const struct vendor_evt *current_vendor_evt(uint8_t evt) if (index_current < MAX_INDEX) manufacturer = index_list[index_current].manufacturer; else - manufacturer = UNKNOWN_MANUFACTURER; + manufacturer = fallback_manufacturer; switch (manufacturer) { case 2: @@ -9805,7 +9816,7 @@ static void vendor_evt(const void *data, uint8_t size) if (index_current < MAX_INDEX) manufacturer = index_list[index_current].manufacturer; else - manufacturer = UNKNOWN_MANUFACTURER; + manufacturer = fallback_manufacturer; vendor_event(manufacturer, data, size); } diff --git a/monitor/packet.h b/monitor/packet.h index a4fdcc642..79733deec 100644 --- a/monitor/packet.h +++ b/monitor/packet.h @@ -42,6 +42,7 @@ void packet_del_filter(unsigned long filter); void packet_set_priority(const char *priority); void packet_select_index(uint16_t index); +void packet_set_fallback_manufacturer(uint16_t manufacturer); void packet_hexdump(const unsigned char *buf, uint16_t len); void packet_print_error(const char *label, uint8_t error); -- 2.47.3