Blame channels/urbdrc/client/urbdrc_types.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * RemoteFX USB Redirection
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Atrust corp.
Packit 1fb8d4
 * Copyright 2012 Alfred Liu <alfred.liu@atruscorp.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef FREERDP_CHANNEL_URBDRC_CLIENT_TYPES_H
Packit 1fb8d4
#define FREERDP_CHANNEL_URBDRC_CLIENT_TYPES_H
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/dvc.h>
Packit 1fb8d4
#include <freerdp/types.h>
Packit 1fb8d4
#include <freerdp/channels/log.h>
Packit 1fb8d4
#include <freerdp/utils/msusb.h>
Packit 1fb8d4
Packit 1fb8d4
#include <uuid.h>
Packit 1fb8d4
#include <pthread.h>
Packit 1fb8d4
#include <semaphore.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
Packit 1fb8d4
#define TAG CHANNELS_TAG("urbdrc.client")
Packit 1fb8d4
#ifdef WITH_DEBUG_DVC
Packit 1fb8d4
#define DEBUG_DVC(...) WLog_DBG(TAG, __VA_ARGS__)
Packit 1fb8d4
#else
Packit 1fb8d4
#define DEBUG_DVC(...) do { } while (0)
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#define CAPABILITIES_NEGOTIATOR				0x00000000
Packit 1fb8d4
#define CLIENT_DEVICE_SINK				0x00000001
Packit 1fb8d4
#define SERVER_CHANNEL_NOTIFICATION			0x00000002
Packit 1fb8d4
#define CLIENT_CHANNEL_NOTIFICATION			0x00000003
Packit 1fb8d4
#define BASE_USBDEVICE_NUM				0x00000005
Packit 1fb8d4
Packit 1fb8d4
#define RIMCALL_RELEASE					0x00000001
Packit 1fb8d4
#define RIM_EXCHANGE_CAPABILITY_REQUEST			0x00000100
Packit 1fb8d4
#define CHANNEL_CREATED					0x00000100
Packit 1fb8d4
#define ADD_VIRTUAL_CHANNEL				0x00000100
Packit 1fb8d4
#define ADD_DEVICE					0x00000101
Packit 1fb8d4
Packit 1fb8d4
#define INIT_CHANNEL_IN					1
Packit 1fb8d4
#define INIT_CHANNEL_OUT				0
Packit 1fb8d4
Packit 1fb8d4
/* InterfaceClass */
Packit 1fb8d4
#define CLASS_RESERVE					0x00
Packit 1fb8d4
#define CLASS_AUDIO					0x01
Packit 1fb8d4
#define CLASS_COMMUNICATION_IF				0x02
Packit 1fb8d4
#define CLASS_HID					0x03
Packit 1fb8d4
#define CLASS_PHYSICAL					0x05
Packit 1fb8d4
#define CLASS_IMAGE					0x06
Packit 1fb8d4
#define CLASS_PRINTER					0x07
Packit 1fb8d4
#define CLASS_MASS_STORAGE				0x08
Packit 1fb8d4
#define CLASS_HUB					0x09
Packit 1fb8d4
#define CLASS_COMMUNICATION_DATA_IF			0x0a
Packit 1fb8d4
#define CLASS_SMART_CARD				0x0b
Packit 1fb8d4
#define CLASS_CONTENT_SECURITY				0x0d
Packit 1fb8d4
#define CLASS_VIDEO					0x0e
Packit 1fb8d4
#define CLASS_PERSONAL_HEALTHCARE			0x0f
Packit 1fb8d4
#define CLASS_DIAGNOSTIC				0xdc
Packit 1fb8d4
#define CLASS_WIRELESS_CONTROLLER			0xe0
Packit 1fb8d4
#define CLASS_ELSE_DEVICE				0xef
Packit 1fb8d4
#define CLASS_DEPENDENCE				0xfe
Packit 1fb8d4
#define CLASS_VENDOR_DEPENDENCE				0xff
Packit 1fb8d4
Packit 1fb8d4
/* usb version */
Packit 1fb8d4
#define USB_v1_0					0x100
Packit 1fb8d4
#define USB_v1_1					0x110
Packit 1fb8d4
#define USB_v2_0					0x200
Packit 1fb8d4
#define USB_v3_0					0x300
Packit 1fb8d4
Packit 1fb8d4
#define STREAM_ID_NONE					0x0
Packit 1fb8d4
#define STREAM_ID_PROXY					0x1
Packit 1fb8d4
#define STREAM_ID_STUB					0x2
Packit 1fb8d4
Packit 1fb8d4
#define CANCEL_REQUEST					0x00000100
Packit 1fb8d4
#define REGISTER_REQUEST_CALLBACK			0x00000101
Packit 1fb8d4
#define IO_CONTROL					0x00000102
Packit 1fb8d4
#define INTERNAL_IO_CONTROL				0x00000103
Packit 1fb8d4
#define QUERY_DEVICE_TEXT				0x00000104
Packit 1fb8d4
#define TRANSFER_IN_REQUEST				0x00000105
Packit 1fb8d4
#define TRANSFER_OUT_REQUEST				0x00000106
Packit 1fb8d4
#define RETRACT_DEVICE					0x00000107
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
#define IOCONTROL_COMPLETION				0x00000100
Packit 1fb8d4
#define URB_COMPLETION					0x00000101
Packit 1fb8d4
#define URB_COMPLETION_NO_DATA				0x00000102
Packit 1fb8d4
Packit 1fb8d4
/* The USB device is to be stopped from being redirected because the
Packit 1fb8d4
 * device is blocked by the server's policy. */
