]> sjero.net Git - iperf/blobdiff - src/Reporter.c
DCCP support for iperf
[iperf] / src / Reporter.c
index e34763ec99915ffdd145f02f26afa7e4febe2d23..db9418e3bb97baecd1754950589a574d9f7b662f 100644 (file)
@@ -156,13 +156,14 @@ MultiHeader* InitMulti( thread_Settings *agent, int inID ) {
                 data->mLocalhost = agent->mLocalhost;
                 data->mBufLen = agent->mBufLen;
                 data->mMSS = agent->mMSS;
-                data->mTCPWin = agent->mTCPWin;
+                data->mWinSize = agent->mWinSize;
                 data->flags = agent->flags;
+                data->mProtocol = agent->mProtocol;
                 data->mThreadMode = agent->mThreadMode;
                 data->mode = agent->mReportMode;
                 data->info.mFormat = agent->mFormat;
                 data->info.mTTL = agent->mTTL;
-                if ( isUDP( agent ) ) {
+                if ( isPacketOriented( agent ) ) {
                     multihdr->report->info.mUDP = (char)agent->mThreadMode;
                 }
                 if ( isConnectionReport( agent ) ) {
@@ -237,13 +238,14 @@ ReportHeader* InitReport( thread_Settings *agent ) {
             data->mLocalhost = agent->mLocalhost;
             data->mBufLen = agent->mBufLen;
             data->mMSS = agent->mMSS;
-            data->mTCPWin = agent->mTCPWin;
+            data->mWinSize = agent->mWinSize;
             data->flags = agent->flags;
+            data->mProtocol = agent->mProtocol;
             data->mThreadMode = agent->mThreadMode;
             data->mode = agent->mReportMode;
             data->info.mFormat = agent->mFormat;
             data->info.mTTL = agent->mTTL;
-            if ( isUDP( agent ) ) {
+            if ( isPacketOriented( agent ) ) {
                 reporthdr->report.info.mUDP = (char)agent->mThreadMode;
             }
         } else {
@@ -371,7 +373,6 @@ void ReportPacket( ReportHeader* agent, ReportStruct *packet ) {
  */
 void CloseReport( ReportHeader *agent, ReportStruct *packet ) {
     if ( agent != NULL) {
-
         /*
          * Using PacketID of -1 ends reporting
          */
@@ -442,8 +443,9 @@ void ReportSettings( thread_Settings *agent ) {
             data->type = SETTINGS_REPORT;
             data->mBufLen = agent->mBufLen;
             data->mMSS = agent->mMSS;
-            data->mTCPWin = agent->mTCPWin;
+            data->mWinSize = agent->mWinSize;
             data->flags = agent->flags;
+            data->mProtocol = agent->mProtocol;
             data->mThreadMode = agent->mThreadMode;
             data->mPort = agent->mPort;
             data->info.mFormat = agent->mFormat;
@@ -672,24 +674,26 @@ int reporter_handle_packet( ReportHeader *reporthdr ) {
     Transfer_Info *stats = &reporthdr->report.info;
     int finished = 0;
 
+    // update received amount and time
+    data->TotalLen  += packet->packetLen;
+    data->packetTime = packet->packetTime;
     data->cntDatagrams++;
-    // If this is the last packet set the endTime
-    if ( packet->packetID < 0 ) {
-        data->packetTime = packet->packetTime;
+
+    if (packet->packetID < 0) {
+        // This is the last packet (FIN)
         finished = 1;
-        if ( reporthdr->report.mThreadMode != kMode_Client ) {
-            data->TotalLen += packet->packetLen;
+        if (isConnectionLess(&reporthdr->report)) {
+            // connectionless protocols don't count the last payload
+            if (reporthdr->report.mThreadMode == kMode_Client)
+                data->TotalLen -= packet->packetLen;
+        } else {
+            // connection-oriented protocols dont't count the FIN
+            data->cntDatagrams--;
         }
-    } else {
-        // update recieved amount and time
-        data->packetTime = packet->packetTime;
-        reporter_condprintstats( &reporthdr->report, reporthdr->multireport, finished );
-        data->TotalLen += packet->packetLen;
-        if ( packet->packetID != 0 ) {
-            // UDP packet
-            double transit;
-            double deltaTransit;
-            
+    } else if ( packet->packetID != 0 ) {
+            // UDP or DCCP packet
+            double transit, deltaTransit;
+
             // from RFC 1889, Real Time Protocol (RTP) 
             // J = J + ( | D(i-1,i) | - J ) / 16 
             transit = TimeDifference( packet->packetTime, packet->sentTime );
@@ -701,7 +705,7 @@ int reporter_handle_packet( ReportHeader *reporthdr ) {
                 stats->jitter += (deltaTransit - stats->jitter) / (16.0);
             }
             data->lastTransit = transit;
-    
+
             // packet loss occured if the datagram numbers aren't sequential 
             if ( packet->packetID != data->PacketID + 1 ) {
                 if ( packet->packetID < data->PacketID + 1 ) {
@@ -714,9 +718,7 @@ int reporter_handle_packet( ReportHeader *reporthdr ) {
             if ( packet->packetID > data->PacketID ) {
                 data->PacketID = packet->packetID;
             }
-        }
     }
-
     // Print a report if appropriate
     return reporter_condprintstats( &reporthdr->report, reporthdr->multireport, finished );
 }
@@ -791,11 +793,14 @@ int reporter_condprintstats( ReporterData *stats, MultiHeader *multireport, int
         if ( stats->info.cntError > stats->info.cntOutofOrder ) {
             stats->info.cntError -= stats->info.cntOutofOrder;
         }
-        stats->info.cntDatagrams = (isUDP(stats) ? stats->PacketID : stats->cntDatagrams);
-        stats->info.TotalLen = stats->TotalLen;
+        if (isConnectionLess(stats))
+                stats->info.cntDatagrams = stats->PacketID;
+        else
+                stats->info.cntDatagrams = stats->cntDatagrams;
+        stats->info.TotalLen  = stats->TotalLen;
         stats->info.startTime = 0;
-        stats->info.endTime = TimeDifference( stats->packetTime, stats->startTime );
-        stats->info.free = 1;
+        stats->info.endTime   = TimeDifference( stats->packetTime, stats->startTime );
+        stats->info.free      = 1;
         reporter_print( stats, TRANSFER_REPORT, force );
         if ( isMultipleReport(stats) ) {
             reporter_handle_multiple_reports( multireport, &stats->info, force );
@@ -813,9 +818,13 @@ int reporter_condprintstats( ReporterData *stats, MultiHeader *multireport, int
             stats->info.cntError -= stats->info.cntOutofOrder;
         }
         stats->lastError = stats->cntError;
-        stats->info.cntDatagrams = (isUDP( stats ) ? stats->PacketID - stats->lastDatagrams :
-                                                     stats->cntDatagrams - stats->lastDatagrams);
-        stats->lastDatagrams = (isUDP( stats ) ? stats->PacketID : stats->cntDatagrams);
+        if (isConnectionLess(stats)) {
+                stats->info.cntDatagrams = stats->PacketID - stats->lastDatagrams;
+                stats->lastDatagrams     = stats->PacketID;
+        } else {
+                stats->info.cntDatagrams = stats->cntDatagrams - stats->lastDatagrams;
+                stats->lastDatagrams     = stats->cntDatagrams;
+        }
         stats->info.TotalLen = stats->TotalLen - stats->lastTotal;
         stats->lastTotal = stats->TotalLen;
         stats->info.startTime = stats->info.endTime;
@@ -838,7 +847,7 @@ int reporter_print( ReporterData *stats, int type, int end ) {
     switch ( type ) {
         case TRANSFER_REPORT:
             statistics_reports[stats->mode]( &stats->info );
-            if ( end != 0 && isPrintMSS( stats ) && !isUDP( stats ) ) {
+            if ( end != 0 && isPrintMSS( stats ) && !isConnectionLess( stats ) ) {
                 PrintMSS( stats );
             }
             break;
@@ -865,6 +874,8 @@ int reporter_print( ReporterData *stats, int type, int end ) {
 
 /* -------------------------------------------------------------------
  * Report the MSS and MTU, given the MSS (or a guess thereof)
+ * This works for connection-oriented protocols only: it expects
+ * the protocol to be either TCP or DCCP and will give error otherwise
  * ------------------------------------------------------------------- */
 
 // compare the MSS against the (MTU - 40) to (MTU - 80) bytes.
@@ -872,8 +883,11 @@ int reporter_print( ReporterData *stats, int type, int end ) {
 
 #define checkMSS_MTU( inMSS, inMTU ) (inMTU-40) >= inMSS  &&  inMSS >= (inMTU-80)
 
-void PrintMSS( ReporterData *stats ) {
-    int inMSS = getsock_tcp_mss( stats->info.transferID );
+void PrintMSS( ReporterData *stats )
+{
+    int inMSS = stats->mProtocol == kProto_TCP
+              ?   getsock_tcp_mss( stats->info.transferID )
+              :   getsock_dccp_mps( stats->info.transferID );
 
     if ( inMSS <= 0 ) {
         printf( report_mss_unsupported, stats->info.transferID );