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>