I don't know how Net- or Open- handle this, but FreeBSD returns the number of transmited bytes in req.ucr_actlen, not in req.ucr_request.wLength. (/usr/include/dev/usb/usb.h:544: int ucr_actlen; /* actual length transferred */ So then: --- bsd.c Sat Mar 4 03:52:46 2006 +++ ../../bsd.c Thu Aug 3 19:19:15 2006 @@ -476,8 +476,11 @@ if (ret < 0) USB_ERROR_STR(-errno, "error sending control message: %s", strerror(errno)); - +#ifdef __FreeBSD_kernel__ + return req.ucr_actlen; +#else return UGETW(req.ucr_request.wLength); +#endif } int usb_os_find_busses(struct usb_bus **busses)