extern "C" {
#endif
+// Convention: odd=connection-oriented, even=connection-less
+typedef enum Protocol {
+ kProto_TCP = IPPROTO_TCP,
+ kProto_DCCP = IPPROTO_DCCP,
+ kProto_UDP = IPPROTO_UDP,
+} Protocol;
+
+static inline const char *protoName(const unsigned proto)
+{
+ switch(proto) {
+ case kProto_TCP: return "TCP";
+ case kProto_DCCP: return "DCCP";
+ case kProto_UDP: return "UDP";
+ default: return "(unknown)";
+ }
+}
+
+static inline unsigned sockType(const Protocol p)
+{
+ switch (p) {
+ case kProto_TCP: return SOCK_STREAM;
+ case kProto_UDP: return SOCK_DGRAM;
+ case kProto_DCCP: return SOCK_DCCP;
+ }
+}
+
+static inline bool is_connectionless(const Protocol p)
+{
+ return p == kProto_UDP;
+}
+
// server/client mode
typedef enum ThreadMode {
kMode_Unknown = 0,
// int's
int mThreads; // -P
int mTOS; // -S
- int mSock;
+ int mSock; // socket descriptor
+ int mSockAF; // type of @mSock
int Extractor_size;
int mBufLen; // -l
int mMSS; // -M
- int mTCPWin; // -w
+ int mWinSize; // -w
/* flags is a BitMask of old bools
bool mBufLenSet; // -l
bool mCompat; // -C
bool mNoServerReport; // -x
bool mNoMultReport; // -x m
bool mSinlgeClient; // -1 */
- int flags;
+ int flags;
+ Protocol mProtocol;
+
// enums (which should be special int's)
ThreadMode mThreadMode; // -s or -c
ReportMode mReportMode;
- TestMode mMode; // -r or -d
+ TestMode mMode; // -r or -d
// Hopefully int64_t's
- max_size_t mUDPRate; // -b or -u
+ max_size_t mDgramRate; // -b
max_size_t mAmount; // -n or -t
// doubles
double mInterval; // -i
// shorts
unsigned short mListenPort; // -L
unsigned short mPort; // -p
+ unsigned short mMcastIface; // -j or -J
// chars
char mFormat; // -f
- int mTTL; // -T
+ int mTTL; // -T
+ char *congAlgo; // -A
char pad1[2];
// structs or miscellaneous
- iperf_sockaddr peer;
- Socklen_t size_peer;
- iperf_sockaddr local;
- Socklen_t size_local;
+ struct sockaddr_storage peer; // remote part of socket
+ struct sockaddr_storage local; // local part of socket
nthread_t mTID;
-#if defined( HAVE_WIN32_THREAD )
- HANDLE mHandle;
-#endif
} thread_Settings;
/*
#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_NOMULTREPORT 0x00080000
#define FLAG_SINGLECLIENT 0x00100000
#define FLAG_SINGLEUDP 0x00200000
+#define FLAG_PACKETORIENTED 0x01000000
+
#define isBuflenSet(settings) ((settings->flags & FLAG_BUFLENSET) != 0)
#define isCompat(settings) ((settings->flags & FLAG_COMPAT) != 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)
// end Active Low
#define isSingleClient(settings) ((settings->flags & FLAG_SINGLECLIENT) != 0)
#define isSingleUDP(settings) ((settings->flags & FLAG_SINGLEUDP) != 0)
+#define isConnectionLess(settings) is_connectionless((settings)->mProtocol)
+#define isPacketOriented(settings) (((settings)->flags & FLAG_PACKETORIENTED) != 0)
#define setBuflenSet(settings) settings->flags |= FLAG_BUFLENSET
#define setCompat(settings) settings->flags |= FLAG_COMPAT
#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 setNoMultReport(settings) settings->flags |= FLAG_NOMULTREPORT
#define setSingleClient(settings) settings->flags |= FLAG_SINGLECLIENT
#define setSingleUDP(settings) settings->flags |= FLAG_SINGLEUDP
+#define setPacketOriented(settings) settings->flags |= FLAG_PACKETORIENTED
#define unsetBuflenSet(settings) settings->flags &= ~FLAG_BUFLENSET
#define unsetCompat(settings) settings->flags &= ~FLAG_COMPAT
#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 unsetNoMultReport(settings) settings->flags &= ~FLAG_NOMULTREPORT
#define unsetSingleClient(settings) settings->flags &= ~FLAG_SINGLECLIENT
#define unsetSingleUDP(settings) settings->flags &= ~FLAG_SINGLEUDP
+#define unsetPacketOriented(settings) settings->flags &= ~FLAG_PACKETORIENTED
#define HEADER_VERSION1 0x80000000
#define RUN_NOW 0x00000001
-// used to reference the 4 byte ID number we place in UDP datagrams
-// use int32_t if possible, otherwise a 32 bit bitfield (e.g. on J90)
-typedef struct UDP_datagram {
+/*
+ * Datagram record for record-oriented applications
+ * used to reference the 4 byte ID number we place in UDP datagrams
+ * use int32_t if possible, otherwise a 32 bit bitfield (e.g. on J90)
+ */
+typedef struct dgram_record {
#ifdef HAVE_INT32_T
int32_t id;
u_int32_t tv_sec;
unsigned int tv_sec : 32;
unsigned int tv_usec : 32;
#endif
-} UDP_datagram;
+} dgram_record;
/*
* The client_hdr structure is sent from clients