Annotation of embedaddon/iperf/src/tcp_window_size.c, revision 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>