xref: /qemu/hw/usb/redirect.c (revision b1be0972)
1 /*
2  * USB redirector usb-guest
3  *
4  * Copyright (c) 2011-2012 Red Hat, Inc.
5  *
6  * Red Hat Authors:
7  * Hans de Goede <hdegoede@redhat.com>
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a copy
10  * of this software and associated documentation files (the "Software"), to deal
11  * in the Software without restriction, including without limitation the rights
12  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13  * copies of the Software, and to permit persons to whom the Software is
14  * furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included in
17  * all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25  * THE SOFTWARE.
26  */
27 
28 #include "qemu/osdep.h"
29 #include "qemu-common.h"
30 #include "qemu/timer.h"
31 #include "sysemu/sysemu.h"
32 #include "qapi/qmp/qerror.h"
33 #include "qemu/error-report.h"
34 #include "qemu/iov.h"
35 #include "sysemu/char.h"
36 
37 #include <usbredirparser.h>
38 #include <usbredirfilter.h>
39 
40 #include "hw/usb.h"
41 
42 /* ERROR is defined below. Remove any previous definition. */
43 #undef ERROR
44 
45 #define MAX_ENDPOINTS 32
46 #define NO_INTERFACE_INFO 255 /* Valid interface_count always <= 32 */
47 #define EP2I(ep_address) (((ep_address & 0x80) >> 3) | (ep_address & 0x0f))
48 #define I2EP(i) (((i & 0x10) << 3) | (i & 0x0f))
49 #define USBEP2I(usb_ep) (((usb_ep)->pid == USB_TOKEN_IN) ? \
50                          ((usb_ep)->nr | 0x10) : ((usb_ep)->nr))
51 #define I2USBEP(d, i) (usb_ep_get(&(d)->dev, \
52                        ((i) & 0x10) ? USB_TOKEN_IN : USB_TOKEN_OUT, \
53                        (i) & 0x0f))
54 
55 #ifndef USBREDIR_VERSION /* This is not defined in older usbredir versions */
56 #define USBREDIR_VERSION 0
57 #endif
58 
59 typedef struct USBRedirDevice USBRedirDevice;
60 
61 /* Struct to hold buffered packets */
62 struct buf_packet {
63     uint8_t *data;
64     void *free_on_destroy;
65     uint16_t len;
66     uint16_t offset;
67     uint8_t status;
68     QTAILQ_ENTRY(buf_packet)next;
69 };
70 
71 struct endp_data {
72     USBRedirDevice *dev;
73     uint8_t type;
74     uint8_t interval;
75     uint8_t interface; /* bInterfaceNumber this ep belongs to */
76     uint16_t max_packet_size; /* In bytes, not wMaxPacketSize format !! */
77     uint32_t max_streams;
78     uint8_t iso_started;
79     uint8_t iso_error; /* For reporting iso errors to the HC */
80     uint8_t interrupt_started;
81     uint8_t interrupt_error;
82     uint8_t bulk_receiving_enabled;
83     uint8_t bulk_receiving_started;
84     uint8_t bufpq_prefilled;
85     uint8_t bufpq_dropping_packets;
86     QTAILQ_HEAD(, buf_packet) bufpq;
87     int32_t bufpq_size;
88     int32_t bufpq_target_size;
89     USBPacket *pending_async_packet;
90 };
91 
92 struct PacketIdQueueEntry {
93     uint64_t id;
94     QTAILQ_ENTRY(PacketIdQueueEntry)next;
95 };
96 
97 struct PacketIdQueue {
98     USBRedirDevice *dev;
99     const char *name;
100     QTAILQ_HEAD(, PacketIdQueueEntry) head;
101     int size;
102 };
103 
104 struct USBRedirDevice {
105     USBDevice dev;
106     /* Properties */
107     CharDriverState *cs;
108     uint8_t debug;
109     char *filter_str;
110     int32_t bootindex;
111     /* Data passed from chardev the fd_read cb to the usbredirparser read cb */
112     const uint8_t *read_buf;
113     int read_buf_size;
114     /* Active chardev-watch-tag */
115     guint watch;
116     /* For async handling of close / reject */
117     QEMUBH *chardev_close_bh;
118     QEMUBH *device_reject_bh;
119     /* To delay the usb attach in case of quick chardev close + open */
120     QEMUTimer *attach_timer;
121     int64_t next_attach_time;
122     struct usbredirparser *parser;
123     struct endp_data endpoint[MAX_ENDPOINTS];
124     struct PacketIdQueue cancelled;
125     struct PacketIdQueue already_in_flight;
126     void (*buffered_bulk_in_complete)(USBRedirDevice *, USBPacket *, uint8_t);
127     /* Data for device filtering */
128     struct usb_redir_device_connect_header device_info;
129     struct usb_redir_interface_info_header interface_info;
130     struct usbredirfilter_rule *filter_rules;
131     int filter_rules_count;
132     int compatible_speedmask;
133 };
134 
135 #define TYPE_USB_REDIR "usb-redir"
136 #define USB_REDIRECT(obj) OBJECT_CHECK(USBRedirDevice, (obj), TYPE_USB_REDIR)
137 
138 static void usbredir_hello(void *priv, struct usb_redir_hello_header *h);
139 static void usbredir_device_connect(void *priv,
140     struct usb_redir_device_connect_header *device_connect);
141 static void usbredir_device_disconnect(void *priv);
142 static void usbredir_interface_info(void *priv,
143     struct usb_redir_interface_info_header *interface_info);
144 static void usbredir_ep_info(void *priv,
145     struct usb_redir_ep_info_header *ep_info);
146 static void usbredir_configuration_status(void *priv, uint64_t id,
147     struct usb_redir_configuration_status_header *configuration_status);
148 static void usbredir_alt_setting_status(void *priv, uint64_t id,
149     struct usb_redir_alt_setting_status_header *alt_setting_status);
150 static void usbredir_iso_stream_status(void *priv, uint64_t id,
151     struct usb_redir_iso_stream_status_header *iso_stream_status);
152 static void usbredir_interrupt_receiving_status(void *priv, uint64_t id,
153     struct usb_redir_interrupt_receiving_status_header
154     *interrupt_receiving_status);
155 static void usbredir_bulk_streams_status(void *priv, uint64_t id,
156     struct usb_redir_bulk_streams_status_header *bulk_streams_status);
157 static void usbredir_bulk_receiving_status(void *priv, uint64_t id,
158     struct usb_redir_bulk_receiving_status_header *bulk_receiving_status);
159 static void usbredir_control_packet(void *priv, uint64_t id,
160     struct usb_redir_control_packet_header *control_packet,
161     uint8_t *data, int data_len);
162 static void usbredir_bulk_packet(void *priv, uint64_t id,
163     struct usb_redir_bulk_packet_header *bulk_packet,
164     uint8_t *data, int data_len);
165 static void usbredir_iso_packet(void *priv, uint64_t id,
166     struct usb_redir_iso_packet_header *iso_packet,
167     uint8_t *data, int data_len);
168 static void usbredir_interrupt_packet(void *priv, uint64_t id,
169     struct usb_redir_interrupt_packet_header *interrupt_header,
170     uint8_t *data, int data_len);
171 static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
172     struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet,
173     uint8_t *data, int data_len);
174 
175 static void usbredir_handle_status(USBRedirDevice *dev, USBPacket *p,
176     int status);
177 
178 #define VERSION "qemu usb-redir guest " QEMU_VERSION
179 
180 /*
181  * Logging stuff
182  */
183 
184 #define ERROR(...) \
185     do { \
186         if (dev->debug >= usbredirparser_error) { \
187             error_report("usb-redir error: " __VA_ARGS__); \
188         } \
189     } while (0)
190 #define WARNING(...) \
191     do { \
192         if (dev->debug >= usbredirparser_warning) { \
193             error_report("usb-redir warning: " __VA_ARGS__); \
194         } \
195     } while (0)
196 #define INFO(...) \
197     do { \
198         if (dev->debug >= usbredirparser_info) { \
199             error_report("usb-redir: " __VA_ARGS__); \
200         } \
201     } while (0)
202 #define DPRINTF(...) \
203     do { \
204         if (dev->debug >= usbredirparser_debug) { \
205             error_report("usb-redir: " __VA_ARGS__); \
206         } \
207     } while (0)
208 #define DPRINTF2(...) \
209     do { \
210         if (dev->debug >= usbredirparser_debug_data) { \
211             error_report("usb-redir: " __VA_ARGS__); \
212         } \
213     } while (0)
214 
215 static void usbredir_log(void *priv, int level, const char *msg)
216 {
217     USBRedirDevice *dev = priv;
218 
219     if (dev->debug < level) {
220         return;
221     }
222 
223     error_report("%s", msg);
224 }
225 
226 static void usbredir_log_data(USBRedirDevice *dev, const char *desc,
227     const uint8_t *data, int len)
228 {
229     int i, j, n;
230 
231     if (dev->debug < usbredirparser_debug_data) {
232         return;
233     }
234 
235     for (i = 0; i < len; i += j) {
236         char buf[128];
237 
238         n = sprintf(buf, "%s", desc);
239         for (j = 0; j < 8 && i + j < len; j++) {
240             n += sprintf(buf + n, " %02X", data[i + j]);
241         }
242         error_report("%s", buf);
243     }
244 }
245 
246 /*
247  * usbredirparser io functions
248  */
249 
250 static int usbredir_read(void *priv, uint8_t *data, int count)
251 {
252     USBRedirDevice *dev = priv;
253 
254     if (dev->read_buf_size < count) {
255         count = dev->read_buf_size;
256     }
257 
258     memcpy(data, dev->read_buf, count);
259 
260     dev->read_buf_size -= count;
261     if (dev->read_buf_size) {
262         dev->read_buf += count;
263     } else {
264         dev->read_buf = NULL;
265     }
266 
267     return count;
268 }
269 
270 static gboolean usbredir_write_unblocked(GIOChannel *chan, GIOCondition cond,
271                                          void *opaque)
272 {
273     USBRedirDevice *dev = opaque;
274 
275     dev->watch = 0;
276     usbredirparser_do_write(dev->parser);
277 
278     return FALSE;
279 }
280 
281 static int usbredir_write(void *priv, uint8_t *data, int count)
282 {
283     USBRedirDevice *dev = priv;
284     int r;
285 
286     if (!dev->cs->be_open) {
287         return 0;
288     }
289 
290     /* Don't send new data to the chardev until our state is fully synced */
291     if (!runstate_check(RUN_STATE_RUNNING)) {
292         return 0;
293     }
294 
295     r = qemu_chr_fe_write(dev->cs, data, count);
296     if (r < count) {
297         if (!dev->watch) {
298             dev->watch = qemu_chr_fe_add_watch(dev->cs, G_IO_OUT|G_IO_HUP,
299                                                usbredir_write_unblocked, dev);
300         }
301         if (r < 0) {
302             r = 0;
303         }
304     }
305     return r;
306 }
307 
308 /*
309  * Cancelled and buffered packets helpers
310  */
311 
312 static void packet_id_queue_init(struct PacketIdQueue *q,
313     USBRedirDevice *dev, const char *name)
314 {
315     q->dev = dev;
316     q->name = name;
317     QTAILQ_INIT(&q->head);
318     q->size = 0;
319 }
320 
321 static void packet_id_queue_add(struct PacketIdQueue *q, uint64_t id)
322 {
323     USBRedirDevice *dev = q->dev;
324     struct PacketIdQueueEntry *e;
325 
326     DPRINTF("adding packet id %"PRIu64" to %s queue\n", id, q->name);
327 
328     e = g_new0(struct PacketIdQueueEntry, 1);
329     e->id = id;
330     QTAILQ_INSERT_TAIL(&q->head, e, next);
331     q->size++;
332 }
333 
334 static int packet_id_queue_remove(struct PacketIdQueue *q, uint64_t id)
335 {
336     USBRedirDevice *dev = q->dev;
337     struct PacketIdQueueEntry *e;
338 
339     QTAILQ_FOREACH(e, &q->head, next) {
340         if (e->id == id) {
341             DPRINTF("removing packet id %"PRIu64" from %s queue\n",
342                     id, q->name);
343             QTAILQ_REMOVE(&q->head, e, next);
344             q->size--;
345             g_free(e);
346             return 1;
347         }
348     }
349     return 0;
350 }
351 
352 static void packet_id_queue_empty(struct PacketIdQueue *q)
353 {
354     USBRedirDevice *dev = q->dev;
355     struct PacketIdQueueEntry *e, *next_e;
356 
357     DPRINTF("removing %d packet-ids from %s queue\n", q->size, q->name);
358 
359     QTAILQ_FOREACH_SAFE(e, &q->head, next, next_e) {
360         QTAILQ_REMOVE(&q->head, e, next);
361         g_free(e);
362     }
363     q->size = 0;
364 }
365 
366 static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p)
367 {
368     USBRedirDevice *dev = USB_REDIRECT(udev);
369     int i = USBEP2I(p->ep);
370 
371     if (p->combined) {
372         usb_combined_packet_cancel(udev, p);
373         return;
374     }
375 
376     if (dev->endpoint[i].pending_async_packet) {
377         assert(dev->endpoint[i].pending_async_packet == p);
378         dev->endpoint[i].pending_async_packet = NULL;
379         return;
380     }
381 
382     packet_id_queue_add(&dev->cancelled, p->id);
383     usbredirparser_send_cancel_data_packet(dev->parser, p->id);
384     usbredirparser_do_write(dev->parser);
385 }
386 
387 static int usbredir_is_cancelled(USBRedirDevice *dev, uint64_t id)
388 {
389     if (!dev->dev.attached) {
390         return 1; /* Treat everything as cancelled after a disconnect */
391     }
392     return packet_id_queue_remove(&dev->cancelled, id);
393 }
394 
395 static void usbredir_fill_already_in_flight_from_ep(USBRedirDevice *dev,
396     struct USBEndpoint *ep)
397 {
398     static USBPacket *p;
399 
400     /* async handled packets for bulk receiving eps do not count as inflight */
401     if (dev->endpoint[USBEP2I(ep)].bulk_receiving_started) {
402         return;
403     }
404 
405     QTAILQ_FOREACH(p, &ep->queue, queue) {
406         /* Skip combined packets, except for the first */
407         if (p->combined && p != p->combined->first) {
408             continue;
409         }
410         if (p->state == USB_PACKET_ASYNC) {
411             packet_id_queue_add(&dev->already_in_flight, p->id);
412         }
413     }
414 }
415 
416 static void usbredir_fill_already_in_flight(USBRedirDevice *dev)
417 {
418     int ep;
419     struct USBDevice *udev = &dev->dev;
420 
421     usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_ctl);
422 
423     for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
424         usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_in[ep]);
425         usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_out[ep]);
426     }
427 }
428 
429 static int usbredir_already_in_flight(USBRedirDevice *dev, uint64_t id)
430 {
431     return packet_id_queue_remove(&dev->already_in_flight, id);
432 }
433 
434 static USBPacket *usbredir_find_packet_by_id(USBRedirDevice *dev,
435     uint8_t ep, uint64_t id)
436 {
437     USBPacket *p;
438 
439     if (usbredir_is_cancelled(dev, id)) {
440         return NULL;
441     }
442 
443     p = usb_ep_find_packet_by_id(&dev->dev,
444                             (ep & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT,
445                             ep & 0x0f, id);
446     if (p == NULL) {
447         ERROR("could not find packet with id %"PRIu64"\n", id);
448     }
449     return p;
450 }
451 
452 static int bufp_alloc(USBRedirDevice *dev, uint8_t *data, uint16_t len,
453     uint8_t status, uint8_t ep, void *free_on_destroy)
454 {
455     struct buf_packet *bufp;
456 
457     if (!dev->endpoint[EP2I(ep)].bufpq_dropping_packets &&
458         dev->endpoint[EP2I(ep)].bufpq_size >
459             2 * dev->endpoint[EP2I(ep)].bufpq_target_size) {
460         DPRINTF("bufpq overflow, dropping packets ep %02X\n", ep);
461         dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 1;
462     }
463     /* Since we're interupting the stream anyways, drop enough packets to get
464        back to our target buffer size */
465     if (dev->endpoint[EP2I(ep)].bufpq_dropping_packets) {
466         if (dev->endpoint[EP2I(ep)].bufpq_size >
467                 dev->endpoint[EP2I(ep)].bufpq_target_size) {
468             free(data);
469             return -1;
470         }
471         dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
472     }
473 
474     bufp = g_new(struct buf_packet, 1);
475     bufp->data   = data;
476     bufp->len    = len;
477     bufp->offset = 0;
478     bufp->status = status;
479     bufp->free_on_destroy = free_on_destroy;
480     QTAILQ_INSERT_TAIL(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
481     dev->endpoint[EP2I(ep)].bufpq_size++;
482     return 0;
483 }
484 
485 static void bufp_free(USBRedirDevice *dev, struct buf_packet *bufp,
486     uint8_t ep)
487 {
488     QTAILQ_REMOVE(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
489     dev->endpoint[EP2I(ep)].bufpq_size--;
490     free(bufp->free_on_destroy);
491     g_free(bufp);
492 }
493 
494 static void usbredir_free_bufpq(USBRedirDevice *dev, uint8_t ep)
495 {
496     struct buf_packet *buf, *buf_next;
497 
498     QTAILQ_FOREACH_SAFE(buf, &dev->endpoint[EP2I(ep)].bufpq, next, buf_next) {
499         bufp_free(dev, buf, ep);
500     }
501 }
502 
503 /*
504  * USBDevice callbacks
505  */
506 
507 static void usbredir_handle_reset(USBDevice *udev)
508 {
509     USBRedirDevice *dev = USB_REDIRECT(udev);
510 
511     DPRINTF("reset device\n");
512     usbredirparser_send_reset(dev->parser);
513     usbredirparser_do_write(dev->parser);
514 }
515 
516 static void usbredir_handle_iso_data(USBRedirDevice *dev, USBPacket *p,
517                                      uint8_t ep)
518 {
519     int status, len;
520     if (!dev->endpoint[EP2I(ep)].iso_started &&
521             !dev->endpoint[EP2I(ep)].iso_error) {
522         struct usb_redir_start_iso_stream_header start_iso = {
523             .endpoint = ep,
524         };
525         int pkts_per_sec;
526 
527         if (dev->dev.speed == USB_SPEED_HIGH) {
528             pkts_per_sec = 8000 / dev->endpoint[EP2I(ep)].interval;
529         } else {
530             pkts_per_sec = 1000 / dev->endpoint[EP2I(ep)].interval;
531         }
532         /* Testing has shown that we need circa 60 ms buffer */
533         dev->endpoint[EP2I(ep)].bufpq_target_size = (pkts_per_sec * 60) / 1000;
534 
535         /* Aim for approx 100 interrupts / second on the client to
536            balance latency and interrupt load */
537         start_iso.pkts_per_urb = pkts_per_sec / 100;
538         if (start_iso.pkts_per_urb < 1) {
539             start_iso.pkts_per_urb = 1;
540         } else if (start_iso.pkts_per_urb > 32) {
541             start_iso.pkts_per_urb = 32;
542         }
543 
544         start_iso.no_urbs = (dev->endpoint[EP2I(ep)].bufpq_target_size +
545                              start_iso.pkts_per_urb - 1) /
546                             start_iso.pkts_per_urb;
547         /* Output endpoints pre-fill only 1/2 of the packets, keeping the rest
548            as overflow buffer. Also see the usbredir protocol documentation */
549         if (!(ep & USB_DIR_IN)) {
550             start_iso.no_urbs *= 2;
551         }
552         if (start_iso.no_urbs > 16) {
553             start_iso.no_urbs = 16;
554         }
555 
556         /* No id, we look at the ep when receiving a status back */
557         usbredirparser_send_start_iso_stream(dev->parser, 0, &start_iso);
558         usbredirparser_do_write(dev->parser);
559         DPRINTF("iso stream started pkts/sec %d pkts/urb %d urbs %d ep %02X\n",
560                 pkts_per_sec, start_iso.pkts_per_urb, start_iso.no_urbs, ep);
561         dev->endpoint[EP2I(ep)].iso_started = 1;
562         dev->endpoint[EP2I(ep)].bufpq_prefilled = 0;
563         dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
564     }
565 
566     if (ep & USB_DIR_IN) {
567         struct buf_packet *isop;
568 
569         if (dev->endpoint[EP2I(ep)].iso_started &&
570                 !dev->endpoint[EP2I(ep)].bufpq_prefilled) {
571             if (dev->endpoint[EP2I(ep)].bufpq_size <
572                     dev->endpoint[EP2I(ep)].bufpq_target_size) {
573                 return;
574             }
575             dev->endpoint[EP2I(ep)].bufpq_prefilled = 1;
576         }
577 
578         isop = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq);
579         if (isop == NULL) {
580             DPRINTF("iso-token-in ep %02X, no isop, iso_error: %d\n",
581                     ep, dev->endpoint[EP2I(ep)].iso_error);
582             /* Re-fill the buffer */
583             dev->endpoint[EP2I(ep)].bufpq_prefilled = 0;
584             /* Check iso_error for stream errors, otherwise its an underrun */
585             status = dev->endpoint[EP2I(ep)].iso_error;
586             dev->endpoint[EP2I(ep)].iso_error = 0;
587             p->status = status ? USB_RET_IOERROR : USB_RET_SUCCESS;
588             return;
589         }
590         DPRINTF2("iso-token-in ep %02X status %d len %d queue-size: %d\n", ep,
591                  isop->status, isop->len, dev->endpoint[EP2I(ep)].bufpq_size);
592 
593         status = isop->status;
594         len = isop->len;
595         if (len > p->iov.size) {
596             ERROR("received iso data is larger then packet ep %02X (%d > %d)\n",
597                   ep, len, (int)p->iov.size);
598             len = p->iov.size;
599             status = usb_redir_babble;
600         }
601         usb_packet_copy(p, isop->data, len);
602         bufp_free(dev, isop, ep);
603         usbredir_handle_status(dev, p, status);
604     } else {
605         /* If the stream was not started because of a pending error don't
606            send the packet to the usb-host */
607         if (dev->endpoint[EP2I(ep)].iso_started) {
608             struct usb_redir_iso_packet_header iso_packet = {
609                 .endpoint = ep,
610                 .length = p->iov.size
611             };
612             uint8_t buf[p->iov.size];
613             /* No id, we look at the ep when receiving a status back */
614             usb_packet_copy(p, buf, p->iov.size);
615             usbredirparser_send_iso_packet(dev->parser, 0, &iso_packet,
616                                            buf, p->iov.size);
617             usbredirparser_do_write(dev->parser);
618         }
619         status = dev->endpoint[EP2I(ep)].iso_error;
620         dev->endpoint[EP2I(ep)].iso_error = 0;
621         DPRINTF2("iso-token-out ep %02X status %d len %zd\n", ep, status,
622                  p->iov.size);
623         usbredir_handle_status(dev, p, status);
624     }
625 }
626 
627 static void usbredir_stop_iso_stream(USBRedirDevice *dev, uint8_t ep)
628 {
629     struct usb_redir_stop_iso_stream_header stop_iso_stream = {
630         .endpoint = ep
631     };
632     if (dev->endpoint[EP2I(ep)].iso_started) {
633         usbredirparser_send_stop_iso_stream(dev->parser, 0, &stop_iso_stream);
634         DPRINTF("iso stream stopped ep %02X\n", ep);
635         dev->endpoint[EP2I(ep)].iso_started = 0;
636     }
637     dev->endpoint[EP2I(ep)].iso_error = 0;
638     usbredir_free_bufpq(dev, ep);
639 }
640 
641 /*
642  * The usb-host may poll the endpoint faster then our guest, resulting in lots
643  * of smaller bulkp-s. The below buffered_bulk_in_complete* functions combine
644  * data from multiple bulkp-s into a single packet, avoiding bufpq overflows.
645  */
646 static void usbredir_buffered_bulk_add_data_to_packet(USBRedirDevice *dev,
647     struct buf_packet *bulkp, int count, USBPacket *p, uint8_t ep)
648 {
649     usb_packet_copy(p, bulkp->data + bulkp->offset, count);
650     bulkp->offset += count;
651     if (bulkp->offset == bulkp->len) {
652         /* Store status in the last packet with data from this bulkp */
653         usbredir_handle_status(dev, p, bulkp->status);
654         bufp_free(dev, bulkp, ep);
655     }
656 }
657 
658 static void usbredir_buffered_bulk_in_complete_raw(USBRedirDevice *dev,
659     USBPacket *p, uint8_t ep)
660 {
661     struct buf_packet *bulkp;
662     int count;
663 
664     while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) &&
665            p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) {
666         count = bulkp->len - bulkp->offset;
667         if (count > (p->iov.size - p->actual_length)) {
668             count = p->iov.size - p->actual_length;
669         }
670         usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep);
671     }
672 }
673 
674 static void usbredir_buffered_bulk_in_complete_ftdi(USBRedirDevice *dev,
675     USBPacket *p, uint8_t ep)
676 {
677     const int maxp = dev->endpoint[EP2I(ep)].max_packet_size;
678     uint8_t header[2] = { 0, 0 };
679     struct buf_packet *bulkp;
680     int count;
681 
682     while ((bulkp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq)) &&
683            p->actual_length < p->iov.size && p->status == USB_RET_SUCCESS) {
684         if (bulkp->len < 2) {
685             WARNING("malformed ftdi bulk in packet\n");
686             bufp_free(dev, bulkp, ep);
687             continue;
688         }
689 
690         if ((p->actual_length % maxp) == 0) {
691             usb_packet_copy(p, bulkp->data, 2);
692             memcpy(header, bulkp->data, 2);
693         } else {
694             if (bulkp->data[0] != header[0] || bulkp->data[1] != header[1]) {
695                 break; /* Different header, add to next packet */
696             }
697         }
698 
699         if (bulkp->offset == 0) {
700             bulkp->offset = 2; /* Skip header */
701         }
702         count = bulkp->len - bulkp->offset;
703         /* Must repeat the header at maxp interval */
704         if (count > (maxp - (p->actual_length % maxp))) {
705             count = maxp - (p->actual_length % maxp);
706         }
707         usbredir_buffered_bulk_add_data_to_packet(dev, bulkp, count, p, ep);
708     }
709 }
710 
711 static void usbredir_buffered_bulk_in_complete(USBRedirDevice *dev,
712     USBPacket *p, uint8_t ep)
713 {
714     p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */
715     dev->buffered_bulk_in_complete(dev, p, ep);
716     DPRINTF("bulk-token-in ep %02X status %d len %d id %"PRIu64"\n",
717             ep, p->status, p->actual_length, p->id);
718 }
719 
720 static void usbredir_handle_buffered_bulk_in_data(USBRedirDevice *dev,
721     USBPacket *p, uint8_t ep)
722 {
723     /* Input bulk endpoint, buffered packet input */
724     if (!dev->endpoint[EP2I(ep)].bulk_receiving_started) {
725         int bpt;
726         struct usb_redir_start_bulk_receiving_header start = {
727             .endpoint = ep,
728             .stream_id = 0,
729             .no_transfers = 5,
730         };
731         /* Round bytes_per_transfer up to a multiple of max_packet_size */
732         bpt = 512 + dev->endpoint[EP2I(ep)].max_packet_size - 1;
733         bpt /= dev->endpoint[EP2I(ep)].max_packet_size;
734         bpt *= dev->endpoint[EP2I(ep)].max_packet_size;
735         start.bytes_per_transfer = bpt;
736         /* No id, we look at the ep when receiving a status back */
737         usbredirparser_send_start_bulk_receiving(dev->parser, 0, &start);
738         usbredirparser_do_write(dev->parser);
739         DPRINTF("bulk receiving started bytes/transfer %u count %d ep %02X\n",
740                 start.bytes_per_transfer, start.no_transfers, ep);
741         dev->endpoint[EP2I(ep)].bulk_receiving_started = 1;
742         /* We don't really want to drop bulk packets ever, but
743            having some upper limit to how much we buffer is good. */
744         dev->endpoint[EP2I(ep)].bufpq_target_size = 5000;
745         dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
746     }
747 
748     if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) {
749         DPRINTF("bulk-token-in ep %02X, no bulkp\n", ep);
750         assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL);
751         dev->endpoint[EP2I(ep)].pending_async_packet = p;
752         p->status = USB_RET_ASYNC;
753         return;
754     }
755     usbredir_buffered_bulk_in_complete(dev, p, ep);
756 }
757 
758 static void usbredir_stop_bulk_receiving(USBRedirDevice *dev, uint8_t ep)
759 {
760     struct usb_redir_stop_bulk_receiving_header stop_bulk = {
761         .endpoint = ep,
762         .stream_id = 0,
763     };
764     if (dev->endpoint[EP2I(ep)].bulk_receiving_started) {
765         usbredirparser_send_stop_bulk_receiving(dev->parser, 0, &stop_bulk);
766         DPRINTF("bulk receiving stopped ep %02X\n", ep);
767         dev->endpoint[EP2I(ep)].bulk_receiving_started = 0;
768     }
769     usbredir_free_bufpq(dev, ep);
770 }
771 
772 static void usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p,
773                                       uint8_t ep)
774 {
775     struct usb_redir_bulk_packet_header bulk_packet;
776     size_t size = usb_packet_size(p);
777     const int maxp = dev->endpoint[EP2I(ep)].max_packet_size;
778 
779     if (usbredir_already_in_flight(dev, p->id)) {
780         p->status = USB_RET_ASYNC;
781         return;
782     }
783 
784     if (dev->endpoint[EP2I(ep)].bulk_receiving_enabled) {
785         if (size != 0 && (size % maxp) == 0) {
786             usbredir_handle_buffered_bulk_in_data(dev, p, ep);
787             return;
788         }
789         WARNING("bulk recv invalid size %zd ep %02x, disabling\n", size, ep);
790         assert(dev->endpoint[EP2I(ep)].pending_async_packet == NULL);
791         usbredir_stop_bulk_receiving(dev, ep);
792         dev->endpoint[EP2I(ep)].bulk_receiving_enabled = 0;
793     }
794 
795     DPRINTF("bulk-out ep %02X stream %u len %zd id %"PRIu64"\n",
796             ep, p->stream, size, p->id);
797 
798     bulk_packet.endpoint  = ep;
799     bulk_packet.length    = size;
800     bulk_packet.stream_id = p->stream;
801     bulk_packet.length_high = size >> 16;
802     assert(bulk_packet.length_high == 0 ||
803            usbredirparser_peer_has_cap(dev->parser,
804                                        usb_redir_cap_32bits_bulk_length));
805 
806     if (ep & USB_DIR_IN) {
807         usbredirparser_send_bulk_packet(dev->parser, p->id,
808                                         &bulk_packet, NULL, 0);
809     } else {
810         uint8_t buf[size];
811         usb_packet_copy(p, buf, size);
812         usbredir_log_data(dev, "bulk data out:", buf, size);
813         usbredirparser_send_bulk_packet(dev->parser, p->id,
814                                         &bulk_packet, buf, size);
815     }
816     usbredirparser_do_write(dev->parser);
817     p->status = USB_RET_ASYNC;
818 }
819 
820 static void usbredir_handle_interrupt_in_data(USBRedirDevice *dev,
821                                               USBPacket *p, uint8_t ep)
822 {
823     /* Input interrupt endpoint, buffered packet input */
824     struct buf_packet *intp;
825     int status, len;
826 
827     if (!dev->endpoint[EP2I(ep)].interrupt_started &&
828             !dev->endpoint[EP2I(ep)].interrupt_error) {
829         struct usb_redir_start_interrupt_receiving_header start_int = {
830             .endpoint = ep,
831         };
832         /* No id, we look at the ep when receiving a status back */
833         usbredirparser_send_start_interrupt_receiving(dev->parser, 0,
834                                                       &start_int);
835         usbredirparser_do_write(dev->parser);
836         DPRINTF("interrupt recv started ep %02X\n", ep);
837         dev->endpoint[EP2I(ep)].interrupt_started = 1;
838         /* We don't really want to drop interrupt packets ever, but
839            having some upper limit to how much we buffer is good. */
840         dev->endpoint[EP2I(ep)].bufpq_target_size = 1000;
841         dev->endpoint[EP2I(ep)].bufpq_dropping_packets = 0;
842     }
843 
844     intp = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq);
845     if (intp == NULL) {
846         DPRINTF2("interrupt-token-in ep %02X, no intp\n", ep);
847         /* Check interrupt_error for stream errors */
848         status = dev->endpoint[EP2I(ep)].interrupt_error;
849         dev->endpoint[EP2I(ep)].interrupt_error = 0;
850         if (status) {
851             usbredir_handle_status(dev, p, status);
852         } else {
853             p->status = USB_RET_NAK;
854         }
855         return;
856     }
857     DPRINTF("interrupt-token-in ep %02X status %d len %d\n", ep,
858             intp->status, intp->len);
859 
860     status = intp->status;
861     len = intp->len;
862     if (len > p->iov.size) {
863         ERROR("received int data is larger then packet ep %02X\n", ep);
864         len = p->iov.size;
865         status = usb_redir_babble;
866     }
867     usb_packet_copy(p, intp->data, len);
868     bufp_free(dev, intp, ep);
869     usbredir_handle_status(dev, p, status);
870 }
871 
872 /*
873  * Handle interrupt out data, the usbredir protocol expects us to do this
874  * async, so that it can report back a completion status. But guests will
875  * expect immediate completion for an interrupt endpoint, and handling this
876  * async causes migration issues. So we report success directly, counting
877  * on the fact that output interrupt packets normally always succeed.
878  */
879 static void usbredir_handle_interrupt_out_data(USBRedirDevice *dev,
880                                                USBPacket *p, uint8_t ep)
881 {
882     struct usb_redir_interrupt_packet_header interrupt_packet;
883     uint8_t buf[p->iov.size];
884 
885     DPRINTF("interrupt-out ep %02X len %zd id %"PRIu64"\n", ep,
886             p->iov.size, p->id);
887 
888     interrupt_packet.endpoint  = ep;
889     interrupt_packet.length    = p->iov.size;
890 
891     usb_packet_copy(p, buf, p->iov.size);
892     usbredir_log_data(dev, "interrupt data out:", buf, p->iov.size);
893     usbredirparser_send_interrupt_packet(dev->parser, p->id,
894                                     &interrupt_packet, buf, p->iov.size);
895     usbredirparser_do_write(dev->parser);
896 }
897 
898 static void usbredir_stop_interrupt_receiving(USBRedirDevice *dev,
899     uint8_t ep)
900 {
901     struct usb_redir_stop_interrupt_receiving_header stop_interrupt_recv = {
902         .endpoint = ep
903     };
904     if (dev->endpoint[EP2I(ep)].interrupt_started) {
905         usbredirparser_send_stop_interrupt_receiving(dev->parser, 0,
906                                                      &stop_interrupt_recv);
907         DPRINTF("interrupt recv stopped ep %02X\n", ep);
908         dev->endpoint[EP2I(ep)].interrupt_started = 0;
909     }
910     dev->endpoint[EP2I(ep)].interrupt_error = 0;
911     usbredir_free_bufpq(dev, ep);
912 }
913 
914 static void usbredir_handle_data(USBDevice *udev, USBPacket *p)
915 {
916     USBRedirDevice *dev = USB_REDIRECT(udev);
917     uint8_t ep;
918 
919     ep = p->ep->nr;
920     if (p->pid == USB_TOKEN_IN) {
921         ep |= USB_DIR_IN;
922     }
923 
924     switch (dev->endpoint[EP2I(ep)].type) {
925     case USB_ENDPOINT_XFER_CONTROL:
926         ERROR("handle_data called for control transfer on ep %02X\n", ep);
927         p->status = USB_RET_NAK;
928         break;
929     case USB_ENDPOINT_XFER_BULK:
930         if (p->state == USB_PACKET_SETUP && p->pid == USB_TOKEN_IN &&
931                 p->ep->pipeline) {
932             p->status = USB_RET_ADD_TO_QUEUE;
933             break;
934         }
935         usbredir_handle_bulk_data(dev, p, ep);
936         break;
937     case USB_ENDPOINT_XFER_ISOC:
938         usbredir_handle_iso_data(dev, p, ep);
939         break;
940     case USB_ENDPOINT_XFER_INT:
941         if (ep & USB_DIR_IN) {
942             usbredir_handle_interrupt_in_data(dev, p, ep);
943         } else {
944             usbredir_handle_interrupt_out_data(dev, p, ep);
945         }
946         break;
947     default:
948         ERROR("handle_data ep %02X has unknown type %d\n", ep,
949               dev->endpoint[EP2I(ep)].type);
950         p->status = USB_RET_NAK;
951     }
952 }
953 
954 static void usbredir_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
955 {
956     if (ep->pid == USB_TOKEN_IN && ep->pipeline) {
957         usb_ep_combine_input_packets(ep);
958     }
959 }
960 
961 static void usbredir_stop_ep(USBRedirDevice *dev, int i)
962 {
963     uint8_t ep = I2EP(i);
964 
965     switch (dev->endpoint[i].type) {
966     case USB_ENDPOINT_XFER_BULK:
967         if (ep & USB_DIR_IN) {
968             usbredir_stop_bulk_receiving(dev, ep);
969         }
970         break;
971     case USB_ENDPOINT_XFER_ISOC:
972         usbredir_stop_iso_stream(dev, ep);
973         break;
974     case USB_ENDPOINT_XFER_INT:
975         if (ep & USB_DIR_IN) {
976             usbredir_stop_interrupt_receiving(dev, ep);
977         }
978         break;
979     }
980     usbredir_free_bufpq(dev, ep);
981 }
982 
983 static void usbredir_ep_stopped(USBDevice *udev, USBEndpoint *uep)
984 {
985     USBRedirDevice *dev = USB_REDIRECT(udev);
986 
987     usbredir_stop_ep(dev, USBEP2I(uep));
988     usbredirparser_do_write(dev->parser);
989 }
990 
991 static void usbredir_set_config(USBRedirDevice *dev, USBPacket *p,
992                                 int config)
993 {
994     struct usb_redir_set_configuration_header set_config;
995     int i;
996 
997     DPRINTF("set config %d id %"PRIu64"\n", config, p->id);
998 
999     for (i = 0; i < MAX_ENDPOINTS; i++) {
1000         usbredir_stop_ep(dev, i);
1001     }
1002 
1003     set_config.configuration = config;
1004     usbredirparser_send_set_configuration(dev->parser, p->id, &set_config);
1005     usbredirparser_do_write(dev->parser);
1006     p->status = USB_RET_ASYNC;
1007 }
1008 
1009 static void usbredir_get_config(USBRedirDevice *dev, USBPacket *p)
1010 {
1011     DPRINTF("get config id %"PRIu64"\n", p->id);
1012 
1013     usbredirparser_send_get_configuration(dev->parser, p->id);
1014     usbredirparser_do_write(dev->parser);
1015     p->status = USB_RET_ASYNC;
1016 }
1017 
1018 static void usbredir_set_interface(USBRedirDevice *dev, USBPacket *p,
1019                                    int interface, int alt)
1020 {
1021     struct usb_redir_set_alt_setting_header set_alt;
1022     int i;
1023 
1024     DPRINTF("set interface %d alt %d id %"PRIu64"\n", interface, alt, p->id);
1025 
1026     for (i = 0; i < MAX_ENDPOINTS; i++) {
1027         if (dev->endpoint[i].interface == interface) {
1028             usbredir_stop_ep(dev, i);
1029         }
1030     }
1031 
1032     set_alt.interface = interface;
1033     set_alt.alt = alt;
1034     usbredirparser_send_set_alt_setting(dev->parser, p->id, &set_alt);
1035     usbredirparser_do_write(dev->parser);
1036     p->status = USB_RET_ASYNC;
1037 }
1038 
1039 static void usbredir_get_interface(USBRedirDevice *dev, USBPacket *p,
1040                                    int interface)
1041 {
1042     struct usb_redir_get_alt_setting_header get_alt;
1043 
1044     DPRINTF("get interface %d id %"PRIu64"\n", interface, p->id);
1045 
1046     get_alt.interface = interface;
1047     usbredirparser_send_get_alt_setting(dev->parser, p->id, &get_alt);
1048     usbredirparser_do_write(dev->parser);
1049     p->status = USB_RET_ASYNC;
1050 }
1051 
1052 static void usbredir_handle_control(USBDevice *udev, USBPacket *p,
1053         int request, int value, int index, int length, uint8_t *data)
1054 {
1055     USBRedirDevice *dev = USB_REDIRECT(udev);
1056     struct usb_redir_control_packet_header control_packet;
1057 
1058     if (usbredir_already_in_flight(dev, p->id)) {
1059         p->status = USB_RET_ASYNC;
1060         return;
1061     }
1062 
1063     /* Special cases for certain standard device requests */
1064     switch (request) {
1065     case DeviceOutRequest | USB_REQ_SET_ADDRESS:
1066         DPRINTF("set address %d\n", value);
1067         dev->dev.addr = value;
1068         return;
1069     case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
1070         usbredir_set_config(dev, p, value & 0xff);
1071         return;
1072     case DeviceRequest | USB_REQ_GET_CONFIGURATION:
1073         usbredir_get_config(dev, p);
1074         return;
1075     case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
1076         usbredir_set_interface(dev, p, index, value);
1077         return;
1078     case InterfaceRequest | USB_REQ_GET_INTERFACE:
1079         usbredir_get_interface(dev, p, index);
1080         return;
1081     }
1082 
1083     /* Normal ctrl requests, note request is (bRequestType << 8) | bRequest */
1084     DPRINTF(
1085         "ctrl-out type 0x%x req 0x%x val 0x%x index %d len %d id %"PRIu64"\n",
1086         request >> 8, request & 0xff, value, index, length, p->id);
1087 
1088     control_packet.request     = request & 0xFF;
1089     control_packet.requesttype = request >> 8;
1090     control_packet.endpoint    = control_packet.requesttype & USB_DIR_IN;
1091     control_packet.value       = value;
1092     control_packet.index       = index;
1093     control_packet.length      = length;
1094 
1095     if (control_packet.requesttype & USB_DIR_IN) {
1096         usbredirparser_send_control_packet(dev->parser, p->id,
1097                                            &control_packet, NULL, 0);
1098     } else {
1099         usbredir_log_data(dev, "ctrl data out:", data, length);
1100         usbredirparser_send_control_packet(dev->parser, p->id,
1101                                            &control_packet, data, length);
1102     }
1103     usbredirparser_do_write(dev->parser);
1104     p->status = USB_RET_ASYNC;
1105 }
1106 
1107 static int usbredir_alloc_streams(USBDevice *udev, USBEndpoint **eps,
1108                                   int nr_eps, int streams)
1109 {
1110     USBRedirDevice *dev = USB_REDIRECT(udev);
1111 #if USBREDIR_VERSION >= 0x000700
1112     struct usb_redir_alloc_bulk_streams_header alloc_streams;
1113     int i;
1114 
1115     if (!usbredirparser_peer_has_cap(dev->parser,
1116                                      usb_redir_cap_bulk_streams)) {
1117         ERROR("peer does not support streams\n");
1118         goto reject;
1119     }
1120 
1121     if (streams == 0) {
1122         ERROR("request to allocate 0 streams\n");
1123         return -1;
1124     }
1125 
1126     alloc_streams.no_streams = streams;
1127     alloc_streams.endpoints = 0;
1128     for (i = 0; i < nr_eps; i++) {
1129         alloc_streams.endpoints |= 1 << USBEP2I(eps[i]);
1130     }
1131     usbredirparser_send_alloc_bulk_streams(dev->parser, 0, &alloc_streams);
1132     usbredirparser_do_write(dev->parser);
1133 
1134     return 0;
1135 #else
1136     ERROR("usbredir_alloc_streams not implemented\n");
1137     goto reject;
1138 #endif
1139 reject:
1140     ERROR("streams are not available, disconnecting\n");
1141     qemu_bh_schedule(dev->device_reject_bh);
1142     return -1;
1143 }
1144 
1145 static void usbredir_free_streams(USBDevice *udev, USBEndpoint **eps,
1146                                   int nr_eps)
1147 {
1148 #if USBREDIR_VERSION >= 0x000700
1149     USBRedirDevice *dev = USB_REDIRECT(udev);
1150     struct usb_redir_free_bulk_streams_header free_streams;
1151     int i;
1152 
1153     if (!usbredirparser_peer_has_cap(dev->parser,
1154                                      usb_redir_cap_bulk_streams)) {
1155         return;
1156     }
1157 
1158     free_streams.endpoints = 0;
1159     for (i = 0; i < nr_eps; i++) {
1160         free_streams.endpoints |= 1 << USBEP2I(eps[i]);
1161     }
1162     usbredirparser_send_free_bulk_streams(dev->parser, 0, &free_streams);
1163     usbredirparser_do_write(dev->parser);
1164 #endif
1165 }
1166 
1167 /*
1168  * Close events can be triggered by usbredirparser_do_write which gets called
1169  * from within the USBDevice data / control packet callbacks and doing a
1170  * usb_detach from within these callbacks is not a good idea.
1171  *
1172  * So we use a bh handler to take care of close events.
1173  */
1174 static void usbredir_chardev_close_bh(void *opaque)
1175 {
1176     USBRedirDevice *dev = opaque;
1177 
1178     qemu_bh_cancel(dev->device_reject_bh);
1179     usbredir_device_disconnect(dev);
1180 
1181     if (dev->parser) {
1182         DPRINTF("destroying usbredirparser\n");
1183         usbredirparser_destroy(dev->parser);
1184         dev->parser = NULL;
1185     }
1186     if (dev->watch) {
1187         g_source_remove(dev->watch);
1188         dev->watch = 0;
1189     }
1190 }
1191 
1192 static void usbredir_create_parser(USBRedirDevice *dev)
1193 {
1194     uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, };
1195     int flags = 0;
1196 
1197     DPRINTF("creating usbredirparser\n");
1198 
1199     dev->parser = qemu_oom_check(usbredirparser_create());
1200     dev->parser->priv = dev;
1201     dev->parser->log_func = usbredir_log;
1202     dev->parser->read_func = usbredir_read;
1203     dev->parser->write_func = usbredir_write;
1204     dev->parser->hello_func = usbredir_hello;
1205     dev->parser->device_connect_func = usbredir_device_connect;
1206     dev->parser->device_disconnect_func = usbredir_device_disconnect;
1207     dev->parser->interface_info_func = usbredir_interface_info;
1208     dev->parser->ep_info_func = usbredir_ep_info;
1209     dev->parser->configuration_status_func = usbredir_configuration_status;
1210     dev->parser->alt_setting_status_func = usbredir_alt_setting_status;
1211     dev->parser->iso_stream_status_func = usbredir_iso_stream_status;
1212     dev->parser->interrupt_receiving_status_func =
1213         usbredir_interrupt_receiving_status;
1214     dev->parser->bulk_streams_status_func = usbredir_bulk_streams_status;
1215     dev->parser->bulk_receiving_status_func = usbredir_bulk_receiving_status;
1216     dev->parser->control_packet_func = usbredir_control_packet;
1217     dev->parser->bulk_packet_func = usbredir_bulk_packet;
1218     dev->parser->iso_packet_func = usbredir_iso_packet;
1219     dev->parser->interrupt_packet_func = usbredir_interrupt_packet;
1220     dev->parser->buffered_bulk_packet_func = usbredir_buffered_bulk_packet;
1221     dev->read_buf = NULL;
1222     dev->read_buf_size = 0;
1223 
1224     usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version);
1225     usbredirparser_caps_set_cap(caps, usb_redir_cap_filter);
1226     usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_size);
1227     usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids);
1228     usbredirparser_caps_set_cap(caps, usb_redir_cap_32bits_bulk_length);
1229     usbredirparser_caps_set_cap(caps, usb_redir_cap_bulk_receiving);
1230 #if USBREDIR_VERSION >= 0x000700
1231     usbredirparser_caps_set_cap(caps, usb_redir_cap_bulk_streams);
1232 #endif
1233 
1234     if (runstate_check(RUN_STATE_INMIGRATE)) {
1235         flags |= usbredirparser_fl_no_hello;
1236     }
1237     usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE,
1238                         flags);
1239     usbredirparser_do_write(dev->parser);
1240 }
1241 
1242 static void usbredir_reject_device(USBRedirDevice *dev)
1243 {
1244     usbredir_device_disconnect(dev);
1245     if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter)) {
1246         usbredirparser_send_filter_reject(dev->parser);
1247         usbredirparser_do_write(dev->parser);
1248     }
1249 }
1250 
1251 /*
1252  * We may need to reject the device when the hcd calls alloc_streams, doing
1253  * an usb_detach from within a hcd call is not a good idea, hence this bh.
1254  */
1255 static void usbredir_device_reject_bh(void *opaque)
1256 {
1257     USBRedirDevice *dev = opaque;
1258 
1259     usbredir_reject_device(dev);
1260 }
1261 
1262 static void usbredir_do_attach(void *opaque)
1263 {
1264     USBRedirDevice *dev = opaque;
1265     Error *local_err = NULL;
1266 
1267     /* In order to work properly with XHCI controllers we need these caps */
1268     if ((dev->dev.port->speedmask & USB_SPEED_MASK_SUPER) && !(
1269         usbredirparser_peer_has_cap(dev->parser,
1270                                     usb_redir_cap_ep_info_max_packet_size) &&
1271         usbredirparser_peer_has_cap(dev->parser,
1272                                     usb_redir_cap_32bits_bulk_length) &&
1273         usbredirparser_peer_has_cap(dev->parser,
1274                                     usb_redir_cap_64bits_ids))) {
1275         ERROR("usb-redir-host lacks capabilities needed for use with XHCI\n");
1276         usbredir_reject_device(dev);
1277         return;
1278     }
1279 
1280     usb_device_attach(&dev->dev, &local_err);
1281     if (local_err) {
1282         error_report_err(local_err);
1283         WARNING("rejecting device due to speed mismatch\n");
1284         usbredir_reject_device(dev);
1285     }
1286 }
1287 
1288 /*
1289  * chardev callbacks
1290  */
1291 
1292 static int usbredir_chardev_can_read(void *opaque)
1293 {
1294     USBRedirDevice *dev = opaque;
1295 
1296     if (!dev->parser) {
1297         WARNING("chardev_can_read called on non open chardev!\n");
1298         return 0;
1299     }
1300 
1301     /* Don't read new data from the chardev until our state is fully synced */
1302     if (!runstate_check(RUN_STATE_RUNNING)) {
1303         return 0;
1304     }
1305 
1306     /* usbredir_parser_do_read will consume *all* data we give it */
1307     return 1024 * 1024;
1308 }
1309 
1310 static void usbredir_chardev_read(void *opaque, const uint8_t *buf, int size)
1311 {
1312     USBRedirDevice *dev = opaque;
1313 
1314     /* No recursion allowed! */
1315     assert(dev->read_buf == NULL);
1316 
1317     dev->read_buf = buf;
1318     dev->read_buf_size = size;
1319 
1320     usbredirparser_do_read(dev->parser);
1321     /* Send any acks, etc. which may be queued now */
1322     usbredirparser_do_write(dev->parser);
1323 }
1324 
1325 static void usbredir_chardev_event(void *opaque, int event)
1326 {
1327     USBRedirDevice *dev = opaque;
1328 
1329     switch (event) {
1330     case CHR_EVENT_OPENED:
1331         DPRINTF("chardev open\n");
1332         /* Make sure any pending closes are handled (no-op if none pending) */
1333         usbredir_chardev_close_bh(dev);
1334         qemu_bh_cancel(dev->chardev_close_bh);
1335         usbredir_create_parser(dev);
1336         break;
1337     case CHR_EVENT_CLOSED:
1338         DPRINTF("chardev close\n");
1339         qemu_bh_schedule(dev->chardev_close_bh);
1340         break;
1341     }
1342 }
1343 
1344 /*
1345  * init + destroy
1346  */
1347 
1348 static void usbredir_vm_state_change(void *priv, int running, RunState state)
1349 {
1350     USBRedirDevice *dev = priv;
1351 
1352     if (state == RUN_STATE_RUNNING && dev->parser != NULL) {
1353         usbredirparser_do_write(dev->parser); /* Flush any pending writes */
1354     }
1355 }
1356 
1357 static void usbredir_init_endpoints(USBRedirDevice *dev)
1358 {
1359     int i;
1360 
1361     usb_ep_init(&dev->dev);
1362     memset(dev->endpoint, 0, sizeof(dev->endpoint));
1363     for (i = 0; i < MAX_ENDPOINTS; i++) {
1364         dev->endpoint[i].dev = dev;
1365         QTAILQ_INIT(&dev->endpoint[i].bufpq);
1366     }
1367 }
1368 
1369 static void usbredir_realize(USBDevice *udev, Error **errp)
1370 {
1371     USBRedirDevice *dev = USB_REDIRECT(udev);
1372     int i;
1373 
1374     if (dev->cs == NULL) {
1375         error_setg(errp, QERR_MISSING_PARAMETER, "chardev");
1376         return;
1377     }
1378 
1379     if (dev->filter_str) {
1380         i = usbredirfilter_string_to_rules(dev->filter_str, ":", "|",
1381                                            &dev->filter_rules,
1382                                            &dev->filter_rules_count);
1383         if (i) {
1384             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "filter",
1385                        "a usb device filter string");
1386             return;
1387         }
1388     }
1389 
1390     dev->chardev_close_bh = qemu_bh_new(usbredir_chardev_close_bh, dev);
1391     dev->device_reject_bh = qemu_bh_new(usbredir_device_reject_bh, dev);
1392     dev->attach_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, usbredir_do_attach, dev);
1393 
1394     packet_id_queue_init(&dev->cancelled, dev, "cancelled");
1395     packet_id_queue_init(&dev->already_in_flight, dev, "already-in-flight");
1396     usbredir_init_endpoints(dev);
1397 
1398     /* We'll do the attach once we receive the speed from the usb-host */
1399     udev->auto_attach = 0;
1400 
1401     /* Will be cleared during setup when we find conflicts */
1402     dev->compatible_speedmask = USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH;
1403 
1404     /* Let the backend know we are ready */
1405     qemu_chr_add_handlers(dev->cs, usbredir_chardev_can_read,
1406                           usbredir_chardev_read, usbredir_chardev_event, dev);
1407 
1408     qemu_add_vm_change_state_handler(usbredir_vm_state_change, dev);
1409 }
1410 
1411 static void usbredir_cleanup_device_queues(USBRedirDevice *dev)
1412 {
1413     int i;
1414 
1415     packet_id_queue_empty(&dev->cancelled);
1416     packet_id_queue_empty(&dev->already_in_flight);
1417     for (i = 0; i < MAX_ENDPOINTS; i++) {
1418         usbredir_free_bufpq(dev, I2EP(i));
1419     }
1420 }
1421 
1422 static void usbredir_handle_destroy(USBDevice *udev)
1423 {
1424     USBRedirDevice *dev = USB_REDIRECT(udev);
1425 
1426     qemu_chr_delete(dev->cs);
1427     dev->cs = NULL;
1428     /* Note must be done after qemu_chr_close, as that causes a close event */
1429     qemu_bh_delete(dev->chardev_close_bh);
1430     qemu_bh_delete(dev->device_reject_bh);
1431 
1432     timer_del(dev->attach_timer);
1433     timer_free(dev->attach_timer);
1434 
1435     usbredir_cleanup_device_queues(dev);
1436 
1437     if (dev->parser) {
1438         usbredirparser_destroy(dev->parser);
1439     }
1440     if (dev->watch) {
1441         g_source_remove(dev->watch);
1442     }
1443 
1444     free(dev->filter_rules);
1445 }
1446 
1447 static int usbredir_check_filter(USBRedirDevice *dev)
1448 {
1449     if (dev->interface_info.interface_count == NO_INTERFACE_INFO) {
1450         ERROR("No interface info for device\n");
1451         goto error;
1452     }
1453 
1454     if (dev->filter_rules) {
1455         if (!usbredirparser_peer_has_cap(dev->parser,
1456                                     usb_redir_cap_connect_device_version)) {
1457             ERROR("Device filter specified and peer does not have the "
1458                   "connect_device_version capability\n");
1459             goto error;
1460         }
1461 
1462         if (usbredirfilter_check(
1463                 dev->filter_rules,
1464                 dev->filter_rules_count,
1465                 dev->device_info.device_class,
1466                 dev->device_info.device_subclass,
1467                 dev->device_info.device_protocol,
1468                 dev->interface_info.interface_class,
1469                 dev->interface_info.interface_subclass,
1470                 dev->interface_info.interface_protocol,
1471                 dev->interface_info.interface_count,
1472                 dev->device_info.vendor_id,
1473                 dev->device_info.product_id,
1474                 dev->device_info.device_version_bcd,
1475                 0) != 0) {
1476             goto error;
1477         }
1478     }
1479 
1480     return 0;
1481 
1482 error:
1483     usbredir_reject_device(dev);
1484     return -1;
1485 }
1486 
1487 static void usbredir_check_bulk_receiving(USBRedirDevice *dev)
1488 {
1489     int i, j, quirks;
1490 
1491     if (!usbredirparser_peer_has_cap(dev->parser,
1492                                      usb_redir_cap_bulk_receiving)) {
1493         return;
1494     }
1495 
1496     for (i = EP2I(USB_DIR_IN); i < MAX_ENDPOINTS; i++) {
1497         dev->endpoint[i].bulk_receiving_enabled = 0;
1498     }
1499     for (i = 0; i < dev->interface_info.interface_count; i++) {
1500         quirks = usb_get_quirks(dev->device_info.vendor_id,
1501                                 dev->device_info.product_id,
1502                                 dev->interface_info.interface_class[i],
1503                                 dev->interface_info.interface_subclass[i],
1504                                 dev->interface_info.interface_protocol[i]);
1505         if (!(quirks & USB_QUIRK_BUFFER_BULK_IN)) {
1506             continue;
1507         }
1508         if (quirks & USB_QUIRK_IS_FTDI) {
1509             dev->buffered_bulk_in_complete =
1510                 usbredir_buffered_bulk_in_complete_ftdi;
1511         } else {
1512             dev->buffered_bulk_in_complete =
1513                 usbredir_buffered_bulk_in_complete_raw;
1514         }
1515 
1516         for (j = EP2I(USB_DIR_IN); j < MAX_ENDPOINTS; j++) {
1517             if (dev->endpoint[j].interface ==
1518                                     dev->interface_info.interface[i] &&
1519                     dev->endpoint[j].type == USB_ENDPOINT_XFER_BULK &&
1520                     dev->endpoint[j].max_packet_size != 0) {
1521                 dev->endpoint[j].bulk_receiving_enabled = 1;
1522                 /*
1523                  * With buffering pipelining is not necessary. Also packet
1524                  * combining and bulk in buffering don't play nice together!
1525                  */
1526                 I2USBEP(dev, j)->pipeline = false;
1527                 break; /* Only buffer for the first ep of each intf */
1528             }
1529         }
1530     }
1531 }
1532 
1533 /*
1534  * usbredirparser packet complete callbacks
1535  */
1536 
1537 static void usbredir_handle_status(USBRedirDevice *dev, USBPacket *p,
1538     int status)
1539 {
1540     switch (status) {
1541     case usb_redir_success:
1542         p->status = USB_RET_SUCCESS; /* Clear previous ASYNC status */
1543         break;
1544     case usb_redir_stall:
1545         p->status = USB_RET_STALL;
1546         break;
1547     case usb_redir_cancelled:
1548         /*
1549          * When the usbredir-host unredirects a device, it will report a status
1550          * of cancelled for all pending packets, followed by a disconnect msg.
1551          */
1552         p->status = USB_RET_IOERROR;
1553         break;
1554     case usb_redir_inval:
1555         WARNING("got invalid param error from usb-host?\n");
1556         p->status = USB_RET_IOERROR;
1557         break;
1558     case usb_redir_babble:
1559         p->status = USB_RET_BABBLE;
1560         break;
1561     case usb_redir_ioerror:
1562     case usb_redir_timeout:
1563     default:
1564         p->status = USB_RET_IOERROR;
1565     }
1566 }
1567 
1568 static void usbredir_hello(void *priv, struct usb_redir_hello_header *h)
1569 {
1570     USBRedirDevice *dev = priv;
1571 
1572     /* Try to send the filter info now that we've the usb-host's caps */
1573     if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter) &&
1574             dev->filter_rules) {
1575         usbredirparser_send_filter_filter(dev->parser, dev->filter_rules,
1576                                           dev->filter_rules_count);
1577         usbredirparser_do_write(dev->parser);
1578     }
1579 }
1580 
1581 static void usbredir_device_connect(void *priv,
1582     struct usb_redir_device_connect_header *device_connect)
1583 {
1584     USBRedirDevice *dev = priv;
1585     const char *speed;
1586 
1587     if (timer_pending(dev->attach_timer) || dev->dev.attached) {
1588         ERROR("Received device connect while already connected\n");
1589         return;
1590     }
1591 
1592     switch (device_connect->speed) {
1593     case usb_redir_speed_low:
1594         speed = "low speed";
1595         dev->dev.speed = USB_SPEED_LOW;
1596         dev->compatible_speedmask &= ~USB_SPEED_MASK_FULL;
1597         dev->compatible_speedmask &= ~USB_SPEED_MASK_HIGH;
1598         break;
1599     case usb_redir_speed_full:
1600         speed = "full speed";
1601         dev->dev.speed = USB_SPEED_FULL;
1602         dev->compatible_speedmask &= ~USB_SPEED_MASK_HIGH;
1603         break;
1604     case usb_redir_speed_high:
1605         speed = "high speed";
1606         dev->dev.speed = USB_SPEED_HIGH;
1607         break;
1608     case usb_redir_speed_super:
1609         speed = "super speed";
1610         dev->dev.speed = USB_SPEED_SUPER;
1611         break;
1612     default:
1613         speed = "unknown speed";
1614         dev->dev.speed = USB_SPEED_FULL;
1615     }
1616 
1617     if (usbredirparser_peer_has_cap(dev->parser,
1618                                     usb_redir_cap_connect_device_version)) {
1619         INFO("attaching %s device %04x:%04x version %d.%d class %02x\n",
1620              speed, device_connect->vendor_id, device_connect->product_id,
1621              ((device_connect->device_version_bcd & 0xf000) >> 12) * 10 +
1622              ((device_connect->device_version_bcd & 0x0f00) >>  8),
1623              ((device_connect->device_version_bcd & 0x00f0) >>  4) * 10 +
1624              ((device_connect->device_version_bcd & 0x000f) >>  0),
1625              device_connect->device_class);
1626     } else {
1627         INFO("attaching %s device %04x:%04x class %02x\n", speed,
1628              device_connect->vendor_id, device_connect->product_id,
1629              device_connect->device_class);
1630     }
1631 
1632     dev->dev.speedmask = (1 << dev->dev.speed) | dev->compatible_speedmask;
1633     dev->device_info = *device_connect;
1634 
1635     if (usbredir_check_filter(dev)) {
1636         WARNING("Device %04x:%04x rejected by device filter, not attaching\n",
1637                 device_connect->vendor_id, device_connect->product_id);
1638         return;
1639     }
1640 
1641     usbredir_check_bulk_receiving(dev);
1642     timer_mod(dev->attach_timer, dev->next_attach_time);
1643 }
1644 
1645 static void usbredir_device_disconnect(void *priv)
1646 {
1647     USBRedirDevice *dev = priv;
1648 
1649     /* Stop any pending attaches */
1650     timer_del(dev->attach_timer);
1651 
1652     if (dev->dev.attached) {
1653         DPRINTF("detaching device\n");
1654         usb_device_detach(&dev->dev);
1655         /*
1656          * Delay next usb device attach to give the guest a chance to see
1657          * see the detach / attach in case of quick close / open succession
1658          */
1659         dev->next_attach_time = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 200;
1660     }
1661 
1662     /* Reset state so that the next dev connected starts with a clean slate */
1663     usbredir_cleanup_device_queues(dev);
1664     usbredir_init_endpoints(dev);
1665     dev->interface_info.interface_count = NO_INTERFACE_INFO;
1666     dev->dev.addr = 0;
1667     dev->dev.speed = 0;
1668     dev->compatible_speedmask = USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH;
1669 }
1670 
1671 static void usbredir_interface_info(void *priv,
1672     struct usb_redir_interface_info_header *interface_info)
1673 {
1674     USBRedirDevice *dev = priv;
1675 
1676     dev->interface_info = *interface_info;
1677 
1678     /*
1679      * If we receive interface info after the device has already been
1680      * connected (ie on a set_config), re-check interface dependent things.
1681      */
1682     if (timer_pending(dev->attach_timer) || dev->dev.attached) {
1683         usbredir_check_bulk_receiving(dev);
1684         if (usbredir_check_filter(dev)) {
1685             ERROR("Device no longer matches filter after interface info "
1686                   "change, disconnecting!\n");
1687         }
1688     }
1689 }
1690 
1691 static void usbredir_mark_speed_incompatible(USBRedirDevice *dev, int speed)
1692 {
1693     dev->compatible_speedmask &= ~(1 << speed);
1694     dev->dev.speedmask = (1 << dev->dev.speed) | dev->compatible_speedmask;
1695 }
1696 
1697 static void usbredir_set_pipeline(USBRedirDevice *dev, struct USBEndpoint *uep)
1698 {
1699     if (uep->type != USB_ENDPOINT_XFER_BULK) {
1700         return;
1701     }
1702     if (uep->pid == USB_TOKEN_OUT) {
1703         uep->pipeline = true;
1704     }
1705     if (uep->pid == USB_TOKEN_IN && uep->max_packet_size != 0 &&
1706         usbredirparser_peer_has_cap(dev->parser,
1707                                     usb_redir_cap_32bits_bulk_length)) {
1708         uep->pipeline = true;
1709     }
1710 }
1711 
1712 static void usbredir_setup_usb_eps(USBRedirDevice *dev)
1713 {
1714     struct USBEndpoint *usb_ep;
1715     int i;
1716 
1717     for (i = 0; i < MAX_ENDPOINTS; i++) {
1718         usb_ep = I2USBEP(dev, i);
1719         usb_ep->type = dev->endpoint[i].type;
1720         usb_ep->ifnum = dev->endpoint[i].interface;
1721         usb_ep->max_packet_size = dev->endpoint[i].max_packet_size;
1722         usb_ep->max_streams = dev->endpoint[i].max_streams;
1723         usbredir_set_pipeline(dev, usb_ep);
1724     }
1725 }
1726 
1727 static void usbredir_ep_info(void *priv,
1728     struct usb_redir_ep_info_header *ep_info)
1729 {
1730     USBRedirDevice *dev = priv;
1731     int i;
1732 
1733     for (i = 0; i < MAX_ENDPOINTS; i++) {
1734         dev->endpoint[i].type = ep_info->type[i];
1735         dev->endpoint[i].interval = ep_info->interval[i];
1736         dev->endpoint[i].interface = ep_info->interface[i];
1737         if (usbredirparser_peer_has_cap(dev->parser,
1738                                      usb_redir_cap_ep_info_max_packet_size)) {
1739             dev->endpoint[i].max_packet_size = ep_info->max_packet_size[i];
1740         }
1741 #if USBREDIR_VERSION >= 0x000700
1742         if (usbredirparser_peer_has_cap(dev->parser,
1743                                         usb_redir_cap_bulk_streams)) {
1744             dev->endpoint[i].max_streams = ep_info->max_streams[i];
1745         }
1746 #endif
1747         switch (dev->endpoint[i].type) {
1748         case usb_redir_type_invalid:
1749             break;
1750         case usb_redir_type_iso:
1751             usbredir_mark_speed_incompatible(dev, USB_SPEED_FULL);
1752             usbredir_mark_speed_incompatible(dev, USB_SPEED_HIGH);
1753             /* Fall through */
1754         case usb_redir_type_interrupt:
1755             if (!usbredirparser_peer_has_cap(dev->parser,
1756                                      usb_redir_cap_ep_info_max_packet_size) ||
1757                     ep_info->max_packet_size[i] > 64) {
1758                 usbredir_mark_speed_incompatible(dev, USB_SPEED_FULL);
1759             }
1760             if (!usbredirparser_peer_has_cap(dev->parser,
1761                                      usb_redir_cap_ep_info_max_packet_size) ||
1762                     ep_info->max_packet_size[i] > 1024) {
1763                 usbredir_mark_speed_incompatible(dev, USB_SPEED_HIGH);
1764             }
1765             if (dev->endpoint[i].interval == 0) {
1766                 ERROR("Received 0 interval for isoc or irq endpoint\n");
1767                 usbredir_reject_device(dev);
1768                 return;
1769             }
1770             /* Fall through */
1771         case usb_redir_type_control:
1772         case usb_redir_type_bulk:
1773             DPRINTF("ep: %02X type: %d interface: %d\n", I2EP(i),
1774                     dev->endpoint[i].type, dev->endpoint[i].interface);
1775             break;
1776         default:
1777             ERROR("Received invalid endpoint type\n");
1778             usbredir_reject_device(dev);
1779             return;
1780         }
1781     }
1782     /* The new ep info may have caused a speed incompatibility, recheck */
1783     if (dev->dev.attached &&
1784             !(dev->dev.port->speedmask & dev->dev.speedmask)) {
1785         ERROR("Device no longer matches speed after endpoint info change, "
1786               "disconnecting!\n");
1787         usbredir_reject_device(dev);
1788         return;
1789     }
1790     usbredir_setup_usb_eps(dev);
1791     usbredir_check_bulk_receiving(dev);
1792 }
1793 
1794 static void usbredir_configuration_status(void *priv, uint64_t id,
1795     struct usb_redir_configuration_status_header *config_status)
1796 {
1797     USBRedirDevice *dev = priv;
1798     USBPacket *p;
1799 
1800     DPRINTF("set config status %d config %d id %"PRIu64"\n",
1801             config_status->status, config_status->configuration, id);
1802 
1803     p = usbredir_find_packet_by_id(dev, 0, id);
1804     if (p) {
1805         if (dev->dev.setup_buf[0] & USB_DIR_IN) {
1806             dev->dev.data_buf[0] = config_status->configuration;
1807             p->actual_length = 1;
1808         }
1809         usbredir_handle_status(dev, p, config_status->status);
1810         usb_generic_async_ctrl_complete(&dev->dev, p);
1811     }
1812 }
1813 
1814 static void usbredir_alt_setting_status(void *priv, uint64_t id,
1815     struct usb_redir_alt_setting_status_header *alt_setting_status)
1816 {
1817     USBRedirDevice *dev = priv;
1818     USBPacket *p;
1819 
1820     DPRINTF("alt status %d intf %d alt %d id: %"PRIu64"\n",
1821             alt_setting_status->status, alt_setting_status->interface,
1822             alt_setting_status->alt, id);
1823 
1824     p = usbredir_find_packet_by_id(dev, 0, id);
1825     if (p) {
1826         if (dev->dev.setup_buf[0] & USB_DIR_IN) {
1827             dev->dev.data_buf[0] = alt_setting_status->alt;
1828             p->actual_length = 1;
1829         }
1830         usbredir_handle_status(dev, p, alt_setting_status->status);
1831         usb_generic_async_ctrl_complete(&dev->dev, p);
1832     }
1833 }
1834 
1835 static void usbredir_iso_stream_status(void *priv, uint64_t id,
1836     struct usb_redir_iso_stream_status_header *iso_stream_status)
1837 {
1838     USBRedirDevice *dev = priv;
1839     uint8_t ep = iso_stream_status->endpoint;
1840 
1841     DPRINTF("iso status %d ep %02X id %"PRIu64"\n", iso_stream_status->status,
1842             ep, id);
1843 
1844     if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].iso_started) {
1845         return;
1846     }
1847 
1848     dev->endpoint[EP2I(ep)].iso_error = iso_stream_status->status;
1849     if (iso_stream_status->status == usb_redir_stall) {
1850         DPRINTF("iso stream stopped by peer ep %02X\n", ep);
1851         dev->endpoint[EP2I(ep)].iso_started = 0;
1852     }
1853 }
1854 
1855 static void usbredir_interrupt_receiving_status(void *priv, uint64_t id,
1856     struct usb_redir_interrupt_receiving_status_header
1857     *interrupt_receiving_status)
1858 {
1859     USBRedirDevice *dev = priv;
1860     uint8_t ep = interrupt_receiving_status->endpoint;
1861 
1862     DPRINTF("interrupt recv status %d ep %02X id %"PRIu64"\n",
1863             interrupt_receiving_status->status, ep, id);
1864 
1865     if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].interrupt_started) {
1866         return;
1867     }
1868 
1869     dev->endpoint[EP2I(ep)].interrupt_error =
1870         interrupt_receiving_status->status;
1871     if (interrupt_receiving_status->status == usb_redir_stall) {
1872         DPRINTF("interrupt receiving stopped by peer ep %02X\n", ep);
1873         dev->endpoint[EP2I(ep)].interrupt_started = 0;
1874     }
1875 }
1876 
1877 static void usbredir_bulk_streams_status(void *priv, uint64_t id,
1878     struct usb_redir_bulk_streams_status_header *bulk_streams_status)
1879 {
1880 #if USBREDIR_VERSION >= 0x000700
1881     USBRedirDevice *dev = priv;
1882 
1883     if (bulk_streams_status->status == usb_redir_success) {
1884         DPRINTF("bulk streams status %d eps %08x\n",
1885                 bulk_streams_status->status, bulk_streams_status->endpoints);
1886     } else {
1887         ERROR("bulk streams %s failed status %d eps %08x\n",
1888               (bulk_streams_status->no_streams == 0) ? "free" : "alloc",
1889               bulk_streams_status->status, bulk_streams_status->endpoints);
1890         ERROR("usb-redir-host does not provide streams, disconnecting\n");
1891         usbredir_reject_device(dev);
1892     }
1893 #endif
1894 }
1895 
1896 static void usbredir_bulk_receiving_status(void *priv, uint64_t id,
1897     struct usb_redir_bulk_receiving_status_header *bulk_receiving_status)
1898 {
1899     USBRedirDevice *dev = priv;
1900     uint8_t ep = bulk_receiving_status->endpoint;
1901 
1902     DPRINTF("bulk recv status %d ep %02X id %"PRIu64"\n",
1903             bulk_receiving_status->status, ep, id);
1904 
1905     if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].bulk_receiving_started) {
1906         return;
1907     }
1908 
1909     if (bulk_receiving_status->status == usb_redir_stall) {
1910         DPRINTF("bulk receiving stopped by peer ep %02X\n", ep);
1911         dev->endpoint[EP2I(ep)].bulk_receiving_started = 0;
1912     }
1913 }
1914 
1915 static void usbredir_control_packet(void *priv, uint64_t id,
1916     struct usb_redir_control_packet_header *control_packet,
1917     uint8_t *data, int data_len)
1918 {
1919     USBRedirDevice *dev = priv;
1920     USBPacket *p;
1921     int len = control_packet->length;
1922 
1923     DPRINTF("ctrl-in status %d len %d id %"PRIu64"\n", control_packet->status,
1924             len, id);
1925 
1926     /* Fix up USB-3 ep0 maxpacket size to allow superspeed connected devices
1927      * to work redirected to a not superspeed capable hcd */
1928     if (dev->dev.speed == USB_SPEED_SUPER &&
1929             !((dev->dev.port->speedmask & USB_SPEED_MASK_SUPER)) &&
1930             control_packet->requesttype == 0x80 &&
1931             control_packet->request == 6 &&
1932             control_packet->value == 0x100 && control_packet->index == 0 &&
1933             data_len >= 18 && data[7] == 9) {
1934         data[7] = 64;
1935     }
1936 
1937     p = usbredir_find_packet_by_id(dev, 0, id);
1938     if (p) {
1939         usbredir_handle_status(dev, p, control_packet->status);
1940         if (data_len > 0) {
1941             usbredir_log_data(dev, "ctrl data in:", data, data_len);
1942             if (data_len > sizeof(dev->dev.data_buf)) {
1943                 ERROR("ctrl buffer too small (%d > %zu)\n",
1944                       data_len, sizeof(dev->dev.data_buf));
1945                 p->status = USB_RET_STALL;
1946                 data_len = len = sizeof(dev->dev.data_buf);
1947             }
1948             memcpy(dev->dev.data_buf, data, data_len);
1949         }
1950         p->actual_length = len;
1951         usb_generic_async_ctrl_complete(&dev->dev, p);
1952     }
1953     free(data);
1954 }
1955 
1956 static void usbredir_bulk_packet(void *priv, uint64_t id,
1957     struct usb_redir_bulk_packet_header *bulk_packet,
1958     uint8_t *data, int data_len)
1959 {
1960     USBRedirDevice *dev = priv;
1961     uint8_t ep = bulk_packet->endpoint;
1962     int len = (bulk_packet->length_high << 16) | bulk_packet->length;
1963     USBPacket *p;
1964 
1965     DPRINTF("bulk-in status %d ep %02X stream %u len %d id %"PRIu64"\n",
1966             bulk_packet->status, ep, bulk_packet->stream_id, len, id);
1967 
1968     p = usbredir_find_packet_by_id(dev, ep, id);
1969     if (p) {
1970         size_t size = usb_packet_size(p);
1971         usbredir_handle_status(dev, p, bulk_packet->status);
1972         if (data_len > 0) {
1973             usbredir_log_data(dev, "bulk data in:", data, data_len);
1974             if (data_len > size) {
1975                 ERROR("bulk got more data then requested (%d > %zd)\n",
1976                       data_len, p->iov.size);
1977                 p->status = USB_RET_BABBLE;
1978                 data_len = len = size;
1979             }
1980             usb_packet_copy(p, data, data_len);
1981         }
1982         p->actual_length = len;
1983         if (p->pid == USB_TOKEN_IN && p->ep->pipeline) {
1984             usb_combined_input_packet_complete(&dev->dev, p);
1985         } else {
1986             usb_packet_complete(&dev->dev, p);
1987         }
1988     }
1989     free(data);
1990 }
1991 
1992 static void usbredir_iso_packet(void *priv, uint64_t id,
1993     struct usb_redir_iso_packet_header *iso_packet,
1994     uint8_t *data, int data_len)
1995 {
1996     USBRedirDevice *dev = priv;
1997     uint8_t ep = iso_packet->endpoint;
1998 
1999     DPRINTF2("iso-in status %d ep %02X len %d id %"PRIu64"\n",
2000              iso_packet->status, ep, data_len, id);
2001 
2002     if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_ISOC) {
2003         ERROR("received iso packet for non iso endpoint %02X\n", ep);
2004         free(data);
2005         return;
2006     }
2007 
2008     if (dev->endpoint[EP2I(ep)].iso_started == 0) {
2009         DPRINTF("received iso packet for non started stream ep %02X\n", ep);
2010         free(data);
2011         return;
2012     }
2013 
2014     /* bufp_alloc also adds the packet to the ep queue */
2015     bufp_alloc(dev, data, data_len, iso_packet->status, ep, data);
2016 }
2017 
2018 static void usbredir_interrupt_packet(void *priv, uint64_t id,
2019     struct usb_redir_interrupt_packet_header *interrupt_packet,
2020     uint8_t *data, int data_len)
2021 {
2022     USBRedirDevice *dev = priv;
2023     uint8_t ep = interrupt_packet->endpoint;
2024 
2025     DPRINTF("interrupt-in status %d ep %02X len %d id %"PRIu64"\n",
2026             interrupt_packet->status, ep, data_len, id);
2027 
2028     if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_INT) {
2029         ERROR("received int packet for non interrupt endpoint %02X\n", ep);
2030         free(data);
2031         return;
2032     }
2033 
2034     if (ep & USB_DIR_IN) {
2035         if (dev->endpoint[EP2I(ep)].interrupt_started == 0) {
2036             DPRINTF("received int packet while not started ep %02X\n", ep);
2037             free(data);
2038             return;
2039         }
2040 
2041         if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) {
2042             usb_wakeup(usb_ep_get(&dev->dev, USB_TOKEN_IN, ep & 0x0f), 0);
2043         }
2044 
2045         /* bufp_alloc also adds the packet to the ep queue */
2046         bufp_alloc(dev, data, data_len, interrupt_packet->status, ep, data);
2047     } else {
2048         /*
2049          * We report output interrupt packets as completed directly upon
2050          * submission, so all we can do here if one failed is warn.
2051          */
2052         if (interrupt_packet->status) {
2053             WARNING("interrupt output failed status %d ep %02X id %"PRIu64"\n",
2054                     interrupt_packet->status, ep, id);
2055         }
2056     }
2057 }
2058 
2059 static void usbredir_buffered_bulk_packet(void *priv, uint64_t id,
2060     struct usb_redir_buffered_bulk_packet_header *buffered_bulk_packet,
2061     uint8_t *data, int data_len)
2062 {
2063     USBRedirDevice *dev = priv;
2064     uint8_t status, ep = buffered_bulk_packet->endpoint;
2065     void *free_on_destroy;
2066     int i, len;
2067 
2068     DPRINTF("buffered-bulk-in status %d ep %02X len %d id %"PRIu64"\n",
2069             buffered_bulk_packet->status, ep, data_len, id);
2070 
2071     if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_BULK) {
2072         ERROR("received buffered-bulk packet for non bulk ep %02X\n", ep);
2073         free(data);
2074         return;
2075     }
2076 
2077     if (dev->endpoint[EP2I(ep)].bulk_receiving_started == 0) {
2078         DPRINTF("received buffered-bulk packet on not started ep %02X\n", ep);
2079         free(data);
2080         return;
2081     }
2082 
2083     /* Data must be in maxp chunks for buffered_bulk_add_*_data_to_packet */
2084     len = dev->endpoint[EP2I(ep)].max_packet_size;
2085     status = usb_redir_success;
2086     free_on_destroy = NULL;
2087     for (i = 0; i < data_len; i += len) {
2088         int r;
2089         if (len >= (data_len - i)) {
2090             len = data_len - i;
2091             status = buffered_bulk_packet->status;
2092             free_on_destroy = data;
2093         }
2094         /* bufp_alloc also adds the packet to the ep queue */
2095         r = bufp_alloc(dev, data + i, len, status, ep, free_on_destroy);
2096         if (r) {
2097             break;
2098         }
2099     }
2100 
2101     if (dev->endpoint[EP2I(ep)].pending_async_packet) {
2102         USBPacket *p = dev->endpoint[EP2I(ep)].pending_async_packet;
2103         dev->endpoint[EP2I(ep)].pending_async_packet = NULL;
2104         usbredir_buffered_bulk_in_complete(dev, p, ep);
2105         usb_packet_complete(&dev->dev, p);
2106     }
2107 }
2108 
2109 /*
2110  * Migration code
2111  */
2112 
2113 static void usbredir_pre_save(void *priv)
2114 {
2115     USBRedirDevice *dev = priv;
2116 
2117     usbredir_fill_already_in_flight(dev);
2118 }
2119 
2120 static int usbredir_post_load(void *priv, int version_id)
2121 {
2122     USBRedirDevice *dev = priv;
2123 
2124     if (dev->parser == NULL) {
2125         return 0;
2126     }
2127 
2128     switch (dev->device_info.speed) {
2129     case usb_redir_speed_low:
2130         dev->dev.speed = USB_SPEED_LOW;
2131         break;
2132     case usb_redir_speed_full:
2133         dev->dev.speed = USB_SPEED_FULL;
2134         break;
2135     case usb_redir_speed_high:
2136         dev->dev.speed = USB_SPEED_HIGH;
2137         break;
2138     case usb_redir_speed_super:
2139         dev->dev.speed = USB_SPEED_SUPER;
2140         break;
2141     default:
2142         dev->dev.speed = USB_SPEED_FULL;
2143     }
2144     dev->dev.speedmask = (1 << dev->dev.speed);
2145 
2146     usbredir_setup_usb_eps(dev);
2147     usbredir_check_bulk_receiving(dev);
2148 
2149     return 0;
2150 }
2151 
2152 /* For usbredirparser migration */
2153 static void usbredir_put_parser(QEMUFile *f, void *priv, size_t unused)
2154 {
2155     USBRedirDevice *dev = priv;
2156     uint8_t *data;
2157     int len;
2158 
2159     if (dev->parser == NULL) {
2160         qemu_put_be32(f, 0);
2161         return;
2162     }
2163 
2164     usbredirparser_serialize(dev->parser, &data, &len);
2165     qemu_oom_check(data);
2166 
2167     qemu_put_be32(f, len);
2168     qemu_put_buffer(f, data, len);
2169 
2170     free(data);
2171 }
2172 
2173 static int usbredir_get_parser(QEMUFile *f, void *priv, size_t unused)
2174 {
2175     USBRedirDevice *dev = priv;
2176     uint8_t *data;
2177     int len, ret;
2178 
2179     len = qemu_get_be32(f);
2180     if (len == 0) {
2181         return 0;
2182     }
2183 
2184     /*
2185      * If our chardev is not open already at this point the usbredir connection
2186      * has been broken (non seamless migration, or restore from disk).
2187      *
2188      * In this case create a temporary parser to receive the migration data,
2189      * and schedule the close_bh to report the device as disconnected to the
2190      * guest and to destroy the parser again.
2191      */
2192     if (dev->parser == NULL) {
2193         WARNING("usb-redir connection broken during migration\n");
2194         usbredir_create_parser(dev);
2195         qemu_bh_schedule(dev->chardev_close_bh);
2196     }
2197 
2198     data = g_malloc(len);
2199     qemu_get_buffer(f, data, len);
2200 
2201     ret = usbredirparser_unserialize(dev->parser, data, len);
2202 
2203     g_free(data);
2204 
2205     return ret;
2206 }
2207 
2208 static const VMStateInfo usbredir_parser_vmstate_info = {
2209     .name = "usb-redir-parser",
2210     .put  = usbredir_put_parser,
2211     .get  = usbredir_get_parser,
2212 };
2213 
2214 
2215 /* For buffered packets (iso/irq) queue migration */
2216 static void usbredir_put_bufpq(QEMUFile *f, void *priv, size_t unused)
2217 {
2218     struct endp_data *endp = priv;
2219     USBRedirDevice *dev = endp->dev;
2220     struct buf_packet *bufp;
2221     int len, i = 0;
2222 
2223     qemu_put_be32(f, endp->bufpq_size);
2224     QTAILQ_FOREACH(bufp, &endp->bufpq, next) {
2225         len = bufp->len - bufp->offset;
2226         DPRINTF("put_bufpq %d/%d len %d status %d\n", i + 1, endp->bufpq_size,
2227                 len, bufp->status);
2228         qemu_put_be32(f, len);
2229         qemu_put_be32(f, bufp->status);
2230         qemu_put_buffer(f, bufp->data + bufp->offset, len);
2231         i++;
2232     }
2233     assert(i == endp->bufpq_size);
2234 }
2235 
2236 static int usbredir_get_bufpq(QEMUFile *f, void *priv, size_t unused)
2237 {
2238     struct endp_data *endp = priv;
2239     USBRedirDevice *dev = endp->dev;
2240     struct buf_packet *bufp;
2241     int i;
2242 
2243     endp->bufpq_size = qemu_get_be32(f);
2244     for (i = 0; i < endp->bufpq_size; i++) {
2245         bufp = g_new(struct buf_packet, 1);
2246         bufp->len = qemu_get_be32(f);
2247         bufp->status = qemu_get_be32(f);
2248         bufp->offset = 0;
2249         bufp->data = qemu_oom_check(malloc(bufp->len)); /* regular malloc! */
2250         bufp->free_on_destroy = bufp->data;
2251         qemu_get_buffer(f, bufp->data, bufp->len);
2252         QTAILQ_INSERT_TAIL(&endp->bufpq, bufp, next);
2253         DPRINTF("get_bufpq %d/%d len %d status %d\n", i + 1, endp->bufpq_size,
2254                 bufp->len, bufp->status);
2255     }
2256     return 0;
2257 }
2258 
2259 static const VMStateInfo usbredir_ep_bufpq_vmstate_info = {
2260     .name = "usb-redir-bufpq",
2261     .put  = usbredir_put_bufpq,
2262     .get  = usbredir_get_bufpq,
2263 };
2264 
2265 
2266 /* For endp_data migration */
2267 static bool usbredir_bulk_receiving_needed(void *priv)
2268 {
2269     struct endp_data *endp = priv;
2270 
2271     return endp->bulk_receiving_started;
2272 }
2273 
2274 static const VMStateDescription usbredir_bulk_receiving_vmstate = {
2275     .name = "usb-redir-ep/bulk-receiving",
2276     .version_id = 1,
2277     .minimum_version_id = 1,
2278     .needed = usbredir_bulk_receiving_needed,
2279     .fields = (VMStateField[]) {
2280         VMSTATE_UINT8(bulk_receiving_started, struct endp_data),
2281         VMSTATE_END_OF_LIST()
2282     }
2283 };
2284 
2285 static bool usbredir_stream_needed(void *priv)
2286 {
2287     struct endp_data *endp = priv;
2288 
2289     return endp->max_streams;
2290 }
2291 
2292 static const VMStateDescription usbredir_stream_vmstate = {
2293     .name = "usb-redir-ep/stream-state",
2294     .version_id = 1,
2295     .minimum_version_id = 1,
2296     .needed = usbredir_stream_needed,
2297     .fields = (VMStateField[]) {
2298         VMSTATE_UINT32(max_streams, struct endp_data),
2299         VMSTATE_END_OF_LIST()
2300     }
2301 };
2302 
2303 static const VMStateDescription usbredir_ep_vmstate = {
2304     .name = "usb-redir-ep",
2305     .version_id = 1,
2306     .minimum_version_id = 1,
2307     .fields = (VMStateField[]) {
2308         VMSTATE_UINT8(type, struct endp_data),
2309         VMSTATE_UINT8(interval, struct endp_data),
2310         VMSTATE_UINT8(interface, struct endp_data),
2311         VMSTATE_UINT16(max_packet_size, struct endp_data),
2312         VMSTATE_UINT8(iso_started, struct endp_data),
2313         VMSTATE_UINT8(iso_error, struct endp_data),
2314         VMSTATE_UINT8(interrupt_started, struct endp_data),
2315         VMSTATE_UINT8(interrupt_error, struct endp_data),
2316         VMSTATE_UINT8(bufpq_prefilled, struct endp_data),
2317         VMSTATE_UINT8(bufpq_dropping_packets, struct endp_data),
2318         {
2319             .name         = "bufpq",
2320             .version_id   = 0,
2321             .field_exists = NULL,
2322             .size         = 0,
2323             .info         = &usbredir_ep_bufpq_vmstate_info,
2324             .flags        = VMS_SINGLE,
2325             .offset       = 0,
2326         },
2327         VMSTATE_INT32(bufpq_target_size, struct endp_data),
2328         VMSTATE_END_OF_LIST()
2329     },
2330     .subsections = (const VMStateDescription*[]) {
2331         &usbredir_bulk_receiving_vmstate,
2332         &usbredir_stream_vmstate,
2333         NULL
2334     }
2335 };
2336 
2337 
2338 /* For PacketIdQueue migration */
2339 static void usbredir_put_packet_id_q(QEMUFile *f, void *priv, size_t unused)
2340 {
2341     struct PacketIdQueue *q = priv;
2342     USBRedirDevice *dev = q->dev;
2343     struct PacketIdQueueEntry *e;
2344     int remain = q->size;
2345 
2346     DPRINTF("put_packet_id_q %s size %d\n", q->name, q->size);
2347     qemu_put_be32(f, q->size);
2348     QTAILQ_FOREACH(e, &q->head, next) {
2349         qemu_put_be64(f, e->id);
2350         remain--;
2351     }
2352     assert(remain == 0);
2353 }
2354 
2355 static int usbredir_get_packet_id_q(QEMUFile *f, void *priv, size_t unused)
2356 {
2357     struct PacketIdQueue *q = priv;
2358     USBRedirDevice *dev = q->dev;
2359     int i, size;
2360     uint64_t id;
2361 
2362     size = qemu_get_be32(f);
2363     DPRINTF("get_packet_id_q %s size %d\n", q->name, size);
2364     for (i = 0; i < size; i++) {
2365         id = qemu_get_be64(f);
2366         packet_id_queue_add(q, id);
2367     }
2368     assert(q->size == size);
2369     return 0;
2370 }
2371 
2372 static const VMStateInfo usbredir_ep_packet_id_q_vmstate_info = {
2373     .name = "usb-redir-packet-id-q",
2374     .put  = usbredir_put_packet_id_q,
2375     .get  = usbredir_get_packet_id_q,
2376 };
2377 
2378 static const VMStateDescription usbredir_ep_packet_id_queue_vmstate = {
2379     .name = "usb-redir-packet-id-queue",
2380     .version_id = 1,
2381     .minimum_version_id = 1,
2382     .fields = (VMStateField[]) {
2383         {
2384             .name         = "queue",
2385             .version_id   = 0,
2386             .field_exists = NULL,
2387             .size         = 0,
2388             .info         = &usbredir_ep_packet_id_q_vmstate_info,
2389             .flags        = VMS_SINGLE,
2390             .offset       = 0,
2391         },
2392         VMSTATE_END_OF_LIST()
2393     }
2394 };
2395 
2396 
2397 /* For usb_redir_device_connect_header migration */
2398 static const VMStateDescription usbredir_device_info_vmstate = {
2399     .name = "usb-redir-device-info",
2400     .version_id = 1,
2401     .minimum_version_id = 1,
2402     .fields = (VMStateField[]) {
2403         VMSTATE_UINT8(speed, struct usb_redir_device_connect_header),
2404         VMSTATE_UINT8(device_class, struct usb_redir_device_connect_header),
2405         VMSTATE_UINT8(device_subclass, struct usb_redir_device_connect_header),
2406         VMSTATE_UINT8(device_protocol, struct usb_redir_device_connect_header),
2407         VMSTATE_UINT16(vendor_id, struct usb_redir_device_connect_header),
2408         VMSTATE_UINT16(product_id, struct usb_redir_device_connect_header),
2409         VMSTATE_UINT16(device_version_bcd,
2410                        struct usb_redir_device_connect_header),
2411         VMSTATE_END_OF_LIST()
2412     }
2413 };
2414 
2415 
2416 /* For usb_redir_interface_info_header migration */
2417 static const VMStateDescription usbredir_interface_info_vmstate = {
2418     .name = "usb-redir-interface-info",
2419     .version_id = 1,
2420     .minimum_version_id = 1,
2421     .fields = (VMStateField[]) {
2422         VMSTATE_UINT32(interface_count,
2423                        struct usb_redir_interface_info_header),
2424         VMSTATE_UINT8_ARRAY(interface,
2425                             struct usb_redir_interface_info_header, 32),
2426         VMSTATE_UINT8_ARRAY(interface_class,
2427                             struct usb_redir_interface_info_header, 32),
2428         VMSTATE_UINT8_ARRAY(interface_subclass,
2429                             struct usb_redir_interface_info_header, 32),
2430         VMSTATE_UINT8_ARRAY(interface_protocol,
2431                             struct usb_redir_interface_info_header, 32),
2432         VMSTATE_END_OF_LIST()
2433     }
2434 };
2435 
2436 
2437 /* And finally the USBRedirDevice vmstate itself */
2438 static const VMStateDescription usbredir_vmstate = {
2439     .name = "usb-redir",
2440     .version_id = 1,
2441     .minimum_version_id = 1,
2442     .pre_save = usbredir_pre_save,
2443     .post_load = usbredir_post_load,
2444     .fields = (VMStateField[]) {
2445         VMSTATE_USB_DEVICE(dev, USBRedirDevice),
2446         VMSTATE_TIMER_PTR(attach_timer, USBRedirDevice),
2447         {
2448             .name         = "parser",
2449             .version_id   = 0,
2450             .field_exists = NULL,
2451             .size         = 0,
2452             .info         = &usbredir_parser_vmstate_info,
2453             .flags        = VMS_SINGLE,
2454             .offset       = 0,
2455         },
2456         VMSTATE_STRUCT_ARRAY(endpoint, USBRedirDevice, MAX_ENDPOINTS, 1,
2457                              usbredir_ep_vmstate, struct endp_data),
2458         VMSTATE_STRUCT(cancelled, USBRedirDevice, 1,
2459                        usbredir_ep_packet_id_queue_vmstate,
2460                        struct PacketIdQueue),
2461         VMSTATE_STRUCT(already_in_flight, USBRedirDevice, 1,
2462                        usbredir_ep_packet_id_queue_vmstate,
2463                        struct PacketIdQueue),
2464         VMSTATE_STRUCT(device_info, USBRedirDevice, 1,
2465                        usbredir_device_info_vmstate,
2466                        struct usb_redir_device_connect_header),
2467         VMSTATE_STRUCT(interface_info, USBRedirDevice, 1,
2468                        usbredir_interface_info_vmstate,
2469                        struct usb_redir_interface_info_header),
2470         VMSTATE_END_OF_LIST()
2471     }
2472 };
2473 
2474 static Property usbredir_properties[] = {
2475     DEFINE_PROP_CHR("chardev", USBRedirDevice, cs),
2476     DEFINE_PROP_UINT8("debug", USBRedirDevice, debug, usbredirparser_warning),
2477     DEFINE_PROP_STRING("filter", USBRedirDevice, filter_str),
2478     DEFINE_PROP_END_OF_LIST(),
2479 };
2480 
2481 static void usbredir_class_initfn(ObjectClass *klass, void *data)
2482 {
2483     USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
2484     DeviceClass *dc = DEVICE_CLASS(klass);
2485 
2486     uc->realize        = usbredir_realize;
2487     uc->product_desc   = "USB Redirection Device";
2488     uc->handle_destroy = usbredir_handle_destroy;
2489     uc->cancel_packet  = usbredir_cancel_packet;
2490     uc->handle_reset   = usbredir_handle_reset;
2491     uc->handle_data    = usbredir_handle_data;
2492     uc->handle_control = usbredir_handle_control;
2493     uc->flush_ep_queue = usbredir_flush_ep_queue;
2494     uc->ep_stopped     = usbredir_ep_stopped;
2495     uc->alloc_streams  = usbredir_alloc_streams;
2496     uc->free_streams   = usbredir_free_streams;
2497     dc->vmsd           = &usbredir_vmstate;
2498     dc->props          = usbredir_properties;
2499     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
2500 }
2501 
2502 static void usbredir_instance_init(Object *obj)
2503 {
2504     USBDevice *udev = USB_DEVICE(obj);
2505     USBRedirDevice *dev = USB_REDIRECT(udev);
2506 
2507     device_add_bootindex_property(obj, &dev->bootindex,
2508                                   "bootindex", NULL,
2509                                   &udev->qdev, NULL);
2510 }
2511 
2512 static const TypeInfo usbredir_dev_info = {
2513     .name          = TYPE_USB_REDIR,
2514     .parent        = TYPE_USB_DEVICE,
2515     .instance_size = sizeof(USBRedirDevice),
2516     .class_init    = usbredir_class_initfn,
2517     .instance_init = usbredir_instance_init,
2518 };
2519 
2520 static void usbredir_register_types(void)
2521 {
2522     type_register_static(&usbredir_dev_info);
2523 }
2524 
2525 type_init(usbredir_register_types)
2526