• source navigation • diff markup • identifier search • freetext search •
Version: 2.6.32 2.6.33 2.6.34 2.6.35 2.6.36 2.6.37 2.6.38 2.6.39 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9
Architecture: x86 arm avr32 blackfin m68k m68knommu microblaze mips powerpc sh
1 /* 2 * Copyright (C) 2003-2008 Takahiro Hirofuchi 3 * 4 * This is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 17 * USA. 18 */ 19 20 #include <asm/byteorder.h> 21 #include <linux/file.h> 22 #include <linux/fs.h> 23 #include <linux/kernel.h> 24 #include <linux/slab.h> 25 #include <linux/module.h> 26 #include <net/sock.h> 27 28 #include "usbip_common.h" 29 30 #define DRIVER_AUTHOR "Takahiro Hirofuchi <hirofuchi@users.sourceforge.net>" 31 #define DRIVER_DESC "USB/IP Core" 32 33 #ifdef CONFIG_USBIP_DEBUG 34 unsigned long usbip_debug_flag = 0xffffffff; 35 #else 36 unsigned long usbip_debug_flag; 37 #endif 38 EXPORT_SYMBOL_GPL(usbip_debug_flag); 39 40 /* FIXME */ 41 struct device_attribute dev_attr_usbip_debug; 42 EXPORT_SYMBOL_GPL(dev_attr_usbip_debug); 43 44 static ssize_t show_flag(struct device *dev, struct device_attribute *attr, 45 char *buf) 46 { 47 return sprintf(buf, "%lx\n", usbip_debug_flag); 48 } 49 50 static ssize_t store_flag(struct device *dev, struct device_attribute *attr, 51 const char *buf, size_t count) 52 { 53 sscanf(buf, "%lx", &usbip_debug_flag); 54 return count; 55 } 56 DEVICE_ATTR(usbip_debug, (S_IRUGO | S_IWUSR), show_flag, store_flag); 57 58 static void usbip_dump_buffer(char *buff, int bufflen) 59 { 60 print_hex_dump(KERN_DEBUG, "usbip-core", DUMP_PREFIX_OFFSET, 16, 4, 61 buff, bufflen, false); 62 } 63 64 static void usbip_dump_pipe(unsigned int p) 65 { 66 unsigned char type = usb_pipetype(p); 67 unsigned char ep = usb_pipeendpoint(p); 68 unsigned char dev = usb_pipedevice(p); 69 unsigned char dir = usb_pipein(p); 70 71 pr_debug("dev(%d) ep(%d) [%s] ", dev, ep, dir ? "IN" : "OUT"); 72 73 switch (type) { 74 case PIPE_ISOCHRONOUS: 75 pr_debug("ISO\n"); 76 break; 77 case PIPE_INTERRUPT: 78 pr_debug("INT\n"); 79 break; 80 case PIPE_CONTROL: 81 pr_debug("CTRL\n"); 82 break; 83 case PIPE_BULK: 84 pr_debug("BULK\n"); 85 break; 86 default: 87 pr_debug("ERR\n"); 88 break; 89 } 90 } 91 92 static void usbip_dump_usb_device(struct usb_device *udev) 93 { 94 struct device *dev = &udev->dev; 95 int i; 96 97 dev_dbg(dev, " devnum(%d) devpath(%s) ", 98 udev->devnum, udev->devpath); 99 100 switch (udev->speed) { 101 case USB_SPEED_HIGH: 102 pr_debug("SPD_HIGH "); 103 break; 104 case USB_SPEED_FULL: 105 pr_debug("SPD_FULL "); 106 break; 107 case USB_SPEED_LOW: 108 pr_debug("SPD_LOW "); 109 break; 110 case USB_SPEED_UNKNOWN: 111 pr_debug("SPD_UNKNOWN "); 112 break; 113 default: 114 pr_debug("SPD_ERROR "); 115 break; 116 } 117 118 pr_debug("tt %p, ttport %d\n", udev->tt, udev->ttport); 119 120 dev_dbg(dev, " "); 121 for (i = 0; i < 16; i++) 122 pr_debug(" %2u", i); 123 pr_debug("\n"); 124 125 dev_dbg(dev, " toggle0(IN) :"); 126 for (i = 0; i < 16; i++) 127 pr_debug(" %2u", (udev->toggle[0] & (1 << i)) ? 1 : 0); 128 pr_debug("\n"); 129 130 dev_dbg(dev, " toggle1(OUT):"); 131 for (i = 0; i < 16; i++) 132 pr_debug(" %2u", (udev->toggle[1] & (1 << i)) ? 1 : 0); 133 pr_debug("\n"); 134 135 dev_dbg(dev, " epmaxp_in :"); 136 for (i = 0; i < 16; i++) { 137 if (udev->ep_in[i]) 138 pr_debug(" %2u", 139 le16_to_cpu(udev->ep_in[i]->desc.wMaxPacketSize)); 140 } 141 pr_debug("\n"); 142 143 dev_dbg(dev, " epmaxp_out :"); 144 for (i = 0; i < 16; i++) { 145 if (udev->ep_out[i]) 146 pr_debug(" %2u", 147 le16_to_cpu(udev->ep_out[i]->desc.wMaxPacketSize)); 148 } 149 pr_debug("\n"); 150 151 dev_dbg(dev, "parent %p, bus %p\n", udev->parent, udev->bus); 152 153 dev_dbg(dev, "descriptor %p, config %p, actconfig %p, " 154 "rawdescriptors %p\n", &udev->descriptor, udev->config, 155 udev->actconfig, udev->rawdescriptors); 156 157 dev_dbg(dev, "have_langid %d, string_langid %d\n", 158 udev->have_langid, udev->string_langid); 159 160 dev_dbg(dev, "maxchild %d, children %p\n", 161 udev->maxchild, udev->children); 162 } 163 164 static void usbip_dump_request_type(__u8 rt) 165 { 166 switch (rt & USB_RECIP_MASK) { 167 case USB_RECIP_DEVICE: 168 pr_debug("DEVICE"); 169 break; 170 case USB_RECIP_INTERFACE: 171 pr_debug("INTERF"); 172 break; 173 case USB_RECIP_ENDPOINT: 174 pr_debug("ENDPOI"); 175 break; 176 case USB_RECIP_OTHER: 177 pr_debug("OTHER "); 178 break; 179 default: 180 pr_debug("------"); 181 break; 182 } 183 } 184 185 static void usbip_dump_usb_ctrlrequest(struct usb_ctrlrequest *cmd) 186 { 187 if (!cmd) { 188 pr_debug(" : null pointer\n"); 189 return; 190 } 191 192 pr_debug(" "); 193 pr_debug("bRequestType(%02X) bRequest(%02X) wValue(%04X) wIndex(%04X) " 194 "wLength(%04X) ", cmd->bRequestType, cmd->bRequest, 195 cmd->wValue, cmd->wIndex, cmd->wLength); 196 pr_debug("\n "); 197 198 if ((cmd->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) { 199 pr_debug("STANDARD "); 200 switch (cmd->bRequest) { 201 case USB_REQ_GET_STATUS: 202 pr_debug("GET_STATUS\n"); 203 break; 204 case USB_REQ_CLEAR_FEATURE: 205 pr_debug("CLEAR_FEAT\n"); 206 break; 207 case USB_REQ_SET_FEATURE: 208 pr_debug("SET_FEAT\n"); 209 break; 210 case USB_REQ_SET_ADDRESS: 211 pr_debug("SET_ADDRRS\n"); 212 break; 213 case USB_REQ_GET_DESCRIPTOR: 214 pr_debug("GET_DESCRI\n"); 215 break; 216 case USB_REQ_SET_DESCRIPTOR: 217 pr_debug("SET_DESCRI\n"); 218 break; 219 case USB_REQ_GET_CONFIGURATION: 220 pr_debug("GET_CONFIG\n"); 221 break; 222 case USB_REQ_SET_CONFIGURATION: 223 pr_debug("SET_CONFIG\n"); 224 break; 225 case USB_REQ_GET_INTERFACE: 226 pr_debug("GET_INTERF\n"); 227 break; 228 case USB_REQ_SET_INTERFACE: 229 pr_debug("SET_INTERF\n"); 230 break; 231 case USB_REQ_SYNCH_FRAME: 232 pr_debug("SYNC_FRAME\n"); 233 break; 234 default: 235 pr_debug("REQ(%02X)\n", cmd->bRequest); 236 break; 237 } 238 usbip_dump_request_type(cmd->bRequestType); 239 } else if ((cmd->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) { 240 pr_debug("CLASS\n"); 241 } else if ((cmd->bRequestType & USB_TYPE_MASK) == USB_TYPE_VENDOR) { 242 pr_debug("VENDOR\n"); 243 } else if ((cmd->bRequestType & USB_TYPE_MASK) == USB_TYPE_RESERVED) { 244 pr_debug("RESERVED\n"); 245 } 246 } 247 248 void usbip_dump_urb(struct urb *urb) 249 { 250 struct device *dev; 251 252 if (!urb) { 253 pr_debug("urb: null pointer!!\n"); 254 return; 255 } 256 257 if (!urb->dev) { 258 pr_debug("urb->dev: null pointer!!\n"); 259 return; 260 } 261 262 dev = &urb->dev->dev; 263 264 dev_dbg(dev, " urb :%p\n", urb); 265 dev_dbg(dev, " dev :%p\n", urb->dev); 266 267 usbip_dump_usb_device(urb->dev); 268 269 dev_dbg(dev, " pipe :%08x ", urb->pipe); 270 271 usbip_dump_pipe(urb->pipe); 272 273 dev_dbg(dev, " status :%d\n", urb->status); 274 dev_dbg(dev, " transfer_flags :%08X\n", urb->transfer_flags); 275 dev_dbg(dev, " transfer_buffer :%p\n", urb->transfer_buffer); 276 dev_dbg(dev, " transfer_buffer_length:%d\n", 277 urb->transfer_buffer_length); 278 dev_dbg(dev, " actual_length :%d\n", urb->actual_length); 279 dev_dbg(dev, " setup_packet :%p\n", urb->setup_packet); 280 281 if (urb->setup_packet && usb_pipetype(urb->pipe) == PIPE_CONTROL) 282 usbip_dump_usb_ctrlrequest( 283 (struct usb_ctrlrequest *)urb->setup_packet); 284 285 dev_dbg(dev, " start_frame :%d\n", urb->start_frame); 286 dev_dbg(dev, " number_of_packets :%d\n", urb->number_of_packets); 287 dev_dbg(dev, " interval :%d\n", urb->interval); 288 dev_dbg(dev, " error_count :%d\n", urb->error_count); 289 dev_dbg(dev, " context :%p\n", urb->context); 290 dev_dbg(dev, " complete :%p\n", urb->complete); 291 } 292 EXPORT_SYMBOL_GPL(usbip_dump_urb); 293 294 void usbip_dump_header(struct usbip_header *pdu) 295 { 296 pr_debug("BASE: cmd %u seq %u devid %u dir %u ep %u\n", 297 pdu->base.command, 298 pdu->base.seqnum, 299 pdu->base.devid, 300 pdu->base.direction, 301 pdu->base.ep); 302 303 switch (pdu->base.command) { 304 case USBIP_CMD_SUBMIT: 305 pr_debug("USBIP_CMD_SUBMIT: " 306 "x_flags %u x_len %u sf %u #p %d iv %d\n", 307 pdu->u.cmd_submit.transfer_flags, 308 pdu->u.cmd_submit.transfer_buffer_length, 309 pdu->u.cmd_submit.start_frame, 310 pdu->u.cmd_submit.number_of_packets, 311 pdu->u.cmd_submit.interval); 312 break; 313 case USBIP_CMD_UNLINK: 314 pr_debug("USBIP_CMD_UNLINK: seq %u\n", 315 pdu->u.cmd_unlink.seqnum); 316 break; 317 case USBIP_RET_SUBMIT: 318 pr_debug("USBIP_RET_SUBMIT: st %d al %u sf %d #p %d ec %d\n", 319 pdu->u.ret_submit.status, 320 pdu->u.ret_submit.actual_length, 321 pdu->u.ret_submit.start_frame, 322 pdu->u.ret_submit.number_of_packets, 323 pdu->u.ret_submit.error_count); 324 break; 325 case USBIP_RET_UNLINK: 326 pr_debug("USBIP_RET_UNLINK: status %d\n", 327 pdu->u.ret_unlink.status); 328 break; 329 default: 330 /* NOT REACHED */ 331 pr_err("unknown command\n"); 332 break; 333 } 334 } 335 EXPORT_SYMBOL_GPL(usbip_dump_header); 336 337 /* Receive data over TCP/IP. */ 338 int usbip_recv(struct socket *sock, void *buf, int size) 339 { 340 int result; 341 struct msghdr msg; 342 struct kvec iov; 343 int total = 0; 344 345 /* for blocks of if (usbip_dbg_flag_xmit) */ 346 char *bp = buf; 347 int osize = size; 348 349 usbip_dbg_xmit("enter\n"); 350 351 if (!sock || !buf || !size) { 352 pr_err("invalid arg, sock %p buff %p size %d\n", sock, buf, 353 size); 354 return -EINVAL; 355 } 356 357 do { 358 sock->sk->sk_allocation = GFP_NOIO; 359 iov.iov_base = buf; 360 iov.iov_len = size; 361 msg.msg_name = NULL; 362 msg.msg_namelen = 0; 363 msg.msg_control = NULL; 364 msg.msg_controllen = 0; 365 msg.msg_namelen = 0; 366 msg.msg_flags = MSG_NOSIGNAL; 367 368 result = kernel_recvmsg(sock, &msg, &iov, 1, size, MSG_WAITALL); 369 if (result <= 0) { 370 pr_debug("receive sock %p buf %p size %u ret %d total %d\n", 371 sock, buf, size, result, total); 372 goto err; 373 } 374 375 size -= result; 376 buf += result; 377 total += result; 378 } while (size > 0); 379 380 if (usbip_dbg_flag_xmit) { 381 if (!in_interrupt()) 382 pr_debug("%-10s:", current->comm); 383 else 384 pr_debug("interrupt :"); 385 386 pr_debug("receiving....\n"); 387 usbip_dump_buffer(bp, osize); 388 pr_debug("received, osize %d ret %d size %d total %d\n", 389 osize, result, size, total); 390 } 391 392 return total; 393 394 err: 395 return result; 396 } 397 EXPORT_SYMBOL_GPL(usbip_recv); 398 399 struct socket *sockfd_to_socket(unsigned int sockfd) 400 { 401 struct socket *socket; 402 struct file *file; 403 struct inode *inode; 404 405 file = fget(sockfd); 406 if (!file) { 407 pr_err("invalid sockfd\n"); 408 return NULL; 409 } 410 411 inode = file->f_dentry->d_inode; 412 413 if (!inode || !S_ISSOCK(inode->i_mode)) 414 return NULL; 415 416 socket = SOCKET_I(inode); 417 418 return socket; 419 } 420 EXPORT_SYMBOL_GPL(sockfd_to_socket); 421 422 /* there may be more cases to tweak the flags. */ 423 static unsigned int tweak_transfer_flags(unsigned int flags) 424 { 425 flags &= ~URB_NO_TRANSFER_DMA_MAP; 426 return flags; 427 } 428 429 static void usbip_pack_cmd_submit(struct usbip_header *pdu, struct urb *urb, 430 int pack) 431 { 432 struct usbip_header_cmd_submit *spdu = &pdu->u.cmd_submit; 433 434 /* 435 * Some members are not still implemented in usbip. I hope this issue 436 * will be discussed when usbip is ported to other operating systems. 437 */ 438 if (pack) { 439 /* vhci_tx.c */ 440 spdu->transfer_flags = 441 tweak_transfer_flags(urb->transfer_flags); 442 spdu->transfer_buffer_length = urb->transfer_buffer_length; 443 spdu->start_frame = urb->start_frame; 444 spdu->number_of_packets = urb->number_of_packets; 445 spdu->interval = urb->interval; 446 } else { 447 /* stub_rx.c */ 448 urb->transfer_flags = spdu->transfer_flags; 449 450 urb->transfer_buffer_length = spdu->transfer_buffer_length; 451 urb->start_frame = spdu->start_frame; 452 urb->number_of_packets = spdu->number_of_packets; 453 urb->interval = spdu->interval; 454 } 455 } 456 457 static void usbip_pack_ret_submit(struct usbip_header *pdu, struct urb *urb, 458 int pack) 459 { 460 struct usbip_header_ret_submit *rpdu = &pdu->u.ret_submit; 461 462 if (pack) { 463 /* stub_tx.c */ 464 465 rpdu->status = urb->status; 466 rpdu->actual_length = urb->actual_length; 467 rpdu->start_frame = urb->start_frame; 468 rpdu->number_of_packets = urb->number_of_packets; 469 rpdu->error_count = urb->error_count; 470 } else { 471 /* vhci_rx.c */ 472 473 urb->status = rpdu->status; 474 urb->actual_length = rpdu->actual_length; 475 urb->start_frame = rpdu->start_frame; 476 urb->number_of_packets = rpdu->number_of_packets; 477 urb->error_count = rpdu->error_count; 478 } 479 } 480 481 void usbip_pack_pdu(struct usbip_header *pdu, struct urb *urb, int cmd, 482 int pack) 483 { 484 switch (cmd) { 485 case USBIP_CMD_SUBMIT: 486 usbip_pack_cmd_submit(pdu, urb, pack); 487 break; 488 case USBIP_RET_SUBMIT: 489 usbip_pack_ret_submit(pdu, urb, pack); 490 break; 491 default: 492 /* NOT REACHED */ 493 pr_err("unknown command\n"); 494 break; 495 } 496 } 497 EXPORT_SYMBOL_GPL(usbip_pack_pdu); 498 499 static void correct_endian_basic(struct usbip_header_basic *base, int send) 500 { 501 if (send) { 502 base->command = cpu_to_be32(base->command); 503 base->seqnum = cpu_to_be32(base->seqnum); 504 base->devid = cpu_to_be32(base->devid); 505 base->direction = cpu_to_be32(base->direction); 506 base->ep = cpu_to_be32(base->ep); 507 } else { 508 base->command = be32_to_cpu(base->command); 509 base->seqnum = be32_to_cpu(base->seqnum); 510 base->devid = be32_to_cpu(base->devid); 511 base->direction = be32_to_cpu(base->direction); 512 base->ep = be32_to_cpu(base->ep); 513 } 514 } 515 516 static void correct_endian_cmd_submit(struct usbip_header_cmd_submit *pdu, 517 int send) 518 { 519 if (send) { 520 pdu->transfer_flags = cpu_to_be32(pdu->transfer_flags); 521 522 cpu_to_be32s(&pdu->transfer_buffer_length); 523 cpu_to_be32s(&pdu->start_frame); 524 cpu_to_be32s(&pdu->number_of_packets); 525 cpu_to_be32s(&pdu->interval); 526 } else { 527 pdu->transfer_flags = be32_to_cpu(pdu->transfer_flags); 528 529 be32_to_cpus(&pdu->transfer_buffer_length); 530 be32_to_cpus(&pdu->start_frame); 531 be32_to_cpus(&pdu->number_of_packets); 532 be32_to_cpus(&pdu->interval); 533 } 534 } 535 536 static void correct_endian_ret_submit(struct usbip_header_ret_submit *pdu, 537 int send) 538 { 539 if (send) { 540 cpu_to_be32s(&pdu->status); 541 cpu_to_be32s(&pdu->actual_length); 542 cpu_to_be32s(&pdu->start_frame); 543 cpu_to_be32s(&pdu->number_of_packets); 544 cpu_to_be32s(&pdu->error_count); 545 } else { 546 be32_to_cpus(&pdu->status); 547 be32_to_cpus(&pdu->actual_length); 548 be32_to_cpus(&pdu->start_frame); 549 be32_to_cpus(&pdu->number_of_packets); 550 be32_to_cpus(&pdu->error_count); 551 } 552 } 553 554 static void correct_endian_cmd_unlink(struct usbip_header_cmd_unlink *pdu, 555 int send) 556 { 557 if (send) 558 pdu->seqnum = cpu_to_be32(pdu->seqnum); 559 else 560 pdu->seqnum = be32_to_cpu(pdu->seqnum); 561 } 562 563 static void correct_endian_ret_unlink(struct usbip_header_ret_unlink *pdu, 564 int send) 565 { 566 if (send) 567 cpu_to_be32s(&pdu->status); 568 else 569 be32_to_cpus(&pdu->status); 570 } 571 572 void usbip_header_correct_endian(struct usbip_header *pdu, int send) 573 { 574 __u32 cmd = 0; 575 576 if (send) 577 cmd = pdu->base.command; 578 579 correct_endian_basic(&pdu->base, send); 580 581 if (!send) 582 cmd = pdu->base.command; 583 584 switch (cmd) { 585 case USBIP_CMD_SUBMIT: 586 correct_endian_cmd_submit(&pdu->u.cmd_submit, send); 587 break; 588 case USBIP_RET_SUBMIT: 589 correct_endian_ret_submit(&pdu->u.ret_submit, send); 590 break; 591 case USBIP_CMD_UNLINK: 592 correct_endian_cmd_unlink(&pdu->u.cmd_unlink, send); 593 break; 594 case USBIP_RET_UNLINK: 595 correct_endian_ret_unlink(&pdu->u.ret_unlink, send); 596 break; 597 default: 598 /* NOT REACHED */ 599 pr_err("unknown command\n"); 600 break; 601 } 602 } 603 EXPORT_SYMBOL_GPL(usbip_header_correct_endian); 604 605 static void usbip_iso_packet_correct_endian( 606 struct usbip_iso_packet_descriptor *iso, int send) 607 { 608 /* does not need all members. but copy all simply. */ 609 if (send) { 610 iso->offset = cpu_to_be32(iso->offset); 611 iso->length = cpu_to_be32(iso->length); 612 iso->status = cpu_to_be32(iso->status); 613 iso->actual_length = cpu_to_be32(iso->actual_length); 614 } else { 615 iso->offset = be32_to_cpu(iso->offset); 616 iso->length = be32_to_cpu(iso->length); 617 iso->status = be32_to_cpu(iso->status); 618 iso->actual_length = be32_to_cpu(iso->actual_length); 619 } 620 } 621 622 static void usbip_pack_iso(struct usbip_iso_packet_descriptor *iso, 623 struct usb_iso_packet_descriptor *uiso, int pack) 624 { 625 if (pack) { 626 iso->offset = uiso->offset; 627 iso->length = uiso->length; 628 iso->status = uiso->status; 629 iso->actual_length = uiso->actual_length; 630 } else { 631 uiso->offset = iso->offset; 632 uiso->length = iso->length; 633 uiso->status = iso->status; 634 uiso->actual_length = iso->actual_length; 635 } 636 } 637 638 /* must free buffer */ 639 void *usbip_alloc_iso_desc_pdu(struct urb *urb, ssize_t *bufflen) 640 { 641 void *buff; 642 struct usbip_iso_packet_descriptor *iso; 643 int np = urb->number_of_packets; 644 ssize_t size = np * sizeof(*iso); 645 int i; 646 647 buff = kzalloc(size, GFP_KERNEL); 648 if (!buff) 649 return NULL; 650 651 for (i = 0; i < np; i++) { 652 iso = buff + (i * sizeof(*iso)); 653 654 usbip_pack_iso(iso, &urb->iso_frame_desc[i], 1); 655 usbip_iso_packet_correct_endian(iso, 1); 656 } 657 658 *bufflen = size; 659 660 return buff; 661 } 662 EXPORT_SYMBOL_GPL(usbip_alloc_iso_desc_pdu); 663 664 /* some members of urb must be substituted before. */ 665 int usbip_recv_iso(struct usbip_device *ud, struct urb *urb) 666 { 667 void *buff; 668 struct usbip_iso_packet_descriptor *iso; 669 int np = urb->number_of_packets; 670 int size = np * sizeof(*iso); 671 int i; 672 int ret; 673 int total_length = 0; 674 675 if (!usb_pipeisoc(urb->pipe)) 676 return 0; 677 678 /* my Bluetooth dongle gets ISO URBs which are np = 0 */ 679 if (np == 0) { 680 /* pr_info("iso np == 0\n"); */ 681 /* usbip_dump_urb(urb); */ 682 return 0; 683 } 684 685 buff = kzalloc(size, GFP_KERNEL); 686 if (!buff) 687 return -ENOMEM; 688 689 ret = usbip_recv(ud->tcp_socket, buff, size); 690 if (ret != size) { 691 dev_err(&urb->dev->dev, "recv iso_frame_descriptor, %d\n", 692 ret); 693 kfree(buff); 694 695 if (ud->side == USBIP_STUB) 696 usbip_event_add(ud, SDEV_EVENT_ERROR_TCP); 697 else 698 usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); 699 700 return -EPIPE; 701 } 702 703 for (i = 0; i < np; i++) { 704 iso = buff + (i * sizeof(*iso)); 705 706 usbip_iso_packet_correct_endian(iso, 0); 707 usbip_pack_iso(iso, &urb->iso_frame_desc[i], 0); 708 total_length += urb->iso_frame_desc[i].actual_length; 709 } 710 711 kfree(buff); 712 713 if (total_length != urb->actual_length) { 714 dev_err(&urb->dev->dev, 715 "total length of iso packets %d not equal to actual " 716 "length of buffer %d\n", 717 total_length, urb->actual_length); 718 719 if (ud->side == USBIP_STUB) 720 usbip_event_add(ud, SDEV_EVENT_ERROR_TCP); 721 else 722 usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); 723 724 return -EPIPE; 725 } 726 727 return ret; 728 } 729 EXPORT_SYMBOL_GPL(usbip_recv_iso); 730 731 /* 732 * This functions restores the padding which was removed for optimizing 733 * the bandwidth during transfer over tcp/ip 734 * 735 * buffer and iso packets need to be stored and be in propeper endian in urb 736 * before calling this function 737 */ 738 void usbip_pad_iso(struct usbip_device *ud, struct urb *urb) 739 { 740 int np = urb->number_of_packets; 741 int i; 742 int actualoffset = urb->actual_length; 743 744 if (!usb_pipeisoc(urb->pipe)) 745 return; 746 747 /* if no packets or length of data is 0, then nothing to unpack */ 748 if (np == 0 || urb->actual_length == 0) 749 return; 750 751 /* 752 * if actual_length is transfer_buffer_length then no padding is 753 * present. 754 */ 755 if (urb->actual_length == urb->transfer_buffer_length) 756 return; 757 758 /* 759 * loop over all packets from last to first (to prevent overwritting 760 * memory when padding) and move them into the proper place 761 */ 762 for (i = np-1; i > 0; i--) { 763 actualoffset -= urb->iso_frame_desc[i].actual_length; 764 memmove(urb->transfer_buffer + urb->iso_frame_desc[i].offset, 765 urb->transfer_buffer + actualoffset, 766 urb->iso_frame_desc[i].actual_length); 767 } 768 } 769 EXPORT_SYMBOL_GPL(usbip_pad_iso); 770 771 /* some members of urb must be substituted before. */ 772 int usbip_recv_xbuff(struct usbip_device *ud, struct urb *urb) 773 { 774 int ret; 775 int size; 776 777 if (ud->side == USBIP_STUB) { 778 /* stub_rx.c */ 779 /* the direction of urb must be OUT. */ 780 if (usb_pipein(urb->pipe)) 781 return 0; 782 783 size = urb->transfer_buffer_length; 784 } else { 785 /* vhci_rx.c */ 786 /* the direction of urb must be IN. */ 787 if (usb_pipeout(urb->pipe)) 788 return 0; 789 790 size = urb->actual_length; 791 } 792 793 /* no need to recv xbuff */ 794 if (!(size > 0)) 795 return 0; 796 797 ret = usbip_recv(ud->tcp_socket, urb->transfer_buffer, size); 798 if (ret != size) { 799 dev_err(&urb->dev->dev, "recv xbuf, %d\n", ret); 800 if (ud->side == USBIP_STUB) { 801 usbip_event_add(ud, SDEV_EVENT_ERROR_TCP); 802 } else { 803 usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); 804 return -EPIPE; 805 } 806 } 807 808 return ret; 809 } 810 EXPORT_SYMBOL_GPL(usbip_recv_xbuff); 811 812 static int __init usbip_core_init(void) 813 { 814 pr_info(DRIVER_DESC " v" USBIP_VERSION "\n"); 815 return 0; 816 } 817 818 static void __exit usbip_core_exit(void) 819 { 820 return; 821 } 822 823 module_init(usbip_core_init); 824 module_exit(usbip_core_exit); 825 826 MODULE_AUTHOR(DRIVER_AUTHOR); 827 MODULE_DESCRIPTION(DRIVER_DESC); 828 MODULE_LICENSE("GPL"); 829 MODULE_VERSION(USBIP_VERSION); 830
This page was automatically generated by LXR 0.3.1 (source). • Linux is a registered trademark of Linus Torvalds