2 * FreeRDP: A Remote Desktop Protocol Implementation
3 * RemoteFX USB Redirection
5 * Copyright 2012 Atrust corp.
6 * Copyright 2012 Alfred Liu <alfred.liu@atruscorp.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
27 #include <winpr/crt.h>
28 #include <winpr/cmdline.h>
30 #include <freerdp/addin.h>
32 #include "urbdrc_types.h"
33 #include "urbdrc_main.h"
35 #include "libusb_udevice.h"
37 #if !defined(LIBUSB_API_VERSION) || (LIBUSB_API_VERSION < 0x01000102)
38 #define LIBUSB_HOTPLUG_NO_FLAGS 0
41 #define BASIC_STATE_FUNC_DEFINED(_arg, _type) \
42 static _type udevman_get_##_arg(IUDEVMAN* idevman) \
44 UDEVMAN* udevman = (UDEVMAN*)idevman; \
45 return udevman->_arg; \
47 static void udevman_set_##_arg(IUDEVMAN* idevman, _type _t) \
49 UDEVMAN* udevman = (UDEVMAN*)idevman; \
53 #define BASIC_STATE_FUNC_REGISTER(_arg, _man) \
54 _man->iface.get_##_arg = udevman_get_##_arg; \
55 _man->iface.set_##_arg = udevman_set_##_arg
57 typedef struct _UDEVMAN UDEVMAN;
63 IUDEVICE* idev; /* iterator device */
64 IUDEVICE* head; /* head device in linked list */
65 IUDEVICE* tail; /* tail device in linked list */
72 HANDLE devman_loading;
73 libusb_context* context;
74 libusb_hotplug_callback_handle handle;
78 typedef UDEVMAN* PUDEVMAN;
80 static BOOL poll_libusb_events(UDEVMAN* udevman);
82 static void udevman_rewind(IUDEVMAN* idevman)
84 UDEVMAN* udevman = (UDEVMAN*)idevman;
85 udevman->idev = udevman->head;
88 static BOOL udevman_has_next(IUDEVMAN* idevman)
90 UDEVMAN* udevman = (UDEVMAN*)idevman;
92 if (!udevman || !udevman->idev)
98 static IUDEVICE* udevman_get_next(IUDEVMAN* idevman)
100 UDEVMAN* udevman = (UDEVMAN*)idevman;
102 pdev = udevman->idev;
103 udevman->idev = (IUDEVICE*)((UDEVICE*)udevman->idev)->next;
107 static IUDEVICE* udevman_get_udevice_by_addr(IUDEVMAN* idevman, BYTE bus_number, BYTE dev_number)
109 IUDEVICE* dev = NULL;
114 idevman->loading_lock(idevman);
115 idevman->rewind(idevman);
117 while (idevman->has_next(idevman))
119 IUDEVICE* pdev = idevman->get_next(idevman);
121 if ((pdev->get_bus_number(pdev) == bus_number) &&
122 (pdev->get_dev_number(pdev) == dev_number))
129 idevman->loading_unlock(idevman);
133 static size_t udevman_register_udevice(IUDEVMAN* idevman, BYTE bus_number, BYTE dev_number,
134 UINT32 UsbDevice, UINT16 idVendor, UINT16 idProduct,
137 UDEVMAN* udevman = (UDEVMAN*)idevman;
138 IUDEVICE* pdev = NULL;
140 URBDRC_PLUGIN* urbdrc;
141 size_t i, num, addnum = 0;
143 if (!idevman || !idevman->plugin)
146 urbdrc = (URBDRC_PLUGIN*)idevman->plugin;
147 pdev = (IUDEVICE*)udevman_get_udevice_by_addr(idevman, bus_number, dev_number);
152 if (flag == UDEVMAN_FLAG_ADD_BY_ADDR)
154 IUDEVICE* tdev = udev_new_by_addr(urbdrc, bus_number, dev_number);
159 tdev->set_UsbDevice(tdev, UsbDevice);
160 idevman->loading_lock(idevman);
162 if (udevman->head == NULL)
164 /* linked list is empty */
165 udevman->head = tdev;
166 udevman->tail = tdev;
170 /* append device to the end of the linked list */
171 udevman->tail->set_p_next(udevman->tail, tdev);
172 tdev->set_p_prev(tdev, udevman->tail);
173 udevman->tail = tdev;
176 udevman->device_num += 1;
177 idevman->loading_unlock(idevman);
179 else if (flag == UDEVMAN_FLAG_ADD_BY_VID_PID)
182 /* register all device that match pid vid */
183 num = udev_new_by_id(urbdrc, idVendor, idProduct, &devArray);
185 for (i = 0; i < num; i++)
187 IUDEVICE* tdev = devArray[i];
189 if (udevman_get_udevice_by_addr(idevman, tdev->get_bus_number(tdev),
190 tdev->get_dev_number(tdev)) != NULL)
197 tdev->set_UsbDevice(tdev, UsbDevice);
198 idevman->loading_lock(idevman);
200 if (udevman->head == NULL)
202 /* linked list is empty */
203 udevman->head = tdev;
204 udevman->tail = tdev;
208 /* append device to the end of the linked list */
209 udevman->tail->set_p_next(udevman->tail, tdev);
210 tdev->set_p_prev(tdev, udevman->tail);
211 udevman->tail = tdev;
214 udevman->device_num += 1;
215 idevman->loading_unlock(idevman);
224 WLog_Print(urbdrc->log, WLOG_ERROR, "udevman_register_udevice: Invalid flag=%08 " PRIx32,
232 static BOOL udevman_unregister_udevice(IUDEVMAN* idevman, BYTE bus_number, BYTE dev_number)
234 UDEVMAN* udevman = (UDEVMAN*)idevman;
236 UDEVICE* dev = (UDEVICE*)udevman_get_udevice_by_addr(idevman, bus_number, dev_number);
238 if (!dev || !idevman)
241 idevman->loading_lock(idevman);
242 idevman->rewind(idevman);
244 while (idevman->has_next(idevman))
246 pdev = (UDEVICE*)idevman->get_next(idevman);
248 if (pdev == dev) /* device exists */
250 /* set previous device to point to next device */
251 if (dev->prev != NULL)
253 /* unregistered device is not the head */
255 pdev->next = dev->next;
259 /* unregistered device is the head, update head */
260 udevman->head = (IUDEVICE*)dev->next;
263 /* set next device to point to previous device */
265 if (dev->next != NULL)
267 /* unregistered device is not the tail */
268 pdev = (UDEVICE*)dev->next;
269 pdev->prev = dev->prev;
273 /* unregistered device is the tail, update tail */
274 udevman->tail = (IUDEVICE*)dev->prev;
277 udevman->device_num--;
282 idevman->loading_unlock(idevman);
286 dev->iface.free(&dev->iface);
287 return TRUE; /* unregistration successful */
290 /* if we reach this point, the device wasn't found */
294 static BOOL udevman_cancel_all_device_requests(IUDEVMAN* idevman)
296 UDEVMAN* udevman = (UDEVMAN*)idevman;
301 idevman->loading_lock(idevman);
302 idevman->rewind(idevman);
304 while (idevman->has_next(idevman))
306 UDEVICE* dev = (UDEVICE*)idevman->get_next(idevman);
310 dev->iface.cancel_all_transfer_request(&dev->iface);
313 idevman->loading_unlock(idevman);
318 static BOOL udevman_unregister_all_udevices(IUDEVMAN* idevman)
320 UDEVMAN* udevman = (UDEVMAN*)idevman;
325 idevman->loading_lock(idevman);
326 idevman->rewind(idevman);
328 while (idevman->has_next(idevman))
330 UDEVICE* dev = (UDEVICE*)idevman->get_next(idevman);
335 /* set previous device to point to next device */
336 if (dev->prev != NULL)
338 /* unregistered device is not the head */
339 UDEVICE* pdev = dev->prev;
340 pdev->next = dev->next;
344 /* unregistered device is the head, update head */
345 udevman->head = (IUDEVICE*)dev->next;
348 /* set next device to point to previous device */
350 if (dev->next != NULL)
352 /* unregistered device is not the tail */
353 UDEVICE* pdev = (UDEVICE*)dev->next;
354 pdev->prev = dev->prev;
358 /* unregistered device is the tail, update tail */
359 udevman->tail = (IUDEVICE*)dev->prev;
362 dev->iface.free(&dev->iface);
363 udevman->device_num--;
366 idevman->loading_unlock(idevman);
371 static BOOL udevman_parse_device_addr(const char* str, size_t maxLen, UINT16* id1, UINT16* id2,
377 size_t len = strnlen(str, maxLen);
379 s2 = (strchr(str, sign)) + 1;
384 cpLen = len - (strnlen(s2, len) + 1);
386 if (cpLen >= sizeof(s1))
387 cpLen = sizeof(s1) - 1;
389 strncpy(s1, str, cpLen);
390 rc = strtoul(s1, NULL, 16);
392 if ((rc > UINT16_MAX) || (errno != 0))
396 rc = strtoul(s2, NULL, 16);
398 if ((rc > UINT16_MAX) || (errno != 0))
405 static BOOL udevman_parse_device_pid_vid(const char* str, size_t maxLen, UINT16* id1, UINT16* id2,
411 size_t len = strnlen(str, maxLen);
413 s2 = (strchr(str, sign)) + 1;
418 cpLen = len - (strnlen(s2, len) + 1);
420 if (cpLen >= sizeof(s1))
421 cpLen = sizeof(s1) - 1;
423 strncpy(s1, str, cpLen);
425 rc = strtoul(s1, NULL, 16);
427 if ((rc > UINT16_MAX) || (errno != 0))
431 rc = strtoul(s2, NULL, 16);
433 if ((rc > UINT16_MAX) || (errno != 0))
440 static int udevman_check_device_exist_by_id(IUDEVMAN* idevman, UINT16 idVendor, UINT16 idProduct)
442 if (libusb_open_device_with_vid_pid(NULL, idVendor, idProduct))
448 static int udevman_is_auto_add(IUDEVMAN* idevman)
450 UDEVMAN* udevman = (UDEVMAN*)idevman;
451 return (udevman->flags & UDEVMAN_FLAG_ADD_BY_AUTO) ? 1 : 0;
454 static IUDEVICE* udevman_get_udevice_by_UsbDevice(IUDEVMAN* idevman, UINT32 UsbDevice)
457 URBDRC_PLUGIN* urbdrc;
459 if (!idevman || !idevman->plugin)
462 /* Mask highest 2 bits, must be ignored */
463 UsbDevice = UsbDevice & INTERFACE_ID_MASK;
464 urbdrc = (URBDRC_PLUGIN*)idevman->plugin;
465 idevman->loading_lock(idevman);
466 idevman->rewind(idevman);
468 while (idevman->has_next(idevman))
470 pdev = (UDEVICE*)idevman->get_next(idevman);
472 if (pdev->UsbDevice == UsbDevice)
474 idevman->loading_unlock(idevman);
475 return (IUDEVICE*)pdev;
479 idevman->loading_unlock(idevman);
480 WLog_Print(urbdrc->log, WLOG_WARN, "Failed to find a USB device mapped to deviceId=%08" PRIx32,
485 static void udevman_loading_lock(IUDEVMAN* idevman)
487 UDEVMAN* udevman = (UDEVMAN*)idevman;
488 WaitForSingleObject(udevman->devman_loading, INFINITE);
491 static void udevman_loading_unlock(IUDEVMAN* idevman)
493 UDEVMAN* udevman = (UDEVMAN*)idevman;
494 ReleaseMutex(udevman->devman_loading);
497 BASIC_STATE_FUNC_DEFINED(defUsbDevice, UINT32)
498 BASIC_STATE_FUNC_DEFINED(device_num, UINT32)
499 BASIC_STATE_FUNC_DEFINED(sem_timeout, int)
501 static void udevman_free(IUDEVMAN* idevman)
503 UDEVMAN* udevman = (UDEVMAN*)idevman;
508 libusb_hotplug_deregister_callback(udevman->context, udevman->handle);
510 udevman->running = FALSE;
511 WaitForSingleObject(udevman->thread, INFINITE);
513 /* Process remaining usb events */
514 while (poll_libusb_events(udevman))
517 udevman_unregister_all_udevices(idevman);
518 CloseHandle(udevman->devman_loading);
519 CloseHandle(udevman->thread);
520 libusb_exit(udevman->context);
525 static int hotplug_callback(struct libusb_context* ctx, struct libusb_device* dev,
526 libusb_hotplug_event event, void* user_data)
529 struct libusb_device_descriptor desc;
530 IUDEVMAN* idevman = (IUDEVMAN*)user_data;
531 const uint8_t bus = libusb_get_bus_number(dev);
532 const uint8_t addr = libusb_get_device_address(dev);
533 rc = libusb_get_device_descriptor(dev, &desc);
535 if (rc != LIBUSB_SUCCESS)
540 case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED:
541 add_device(idevman, bus, addr, desc.iManufacturer, desc.iProduct);
544 case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:
545 del_device(idevman, bus, addr, desc.iManufacturer, desc.iProduct);
555 static BOOL udevman_initialize(IUDEVMAN* idevman, UINT32 channelId)
557 UDEVMAN* udevman = (UDEVMAN*)idevman;
562 idevman->controlChannelId = channelId;
566 static void udevman_load_interface(UDEVMAN* udevman)
569 udevman->iface.free = udevman_free;
571 udevman->iface.rewind = udevman_rewind;
572 udevman->iface.get_next = udevman_get_next;
573 udevman->iface.has_next = udevman_has_next;
574 udevman->iface.register_udevice = udevman_register_udevice;
575 udevman->iface.unregister_udevice = udevman_unregister_udevice;
576 udevman->iface.get_udevice_by_UsbDevice = udevman_get_udevice_by_UsbDevice;
578 udevman->iface.check_device_exist_by_id = udevman_check_device_exist_by_id;
579 udevman->iface.isAutoAdd = udevman_is_auto_add;
581 BASIC_STATE_FUNC_REGISTER(defUsbDevice, udevman);
582 BASIC_STATE_FUNC_REGISTER(device_num, udevman);
583 BASIC_STATE_FUNC_REGISTER(sem_timeout, udevman);
584 /* control semaphore or mutex lock */
585 udevman->iface.loading_lock = udevman_loading_lock;
586 udevman->iface.loading_unlock = udevman_loading_unlock;
587 udevman->iface.initialize = udevman_initialize;
590 static BOOL urbdrc_udevman_register_devices(UDEVMAN* udevman, const char* devices)
596 char hardware_id[16];
597 const char* default_devices = "id";
598 UINT32 UsbDevice = BASE_USBDEVICE_NUM;
601 tmp = _strdup(default_devices);
603 tmp = _strdup(devices);
605 /* register all usb devices */
606 token = strtok(tmp, "#");
610 strcpy(hardware_id, token);
611 token = strtok(NULL, "#");
613 if (udevman->flags & UDEVMAN_FLAG_ADD_BY_VID_PID)
615 UINT16 idVendor, idProduct;
617 if (!udevman_parse_device_pid_vid(hardware_id, sizeof(hardware_id), &idVendor,
621 success = udevman->iface.register_udevice((IUDEVMAN*)udevman, 0, 0, UsbDevice, idVendor,
622 idProduct, UDEVMAN_FLAG_ADD_BY_VID_PID);
624 else if (udevman->flags & UDEVMAN_FLAG_ADD_BY_ADDR)
626 UINT16 bus_number, dev_number;
628 if (!udevman_parse_device_addr(hardware_id, sizeof(hardware_id), &bus_number,
632 success = udevman->iface.register_udevice((IUDEVMAN*)udevman, bus_number, dev_number,
633 UsbDevice, 0, 0, UDEVMAN_FLAG_ADD_BY_ADDR);
640 udevman->defUsbDevice = UsbDevice;
647 static UINT urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args)
651 LPSTR devices = NULL;
652 const UINT16 mask = UDEVMAN_FLAG_ADD_BY_VID_PID | UDEVMAN_FLAG_ADD_BY_ADDR;
653 COMMAND_LINE_ARGUMENT_A* arg;
654 COMMAND_LINE_ARGUMENT_A urbdrc_udevman_args[] = {
655 { "dbg", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "debug" },
656 { "dev", COMMAND_LINE_VALUE_REQUIRED, "<devices>", NULL, NULL, -1, NULL, "device list" },
657 { "id", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL,
658 "FLAG_ADD_BY_VID_PID" },
659 { "addr", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_ADDR" },
660 { "auto", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_AUTO" },
661 { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL }
664 flags = COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON;
665 status = CommandLineParseArgumentsA(args->argc, args->argv, urbdrc_udevman_args, flags, udevman,
668 if (status != CHANNEL_RC_OK)
671 arg = urbdrc_udevman_args;
675 if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
678 CommandLineSwitchStart(arg) CommandLineSwitchCase(arg, "dbg")
680 WLog_SetLogLevel(WLog_Get(TAG), WLOG_TRACE);
682 CommandLineSwitchCase(arg, "dev")
684 devices = arg->Value;
686 CommandLineSwitchCase(arg, "id")
688 udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID;
690 CommandLineSwitchCase(arg, "addr")
692 udevman->flags = UDEVMAN_FLAG_ADD_BY_ADDR;
694 CommandLineSwitchCase(arg, "auto")
696 udevman->flags |= UDEVMAN_FLAG_ADD_BY_AUTO;
698 CommandLineSwitchDefault(arg)
701 CommandLineSwitchEnd(arg)
702 } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
704 /* Can not add devices by address and VID/PID */
705 if ((udevman->flags & mask) == mask)
706 return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
708 /* Add listed devices after we know the format of addressing */
711 if (!urbdrc_udevman_register_devices(udevman, devices))
712 return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
715 return CHANNEL_RC_OK;
718 static BOOL poll_libusb_events(UDEVMAN* udevman)
720 int rc = LIBUSB_SUCCESS;
721 struct timeval tv = { 0, 500 };
722 if (libusb_try_lock_events(udevman->context))
724 if (libusb_event_handling_ok(udevman->context))
726 rc = libusb_handle_events_locked(udevman->context, &tv);
727 if (rc != LIBUSB_SUCCESS)
728 WLog_WARN(TAG, "libusb_handle_events_locked %d", rc);
730 libusb_unlock_events(udevman->context);
734 libusb_lock_event_waiters(udevman->context);
735 if (libusb_event_handler_active(udevman->context))
737 rc = libusb_wait_for_event(udevman->context, &tv);
738 if (rc < LIBUSB_SUCCESS)
739 WLog_WARN(TAG, "libusb_wait_for_event %d", rc);
741 libusb_unlock_event_waiters(udevman->context);
747 static DWORD poll_thread(LPVOID lpThreadParameter)
749 UDEVMAN* udevman = (UDEVMAN*)lpThreadParameter;
751 while (udevman->running)
753 poll_libusb_events(udevman);
759 #ifdef BUILTIN_CHANNELS
760 #define freerdp_urbdrc_client_subsystem_entry libusb_freerdp_urbdrc_client_subsystem_entry
762 #define freerdp_urbdrc_client_subsystem_entry FREERDP_API freerdp_urbdrc_client_subsystem_entry
764 int freerdp_urbdrc_client_subsystem_entry(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS pEntryPoints)
769 ADDIN_ARGV* args = pEntryPoints->args;
770 udevman = (PUDEVMAN)calloc(1, sizeof(UDEVMAN));
775 udevman->iface.plugin = pEntryPoints->plugin;
776 rc = libusb_init(&udevman->context);
778 if (rc != LIBUSB_SUCCESS)
781 udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID;
782 udevman->devman_loading = CreateMutexA(NULL, FALSE, "devman_loading");
784 if (!udevman->devman_loading)
787 /* load usb device service management */
788 udevman_load_interface(udevman);
789 status = urbdrc_udevman_parse_addin_args(udevman, args);
791 if (status != CHANNEL_RC_OK)
794 udevman->running = TRUE;
795 udevman->thread = CreateThread(NULL, 0, poll_thread, udevman, 0, NULL);
797 if (!udevman->thread)
800 rc = libusb_hotplug_register_callback(
801 udevman->context, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
802 LIBUSB_HOTPLUG_NO_FLAGS, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY,
803 LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, udevman, &udevman->handle);
805 if (rc != LIBUSB_SUCCESS)
808 if (!pEntryPoints->pRegisterUDEVMAN(pEntryPoints->plugin, (IUDEVMAN*)udevman))
811 WLog_DBG(TAG, "UDEVMAN device registered.");
814 udevman_free(&udevman->iface);