2 * Copyright (C) 2005-2007 Takahiro Hirofuchi
5 #include "usbip_common.h"
9 #define PROGNAME "libusbip"
11 int usbip_use_syslog
= 0;
12 int usbip_use_stderr
= 0;
13 int usbip_use_debug
= 0;
21 static const struct speed_string speed_strings
[] = {
22 { USB_SPEED_UNKNOWN
, "unknown", "Unknown Speed"},
23 { USB_SPEED_LOW
, "1.5", "Low Speed(1.5Mbps)" },
24 { USB_SPEED_FULL
, "12", "Full Speed(12Mbps)" },
25 { USB_SPEED_HIGH
, "480", "High Speed(480Mbps)" },
29 struct portst_string
{
34 static struct portst_string portst_strings
[] = {
35 { SDEV_ST_AVAILABLE
, "Device Available" },
36 { SDEV_ST_USED
, "Device in Use" },
37 { SDEV_ST_ERROR
, "Device Error"},
38 { VDEV_ST_NULL
, "Port Available"},
39 { VDEV_ST_NOTASSIGNED
, "Port Initializing"},
40 { VDEV_ST_USED
, "Port in Use"},
41 { VDEV_ST_ERROR
, "Port Error"},
45 const char *usbip_status_string(int32_t status
)
47 for (int i
=0; portst_strings
[i
].desc
!= NULL
; i
++)
48 if (portst_strings
[i
].num
== status
)
49 return portst_strings
[i
].desc
;
51 return "Unknown Status";
54 const char *usbip_speed_string(int num
)
56 for (int i
=0; speed_strings
[i
].speed
!= NULL
; i
++)
57 if (speed_strings
[i
].num
== num
)
58 return speed_strings
[i
].desc
;
60 return "Unknown Speed";
64 #define DBG_UDEV_INTEGER(name)\
65 dbg("%-20s = %x", to_string(name), (int) udev->name)
67 #define DBG_UINF_INTEGER(name)\
68 dbg("%-20s = %x", to_string(name), (int) uinf->name)
70 void dump_usb_interface(struct usbip_usb_interface
*uinf
)
73 usbip_names_get_class(buff
, sizeof(buff
),
74 uinf
->bInterfaceClass
,
75 uinf
->bInterfaceSubClass
,
76 uinf
->bInterfaceProtocol
);
77 dbg("%-20s = %s", "Interface(C/SC/P)", buff
);
80 void dump_usb_device(struct usbip_usb_device
*udev
)
85 dbg("%-20s = %s", "path", udev
->path
);
86 dbg("%-20s = %s", "busid", udev
->busid
);
88 usbip_names_get_class(buff
, sizeof(buff
),
90 udev
->bDeviceSubClass
,
91 udev
->bDeviceProtocol
);
92 dbg("%-20s = %s", "Device(C/SC/P)", buff
);
94 DBG_UDEV_INTEGER(bcdDevice
);
96 usbip_names_get_product(buff
, sizeof(buff
),
99 dbg("%-20s = %s", "Vendor/Product", buff
);
101 DBG_UDEV_INTEGER(bNumConfigurations
);
102 DBG_UDEV_INTEGER(bNumInterfaces
);
104 dbg("%-20s = %s", "speed",
105 usbip_speed_string(udev
->speed
));
107 DBG_UDEV_INTEGER(busnum
);
108 DBG_UDEV_INTEGER(devnum
);
112 int read_attr_value(struct sysfs_device
*dev
, const char *name
, const char *format
)
114 char attrpath
[SYSFS_PATH_MAX
];
115 struct sysfs_attribute
*attr
;
119 snprintf(attrpath
, sizeof(attrpath
), "%s/%s", dev
->path
, name
);
121 attr
= sysfs_open_attribute(attrpath
);
123 dbg("sysfs_open_attribute failed: %s", attrpath
);
127 ret
= sysfs_read_attribute(attr
);
129 dbg("sysfs_read_attribute failed");
133 ret
= sscanf(attr
->value
, format
, &num
);
135 dbg("sscanf failed");
140 sysfs_close_attribute(attr
);
146 int read_attr_speed(struct sysfs_device
*dev
)
148 char attrpath
[SYSFS_PATH_MAX
];
149 struct sysfs_attribute
*attr
;
153 snprintf(attrpath
, sizeof(attrpath
), "%s/%s", dev
->path
, "speed");
155 attr
= sysfs_open_attribute(attrpath
);
157 dbg("sysfs_open_attribute failed: %s", attrpath
);
161 ret
= sysfs_read_attribute(attr
);
163 dbg("sysfs_read_attribute failed");
167 ret
= sscanf(attr
->value
, "%s\n", speed
);
169 dbg("sscanf failed");
173 sysfs_close_attribute(attr
);
175 for (int i
=0; speed_strings
[i
].speed
!= NULL
; i
++) {
176 if (!strcmp(speed
, speed_strings
[i
].speed
))
177 return speed_strings
[i
].num
;
180 return USB_SPEED_UNKNOWN
;
183 #define READ_ATTR(object, type, dev, name, format)\
184 do { (object)->name = (type) read_attr_value(dev, to_string(name), format); } while (0)
187 int read_usb_device(struct sysfs_device
*sdev
, struct usbip_usb_device
*udev
)
189 uint32_t busnum
, devnum
;
191 READ_ATTR(udev
, uint8_t, sdev
, bDeviceClass
, "%02x\n");
192 READ_ATTR(udev
, uint8_t, sdev
, bDeviceSubClass
, "%02x\n");
193 READ_ATTR(udev
, uint8_t, sdev
, bDeviceProtocol
, "%02x\n");
195 READ_ATTR(udev
, uint16_t, sdev
, idVendor
, "%04x\n");
196 READ_ATTR(udev
, uint16_t, sdev
, idProduct
, "%04x\n");
197 READ_ATTR(udev
, uint16_t, sdev
, bcdDevice
, "%04x\n");
199 READ_ATTR(udev
, uint8_t, sdev
, bConfigurationValue
, "%02x\n");
200 READ_ATTR(udev
, uint8_t, sdev
, bNumConfigurations
, "%02x\n");
201 READ_ATTR(udev
, uint8_t, sdev
, bNumInterfaces
, "%02x\n");
203 READ_ATTR(udev
, uint8_t, sdev
, devnum
, "%d\n");
204 udev
->speed
= read_attr_speed(sdev
);
206 strncpy(udev
->path
, sdev
->path
, SYSFS_PATH_MAX
);
207 strncpy(udev
->busid
, sdev
->name
, SYSFS_BUS_ID_SIZE
);
209 sscanf(sdev
->name
, "%u-%u", &busnum
, &devnum
);
210 udev
->busnum
= busnum
;
215 int read_usb_interface(struct usbip_usb_device
*udev
, int i
,
216 struct usbip_usb_interface
*uinf
)
218 char busid
[SYSFS_BUS_ID_SIZE
];
219 struct sysfs_device
*sif
;
221 sprintf(busid
, "%s:%d.%d", udev
->busid
, udev
->bConfigurationValue
, i
);
223 sif
= sysfs_open_device("usb", busid
);
225 dbg("sysfs_open_device(\"usb\", \"%s\") failed", busid
);
229 READ_ATTR(uinf
, uint8_t, sif
, bInterfaceClass
, "%02x\n");
230 READ_ATTR(uinf
, uint8_t, sif
, bInterfaceSubClass
, "%02x\n");
231 READ_ATTR(uinf
, uint8_t, sif
, bInterfaceProtocol
, "%02x\n");
233 sysfs_close_device(sif
);
238 int usbip_names_init(char *f
)
240 return names_init(f
);
243 void usbip_names_free()
248 void usbip_names_get_product(char *buff
, size_t size
, uint16_t vendor
, uint16_t product
)
250 const char *prod
, *vend
;
252 prod
= names_product(vendor
, product
);
254 prod
= "unknown product";
257 vend
= names_vendor(vendor
);
259 vend
= "unknown vendor";
261 snprintf(buff
, size
, "%s : %s (%04x:%04x)", vend
, prod
, vendor
, product
);
264 void usbip_names_get_class(char *buff
, size_t size
, uint8_t class, uint8_t subclass
, uint8_t protocol
)
266 const char *c
, *s
, *p
;
268 if (class == 0 && subclass
== 0 && protocol
== 0) {
269 snprintf(buff
, size
, "(Defined at Interface level) (%02x/%02x/%02x)", class, subclass
, protocol
);
273 p
= names_protocol(class, subclass
, protocol
);
275 p
= "unknown protocol";
277 s
= names_subclass(class, subclass
);
279 s
= "unknown subclass";
281 c
= names_class(class);
285 snprintf(buff
, size
, "%s / %s / %s (%02x/%02x/%02x)", c
, s
, p
, class, subclass
, protocol
);