diff options
4 files changed, 10 insertions, 216 deletions
diff --git a/package/network/utils/iperf/Makefile b/package/network/utils/iperf/Makefile index 383eb07949..33d00b43d7 100644 --- a/package/network/utils/iperf/Makefile +++ b/package/network/utils/iperf/Makefile @@ -8,11 +8,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=iperf -PKG_VERSION:=2.0.12 -PKG_RELEASE:=3 +PKG_VERSION:=2.0.13 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_HASH:=367f651fb1264b13f6518e41b8a7e08ce3e41b2a1c80e99ff0347561eed32646 +PKG_HASH:=c88adec966096a81136dda91b4bd19c27aae06df4d45a7f547a8e50d723778ad PKG_SOURCE_URL:=@SF/iperf2 PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> diff --git a/package/network/utils/iperf/patches/0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch b/package/network/utils/iperf/patches/0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch deleted file mode 100644 index a713e06b96..0000000000 --- a/package/network/utils/iperf/patches/0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 7c0ac64ebea38d0d9ff4d160db4d33bc087a3490 Mon Sep 17 00:00:00 2001 -From: Robert McMahon <rjmcmahon@rjmcmahon.com> -Date: Mon, 16 Jul 2018 17:51:29 -0700 -Subject: [PATCH] fix latent bug in signal handling, per POSIX calling exit() - in signal handler is not safe. Use _exit() instead. Also, detect the user - signal SIGINT for the case of server needing two invocations to stop server - threads. Note: the server threads still need some work from graceful - termination with a single ctrl-c - ---- - ---- a/compat/signal.c -+++ b/compat/signal.c -@@ -171,7 +171,7 @@ void sig_exit( int inSigno ) { - static int num = 0; - if ( num++ == 0 ) { - fflush( 0 ); -- exit( 0 ); -+ _exit(0); - } - } /* end sig_exit */ - ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -268,7 +268,7 @@ void Sig_Interupt( int inSigno ) { - // We try to not allow a single interrupt handled by multiple threads - // to completely kill the app so we save off the first thread ID - // then that is the only thread that can supply the next interrupt -- if ( thread_equalid( sThread, thread_zeroid() ) ) { -+ if ( (inSigno == SIGINT) && thread_equalid( sThread, thread_zeroid() ) ) { - sThread = thread_getid(); - } else if ( thread_equalid( sThread, thread_getid() ) ) { - sig_exit( inSigno ); -@@ -420,9 +420,3 @@ VOID ServiceStop() { - } - - #endif -- -- -- -- -- -- diff --git a/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch b/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch deleted file mode 100644 index c8655c9142..0000000000 --- a/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch +++ /dev/null @@ -1,161 +0,0 @@ -From 755be8bdb48d2536e39d2d7cf84e8a8f86b8776f Mon Sep 17 00:00:00 2001 -From: Robert McMahon <rjmcmahon@rjmcmahon.com> -Date: Sat, 6 Oct 2018 13:36:52 -0700 -Subject: [PATCH] cleanup main startup, fix daemon mode per redirecting stdin, - stderr and stdout to /dev/null - ---- - ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -167,67 +167,7 @@ int main( int argc, char **argv ) { - Settings_ParseCommandLine( argc, argv, ext_gSettings ); - - // Check for either having specified client or server -- if ( ext_gSettings->mThreadMode == kMode_Client -- || ext_gSettings->mThreadMode == kMode_Listener ) { --#ifdef WIN32 -- // Start the server as a daemon -- if ( isDaemon( ext_gSettings )) { -- if (ext_gSettings->mThreadMode == kMode_Listener) { -- CmdInstallService(argc, argv); -- } else { -- fprintf(stderr, "Client cannot be run as a daemon\n"); -- } -- return 0; -- } -- -- // Remove the Windows service if requested -- if ( isRemoveService( ext_gSettings ) ) { -- // remove the service -- if ( CmdRemoveService() ) { -- fprintf(stderr, "IPerf Service is removed.\n"); -- return 0; -- } -- } --#else -- if ( isDaemon( ext_gSettings ) ) { -- if (ext_gSettings->mThreadMode != kMode_Listener) { -- fprintf(stderr, "Iperf client cannot be run as a daemon\n"); -- return 0; -- } -- if (daemon(1, 1) < 0) { -- perror("daemon"); -- } -- fprintf( stderr, "Running Iperf Server as a daemon\n"); -- fprintf( stderr, "The Iperf daemon process ID : %d\n",((int)getpid())); -- fclose(stdout); -- fclose(stderr); -- fclose(stdin); -- } --#endif -- // initialize client(s) -- if ( ext_gSettings->mThreadMode == kMode_Client ) { -- client_init( ext_gSettings ); -- } -- --#ifdef HAVE_THREAD -- // start up the reporter and client(s) or listener -- { -- thread_Settings *into = NULL; -- // Create the settings structure for the reporter thread -- Settings_Copy( ext_gSettings, &into ); -- into->mThreadMode = kMode_Reporter; -- -- // Have the reporter launch the client or listener -- into->runNow = ext_gSettings; -- -- // Start all the threads that are ready to go -- thread_start( into ); -- } --#else -- // No need to make a reporter thread because we don't have threads -- thread_start( ext_gSettings ); --#endif -- } else { -+ if ((ext_gSettings->mThreadMode != kMode_Client) && (ext_gSettings->mThreadMode != kMode_Listener)) { - // neither server nor client mode was specified - // print usage and exit - -@@ -236,20 +176,75 @@ int main( int argc, char **argv ) { - // Starting in 2.0 to restart a previously defined service - // you must call iperf with "iperf -D" or using the environment variable - SERVICE_TABLE_ENTRY dispatchTable[] = -- { -- { (LPSTR)TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main}, -- { NULL, NULL} -- }; -+ { -+ { (LPSTR)TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main}, -+ { NULL, NULL} -+ }; - - // starting the service by SCM, there is no arguments will be passed in. - // the arguments will pass into Service_Main entry. - if (!StartServiceCtrlDispatcher(dispatchTable) ) - // If the service failed to start then print usage - #endif -- fprintf( stderr, usage_short, argv[0], argv[0] ); -+ fprintf( stderr, usage_short, argv[0], argv[0] ); -+ return 0; -+ } -+ -+ -+ switch (ext_gSettings->mThreadMode) { -+ case kMode_Client : -+ if ( isDaemon( ext_gSettings ) ) { -+ fprintf(stderr, "Iperf client cannot be run as a daemon\n"); -+ return 0; -+ } -+ // initialize client(s) -+ client_init( ext_gSettings ); -+ break; -+ case kMode_Listener : -+ if ( isDaemon( ext_gSettings ) ) { -+ fprintf( stderr, "Running Iperf Server as a daemon\n"); -+ // Start the server as a daemon -+#ifdef WIN32 -+ CmdInstallService(argc, argv); -+ // Remove the Windows service if requested -+ if ( isRemoveService( ext_gSettings ) ) { -+ // remove the service -+ if ( CmdRemoveService() ) { -+ fprintf(stderr, "IPerf Service is removed.\n"); -+ return 0; -+ } -+ } -+#else -+ fflush(stderr); -+ // redirect stdin, stdout and sterr to /dev/null (see dameon and no close flag) -+ if (daemon(1, 0) < 0) { -+ perror("daemon"); -+ } -+ } -+#endif -+ break; -+ default : -+ fprintf( stderr, "unknown mode"); -+ break; -+ } -+#ifdef HAVE_THREAD -+ // start up the reporter and client(s) or listener -+ { -+ thread_Settings *into = NULL; -+ // Create the settings structure for the reporter thread -+ Settings_Copy( ext_gSettings, &into ); -+ into->mThreadMode = kMode_Reporter; -+ -+ // Have the reporter launch the client or listener -+ into->runNow = ext_gSettings; - -- return 0; -+ // Start all the threads that are ready to go -+ thread_start( into ); - } -+#else -+ // No need to make a reporter thread because we don't have threads -+ thread_start( ext_gSettings ); -+#endif - - // wait for other (client, server) threads to complete - thread_joinall(); diff --git a/package/network/utils/iperf/patches/0003-fix-non-ipv6-builds.patch b/package/network/utils/iperf/patches/0003-fix-non-ipv6-builds.patch index 9d96c1919a..c6afa3e160 100644 --- a/package/network/utils/iperf/patches/0003-fix-non-ipv6-builds.patch +++ b/package/network/utils/iperf/patches/0003-fix-non-ipv6-builds.patch @@ -1,18 +1,16 @@ -Index: iperf-2.0.12/src/Listener.cpp -=================================================================== ---- iperf-2.0.12.orig/src/Listener.cpp -+++ iperf-2.0.12/src/Listener.cpp -@@ -670,6 +670,7 @@ int Listener::L2_setup (void) { +--- a/src/Listener.cpp ++++ b/src/Listener.cpp +@@ -723,6 +723,7 @@ int Listener::L2_setup (void) { // Now optimize packet flow up the raw socket // Establish the flow BPF to forward up only "connected" packets to this raw socket +#ifdef HAVE_IPV6 if (l->sa_family == AF_INET6) { + #ifdef HAVE_IPV6 struct in6_addr *v6peer = SockAddr_get_in6_addr(&server->peer); - struct in6_addr *v6local = SockAddr_get_in6_addr(&server->local); -@@ -682,6 +683,9 @@ int Listener::L2_setup (void) { - WARN_errno( rc == SOCKET_ERROR, "l2 v4in6 connect ip bpf"); - } +@@ -740,6 +741,9 @@ int Listener::L2_setup (void) { + return -1; + #endif /* HAVE_IPV6 */ } else { +#else + { |