[PATCH 10/13] USB/IP: letting connection establishment replaceable

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

 



To introduce some application protocols like WebSocket, this patch allows to substitute connection establishment and termination. In combination with previous patch, both connection and transmission can be replaced.

usbip_connection_operations_t includes open and close operation. Open method returns usbip_sock_t which includes send, receive and close method. Then, transmission methods are replaced at the same time. 

Succeeding WebSocket patch uses this feature.

Signed-off-by: Nobuo Iwata <nobuo.iwata@xxxxxxxxxxxxxxx>
---
 tools/usb/usbip/libsrc/usbip_common.c  | 10 ++++++++++
 tools/usb/usbip/libsrc/usbip_common.h  | 11 +++++++++++
 tools/usb/usbip/src/usbip.c            |  1 +
 tools/usb/usbip/src/usbip_attach.c     |  6 +++---
 tools/usb/usbip/src/usbip_connect.c    |  6 +++---
 tools/usb/usbip/src/usbip_disconnect.c |  6 +++---
 tools/usb/usbip/src/usbip_list.c       |  6 +++---
 tools/usb/usbip/src/usbip_network.c    |  9 +++++++--
 tools/usb/usbip/src/usbip_network.h    |  3 +--
 9 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/tools/usb/usbip/libsrc/usbip_common.c b/tools/usb/usbip/libsrc/usbip_common.c
index dc0712c..54efa10 100644
--- a/tools/usb/usbip/libsrc/usbip_common.c
+++ b/tools/usb/usbip/libsrc/usbip_common.c
@@ -297,3 +297,13 @@ void usbip_sock_init(usbip_sock_t *sock, int fd, void *arg,
 	sock->shutdown = shutdown;
 }
 
+usbip_connection_operations_t usbip_conn_ops = {NULL, NULL};
+
+void usbip_conn_init(
+	usbip_sock_t *(*open)(char *host, char *port),
+	void (*close)(usbip_sock_t *sock))
+{
+	usbip_conn_ops.open = open;
+	usbip_conn_ops.close = close;
+}
+
diff --git a/tools/usb/usbip/libsrc/usbip_common.h b/tools/usb/usbip/libsrc/usbip_common.h
index 0dcbd99..07c411f 100644
--- a/tools/usb/usbip/libsrc/usbip_common.h
+++ b/tools/usb/usbip/libsrc/usbip_common.h
@@ -148,4 +148,15 @@ void usbip_sock_init(usbip_sock_t *sock, int fd, void *arg,
 	ssize_t (*recv)(void *arg, void *buf, size_t len, int wait_all),
 	void (*shutdown)(void *arg));
 
+typedef struct usbip_connection_operations {
+	usbip_sock_t *(*open)(char *host, char *port);
+	void (*close)(usbip_sock_t *sock);
+} usbip_connection_operations_t;
+
+extern usbip_connection_operations_t usbip_conn_ops;
+
+void usbip_conn_init(
+	usbip_sock_t *(*open)(char *host, char *port),
+	void (*close)(usbip_sock_t *sock));
+
 #endif /* __USBIP_COMMON_H */
diff --git a/tools/usb/usbip/src/usbip.c b/tools/usb/usbip/src/usbip.c
index e743d82..cc83455a 100644
--- a/tools/usb/usbip/src/usbip.c
+++ b/tools/usb/usbip/src/usbip.c
@@ -251,6 +251,7 @@ int main(int argc, char *argv[])
 				argc -= optind;
 				argv += optind;
 				optind = 0;
+				usbip_net_tcp_conn_init();
 				rc = run_command(&cmds[i], argc, argv);
 				goto out;
 			}
diff --git a/tools/usb/usbip/src/usbip_attach.c b/tools/usb/usbip/src/usbip_attach.c
index fe037de..e1c298e 100644
--- a/tools/usb/usbip/src/usbip_attach.c
+++ b/tools/usb/usbip/src/usbip_attach.c
@@ -135,7 +135,7 @@ static int attach_device(char *host, char *busid)
 	int rc;
 	int rhport;
 
-	sock = usbip_net_tcp_connect(host, usbip_port_string);
+	sock = usbip_conn_ops.open(host, usbip_port_string);
 	if (!sock) {
 		err("tcp connect");
 		goto err0;
@@ -164,13 +164,13 @@ static int attach_device(char *host, char *busid)
 		usbip_ux_join(ux);
 	}
 	usbip_ux_cleanup(&ux);
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 
 	return 0;
 err2:
 	usbip_ux_cleanup(&ux);
 err1:
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 err0:
 	return -1;
 }
diff --git a/tools/usb/usbip/src/usbip_connect.c b/tools/usb/usbip/src/usbip_connect.c
index 4511990..ae8104b 100644
--- a/tools/usb/usbip/src/usbip_connect.c
+++ b/tools/usb/usbip/src/usbip_connect.c
@@ -150,7 +150,7 @@ static int connect_device(char *host, char *busid)
 		goto err0;
 	}
 
