Re: [PATCH v14 04/10] usbip: exporting devices: new disconnect operation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 12/26/2016 08:08 AM, Nobuo Iwata wrote:
> Implementation of new disconnect operation. This is linked as a part of 
> usbip command. With this patch, usbip command has following operations.
> 
>  bind
>  unbind
>  list (local/remote)
>  attach
>  detach
>  port
>  connect ... previous patch
>  disconnect ... this patch
> 
> In device side node, this sends an un-export request, receives an 
> un-export response and unbind corresponding device internally. The 
> definition of the request and response are defined in original code: 
> tools/usb/usbip/usbip_network.h but was not used. It's corresponding to 
> NEW-4 in following diagram.
> 
> To find disconnecting device, requesting host and requested 
> bus-id-in-requester identifies the target. So it cannot to disconnect a 
> device from other host than a host which connected the device. 
> 
> EXISTING) - invites devices from application(vhci)-side
>          +------+                               +------------------+
>  device--+ STUB |                               | application/VHCI |
>          +------+                               +------------------+
>          (server)                               (client)
>  1) # usbipd ... start daemon
>  = = =
>  2) # usbip list --local
>  3) # usbip bind
>                   <--- list bound devices ---  4) # usbip list --remote
>                   <--- import a device ------  5) # usbip attach
>  = = =
>                      X disconnected            6) # usbip detach
>  7) usbip unbind
> 
> NEW) - dedicates devices from device(stub)-side
>          +------+                               +------------------+
>  device--+ STUB |                               | application/VHCI |
>          +------+                               +------------------+
>          (client)                               (server)
>                                             1) # usbipa ... start daemon
>  = = =
>  2) # usbip list --local
>  3) # usbip connect    --- export a device ------>
>  = = =
>  4) # usbip disconnect --- un-export a device --->
> 
>  Bind and unbind are done in connect and disconnect internally.

The same as in previous commit. Please clarify that those operations are
done only for stub driver.

(...)

> +static int disconnect_device(char *host, char *busid, int unbind)
> +{
> +	int sockfd;
> +	int rc;
> +
> +	sockfd = usbip_net_tcp_connect(host, usbip_port_string);
> +	if (sockfd < 0) {
> +		err("tcp connect");
> +		return -1;
> +	}
> +
> +	rc = unexport_device(busid, sockfd);
> +	if (rc < 0) {
> +		err("unexport");
> +		close(sockfd);
> +		return -1;
> +	}
> +
> +	close(sockfd);

My comment from previous version (still not fixed):

>> +
>> +	rc = unexport_device(busid, sockfd);
>> +	if (rc < 0) {
>> +		err("unexport");
>> +		close(sockfd);
>> +		return -1;
>> +	}
>
> close(sockfd) in case of error, otherwise close(sockfd)...
>
> Probably you can place close(sockfd) above if to avoid this weird
> copy-paste.
>
>> +
>> +	close(sockfd);
>> +


> +
> +	if (unbind) {
> +		rc = usbip_unbind_device(busid);
> +		if (rc) {
> +			err("unbind");
> +			return -1;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +int usbip_disconnect(int argc, char *argv[])
> +{
> +	static const struct option opts[] = {
> +		{ "remote", required_argument, NULL, 'r' },
> +		{ "busid",  required_argument, NULL, 'b' },
> +		{ "device", no_argument,       NULL, 'd' },
> +		{ NULL, 0,  NULL, 0 }
> +	};
> +	char *host = NULL;
> +	char *busid = NULL;
> +	int opt;
> +	int unbind = 1;

Shouldn't this parameter be exposed to cmd line among remote, busid and
device? User may want to disconnect device but leave stub driver bound
to it.

> +	int ret = -1;
> +
> +	for (;;) {
> +		opt = getopt_long(argc, argv, "r:b:d", opts, NULL);
> +
> +		if (opt == -1)
> +			break;
> +
> +		switch (opt) {
> +		case 'r':
> +			host = optarg;
> +			break;
> +		case 'b':
> +			busid = optarg;
> +			break;
> +		case 'd':
> +			driver = &device_driver;
> +			unbind = 0;
> +			break;
> +		default:
> +			goto err_out;
> +		}
> +	}
> +
> +	if (!host || !busid)
> +		goto err_out;
> +
> +	ret = disconnect_device(host, busid, unbind);
> +	goto out;
> +
> +err_out:
> +	usbip_disconnect_usage();
> +out:
> +	return ret;
> +}
> 

Best regards,
-- 
Krzysztof Opasiak
Samsung R&D Institute Poland
Samsung Electronics
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux