This patch allows to transfer both request/response between utilities and 
userspace URBs transfer over SSL. OpenSSL is used for the implementation.

Options --with-ssl=yes at ./configure and --ssl to command and daemon enable 
SSL. Default of --with-ssl is depends on existence of OpenSSL package. If it 
exists, default is --with-ssl=yes otherwise no.

If user space URBs transfer is not activated, ie. usbip_ux.ko is not installed, 
the utilites will fail in socket preparation.

To compile and execute the utilities, OpenSSL headers and libraries 
(openssl-devel or openssl-dev package) are needed.

Supported certificate files format is PEM.

Related options and their default are as following.

  --ssl
        Activate SSL. Default is non SSL.

  --tcp-port
        TCP port number. Default is 3240 for non SSL or 443 for SSL.

  --key
        Private key file. Default is ./cert/server.key (for usbipd and usbipa)
        or ./cert/client.key (for usbip).

  --cert
        Certificate file. Default is ./cert/server.crt (for usbipd and usbipa)
        or ./cert/client.crt (for usbip).

  --root
        Root CA's certification. Default is none.

  --verification
        Verification mode from none | relaxed | strict | once
        (for usbipd and usbipa) or none | relaxed   (for usbip).
        Default is none.


Signed-off-by: Nobuo Iwata <nobuo.iw...@fujixerox.co.jp>
---
 tools/usb/usbip/configure.ac        |  34 ++++++
 tools/usb/usbip/src/Makefile.am     |  10 +-
 tools/usb/usbip/src/usbip.c         |  55 ++++++++-
 tools/usb/usbip/src/usbip_network.c |  47 ++++++++
 tools/usb/usbip/src/usbip_network.h |   3 +
 tools/usb/usbip/src/usbip_ssl.c     | 232 ++++++++++++++++++++++++++++++++++++
 tools/usb/usbip/src/usbip_ssl.h     |  35 ++++++
 tools/usb/usbip/src/usbipd.c        | 108 ++++++++++++++++-
 8 files changed, 516 insertions(+), 8 deletions(-)
 create mode 100644 tools/usb/usbip/src/usbip_ssl.c
 create mode 100644 tools/usb/usbip/src/usbip_ssl.h

diff --git a/tools/usb/usbip/configure.ac b/tools/usb/usbip/configure.ac
index 607d05c..3b8277e 100644
--- a/tools/usb/usbip/configure.ac
+++ b/tools/usb/usbip/configure.ac
@@ -90,6 +90,40 @@ AC_ARG_WITH([usbids-dir],
            [USBIDS_DIR=$withval], [USBIDS_DIR="/usr/share/hwdata/"])
 AC_SUBST([USBIDS_DIR])
 
