Menu

[PATCH] add -Q "connection quantum" to iperf 2, ending client conns after specified time

nick black
2017-11-25
2017-11-26
  • nick black

    nick black - 2017-11-25

    I've added a '-Q' '--quantum' option to iperf2 in our deployments, enforcing a time limit on client connections, after which they will be terminated by the server. This was necessary to keep our singly-threaded iperf from being tied up by an unresponsive client. I doubt that this patch will be accepted into iperf2, but you're welcome to take it.

    If merged, please credit Nick Black of Luma, Inc.

    diff -ur iperf-2.0.9/include/Settings.hpp dankperf-2.0.9/include/Settings.hpp
    --- iperf-2.0.9/include/Settings.hpp    2016-06-20 19:41:31.000000000 -0400
    +++ dankperf-2.0.9/include/Settings.hpp 2017-06-30 19:03:58.062194431 -0400
    @@ -182,6 +182,7 @@
         Socklen_t size_local;
         nthread_t mTID;
         char* mCongestion;
    
    +    max_size_t mQuantum;
     #if defined( HAVE_WIN32_THREAD )
         HANDLE mHandle;
     #endif
    @@ -225,6 +226,7 @@
     #define FLAG_BWSET          0x01000000
     #define FLAG_ENHANCEDREPORT 0x02000000
     #define FLAG_SERVERMODETIME 0x04000000
    +#define FLAG_SERVERQUANTUM  0x08000000
    
     #define isBuflenSet(settings)      ((settings->flags & FLAG_BUFLENSET) != 0)
     #define isCompat(settings)         ((settings->flags & FLAG_COMPAT) != 0)
    @@ -255,6 +257,7 @@
     #define isBWSet(settings)          ((settings->flags & FLAG_BWSET) != 0)
     #define isEnhanced(settings)    ((settings->flags & FLAG_ENHANCEDREPORT) != 0)
     #define isServerModeTime(settings)    ((settings->flags & FLAG_SERVERMODETIME) != 0)
    +#define isServerQuantum(settings)  ((settings->flags & FLAG_SERVERQUANTUM) != 0)
    
     #define setBuflenSet(settings)     settings->flags |= FLAG_BUFLENSET
     #define setCompat(settings)        settings->flags |= FLAG_COMPAT
    @@ -283,6 +286,7 @@
     #define setBWSet(settings)         settings->flags |= FLAG_BWSET
     #define setEnhanced(settings)      settings->flags |= FLAG_ENHANCEDREPORT
     #define setServerModeTime(settings)      settings->flags |= FLAG_SERVERMODETIME
    +#define setServerQuantum(settings) settings->flags |= FLAG_SERVERQUANTUM
    
     #define unsetBuflenSet(settings)   settings->flags &= ~FLAG_BUFLENSET
     #define unsetCompat(settings)      settings->flags &= ~FLAG_COMPAT
    @@ -311,6 +315,7 @@
     #define unsetBWSet(settings)       settings->flags &= ~FLAG_BWSET
     #define unsetEnhanced(settings)    settings->flags &= ~FLAG_ENHANCEDREPORT
     #define unsetServerModeTime(settings)    settings->flags &= ~FLAG_SERVERMODETIME
    +#define unsetServerQuantum(settings)     settings->flags &= ~FLAG_SERVERQUANTUM
    
    
     #define HEADER_VERSION1 0x80000000
    diff -ur iperf-2.0.9/src/Locale.c dankperf-2.0.9/src/Locale.c
    --- iperf-2.0.9/src/Locale.c    2016-06-20 19:41:31.000000000 -0400
    +++ dankperf-2.0.9/src/Locale.c 2017-06-30 18:32:25.276839730 -0400
    @@ -97,7 +97,8 @@
     Server specific:\n\
       -s, --server             run in server mode\n\
       -U, --single_udp         run in single threaded UDP mode\n\
    
    -  -D, --daemon             run the server as a daemon\n"
    +  -D, --daemon             run the server as a daemon\n\
    +  -Q, --quantum            maximum time allowed each client connection\n"
     #ifdef WIN32
     "  -R, --remove             remove service in win32\n"
     #endif
    diff -ur iperf-2.0.9/src/Server.cpp dankperf-2.0.9/src/Server.cpp
    --- iperf-2.0.9/src/Server.cpp  2016-09-08 12:27:20.000000000 -0400
    +++ dankperf-2.0.9/src/Server.cpp   2017-07-01 22:49:13.978249242 -0400
    @@ -106,7 +106,7 @@
         max_size_t totLen = 0;
         ReportStruct *reportstruct = NULL;
         int running;
    -    bool mMode_Time = isServerModeTime( mSettings );
    +    bool mMode_Time = isServerModeTime( mSettings ) || isServerQuantum( mSettings );
    
         reportstruct = new ReportStruct;
         if ( reportstruct != NULL ) {
    @@ -122,6 +122,8 @@
            sorcvtimer = (int) (mSettings->mInterval * 1e6) / 2;
        } else if (isModeTime(mSettings)) {
            sorcvtimer = (mSettings->mAmount * 1000) / 2;
    
    +   } else if (isServerQuantum(mSettings)) {
    +       sorcvtimer = (mSettings->mQuantum * 1000) / 2;
        }
        if (sorcvtimer > 0) {
     #ifdef WIN32
    @@ -154,7 +156,11 @@
        // setup termination variables
        if ( mMode_Time ) {
            mEndTime.setnow();
    -       mEndTime.add( mSettings->mAmount / 100.0 );
    +       if (mSettings->mQuantum) {
    +           mEndTime.add( mSettings->mQuantum / 100.0 );
    +       } else {
    +           mEndTime.add( mSettings->mAmount / 100.0 );
    +       }
        }
             do {
            reportstruct->emptyreport=0;
    @@ -205,9 +211,6 @@
             gettimeofday( &(reportstruct->packetTime), NULL );
     #endif // GETTIME           
    
    
    -   if(0.0 == mSettings->mInterval) {
    -       reportstruct->packetLen = totLen;
    -        }
        ReportPacket( mSettings->reporthdr, reportstruct );
             CloseReport( mSettings->reporthdr, reportstruct );
         } else {
    diff -ur iperf-2.0.9/src/Settings.cpp dankperf-2.0.9/src/Settings.cpp
    --- iperf-2.0.9/src/Settings.cpp    2016-09-08 12:27:20.000000000 -0400
    +++ dankperf-2.0.9/src/Settings.cpp 2017-07-01 22:32:50.343862497 -0400
    @@ -116,6 +116,7 @@
     {"nodelay",          no_argument, NULL, 'N'},
     {"listenport", required_argument, NULL, 'L'},
     {"parallel",   required_argument, NULL, 'P'},
    +{"quantum",    required_argument, NULL, 'Q'},
     {"remove",           no_argument, NULL, 'R'},
     {"tos",        required_argument, NULL, 'S'},
     {"ttl",        required_argument, NULL, 'T'},
    @@ -161,6 +162,7 @@
     {"IPERF_NODELAY",          no_argument, NULL, 'N'},
     {"IPERF_LISTENPORT", required_argument, NULL, 'L'},
     {"IPERF_PARALLEL",   required_argument, NULL, 'P'},
    +{"IPERF_QUANTUM",    required_argument, NULL, 'Q'},
     {"IPERF_TOS",        required_argument, NULL, 'S'},
     {"IPERF_TTL",        required_argument, NULL, 'T'},
     {"IPERF_SINGLE_UDP",       no_argument, NULL, 'U'},
    @@ -172,7 +174,7 @@
    
     #define SHORT_OPTIONS()
    
    -const char short_options[] = "1b:c:def:hi:l:mn:o:p:rst:uvw:x:y:zB:CDF:IL:M:NP:RS:T:UVWZ:";
    +const char short_options[] = "1b:c:def:hi:l:mn:o:p:rst:uvw:x:y:zB:CDF:IL:M:NP:Q:RS:T:UVWZ:";
    
     /* -------------------------------------------------------------------
    
      * defaults
    @@ -231,6 +233,7 @@
         //main->mMSS          = 0;           // -M,  ie. don't set MSS
         //main->mNodelay    = false;         // -N,  don't set nodelay
         //main->mThreads      = 0;           // -P,
    +    //main->mQuantum      = 0;           // -Q,  don't use a server quantum
         //main->mRemoveService = false;      // -R,
         //main->mTOS          = 0;           // -S,  ie. don't set type of service
         main->mTTL          = 1;             // -T,  link-local TTL
    @@ -586,7 +589,7 @@
                mExtSettings->mBindPort = atoi(results);
            }
            }
    -       delete parsedopts;
    +       delete[] parsedopts;
            if (mExtSettings->mLocalhost == NULL) {
            mExtSettings->mLocalhost = new char[ strlen( optarg ) + 1 ];
            strcpy( mExtSettings->mLocalhost, optarg );
    @@ -668,6 +671,11 @@
     #endif
                 break;
    
    
    +        case 'Q': // time to allow each client in server mode
    +            setServerQuantum( mExtSettings );
    +            mExtSettings->mQuantum = (int) (atof( optarg ) * 100.0);
    +            break;
    +
             case 'R':
                 setRemoveService( mExtSettings );
                 break;
    
     
    • Robert McMahon

      Robert McMahon - 2017-11-26

      Curious, how is this different from setting -t on the server/listener?

      Bob

       

Log in to post a comment.

Auth0 Logo