From patchwork Fri May 23 09:07:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Hrynchyshyn X-Patchwork-Id: 892225 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92FC31E7C32 for ; Fri, 23 May 2025 09:08:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991290; cv=none; b=qVCljcKEHH/hyY46ydi/coOuPZpk3/+k2yIwJPsZB19pv+04IDq/jWGtCcRQVAjZYh3o+5LhuA0qjClb0lKoyX8pmD3EgX6cWljdHjTL9l6yRTCnmCZzfD/8V53HCjrsfe9+1ZaIBmsJXKsZA6Nso3H6ahAN38kIuF7l0GCe2tc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991290; c=relaxed/simple; bh=k1dqZ0kFB+LOVqkoEiNlvqrKaBdWzq2c3C2pwLckiRM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bIoUYoSPu9uShpWYZ1VZatSiqIQtBnC2UdGMHlJxeoMR7AVyOcFrYAGk8f2KR3QANmugVCnmpYQZctHiJh923cIdCvOmyLDBJqpJ9OHx8EkOszq4a2acnU9vvWZFK7xzOvE5jwX7/UwcCWURjQJhlDbnk5X475dJ2kd2moUQ/XA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=c+qJ+24q; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="c+qJ+24q" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-54acc0cd458so11660382e87.0 for ; Fri, 23 May 2025 02:08:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747991287; x=1748596087; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kQVeZLzFfLaFmKmQnzAoUlM0L/vwewHzFvrSLVi6Xyg=; b=c+qJ+24q7rwJ/HEf5lBQe1Scl2pIxcm6B6joLz0jjlLg5pDAfpwpLgLgaxcjM7rOmr QfEOPohRXh3QBCX79LOKHH8w0oZnp1+V/tns7G8+YfRlBevBB6jGy11Vy9UaWnuuS1j+ f9jpIUbCfXpJb2VCsvzFQvzuyfvh9hHjl0RCsA5OwJ+LrmcMBmy0Xn4ikx/H8a/lwTh5 KkIzQAAzzzDStLo7ZQx/XZi5euKnZxJrKRbCIhmyyAuOdzSK3ywMWAhHB/W64K3+Qrov FaovZEtx9t8nKOK46HU0xL3r3hD/iB+mfit6CAG4OFvbg1Lrmi9/MHp7K+WbMPaj8Ise i29g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747991287; x=1748596087; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kQVeZLzFfLaFmKmQnzAoUlM0L/vwewHzFvrSLVi6Xyg=; b=QeLqLsKATSE8EL8cVubYggDZId7ozVVkp9fDY6ZtQC8n3RQtcJX6OshbLMrxB5ojrd ACaggYaRGpaVrW1CA8Cy/ZnnKjEuImzQrOHGl2wyIdLwH6gk6sgABmFaNajAI5JcKvD4 dHCfhY7UBu4k/u96Fkizc+CrSHpwDbzfirVqk69qBQtVDQtNdHDWAM8ZPw7xn6j7yVb+ rt/pF7v9joEUsOsU/oL4/Smab7kIpKFMI0cHUta/03GUxJL+huyyve6o0ZMfIxYE4g7n hGgPU3CNzgK53PcBVrqXds42EO5I+LaDzx+mv/4llel63rF8zlyaa7b30TzKN0PaaVRg UFFQ== X-Forwarded-Encrypted: i=1; AJvYcCVxbP3Uy5q+O/XJ8yE3wAIoih6S9A56mW34flHoJ2CJy0EZG90hLkP7ZSxzSMYooOaAVapQjw0fiBM=@vger.kernel.org X-Gm-Message-State: AOJu0YyMJD5QcWaGMLYIaeVDPL4VnugFDddMICUnzsLJ7NMg+5n8cpuk O4uEwgasklnmt3YbM+WNbF+iqCmbk6O+XTZO2NxCVSn6pbrnkjbe4FDODcBXHy65 X-Gm-Gg: ASbGncuANkn+GckUnz0+BI/tyz+V43JZuFTkom1BuhIhZQ+w4ebX9QxhrYT8OvQe7O0 Yui5R5K39qNV3XsAl9zYrR8zhGM7NOb5OERF2ikMB62RVpjppMifH7rvmsItfmCiX3nIhdTAwIY 1yYrfntBcbb7wZj/IsH1JJYl1TYfppu8VYnPiZN+wyJ75d+c6YTQ93JaQU3pTOb4nJpkvgXnkn9 ShqYr1nOegEH18tDqAqOw1y6jYoPPj15tAzt02xh3Lw+p/2VbqGnpztXK1m7mAZ4h6iARdNi8Cz M0argkUBbayaosyE+G+byVmlH7Qdri1+fPJRIoQr X-Google-Smtp-Source: AGHT+IGcBUij0C4PQIAAvUZYcOoCJx7DD4I8Kw7yeUjLualHAm54Qa3q1VL75mWq/cLLikQhjcdxaA== X-Received: by 2002:a05:651c:2214:b0:30c:518e:452 with SMTP id 38308e7fff4ca-3280771e0c9mr101751271fa.13.1747991286480; Fri, 23 May 2025 02:08:06 -0700 (PDT) Received: from dell.. ([193.0.218.35]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-328085f64a0sm35318391fa.114.2025.05.23.02.08.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 May 2025 02:08:06 -0700 (PDT) From: Vadym Hrynchyshyn To: valentina.manea.m@gmail.com, shuah@kernel.org, i@zenithal.me, linux-usb@vger.kernel.org Cc: Vadym Hrynchyshyn Subject: [PATCH v2 1/3] usbipd: enable SO_KEEPALIVE socket option for accepted connection Date: Fri, 23 May 2025 12:07:23 +0300 Message-ID: <20250523090802.17987-2-vadimgrn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250523090802.17987-1-vadimgrn@gmail.com> References: <20250523090802.17987-1-vadimgrn@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 If usbip client does not close a TCP/IP connection to a daemon gracefully, the daemon will keep this connection open indefinitely. The issue is that the client cannot attach this device again until the device will be rebinded on server side by commands: usbip unbind -b X-Y usbip bind -b X-Y usbip client enables tcp keepalive by calling usbip_net_set_keepalive from usbip_net_tcp_connect. usbip daemon now enables this socket option too for accepted connection. Signed-off-by: Vadym Hrynchyshyn --- tools/usb/usbip/src/usbipd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/usb/usbip/src/usbipd.c b/tools/usb/usbip/src/usbipd.c index 48398a78e88a..d89633d8f799 100644 --- a/tools/usb/usbip/src/usbipd.c +++ b/tools/usb/usbip/src/usbipd.c @@ -119,6 +119,7 @@ static int recv_request_import(int sockfd) if (found) { /* should set TCP_NODELAY for usbip */ usbip_net_set_nodelay(sockfd); + usbip_net_set_keepalive(sockfd); /* export device needs a TCP/IP socket descriptor */ status = usbip_export_device(edev, sockfd); From patchwork Fri May 23 09:07:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Hrynchyshyn X-Patchwork-Id: 892455 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B8207223DEF for ; Fri, 23 May 2025 09:08:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991291; cv=none; b=uyv/1HwNIHOn8ApvxmSNnBrvd+xwJhxvzPi86nTcWXh2CQS6mvPUfB7NRPcHNOayl/GYPl0S7znobzmtEw8PUipSUEYQ+/lJil/OXfDwyHH0k2dpNsXZpt2neqfsB4xj8KcvmkaluH27eyKoh3LnmurVoI7JrfuAfkXKQ2SBYCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991291; c=relaxed/simple; bh=oyNSoxNJXyyNxRQFwa53rTj75lfBXTVP5qxFA7SHLEo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JCwvyCSFO8C/a25xyGKSfkV+NvrcClnkKmooLFX1fVl6f1pF8bfBHIIUqrpTEyEJhUYNbkeKn7JBZXLyoswEqc/ss8eR8Grc7Vyj6p6CmtNE6DJwWkq2YgYQEhIFqPdjvXWcQr1Onurqzx/XpJhDJRLR3r9MN0ZgETqit0vrmWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OpjxHosg; arc=none smtp.client-ip=209.85.208.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OpjxHosg" Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-3105ef2a08dso80572751fa.0 for ; Fri, 23 May 2025 02:08:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747991288; x=1748596088; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9qehleTyvvCk6y1RjVZJbpeiiJvUmWdCTFgubbMGo0Q=; b=OpjxHosgmoa9+utB3f/H/CWQuDFU1M1n1bMsq8iSlXyzW0F5LeSU0t77yor4+naY+4 Addwa+YY76tUU+sd7EVW6PCljn6N6eb+zLIN871Ivt6ZOVLZGWCixK4XEd4zWKWIQAjy 9WaAmU4BRyxAIuMe705F8sA6zD97Bx8CMVTC8KCtAZMgevaztM/vPH1vauUupnDIdlcM FGkGeDyzxwZy9SFc3ME7IiqWwTH09O3nZDIdik4ukZCI2oi80ayz3zbagWvkPueuoa1P LCSFP8vq2CoOJsXRxuu+UnNgt4ik3giETpFn8Tj/kTwTU5xfHtCUFPZvx+dT4LRJ4n7H qJWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747991288; x=1748596088; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9qehleTyvvCk6y1RjVZJbpeiiJvUmWdCTFgubbMGo0Q=; b=XUn3FAXGNXpkAruPHq7G15pjZoBFWxxARMpiCtY+QYJQyY9KdsVizqRFtVD1UYyfvY Xlmw6DHgg9a1a/sZ1LqeYXRlqBgxEojEcVkH1mLvWLvKz9pz+/Aald9i7w9OAL6WPwC3 ETlV6wSzr3neWjJhQiT6DIY2bTXAt+Z321IU2aNElyPoRV3gG51slM7ddXENUcVyEjVu OJ2WMqhIUMJgzwhIeYaGoOB10YgDAAGbyxqs8fr2pYRe++gODoH2L+SlDQNj1aLcDR6O HrO8SyhVBJhXxdW0Rs8kDfetrXh7gf2go3rmxU7vhbv0rDorZsmsqDs0O//Dm7iV1qG4 EqBA== X-Forwarded-Encrypted: i=1; AJvYcCUn7Bl+xphx9SD8WAyefZisVghFg76iLE/R1X8PJZ5vv4Rx0Vt+Eu8iBJarHxy12JZ1AJ+MoiJSozc=@vger.kernel.org X-Gm-Message-State: AOJu0YwldMwjMuB5gSyn0H4cuifPgBqJvoXx6Tnp42mJ/RrX0yYdsHJK q5c0hODzmmaw6B41/5ja9Phm6ZsgNCQ1bwa5ZfgR1zQsQmC575keelL8bqxLwKoG X-Gm-Gg: ASbGncuq7WdHho3ObA477OZbkzT9JSTIyx7CXyMK6nL40fvuwFanWGLU9LKy58hq5wa UtFJahWLqFb3avV3LcAA+NtRWdaM1bX6335xe6u1feCsWOlGko1JhpxM1iBQHkiKMOgMMcqlQZO 9riSU1B1Ks4qN7vTaa1zOJPQeTIxf5oDntEu3DezA8UU81pIocnVnifRMjA8YamA3WlEplGm/x+ SN2OrgPLKQMyzIl2Y636iFhXqiEyK1FjRB3Wz6XJybW7+Bvl9/Ek5t6KSx5sVJEt043wYHV+btr s685g7xveocDk5fD2Hs9733Yeekhtmon6d4cz+T8 X-Google-Smtp-Source: AGHT+IHj24T8AIGmzrQGxBwOi5jWjfxcIvf4WVpSkdyHuroKk+zq3OOq6gJOsMenq7ZupsmIpRwI9g== X-Received: by 2002:a05:651c:30cb:b0:31a:466a:4746 with SMTP id 38308e7fff4ca-32950c56b18mr8332211fa.28.1747991287543; Fri, 23 May 2025 02:08:07 -0700 (PDT) Received: from dell.. ([193.0.218.35]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-328085f64a0sm35318391fa.114.2025.05.23.02.08.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 May 2025 02:08:07 -0700 (PDT) From: Vadym Hrynchyshyn To: valentina.manea.m@gmail.com, shuah@kernel.org, i@zenithal.me, linux-usb@vger.kernel.org Cc: Vadym Hrynchyshyn Subject: [PATCH v2 2/3] usbipd: add long options to set TCP_KEEPIDLE/TCP_KEEPCNT/TCP_KEEPINTVL socket options Date: Fri, 23 May 2025 12:07:24 +0300 Message-ID: <20250523090802.17987-3-vadimgrn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250523090802.17987-1-vadimgrn@gmail.com> References: <20250523090802.17987-1-vadimgrn@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add usbip daemon options "--tcp-keepidle SECS", "--tcp-keepcnt CNT", "--tcp-keepintvl SECS". A user can add these parameters if default values do not satisfy him/her. If the option is passed, set corresponding socket option for accepted connection. For example, if "--tcp-keepidle 60" is passed, call setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, ...). configure.ac handles presence of these socket options. If TCP_KEEPIDLE/TCP_KEEPCNT/TCP_KEEPINTVL are not available, corresponding program options will not be added. Signed-off-by: Vadym Hrynchyshyn --- tools/usb/usbip/configure.ac | 24 +++++++- tools/usb/usbip/src/usbip_network.c | 85 +++++++++++++++++++++++++++++ tools/usb/usbip/src/usbip_network.h | 14 +++++ tools/usb/usbip/src/usbipd.c | 59 ++++++++++++++++++-- 4 files changed, 176 insertions(+), 6 deletions(-) diff --git a/tools/usb/usbip/configure.ac b/tools/usb/usbip/configure.ac index 8debf934f8b7..439377cfe23b 100644 --- a/tools/usb/usbip/configure.ac +++ b/tools/usb/usbip/configure.ac @@ -29,7 +29,7 @@ AC_PROG_MAKE_SET AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h dnl - string.h sys/socket.h syslog.h unistd.h]) + string.h sys/socket.h syslog.h unistd.h netinet/tcp.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_INT32_T @@ -107,5 +107,27 @@ AC_ARG_WITH([fortify], dnl [ACTION-IF-NOT-GIVEN] [AC_MSG_RESULT([default])]) +AC_MSG_CHECKING([whether tcp keepalive options are available]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [ #include + #include + #include ], + [ + int n = 0; + setsockopt(-1, IPPROTO_TCP, TCP_KEEPIDLE, &n, sizeof(n)); + setsockopt(-1, IPPROTO_TCP, TCP_KEEPCNT, &n, sizeof(n)); + setsockopt(-1, IPPROTO_TCP, TCP_KEEPINTVL, &n, sizeof(n)); + ] + )], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_KEEPALIVE_OPTS], [1], + [Define to 1 if TCP_KEEPIDLE/TCP_KEEPCNT/TCP_KEEPINTVL + socket-level options are available.]) + ], + [ AC_MSG_RESULT([no]) ], +) + AC_CONFIG_FILES([Makefile libsrc/Makefile src/Makefile]) AC_OUTPUT diff --git a/tools/usb/usbip/src/usbip_network.c b/tools/usb/usbip/src/usbip_network.c index ed4dc8c14269..15787044a7c9 100644 --- a/tools/usb/usbip/src/usbip_network.c +++ b/tools/usb/usbip/src/usbip_network.c @@ -50,6 +50,34 @@ void usbip_setup_port_number(char *arg) info("using port %d (\"%s\")", usbip_port, usbip_port_string); } +int usbip_to_int(const char *name, const char *val, int maxval) +{ + char *end; + long value = strtol(val, &end, 10); + + if (end == val) { + err("%s: could not parse '%s' as a decimal integer", name, val); + return 0; + } + + if (*end != '\0') { + err("%s: garbage at end of '%s'", name, val); + return 0; + } + + if (value <= 0) { + err("%s: must be greater than zero, actual %s", name, val); + return 0; + } + + if (value > maxval) { + err("%s: %s is too high, max=%d", name, val, maxval); + return 0; + } + + return value; +} + uint32_t usbip_net_pack_uint32_t(int pack, uint32_t num) { uint32_t i; @@ -243,6 +271,63 @@ int usbip_net_set_keepalive(int sockfd) return ret; } +#if HAVE_KEEPALIVE_OPTS + +int usbip_net_set_keepidle(int sockfd, int seconds) +{ + int ret; + + ret = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &seconds, sizeof(seconds)); + if (ret < 0) + dbg("setsockopt: TCP_KEEPIDLE"); + + return ret; +} + +int usbip_net_set_keepcnt(int sockfd, int cnt) +{ + int ret; + + ret = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)); + if (ret < 0) + dbg("setsockopt: TCP_KEEPCNT"); + + return ret; +} + +int usbip_net_set_keepintvl(int sockfd, int seconds) +{ + int ret; + + ret = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &seconds, sizeof(seconds)); + if (ret < 0) + dbg("setsockopt: TCP_KEEPINTVL"); + + return ret; +} + +#else + +int usbip_net_set_keepidle(int, int) +{ + dbg("setsockopt: TCP_KEEPIDLE is not supported"); + return -1; +} + +int usbip_net_set_keepcnt(int, int) +{ + dbg("setsockopt: TCP_KEEPCNT is not supported"); + return -1; +} + +int usbip_net_set_keepintvl(int, int) +{ + dbg("setsockopt: TCP_KEEPINTVL is not supported"); + return -1; +} + +#endif /* HAVE_KEEPALIVE_OPTS */ + int usbip_net_set_v6only(int sockfd) { const int val = 1; diff --git a/tools/usb/usbip/src/usbip_network.h b/tools/usb/usbip/src/usbip_network.h index 83b4c5344f72..9611ddede0cf 100644 --- a/tools/usb/usbip/src/usbip_network.h +++ b/tools/usb/usbip/src/usbip_network.h @@ -18,6 +18,17 @@ extern int usbip_port; extern char *usbip_port_string; void usbip_setup_port_number(char *arg); +/** + * usbip_to_int - convert string to positive integer + * @name: name of the @val for logging + * @val: string to convert to integer using base 10 + * @maxval: max allowed result value + * + * Return: positive integer on success, zero if conversion + * is not possible or value is out of range [1...maxval]. + */ +int usbip_to_int(const char *name, const char *val, int maxval); + /* ---------------------------------------------------------------------- */ /* Common header for all the kinds of PDUs. */ struct op_common { @@ -172,6 +183,9 @@ int usbip_net_recv_op_common(int sockfd, uint16_t *code, int *status); 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_keepidle(int sockfd, int seconds); +int usbip_net_set_keepcnt(int sockfd, int cnt); +int usbip_net_set_keepintvl(int sockfd, int seconds); int usbip_net_set_v6only(int sockfd); int usbip_net_tcp_connect(char *hostname, char *port); diff --git a/tools/usb/usbip/src/usbipd.c b/tools/usb/usbip/src/usbipd.c index d89633d8f799..8d83f870b89c 100644 --- a/tools/usb/usbip/src/usbipd.c +++ b/tools/usb/usbip/src/usbipd.c @@ -46,6 +46,10 @@ #define DEFAULT_PID_FILE "/var/run/" PROGNAME ".pid" +static int tcp_keepidle; +static int tcp_keepcnt; +static int tcp_keepintvl; + static const char usbip_version_string[] = PACKAGE_STRING; static const char usbipd_help_string[] = @@ -75,6 +79,19 @@ static const char usbipd_help_string[] = " -tPORT, --tcp-port PORT\n" " Listen on TCP/IP port PORT.\n" "\n" +#if HAVE_KEEPALIVE_OPTS + " --tcp-keepidle SECONDS\n" + " Number of SECONDS a connection needs to be idle\n" + " before TCP begins sending out keep-alive probes.\n" + "\n" + " --tcp-keepcnt PROBES\n" + " Max. number of TCP keep-alive PROBES to send\n" + " before killing the connection.\n" + "\n" + " --tcp-keepintvl SECONDS\n" + " Number of SECONDS between TCP keep-alive probes.\n" + "\n" +#endif " -h, --help\n" " Print this help.\n" "\n" @@ -88,6 +105,24 @@ static void usbipd_help(void) printf("%s\n", usbipd_help_string); } +static void set_socket_options(int sockfd) +{ + /* should set TCP_NODELAY for usbip */ + usbip_net_set_nodelay(sockfd); + + if (usbip_net_set_keepalive(sockfd) < 0) + return; + + if (tcp_keepidle) + usbip_net_set_keepidle(sockfd, tcp_keepidle); + + if (tcp_keepcnt) + usbip_net_set_keepcnt(sockfd, tcp_keepcnt); + + if (tcp_keepintvl) + usbip_net_set_keepintvl(sockfd, tcp_keepintvl); +} + static int recv_request_import(int sockfd) { struct op_import_request req; @@ -117,9 +152,7 @@ static int recv_request_import(int sockfd) } if (found) { - /* should set TCP_NODELAY for usbip */ - usbip_net_set_nodelay(sockfd); - usbip_net_set_keepalive(sockfd); + set_socket_options(sockfd); /* export device needs a TCP/IP socket descriptor */ status = usbip_export_device(edev, sockfd); @@ -586,15 +619,21 @@ static int do_standalone_mode(int daemonize, int ipv4, int ipv6) int main(int argc, char *argv[]) { + enum { KEEPIDLE = 1, KEEPCNT, KEEPINTVL }; + static const struct option longopts[] = { { "ipv4", no_argument, NULL, '4' }, { "ipv6", no_argument, NULL, '6' }, { "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' }, +#if HAVE_KEEPALIVE_OPTS + { "tcp-keepidle", required_argument, NULL, KEEPIDLE }, + { "tcp-keepcnt", required_argument, NULL, KEEPCNT }, + { "tcp-keepintvl", required_argument, NULL, KEEPINTVL }, +#endif { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 } @@ -609,6 +648,7 @@ int main(int argc, char *argv[]) int daemonize = 0; int ipv4 = 0, ipv6 = 0; int opt, rc = -1; + int longidx = 0; pid_file = NULL; @@ -621,7 +661,7 @@ int main(int argc, char *argv[]) cmd = cmd_standalone_mode; driver = &host_driver; for (;;) { - opt = getopt_long(argc, argv, "46DdeP::t:hv", longopts, NULL); + opt = getopt_long(argc, argv, "46DdeP::t:hv", longopts, &longidx); if (opt == -1) break; @@ -654,6 +694,15 @@ int main(int argc, char *argv[]) case 'e': driver = &device_driver; break; + case KEEPIDLE: + tcp_keepidle = usbip_to_int(longopts[longidx].name, optarg, UINT16_MAX); + break; + case KEEPCNT: + tcp_keepcnt = usbip_to_int(longopts[longidx].name, optarg, UINT16_MAX); + break; + case KEEPINTVL: + tcp_keepintvl = usbip_to_int(longopts[longidx].name, optarg, UINT16_MAX); + break; case '?': usbipd_help(); default: From patchwork Fri May 23 09:07:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Hrynchyshyn X-Patchwork-Id: 892224 Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD6C0224893 for ; Fri, 23 May 2025 09:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991292; cv=none; b=dBp7gTRao8W6fWytd0xxDMlacVPpLF/4Ul6K4Pb1cIZApCzKln+6qaOLtDBenoHIRaj1DLsO+ZbRdWGQ+eKqb5WfsDRPPzr49hIQJ4lq9Pro0SnpM5oo/1CcqdtDdFzWKNKRgiOeCLU4zWlPYlBcc8MHiVZd7VJzkeznNlXKT1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747991292; c=relaxed/simple; bh=y8fvM/8MKTAHq+U3gMcY8jxYi9epN0rxwGUcS2EA3SA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lOGO4k9JAiCwwcqEMe/MvTOghNZusFaFYFFiqBRWSbRESjZD9rkssjZYQPa3ikx81WqIIRB6jYPQbzsZER428gGAqG7RYR9v5eYbwfEwC/Da1oSv8ZlYDpVr+98ylDf8zfPyVhVb1JPJr0DNnETJiMmBCP9DxDeIgeBaLJJ1x4I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hlJuvQHM; arc=none smtp.client-ip=209.85.208.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hlJuvQHM" Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-327fcd87a3cso74421361fa.0 for ; Fri, 23 May 2025 02:08:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747991289; x=1748596089; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GmE2KG6N4yDfu1dF3+QggpGSMX7xbQbqHErllsMLWXc=; b=hlJuvQHM4OaZ0inAxYtWfzUR8pimZPbOK0qZ8e0L28FOfBVR+ieD7E+1zqjcQhgune XSle9JRCHfd0P6QnyqVqUC5MkOxbnYHpWtE+pAdaeuKFd6XrqJGKInLyQ+UGqtIoz+Xt Stg95J2RPCXaVITjvHof1EtnU8pqCSMo6bLAjwfwILOqrM1zEX1shNYyngv7Xl/oH1SU +Nk5IjjOdsRE+VPERve3dJZpIXnu9qPxSypVhbHm5AE2H227ewXjls2KRNqGYEoalFOU kPGwK7apYVhCwR4lZafJsDgP4LYsBRGaMu/rBuuLX47bDVKjdTisMkOq/E1RvCq/8vjC /RCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747991289; x=1748596089; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GmE2KG6N4yDfu1dF3+QggpGSMX7xbQbqHErllsMLWXc=; b=I0lqIkde1DIGr/SrEzhIgwvg9uhZTOiuKNBxyjW9kvlDTQvLOI/7haCo6M+vpCFr+t bl5NyLoesmHGV4kKNdbYGGeVR5Xaj4PO2oY9PhLR6602pC6R3Be8TRkkpZAV2oyHgq5U rBhaeOMBBo2TNITjVMQ+KfHiXP6JC+mgvaHi8zEjt/SDYdoP1AJpdldMtSkKVPJJYENf mos87ZtXRDiiGLMtF3PeQyaWRIqkfDXBp6cFJ7G3bscUvZgSGxnWgB/lqguA0WAu8qkK k58h4e0cpA3k9rtWn8LBlTXGomPJWLnGbP5w1UOMzycOT8Iqdbz/nYh83j2ruf36LaeT qm2Q== X-Forwarded-Encrypted: i=1; AJvYcCVrm069ZCST4h14s7OGIc8f3cagll8PrO6JUBhx//2jxMX05CZbMNFA5h7038S8ok/3jhVhDxWLMfk=@vger.kernel.org X-Gm-Message-State: AOJu0YzgtSWP/cu+Y75Z5dpoPQ/PZflc0NoMKRhsnSQNjKWQ7RDDdN8Y jrlwjNG03LDEM+ubYaO31055UPsKaxkJDm8afwfq+jCGFYdm38uOkfqu X-Gm-Gg: ASbGnctCzk1HcZTP3WvZ20A4U6XhRJO5ATufbCr6Kfk8vBEHoD0Hc9vwQaYirDOzDKn 6292YYO8WsofHiUgNz+hY/IvJcRJr19za0wb4Tv6ruD8gYdFLrKS+aiGZwHk4IBk1J/NjZ4Atvw tM+EbUYWpbKcRAHlyBhqkDTqqzQtrLMb0/dvPbnJVeOXyL2uYzwrDfkuHVlIWWIoVcpgjAzkSIS Wex4tswwjGWodmtMWXY7UJSIsiaMutNYJz3gWSbjP9nOEc+Y+JMAATKxogbiWiBdVaHVH0Y8fzG GqrdkQHSSz06jhHU3U7rZe49YD1Ga4hOUxPMn8LV X-Google-Smtp-Source: AGHT+IHFX+R2F0Ep9HST02KCl4lPQz1Mbpuf6aY8sJy0tilrLeqxpdGdEiHBk7oYzXixVq9RSGrOcg== X-Received: by 2002:a05:651c:111a:b0:30a:44ca:7e74 with SMTP id 38308e7fff4ca-328096bd752mr73924761fa.12.1747991288670; Fri, 23 May 2025 02:08:08 -0700 (PDT) Received: from dell.. ([193.0.218.35]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-328085f64a0sm35318391fa.114.2025.05.23.02.08.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 May 2025 02:08:08 -0700 (PDT) From: Vadym Hrynchyshyn To: valentina.manea.m@gmail.com, shuah@kernel.org, i@zenithal.me, linux-usb@vger.kernel.org Cc: Vadym Hrynchyshyn Subject: [PATCH v2 3/3] usbipd: use usbip_to_int to simplify usbip_setup_port_number implementation Date: Fri, 23 May 2025 12:07:25 +0300 Message-ID: <20250523090802.17987-4-vadimgrn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250523090802.17987-1-vadimgrn@gmail.com> References: <20250523090802.17987-1-vadimgrn@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 usbip_to_int function is used for handling arguments of options --tcp-keepidle,--tcp-keepcnt,--tcp-keepintvl. It is now called from usbip_setup_port_number to handle tcp port number. This simplifies its implementation. Signed-off-by: Vadym Hrynchyshyn --- tools/usb/usbip/src/usbip_network.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/tools/usb/usbip/src/usbip_network.c b/tools/usb/usbip/src/usbip_network.c index 15787044a7c9..26559a11e648 100644 --- a/tools/usb/usbip/src/usbip_network.c +++ b/tools/usb/usbip/src/usbip_network.c @@ -26,28 +26,13 @@ char *usbip_port_string = "3240"; void usbip_setup_port_number(char *arg) { dbg("parsing port arg '%s'", arg); - char *end; - unsigned long int port = strtoul(arg, &end, 10); - - if (end == arg) { - err("port: could not parse '%s' as a decimal integer", arg); - return; - } + int port = usbip_to_int("port", arg, UINT16_MAX); - if (*end != '\0') { - err("port: garbage at end of '%s'", arg); - return; + if (port > 0) { + usbip_port = port; + usbip_port_string = arg; + info("using port %d (\"%s\")", usbip_port, usbip_port_string); } - - if (port > UINT16_MAX) { - err("port: %s too high (max=%d)", - arg, UINT16_MAX); - return; - } - - usbip_port = port; - usbip_port_string = arg; - info("using port %d (\"%s\")", usbip_port, usbip_port_string); } int usbip_to_int(const char *name, const char *val, int maxval)