+# Checks for SSL.
+AC_MSG_CHECKING([whether to use SSL])
+AC_ARG_WITH([ssl],
+           [AS_HELP_STRING([--with-ssl],
+                           [use SSL (OpenSSL)])],
+           dnl [ACTION-IF-GIVEN]
+           [if test "$withval" = "yes"; then
+                    AC_MSG_RESULT([yes])
+                    AC_MSG_CHECKING([for SSL_METHOD])
+                    saved_LIBS="$LIBS"
+                    LIBS="-lssl -lcrypt $saved_LIBS"
+                    AC_TRY_LINK(
+                      [#include <openssl/ssl.h>],
+                      [SSL_METHOD *m = SSLv23_method();],
+                      [AC_MSG_RESULT([yes]);
+                       AC_DEFINE([USE_SSL], [1], [use ssl])
+                       AC_SUBST([SSL_LIBS], ["-lssl -lcrypto"])],
+                      [AC_MSG_RESULT([not found]); exit 1])
+            else
+                    AC_MSG_RESULT([no]);
+            fi],
+           dnl [ACTION-IF-NOT-GIVEN]
+           [AC_MSG_RESULT([(default)])
+            AC_MSG_CHECKING([for SSL_METHOD])
+            saved_LIBS="$LIBS"
+            LIBS="-lssl -lcrypt $saved_LIBS"
+            AC_TRY_LINK(
+              [#include <openssl/ssl.h>],
+              [SSL_METHOD *m = SSLv23_method();],
+              [AC_MSG_RESULT([yes]);
+               AC_DEFINE([USE_SSL], [1], [use ssl])
+               AC_SUBST([SSL_LIBS], ["-lssl -lcrypto"])],
+              [AC_MSG_RESULT([no]); LIBS="$saved_LIBS"])])
+
 # use _FORTIFY_SOURCE
 AC_MSG_CHECKING([whether to use fortify])
 AC_ARG_WITH([fortify],
diff --git a/tools/usb/usbip/src/Makefile.am b/tools/usb/usbip/src/Makefile.am
index f5697c2..cbe55ec 100644
--- a/tools/usb/usbip/src/Makefile.am
+++ b/tools/usb/usbip/src/Makefile.am
@@ -1,14 +1,18 @@
 AM_CPPFLAGS = -I$(top_srcdir)/libsrc -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"'
 AM_CFLAGS   = @EXTRA_CFLAGS@
+AM_LDFLAGS  = @SSL_LIBS@
 LDADD       = $(top_builddir)/libsrc/libusbip.la
 
 sbin_PROGRAMS := usbip usbipd usbipa
 
-usbip_SOURCES := usbip.h utils.h usbip.c utils.c usbip_network.c \
+usbip_SOURCES := usbip.h utils.h usbip.c utils.c \
+                usbip_network.c usbip_ssl.c \
                 usbip_attach.c usbip_detach.c usbip_list.c \
                 usbip_bind.c usbip_unbind.c usbip_port.c \
                 usbip_connect.c usbip_disconnect.c
 
-usbipd_SOURCES := usbip_network.h usbipd.c usbipd_dev.c usbip_network.c
+usbipd_SOURCES := usbip_network.h usbipd.c usbipd_dev.c \
+                usbip_network.c usbip_ssl.c
 
-usbipa_SOURCES := usbip_network.h usbipd.c usbipd_app.c usbip_network.c
+usbipa_SOURCES := usbip_network.h usbipd.c usbipd_app.c \
+                usbip_network.c usbip_ssl.c
diff --git a/tools/usb/usbip/src/usbip.c b/tools/usb/usbip/src/usbip.c
index 9d1468f..e743d82 100644
--- a/tools/usb/usbip/src/usbip.c
+++ b/tools/usb/usbip/src/usbip.c
@@ -30,14 +30,29 @@
 #include "usbip_network.h"
 #include "usbip.h"
 
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+int usbip_use_ssl = 0;
+char *usbip_ssl_default_cert = "cert/client.crt";
+char *usbip_ssl_default_key = "cert/client.key";
+#endif
+
 static int usbip_help(int argc, char *argv[]);
 static int usbip_version(int argc, char *argv[]);
 
 static const char usbip_version_string[] = PACKAGE_STRING;
 
 static const char usbip_usage_string[] =
-       "usbip [--debug] [--log] [--tcp-port PORT] [version]\n"
-       "             [help] <command> <args>\n";
+       "usbip [--debug] [--log] [--tcp-port PORT]"
+#ifdef USE_SSL
+       " [--ssl]\n"
+       "             [--key KEY-FILE] [--cert CERT-FILE] [--root 
ROOT-CERT-FILE]\n"
+       "             [--verification-mode <none | relaxed>]\n"
+#else
+       "\n"
+#endif
+       "             [version] [help] <command> <args>\n";
 
 static void usbip_usage(void)
 {
@@ -161,6 +176,13 @@ int main(int argc, char *argv[])
                { "debug",    no_argument,       NULL, 'd' },
                { "log",      no_argument,       NULL, 'l' },
                { "tcp-port", required_argument, NULL, 't' },
+#ifdef USE_SSL
+               { "ssl",      no_argument,       NULL, 's' },
+               { "cert",     required_argument, NULL, 'c' },
+               { "key",      required_argument, NULL, 'k' },
+               { "root",     required_argument, NULL, 'r' },
+               { "verification", required_argument, NULL, 'V' },
+#endif
                { NULL,       0,                 NULL,  0  }
        };
 
@@ -171,7 +193,11 @@ int main(int argc, char *argv[])
        usbip_use_stderr = 1;
        opterr = 0;
        for (;;) {
-               opt = getopt_long(argc, argv, "+dlt:", opts, NULL);
+               opt = getopt_long(argc, argv, "+dlt:"
+#ifdef USE_SSL
+                               "sc:k:r:V:"
+#endif
+                               , opts, NULL);
 
                if (opt == -1)
                        break;
@@ -187,6 +213,26 @@ int main(int argc, char *argv[])
                case 't':
                        usbip_setup_port_number(optarg);
                        break;
+#ifdef USE_SSL
+               case 's':
+                       usbip_use_ssl = 1;
+                       break;
+               case 'c':
+                       usbip_ssl_setup_cert(optarg);
+                       break;
+               case 'k':
+                       usbip_ssl_setup_key(optarg);
+                       break;
+               case 'r':
+                       usbip_ssl_setup_root(optarg);
+                       break;
+               case 'V':
+                       if (usbip_ssl_setup_verification_mode(optarg, 1)) {
+                               usbip_usage();
+                               goto out;
+                       }
+                       break;
+#endif
                case '?':
                        printf("usbip: invalid option\n");
                default:
@@ -194,6 +240,9 @@ int main(int argc, char *argv[])
                        goto out;
                }
        }
+#ifdef USE_SSL
+       usbip_fixup_port_number();
+#endif
 
        cmd = argv[optind];
        if (cmd) {
diff --git a/tools/usb/usbip/src/usbip_network.c 
b/tools/usb/usbip/src/usbip_network.c
index 329de34..39ed18c 100644
--- a/tools/usb/usbip/src/usbip_network.c
+++ b/tools/usb/usbip/src/usbip_network.c
@@ -33,8 +33,16 @@
 #include "usbip_common.h"
 #include "usbip_network.h"
 
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+extern int usbip_use_ssl;
+SSL_CTX *usbip_ssl_context;
+#endif
+
 int usbip_port = 3240;
 char *usbip_port_string = "3240";
+static int usbip_port_default = 1;
 
 void usbip_setup_port_number(char *arg)
 {
@@ -60,9 +68,20 @@ void usbip_setup_port_number(char *arg)
 
        usbip_port = port;
        usbip_port_string = arg;
+       usbip_port_default = 0;
        info("using port %d (\"%s\")", usbip_port, usbip_port_string);
 }
 
+#ifdef USE_SSL
+void usbip_fixup_port_number(void)
+{
+       if (usbip_port_default) {
+               usbip_port = 443;
+               usbip_port_string = "443";
+       }
+}
+#endif
+
 void usbip_net_pack_uint32_t(int pack, uint32_t *num)
 {
        uint32_t i;
@@ -316,13 +335,41 @@ usbip_sock_t *usbip_net_tcp_connect(char *hostname, char 
*service)
                close(sockfd);
                return NULL;
        }
+#ifdef USE_SSL
+       if (usbip_use_ssl) {
+               SSL *ssl;
+               usbip_ssl_context = usbip_ssl_setup(0);
+               if (usbip_ssl_context == NULL) {
+                       close(sockfd);
+                       return NULL;
+               }
+               ssl = usbip_ssl_connect(usbip_ssl_context, sockfd);
+               if (ssl == NULL) {
+                       usbip_ssl_teardown(usbip_ssl_context);
+                       close(sockfd);
+                       return NULL;
+               }
+               usbip_sock_init(sock, sockfd, ssl,
+                               usbip_ssl_send, usbip_ssl_recv,
+                               usbip_ssl_shutdown);
+       } else {
+               usbip_sock_init(sock, sockfd, NULL, NULL, NULL, NULL);
+       }
+#else
        usbip_sock_init(sock, sockfd, NULL, NULL, NULL, NULL);
+#endif
 
        return sock;
 }
 
 void usbip_net_tcp_close(usbip_sock_t *sock)
 {
+#ifdef USE_SSL
+       if (usbip_use_ssl) {
+               usbip_ssl_close((SSL*)sock->arg);
+               usbip_ssl_teardown(usbip_ssl_context);
+       }
+#endif
        close(sock->fd);
        free(sock);
 }
diff --git a/tools/usb/usbip/src/usbip_network.h 
b/tools/usb/usbip/src/usbip_network.h
index 1c304e0..3f7d0d3 100644
--- a/tools/usb/usbip/src/usbip_network.h
+++ b/tools/usb/usbip/src/usbip_network.h
@@ -17,6 +17,9 @@
 extern int usbip_port;
 extern char *usbip_port_string;
 void usbip_setup_port_number(char *arg);
+#ifdef USE_SSL
+void usbip_fixup_port_number(void);
+#endif
 
 /* ---------------------------------------------------------------------- */
 /* Common header for all the kinds of PDUs. */
diff --git a/tools/usb/usbip/src/usbip_ssl.c b/tools/usb/usbip/src/usbip_ssl.c
new file mode 100644
index 0000000..f6b0db6
--- /dev/null
+++ b/tools/usb/usbip/src/usbip_ssl.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2015 Nobuo Iwata
+ *
+ * OpenSSL functions for USB/IP.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+#ifdef USE_SSL
+
+#include "usbip_ssl.h"
+#include "usbip_common.h"
+#include "usbip_ux.h"
+
+extern char *usbip_ssl_default_cert;
+extern char *usbip_ssl_default_key;
+
+static const char *ssl_cert = NULL;
+static const char *ssl_key = NULL;
+static const char *ssl_root = NULL;
+static int ssl_verification_mode = SSL_VERIFY_NONE;
+
+void usbip_ssl_setup_cert(const char *arg)
+{
+       dbg("Parsing cert arg '%s'", arg);
+       ssl_cert = arg;
+}
+
+void usbip_ssl_setup_key(const char *arg)
+{
+       dbg("Parsing key arg '%s'", arg);
+       ssl_cert = arg;
+}
+
+void usbip_ssl_setup_root(const char *arg)
+{
+       dbg("Parsing root arg '%s'", arg);
+       ssl_root = arg;
+}
+
+int usbip_ssl_setup_verification_mode(const char *arg, int server)
+{
+       dbg("Parsing verification arg '%s'", arg);
+       if (!strcmp(arg, "none")) {
+               ssl_verification_mode = SSL_VERIFY_NONE;
+       } else if (!strcmp(arg, "relaxed")) {
+               ssl_verification_mode = SSL_VERIFY_PEER;
+       } else if (server && !strcmp(arg, "strict")) {
+               ssl_verification_mode = SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
+       } else if (server && !strcmp(arg, "once")) {
+               ssl_verification_mode = SSL_VERIFY_CLIENT_ONCE;
+       } else {
+               return -1;
+       }
+       return 0;
+}
+
+static int load_cert(SSL_CTX *ctx)
+{
+       int ret;
+
+       if (ssl_cert == NULL) {
+               ssl_cert = usbip_ssl_default_cert;
+       }
+       if (ssl_key == NULL) {
+               ssl_key = usbip_ssl_default_key;
+       }
+       ret = SSL_CTX_use_certificate_file(ctx, ssl_cert, SSL_FILETYPE_PEM);
+       if (ret != 1) {
+               err("Fail to load cert: %s", 
ERR_reason_error_string(ERR_get_error()));
+               return -1;
+       }
+       ret = SSL_CTX_use_PrivateKey_file(ctx, ssl_key, SSL_FILETYPE_PEM);
+       if (ret != 1) {
+               err("Fail to load key: %s", 
ERR_reason_error_string(ERR_get_error()));
+               return -1;
+       }
+       if (ssl_root != NULL) {
+               ret = SSL_CTX_load_verify_locations(ctx, ssl_root, NULL);
+               if (ret != 1) {
+                       err("Fail to load root: %s", 
ERR_reason_error_string(ERR_get_error()));
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+SSL_CTX *usbip_ssl_setup(int server)
+{
+       SSL_CTX *ctx;
+
+       SSL_library_init();
+       SSL_load_error_strings();
+       ERR_load_BIO_strings();
+       OpenSSL_add_all_algorithms();
+
+       if (!usbip_ux_installed()) {
+               err("Userspace transmission is not enabled for SSL.");
+               goto err0;
+       }
+       if (server) {
+               ctx = SSL_CTX_new(SSLv23_server_method());
+       } else {
+               ctx = SSL_CTX_new(SSLv3_client_method());
+       }
+       if (ctx == NULL) {
+               err("Fail to create context: %s", 
ERR_reason_error_string(ERR_get_error()));
+               goto err0;
+       }
+       if (load_cert(ctx)) {
+               goto err1;
+       }
+       SSL_CTX_set_verify(ctx, ssl_verification_mode, NULL);
+       return ctx;
+err1:
+       SSL_CTX_free(ctx);
+err0:
+       return NULL;
+}
+
+void usbip_ssl_teardown(SSL_CTX *ctx)
+{
+       SSL_CTX_free(ctx);
+}
+
+static SSL *alloc_ssl(SSL_CTX *ctx, int sockfd)
+{
+       SSL *ssl;
+
+       ssl = SSL_new(ctx);
+       if (ssl == NULL) {
+               err("Fail to create ssl: %s", 
ERR_reason_error_string(ERR_get_error()));
+               goto err0;
+       }
+       if (SSL_set_fd(ssl, sockfd) != 1) {
+               err("Fail to set fd to ssl: %s", 
ERR_reason_error_string(ERR_get_error()));
+               goto err1;
+       }
+       return ssl;
+err1:
+       SSL_free(ssl);
+err0:
+       return NULL;
+}
+
+SSL *usbip_ssl_accept(SSL_CTX *ctx, int sockfd)
+{
+       SSL *ssl;
+       int ret;
+
+       ssl = alloc_ssl(ctx, sockfd);
+       if (ssl == NULL) {
+               goto err0;
+       }
+       ret = SSL_accept(ssl);
+       if (ret != 1) {
+               err("Fail to accept: %s", 
ERR_reason_error_string(ERR_get_error()));
+               if (ret < 0) {
+                       SSL_shutdown(ssl);
+               }
+               goto err1;
+       }
+       return ssl;
+err1:
+       SSL_free(ssl);
+err0:
+       return NULL;
+}
+
+SSL *usbip_ssl_connect(SSL_CTX *ctx, int sockfd)
+{
+       SSL *ssl;
+       int ret;
+
+       ssl = alloc_ssl(ctx, sockfd);
+       if (ssl == NULL) {
+               goto err0;
+       }
+       ret = SSL_connect(ssl);
+       if (ret != 1) {
+               err("Fail to connect: %s", 
ERR_reason_error_string(ERR_get_error()));
+               if (ret < 0) {
+                       SSL_shutdown(ssl);
+               }
+               goto err1;
+       }
+       return ssl;
+err1:
+       SSL_free(ssl);
+err0:
+       return NULL;
+}
+
+void usbip_ssl_close(SSL *ssl)
+{
+       SSL_free(ssl);
+}
+
+ssize_t usbip_ssl_send(void *arg, void *buf, size_t len)
+{
+       SSL *ssl = (SSL*)arg;
+       return SSL_write(ssl, buf, len);
+}
+
+ssize_t usbip_ssl_recv(void *arg, void *buf, size_t len, int all)
+{
+       SSL *ssl = (SSL*)arg;
+       char *p = (char*)buf;
+       ssize_t bytes, received = 0;
+
+       do {
+               bytes = SSL_read(ssl, p+received, len-received);
+               if (bytes == 0) {
+                       return received;
+               } else if (bytes < 0) {
+                       return -1;
+               }
+               received += bytes;
+       } while(all && received < (ssize_t)len);
+       return received;
+}
+
+void usbip_ssl_shutdown(void *arg)
+{
+       SSL *ssl = (SSL*)arg;
+       SSL_shutdown(ssl);
+}
+
+#endif /* USE_SSL */
+
diff --git a/tools/usb/usbip/src/usbip_ssl.h b/tools/usb/usbip/src/usbip_ssl.h
new file mode 100644
index 0000000..78b1181
--- /dev/null
+++ b/tools/usb/usbip/src/usbip_ssl.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 Nobuo Iwata
+ *
+ * OpenSSL functions for USB/IP.
+ */
+
+#ifndef __USBIP_SSL_H
+#define __USBIP_SSL_H
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+#ifdef USE_SSL
+
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <unistd.h>
+
+void usbip_ssl_setup_cert(const char *arg);
+void usbip_ssl_setup_key(const char *arg);
+void usbip_ssl_setup_root(const char *arg);
+int usbip_ssl_setup_verification_mode(const char *arg, int server);
+SSL_CTX *usbip_ssl_setup(int server);
+void usbip_ssl_teardown(SSL_CTX *ctx);
+SSL *usbip_ssl_accept(SSL_CTX *ctx, int sockfd);
+SSL *usbip_ssl_connect(SSL_CTX *ctx, int sockfd);
+void usbip_ssl_close(SSL *ssl);
+ssize_t usbip_ssl_send(void *arg, void *buf, size_t len);
+ssize_t usbip_ssl_recv(void *arg, void *buf, size_t len, int all);
+void usbip_ssl_shutdown(void *arg);
+
+#endif /* USE_SSL */
+
+#endif /* !__USBIP_SSL_H */
diff --git a/tools/usb/usbip/src/usbipd.c b/tools/usb/usbip/src/usbipd.c
index 5f7cd86..07d5edd 100644
--- a/tools/usb/usbip/src/usbipd.c
+++ b/tools/usb/usbip/src/usbipd.c
@@ -46,6 +46,15 @@
 #include "usbip_ux.h"
 #include "list.h"
 
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+int usbip_use_ssl = 0;
+char *usbip_ssl_default_cert = "cert/server.crt";
+char *usbip_ssl_default_key = "cert/server.key";
+SSL_CTX *usbip_ssl_context;
+#endif
+
 extern char *usbip_progname;
 
 #define MAXSOCKFD 20
@@ -77,6 +86,28 @@ static const char usbipd_help_string[] =
        "\n"
        "       -tPORT, --tcp-port PORT\n"
        "               Listen on TCP/IP port PORT.\n"
+#ifdef USE_SSL
+       "               Default is 3240 for non-SSL or 443 for SSL.\n"
+#else
+       "               Default is 3240.\n"
+#endif
+#ifdef USE_SSL
+       "\n"
+       "       -s, --ssl\n"
+       "               Use SSL.\n"
+       "\n"
+       "       -kKEY-FILE, --key KEY-FILE\n"
+       "               Private key file. Default is %s.\n"
+       "\n"
+       "       -cCERT-FILE, --cert CERT-FILE\n"
+       "               Certificate file. Default is %s.\n"
+       "\n"
+       "       -rROOT-CERT-FILE, --root ROOT-CERT-FILE\n"
+       "               Trusted CA file. Default is none.\n"
+       "\n"
+       "       -VVERIFICATION-MODE, --verification VERIFICATION-MODE\n"
+       "               Verification mode - none(default), relaxed, strict or 
once.\n"
+#endif
        "\n"
        "       -h, --help\n"
        "               Print this help.\n"
@@ -86,7 +117,11 @@ static const char usbipd_help_string[] =
 
 static void usbipd_help(void)
 {
-       printf(usbipd_help_string, usbip_progname, usbip_default_pid_file);
+       printf(usbipd_help_string, usbip_progname, usbip_default_pid_file
+#ifdef USE_SSL
+               , usbip_ssl_default_key, usbip_ssl_default_cert
+#endif
+       );
 }
 
 #ifdef HAVE_LIBWRAP
@@ -153,8 +188,26 @@ int process_request(int listenfd)
        childpid = fork();
        if (childpid == 0) {
                close(listenfd);
+#ifdef USE_SSL
+               if (usbip_use_ssl) {
+                       SSL *ssl = usbip_ssl_accept(usbip_ssl_context, connfd);
+                       if (ssl == NULL) {
+                               close(connfd);
+                               exit(1);
+                       }
+                       usbip_sock_init(&sock, connfd, ssl,
+                               usbip_ssl_send, usbip_ssl_recv,
+                               usbip_ssl_shutdown);
+                       usbip_recv_pdu(&sock, host, port);
+                       usbip_ssl_close(ssl);
+               } else {
+                       usbip_sock_init(&sock, connfd, NULL, NULL, NULL, NULL);
+                       usbip_recv_pdu(&sock, host, port);
+               }
+#else
                usbip_sock_init(&sock, connfd, NULL, NULL, NULL, NULL);
                usbip_recv_pdu(&sock, host, port);
+#endif
                close(connfd);
                exit(0);
        }
@@ -229,6 +282,9 @@ static int listen_all_addrinfo(struct addrinfo *ai_head, 
int sockfdlist[],
                }
 
                info("listening on %s", ai_buf);
+#ifdef USE_SSL
+               if (usbip_use_ssl) info("using ssl");
+#endif
                sockfdlist[nsockfd++] = sock;
        }
 
@@ -351,6 +407,15 @@ static int do_standalone_mode(int daemonize, int ipv4, int 
ipv6)
                usbip_driver_close();
                return -1;
        }
+#ifdef USE_SSL
+       if (usbip_use_ssl) {
+               usbip_ssl_context = usbip_ssl_setup(1);
+               if (usbip_ssl_context == NULL) {
+                       usbip_driver_close();
+                       return -1;
+               }
+       }
+#endif
        nsockfd = listen_all_addrinfo(ai_head, sockfdlist,
                sizeof(sockfdlist) / sizeof(*sockfdlist));
        freeaddrinfo(ai_head);
@@ -396,6 +461,11 @@ static int do_standalone_mode(int daemonize, int ipv4, int 
ipv6)
        }
 
        info("shutting down " PROGNAME);
+#ifdef USE_SSL
+       if (usbip_use_ssl) {
+               usbip_ssl_teardown(usbip_ssl_context);
+       }
+#endif
        free(fds);
        usbip_driver_close();
 
@@ -412,6 +482,13 @@ int main(int argc, char *argv[])
                { "debug",    no_argument,       NULL, 'd' },
                { "pid",      optional_argument, NULL, 'P' },
                { "tcp-port", required_argument, NULL, 't' },
+#ifdef USE_SSL
+               { "ssl",      no_argument,       NULL, 's' },
+               { "cert",     required_argument, NULL, 'c' },
+               { "key",      required_argument, NULL, 'k' },
+               { "root",     required_argument, NULL, 'r' },
+               { "verification", required_argument, NULL, 'V' },
+#endif
                { "help",     no_argument,       NULL, 'h' },
                { "version",  no_argument,       NULL, 'v' },
                { NULL,       0,                 NULL,  0  }
@@ -437,7 +514,11 @@ int main(int argc, char *argv[])
 
        cmd = cmd_standalone_mode;
        for (;;) {
-               opt = getopt_long(argc, argv, "46DdP::t:hv", longopts, NULL);
+               opt = getopt_long(argc, argv, "46DdP::t:"
+#ifdef USE_SSL
+                               "sc:k:r:V:"
+#endif
+                               "hv", longopts, NULL);
 
                if (opt == -1)
                        break;
@@ -464,6 +545,26 @@ int main(int argc, char *argv[])
                case 't':
                        usbip_setup_port_number(optarg);
                        break;
+#ifdef USE_SSL
+               case 's':
+                       usbip_use_ssl = 1;
+                       break;
+               case 'c':
+                       usbip_ssl_setup_cert(optarg);
+                       break;
+               case 'k':
+                       usbip_ssl_setup_key(optarg);
+                       break;
+               case 'r':
+                       usbip_ssl_setup_root(optarg);
+                       break;
+               case 'V':
+                       if (usbip_ssl_setup_verification_mode(optarg, 1)) {
+                               usbipd_help();
+                               goto err_out;
+                       }
+                       break;
+#endif
                case 'v':
                        cmd = cmd_version;
                        break;
@@ -473,6 +574,9 @@ int main(int argc, char *argv[])
                        goto err_out;
                }
        }
+#ifdef USE_SSL
+       usbip_fixup_port_number();
+#endif
 
        if (!ipv4 && !ipv6)
                ipv4 = ipv6 = 1;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to