summaryrefslogtreecommitdiffstats
path: root/src/Reports.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Reports.c')
-rw-r--r--src/Reports.c139
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);