]> sjero.net Git - iperf/blobdiff - include/Settings.hpp
DCCP support for iperf
[iperf] / include / Settings.hpp
index 4c3aede9b0f6e3c9e97593336098de8926a6638a..bf125cbeadbc886b829c82a85a59a0584e207f13 100644 (file)
 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,
@@ -124,7 +155,7 @@ typedef struct thread_Settings {
     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
@@ -147,13 +178,15 @@ typedef struct thread_Settings {
         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
@@ -194,7 +227,6 @@ typedef struct 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
@@ -205,6 +237,8 @@ typedef struct thread_Settings {
 #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)
@@ -217,7 +251,6 @@ typedef struct thread_Settings {
 #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)
@@ -230,6 +263,8 @@ typedef struct thread_Settings {
 // 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
@@ -242,7 +277,6 @@ typedef struct thread_Settings {
 #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
@@ -253,6 +287,7 @@ typedef struct thread_Settings {
 #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
@@ -265,7 +300,6 @@ typedef struct thread_Settings {
 #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
@@ -276,14 +310,18 @@ typedef struct thread_Settings {
 #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;
@@ -293,7 +331,7 @@ typedef struct UDP_datagram {
     unsigned int tv_sec  : 32;
     unsigned int tv_usec : 32;
 #endif
-} UDP_datagram;
+} dgram_record;
 
 /*
  * The client_hdr structure is sent from clients