diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2017-06-28 16:23:41 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2017-06-28 16:23:41 +0900 |
commit | 6f7a5914179e61d0b915de84d41634963afbe4a0 (patch) | |
tree | 8377f37e3bdf88e4dee7ee3815028e7945b1cea4 | |
parent | d142cbbea3d40ef6b196c434298237c63204cd1a (diff) |
Fix usb-usbip.c.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | mcu/usb-usbip.c | 92 |
2 files changed, 40 insertions, 57 deletions
@@ -1,3 +1,8 @@ +2017-06-28 NIIBE Yutaka <gniibe@fsij.org> + + * mcu/usb-usbip.c (struct usbip_msg_cmd, struct usbip_msg_rep): + Use different struct for command and reply. + 2017-06-27 NIIBE Yutaka <gniibe@fsij.org> * example-cdc-gnu-linux/README: New. diff --git a/mcu/usb-usbip.c b/mcu/usb-usbip.c index 9e585c8..a487fe4 100644 --- a/mcu/usb-usbip.c +++ b/mcu/usb-usbip.c @@ -235,14 +235,22 @@ attach_device (char busid[32], size_t *len_p) #define URB_DATA_SIZE 65535 -struct usbip_msg_ctl { +struct usbip_msg_cmd { + uint32_t devid; + uint32_t dir; + uint32_t ep; + uint32_t flags; + uint32_t len; + uint32_t rsvd[3]; +}; + +struct usbip_msg_rep { uint32_t devid; uint32_t dir; uint32_t ep; uint32_t status; uint32_t len; - uint32_t rsvd[2]; - uint32_t err_cnt; + uint32_t rsvd[5]; }; static pthread_mutex_t urb_mutex; @@ -436,25 +444,18 @@ static void usbip_finish_urb (struct urb *urb, int r) { struct usbip_msg_head msg; - struct usbip_msg_ctl msg_ctl; - const char zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + struct usbip_msg_rep msg_rep; msg.cmd = htonl (REP_URB_SUBMIT); msg.seq = htonl (urb->seq); - msg_ctl.devid = 0; - msg_ctl.dir = 0; - msg_ctl.ep = 0; - msg_ctl.len = htonl (urb->len);/*???*/ - msg_ctl.rsvd[0] = msg_ctl.rsvd[1] = 0; - msg_ctl.err_cnt = 0; + memset (&msg_rep, 0, sizeof (msg_rep)); + msg_rep.len = htonl (urb->len); fprintf (stderr, "ufu: %d (%d)\n", r, urb->seq); if (r < 0) - msg_ctl.status = htonl (r); - else - msg_ctl.status = 0; + msg_rep.status = htonl (r); pthread_mutex_lock (&fd_mutex); if ((size_t)send (fd, &msg, sizeof (msg), 0) != sizeof (msg)) @@ -462,12 +463,7 @@ usbip_finish_urb (struct urb *urb, int r) perror ("reply send"); } - if ((size_t)send (fd, &msg_ctl, sizeof (msg_ctl), 0) != sizeof (msg_ctl)) - { - perror ("reply send"); - } - - if ((size_t)send (fd, zeros, sizeof (zeros), 0) != sizeof (zeros)) + if ((size_t)send (fd, &msg_rep, sizeof (msg_rep), 0) != sizeof (msg_rep)) { perror ("reply send"); } @@ -607,25 +603,25 @@ usbip_handle_urb (uint32_t seq) { int r = 0; struct usbip_msg_head msg; - struct usbip_msg_ctl msg_ctl; + struct usbip_msg_cmd msg_cmd; + struct usbip_msg_rep msg_rep; struct urb *urb = NULL; - const char zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - if (recv (fd, (char *)&msg_ctl, sizeof (msg_ctl), 0) != sizeof (msg_ctl)) + if (recv (fd, (char *)&msg_cmd, sizeof (msg_cmd), 0) != sizeof (msg_cmd)) { perror ("msg recv ctl"); r = -EINVAL; goto leave; } - if (ntohl (msg_ctl.len) > URB_DATA_SIZE) + if (ntohl (msg_cmd.len) > URB_DATA_SIZE) { perror ("msg len too long"); r = -EINVAL; goto leave; } - urb = malloc (sizeof (struct urb) + ntohl (msg_ctl.len)); + urb = malloc (sizeof (struct urb) + ntohl (msg_cmd.len)); if (urb == NULL) { perror ("URB alloc"); @@ -650,10 +646,10 @@ usbip_handle_urb (uint32_t seq) urb->tid = 0; urb->seq = seq; - urb->devid = ntohl (msg_ctl.devid); - urb->dir = ntohl (msg_ctl.dir); - urb->ep = ntohl (msg_ctl.ep); - urb->remain = urb->len = ntohl (msg_ctl.len); + urb->devid = ntohl (msg_cmd.devid); + urb->dir = ntohl (msg_cmd.dir); + urb->ep = ntohl (msg_cmd.ep); + urb->remain = urb->len = ntohl (msg_cmd.len); urb->data_p = urb->data; printf ("URB: dir=%s, ep=%d, len=%d\n", urb->dir==USBIP_DIR_IN? "IN": "OUT", @@ -699,13 +695,8 @@ usbip_handle_urb (uint32_t seq) msg.cmd = htonl (REP_URB_SUBMIT); msg.seq = htonl (urb->seq); - msg_ctl.devid = 0; - msg_ctl.dir = 0; - msg_ctl.ep = 0; - msg_ctl.status = htonl (r); - msg_ctl.len = 0; - msg_ctl.rsvd[0] = msg_ctl.rsvd[1] = 0; - msg_ctl.err_cnt = 0; + memset (&msg_rep, 0, sizeof (msg_rep)); + msg_rep.status = htonl (r); pthread_mutex_lock (&fd_mutex); if ((size_t)send (fd, &msg, sizeof (msg), 0) != sizeof (msg)) @@ -713,12 +704,7 @@ usbip_handle_urb (uint32_t seq) perror ("reply send"); } - if ((size_t)send (fd, &msg_ctl, sizeof (msg_ctl), 0) != sizeof (msg_ctl)) - { - perror ("reply send"); - } - - if ((size_t)send (fd, zeros, sizeof (zeros), 0) != sizeof (zeros)) + if ((size_t)send (fd, &msg_rep, sizeof (msg_rep), 0) != sizeof (msg_rep)) { perror ("reply send"); } @@ -868,8 +854,8 @@ usbip_process_cmd (void) } else if (msg.cmd == CMD_URB_UNLINK) { - struct usbip_msg_ctl msg_ctl; - const char zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + struct usbip_msg_cmd msg_cmd; + struct usbip_msg_rep msg_rep; uint32_t seq; struct urb *urb; char buf[8]; @@ -881,7 +867,7 @@ usbip_process_cmd (void) return -1; } - if (recv (fd, (char *)&msg_ctl, sizeof (msg_ctl), 0) != sizeof (msg_ctl)) + if (recv (fd, (char *)&msg_cmd, sizeof (msg_cmd), 0) != sizeof (msg_cmd)) { perror ("msg recv ctl"); return -1; @@ -893,7 +879,7 @@ usbip_process_cmd (void) return -1; } - seq = ntohl (msg_ctl.status); + seq = ntohl (msg_cmd.flags); pthread_mutex_lock (&urb_mutex); if ((urb = urb_list)) @@ -920,13 +906,9 @@ usbip_process_cmd (void) msg.cmd = htonl (REP_URB_UNLINK); msg.seq = htonl (msg.seq); - msg_ctl.devid = 0; - msg_ctl.dir = 0; - msg_ctl.ep = 0; + memset (&msg_rep, 0, sizeof (msg_rep)); if (found) - msg_ctl.status = htonl(-ECONNRESET); - else - msg_ctl.status = 0; + msg_rep.status = htonl(-ECONNRESET); printf ("URB UNLINK! %d: %s\n", seq, found?"o":"x"); @@ -936,15 +918,11 @@ usbip_process_cmd (void) perror ("reply send"); } - if ((size_t)send (fd, &msg_ctl, sizeof (msg_ctl), 0) != sizeof (msg_ctl)) + if ((size_t)send (fd, &msg_rep, sizeof (msg_rep), 0) != sizeof (msg_rep)) { perror ("reply send"); } - if ((size_t)send (fd, zeros, sizeof (zeros), 0) != sizeof (zeros)) - { - perror ("reply send"); - } pthread_mutex_unlock (&fd_mutex); } else |