From 74dbc339d8f21723face0686ce99c8343e455341 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Tue, 25 Feb 2020 23:01:58 +0100 Subject: [PATCH] BSB: Daemon logs packets and statistics --- bsb/daemon/burrow-bsb.c | 100 ++++++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 29 deletions(-) diff --git a/bsb/daemon/burrow-bsb.c b/bsb/daemon/burrow-bsb.c index 2eb9ccf..8396a22 100644 --- a/bsb/daemon/burrow-bsb.c +++ b/bsb/daemon/burrow-bsb.c @@ -9,9 +9,10 @@ #include #include #include +#include #include -#include +#include static struct libusb_context *usb_ctxt; static struct libusb_device_handle *devh; @@ -83,6 +84,55 @@ static inline uint get_u32_le(byte *p) return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]; } +static const char * const stat_names[] = { + "rx_noise", + "rx_errors", + "rx_invalid", + "rx_overruns", + "rx_timeouts", + "rx_bad_crc", + "rx_ok", +}; + +static void show_stats(byte *resp, uint len) +{ + printf("# Stats:"); + for (uint i=0; 4*i + 3 < (uint) len; i++) + printf(" %s=%u", (i < sizeof(stat_names) / sizeof(stat_names[0]) ? stat_names[i] : "?"), get_u32_le(resp+4*i)); + printf("\n"); +} + +static void show_packet(byte *pkt, uint len) +{ +#if 1 + printf(":"); + for (uint i=0; i %02x: ", pkt[1] ^ 0x80, pkt[2]); + switch (pkt[4]) { + case 2: + printf("INFO %04x:%04x =", (pkt[5]<<8) | pkt[6], (pkt[7]<<8) | pkt[8]); + for (uint i=9; i %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]); -#elif 0 - int received; - byte resp[64]; - if (err = libusb_interrupt_transfer(devh, 0x82, resp, 64, &received, 100)) { - usb_error("Receive failed: error %d", err); - continue; - } - - printf("Interrupt received %d bytes\n", received); - if (received < 4) { - usb_error("Receive failed: unexpected response size %d", received); - continue; - } +#endif - printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]); -#else - byte resp[64]; - int received; - if ((received = libusb_control_transfer(devh, 0xc0, 0x00, 0, 0, resp, sizeof(resp), 100)) < 0) { - usb_error("Receive failed: error %d", received); + if (err = libusb_interrupt_transfer(devh, 0x82, resp, 64, &received, 1000)) { + if (err != LIBUSB_ERROR_TIMEOUT) + usb_error("Receive failed: error %d", err); continue; } - printf("Stats:"); - for (int i=0; i+3 < received; i+=4) - printf(" %u", get_u32_le(resp+i)); - printf("\n"); -#endif - - sleep(1); + show_packet(resp, received); } } -- 2.39.2