X-Git-Url: http://sjero.net/git/?p=iperf;a=blobdiff_plain;f=src%2FReporter.c;fp=src%2FReporter.c;h=db9418e3bb97baecd1754950589a574d9f7b662f;hp=e34763ec99915ffdd145f02f26afa7e4febe2d23;hb=90fc1e2c0c74319759b21d4a177c32691b88fdf3;hpb=fad82d47d76abc8f4ac6767e58b89859ad35a2ca diff --git a/src/Reporter.c b/src/Reporter.c index e34763e..db9418e 100644 --- a/src/Reporter.c +++ b/src/Reporter.c @@ -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 );