1 /*---------------------------------------------------------------
2  * Copyright (c) 1999,2000,2001,2002,2003
3  * The Board of Trustees of the University of Illinois
4  * All Rights Reserved.
5  *---------------------------------------------------------------
6  * Permission is hereby granted, free of charge, to any person
7  * obtaining a copy of this software (Iperf) and associated
8  * documentation files (the "Software"), to deal in the Software
9  * without restriction, including without limitation the
10  * rights to use, copy, modify, merge, publish, distribute,
11  * sublicense, and/or sell copies of the Software, and to permit
12  * persons to whom the Software is furnished to do
13  * so, subject to the following conditions:
14  *
15  *
16  * Redistributions of source code must retain the above
17  * copyright notice, this list of conditions and
18  * the following disclaimers.
19  *
20  *
21  * Redistributions in binary form must reproduce the above
22  * copyright notice, this list of conditions and the following
23  * disclaimers in the documentation and/or other materials
24  * provided with the distribution.
25  *
26  *
27  * Neither the names of the University of Illinois, NCSA,
28  * nor the names of its contributors may be used to endorse
29  * or promote products derived from this Software without
30  * specific prior written permission.
31  *
32  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
33  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
34  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
35  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT
36  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
37  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
38  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE
39  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
40  * ________________________________________________________________
41  * National Laboratory for Applied Network Research
42  * National Center for Supercomputing Applications
43  * University of Illinois at Urbana-Champaign
44  * http://www.ncsa.uiuc.edu
45  * ________________________________________________________________
46  *
47  * Settings.hpp
48  * by Mark Gates <mgates@nlanr.net>
49  * &  Ajay Tirumala <tirumala@ncsa.uiuc.edu>
50  * -------------------------------------------------------------------
51  * Stores and parses the initial values for all the global variables.
52  * -------------------------------------------------------------------
53  * headers
54  * uses
55  *   <stdlib.h>
56  *   <assert.h>
57  * ------------------------------------------------------------------- */
58 
59 #ifndef SETTINGS_H
60 #define SETTINGS_H
61 
62 #include "headers.h"
63 #include "Thread.h"
64 #include "Condition.h"
65 #include "packet_ring.h"
66 
67 /* -------------------------------------------------------------------
68  * constants
69  * ------------------------------------------------------------------- */
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
73 
74 /* Smallest report interval supported. Units is microseconds */
75 #ifndef HAVE_FASTSAMPLING
76 #define SMALLEST_INTERVAL 5000 // 5ms
77 #define SMALLEST_INTERVAL_SEC 0.005 // 5ms
78 #else
79 #define SMALLEST_INTERVAL 100 // 100 usec
80 #define SMALLEST_INTERVAL_SEC 0.0001 // 5ms
81 #endif
82 
83 #define SLOPSECS 2
84 // maximum  difference allowed between the tx (client) start time and the
85 // the first receive time (units seconds, requires --trip-times on client)
86 #define MAXDIFFTIMESTAMPSECS 600
87 // maximum difference in seconds to bound --txstart-time
88 #define MAXDIFFTXSTART 3600
89 // maximum difference in seconds to bound --txdelay-time,
90 // if this is too large and w/o keep-alives the connect may drop
91 #define MAXDIFFTXDELAY 3600
92 // maximum inter packet gap (or write delay) for UDP packets
93 #define MAXIPGSECS 60
94 #define CSVPEERLIMIT ((REPORT_ADDRLEN * 2) + 40)
95 #define NEARCONGEST_DEFAULT 0.5
96 #define DEFAULT_PERMITKEY_LIFE 20.0 // units is seconds
97 #define TESTEXCHANGETIMEOUT (4 * 1000000) // 4 secs, units is microseconds
98 #ifndef MAXTTL
99 #define MAXTTL 255
100 #endif
101 
102 // server/client mode
103 enum ThreadMode {
104     kMode_Unknown = 0,
105     kMode_Server,
106     kMode_Client,
107     kMode_Reporter,
108     kMode_ReporterClient,
109     kMode_WriteAckServer,
110     kMode_WriteAckClient,
111     kMode_Listener
112 };
113 
114 // report mode
115 enum ReportMode {
116     kReport_Default = 0,
117     kReport_CSV
118 };
119 
120 // test mode
121 enum TestMode {
122     kTest_Normal = 0,
123     kTest_DualTest,
124     kTest_TradeOff,
125     kTest_Unknown
126 };
127 
128 // interval reporting mode
129 enum IntervalMode {
130     kInterval_None = 0,
131     kInterval_Time,
132     kInterval_Frames
133 };
134 
135 // rate request units
136 enum RateUnits {
137     kRate_BW = 0,
138     kRate_PPS
139 };
140 
141 #include "Reporter.h"
142 #include "payloads.h"
143 
144 /*
145  * The thread_Settings is a structure that holds all
146  * options for a given execution of either a client
147  * or server. By using this structure rather than
148  * a global structure or class we can have multiple
149  * clients or servers running with different settings.
150  * In version 2.0 and above this structure contains
151  * all the information needed for a thread to execute
152  * and contains only C elements so it can be manipulated
153  * by either C or C++.
154  */
155 struct thread_Settings {
156     // Pointers
157     char*  mFileName;               // -F
158     char*  mHost;                   // -c
159     char*  mHideHost;
160     char*  mLocalhost;              // -B
161     char*  mOutputFileName;         // -o
162     char*  mIfrname;                // %<device> name (for rx)
163     char*  mIfrnametx;              // %<device> name (for tx)
164     char*  mSSMMulticastStr;        // --ssm-host
165     char*  mIsochronousStr;         // --isochronous
166     char*  mHistogramStr;         // --histograms (packets)
167     char*  mTransferIDStr;          //
168     char*  mBuf;
169     FILE*  Extractor_file;
170 
171     struct ReportHeader* reporthdr;
172     struct SumReport* mSumReport;
173     struct SumReport* mFullDuplexReport;
174     struct thread_Settings *runNow;
175     struct thread_Settings *runNext;
176     // int's
177     int mThreads;                   // -P
178     int mTOS;                       // -S
179     int mTransferID;
180     int mConnectRetries;
181 #if WIN32
182     SOCKET mSock;
183 #else
184     int mSock;
185 #endif
186 #if defined(HAVE_LINUX_FILTER_H) && defined(HAVE_AF_PACKET)
187     int mSockDrop;
188 #endif
189     int Extractor_size;
190     int mBufLen;                    // -l
191     int mWriteAckLen;               // --write-ack
192     int mMSS;                       // -M
193     int mTCPWin;                    // -w
194     /*   flags is a BitMask of old bools
195         bool   mBufLenSet;              // -l
196         bool   mCompat;                 // -C
197         bool   mDaemon;                 // -D
198         bool   mDomain;                 // -V
199         bool   mFileInput;              // -F or -I
200         bool   mNodelay;                // -N
201         bool   mPrintMSS;               // -m
202         bool   mRemoveService;          // -R
203         bool   mStdin;                  // -I
204         bool   mStdout;                 // -o
205         bool   mSuggestWin;             // -W
206         bool   mUDP;                    // -u
207         bool   mMode_time;
208         bool   mReportSettings;
209         bool   mMulticast;
210         bool   mNoSettingsReport;       // -x s
211         bool   mNoConnectionReport;     // -x c
212         bool   mNoDataReport;           // -x d
213         bool   mNoServerReport;         // -x
214         bool   mNoMultReport;           // -x m
215         bool   mSinlgeClient;           // -1 */
216     int flags;
217     int flags_extend;
218     int flags_extend2;
219     // enums (which should be special int's)
220     enum ThreadMode mThreadMode;         // -s or -c
221     enum ReportMode mReportMode;
222     enum TestMode mMode;              // -r or -d
223     bool clientListener;              // set to True if client mode listener per -r or -d
224     // Hopefully int64_t's
225     uintmax_t mAppRate;            // -b or -u
226     char mAppRateUnits;            // -b is either bw or pps
227     uintmax_t mAmount;             // -n or -t time unit is 10 ms
228     unsigned int mInterval;               // -i integer time units is usec
229     enum IntervalMode mIntervalMode;
230     // shorts
231     unsigned short mListenPort;     // -L
232     unsigned short mPort;           // -p
233     unsigned short mPortLast;       // -p last port, e.g. when -p 6001-6010
234     unsigned short mBindPort;      // -B
235     // chars
236     char   mFormat;                 // -f
237     int mTTL;                    // -T
238     char pad1[2];
239     // structs or miscellaneous
240     iperf_sockaddr peer;
241     Socklen_t size_peer;
242     iperf_sockaddr local;
243     Socklen_t size_local;
244     nthread_t mTID;
245     int incrdstip;
246     int incrsrcip;
247     int incrsrcport;
248     int connectonly_count;
249     char* mCongestion;
250     int mHistBins;
251     int mHistBinsize;
252     int mHistUnits;
253     double mHistci_lower;
254     double mHistci_upper;
255 #if defined(HAVE_WIN32_THREAD)
256     HANDLE mHandle;
257 #endif
258     double mFPS; //frames per second
259     double mMean; //variable bit rate mean
260     uint32_t mBurstSize; //number of bytes in a burst
261     int mJitterBufSize; //Server jitter buffer size, units is frames
262     double mBurstIPG; //Interpacket gap
263     int l4offset; // used in l2 mode to offset the raw packet
264     int l4payloadoffset;
265     int recvflags; // used to set recv flags,e.g. MSG_TRUNC with L
266     double mVariance; //vbr variance
267     uintmax_t mFQPacingRate;
268     struct timeval txholdback_timer;
269     struct timeval txstart_epoch;
270     struct timeval accept_time;
271     struct timeval sent_time;
272     struct Condition awake_me;
273     struct PacketRing *ackring;
274     struct BarrierMutex *connects_done;
275     int numreportstructs;
276     int32_t peer_version_u;
277     int32_t peer_version_l;
278     double connecttime;
279     double rtt_nearcongest_divider;
280     char mPermitKey[MAX_PERMITKEY_LEN + 1]; //add some space for timestamp
281     struct timeval mPermitKeyTime;
282     bool mKeyCheck;
283     double mListenerTimeout;
284     int tuntapdev;
285     int firstreadbytes;
286 #if HAVE_DECL_TCP_WINDOW_CLAMP
287     int mClampSize;
288 #endif
289 #if HAVE_DECL_TCP_NOTSENT_LOWAT
290     int mWritePrefetch;
291 #endif
292 };
293 
294 /*
295  * Thread based flags
296  *
297  * Due to the use of thread_Settings in C and C++
298  * we are unable to use bool values. To provide
299  * the functionality of bools we use the following
300  * bitmask over an assumed 32 bit int. This will
301  * work fine on 64bit machines we will just be ignoring
302  * the upper 32bits.
303  *
304  * To add a flag simply define it as the next bit then
305  * add the 3 support functions below.
306  */
307 #define FLAG_BUFLENSET      0x00000001
308 #define FLAG_COMPAT         0x00000002
309 #define FLAG_DAEMON         0x00000004
310 #define FLAG_DOMAIN         0x00000008
311 #define FLAG_FILEINPUT      0x00000010
312 #define FLAG_NODELAY        0x00000020
313 #define FLAG_PRINTMSS       0x00000040
314 #define FLAG_REMOVESERVICE  0x00000080
315 #define FLAG_STDIN          0x00000100
316 #define FLAG_STDOUT         0x00000200
317 #define FLAG_SUGGESTWIN     0x00000400
318 #define FLAG_UDP            0x00000800
319 #define FLAG_MODETIME       0x00001000
320 #define FLAG_REPORTSETTINGS 0x00002000
321 #define FLAG_MULTICAST      0x00004000
322 #define FLAG_NOSETTREPORT   0x00008000
323 #define FLAG_NOCONNREPORT   0x00010000
324 #define FLAG_NODATAREPORT   0x00020000
325 #define FLAG_NOSERVREPORT   0x00040000
326 #define FLAG_NOMULTREPORT   0x00080000
327 #define FLAG_SINGLECLIENT   0x00100000
328 #define FLAG_SINGLEUDP      0x00200000
329 #define FLAG_CONGESTION     0x00400000
330 #define FLAG_REALTIME       0x00800000
331 #define FLAG_BWSET          0x01000000
332 #define FLAG_ENHANCEDREPORT 0x02000000
333 #define FLAG_SERVERMODETIME 0x04000000
334 #define FLAG_SSM_MULTICAST  0x08000000
335 /*
336  * Extended flags
337  */
338 #define FLAG_PEERVER        0x00000001
339 #define FLAG_SEQNO64        0x00000002
340 #define FLAG_REVERSE        0x00000004
341 #define FLAG_ISOCHRONOUS    0x00000008
342 #define FLAG_UDPUNUSED      0x00000010
343 #define FLAG_HISTOGRAM      0x00000020
344 #define FLAG_L2LENGTHCHECK  0x00000100
345 #define FLAG_TXSTARTTIME    0x00000200
346 #define FLAG_INCRDSTIP      0x00000400
347 #define FLAG_VARYLOAD       0x00000800
348 #define FLAG_FQPACING       0x00001000
349 #define FLAG_TRIPTIME       0x00002000
350 #define FLAG_TXHOLDBACK     0x00004000
351 #define FLAG_TCPWRITETIME   0x00008000
352 #define FLAG_MODEINFINITE   0x00010000
353 #define FLAG_CONNECTONLY    0x00020000
354 #define FLAG_SERVERREVERSE  0x00040000
355 #define FLAG_FULLDUPLEX     0x00080000
356 #define FLAG_WRITEACK       0x00100000
357 #define FLAG_NOUDPFIN       0x00200000
358 #define FLAG_NOCONNECTSYNC  0x00400000
359 #define FLAG_SUMONLY        0x00800000
360 #define FLAG_FRAMEINTERVAL  0x01000000
361 #define FLAG_IPG            0x02000000
362 #define FLAG_DONTROUTE      0x04000000
363 #define FLAG_NEARCONGEST    0x08000000
364 #define FLAG_PERMITKEY      0x10000000
365 #define FLAG_SETTCPMSS      0x20000000
366 #define FLAG_INCRDSTPORT    0x40000000
367 #define FLAG_INCRSRCIP      0x80000000
368 
369 /*
370  * More extended flags
371  */
372 #define FLAG_PERIODICBURST  0x00000001
373 #define FLAG_SUMDSTIP       0x00000002
374 #define FLAG_SMALLTRIPTIME  0x00000004
375 #define FLAG_RXCLAMP        0x00000008
376 #define FLAG_WRITEPREFETCH  0x00000010
377 #define FLAG_TUNDEV         0x00000020
378 #define FLAG_TAPDEV         0x00000040
379 #define FLAG_HIDEIPS        0x00000080
380 
381 #define isBuflenSet(settings)      ((settings->flags & FLAG_BUFLENSET) != 0)
382 #define isCompat(settings)         ((settings->flags & FLAG_COMPAT) != 0)
383 #define isDaemon(settings)         ((settings->flags & FLAG_DAEMON) != 0)
384 #define isIPV6(settings)           ((settings->flags & FLAG_DOMAIN) != 0)
385 #define isFileInput(settings)      ((settings->flags & FLAG_FILEINPUT) != 0)
386 #define isNoDelay(settings)        ((settings->flags & FLAG_NODELAY) != 0)
387 #define isPrintMSS(settings)       ((settings->flags & FLAG_PRINTMSS) != 0)
388 #define isRemoveService(settings)  ((settings->flags & FLAG_REMOVESERVICE) != 0)
389 #define isSTDIN(settings)          ((settings->flags & FLAG_STDIN) != 0)
390 #define isSTDOUT(settings)         ((settings->flags & FLAG_STDOUT) != 0)
391 #define isSuggestWin(settings)     ((settings->flags & FLAG_SUGGESTWIN) != 0)
392 #define isUDP(settings)            ((settings->flags & FLAG_UDP) != 0)
393 #define isModeTime(settings)       ((settings->flags & FLAG_MODETIME) != 0)
394 #define isReport(settings)         ((settings->flags & FLAG_REPORTSETTINGS) != 0)
395 #define isMulticast(settings)      ((settings->flags & FLAG_MULTICAST) != 0)
396 #define isSSMMulticast(settings)   ((settings->flags & FLAG_SSM_MULTICAST) != 0)
397 // Active Low for Reports
398 #define isSettingsReport(settings) ((settings->flags & FLAG_NOSETTREPORT) == 0)
399 #define isConnectionReport(settings)  ((settings->flags & FLAG_NOCONNREPORT) == 0)
400 #define isDataReport(settings)     ((settings->flags & FLAG_NODATAREPORT) == 0)
401 #define isServerReport(settings)   ((settings->flags & FLAG_NOSERVREPORT) == 0)
402 #define isMultipleReport(settings) ((settings->flags & FLAG_NOMULTREPORT) == 0)
403 // end Active Low
404 #define isSingleClient(settings)   ((settings->flags & FLAG_SINGLECLIENT) != 0)
405 #define isSingleUDP(settings)      ((settings->flags & FLAG_SINGLEUDP) != 0)
406 #define isCongestionControl(settings) ((settings->flags & FLAG_CONGESTION) != 0)
407 #define isRealtime(settings)       ((settings->flags & FLAG_REALTIME) != 0)
408 #define isBWSet(settings)          ((settings->flags & FLAG_BWSET) != 0)
409 #define isEnhanced(settings)       ((settings->flags & FLAG_ENHANCEDREPORT) != 0)
410 #define isServerModeTime(settings) ((settings->flags & FLAG_SERVERMODETIME) != 0)
411 #define isPeerVerDetect(settings)  ((settings->flags_extend & FLAG_PEERVER) != 0)
412 #define isSeqNo64b(settings)       ((settings->flags_extend & FLAG_SEQNO64) != 0)
413 #define isReverse(settings)        ((settings->flags_extend & FLAG_REVERSE) != 0)
414 #define isFullDuplex(settings)          ((settings->flags_extend & FLAG_FULLDUPLEX) != 0)
415 #define isServerReverse(settings)  ((settings->flags_extend & FLAG_SERVERREVERSE) != 0)
416 #define isIsochronous(settings)    ((settings->flags_extend & FLAG_ISOCHRONOUS) != 0)
417 #define isHistogram(settings)    ((settings->flags_extend & FLAG_HISTOGRAM) != 0)
418 #define isL2LengthCheck(settings)  ((settings->flags_extend & FLAG_L2LENGTHCHECK) != 0)
419 #define isIncrDstIP(settings)      ((settings->flags_extend & FLAG_INCRDSTIP) != 0)
420 #define isIncrSrcIP(settings)      ((settings->flags_extend & FLAG_INCRSRCIP) != 0)
421 #define isIncrDstPort(settings)    ((settings->flags_extend & FLAG_INCRDSTPORT) != 0)
422 #define isTxStartTime(settings)    ((settings->flags_extend & FLAG_TXSTARTTIME) != 0)
423 #define isTxHoldback(settings)     ((settings->flags_extend & FLAG_TXHOLDBACK) != 0)
424 #define isVaryLoad(settings)       ((settings->flags_extend & FLAG_VARYLOAD) != 0)
425 #define isFQPacing(settings)       ((settings->flags_extend & FLAG_FQPACING) != 0)
426 #define isTripTime(settings)       ((settings->flags_extend & FLAG_TRIPTIME) != 0)
427 #define isSmallTripTime(settings)  ((settings->flags_extend2 & FLAG_SMALLTRIPTIME) != 0)
428 #define isModeInfinite(settings)   ((settings->flags_extend & FLAG_MODEINFINITE) != 0)
429 #define isModeAmount(settings)     (!isModeTime(settings) && !isModeInfinite(settings))
430 #define isConnectOnly(settings)    ((settings->flags_extend & FLAG_CONNECTONLY) != 0)
431 #define isWriteAck(settings)       ((settings->flags_extend & FLAG_WRITEACK) != 0)
432 #define isNoUDPfin(settings)       ((settings->flags_extend & FLAG_NOUDPFIN) != 0)
433 #define isNoConnectSync(settings)  ((settings->flags_extend & FLAG_NOCONNECTSYNC) != 0)
434 #define isSumOnly(settings)        ((settings->flags_extend & FLAG_SUMONLY) != 0)
435 #define isFrameInterval(settings)  ((settings->flags_extend & FLAG_FRAMEINTERVAL) != 0)
436 #define isIPG(settings)  ((settings->flags_extend & FLAG_IPG) != 0)
437 #define isDontRoute(settings)      ((settings->flags_extend & FLAG_DONTROUTE) != 0)
438 #define isNearCongest(settings)    ((settings->flags_extend & FLAG_NEARCONGEST) != 0)
439 #define isPermitKey(settings)  ((settings->flags_extend & FLAG_PERMITKEY) != 0)
440 #define isTCPMSS(settings)         ((settings->flags_extend & FLAG_SETTCPMSS) != 0)
441 #define isPeriodicBurst(settings)  ((settings->flags_extend2 & FLAG_PERIODICBURST) != 0)
442 #define isSumServerDstIP(settings) ((settings->flags_extend2 & FLAG_SUMDSTIP) != 0)
443 #define isRxClamp(settings)        ((settings->flags_extend2 & FLAG_RXCLAMP) != 0)
444 #define isWritePrefetch(settings) ((settings->flags_extend2 & FLAG_WRITEPREFETCH) != 0)
445 #define isTapDev(settings)         ((settings->flags_extend2 & FLAG_TAPDEV) != 0)
446 #define isTunDev(settings)         ((settings->flags_extend2 & FLAG_TUNDEV) != 0)
447 #define isHideIPs(settings)        ((settings->flags_extend2 & FLAG_HIDEIPS) != 0)
448 
449 #define setBuflenSet(settings)     settings->flags |= FLAG_BUFLENSET
450 #define setCompat(settings)        settings->flags |= FLAG_COMPAT
451 #define setDaemon(settings)        settings->flags |= FLAG_DAEMON
452 #define setIPV6(settings)          settings->flags |= FLAG_DOMAIN
453 #define setFileInput(settings)     settings->flags |= FLAG_FILEINPUT
454 #define setNoDelay(settings)       settings->flags |= FLAG_NODELAY
455 #define setPrintMSS(settings)      settings->flags |= FLAG_PRINTMSS
456 #define setRemoveService(settings) settings->flags |= FLAG_REMOVESERVICE
457 #define setSTDIN(settings)         settings->flags |= FLAG_STDIN
458 #define setSTDOUT(settings)        settings->flags |= FLAG_STDOUT
459 #define setSuggestWin(settings)    settings->flags |= FLAG_SUGGESTWIN
460 #define setUDP(settings)           settings->flags |= FLAG_UDP
461 #define setModeTime(settings)      settings->flags |= FLAG_MODETIME
462 #define setReport(settings)        settings->flags |= FLAG_REPORTSETTINGS
463 #define setMulticast(settings)     settings->flags |= FLAG_MULTICAST
464 #define setSSMMulticast(settings)  settings->flags |= FLAG_SSM_MULTICAST
465 #define setNoSettReport(settings)  settings->flags |= FLAG_NOSETTREPORT
466 #define setNoConnReport(settings)  settings->flags |= FLAG_NOCONNREPORT
467 #define setNoDataReport(settings)  settings->flags |= FLAG_NODATAREPORT
468 #define setNoServReport(settings)  settings->flags |= FLAG_NOSERVREPORT
469 #define setNoMultReport(settings)  settings->flags |= FLAG_NOMULTREPORT
470 #define setSingleClient(settings)  settings->flags |= FLAG_SINGLECLIENT
471 #define setSingleUDP(settings)     settings->flags |= FLAG_SINGLEUDP
472 #define setCongestionControl(settings) settings->flags |= FLAG_CONGESTION
473 #define setRealtime(settings)      settings->flags |= FLAG_REALTIME
474 #define setBWSet(settings)         settings->flags |= FLAG_BWSET
475 #define setEnhanced(settings)      settings->flags |= FLAG_ENHANCEDREPORT
476 #define setServerModeTime(settings)    settings->flags |= FLAG_SERVERMODETIME
477 #define setPeerVerDetect(settings) settings->flags_extend |= FLAG_PEERVER
478 #define setSeqNo64b(settings)      settings->flags_extend |= FLAG_SEQNO64
479 #define setReverse(settings)       settings->flags_extend |= FLAG_REVERSE
480 #define setFullDuplex(settings)    settings->flags_extend |= FLAG_FULLDUPLEX
481 #define setServerReverse(settings) settings->flags_extend |= FLAG_SERVERREVERSE
482 #define setIsochronous(settings)   settings->flags_extend |= FLAG_ISOCHRONOUS
483 #define setHistogram(settings)   settings->flags_extend |= FLAG_HISTOGRAM
484 #define setL2LengthCheck(settings) settings->flags_extend |= FLAG_L2LENGTHCHECK
485 #define setIncrDstIP(settings)     settings->flags_extend |= FLAG_INCRDSTIP
486 #define setIncrSrcIP(settings)     settings->flags_extend |= FLAG_INCRSRCIP
487 #define setIncrDstPort(settings)   settings->flags_extend |= FLAG_INCRDSTPORT
488 #define setTxStartTime(settings)   settings->flags_extend |= FLAG_TXSTARTTIME
489 #define setTxHoldback(settings)    settings->flags_extend |= FLAG_TXHOLDBACK
490 #define setVaryLoad(settings)      settings->flags_extend |= FLAG_VARYLOAD
491 #define setFQPacing(settings)      settings->flags_extend |= FLAG_FQPACING
492 #define setTripTime(settings)      settings->flags_extend |= FLAG_TRIPTIME
493 #define setSmallTripTime(settings) settings->flags_extend2 |= FLAG_SMALLTRIPTIME
494 #define setModeInfinite(settings)  settings->flags_extend |= FLAG_MODEINFINITE
495 #define setConnectOnly(settings)   settings->flags_extend |= FLAG_CONNECTONLY
496 #define setWriteAck(settings)      settings->flags_extend |= FLAG_WRITEACK
497 #define setNoUDPfin(settings)      settings->flags_extend |= FLAG_NOUDPFIN
498 #define setNoConnectSync(settings) settings->flags_extend |= FLAG_NOCONNECTSYNC
499 #define setSumOnly(settings)       settings->flags_extend |= FLAG_SUMONLY
500 #define setFrameInterval(settings) settings->flags_extend |= FLAG_FRAMEINTERVAL
501 #define setIPG(settings)           settings->flags_extend |= FLAG_IPG
502 #define setDontRoute(settings)     settings->flags_extend |= FLAG_DONTROUTE
503 #define setNearCongest(settings)   settings->flags_extend |= FLAG_NEARCONGEST
504 #define setPermitKey(settings)     settings->flags_extend |= FLAG_PERMITKEY
505 #define setTCPMSS(settings)        settings->flags_extend |= FLAG_SETTCPMSS
506 #define setPeriodicBurst(settings) settings->flags_extend2 |= FLAG_PERIODICBURST
507 #define setSumServerDstIP(settings) settings->flags_extend2 |= FLAG_SUMDSTIP
508 #define setRxClamp(settings)       settings->flags_extend2 |= FLAG_RXCLAMP
509 #define setWritePrefetch(settings) settings->flags_extend2 |= FLAG_WRITEPREFETCH
510 #define setTapDev(settings)        settings->flags_extend2 |= FLAG_TAPDEV
511 #define setTunDev(settings)        settings->flags_extend2 |= FLAG_TUNDEV
512 #define setHideIPs(settings)       settings->flags_extend2 |= FLAG_HIDEIPS
513 
514 #define unsetBuflenSet(settings)   settings->flags &= ~FLAG_BUFLENSET
515 #define unsetCompat(settings)      settings->flags &= ~FLAG_COMPAT
516 #define unsetDaemon(settings)      settings->flags &= ~FLAG_DAEMON
517 #define unsetIPV6(settings)        settings->flags &= ~FLAG_DOMAIN
518 #define unsetFileInput(settings)   settings->flags &= ~FLAG_FILEINPUT
519 #define unsetNoDelay(settings)     settings->flags &= ~FLAG_NODELAY
520 #define unsetPrintMSS(settings)    settings->flags &= ~FLAG_PRINTMSS
521 #define unsetRemoveService(settings)  settings->flags &= ~FLAG_REMOVESERVICE
522 #define unsetSTDIN(settings)       settings->flags &= ~FLAG_STDIN
523 #define unsetSTDOUT(settings)      settings->flags &= ~FLAG_STDOUT
524 #define unsetSuggestWin(settings)  settings->flags &= ~FLAG_SUGGESTWIN
525 #define unsetUDP(settings)         settings->flags &= ~FLAG_UDP
526 #define unsetModeTime(settings)    settings->flags &= ~FLAG_MODETIME
527 #define unsetReport(settings)      settings->flags &= ~FLAG_REPORTSETTINGS
528 #define unsetMulticast(settings)   settings->flags &= ~FLAG_MULTICAST
529 #define unsetSSMMulticast(settings)   settings->flags &= ~FLAG_SSM_MULTICAST
530 #define unsetNoSettReport(settings)   settings->flags &= ~FLAG_NOSETTREPORT
531 #define unsetNoConnReport(settings)   settings->flags &= ~FLAG_NOCONNREPORT
532 #define unsetNoDataReport(settings)   settings->flags &= ~FLAG_NODATAREPORT
533 #define unsetNoServReport(settings)   settings->flags &= ~FLAG_NOSERVREPORT
534 #define unsetNoMultReport(settings)   settings->flags &= ~FLAG_NOMULTREPORT
535 #define unsetSingleClient(settings)   settings->flags &= ~FLAG_SINGLECLIENT
536 #define unsetSingleUDP(settings)      settings->flags &= ~FLAG_SINGLEUDP
537 #define unsetCongestionControl(settings) settings->flags &= ~FLAG_CONGESTION
538 #define unsetRealtime(settings)    settings->flags &= ~FLAG_REALTIME
539 #define unsetBWSet(settings)       settings->flags &= ~FLAG_BWSET
540 #define unsetEnhanced(settings)    settings->flags &= ~FLAG_ENHANCEDREPORT
541 #define unsetServerModeTime(settings) settings->flags &= ~FLAG_SERVERMODETIME
542 #define unsetPeerVerDetect(settings)  settings->flags_extend &= ~FLAG_PEERVER
543 #define unsetSeqNo64b(settings)    settings->flags_extend &= ~FLAG_SEQNO64
544 #define unsetReverse(settings)     settings->flags_extend &= ~FLAG_REVERSE
545 #define unsetFullDuplex(settings)  settings->flags_extend &= ~FLAG_FULLDUPLEX
546 #define unsetServerReverse(settings) settings->flags_extend &= ~FLAG_SERVERREVERSE
547 #define unsetIsochronous(settings)  settings->flags_extend &= ~FLAG_ISOCHRONOUS
548 #define unsetHistogram(settings)  settings->flags_extend &= ~FLAG_HISTOGRAM
549 #define unsetL2LengthCheck(settings)  settings->flags_extend &= ~FLAG_L2LENGTHCHECK
550 #define unsetIncrDstIP(settings)    settings->flags_extend &= ~FLAG_INCRDSTIP
551 #define unsetIncrSrcIP(settings)    settings->flags_extend &= ~FLAG_INCRSRCIP
552 #define unsetIncrDstPort(settings)  settings->flags_extend &= ~FLAG_INCRDSTPORT
553 #define unsetTxStartTime(settings)  settings->flags_extend &= ~FLAG_TXSTARTTIME
554 #define unsetTxHoldback(settings)   settings->flags_extend &= ~FLAG_TXHOLDBACK
555 #define unsetVaryLoad(settings)     settings->flags_extend &= ~FLAG_VARYLOAD
556 #define unsetFQPacing(settings)     settings->flags_extend &= ~FLAG_FQPACING
557 #define unsetTripTime(settings)     settings->flags_extend &= ~FLAG_TRIPTIME
558 #define unsetSmallTripTime(settings) settings->flags_extend2 &= ~FLAG_SMALLTRIPTIME
559 #define unsetModeInfinite(settings) settings->flags_extend &= ~FLAG_MODEINFINITE
560 #define unsetConnectOnly(settings)  settings->flags_extend &= ~FLAG_CONNECTONLY
561 #define unsetWriteAck(settings)     settings->flags_extend &= ~FLAG_WRITEACK
562 #define unsetNoUDPfin(settings)     settings->flags_extend &= ~FLAG_NOUDPFIN
563 #define unsetNoConnectSync(settings) settings->flags_extend &= ~FLAG_NOCONNECTSYNC
564 #define unsetSumOnly(settings)       settings->flags_extend &= ~FLAG_SUMONLY
565 #define unsetFrameInterval(settings) settings->flags_extend &= ~FLAG_FRAMEINTERVAL
566 #define unsetIPG(settings)           settings->flags_extend &= ~FLAG_IPG
567 #define unsetDontRoute(settings)     settings->flags_extend &= ~FLAG_DONTROUTE
568 #define unsetPermitKey(settings)     settings->flags_extend &= ~FLAG_PERMITKEY
569 #define unsetTCPMSS(settings)        settings->flags_extend &= ~FLAG_SETTCPMSS
570 #define unsetPeriodicBurst(settings) settings->flags_extend2 &= ~FLAG_PERIODICBURST
571 #define unsetSumServerDstIP(settings) settings->flags_extend2 &= ~FLAG_SUMDSTIP
572 #define unsetRxClamp(settings)       settings->flags_extend2 &= ~FLAG_RXCLAMP
573 #define unsetWritePrefetch(settings) settings->flags_extend2 &= ~FLAG_WRITEPREFETCH
574 #define unsetTapDev(settings)        settings->flags_extend2 &= ~FLAG_TAPDEV
575 #define unsetTunDev(settings)        settings->flags_extend2 &= ~FLAG_TUNDEV
576 #define unsetHideIPs(settings)       settings->flags_extend2 &= ~FLAG_HIDEIPS
577 
578 // set to defaults
579 void Settings_Initialize(struct thread_Settings* main);
580 
581 // copy structure
582 void Settings_Copy(struct thread_Settings* from, struct thread_Settings** into, int copyall);
583 
584 // free associated memory
585 void Settings_Destroy(struct thread_Settings *mSettings);
586 
587 // parse settings from user's environment variables
588 void Settings_ParseEnvironment(struct thread_Settings *mSettings);
589 
590 // parse settings from app's command line
591 void Settings_ParseCommandLine(int argc, char **argv, struct thread_Settings *mSettings);
592 
593 // convert to lower case for [KMG]bits/sec
594 void Settings_GetLowerCaseArg(const char *,char *);
595 
596 // convert to upper case for [KMG]bytes/sec
597 void Settings_GetUpperCaseArg(const char *,char *);
598 
599 // generate settings for listener instance
600 void Settings_GenerateListenerSettings(struct thread_Settings *client, struct thread_Settings **listener);
601 
602 // generate settings for speaker instance
603 void Settings_GenerateClientSettings(struct thread_Settings *server, struct thread_Settings **client, void * mBuf);
604 
605 // generate client header for server
606 int Settings_GenerateClientHdr(struct thread_Settings *client, void * hdr, struct timeval startTime);
607 
608 int Settings_ClientTestHdrLen(uint32_t flags, struct thread_Settings *inSettings);
609 
610 #ifdef __cplusplus
611 } /* end extern "C" */
612 #endif
613 
614 #endif // SETTINGS_H
615