{"id":3253,"date":"2025-05-27T17:00:44","date_gmt":"2025-05-27T09:00:44","guid":{"rendered":"http:\/\/www.51cos.com\/?p=3253"},"modified":"2025-05-27T17:03:30","modified_gmt":"2025-05-27T09:03:30","slug":"usb-ip-protocol","status":"publish","type":"post","link":"http:\/\/www.51cos.com\/?p=3253","title":{"rendered":"USB\/IP Protocol"},"content":{"rendered":"<h2>USB\/IP Protocol<\/h2>\n<h3>Docs inside Linux kernel source tree<\/h3>\n<p>Rendered doc: https:\/\/www.kernel.org\/doc\/html\/latest\/usb\/usbip_protocol.html<\/p>\n<h3>Git tracked (GitHub mirror):<\/h3>\n<p>https:\/\/github.com\/torvalds\/linux\/blob\/master\/Documentation\/usb\/usbip_protocol.rst<\/p>\n<h1>Implementations<\/h1>\n<p>\u6839\u636e\u534f\u8bae\uff0cUSB\/IP \u6709\u4e24\u79cd\u89d2\u8272\uff1a<\/p>\n<p>USB\/IP \u670d\u52a1\u5668\uff1a \u63d0\u4f9b USB \u8bbe\u5907\uff0c\u901a\u5e38\u6267\u884c USB \u8bbe\u5907\u63a7\u5236\u5668\uff08UDC\uff09\u548c\u8bbe\u5907\u529f\u80fd<br \/>\nUSB\/IP \u5ba2\u6237\u7aef\uff1a \u4f7f\u7528 USB \u8bbe\u5907\uff0c\u901a\u5e38\u5b9e\u73b0 USB \u4e3b\u673a\u63a7\u5236\u5668\u63a5\u53e3 (HCI)<br \/>\nAccording to the protocol, USB\/IP has two roles:<\/p>\n<ul>\n<li>USB\/IP Server: Providing USB Devices, usually implementing USB Device Controller (UDC) and device functions<\/li>\n<li>USB\/IP Client: Using USB Devices, usually implementing USB Host Controller Interface (HCI)<\/li>\n<\/ul>\n<h2>USB\/IP Server<\/h2>\n<p>There are quite a few USB\/IP Server implementations, with different layers of abstraction implemented.<\/p>\n<ul>\n<li>usbip-windows: https:\/\/github.com\/cezanne\/usbip-win<\/li>\n<li>usbip-host.ko: Linux Kernel USB device driver, not implementing UDC or device function<\/li>\n<li>usbip-vudc.ko: Linux Kernel virtual UDC device driver, implementing UDC, device function attached using Linux USB Gadget<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/sourceforge.net\/projects\/usbip\/files\/usbip_windows\/\">usbip&#95;windows<\/a>: Windows USB device driver, ten years ago from USB\/IP homepage, signed driver (signed by ReactOS)<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/dorssel\/usbipd-win\">dorssel\/usbipd-win<\/a>: Windows USB device driver, not implementing UDC and device function, driver from VBox, signed driver<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/cezanne\/usbip-win\">cezanne\/usbip-win (usbip&#95;stub)<\/a>: Windows USB driver, driver self written and self signed<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/jiegec\/usbip\">jiegec\/usbip<\/a>: written in Rust\n<ul>\n<li>libusb backend: as if it is a USB driver in libusb compatible platform (e.g. MacOS, BSD, Android, Haiku, Solaris)<\/li>\n<li>device: hid keyboard<\/li>\n<li>device: cdc acm serial<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/Sawchord\/usbip-device\">Sawchord\/usbip-device<\/a>: written in Rust\n<ul>\n<li>device: serial echo<\/li>\n<li>device: twitching mouse<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/ellerh\/softfido\">ellerh\/softfido<\/a>: written in Rust\n<ul>\n<li>device: FIDO2\/U2F authenticator<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/MarkOstis\/USBIP-Virtual-USB-Device\">MarkOstis\/USBIP-Virtual-USB-Device<\/a>: wrriten in Python\n<ul>\n<li>device: keyboard<\/li>\n<li>device: mouse<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"http:\/\/www.fsij.org\/doc-gnuk\/index.html\">Gnuk<\/a>: using <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/salsa.debian.org\/gnuk-team\/chopstx\/chopstx\">Chopstx<\/a>, which can emulate a whole MCU\n<ul>\n<li>device: OpenPGP Card V2.0<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"github.com\/canokeys\/canokey-usbip\">canokeys\/canokey-usbip<\/a>: written in C\n<ul>\n<li>device: U2F \/ FIDO2 with ed25519 and HMAC-secret<\/li>\n<li>device: OpenPGP Card V3.4, <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/docs.canokeys.org\/userguide\/openpgp\/#supported-algorithm\">Supported Algorithm List<\/a><\/li>\n<li>device: PIV (NIST SP 800-73-4)<\/li>\n<li>device: HOTP \/ TOTP<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/chegewara\/esp32-usbip-poc\">chegewara\/esp32-usbip-poc<\/a>: written in C++\n<ul>\n<li>usbip client can access it via a Wifi named &#8220;esp32&#8221;<\/li>\n<li>device: simple usb device (like serial) attached to the ESP32S2\/S3 SoC (acting as a USB host)<\/li>\n<\/ul>\n<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/Sawchord\/usbip-device\">Sawchord\/usbip-device<\/a>, <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/trussed-dev\/pc-usbip-runner\">trussed-dev\/pc-usbip-runner<\/a> and <a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/Nitrokey\/nitrokey-3-firmware\">Nitrokey\/nitrokey-3-firmware<\/a>: written in Rust\n<ul>\n<li>device: FIDO<\/li>\n<li>device: CCID<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>USB\/IP Client<\/h2>\n<ul>\n<li>vhci-hcd.ko: Linux Kernel virtual HCI driver<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/cezanne\/usbip-win\">cezanne\/usbip-win (usbip&#95;vhci)<\/a>: Windows virtual HCI driver, driver self written and self signed<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/forensix\/libusbip\">forensix\/libusbip<\/a>: C library on top of libusb<\/li>\n<\/ul>\n<p><!--\nPotential implementation ideas:\n* libusb with usbip-client\n* qemu with usbip-client\n--><\/p>\n<h2>User space tools<\/h2>\n<ul>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/torvalds\/linux\/tree\/master\/tools\/usb\/usbip\">usbip\/usbipd inside Linux source tree<\/a>: get info and manipulate usbip kernel module<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/alunux\/usbip-service-discovery\">alunux\/usbip-service-discovery<\/a>: GUI<\/li>\n<li><a class=\"wp-editor-md-post-content-link\" href=\"m-antonov\/USBIPManager\">USBIPManager<\/a>: GUI<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>USB\/IP Protocol Docs inside Linux kernel source tree Re [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3253","post","type-post","status-publish","format-standard","hentry","category-embedded"],"_links":{"self":[{"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/posts\/3253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.51cos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3253"}],"version-history":[{"count":4,"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/posts\/3253\/revisions"}],"predecessor-version":[{"id":3257,"href":"http:\/\/www.51cos.com\/index.php?rest_route=\/wp\/v2\/posts\/3253\/revisions\/3257"}],"wp:attachment":[{"href":"http:\/\/www.51cos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.51cos.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3253"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.51cos.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}