Packit 1fb8d4
#define UsbRetractReason_BlockedByPolicy		0x00000001
Packit 1fb8d4
Packit 1fb8d4
enum device_text_type
Packit 1fb8d4
{
Packit 1fb8d4
	DeviceTextDescription = 0,
Packit 1fb8d4
	DeviceTextLocationInformation = 1,
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
enum device_descriptor_table
Packit 1fb8d4
{
Packit 1fb8d4
	B_LENGTH = 0,
Packit 1fb8d4
	B_DESCRIPTOR_TYPE = 1,
Packit 1fb8d4
	BCD_USB = 2,
Packit 1fb8d4
	B_DEVICE_CLASS = 4,
Packit 1fb8d4
	B_DEVICE_SUBCLASS = 5,
Packit 1fb8d4
	B_DEVICE_PROTOCOL = 6,
Packit 1fb8d4
	B_MAX_PACKET_SIZE0 = 7,
Packit 1fb8d4
	ID_VENDOR = 8,
Packit 1fb8d4
	ID_PRODUCT = 10,
Packit 1fb8d4
	BCD_DEVICE = 12,
Packit 1fb8d4
	I_MANUFACTURER = 14,
Packit 1fb8d4
	I_PRODUCT = 15,
Packit 1fb8d4
	I_SERIAL_NUMBER = 16,
Packit 1fb8d4
	B_NUM_CONFIGURATIONS = 17
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
#define PIPE_CANCEL						0
Packit 1fb8d4
#define PIPE_RESET						1
Packit 1fb8d4
Packit 1fb8d4
#define IOCTL_INTERNAL_USB_SUBMIT_URB				0x00220003
Packit 1fb8d4
#define IOCTL_INTERNAL_USB_RESET_PORT				0x00220007
Packit 1fb8d4
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS			0x00220013
Packit 1fb8d4
#define IOCTL_INTERNAL_USB_CYCLE_PORT				0x0022001F
Packit 1fb8d4
#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION		0x00220027
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
#define URB_FUNCTION_SELECT_CONFIGURATION			0x0000
Packit 1fb8d4
#define URB_FUNCTION_SELECT_INTERFACE				0x0001
Packit 1fb8d4
#define URB_FUNCTION_ABORT_PIPE					0x0002
Packit 1fb8d4
#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL			0x0003
Packit 1fb8d4
#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL		0x0004
Packit 1fb8d4
#define URB_FUNCTION_GET_FRAME_LENGTH				0x0005
Packit 1fb8d4
#define URB_FUNCTION_SET_FRAME_LENGTH				0x0006
Packit 1fb8d4
#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER			0x0007
Packit 1fb8d4
#define URB_FUNCTION_CONTROL_TRANSFER				0x0008
Packit 1fb8d4
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER			0x0009
Packit 1fb8d4
#define URB_FUNCTION_ISOCH_TRANSFER				0x000A
Packit 1fb8d4
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE			0x000B
Packit 1fb8d4
#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE			0x000C
Packit 1fb8d4
#define URB_FUNCTION_SET_FEATURE_TO_DEVICE			0x000D
Packit 1fb8d4
#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE			0x000E
Packit 1fb8d4
#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT			0x000F
Packit 1fb8d4
#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE			0x0010
Packit 1fb8d4
#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE			0x0011
Packit 1fb8d4
#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT			0x0012
Packit 1fb8d4
#define URB_FUNCTION_GET_STATUS_FROM_DEVICE			0x0013
Packit 1fb8d4
#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE			0x0014
Packit 1fb8d4
#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT			0x0015
Packit 1fb8d4
#define URB_FUNCTION_RESERVED_0X0016				0x0016
Packit 1fb8d4
#define URB_FUNCTION_VENDOR_DEVICE				0x0017
Packit 1fb8d4
#define URB_FUNCTION_VENDOR_INTERFACE				0x0018
Packit 1fb8d4
#define URB_FUNCTION_VENDOR_ENDPOINT				0x0019
Packit 1fb8d4
#define URB_FUNCTION_CLASS_DEVICE				0x001A
Packit 1fb8d4
#define URB_FUNCTION_CLASS_INTERFACE				0x001B
Packit 1fb8d4
#define URB_FUNCTION_CLASS_ENDPOINT				0x001C
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X001D				0x001D
Packit 1fb8d4
#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL		0x001E
Packit 1fb8d4
#define URB_FUNCTION_CLASS_OTHER				0x001F
Packit 1fb8d4
#define URB_FUNCTION_VENDOR_OTHER				0x0020
Packit 1fb8d4
#define URB_FUNCTION_GET_STATUS_FROM_OTHER			0x0021
Packit 1fb8d4
#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER			0x0022
Packit 1fb8d4
#define URB_FUNCTION_SET_FEATURE_TO_OTHER			0x0023
Packit 1fb8d4
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT		0x0024
Packit 1fb8d4
#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT			0x0025
Packit 1fb8d4
#define URB_FUNCTION_GET_CONFIGURATION				0x0026
Packit 1fb8d4
#define URB_FUNCTION_GET_INTERFACE				0x0027
Packit 1fb8d4
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE		0x0028
Packit 1fb8d4
#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE		0x0029
Packit 1fb8d4
#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR			0x002A
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X002B				0x002B
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X002C				0x002C
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X002D				0x002D
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X002E				0x002E
Packit 1fb8d4
#define URB_FUNCTION_RESERVE_0X002F				0x002F
Packit 1fb8d4
// USB 2.0 calls start at 0x0030
Packit 1fb8d4
#define URB_FUNCTION_SYNC_RESET_PIPE				0x0030
Packit 1fb8d4
#define URB_FUNCTION_SYNC_CLEAR_STALL				0x0031
Packit 1fb8d4
#define URB_FUNCTION_CONTROL_TRANSFER_EX			0x0032
Packit 1fb8d4
Packit 1fb8d4
#define USBD_STATUS_SUCCESS					0x0
Packit 1fb8d4
#define USBD_STATUS_PENDING					0x40000000
Packit 1fb8d4
#define USBD_STATUS_CANCELED					0xC0010000
Packit 1fb8d4
Packit 1fb8d4
#define USBD_STATUS_CRC						0xC0000001
Packit 1fb8d4
#define USBD_STATUS_BTSTUFF					0xC0000002
Packit 1fb8d4
#define USBD_STATUS_DATA_TOGGLE_MISMATCH			0xC0000003
Packit 1fb8d4
#define USBD_STATUS_STALL_PID					0xC0000004
Packit 1fb8d4
#define USBD_STATUS_DEV_NOT_RESPONDING				0xC0000005
Packit 1fb8d4
#define USBD_STATUS_PID_CHECK_FAILURE				0xC0000006
Packit 1fb8d4
#define USBD_STATUS_UNEXPECTED_PID				0xC0000007
Packit 1fb8d4
#define USBD_STATUS_DATA_OVERRUN				0xC0000008
Packit 1fb8d4
#define USBD_STATUS_DATA_UNDERRUN				0xC0000009
Packit 1fb8d4
#define USBD_STATUS_RESERVED1					0xC000000A
Packit 1fb8d4
#define USBD_STATUS_RESERVED2					0xC000000B
Packit 1fb8d4
#define USBD_STATUS_BUFFER_OVERRUN				0xC000000C
Packit 1fb8d4
#define USBD_STATUS_BUFFER_UNDERRUN				0xC000000D
Packit 1fb8d4
Packit 1fb8d4
/* unknown */
Packit 1fb8d4
#define USBD_STATUS_NO_DATA					0xC000000E
Packit 1fb8d4
Packit 1fb8d4
#define USBD_STATUS_NOT_ACCESSED				0xC000000F
Packit 1fb8d4
#define USBD_STATUS_FIFO					0xC0000010
Packit 1fb8d4
#define USBD_STATUS_XACT_ERROR					0xC0000011
Packit 1fb8d4
#define USBD_STATUS_BABBLE_DETECTED				0xC0000012
Packit 1fb8d4
#define USBD_STATUS_DATA_BUFFER_ERROR				0xC0000013
Packit 1fb8d4
Packit 1fb8d4
#define USBD_STATUS_NOT_SUPPORTED				0xC0000E00
Packit 1fb8d4
#define USBD_STATUS_BUFFER_TOO_SMALL				0xC0003000
Packit 1fb8d4
#define USBD_STATUS_TIMEOUT					0xC0006000
Packit 1fb8d4
#define USBD_STATUS_DEVICE_GONE					0xC0007000
Packit 1fb8d4
Packit 1fb8d4
#define USBD_STATUS_NO_MEMORY					0x80000100
Packit 1fb8d4
#define USBD_STATUS_INVALID_URB_FUNCTION			0x80000200
Packit 1fb8d4
#define USBD_STATUS_INVALID_PARAMETER				0x80000300
Packit 1fb8d4
#define USBD_STATUS_REQUEST_FAILED				0x80000500
Packit 1fb8d4
#define USBD_STATUS_INVALID_PIPE_HANDLE				0x80000600
Packit 1fb8d4
#define USBD_STATUS_ERROR_SHORT_TRANSFER			0x80000900
Packit 1fb8d4
Packit 1fb8d4
// Values for URB TransferFlags Field
Packit 1fb8d4
//
Packit 1fb8d4
Packit 1fb8d4
/*
Packit 1fb8d4
	Set if data moves device->host
Packit 1fb8d4
*/
Packit 1fb8d4
#define USBD_TRANSFER_DIRECTION					0x00000001
Packit 1fb8d4
/*
Packit 1fb8d4
	This bit if not set indicates that a short packet, and hence,
Packit 1fb8d4
	a short transfer is an error condition
Packit 1fb8d4
*/
Packit 1fb8d4
#define USBD_SHORT_TRANSFER_OK					0x00000002
Packit 1fb8d4
/*
Packit 1fb8d4
	Subit the iso transfer on the next frame
Packit 1fb8d4
*/
Packit 1fb8d4
#define USBD_START_ISO_TRANSFER_ASAP				0x00000004
Packit 1fb8d4
#define USBD_DEFAULT_PIPE_TRANSFER				0x00000008
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
#define USBD_TRANSFER_DIRECTION_FLAG(flags)			((flags) & USBD_TRANSFER_DIRECTION)
Packit 1fb8d4
Packit 1fb8d4
#define USBD_TRANSFER_DIRECTION_OUT				0
Packit 1fb8d4
#define USBD_TRANSFER_DIRECTION_IN				1
Packit 1fb8d4
Packit 1fb8d4
#define VALID_TRANSFER_FLAGS_MASK				USBD_SHORT_TRANSFER_OK | \
Packit 1fb8d4
	USBD_TRANSFER_DIRECTION | \
Packit 1fb8d4
	USBD_START_ISO_TRANSFER_ASAP | \
Packit 1fb8d4
	USBD_DEFAULT_PIPE_TRANSFER)
Packit 1fb8d4
Packit 1fb8d4
#define ENDPOINT_HALT						0x00
Packit 1fb8d4
#define DEVICE_REMOTE_WAKEUP					0x01
Packit 1fb8d4
Packit 1fb8d4
/* transfer type */
Packit 1fb8d4
#define CONTROL_TRANSFER					0x00
Packit 1fb8d4
#define ISOCHRONOUS_TRANSFER					0x01
Packit 1fb8d4
#define BULK_TRANSFER						0x02
Packit 1fb8d4
#define INTERRUPT_TRANSFER					0x03
Packit 1fb8d4
Packit 1fb8d4
#define ClearHubFeature						(0x2000 | LIBUSB_REQUEST_CLEAR_FEATURE)
Packit 1fb8d4
#define ClearPortFeature					(0x2300 | LIBUSB_REQUEST_CLEAR_FEATURE)
Packit 1fb8d4
#define GetHubDescriptor					(0xa000 | LIBUSB_REQUEST_GET_DESCRIPTOR)
Packit 1fb8d4
#define GetHubStatus						(0xa000 | LIBUSB_REQUEST_GET_STATUS)
Packit 1fb8d4
#define GetPortStatus						(0xa300 | LIBUSB_REQUEST_GET_STATUS)
Packit 1fb8d4
#define SetHubFeature						(0x2000 | LIBUSB_REQUEST_SET_FEATURE)
Packit 1fb8d4
#define SetPortFeature						(0x2300 | LIBUSB_REQUEST_SET_FEATURE)
Packit 1fb8d4
Packit 1fb8d4
#define USBD_PF_CHANGE_MAX_PACKET				0x00000001
Packit 1fb8d4
#define USBD_PF_SHORT_PACKET_OPT				0x00000002
Packit 1fb8d4
#define USBD_PF_ENABLE_RT_THREAD_ACCESS				0x00000004
Packit 1fb8d4
#define USBD_PF_MAP_ADD_TRANSFERS				0x00000008
Packit 1fb8d4
Packit 1fb8d4
/* feature request */
Packit 1fb8d4
#define URB_SET_FEATURE						0x00
Packit 1fb8d4
#define URB_CLEAR_FEATURE					0x01
Packit 1fb8d4
Packit 1fb8d4
#define USBD_PF_CHANGE_MAX_PACKET				0x00000001
Packit 1fb8d4
#define USBD_PF_SHORT_PACKET_OPT				0x00000002
Packit 1fb8d4
#define USBD_PF_ENABLE_RT_THREAD_ACCESS				0x00000004
Packit 1fb8d4
#define USBD_PF_MAP_ADD_TRANSFERS				0x00000008
Packit 1fb8d4
Packit 1fb8d4
#define URB_CONTROL_TRANSFER_EXTERNAL				0x1
Packit 1fb8d4
#define URB_CONTROL_TRANSFER_NONEXTERNAL			0x0
Packit 1fb8d4
Packit 1fb8d4
#define USBFS_URB_SHORT_NOT_OK					0x01
Packit 1fb8d4
#define USBFS_URB_ISO_ASAP					0x02
Packit 1fb8d4
#define USBFS_URB_BULK_CONTINUATION				0x04
Packit 1fb8d4
#define USBFS_URB_QUEUE_BULK					0x10
Packit 1fb8d4
Packit 1fb8d4
#define URBDRC_DEVICE_INITIALIZED				0x01
Packit 1fb8d4
#define URBDRC_DEVICE_NOT_FOUND					0x02
Packit 1fb8d4
#define URBDRC_DEVICE_SIGNAL_END				0x04
Packit 1fb8d4
#define URBDRC_DEVICE_CHANNEL_CLOSED				0x08
Packit 1fb8d4
#define URBDRC_DEVICE_ALREADY_SEND				0x10
Packit 1fb8d4
#define URBDRC_DEVICE_DETACH_KERNEL				0x20
Packit 1fb8d4
Packit 1fb8d4
#define UDEVMAN_FLAG_ADD_BY_VID_PID				0x01
Packit 1fb8d4
#define UDEVMAN_FLAG_ADD_BY_ADDR				0x02
Packit 1fb8d4
#define UDEVMAN_FLAG_ADD_BY_AUTO				0x04
Packit 1fb8d4
#define UDEVMAN_FLAG_DEBUG					0x08
Packit 1fb8d4
Packit 1fb8d4
#define MAX_URB_REQUSET_NUM					0x80
Packit 1fb8d4
Packit 1fb8d4
#define LOG_LEVEL 1
Packit 1fb8d4
Packit 1fb8d4
#define dummy_wait_obj(void) do{ sleep(5); } while(0)
Packit 1fb8d4
#define dummy_wait_s_obj(_s) do{ sleep(_s); } while(0)
Packit 1fb8d4
Packit 1fb8d4
#define ISOCH_FIFO						1
Packit 1fb8d4
#define WAIT_COMPLETE_SLEEP					10000  /* for cpu high loading */
Packit 1fb8d4
Packit 1fb8d4
#define urbdrc_get_mstime(_t) do { \
Packit 1fb8d4
		struct timeval _tp; \
Packit 1fb8d4
		gettimeofday(&_tp, 0); \
Packit 1fb8d4
		_t = (_tp.tv_sec * 1000) + (_tp.tv_usec / 1000); \
Packit 1fb8d4
	} while (0)
Packit 1fb8d4
Packit 1fb8d4
#endif /* FREERDP_CHANNEL_URBDRC_CLIENT_TYPES_H */