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  * Server.hpp
48  * by Mark Gates <mgates@nlanr.net>
49  * -------------------------------------------------------------------
50  * A server thread is initiated for each connection accept() returns.
51  * Handles sending and receiving data, and then closes socket.
52  * ------------------------------------------------------------------- */
53 
54 #ifndef SERVER_H
55 #define SERVER_H
56 
57 
58 #include "Settings.hpp"
59 #include "util.h"
60 #include "Timestamp.hpp"
61 
62 /* ------------------------------------------------------------------- */
63 class Server {
64 public:
65     // stores server socket, port and TCP/UDP mode
66     Server(thread_Settings *inSettings);
67 
68     // destroy the server object
69     ~Server();
70 
71     // accepts connection and receives data
72     void RunUDP(void);
73     void RunTCP(void);
74     static void Sig_Int(int inSigno);
75 
76 private:
77     thread_Settings *mSettings;
78     Timestamp mEndTime;
79     Timestamp now;
80     ReportStruct scratchpad;
81     ReportStruct *reportstruct;
82 
83     void InitKernelTimeStamping(void);
84     bool InitTrafficLoop(void);
85     inline void SetFullDuplexReportStartTime(void);
86     inline void SetReportStartTime();
87     int ReadWithRxTimestamp(void);
88     bool ReadPacketID(void);
89     void L2_processing(void);
90     int L2_quintuple_filter(void);
91     void udp_isoch_processing(int);
92     bool InProgress(void);
93     int SkipFirstPayload(void);
94     void ClientReverseFirstRead(void);
95     Timestamp connect_done;
96     bool peerclose;
97     bool isburst;
98 #if WIN32
99     SOCKET mySocket;
100     SOCKET myDropSocket;
101 #else
102     int mySocket;
103     int myDropSocket;
104 #endif
105     struct ReportHeader *myJob;
106     struct ReporterData *myReport;
107 
108 #if HAVE_DECL_SO_TIMESTAMP
109     // Structures needed for recvmsg
110     // Use to get kernel timestamps of packets
111     struct sockaddr_storage srcaddr;
112     struct iovec iov[1];
113     struct msghdr message;
114     char ctrl[CMSG_SPACE(sizeof(struct timeval))];
115     struct cmsghdr *cmsg;
116 #endif
117 #if defined(HAVE_LINUX_FILTER_H) && defined(HAVE_AF_PACKET)
118     struct ether_header *eth_hdr;
119     struct iphdr *ip_hdr;
120     struct udphdr *udp_hdr;
121 #endif
122 }; // end class Server
123 
124 #endif // SERVER_H
125