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  * Client.hpp
47  * by Mark Gates <mgates@nlanr.net>
48  * -------------------------------------------------------------------
49  * A client thread initiates a connect to the server and handles
50  * sending and receiving data, then closes the socket.
51  * -------------------------------------------------------------------
52  */
53 
54 #ifndef CLIENT_H
55 #define CLIENT_H
56 
57 #include "Settings.hpp"
58 #include "Timestamp.hpp"
59 #include "isochronous.hpp"
60 #include "Mutex.h"
61 
62 /* ------------------------------------------------------------------- */
63 class Client {
64 public:
65     // stores server hostname, port, UDP/TCP mode, and UDP rate
66     Client( thread_Settings *inSettings );
67 
68     // destroy the client object
69     ~Client();
70 
71     // Set up the traffic thread and invokes
72     // appropriate traffic loop per the protocol
73     // and type of traffic
74     void Run( void );
75 
76     // For things like dual tests a server needs to be started by the client,
77     // The code in src/launch.cpp will invoke this
78     int StartSynch(void);
79     void TxDelay(void);
80     void ConnectPeriodic(void);
81     bool my_connect(bool close_on_fail);
82     bool isConnected(void) const;
83     int SendFirstPayload(void);
84     int BarrierClient(struct BarrierMutex *);
85     struct ReportHeader *myJob;
86 
87 private:
88     inline void WritePacketID(intmax_t);
89     inline void WriteTcpTxHdr(struct ReportStruct *, int, int);
90     inline double get_delay_target(void);
91     void InitTrafficLoop(void);
92     void SetReportStartTime(void);
93     inline void SetFullDuplexReportStartTime(void);
94     void FinishTrafficActions(void);
95     void AwaitServerFinPacket(void);
96     bool InProgress(void);
97     void PostNullEvent(void);
98     void AwaitServerCloseEvent(void);
99     bool connected;
100     ReportStruct scratchpad;
101     ReportStruct *reportstruct;
102     double delay_lower_bounds;
103     intmax_t totLen;
104     bool one_report;
105     bool apply_first_udppkt_delay;
106     int udp_payload_minimum;
107     void myReportPacket (void);
108 #ifdef HAVE_STRUCT_TCP_INFO_TCPI_TOTAL_RETRANS
109     struct tcp_info my_tcpi_stats;
110     bool myReportPacket (bool sample_tcpi);
111 #endif
112     // TCP plain
113     void RunTCP(void);
114     // TCP version which supports rate limiting per -b
115     void RunRateLimitedTCP(void);
116     void RunNearCongestionTCP(void);
117 #if HAVE_DECL_TCP_NOTSENT_LOWAT
118     bool AwaitWriteSelectEventTCP(void);
119     void RunWriteEventsTCP(void);
120 #endif
121     // UDP traffic with isochronous and vbr support
122     void RunUDPIsochronous(void);
123     // UDP plain
124     void RunUDP(void);
125     // client connect
126     void PeerXchange(void);
127     thread_Settings *mSettings;
128 #if WIN32
129     SOCKET mySocket;
130 #else
131     int mySocket;
132 #endif
133     struct ReporterData *myReport;
134     Timestamp mEndTime;
135     Timestamp lastPacketTime;
136     Timestamp now;
137     char* readAt;
138     Timestamp connect_done, connect_start;
139     Isochronous::FrameCounter *framecounter;
140     bool isburst;
141     bool peerclose;
142 }; // end class Client
143 
144 #endif // CLIENT_H
145