From 62753fb57637c044fd89e05f8e4eb3c69458967e Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 14 Mar 2014 23:29:37 +0100 Subject: unifying: hook up usbdump with handle_control Signed-off-by: Peter Wu --- hw/usb/dev-unifying.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/hw/usb/dev-unifying.c b/hw/usb/dev-unifying.c index 9e79ac7f7a..97c8bb3458 100644 --- a/hw/usb/dev-unifying.c +++ b/hw/usb/dev-unifying.c @@ -32,6 +32,7 @@ #include "ui/console.h" #include "hw/usb.h" #include "hw/usb/desc.h" +#include "dump.h" #if 0 /* Interface requests */ @@ -44,11 +45,12 @@ #define HID_GET_PROTOCOL 0xa103 #define HID_SET_IDLE 0x210a #define HID_SET_PROTOCOL 0x210b - #endif + typedef struct USBLtunifyState { USBDevice dev; USBEndpoint *intr; + UsbDumpState *usb_dump_state; #if 0 QEMUPutMouseEntry *eh_entry; int dx, dy, dz, buttons_state; @@ -497,15 +499,19 @@ static void usb_ltunify_handle_reset(USBDevice *dev) static void usb_ltunify_handle_control(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *data) { - //USBLtunifyState *s = (USBLtunifyState *) dev; + USBLtunifyState *s = (USBLtunifyState *) dev; int ret; int desc_len = 0; const uint8_t *desc = NULL; + if (s->usb_dump_state) { + usb_dump_submit(s->usb_dump_state, p); + } + /* handle basic requests such as DeviceRequest | USB_REQ_GET_DESCRIPTOR */ ret = usb_desc_handle_control(dev, p, request, value, index, length, data); if (ret >= 0) { - return; + goto data_ready; } switch (request) { @@ -570,6 +576,11 @@ static void usb_ltunify_handle_control(USBDevice *dev, USBPacket *p, p->status = USB_RET_STALL; break; } + +data_ready: + if (s->usb_dump_state) { + usb_dump_complete(s->usb_dump_state, p); + } } #if 0 @@ -600,27 +611,40 @@ static void usb_ltunify_handle_data(USBDevice *dev, USBPacket *p) p->status = USB_RET_STALL; } } +#endif static void usb_ltunify_handle_destroy(USBDevice *dev) { USBLtunifyState *s = (USBLtunifyState *) dev; +#if 0 if (s->mouse_grabbed) { qemu_remove_mouse_event_handler(s->eh_entry); s->mouse_grabbed = 0; } -} #endif + if (s->usb_dump_state) { + usb_dump_cleanup(s->usb_dump_state); + g_free(s->usb_dump_state); + s->usb_dump_state = NULL; + } +} + static int usb_ltunify_initfn(USBDevice *dev) { USBLtunifyState *s = DO_UPCAST(USBLtunifyState, dev, dev); - // no idea what this is used for: + // This makes QEMU create a iSerial (using the serial attribute if + // available). Since we hard-code one, do not use it. //usb_desc_create_serial(dev); + usb_desc_init(dev); s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); // WTF is this for: //s->changed = 1; + + // TODO: API sucks... + s->usb_dump_state = usb_dump_init_alloc("/tmp/usbdump.pcap"); return 0; } @@ -643,8 +667,8 @@ static void usb_ltunify_class_init(ObjectClass *klass, void *data) uc->handle_control = usb_ltunify_handle_control; #if 0 uc->handle_data = usb_ltunify_handle_data; - uc->handle_destroy = usb_ltunify_handle_destroy; #endif + uc->handle_destroy = usb_ltunify_handle_destroy; // uc->handle_attach = usb_desc_attach; ?? found in dev-hid.c set_bit(DEVICE_CATEGORY_INPUT, dc->categories); // TODO: is this mecessary? -- cgit v1.2.1