]> sjero.net Git - iperf/blobdiff - src/Settings.cpp
Native IPv6 support for iperf
[iperf] / src / Settings.cpp
index 4cde826405af41db1b7fb6ef7021d1f85adc7044..549a9cca9d7523afb8c88e31e72901e3b16f8124 100644 (file)
@@ -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;
     }