summaryrefslogtreecommitdiffstats
path: root/include/Settings.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/Settings.hpp')
-rw-r--r--include/Settings.hpp665
1 files changed, 665 insertions, 0 deletions
diff --git a/include/Settings.hpp b/include/Settings.hpp
new file mode 100644
index 0000000..250d3a7
--- /dev/null
+++ b/include/Settings.hpp
@@ -0,0 +1,665 @@
+/*---------------------------------------------------------------
+ * Copyright (c) 1999,2000,2001,2002,2003
+ * The Board of Trustees of the University of Illinois
+ * All Rights Reserved.
+ *---------------------------------------------------------------
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software (Iperf) and associated
+ * documentation files (the "Software"), to deal in the Software
+ * without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit
+ * persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ *
+ * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and
+ * the following disclaimers.
+ *
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimers in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ *
+ * Neither the names of the University of Illinois, NCSA,
+ * nor the names of its contributors may be used to endorse
+ * or promote products derived from this Software without
+ * specific prior written permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ________________________________________________________________
+ * National Laboratory for Applied Network Research
+ * National Center for Supercomputing Applications
+ * University of Illinois at Urbana-Champaign
+ * http://www.ncsa.uiuc.edu
+ * ________________________________________________________________
+ *
+ * Settings.hpp
+ * by Mark Gates <mgates@nlanr.net>
+ * & Ajay Tirumala <tirumala@ncsa.uiuc.edu>
+ * -------------------------------------------------------------------
+ * Stores and parses the initial values for all the global variables.
+ * -------------------------------------------------------------------
+ * headers
+ * uses
+ * <stdlib.h>
+ * <assert.h>
+ * ------------------------------------------------------------------- */
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include "headers.h"
+#include "Thread.h"
+#include "Condition.h"
+#include "packet_ring.h"
+
+/* -------------------------------------------------------------------
+ * constants
+ * ------------------------------------------------------------------- */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Smallest report interval supported. Units is microseconds */
+#ifndef HAVE_FASTSAMPLING
+#define SMALLEST_INTERVAL 5000 // 5ms
+#define SMALLEST_INTERVAL_SEC 0.005 // 5ms
+#else
+#define SMALLEST_INTERVAL 100 // 100 usec
+#define SMALLEST_INTERVAL_SEC 0.0001 // 5ms
+#endif
+
+#define SLOPSECS 2
+// maximum difference allowed between the tx (client) start time and the
+// the first receive time (units seconds, requires --trip-times on client)
+#define MAXDIFFTIMESTAMPSECS 600
+// maximum difference in seconds to bound --txstart-time
+#define MAXDIFFTXSTART 3600
+// maximum difference in seconds to bound --txdelay-time,
+// if this is too large and w/o keep-alives the connect may drop
+#define MAXDIFFTXDELAY 3600
+// maximum inter packet gap (or write delay) for UDP packets
+#define MAXIPGSECS 60
+#define CSVPEERLIMIT ((REPORT_ADDRLEN * 2) + 40)
+#define NEARCONGEST_DEFAULT 0.5
+#define DEFAULT_PERMITKEY_LIFE 20.0 // units is seconds
+#define TESTEXCHANGETIMEOUT (4 * 1000000) // 4 secs, units is microseconds
+#ifndef MAXTTL
+#define MAXTTL 255
+#endif
+#define DEFAULT_BOUNCEBACK_BYTES 100
+#define SMALL_WRITE_PREFETCH (1024 * 16)
+
+#define SHALLOW_COPY 1
+#define DEEP_COPY 1
+// server/client mode
+enum ThreadMode {
+ kMode_Unknown = 0,
+ kMode_Server,
+ kMode_Client,
+ kMode_Reporter,
+ kMode_ReporterClient,
+ kMode_WriteAckServer,
+ kMode_WriteAckClient,
+ kMode_Listener
+};
+
+// report mode
+enum ReportMode {
+ kReport_Default = 0,
+ kReport_CSV
+};
+
+// test mode
+enum TestMode {
+ kTest_Normal = 0,
+ kTest_DualTest,
+ kTest_TradeOff,
+ kTest_Unknown
+};
+
+// interval reporting mode
+enum IntervalMode {
+ kInterval_None = 0,
+ kInterval_Time,
+ kInterval_Frames
+};
+
+// rate request units
+enum RateUnits {
+ kRate_BW = 0,
+ kRate_PPS
+};
+
+#include "Reporter.h"
+#include "payloads.h"
+
+/*
+ * The thread_Settings is a structure that holds all
+ * options for a given execution of either a client
+ * or server. By using this structure rather than
+ * a global structure or class we can have multiple
+ * clients or servers running with different settings.
+ * In version 2.0 and above this structure contains
+ * all the information needed for a thread to execute
+ * and contains only C elements so it can be manipulated
+ * by either C or C++.
+ */
+struct thread_Settings {
+ // Pointers
+ char* mFileName; // -F
+ char* mHost; // -c
+ char* mHideHost;
+ char* mLocalhost; // -B
+ char* mOutputFileName; // -o
+ char* mIfrname; // %<device> name (for rx)
+ char* mIfrnametx; // %<device> name (for tx)
+ char* mSSMMulticastStr; // --ssm-host
+ char* mIsochronousStr; // --isochronous
+ char* mHistogramStr; // --histograms (packets)
+ char* mTransferIDStr; //
+ char* mBuf;
+ FILE* Extractor_file;
+
+ struct ReportHeader* reporthdr;
+ struct SumReport* mSumReport;
+ struct SumReport* mFullDuplexReport;
+ struct thread_Settings *runNow;
+ struct thread_Settings *runNext;
+ // int's
+ int mThreads; // -P
+ int mTOS; // -S
+ int mRTOS; // reflected TOS
+ int mTransferID;
+ int mConnectRetries;
+#if WIN32
+ SOCKET mSock;
+#else
+ int mSock;
+#endif
+#if defined(HAVE_LINUX_FILTER_H) && defined(HAVE_AF_PACKET)
+ int mSockDrop;
+#endif
+ int Extractor_size;
+ int mBufLen; // -l
+ int mWriteAckLen; // --write-ack
+ int mMSS; // -M
+ int mTCPWin; // -w
+ /* flags is a BitMask of old bools
+ bool mBufLenSet; // -l
+ bool mCompat; // -C
+ bool mDaemon; // -D
+ bool mDomain; // -V
+ bool mFileInput; // -F or -I
+ bool mNodelay; // -N
+ bool mPrintMSS; // -m
+ bool mRemoveService; // -R
+ bool mStdin; // -I
+ bool mStdout; // -o
+ bool mSuggestWin; // -W
+ bool mUDP; // -u
+ bool mMode_time;
+ bool mReportSettings;
+ bool mMulticast;
+ bool mNoSettingsReport; // -x s
+ bool mNoConnectionReport; // -x c
+ bool mNoDataReport; // -x d
+ bool mNoServerReport; // -x
+ bool mNoMultReport; // -x m
+ bool mSinlgeClient; // -1 */
+ int flags;
+ int flags_extend;
+ int flags_extend2;
+ // enums (which should be special int's)
+ enum ThreadMode mThreadMode; // -s or -c
+ enum ReportMode mReportMode;
+ enum TestMode mMode; // -r or -d
+ bool clientListener; // set to True if client mode listener per -r or -d
+ // Hopefully int64_t's
+ uintmax_t mAppRate; // -b or -u
+ char mAppRateUnits; // -b is either bw or pps
+ uintmax_t mAmount; // -n or -t time unit is 10 ms
+ unsigned int mInterval; // -i integer time units is usec
+ enum IntervalMode mIntervalMode;
+ // shorts
+ unsigned short mListenPort; // -L
+ unsigned short mPort; // -p
+ unsigned short mPortLast; // -p last port, e.g. when -p 6001-6010
+ unsigned short mBindPort; // -B
+ // chars
+ char mFormat; // -f
+ int mTTL; // -T
+ char pad1[2];
+ // structs or miscellaneous
+ iperf_sockaddr peer;
+ Socklen_t size_peer;
+ iperf_sockaddr local;
+ Socklen_t size_local;
+ nthread_t mTID;
+ int incrdstip;
+ int incrsrcip;
+ int incrsrcport;
+ int connectonly_count;
+ char* mCongestion;
+ int mHistBins;
+ int mHistBinsize;
+ int mHistUnits;
+ double mHistci_lower;
+ double mHistci_upper;
+#if defined(HAVE_WIN32_THREAD)
+ HANDLE mHandle;
+#endif
+ double mFPS; //frames per second
+ double mMean; //variable bit rate mean
+ uint32_t mBurstSize; //number of bytes in a burst
+ int mJitterBufSize; //Server jitter buffer size, units is frames
+ double mBurstIPG; //Interpacket gap
+ int l4offset; // used in l2 mode to offset the raw packet
+ int l4payloadoffset;
+ int recvflags; // used to set recv flags,e.g. MSG_TRUNC with L
+ double mVariance; //vbr variance
+ uintmax_t mFQPacingRate;
+ struct timeval txholdback_timer;
+ struct timeval txstart_epoch;
+ struct timeval accept_time;
+ struct timeval sent_time;
+ struct Condition awake_me;
+ struct PacketRing *ackring;
+ struct BarrierMutex *connects_done;
+ int numreportstructs;
+ int32_t peer_version_u;
+ int32_t peer_version_l;
+ double connecttime;
+ double rtt_nearcongest_weight_factor;
+ char mPermitKey[MAX_PERMITKEY_LEN + 1]; //add some space for timestamp
+ struct timeval mPermitKeyTime;
+ bool mKeyCheck;
+ double mListenerTimeout;
+ int tuntapdev;
+ int firstreadbytes;
+ int mBounceBackBytes;
+ int mBounceBackBurst;
+ int mWorkingLoadThreads; // number of congest threads
+ uint32_t mBounceBackHold; // units of usecs
+ struct iperf_tcpstats tcpinitstats;
+#if HAVE_DECL_TCP_WINDOW_CLAMP
+ int mClampSize;
+#endif
+#if HAVE_DECL_TCP_NOTSENT_LOWAT
+ int mWritePrefetch;
+#endif
+ int jitter_binwidth;
+};
+
+/*
+ * Thread based flags
+ *
+ * Due to the use of thread_Settings in C and C++
+ * we are unable to use bool values. To provide
+ * the functionality of bools we use the following
+ * bitmask over an assumed 32 bit int. This will
+ * work fine on 64bit machines we will just be ignoring
+ * the upper 32bits.
+ *
+ * To add a flag simply define it as the next bit then
+ * add the 3 support functions below.
+ */
+#define FLAG_BUFLENSET 0x00000001
+#define FLAG_COMPAT 0x00000002
+#define FLAG_DAEMON 0x00000004
+#define FLAG_DOMAINV6 0x00000008
+#define FLAG_FILEINPUT 0x00000010
+#define FLAG_NODELAY 0x00000020
+#define FLAG_PRINTMSS 0x00000040
+#define FLAG_REMOVESERVICE 0x00000080
+#define FLAG_STDIN 0x00000100
+#define FLAG_STDOUT 0x00000200
+#define FLAG_SUGGESTWIN 0x00000400
+#define FLAG_UDP 0x00000800
+#define FLAG_MODETIME 0x00001000
+#define FLAG_REPORTSETTINGS 0x00002000
+#define FLAG_MULTICAST 0x00004000
+#define FLAG_NOSETTREPORT 0x00008000
+#define FLAG_NOCONNREPORT 0x00010000
+#define FLAG_NODATAREPORT 0x00020000
+#define FLAG_NOSERVREPORT 0x00040000
+#define FLAG_NOMULTREPORT 0x00080000
+#define FLAG_SINGLECLIENT 0x00100000
+#define FLAG_SINGLEUDP 0x00200000
+#define FLAG_CONGESTION 0x00400000
+#define FLAG_REALTIME 0x00800000
+#define FLAG_BWSET 0x01000000
+#define FLAG_ENHANCEDREPORT 0x02000000
+#define FLAG_SERVERMODETIME 0x04000000
+#define FLAG_SSM_MULTICAST 0x08000000
+/*
+ * Extended flags
+ */
+#define FLAG_PEERVER 0x00000001
+#define FLAG_SEQNO64 0x00000002
+#define FLAG_REVERSE 0x00000004
+#define FLAG_ISOCHRONOUS 0x00000008
+#define FLAG_UDPUNUSED 0x00000010
+#define FLAG_HISTOGRAM 0x00000020
+#define FLAG_L2LENGTHCHECK 0x00000100
+#define FLAG_TXSTARTTIME 0x00000200
+#define FLAG_INCRDSTIP 0x00000400
+#define FLAG_VARYLOAD 0x00000800
+#define FLAG_FQPACING 0x00001000
+#define FLAG_TRIPTIME 0x00002000
+#define FLAG_TXHOLDBACK 0x00004000
+#define FLAG_UNUSED 0x00008000
+#define FLAG_MODEINFINITE 0x00010000
+#define FLAG_CONNECTONLY 0x00020000
+#define FLAG_SERVERREVERSE 0x00040000
+#define FLAG_FULLDUPLEX 0x00080000
+#define FLAG_WRITEACK 0x00100000
+#define FLAG_NOUDPFIN 0x00200000
+#define FLAG_NOCONNECTSYNC 0x00400000
+#define FLAG_SUMONLY 0x00800000
+#define FLAG_FRAMEINTERVAL 0x01000000
+#define FLAG_IPG 0x02000000
+#define FLAG_DONTROUTE 0x04000000
+#define FLAG_NEARCONGEST 0x08000000
+#define FLAG_PERMITKEY 0x10000000
+#define FLAG_SETTCPMSS 0x20000000
+#define FLAG_INCRDSTPORT 0x40000000
+#define FLAG_INCRSRCIP 0x80000000
+
+/*
+ * More extended flags
+ */
+#define FLAG_PERIODICBURST 0x00000001
+#define FLAG_SUMDSTIP 0x00000002
+#define FLAG_SMALLTRIPTIME 0x00000004
+#define FLAG_RXCLAMP 0x00000008
+#define FLAG_WRITEPREFETCH 0x00000010
+#define FLAG_TUNDEV 0x00000020
+#define FLAG_TAPDEV 0x00000040
+#define FLAG_HIDEIPS 0x00000080
+#define FLAG_BOUNCEBACK 0x00000100
+#define FLAG_TCPWRITETIMES 0x00000200
+#define FLAG_INCRSRCPORT 0x00000400
+#define FLAG_OVERRIDETOS 0x00000800
+#define FLAG_TCPQUICKACK 0x00001000
+#define FLAG_WORKING_LOAD_DOWN 0x00002000
+#define FLAG_WORKING_LOAD_UP 0x00004000
+#define FLAG_DOMAINV4 0x00008000
+#define FLAG_JITTER_HISTOGRAM 0x00010000
+#define FLAG_UTC 0x00020000
+
+#define isBuflenSet(settings) ((settings->flags & FLAG_BUFLENSET) != 0)
+#define isCompat(settings) ((settings->flags & FLAG_COMPAT) != 0)
+#define isDaemon(settings) ((settings->flags & FLAG_DAEMON) != 0)
+#define isIPV6(settings) ((settings->flags & FLAG_DOMAINV6) != 0)
+#define isIPV4(settings) ((settings->flags_extend2 & FLAG_DOMAINV4) != 0)
+#define isFileInput(settings) ((settings->flags & FLAG_FILEINPUT) != 0)
+#define isNoDelay(settings) ((settings->flags & FLAG_NODELAY) != 0)
+#define isPrintMSS(settings) ((settings->flags & FLAG_PRINTMSS) != 0)
+#define isRemoveService(settings) ((settings->flags & FLAG_REMOVESERVICE) != 0)
+#define isSTDIN(settings) ((settings->flags & FLAG_STDIN) != 0)
+#define isSTDOUT(settings) ((settings->flags & FLAG_STDOUT) != 0)
+#define isSuggestWin(settings) ((settings->flags & FLAG_SUGGESTWIN) != 0)
+#define isUDP(settings) ((settings->flags & FLAG_UDP) != 0)
+#define isModeTime(settings) ((settings->flags & FLAG_MODETIME) != 0)
+#define isReport(settings) ((settings->flags & FLAG_REPORTSETTINGS) != 0)
+#define isMulticast(settings) ((settings->flags & FLAG_MULTICAST) != 0)
+#define isSSMMulticast(settings) ((settings->flags & FLAG_SSM_MULTICAST) != 0)
+// Active Low for Reports
+#define isSettingsReport(settings) ((settings->flags & FLAG_NOSETTREPORT) == 0)
+#define isConnectionReport(settings) ((settings->flags & FLAG_NOCONNREPORT) == 0)
+#define isDataReport(settings) ((settings->flags & FLAG_NODATAREPORT) == 0)
+#define isServerReport(settings) ((settings->flags & FLAG_NOSERVREPORT) == 0)
+#define isMultipleReport(settings) ((settings->flags & FLAG_NOMULTREPORT) == 0)
+// end Active Low
+#define isSingleClient(settings) ((settings->flags & FLAG_SINGLECLIENT) != 0)
+#define isSingleUDP(settings) ((settings->flags & FLAG_SINGLEUDP) != 0)
+#define isCongestionControl(settings) ((settings->flags & FLAG_CONGESTION) != 0)
+#define isRealtime(settings) ((settings->flags & FLAG_REALTIME) != 0)
+#define isBWSet(settings) ((settings->flags & FLAG_BWSET) != 0)
+#define isEnhanced(settings) ((settings->flags & FLAG_ENHANCEDREPORT) != 0)
+#define isServerModeTime(settings) ((settings->flags & FLAG_SERVERMODETIME) != 0)
+#define isPeerVerDetect(settings) ((settings->flags_extend & FLAG_PEERVER) != 0)
+#define isSeqNo64b(settings) ((settings->flags_extend & FLAG_SEQNO64) != 0)
+#define isReverse(settings) ((settings->flags_extend & FLAG_REVERSE) != 0)
+#define isFullDuplex(settings) ((settings->flags_extend & FLAG_FULLDUPLEX) != 0)
+#define isServerReverse(settings) ((settings->flags_extend & FLAG_SERVERREVERSE) != 0)
+#define isIsochronous(settings) ((settings->flags_extend & FLAG_ISOCHRONOUS) != 0)
+#define isHistogram(settings) ((settings->flags_extend & FLAG_HISTOGRAM) != 0)
+#define isL2LengthCheck(settings) ((settings->flags_extend & FLAG_L2LENGTHCHECK) != 0)
+#define isIncrDstIP(settings) ((settings->flags_extend & FLAG_INCRDSTIP) != 0)
+#define isIncrSrcIP(settings) ((settings->flags_extend & FLAG_INCRSRCIP) != 0)
+#define isIncrDstPort(settings) ((settings->flags_extend & FLAG_INCRDSTPORT) != 0)
+#define isIncrSrcPort(settings) ((settings->flags_extend2 & FLAG_INCRSRCPORT) != 0)
+#define isTxStartTime(settings) ((settings->flags_extend & FLAG_TXSTARTTIME) != 0)
+#define isTxHoldback(settings) ((settings->flags_extend & FLAG_TXHOLDBACK) != 0)
+#define isVaryLoad(settings) ((settings->flags_extend & FLAG_VARYLOAD) != 0)
+#define isFQPacing(settings) ((settings->flags_extend & FLAG_FQPACING) != 0)
+#define isTripTime(settings) ((settings->flags_extend & FLAG_TRIPTIME) != 0)
+#define isSmallTripTime(settings) ((settings->flags_extend2 & FLAG_SMALLTRIPTIME) != 0)
+#define isModeInfinite(settings) ((settings->flags_extend & FLAG_MODEINFINITE) != 0)
+#define isModeAmount(settings) (!isModeTime(settings) && !isModeInfinite(settings))
+#define isConnectOnly(settings) ((settings->flags_extend & FLAG_CONNECTONLY) != 0)
+#define isWriteAck(settings) ((settings->flags_extend & FLAG_WRITEACK) != 0)
+#define isNoUDPfin(settings) ((settings->flags_extend & FLAG_NOUDPFIN) != 0)
+#define isNoConnectSync(settings) ((settings->flags_extend & FLAG_NOCONNECTSYNC) != 0)
+#define isSumOnly(settings) ((settings->flags_extend & FLAG_SUMONLY) != 0)
+#define isFrameInterval(settings) ((settings->flags_extend & FLAG_FRAMEINTERVAL) != 0)
+#define isIPG(settings) ((settings->flags_extend & FLAG_IPG) != 0)
+#define isDontRoute(settings) ((settings->flags_extend & FLAG_DONTROUTE) != 0)
+#define isNearCongest(settings) ((settings->flags_extend & FLAG_NEARCONGEST) != 0)
+#define isPermitKey(settings) ((settings->flags_extend & FLAG_PERMITKEY) != 0)
+#define isTCPMSS(settings) ((settings->flags_extend & FLAG_SETTCPMSS) != 0)
+#define isPeriodicBurst(settings) ((settings->flags_extend2 & FLAG_PERIODICBURST) != 0)
+#define isSumServerDstIP(settings) ((settings->flags_extend2 & FLAG_SUMDSTIP) != 0)
+#define isRxClamp(settings) ((settings->flags_extend2 & FLAG_RXCLAMP) != 0)
+#define isWritePrefetch(settings) ((settings->flags_extend2 & FLAG_WRITEPREFETCH) != 0)
+#define isTapDev(settings) ((settings->flags_extend2 & FLAG_TAPDEV) != 0)
+#define isTunDev(settings) ((settings->flags_extend2 & FLAG_TUNDEV) != 0)
+#define isHideIPs(settings) ((settings->flags_extend2 & FLAG_HIDEIPS) != 0)
+#define isBounceBack(settings) ((settings->flags_extend2 & FLAG_BOUNCEBACK) != 0)
+#define isTcpWriteTimes(settings) ((settings->flags_extend2 & FLAG_TCPWRITETIMES) != 0)
+#define isOverrideTOS(settings) ((settings->flags_extend2 & FLAG_OVERRIDETOS) != 0)
+#define isTcpQuickAck(settings) ((settings->flags_extend2 & FLAG_TCPQUICKACK) != 0)
+#define isWorkingLoadUp(settings) ((settings->flags_extend2 & FLAG_WORKING_LOAD_UP) != 0)
+#define isWorkingLoadDown(settings) ((settings->flags_extend2 & FLAG_WORKING_LOAD_DOWN) != 0)
+#define isJitterHistogram(settings) ((settings->flags_extend2 & FLAG_JITTER_HISTOGRAM) != 0)
+#define isUTC(settings) ((settings->flags_extend2 & FLAG_UTC) != 0)
+
+#define setBuflenSet(settings) settings->flags |= FLAG_BUFLENSET
+#define setCompat(settings) settings->flags |= FLAG_COMPAT
+#define setDaemon(settings) settings->flags |= FLAG_DAEMON
+#define setIPV6(settings) settings->flags |= FLAG_DOMAINV6
+#define setIPV4(settings) settings->flags_extend2 |= FLAG_DOMAINV4
+#define setFileInput(settings) settings->flags |= FLAG_FILEINPUT
+#define setNoDelay(settings) settings->flags |= FLAG_NODELAY
+#define setPrintMSS(settings) settings->flags |= FLAG_PRINTMSS
+#define setRemoveService(settings) settings->flags |= FLAG_REMOVESERVICE
+#define setSTDIN(settings) settings->flags |= FLAG_STDIN
+#define setSTDOUT(settings) settings->flags |= FLAG_STDOUT
+#define setSuggestWin(settings) settings->flags |= FLAG_SUGGESTWIN
+#define setUDP(settings) settings->flags |= FLAG_UDP
+#define setModeTime(settings) settings->flags |= FLAG_MODETIME
+#define setReport(settings) settings->flags |= FLAG_REPORTSETTINGS
+#define setMulticast(settings) settings->flags |= FLAG_MULTICAST
+#define setSSMMulticast(settings) settings->flags |= FLAG_SSM_MULTICAST
+#define setNoSettReport(settings) settings->flags |= FLAG_NOSETTREPORT
+#define setNoConnReport(settings) settings->flags |= FLAG_NOCONNREPORT
+#define setNoDataReport(settings) settings->flags |= FLAG_NODATAREPORT
+#define setNoServReport(settings) settings->flags |= FLAG_NOSERVREPORT
+#define setNoMultReport(settings) settings->flags |= FLAG_NOMULTREPORT
+#define setSingleClient(settings) settings->flags |= FLAG_SINGLECLIENT
+#define setSingleUDP(settings) settings->flags |= FLAG_SINGLEUDP
+#define setCongestionControl(settings) settings->flags |= FLAG_CONGESTION
+#define setRealtime(settings) settings->flags |= FLAG_REALTIME
+#define setBWSet(settings) settings->flags |= FLAG_BWSET
+#define setEnhanced(settings) settings->flags |= FLAG_ENHANCEDREPORT
+#define setServerModeTime(settings) settings->flags |= FLAG_SERVERMODETIME
+#define setPeerVerDetect(settings) settings->flags_extend |= FLAG_PEERVER
+#define setSeqNo64b(settings) settings->flags_extend |= FLAG_SEQNO64
+#define setReverse(settings) settings->flags_extend |= FLAG_REVERSE
+#define setFullDuplex(settings) settings->flags_extend |= FLAG_FULLDUPLEX
+#define setServerReverse(settings) settings->flags_extend |= FLAG_SERVERREVERSE
+#define setIsochronous(settings) settings->flags_extend |= FLAG_ISOCHRONOUS
+#define setHistogram(settings) settings->flags_extend |= FLAG_HISTOGRAM
+#define setL2LengthCheck(settings) settings->flags_extend |= FLAG_L2LENGTHCHECK
+#define setIncrDstIP(settings) settings->flags_extend |= FLAG_INCRDSTIP
+#define setIncrSrcIP(settings) settings->flags_extend |= FLAG_INCRSRCIP
+#define setIncrDstPort(settings) settings->flags_extend |= FLAG_INCRDSTPORT
+#define setIncrSrcPort(settings) settings->flags_extend2 |= FLAG_INCRSRCPORT
+#define setTxStartTime(settings) settings->flags_extend |= FLAG_TXSTARTTIME
+#define setTxHoldback(settings) settings->flags_extend |= FLAG_TXHOLDBACK
+#define setVaryLoad(settings) settings->flags_extend |= FLAG_VARYLOAD
+#define setFQPacing(settings) settings->flags_extend |= FLAG_FQPACING
+#define setTripTime(settings) settings->flags_extend |= FLAG_TRIPTIME
+#define setSmallTripTime(settings) settings->flags_extend2 |= FLAG_SMALLTRIPTIME
+#define setModeInfinite(settings) settings->flags_extend |= FLAG_MODEINFINITE
+#define setConnectOnly(settings) settings->flags_extend |= FLAG_CONNECTONLY
+#define setWriteAck(settings) settings->flags_extend |= FLAG_WRITEACK
+#define setNoUDPfin(settings) settings->flags_extend |= FLAG_NOUDPFIN
+#define setNoConnectSync(settings) settings->flags_extend |= FLAG_NOCONNECTSYNC
+#define setSumOnly(settings) settings->flags_extend |= FLAG_SUMONLY
+#define setFrameInterval(settings) settings->flags_extend |= FLAG_FRAMEINTERVAL
+#define setIPG(settings) settings->flags_extend |= FLAG_IPG
+#define setDontRoute(settings) settings->flags_extend |= FLAG_DONTROUTE
+#define setNearCongest(settings) settings->flags_extend |= FLAG_NEARCONGEST
+#define setPermitKey(settings) settings->flags_extend |= FLAG_PERMITKEY
+#define setTCPMSS(settings) settings->flags_extend |= FLAG_SETTCPMSS
+#define setPeriodicBurst(settings) settings->flags_extend2 |= FLAG_PERIODICBURST
+#define setSumServerDstIP(settings) settings->flags_extend2 |= FLAG_SUMDSTIP
+#define setRxClamp(settings) settings->flags_extend2 |= FLAG_RXCLAMP
+#define setWritePrefetch(settings) settings->flags_extend2 |= FLAG_WRITEPREFETCH
+#define setTapDev(settings) settings->flags_extend2 |= FLAG_TAPDEV
+#define setTunDev(settings) settings->flags_extend2 |= FLAG_TUNDEV
+#define setHideIPs(settings) settings->flags_extend2 |= FLAG_HIDEIPS
+#define setBounceBack(settings) settings->flags_extend2 |= FLAG_BOUNCEBACK
+#define setTcpWriteTimes(settings) settings->flags_extend2 |= FLAG_TCPWRITETIMES
+#define setOverrideTOS(settings) settings->flags_extend2 |= FLAG_OVERRIDETOS
+#define setTcpQuickAck(settings) settings->flags_extend2 |= FLAG_TCPQUICKACK
+#define setWorkingLoadUp(settings) settings->flags_extend2 |= FLAG_WORKING_LOAD_UP
+#define setWorkingLoadDown(settings) settings->flags_extend2 |= FLAG_WORKING_LOAD_DOWN
+#define setJitterHistogram(settings) settings->flags_extend2 |= FLAG_JITTER_HISTOGRAM
+#define setUTC(settings) settings->flags_extend2 |= FLAG_UTC
+
+#define unsetBuflenSet(settings) settings->flags &= ~FLAG_BUFLENSET
+#define unsetCompat(settings) settings->flags &= ~FLAG_COMPAT
+#define unsetDaemon(settings) settings->flags &= ~FLAG_DAEMON
+#define unsetIPV6(settings) settings->flags &= ~FLAG_DOMAINV6
+#define unsetIPV4(settings) settings->flags_extend2 &= ~FLAG_DOMAINV4
+#define unsetFileInput(settings) settings->flags &= ~FLAG_FILEINPUT
+#define unsetNoDelay(settings) settings->flags &= ~FLAG_NODELAY
+#define unsetPrintMSS(settings) settings->flags &= ~FLAG_PRINTMSS
+#define unsetRemoveService(settings) settings->flags &= ~FLAG_REMOVESERVICE
+#define unsetSTDIN(settings) settings->flags &= ~FLAG_STDIN
+#define unsetSTDOUT(settings) settings->flags &= ~FLAG_STDOUT
+#define unsetSuggestWin(settings) settings->flags &= ~FLAG_SUGGESTWIN
+#define unsetUDP(settings) settings->flags &= ~FLAG_UDP
+#define unsetModeTime(settings) settings->flags &= ~FLAG_MODETIME
+#define unsetReport(settings) settings->flags &= ~FLAG_REPORTSETTINGS
+#define unsetMulticast(settings) settings->flags &= ~FLAG_MULTICAST
+#define unsetSSMMulticast(settings) settings->flags &= ~FLAG_SSM_MULTICAST
+#define unsetNoSettReport(settings) settings->flags &= ~FLAG_NOSETTREPORT
+#define unsetNoConnReport(settings) settings->flags &= ~FLAG_NOCONNREPORT
+#define unsetNoDataReport(settings) settings->flags &= ~FLAG_NODATAREPORT
+#define unsetNoServReport(settings) settings->flags &= ~FLAG_NOSERVREPORT
+#define unsetNoMultReport(settings) settings->flags &= ~FLAG_NOMULTREPORT
+#define unsetSingleClient(settings) settings->flags &= ~FLAG_SINGLECLIENT
+#define unsetSingleUDP(settings) settings->flags &= ~FLAG_SINGLEUDP
+#define unsetCongestionControl(settings) settings->flags &= ~FLAG_CONGESTION
+#define unsetRealtime(settings) settings->flags &= ~FLAG_REALTIME
+#define unsetBWSet(settings) settings->flags &= ~FLAG_BWSET
+#define unsetEnhanced(settings) settings->flags &= ~FLAG_ENHANCEDREPORT
+#define unsetServerModeTime(settings) settings->flags &= ~FLAG_SERVERMODETIME
+#define unsetPeerVerDetect(settings) settings->flags_extend &= ~FLAG_PEERVER
+#define unsetSeqNo64b(settings) settings->flags_extend &= ~FLAG_SEQNO64
+#define unsetReverse(settings) settings->flags_extend &= ~FLAG_REVERSE
+#define unsetFullDuplex(settings) settings->flags_extend &= ~FLAG_FULLDUPLEX
+#define unsetServerReverse(settings) settings->flags_extend &= ~FLAG_SERVERREVERSE
+#define unsetIsochronous(settings) settings->flags_extend &= ~FLAG_ISOCHRONOUS
+#define unsetHistogram(settings) settings->flags_extend &= ~FLAG_HISTOGRAM
+#define unsetL2LengthCheck(settings) settings->flags_extend &= ~FLAG_L2LENGTHCHECK
+#define unsetIncrDstIP(settings) settings->flags_extend &= ~FLAG_INCRDSTIP
+#define unsetIncrSrcIP(settings) settings->flags_extend &= ~FLAG_INCRSRCIP
+#define unsetIncrDstPort(settings) settings->flags_extend &= ~FLAG_INCRDSTPORT
+#define unsetIncrSrcPort(settings) settings->flags_extend2 &= ~FLAG_INCRSRCPORT
+#define unsetTxStartTime(settings) settings->flags_extend &= ~FLAG_TXSTARTTIME
+#define unsetTxHoldback(settings) settings->flags_extend &= ~FLAG_TXHOLDBACK
+#define unsetVaryLoad(settings) settings->flags_extend &= ~FLAG_VARYLOAD
+#define unsetFQPacing(settings) settings->flags_extend &= ~FLAG_FQPACING
+#define unsetTripTime(settings) settings->flags_extend &= ~FLAG_TRIPTIME
+#define unsetSmallTripTime(settings) settings->flags_extend2 &= ~FLAG_SMALLTRIPTIME
+#define unsetModeInfinite(settings) settings->flags_extend &= ~FLAG_MODEINFINITE
+#define unsetConnectOnly(settings) settings->flags_extend &= ~FLAG_CONNECTONLY
+#define unsetWriteAck(settings) settings->flags_extend &= ~FLAG_WRITEACK
+#define unsetNoUDPfin(settings) settings->flags_extend &= ~FLAG_NOUDPFIN
+#define unsetNoConnectSync(settings) settings->flags_extend &= ~FLAG_NOCONNECTSYNC
+#define unsetSumOnly(settings) settings->flags_extend &= ~FLAG_SUMONLY
+#define unsetFrameInterval(settings) settings->flags_extend &= ~FLAG_FRAMEINTERVAL
+#define unsetIPG(settings) settings->flags_extend &= ~FLAG_IPG
+#define unsetDontRoute(settings) settings->flags_extend &= ~FLAG_DONTROUTE
+#define unsetPermitKey(settings) settings->flags_extend &= ~FLAG_PERMITKEY
+#define unsetTCPMSS(settings) settings->flags_extend &= ~FLAG_SETTCPMSS
+#define unsetPeriodicBurst(settings) settings->flags_extend2 &= ~FLAG_PERIODICBURST
+#define unsetSumServerDstIP(settings) settings->flags_extend2 &= ~FLAG_SUMDSTIP
+#define unsetRxClamp(settings) settings->flags_extend2 &= ~FLAG_RXCLAMP
+#define unsetWritePrefetch(settings) settings->flags_extend2 &= ~FLAG_WRITEPREFETCH
+#define unsetTapDev(settings) settings->flags_extend2 &= ~FLAG_TAPDEV
+#define unsetTunDev(settings) settings->flags_extend2 &= ~FLAG_TUNDEV
+#define unsetHideIPs(settings) settings->flags_extend2 &= ~FLAG_HIDEIPS
+#define unsetBounceBack(settings) settings->flags_extend2 &= ~FLAG_BOUNCEBACK
+#define unsetTcpWriteTimes(settings) settings->flags_extend2 &= ~FLAG_TCPWRITETIMES
+#define unsetOverrideTOS(settings) settings->flags_extend2 &= ~FLAG_OVERRIDETOS
+#define unsetTcpQuickAck(settings) settings->flags_extend2 &= ~FLAG_TCPQUICKACK
+#define unsetWorkingLoadUp(settings) settings->flags_extend2 &= ~FLAG_WORKING_LOAD_UP
+#define unsetWorkingLoadDown(settings) settings->flags_extend2 &= ~FLAG_WORKING_LOAD_DOWN
+#define unsetJitterHistogram(settings) settings->flags_extend2 &= ~FLAG_JITTER_HISTOGRAM
+#define unsetUTC(settings) settings->flags_extend2 &= ~FLAG_UTC
+
+// set to defaults
+void Settings_Initialize(struct thread_Settings* main);
+
+// copy structure
+void Settings_Copy(struct thread_Settings* from, struct thread_Settings** into, int copyall);
+
+// free associated memory
+void Settings_Destroy(struct thread_Settings *mSettings);
+
+// parse settings from user's environment variables
+void Settings_ParseEnvironment(struct thread_Settings *mSettings);
+
+// parse settings from app's command line
+void Settings_ParseCommandLine(int argc, char **argv, struct thread_Settings *mSettings);
+
+// convert to lower case for [KMG]bits/sec
+void Settings_GetLowerCaseArg(const char *,char *);
+
+// convert to upper case for [KMG]bytes/sec
+void Settings_GetUpperCaseArg(const char *,char *);
+
+// generate settings for listener instance
+void Settings_GenerateListenerSettings(struct thread_Settings *client, struct thread_Settings **listener);
+
+// generate settings for speaker instance
+void Settings_GenerateClientSettings(struct thread_Settings *server, struct thread_Settings **client, void * mBuf);
+
+// generate client header for server
+int Settings_GenerateClientHdr(struct thread_Settings *client, void * hdr, struct timeval startTime);
+
+int Settings_ClientTestHdrLen(uint32_t flags, struct thread_Settings *inSettings);
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif // SETTINGS_H