diff options
Diffstat (limited to 'src/Reports.c')
-rw-r--r-- | src/Reports.c | 139 |
1 files changed, 110 insertions, 29 deletions
diff --git a/src/Reports.c b/src/Reports.c index 008f7f4..296078e 100644 --- a/src/Reports.c +++ b/src/Reports.c @@ -59,6 +59,7 @@ #include "Locale.h" #include "active_hosts.h" #include "payloads.h" + static int transferid_counter = 0; static inline int my_str_copy(char **dst, char *src) { @@ -90,6 +91,7 @@ static void common_copy (struct ReportCommon **common, struct thread_Settings *i my_str_copy(&(*common)->Ifrnametx, inSettings->mIfrnametx); my_str_copy(&(*common)->SSMMulticastStr, inSettings->mSSMMulticastStr); my_str_copy(&(*common)->Congestion, inSettings->mCongestion); + my_str_copy(&(*common)->LoadCCA, inSettings->mLoadCCA); my_str_copy(&(*common)->transferIDStr, inSettings->mTransferIDStr); my_str_copy(&(*common)->PermitKey, inSettings->mPermitKey); @@ -107,6 +109,9 @@ static void common_copy (struct ReportCommon **common, struct thread_Settings *i (*common)->MSS = inSettings->mMSS; (*common)->TCPWin = inSettings->mTCPWin; (*common)->FQPacingRate = inSettings->mFQPacingRate; +#if (HAVE_DECL_SO_MAX_PACING_RATE) + (*common)->FQPacingRateStep = inSettings->mFQPacingRateStep; +#endif (*common)->Port = inSettings->mPort; (*common)->PortLast = inSettings->mPortLast; (*common)->BindPort = inSettings->mBindPort; @@ -116,7 +121,9 @@ static void common_copy (struct ReportCommon **common, struct thread_Settings *i (*common)->AppRateUnits = inSettings->mAppRateUnits; (*common)->socket = inSettings->mSock; (*common)->transferID = inSettings->mTransferID; + (*common)->peertransferID = inSettings->mPeerTransferID; (*common)->threads = inSettings->mThreads; + (*common)->working_load_threads = inSettings->mWorkingLoadThreads; (*common)->winsize_requested = inSettings->mTCPWin; #if defined(HAVE_LINUX_FILTER_H) && defined(HAVE_AF_PACKET) (*common)->socketdrop = inSettings->mSockDrop; @@ -126,18 +133,22 @@ static void common_copy (struct ReportCommon **common, struct thread_Settings *i (*common)->jitter_binwidth = inSettings->jitter_binwidth; (*common)->local = inSettings->local; (*common)->size_local = inSettings->size_local; + (*common)->multicast_group = inSettings->multicast_group; + (*common)->size_multicast_group = inSettings->size_multicast_group; (*common)->HistBins =inSettings->mHistBins; (*common)->HistBinsize =inSettings->mHistBinsize; (*common)->HistUnits =inSettings->mHistUnits; (*common)->pktIPG =inSettings->mBurstIPG; (*common)->rtt_weight = inSettings->rtt_nearcongest_weight_factor; (*common)->ListenerTimeout =inSettings->mListenerTimeout; - (*common)->FPS = inSettings->mFPS; + (*common)->FPS = (inSettings->mFPS > 0) ? inSettings->mFPS : 0; (*common)->TOS = inSettings->mTOS; (*common)->RTOS = inSettings->mRTOS; (*common)->bbsize = inSettings->mBounceBackBytes; + (*common)->bbreplysize = inSettings->mBounceBackReplyBytes; (*common)->bbhold = inSettings->mBounceBackHold; (*common)->bbcount = inSettings->mBounceBackBurst; + (*common)->Omit = inSettings->mOmit; #if HAVE_DECL_TCP_WINDOW_CLAMP (*common)->ClampSize = inSettings->mClampSize; #endif @@ -169,6 +180,8 @@ static void free_common_copy (struct ReportCommon *common) { free(common->SSMMulticastStr); if (common->Congestion) free(common->Congestion); + if (common->LoadCCA) + free(common->LoadCCA); if (common->transferIDStr) free(common->transferIDStr); if (common->PermitKey) @@ -180,7 +193,7 @@ static void free_common_copy (struct ReportCommon *common) { // on the setting object. If the current id is zero // this will get the next one. Otherwise it will use // the value. -void setTransferID (struct thread_Settings *inSettings, int role_reversal) { +void setTransferID (struct thread_Settings *inSettings, enum TansferIDType traffic_direction) { if (!inSettings->mTransferIDStr) { if (!inSettings->mTransferID) { Mutex_Lock(&transferid_mutex); @@ -188,7 +201,7 @@ void setTransferID (struct thread_Settings *inSettings, int role_reversal) { Mutex_Unlock(&transferid_mutex); } int len = 0; - if (role_reversal) { + if (traffic_direction == REVERSED) { #ifdef HAVE_ROLE_REVERSAL_ID if (isPermitKey(inSettings) && (inSettings->mPermitKey[0] != '\0')) { len = snprintf(NULL, 0, "[%s(*%d)] ", \ @@ -220,6 +233,17 @@ void setTransferID (struct thread_Settings *inSettings, int role_reversal) { } } +void updateTransferIDPeer (struct thread_Settings *inSettings) { + if (inSettings->mPeerTransferID && (inSettings->mPeerTransferID != inSettings->mTransferID)) { + if (inSettings->mTransferIDStr) + FREE_ARRAY(inSettings->mTransferIDStr); + int len = snprintf(NULL, 0, "[%3d] ", inSettings->mPeerTransferID); + inSettings->mTransferIDStr = (char *) calloc(len+1, sizeof(char)); + if (inSettings->mTransferIDStr) { + len = sprintf(inSettings->mTransferIDStr, "[%3d] ", inSettings->mPeerTransferID); + } + } +} void SetFullDuplexHandlers (struct thread_Settings *inSettings, struct SumReport* sumreport) { if (isUDP(inSettings)) { sumreport->transfer_protocol_sum_handler = reporter_transfer_protocol_fullduplex_udp; @@ -252,7 +276,7 @@ void SetSumHandlers (struct thread_Settings *inSettings, struct SumReport* sumre } else if (isFullDuplex(inSettings)) { sumreport->info.output_handler = udp_output_fullduplex_sum; } else { - sumreport->info.output_handler = (isEnhanced(inSettings) ? udp_output_sum_read_enhanced : udp_output_sum_read); + sumreport->info.output_handler = (isEnhanced(inSettings) ? udp_output_sumcnt_read_enhanced : udp_output_sum_read); } } } else { @@ -270,7 +294,7 @@ void SetSumHandlers (struct thread_Settings *inSettings, struct SumReport* sumre } else if (isFullDuplex(inSettings)) { sumreport->info.output_handler = tcp_output_sum_read; } else { - sumreport->info.output_handler = (isEnhanced(inSettings) ? tcp_output_sum_read_enhanced : tcp_output_sum_read); + sumreport->info.output_handler = (isEnhanced(inSettings) ? tcp_output_sumcnt_read_enhanced : tcp_output_sum_read); } } } @@ -290,7 +314,7 @@ void SetSumHandlers (struct thread_Settings *inSettings, struct SumReport* sumre } else if (isFullDuplex(inSettings)) { sumreport->info.output_handler = udp_output_fullduplex_sum; } else { - sumreport->info.output_handler = (isEnhanced(inSettings) ? udp_output_sum_write_enhanced : udp_output_sum_write); + sumreport->info.output_handler = (isEnhanced(inSettings) ? udp_output_sumcnt_write_enhanced : udp_output_sum_write); } } } else { @@ -306,7 +330,7 @@ void SetSumHandlers (struct thread_Settings *inSettings, struct SumReport* sumre } else if (isFullDuplex(inSettings)) { sumreport->info.output_handler = tcp_output_fullduplex_sum; } else { - sumreport->info.output_handler = (isEnhanced(inSettings) ? tcp_output_sum_write_enhanced : tcp_output_sum_write); + sumreport->info.output_handler = (isEnhanced(inSettings) ? tcp_output_sumcnt_write_enhanced : tcp_output_sum_write); } } } @@ -316,7 +340,7 @@ void SetSumHandlers (struct thread_Settings *inSettings, struct SumReport* sumre } } -struct SumReport* InitSumReport(struct thread_Settings *inSettings, int inID, int fullduplex_report) { +struct SumReport* InitSumReport(struct thread_Settings *inSettings, int inID, bool fullduplex_report) { struct SumReport *sumreport = (struct SumReport *) calloc(1, sizeof(struct SumReport)); if (sumreport == NULL) { FAIL(1, "Out of Memory!!\n", inSettings); @@ -324,11 +348,17 @@ struct SumReport* InitSumReport(struct thread_Settings *inSettings, int inID, in sumreport->reference.count = 0; sumreport->reference.maxcount = 0; Mutex_Initialize(&sumreport->reference.lock); - sumreport->threads = 0; common_copy(&sumreport->info.common, inSettings); // sumreport->info.common->transferID = inID; // this is now set in the active code - sumreport->info.threadcnt = 0; sumreport->info.isMaskOutput = false; + sumreport->info.sumreport = sumreport; + sumreport->info.type = SUM_REPORT; + sumreport->info.uplevel = LOW; + sumreport->info.downlevel = LOW; + sumreport->info.slot_thread_upcount = 0; + sumreport->info.slot_thread_downcount = 0; + sumreport->final_thread_upcount = 0; + if (inSettings->mReportMode == kReport_CSV) { format_ips_port_string(&sumreport->info, 1); } @@ -348,18 +378,18 @@ struct SumReport* InitSumReport(struct thread_Settings *inSettings, int inID, in char name[] = "SUMT8"; sumreport->info.latency_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0,\ pow(10,inSettings->mHistUnits), \ - inSettings->mHistci_lower, inSettings->mHistci_upper, sumreport->info.common->transferID, name); + inSettings->mHistci_lower, inSettings->mHistci_upper, sumreport->info.common->transferID, name, false); } else { char name[] = "SUMF8"; sumreport->info.framelatency_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0, \ pow(10,inSettings->mHistUnits), inSettings->mHistci_lower, \ - inSettings->mHistci_upper, sumreport->info.common->transferID, name); + inSettings->mHistci_upper, sumreport->info.common->transferID, name, false); } } if (isJitterHistogram(inSettings) && isUDP(inSettings)) { char name[] = "SUMJ8"; sumreport->info.jitter_histogram = histogram_init(JITTER_BINCNT,inSettings->jitter_binwidth,0,JITTER_UNITS, \ - JITTER_LCI, JITTER_UCI, sumreport->info.common->transferID, name); + JITTER_LCI, JITTER_UCI, sumreport->info.common->transferID, name, false); } } if (fullduplex_report) { @@ -417,6 +447,12 @@ void FreeSumReport (struct SumReport *sumreport) { if (sumreport->info.bbrtt_histogram) { histogram_delete(sumreport->info.bbrtt_histogram); } + if (sumreport->info.bbowdto_histogram) { + histogram_delete(sumreport->info.bbowdto_histogram); + } + if (sumreport->info.bbowdfro_histogram) { + histogram_delete(sumreport->info.bbowdfro_histogram); + } if (sumreport->info.jitter_histogram) { histogram_delete(sumreport->info.jitter_histogram); } @@ -453,6 +489,12 @@ static void Free_iReport (struct ReporterData *ireport) { if (ireport->info.bbrtt_histogram) { histogram_delete(ireport->info.bbrtt_histogram); } + if (ireport->info.bbowdto_histogram) { + histogram_delete(ireport->info.bbowdto_histogram); + } + if (ireport->info.bbowdfro_histogram) { + histogram_delete(ireport->info.bbowdfro_histogram); + } free_common_copy(ireport->info.common); free(ireport); } @@ -568,13 +610,18 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { } // Copy common settings into the transfer report section common_copy(&ireport->info.common, inSettings); + ireport->info.sumreport = inSettings->mSumReport; ireport->info.final = false; ireport->info.burstid_transition = false; ireport->info.isEnableTcpInfo = false; + ireport->info.type = DATA_REPORT; // Create a new packet ring which is used to communicate // packet stats from the traffic thread to the reporter // thread. The reporter thread does all packet accounting + // ring events causes the packet ring to return a NULL on + // dequeue across a boundary, e.g. an interval report timestamp. + // This is needed so summing works properly ireport->packetring = packetring_init((inSettings->numreportstructs ? inSettings->numreportstructs : (isSingleUDP(inSettings) ? 40 : NUM_REPORT_STRUCTS)), \ &ReportCond, (isSingleUDP(inSettings) ? NULL : &inSettings->awake_me)); #ifdef HAVE_THREAD_DEBUG @@ -693,21 +740,28 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { ireport->transfer_protocol_handler = reporter_transfer_protocol_client_tcp; if (isSumOnly(inSettings)) { ireport->info.output_handler = NULL; + } else if (isBounceBack(inSettings)) { + ireport->packet_handler_post_report = reporter_handle_packet_bb_client; + ireport->transfer_protocol_handler = reporter_transfer_protocol_client_bb_tcp; + if (inSettings->mReportMode == kReport_CSV) + ireport->info.output_handler = tcp_output_write_bb_csv; + else + ireport->info.output_handler = tcp_output_write_bb; } else if ((inSettings->mReportMode == kReport_CSV) && !isSumOnly(inSettings)) { if (isEnhanced(inSettings)) ireport->info.output_handler = tcp_output_write_enhanced_csv; else ireport->info.output_handler = tcp_output_basic_csv; - } else if (isBounceBack(inSettings)) { - ireport->packet_handler_post_report = reporter_handle_packet_bb_client; - ireport->transfer_protocol_handler = reporter_transfer_protocol_client_bb_tcp; - ireport->info.output_handler = tcp_output_write_bb; } else if (isIsochronous(inSettings)) { ireport->info.output_handler = tcp_output_write_enhanced_isoch; } else if (isTcpWriteTimes(inSettings)) { ireport->info.output_handler = tcp_output_write_enhanced_write; } else if (isEnhanced(inSettings)) { - ireport->info.output_handler = tcp_output_write_enhanced; + if (isFQPacing(inSettings)) + ireport->info.output_handler = tcp_output_write_enhanced_fq; + else { + ireport->info.output_handler = tcp_output_write_enhanced; + } } else if (isFullDuplex(inSettings)) { ireport->info.output_handler = tcp_output_write; } else { @@ -729,13 +783,13 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { if (isJitterHistogram(inSettings)) { char name[] = "J8"; ireport->info.jitter_histogram = histogram_init(JITTER_BINCNT,inSettings->jitter_binwidth,0,JITTER_UNITS, \ - JITTER_LCI, JITTER_UCI, ireport->info.common->transferID, name); + JITTER_LCI, JITTER_UCI, ireport->info.common->transferID, name, false); } if (isTripTime(inSettings) && isHistogram(inSettings)) { char name[] = "T8"; ireport->info.latency_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0,\ pow(10,inSettings->mHistUnits), \ - inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name); + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name, false); } } if (isHistogram(inSettings) && (isIsochronous(inSettings) || (!isUDP(inSettings) && isTripTime(inSettings)))) { @@ -743,7 +797,7 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { // make sure frame bin size min is 100 microsecond ireport->info.framelatency_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0, \ pow(10,inSettings->mHistUnits), inSettings->mHistci_lower, \ - inSettings->mHistci_upper, ireport->info.common->transferID, name); + inSettings->mHistci_upper, ireport->info.common->transferID, name, false); } } if ((inSettings->mThreadMode == kMode_Client) && !isUDP(inSettings) && isHistogram(inSettings)) { @@ -751,16 +805,16 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { char name[] = "W8"; ireport->info.write_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0,\ pow(10,inSettings->mHistUnits), \ - inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name); + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name, false); } else if (isWritePrefetch(inSettings)) { char name[] = "S8"; ireport->info.latency_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0,\ pow(10,inSettings->mHistUnits), \ - inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name); + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name, false); } } if ((inSettings->mThreadMode == kMode_Client) && isBounceBack(inSettings)) { - char name[] = "BB8"; + char name[] = " BB8"; if (!isHistogram(inSettings)) { inSettings->mHistBins = 100000; // 10 seconds wide inSettings->mHistBinsize = 100; // 100 usec bins @@ -769,8 +823,16 @@ struct ReportHeader* InitIndividualReport (struct thread_Settings *inSettings) { inSettings->mHistci_upper = 95; } ireport->info.bbrtt_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0, \ - pow(10,inSettings->mHistUnits), \ - inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name); + pow(10,inSettings->mHistUnits), \ + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, name, false); + if (isTripTime(inSettings)) { + ireport->info.bbowdto_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0, \ + pow(10,inSettings->mHistUnits), \ + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, " OWD-TX", false); + ireport->info.bbowdfro_histogram = histogram_init(inSettings->mHistBins,inSettings->mHistBinsize,0, \ + pow(10,inSettings->mHistUnits), \ + inSettings->mHistci_lower, inSettings->mHistci_upper, ireport->info.common->transferID, " OWD-RX", false); + } } return reporthdr; } @@ -838,8 +900,14 @@ struct ReportHeader* InitConnectionReport (struct thread_Settings *inSettings) { creport->common->winsize_requested = inSettings->mTCPWin; creport->txholdbacktime = inSettings->txholdback_timer; if (isPeriodicBurst(inSettings)) { - creport->common->FPS = inSettings->mFPS; + creport->common->FPS = (inSettings->mFPS > 0) ? inSettings->mFPS : 0; + } + if (isLoadCCA(inSettings) && (isWorkingLoadUp(inSettings) || isWorkingLoadDown(inSettings))) { + strncpy(creport->connected_cca, inSettings->mLoadCCA, TCP_CCA_NAME_MAX); + } else if (isCongestionControl(inSettings)) { + strncpy(creport->connected_cca, inSettings->mCongestion, TCP_CCA_NAME_MAX); } + creport->connected_cca[TCP_CCA_NAME_MAX - 1] = '\0'; #ifdef HAVE_THREAD_DEBUG char rs[REPORTTXTMAX]; reporttype_text(reporthdr, &rs[0]); @@ -972,6 +1040,19 @@ struct ReportHeader* InitServerRelayUDPReport(struct thread_Settings *inSettings return reporthdr; } +struct ReportHeader* InitStringReport (char *textoutput) { + struct ReportHeader *reporthdr = (struct ReportHeader *) calloc(1, sizeof(struct ReportHeader)); + if (reporthdr == NULL) { + WARN_errno(1, "Out of Memory!!\n"); + } + reporthdr->type = STRING_REPORT; + + reporthdr->this_report = (void *) calloc((strlen(textoutput) + 1), sizeof(char)); + char *dst = (char *)(reporthdr->this_report); + strcpy(dst, textoutput); + return reporthdr; +} + /* ------------------------------------------------------------------- * Send an AckFIN (a datagram acknowledging a FIN) on the socket, * then select on the socket for some time to check for silence. @@ -985,7 +1066,7 @@ void write_UDP_AckFIN (struct TransferInfo *stats, int len) { int ackpacket_length = (int) (sizeof(struct UDP_datagram) + sizeof(struct server_hdr)); int readlen = ((ackpacket_length * 2) > len * 2) ? (ackpacket_length * 2) : (len * 2); char *ackPacket = (char *) calloc(1, readlen); - int success = 0; + bool success = false; assert(ackPacket); fd_set readSet; int rc = 1; @@ -1068,7 +1149,7 @@ void write_UDP_AckFIN (struct TransferInfo *stats, int len) { #ifdef HAVE_THREAD_DEBUG thread_debug("UDP server detected silence - server stats assumed received by client"); #endif - success = 1; + success = true; break; } rc = read(stats->common->socket, ackPacket, readlen); |