]> sjero.net Git - iperf/blob - src/PerfSocket.cpp
c25a0b6f80ad9118c9726c219a22c3767c1825e8
[iperf] / src / PerfSocket.cpp
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  * PerfSocket.cpp
48  * by Mark Gates <mgates@nlanr.net>
49  *    Ajay Tirumala <tirumala@ncsa.uiuc.edu>
50  * -------------------------------------------------------------------
51  * Has routines the Client and Server classes use in common for
52  * performance testing the network.
53  * Changes in version 1.2.0
54  *     for extracting data from files
55  * -------------------------------------------------------------------
56  * headers
57  * uses
58  *   <stdlib.h>
59  *   <stdio.h>
60  *   <string.h>
61  *
62  *   <sys/types.h>
63  *   <sys/socket.h>
64  *   <unistd.h>
65  *
66  *   <arpa/inet.h>
67  *   <netdb.h>
68  *   <netinet/in.h>
69  *   <sys/socket.h>
70  * ------------------------------------------------------------------- */
71
72
73 #define HEADERS()
74
75 #include "headers.h"
76
77 #include "PerfSocket.hpp"
78 #include "SocketAddr.h"
79 #include "util.h"
80
81 /* -------------------------------------------------------------------
82  * Set socket options before the listen() or connect() calls.
83  * These are optional performance tuning factors.
84  * ------------------------------------------------------------------- */
85
86 void SetSocketOptions( thread_Settings *inSettings ) {
87     // set the TCP window size (socket buffer sizes)
88     // also the UDP buffer size
89     // must occur before call to accept() for large window sizes
90     setsock_tcp_windowsize( inSettings->mSock, inSettings->mTCPWin,
91                             (inSettings->mThreadMode == kMode_Client ? 1 : 0) );
92
93     // check if we're sending multicast, and set TTL
94     if ( isMulticast( inSettings ) && ( inSettings->mTTL > 0 ) ) {
95         int val = inSettings->mTTL;
96 #ifdef HAVE_MULTICAST
97         if ( !SockAddr_isIPv6( &inSettings->local ) ) {
98             int rc = setsockopt( inSettings->mSock, IPPROTO_IP, IP_MULTICAST_TTL,
99                     (const void*) &val, (Socklen_t) sizeof(val));
100
101             WARN_errno( rc == SOCKET_ERROR, "multicast ttl" );
102         }
103 #ifdef HAVE_IPV6_MULTICAST
104         else {
105             int rc = setsockopt( inSettings->mSock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
106                     (const void*) &val, (Socklen_t) sizeof(val));
107             WARN_errno( rc == SOCKET_ERROR, "multicast ttl" );
108         }
109 #endif
110 #endif
111     }
112
113
114 #ifdef IP_TOS
115
116     // set IP TOS (type-of-service) field
117     if ( inSettings->mTOS > 0 ) {
118         int  tos = inSettings->mTOS;
119         Socklen_t len = sizeof(tos);
120         int rc = setsockopt( inSettings->mSock, IPPROTO_IP, IP_TOS,
121                              (char*) &tos, len );
122         WARN_errno( rc == SOCKET_ERROR, "setsockopt IP_TOS" );
123     }
124 #endif
125
126     if ( !isUDP( inSettings ) ) {
127         // set the TCP maximum segment size
128         setsock_tcp_mss( inSettings->mSock, inSettings->mMSS );
129
130 #ifdef TCP_NODELAY
131
132         // set TCP nodelay option
133         if ( isNoDelay( inSettings ) ) {
134             int nodelay = 1;
135             Socklen_t len = sizeof(nodelay);
136             int rc = setsockopt( inSettings->mSock, IPPROTO_TCP, TCP_NODELAY,
137                                  (char*) &nodelay, len );
138             WARN_errno( rc == SOCKET_ERROR, "setsockopt TCP_NODELAY" );
139         }
140 #endif
141     }
142 }
143 // end SetSocketOptions