Annotation of embedaddon/rsync/patches/congestion.diff, revision 1.1

1.1     ! misho       1: From: Dave Taht <d@taht.net>
        !             2: 
        !             3: In the bufferbloat age, anything that can make for a kinder, gentler bulk
        !             4: transfer protocol seems desirable.
        !             5: 
        !             6: This add support for user and server selectable congestion control algorithms.
        !             7: 
        !             8: For example:
        !             9:     --congestion-alg=lp # For the tcp-lp algorithm on the command line
        !            10: 
        !            11: And diffserv support:
        !            12:     --diffserv=8 for setting the CS1 bit
        !            13: 
        !            14: Also available in rsync daemon modules:
        !            15: 
        !            16: [mystuff]
        !            17:     congestion alg = westwood # for a wireless connection
        !            18:     diffserv = 8
        !            19: 
        !            20: This could be improved by being able to specify a list of congestion algorithms
        !            21: to try, symbolic names for diffserv (CS1), a better name than 'congestion-alg',
        !            22: and some error checking.
        !            23: 
        !            24: To use this patch, run these commands for a successful build:
        !            25: 
        !            26:     patch -p1 <patches/congestion.diff
        !            27:     ./configure                         (optional if already run)
        !            28:     make
        !            29: 
        !            30: based-on: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
        !            31: diff --git a/daemon-parm.txt b/daemon-parm.txt
        !            32: --- a/daemon-parm.txt
        !            33: +++ b/daemon-parm.txt
        !            34: @@ -18,6 +18,7 @@ Locals: =================================================================
        !            35:  STRING        auth_users              NULL
        !            36:  STRING        charset                 NULL
        !            37:  STRING        comment                 NULL
        !            38: +STRING        congestion_alg          NULL
        !            39:  STRING        dont_compress           DEFAULT_DONT_COMPRESS
        !            40:  STRING        early_exec              NULL
        !            41:  STRING        exclude                 NULL
        !            42: @@ -45,6 +46,7 @@ STRING       uid                     NULL
        !            43:  PATH  path                    NULL
        !            44:  PATH  temp_dir                NULL
        !            45:  
        !            46: +INTEGER       diffserv                8
        !            47:  INTEGER       max_connections         0
        !            48:  INTEGER       max_verbosity           1
        !            49:  INTEGER       timeout                 0
        !            50: diff --git a/options.c b/options.c
        !            51: --- a/options.c
        !            52: +++ b/options.c
        !            53: @@ -72,6 +72,8 @@ int delete_during = 0;
        !            54:  int delete_before = 0;
        !            55:  int delete_after = 0;
        !            56:  int delete_excluded = 0;
        !            57: +int diffserv = 8;
        !            58: +char *congestion_alg = NULL;
        !            59:  int remove_source_files = 0;
        !            60:  int one_file_system = 0;
        !            61:  int protocol_version = PROTOCOL_VERSION;
        !            62: @@ -816,6 +818,8 @@ static struct poptOption long_options[] = {
        !            63:    {"outbuf",           0,  POPT_ARG_STRING, &outbuf_mode, 0, 0, 0 },
        !            64:    {"remote-option",   'M', POPT_ARG_STRING, 0, 'M', 0, 0 },
        !            65:    {"protocol",         0,  POPT_ARG_INT,    &protocol_version, 0, 0, 0 },
        !            66: +  {"congestion-alg",   0,  POPT_ARG_STRING, &congestion_alg, 0, 0, 0 },
        !            67: +  {"diffserv",         0,  POPT_ARG_INT,    &diffserv, 0, 0, 0 },
        !            68:    {"checksum-seed",    0,  POPT_ARG_INT,    &checksum_seed, 0, 0, 0 },
        !            69:    {"server",           0,  POPT_ARG_NONE,   0, OPT_SERVER, 0, 0 },
        !            70:    {"sender",           0,  POPT_ARG_NONE,   0, OPT_SENDER, 0, 0 },
        !            71: diff --git a/rsync.1.md b/rsync.1.md
        !            72: --- a/rsync.1.md
        !            73: +++ b/rsync.1.md
        !            74: @@ -443,6 +443,8 @@ detailed description below for a complete description.
        !            75:  --address=ADDRESS        bind address for outgoing socket to daemon
        !            76:  --port=PORT              specify double-colon alternate port number
        !            77:  --sockopts=OPTIONS       specify custom TCP options
        !            78: +--diffserv=[0-63]        specify diffserv setting
        !            79: +--congestion-alg=STRING  choose a congestion algo
        !            80:  --blocking-io            use blocking I/O for the remote shell
        !            81:  --outbuf=N|L|B           set out buffering to None, Line, or Block
        !            82:  --stats                  give some file-transfer stats
        !            83: diff --git a/socket.c b/socket.c
        !            84: --- a/socket.c
        !            85: +++ b/socket.c
        !            86: @@ -40,6 +40,8 @@ extern char *sockopts;
        !            87:  extern int default_af_hint;
        !            88:  extern int connect_timeout;
        !            89:  extern int pid_file_fd;
        !            90: +extern int diffserv;
        !            91: +extern char *congestion_alg;
        !            92:  
        !            93:  #ifdef HAVE_SIGACTION
        !            94:  static struct sigaction sigact;
        !            95: @@ -166,6 +168,37 @@ static void contimeout_handler(UNUSED(int val))
        !            96:        connect_timeout = -1;
        !            97:  }
        !            98:  
        !            99: +/* Set special socket options
        !           100: + *
        !           101: + * Diffserv is a value in the range of 0-63, and needs to be shifted left
        !           102: + *          2 places AND treated differently for ipv4 and ipv6.
        !           103: + * Setting TCP congestion control is rather Linux specific (at the moment)
        !           104: + * and sends a varying length string to setsockopt rather than an integer
        !           105: + * or character.
        !           106: +*/
        !           107: +
        !           108: +void set_special_sockopts(int s)
        !           109: +{
        !           110: +#if defined(TCP_CONGESTION)
        !           111: +      if (congestion_alg) {
        !           112: +              if (setsockopt(s, SOL_TCP, TCP_CONGESTION, congestion_alg, strlen(congestion_alg)) == -1)
        !           113: +                      rprintf(FINFO, "Couldn't set %s congestion algorithm\n", congestion_alg);
        !           114: +      }
        !           115: +#endif
        !           116: +
        !           117: +/* setting the diffserv/tos bits is different on ipv6 and
        !           118: + *  ipv4, so we just hammer down on both and ignore the result
        !           119: + *  And ipv6 demands an int for v. I didn't write the spec.
        !           120: + */
        !           121: +      if (diffserv) {
        !           122: +              int v = (diffserv & 63) <<2;
        !           123: +              setsockopt(s,IPPROTO_IP, IP_TOS, &v, sizeof(v));
        !           124: +#if defined(IPV6_TCLASS)
        !           125: +              setsockopt(s,IPPROTO_IPV6, IPV6_TCLASS, &v, sizeof(v));
        !           126: +#endif
        !           127: +      }
        !           128: +}
        !           129: +
        !           130:  /* Open a socket to a tcp remote host with the specified port.
        !           131:   *
        !           132:   * Based on code from Warren.  Proxy support by Stephen Rothwell.
        !           133: @@ -272,6 +305,7 @@ int open_socket_out(char *host, int port, const char *bind_addr, int af_hint)
        !           134:                        alarm(connect_timeout);
        !           135:                }
        !           136:  
        !           137: +              set_special_sockopts(s);
        !           138:                set_socket_options(s, sockopts);
        !           139:                while (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
        !           140:                        if (connect_timeout < 0)
        !           141: @@ -440,6 +474,7 @@ static int *open_socket_in(int type, int port, const char *bind_addr,
        !           142:                        continue;
        !           143:                }
        !           144:  
        !           145: +              set_special_sockopts(s);
        !           146:                setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
        !           147:                           (char *)&one, sizeof one);
        !           148:                if (sockopts)
        !           149: diff -Nurp a/rsync.1 b/rsync.1
        !           150: --- a/rsync.1
        !           151: +++ b/rsync.1
        !           152: @@ -519,6 +519,8 @@ detailed description below for a complet
        !           153:  --address=ADDRESS        bind address for outgoing socket to daemon
        !           154:  --port=PORT              specify double-colon alternate port number
        !           155:  --sockopts=OPTIONS       specify custom TCP options
        !           156: +--diffserv=[0-63]        specify diffserv setting
        !           157: +--congestion-alg=STRING  choose a congestion algo
        !           158:  --blocking-io            use blocking I/O for the remote shell
        !           159:  --outbuf=N|L|B           set out buffering to None, Line, or Block
        !           160:  --stats                  give some file-transfer stats
        !           161: diff -Nurp a/rsync.1.html b/rsync.1.html
        !           162: --- a/rsync.1.html
        !           163: +++ b/rsync.1.html
        !           164: @@ -434,6 +434,8 @@ detailed description below for a complet
        !           165:  --address=ADDRESS        bind address for outgoing socket to daemon
        !           166:  --port=PORT              specify double-colon alternate port number
        !           167:  --sockopts=OPTIONS       specify custom TCP options
        !           168: +--diffserv=[0-63]        specify diffserv setting
        !           169: +--congestion-alg=STRING  choose a congestion algo
        !           170:  --blocking-io            use blocking I/O for the remote shell
        !           171:  --outbuf=N|L|B           set out buffering to None, Line, or Block
        !           172:  --stats                  give some file-transfer stats

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