Annotation of embedaddon/iperf/src/tcp_window_size.c, revision 1.1.1.1

1.1       misho       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:  * tcp_window_size.c
                     48:  * by Mark Gates <mgates@nlanr.net>
                     49:  * -------------------------------------------------------------------
                     50:  * set/getsockopt
                     51:  * ------------------------------------------------------------------- */
                     52: 
                     53: /*
                     54:  * imported into iperfjd branch: 3 Feb 2009 jdugan
                     55:  *
                     56:  * made variable names more sane
                     57:  * removed some cruft
                     58:  */
                     59: 
                     60: #include <stdio.h>
                     61: #include <sys/socket.h>
                     62: #include <assert.h>
                     63: 
                     64: /* -------------------------------------------------------------------
                     65:  * If bufsize > 0, set the TCP window size (via the socket buffer
                     66:  * sizes) for sock. Otherwise leave it as the system default.
                     67:  *
                     68:  * This must be called prior to calling listen() or connect() on
                     69:  * the socket, for TCP window sizes > 64 KB to be effective.
                     70:  *
                     71:  * This now works on UNICOS also, by setting TCP_WINSHIFT.
                     72:  * This now works on AIX, by enabling RFC1323.
                     73:  * returns -1 on error, 0 on no error.
                     74:  * -------------------------------------------------------------------
                     75:  */
                     76: 
                     77: int 
                     78: set_tcp_windowsize(int sock, int bufsize, int dir)
                     79: {
                     80:     int       rc;
                     81:     int       newbufsize;
                     82: 
                     83:     assert(sock >= 0);
                     84: 
                     85:     if (bufsize > 0)
                     86:     {
                     87:        /*
                     88:          * note: results are verified after connect() or listen(), since
                     89:          * some OS's don't show the corrected value until then.
                     90:          */
                     91: //        printf("Setting TCP buffer to size: %d\n", bufsize);
                     92:        newbufsize = bufsize;
                     93:        rc = setsockopt(sock, SOL_SOCKET, dir, (char *) &newbufsize, sizeof(newbufsize));
                     94:        if (rc < 0)
                     95:            return rc;
                     96:     } else {
                     97: //        printf("      Using default TCP buffer size and assuming OS will do autotuning\n");
                     98:     }
                     99: 
                    100:     return 0;
                    101: }
                    102: 
                    103: /* -------------------------------------------------------------------
                    104:  * returns the TCP window size (on the sending buffer, SO_SNDBUF),
                    105:  * or -1 on error.
                    106:  * ------------------------------------------------------------------- */
                    107: 
                    108: int
                    109: get_tcp_windowsize(int sock, int dir)
                    110: {
                    111:     int       bufsize = 0;
                    112: 
                    113:     int       rc;
                    114:     socklen_t len;
                    115: 
                    116:     /* send buffer -- query for buffer size */
                    117:     len = sizeof bufsize;
                    118:     rc = getsockopt(sock, SOL_SOCKET, dir, (char *) &bufsize, &len);
                    119: 
                    120:     if (rc < 0)
                    121:        return rc;
                    122: 
                    123:     return bufsize;
                    124: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>