diff options
Diffstat (limited to 'tools/usb/usbip/src')
| -rw-r--r-- | tools/usb/usbip/src/usbip_attach.c | 10 | ||||
| -rw-r--r-- | tools/usb/usbip/src/usbip_list.c | 96 | ||||
| -rw-r--r-- | tools/usb/usbip/src/usbip_port.c | 13 | ||||
| -rw-r--r-- | tools/usb/usbip/src/usbipd.c | 42 | 
4 files changed, 140 insertions, 21 deletions
diff --git a/tools/usb/usbip/src/usbip_attach.c b/tools/usb/usbip/src/usbip_attach.c index d58a14dfc094..70a6b507fb62 100644 --- a/tools/usb/usbip/src/usbip_attach.c +++ b/tools/usb/usbip/src/usbip_attach.c @@ -1,6 +1,9 @@  /*   * Copyright (C) 2011 matt mooney <[email protected]>   *               2005-2007 Takahiro Hirofuchi + * Copyright (C) 2015-2016 Samsung Electronics + *               Igor Kotrasinski <[email protected]> + *               Krzysztof Opasiak <[email protected]>   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -36,7 +39,8 @@  static const char usbip_attach_usage_string[] =  	"usbip attach <args>\n"  	"    -r, --remote=<host>      The machine with exported USB devices\n" -	"    -b, --busid=<busid>    Busid of the device on <host>\n"; +	"    -b, --busid=<busid>    Busid of the device on <host>\n" +	"    -d, --device=<devid>    Id of the virtual UDC on <host>\n";  void usbip_attach_usage(void)  { @@ -203,6 +207,7 @@ int usbip_attach(int argc, char *argv[])  	static const struct option opts[] = {  		{ "remote", required_argument, NULL, 'r' },  		{ "busid",  required_argument, NULL, 'b' }, +		{ "device",  required_argument, NULL, 'd' },  		{ NULL, 0,  NULL, 0 }  	};  	char *host = NULL; @@ -211,7 +216,7 @@ int usbip_attach(int argc, char *argv[])  	int ret = -1;  	for (;;) { -		opt = getopt_long(argc, argv, "r:b:", opts, NULL); +		opt = getopt_long(argc, argv, "d:r:b:", opts, NULL);  		if (opt == -1)  			break; @@ -220,6 +225,7 @@ int usbip_attach(int argc, char *argv[])  		case 'r':  			host = optarg;  			break; +		case 'd':  		case 'b':  			busid = optarg;  			break; diff --git a/tools/usb/usbip/src/usbip_list.c b/tools/usb/usbip/src/usbip_list.c index d5ce34a410e7..f1b38e866dd7 100644 --- a/tools/usb/usbip/src/usbip_list.c +++ b/tools/usb/usbip/src/usbip_list.c @@ -1,6 +1,9 @@  /*   * Copyright (C) 2011 matt mooney <[email protected]>   *               2005-2007 Takahiro Hirofuchi + * Copyright (C) 2015-2016 Samsung Electronics + *               Igor Kotrasinski <[email protected]> + *               Krzysztof Opasiak <[email protected]>   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -30,6 +33,10 @@  #include <netdb.h>  #include <unistd.h> +#include <dirent.h> + +#include <linux/usb/ch9.h> +  #include "usbip_common.h"  #include "usbip_network.h"  #include "usbip.h" @@ -205,8 +212,10 @@ static int list_devices(bool parsable)  		/* Get device information. */  		idVendor = udev_device_get_sysattr_value(dev, "idVendor");  		idProduct = udev_device_get_sysattr_value(dev, "idProduct"); -		bConfValue = udev_device_get_sysattr_value(dev, "bConfigurationValue"); -		bNumIntfs = udev_device_get_sysattr_value(dev, "bNumInterfaces"); +		bConfValue = udev_device_get_sysattr_value(dev, +				"bConfigurationValue"); +		bNumIntfs = udev_device_get_sysattr_value(dev, +				"bNumInterfaces");  		busid = udev_device_get_sysname(dev);  		if (!idVendor || !idProduct || !bConfValue || !bNumIntfs) {  			err("problem getting device attributes: %s", @@ -237,12 +246,90 @@ err_out:  	return ret;  } +static int list_gadget_devices(bool parsable) +{ +	int ret = -1; +	struct udev *udev; +	struct udev_enumerate *enumerate; +	struct udev_list_entry *devices, *dev_list_entry; +	struct udev_device *dev; +	const char *path; +	const char *driver; + +	const struct usb_device_descriptor *d_desc; +	const char *descriptors; +	char product_name[128]; + +	uint16_t idVendor; +	char idVendor_buf[8]; +	uint16_t idProduct; +	char idProduct_buf[8]; +	const char *busid; + +	udev = udev_new(); +	enumerate = udev_enumerate_new(udev); + +	udev_enumerate_add_match_subsystem(enumerate, "platform"); + +	udev_enumerate_scan_devices(enumerate); +	devices = udev_enumerate_get_list_entry(enumerate); + +	udev_list_entry_foreach(dev_list_entry, devices) { +		path = udev_list_entry_get_name(dev_list_entry); +		dev = udev_device_new_from_syspath(udev, path); + +		driver = udev_device_get_driver(dev); +		/* We only have mechanism to enumerate gadgets bound to vudc */ +		if (driver == NULL || strcmp(driver, USBIP_DEVICE_DRV_NAME)) +			continue; + +		/* Get device information. */ +		descriptors = udev_device_get_sysattr_value(dev, +				VUDC_DEVICE_DESCR_FILE); + +		if (!descriptors) { +			err("problem getting device attributes: %s", +			    strerror(errno)); +			goto err_out; +		} + +		d_desc = (const struct usb_device_descriptor *) descriptors; + +		idVendor = le16toh(d_desc->idVendor); +		sprintf(idVendor_buf, "0x%4x", idVendor); +		idProduct = le16toh(d_desc->idProduct); +		sprintf(idProduct_buf, "0x%4x", idVendor); +		busid = udev_device_get_sysname(dev); + +		/* Get product name. */ +		usbip_names_get_product(product_name, sizeof(product_name), +					le16toh(idVendor), +					le16toh(idProduct)); + +		/* Print information. */ +		print_device(busid, idVendor_buf, idProduct_buf, parsable); +		print_product_name(product_name, parsable); + +		printf("\n"); + +		udev_device_unref(dev); +	} +	ret = 0; + +err_out: +	udev_enumerate_unref(enumerate); +	udev_unref(udev); + +	return ret; +} +  int usbip_list(int argc, char *argv[])  {  	static const struct option opts[] = {  		{ "parsable", no_argument,       NULL, 'p' },  		{ "remote",   required_argument, NULL, 'r' },  		{ "local",    no_argument,       NULL, 'l' }, +		{ "device",    no_argument,       NULL, 'd' },  		{ NULL,       0,                 NULL,  0  }  	}; @@ -254,7 +341,7 @@ int usbip_list(int argc, char *argv[])  		err("failed to open %s", USBIDS_FILE);  	for (;;) { -		opt = getopt_long(argc, argv, "pr:l", opts, NULL); +		opt = getopt_long(argc, argv, "pr:ld", opts, NULL);  		if (opt == -1)  			break; @@ -269,6 +356,9 @@ int usbip_list(int argc, char *argv[])  		case 'l':  			ret = list_devices(parsable);  			goto out; +		case 'd': +			ret = list_gadget_devices(parsable); +			goto out;  		default:  			goto err_out;  		} diff --git a/tools/usb/usbip/src/usbip_port.c b/tools/usb/usbip/src/usbip_port.c index a2e884fd9226..7bd74fb3a9cd 100644 --- a/tools/usb/usbip/src/usbip_port.c +++ b/tools/usb/usbip/src/usbip_port.c @@ -22,10 +22,13 @@ static int list_imported_devices(void)  	struct usbip_imported_device *idev;  	int ret; +	if (usbip_names_init(USBIDS_FILE)) +		err("failed to open %s", USBIDS_FILE); +  	ret = usbip_vhci_driver_open();  	if (ret < 0) {  		err("open vhci_driver"); -		return -1; +		goto err_names_free;  	}  	printf("Imported USB devices\n"); @@ -35,13 +38,19 @@ static int list_imported_devices(void)  		idev = &vhci_driver->idev[i];  		if (usbip_vhci_imported_device_dump(idev) < 0) -			ret = -1; +			goto err_driver_close;  	}  	usbip_vhci_driver_close(); +	usbip_names_free();  	return ret; +err_driver_close: +	usbip_vhci_driver_close(); +err_names_free: +	usbip_names_free(); +	return -1;  }  int usbip_port_show(__attribute__((unused)) int argc, diff --git a/tools/usb/usbip/src/usbipd.c b/tools/usb/usbip/src/usbipd.c index 2a7cd2b8d966..a0972dea9e6c 100644 --- a/tools/usb/usbip/src/usbipd.c +++ b/tools/usb/usbip/src/usbipd.c @@ -1,6 +1,9 @@  /*   * Copyright (C) 2011 matt mooney <[email protected]>   *               2005-2007 Takahiro Hirofuchi + * Copyright (C) 2015-2016 Samsung Electronics + *               Igor Kotrasinski <[email protected]> + *               Krzysztof Opasiak <[email protected]>   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -41,6 +44,8 @@  #include <poll.h>  #include "usbip_host_driver.h" +#include "usbip_host_common.h" +#include "usbip_device_driver.h"  #include "usbip_common.h"  #include "usbip_network.h"  #include "list.h" @@ -64,6 +69,11 @@ static const char usbipd_help_string[] =  	"	-6, --ipv6\n"  	"		Bind to IPv6. Default is both.\n"  	"\n" +	"	-e, --device\n" +	"		Run in device mode.\n" +	"		Rather than drive an attached device, create\n" +	"		a virtual UDC to bind gadgets to.\n" +	"\n"  	"	-D, --daemon\n"  	"		Run as a daemon process.\n"  	"\n" @@ -83,6 +93,8 @@ static const char usbipd_help_string[] =  	"	-v, --version\n"  	"		Show version.\n"; +static struct usbip_host_driver *driver; +  static void usbipd_help(void)  {  	printf("%s\n", usbipd_help_string); @@ -107,7 +119,7 @@ static int recv_request_import(int sockfd)  	}  	PACK_OP_IMPORT_REQUEST(0, &req); -	list_for_each(i, &host_driver->edev_list) { +	list_for_each(i, &driver->edev_list) {  		edev = list_entry(i, struct usbip_exported_device, node);  		if (!strncmp(req.busid, edev->udev.busid, SYSFS_BUS_ID_SIZE)) {  			info("found requested device: %s", req.busid); @@ -121,7 +133,7 @@ static int recv_request_import(int sockfd)  		usbip_net_set_nodelay(sockfd);  		/* export device needs a TCP/IP socket descriptor */ -		rc = usbip_host_export_device(edev, sockfd); +		rc = usbip_export_device(edev, sockfd);  		if (rc < 0)  			error = 1;  	} else { @@ -166,7 +178,7 @@ static int send_reply_devlist(int connfd)  	reply.ndev = 0;  	/* number of exported devices */ -	list_for_each(j, &host_driver->edev_list) { +	list_for_each(j, &driver->edev_list) {  		reply.ndev += 1;  	}  	info("exportable devices: %d", reply.ndev); @@ -184,7 +196,7 @@ static int send_reply_devlist(int connfd)  		return -1;  	} -	list_for_each(j, &host_driver->edev_list) { +	list_for_each(j, &driver->edev_list) {  		edev = list_entry(j, struct usbip_exported_device, node);  		dump_usb_device(&edev->udev);  		memcpy(&pdu_udev, &edev->udev, sizeof(pdu_udev)); @@ -246,7 +258,7 @@ static int recv_pdu(int connfd)  		return -1;  	} -	ret = usbip_host_refresh_device_list(); +	ret = usbip_refresh_device_list(driver);  	if (ret < 0) {  		dbg("could not refresh device list: %d", ret);  		return -1; @@ -491,16 +503,13 @@ static int do_standalone_mode(int daemonize, int ipv4, int ipv6)  	struct timespec timeout;  	sigset_t sigmask; -	if (usbip_host_driver_open()) { -		err("please load " USBIP_CORE_MOD_NAME ".ko and " -		    USBIP_HOST_DRV_NAME ".ko!"); +	if (usbip_driver_open(driver))  		return -1; -	}  	if (daemonize) {  		if (daemon(0, 0) < 0) {  			err("daemonizing failed: %s", strerror(errno)); -			usbip_host_driver_close(); +			usbip_driver_close(driver);  			return -1;  		}  		umask(0); @@ -525,7 +534,7 @@ static int do_standalone_mode(int daemonize, int ipv4, int ipv6)  	ai_head = do_getaddrinfo(NULL, family);  	if (!ai_head) { -		usbip_host_driver_close(); +		usbip_driver_close(driver);  		return -1;  	}  	nsockfd = listen_all_addrinfo(ai_head, sockfdlist, @@ -533,7 +542,7 @@ static int do_standalone_mode(int daemonize, int ipv4, int ipv6)  	freeaddrinfo(ai_head);  	if (nsockfd <= 0) {  		err("failed to open a listening socket"); -		usbip_host_driver_close(); +		usbip_driver_close(driver);  		return -1;  	} @@ -574,7 +583,7 @@ static int do_standalone_mode(int daemonize, int ipv4, int ipv6)  	info("shutting down " PROGNAME);  	free(fds); -	usbip_host_driver_close(); +	usbip_driver_close(driver);  	return 0;  } @@ -587,6 +596,7 @@ int main(int argc, char *argv[])  		{ "daemon",   no_argument,       NULL, 'D' },  		{ "daemon",   no_argument,       NULL, 'D' },  		{ "debug",    no_argument,       NULL, 'd' }, +		{ "device",   no_argument,       NULL, 'e' },  		{ "pid",      optional_argument, NULL, 'P' },  		{ "tcp-port", required_argument, NULL, 't' },  		{ "help",     no_argument,       NULL, 'h' }, @@ -613,8 +623,9 @@ int main(int argc, char *argv[])  		err("not running as root?");  	cmd = cmd_standalone_mode; +	driver = &host_driver;  	for (;;) { -		opt = getopt_long(argc, argv, "46DdP::t:hv", longopts, NULL); +		opt = getopt_long(argc, argv, "46DdeP::t:hv", longopts, NULL);  		if (opt == -1)  			break; @@ -644,6 +655,9 @@ int main(int argc, char *argv[])  		case 'v':  			cmd = cmd_version;  			break; +		case 'e': +			driver = &device_driver; +			break;  		case '?':  			usbipd_help();  		default:  |