-	sock = usbip_net_tcp_connect(host, usbip_port_string);
+	sock = usbip_conn_ops.open(host, usbip_port_string);
 	if (!sock) {
 		err("tcp connect");
 		goto err1;
@@ -174,13 +174,13 @@ static int connect_device(char *host, char *busid)
 		usbip_unbind_device(busid);
 	}
 	usbip_ux_cleanup(&ux);
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 
 	return 0;
 err3:
 	usbip_ux_cleanup(&ux);
 err2:
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 err1:
 	usbip_unbind_device(busid);
 err0:
diff --git a/tools/usb/usbip/src/usbip_disconnect.c b/tools/usb/usbip/src/usbip_disconnect.c
index 8da1717..1bda962 100644
--- a/tools/usb/usbip/src/usbip_disconnect.c
+++ b/tools/usb/usbip/src/usbip_disconnect.c
@@ -136,7 +136,7 @@ static int disconnect_device(char *host, char *busid)
 	usbip_sock_t *sock;
 	int rc;
 
-	sock = usbip_net_tcp_connect(host, usbip_port_string);
+	sock = usbip_conn_ops.open(host, usbip_port_string);
 	if (!sock) {
 		err("tcp connect");
 		return -1;
@@ -145,11 +145,11 @@ static int disconnect_device(char *host, char *busid)
 	rc = unexport_device(busid, sock);
 	if (rc < 0) {
 		err("unexport");
-		usbip_net_tcp_close(sock);
+		usbip_conn_ops.close(sock);
 		return -1;
 	}
 
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 
 	if (!usbip_ux_installed()) {
 		rc = usbip_unbind_device(busid);
diff --git a/tools/usb/usbip/src/usbip_list.c b/tools/usb/usbip/src/usbip_list.c
index b62a6df..9fb0bb9 100644
--- a/tools/usb/usbip/src/usbip_list.c
+++ b/tools/usb/usbip/src/usbip_list.c
@@ -133,7 +133,7 @@ static int list_importable_devices(char *host)
 	int rc;
 	usbip_sock_t *sock;
 
-	sock = usbip_net_tcp_connect(host, usbip_port_string);
+	sock = usbip_conn_ops.open(host, usbip_port_string);
 	if (!sock) {
 		err("could not connect to %s:%s: %s", host,
 		    usbip_port_string, gai_strerror(sock->fd));
@@ -144,11 +144,11 @@ static int list_importable_devices(char *host)
 	rc = get_importable_devices(host, sock);
 	if (rc < 0) {
 		err("failed to get device list from %s", host);
-		usbip_net_tcp_close(sock);
+		usbip_conn_ops.close(sock);
 		return -1;
 	}
 
-	usbip_net_tcp_close(sock);
+	usbip_conn_ops.close(sock);
 
 	return 0;
 }
diff --git a/tools/usb/usbip/src/usbip_network.c b/tools/usb/usbip/src/usbip_network.c
index 39ed18c..f65d27d 100644
--- a/tools/usb/usbip/src/usbip_network.c
+++ b/tools/usb/usbip/src/usbip_network.c
@@ -287,7 +287,7 @@ int usbip_net_set_v6only(int sockfd)
 /*
  * IPv6 Ready
  */
-usbip_sock_t *usbip_net_tcp_connect(char *hostname, char *service)
+static usbip_sock_t *net_tcp_open(char *hostname, char *service)
 {
 	struct addrinfo hints, *res, *rp;
 	int sockfd;
@@ -362,7 +362,7 @@ usbip_sock_t *usbip_net_tcp_connect(char *hostname, char *service)
 	return sock;
 }
 
-void usbip_net_tcp_close(usbip_sock_t *sock)
+static void net_tcp_close(usbip_sock_t *sock)
 {
 #ifdef USE_SSL
 	if (usbip_use_ssl) {
@@ -374,3 +374,8 @@ void usbip_net_tcp_close(usbip_sock_t *sock)
 	free(sock);
 }
 
+void usbip_net_tcp_conn_init(void)
+{
+	usbip_conn_init(net_tcp_open, net_tcp_close);
+}
+
diff --git a/tools/usb/usbip/src/usbip_network.h b/tools/usb/usbip/src/usbip_network.h
index 3f7d0d3..45fa0bb 100644
--- a/tools/usb/usbip/src/usbip_network.h
+++ b/tools/usb/usbip/src/usbip_network.h
@@ -184,7 +184,6 @@ int usbip_net_set_reuseaddr(int sockfd);
 int usbip_net_set_nodelay(int sockfd);
 int usbip_net_set_keepalive(int sockfd);
 int usbip_net_set_v6only(int sockfd);
-usbip_sock_t *usbip_net_tcp_connect(char *hostname, char *port);
-void usbip_net_tcp_close(usbip_sock_t *sock);
+void usbip_net_tcp_conn_init(void);
 
 #endif /* __USBIP_NETWORK_H */
-- 
2.1.0

--
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