X-Git-Url: http://sjero.net/git/?p=iperf;a=blobdiff_plain;f=src%2FSettings.cpp;h=549a9cca9d7523afb8c88e31e72901e3b16f8124;hp=4cde826405af41db1b7fb6ef7021d1f85adc7044;hb=a5a03e6ab0fdf9c4d7d4c085fcf01436f9ba3202;hpb=90fc1e2c0c74319759b21d4a177c32691b88fdf3 diff --git a/src/Settings.cpp b/src/Settings.cpp index 4cde826..549a9cc 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -91,6 +91,7 @@ const struct option long_options[] = {"format", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"interval", required_argument, NULL, 'i'}, +{"mcast_iface",required_argument, NULL, 'j'}, {"len", required_argument, NULL, 'l'}, {"print_mss", no_argument, NULL, 'm'}, {"num", required_argument, NULL, 'n'}, @@ -136,6 +137,7 @@ const struct option env_options[] = {"IPERF_FORMAT", required_argument, NULL, 'f'}, // skip help {"IPERF_INTERVAL", required_argument, NULL, 'i'}, +{"IPERF_MCASTIFACE", required_argument, NULL, 'j'}, {"IPERF_LEN", required_argument, NULL, 'l'}, {"IPERF_PRINT_MSS", no_argument, NULL, 'm'}, {"IPERF_NUM", required_argument, NULL, 'n'}, @@ -170,7 +172,7 @@ const struct option env_options[] = #define SHORT_OPTIONS() const char short_options[] = - "12b::c:df:hi:l:mn:o:p:rst:uvw:x:y:B:CDF:IL:M:NP:RS:T:UVW"; + "12b::c:df:hi:j:l:mn:o:p:rst:uvw:x:y:B:CDF:IJ:L:M:NP:RS:T:UV:W"; /* ------------------------------------------------------------------- * defaults @@ -196,6 +198,7 @@ void Settings_Initialize( thread_Settings *main ) { // below. memset( main, 0, sizeof(thread_Settings) ); main->mSock = INVALID_SOCKET; + //main->mSockAF = AF_UNSPEC main->mReportMode = kReport_Default; // option, defaults main->flags = FLAG_MODETIME | FLAG_STDOUT; // Default time and stdout @@ -226,6 +229,7 @@ void Settings_Initialize( thread_Settings *main ) { //main->mFileInput = false; // -F, //main->mFileName = NULL; // -F, filename //main->mStdin = false; // -I, default not stdin + //main->mMcastIface = 0; // -J, default: host chooses interface //main->mListenPort = 0; // -L, listen port //main->mMSS = 0; // -M, ie. don't set MSS //main->mNodelay = false; // -N, don't set nodelay @@ -355,13 +359,6 @@ void Settings_Interpret( char option, const char *optarg, thread_Settings *mExtS strcpy( mExtSettings->mHost, optarg ); if ( mExtSettings->mThreadMode == kMode_Unknown ) { - // Test for Multicast - iperf_sockaddr temp; - SockAddr_setHostname( mExtSettings->mHost, &temp, - (isIPV6( mExtSettings ) ? 1 : 0 )); - if ( SockAddr_isMulticast( &temp ) ) { - setMulticast( mExtSettings ); - } mExtSettings->mThreadMode = kMode_Client; mExtSettings->mThreads = 1; } @@ -392,6 +389,13 @@ void Settings_Interpret( char option, const char *optarg, thread_Settings *mExtS } break; + case 'j': + case 'J': // multicast interface to join multicast address on + mExtSettings->mMcastIface = if_nametoindex(optarg); + if (!mExtSettings->mMcastIface) + die("Interface \"%s\" does not work for -j/-J.", optarg); + break; + case 'l': // length of each buffer Settings_GetUpperCaseArg(optarg,outarg); mExtSettings->mBufLen = byte_atoi( outarg ); @@ -541,13 +545,6 @@ void Settings_Interpret( char option, const char *optarg, thread_Settings *mExtS case 'B': // specify bind address mExtSettings->mLocalhost = new char[ strlen( optarg ) + 1 ]; strcpy( mExtSettings->mLocalhost, optarg ); - // Test for Multicast - iperf_sockaddr temp; - SockAddr_setHostname( mExtSettings->mLocalhost, &temp, - (isIPV6( mExtSettings ) ? 1 : 0 )); - if ( SockAddr_isMulticast( &temp ) ) { - setMulticast( mExtSettings ); - } break; case 'C': // Run in Compatibility Mode @@ -633,30 +630,15 @@ void Settings_Interpret( char option, const char *optarg, thread_Settings *mExtS mExtSettings->mTTL = atoi( optarg ); break; + case 'V': // IP Domain: the optional ar + mExtSettings->mSockAF = AF_INET6; + if ( optarg && optarg[0] == '4' ) + mExtSettings->mSockAF = AF_INET; + break; case 'U': // single threaded UDP server setSingleUDP( mExtSettings ); break; - case 'V': // IPv6 Domain - setIPV6( mExtSettings ); - if ( mExtSettings->mThreadMode == kMode_Server - && mExtSettings->mLocalhost != NULL ) { - // Test for Multicast - iperf_sockaddr temp; - SockAddr_setHostname( mExtSettings->mLocalhost, &temp, 1); - if ( SockAddr_isMulticast( &temp ) ) { - setMulticast( mExtSettings ); - } - } else if ( mExtSettings->mThreadMode == kMode_Client ) { - // Test for Multicast - iperf_sockaddr temp; - SockAddr_setHostname( mExtSettings->mHost, &temp, 1 ); - if ( SockAddr_isMulticast( &temp ) ) { - setMulticast( mExtSettings ); - } - } - break; - case 'W' : setSuggestWin( mExtSettings ); fprintf( stderr, "The -W option is not available in this release\n"); @@ -774,16 +756,7 @@ void Settings_GenerateClientSettings( thread_Settings *server, strcpy( (*client)->mLocalhost, server->mLocalhost ); } (*client)->mHost = new char[REPORT_ADDRLEN]; - if ( ((sockaddr*)&server->peer)->sa_family == AF_INET ) { - inet_ntop( AF_INET, &((sockaddr_in*)&server->peer)->sin_addr, - (*client)->mHost, REPORT_ADDRLEN); - } -#ifdef HAVE_IPV6 - else { - inet_ntop( AF_INET6, &((sockaddr_in6*)&server->peer)->sin6_addr, - (*client)->mHost, REPORT_ADDRLEN); - } -#endif + SockAddr_name(&server->peer, (*client)->mHost, REPORT_ADDRLEN); } else { *client = NULL; }