summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-03-14 23:29:37 +0100
committerPeter Wu <peter@lekensteyn.nl>2014-03-16 00:10:06 +0100
commit62753fb57637c044fd89e05f8e4eb3c69458967e (patch)
tree5539b2d2ff918fc794af296507e3d7066e8134b9
parent7ef8622af0d56dc32af1d7563127057964d99cb1 (diff)
downloadqemu-62753fb57637c044fd89e05f8e4eb3c69458967e.tar.gz
unifying: hook up usbdump with handle_control
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
-rw-r--r--hw/usb/dev-unifying.c36
1 files 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?