]>
Commit | Line | Data |
---|---|---|
d4575b41 | 1 | diff -p -u openssh-4.2p1/buffer.c openssh-hpn-4.2p1/buffer.c |
2 | --- openssh-4.2p1/buffer.c 2005-03-14 07:22:26.000000000 -0500 | |
3 | +++ openssh-hpn-4.2p1/buffer.c 2005-09-08 12:08:40.000000000 -0400 | |
4 | @@ -107,7 +107,7 @@ restart: | |
5 | /* Increase the size of the buffer and retry. */ | |
6 | ||
7 | newlen = buffer->alloc + len + 32768; | |
8 | - if (newlen > BUFFER_MAX_LEN) | |
9 | + if (newlen > BUFFER_MAX_HPN_LEN) | |
10 | fatal("buffer_append_space: alloc %u not supported", | |
11 | newlen); | |
12 | buffer->buf = xrealloc(buffer->buf, newlen); | |
13 | diff -p -u openssh-4.2p1/buffer.h openssh-hpn-4.2p1/buffer.h | |
14 | --- openssh-4.2p1/buffer.h 2005-03-14 07:22:26.000000000 -0500 | |
15 | +++ openssh-hpn-4.2p1/buffer.h 2005-09-08 12:08:40.000000000 -0400 | |
16 | @@ -25,6 +25,7 @@ typedef struct { | |
17 | ||
18 | #define BUFFER_MAX_CHUNK 0x100000 | |
19 | #define BUFFER_MAX_LEN 0xa00000 | |
20 | +#define BUFFER_MAX_HPN_LEN (2>>29)-1 | |
21 | ||
22 | void buffer_init(Buffer *); | |
23 | void buffer_clear(Buffer *); | |
24 | diff -p -u openssh-4.2p1/channels.c openssh-hpn-4.2p1/channels.c | |
25 | --- openssh-4.2p1/channels.c 2005-07-17 03:22:45.000000000 -0400 | |
26 | +++ openssh-hpn-4.2p1/channels.c 2005-09-08 12:08:40.000000000 -0400 | |
27 | @@ -262,6 +262,7 @@ channel_new(char *ctype, int type, int r | |
28 | c->local_window_max = window; | |
29 | c->local_consumed = 0; | |
30 | c->local_maxpacket = maxpack; | |
31 | + c->dynamic_window = 0; | |
32 | c->remote_id = -1; | |
33 | c->remote_name = xstrdup(remote_name); | |
34 | c->remote_window = 0; | |
35 | @@ -716,9 +717,9 @@ static void | |
36 | channel_pre_open(Channel *c, fd_set * readset, fd_set * writeset) | |
37 | { | |
38 | u_int limit = compat20 ? c->remote_window : packet_get_maxsize(); | |
39 | - | |
40 | + | |
41 | /* check buffer limits */ | |
42 | - limit = MIN(limit, (BUFFER_MAX_LEN - BUFFER_MAX_CHUNK - CHAN_RBUF)); | |
43 | + limit = MIN(limit, (BUFFER_MAX_HPN_LEN - BUFFER_MAX_CHUNK - CHAN_RBUF)); | |
44 | ||
45 | if (c->istate == CHAN_INPUT_OPEN && | |
46 | limit > 0 && | |
47 | @@ -1537,14 +1538,29 @@ channel_check_window(Channel *c) | |
48 | !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) && | |
49 | c->local_window < c->local_window_max/2 && | |
50 | c->local_consumed > 0) { | |
51 | + u_int32_t tcpwinsz = 0; | |
52 | + socklen_t optsz = sizeof(tcpwinsz); | |
53 | + int ret = -1; | |
54 | + u_int32_t addition = 0; | |
55 | + if (c->dynamic_window) { | |
56 | + ret = getsockopt(packet_get_connection_in(), | |
57 | + SOL_SOCKET, SO_RCVBUF, &tcpwinsz, &optsz); | |
58 | + if ((ret == 0) && tcpwinsz > BUFFER_MAX_HPN_LEN) | |
59 | + tcpwinsz = BUFFER_MAX_HPN_LEN; | |
60 | + } | |
61 | + if (c->dynamic_window && (ret == 0) && | |
62 | + (tcpwinsz > c->local_window_max)) { | |
63 | + addition = tcpwinsz - c->local_window_max; | |
64 | + c->local_window_max += addition; | |
65 | + } | |
66 | packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST); | |
67 | packet_put_int(c->remote_id); | |
68 | - packet_put_int(c->local_consumed); | |
69 | + packet_put_int(c->local_consumed + addition); | |
70 | packet_send(); | |
71 | debug2("channel %d: window %d sent adjust %d", | |
72 | c->self, c->local_window, | |
73 | c->local_consumed); | |
74 | - c->local_window += c->local_consumed; | |
75 | + c->local_window += c->local_consumed + addition; | |
76 | c->local_consumed = 0; | |
77 | } | |
78 | return 1; | |
79 | diff -p -u openssh-4.2p1/channels.h openssh-hpn-4.2p1/channels.h | |
80 | --- openssh-4.2p1/channels.h 2005-07-17 03:19:25.000000000 -0400 | |
81 | +++ openssh-hpn-4.2p1/channels.h 2005-09-08 12:08:40.000000000 -0400 | |
82 | @@ -99,6 +99,7 @@ struct Channel { | |
83 | u_int local_window_max; | |
84 | u_int local_consumed; | |
85 | u_int local_maxpacket; | |
86 | + int dynamic_window; | |
87 | int extended_usage; | |
88 | int single_connection; | |
89 | ||
90 | @@ -119,11 +120,11 @@ struct Channel { | |
91 | ||
92 | /* default window/packet sizes for tcp/x11-fwd-channel */ | |
93 | #define CHAN_SES_PACKET_DEFAULT (32*1024) | |
94 | -#define CHAN_SES_WINDOW_DEFAULT (4*CHAN_SES_PACKET_DEFAULT) | |
95 | +#define CHAN_SES_WINDOW_DEFAULT (0xa00000/2) | |
96 | #define CHAN_TCP_PACKET_DEFAULT (32*1024) | |
97 | -#define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT) | |
98 | +#define CHAN_TCP_WINDOW_DEFAULT (0xa00000/2) | |
99 | #define CHAN_X11_PACKET_DEFAULT (16*1024) | |
100 | -#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT) | |
101 | +#define CHAN_X11_WINDOW_DEFAULT (0xa00000/2) | |
102 | ||
103 | /* possible input states */ | |
104 | #define CHAN_INPUT_OPEN 0 | |
105 | diff -p -u openssh-4.2p1/compat.c openssh-hpn-4.2p1/compat.c | |
106 | --- openssh-4.2p1/compat.c 2005-03-01 05:24:33.000000000 -0500 | |
107 | +++ openssh-hpn-4.2p1/compat.c 2005-09-08 12:08:40.000000000 -0400 | |
108 | @@ -162,6 +162,14 @@ compat_datafellows(const char *version) | |
109 | strlen(check[i].pat), 0) == 1) { | |
110 | debug("match: %s pat %s", version, check[i].pat); | |
111 | datafellows = check[i].bugs; | |
112 | + /* Check to see if the remote side is OpenSSH and not HPN */ | |
113 | + if(strstr(version,"OpenSSH") != NULL) | |
114 | + { | |
115 | + if (strstr(version,"hpn") == NULL) | |
116 | + { | |
117 | + datafellows |= SSH_BUG_LARGEWINDOW; | |
118 | + } | |
119 | + } | |
120 | return; | |
121 | } | |
122 | } | |
123 | diff -p -u openssh-4.2p1/compat.h openssh-hpn-4.2p1/compat.h | |
124 | --- openssh-4.2p1/compat.h 2005-03-01 05:24:33.000000000 -0500 | |
125 | +++ openssh-hpn-4.2p1/compat.h 2005-09-08 12:08:40.000000000 -0400 | |
126 | @@ -56,6 +56,7 @@ | |
127 | #define SSH_BUG_PROBE 0x00400000 | |
128 | #define SSH_BUG_FIRSTKEX 0x00800000 | |
129 | #define SSH_OLD_FORWARD_ADDR 0x01000000 | |
130 | +#define SSH_BUG_LARGEWINDOW 0x02000000 | |
131 | ||
132 | void enable_compat13(void); | |
133 | void enable_compat20(void); | |
134 | Common subdirectories: openssh-4.2p1/contrib and openssh-hpn-4.2p1/contrib | |
135 | Common subdirectories: openssh-4.2p1/openbsd-compat and openssh-hpn-4.2p1/openbsd-compat | |
136 | diff -p -u openssh-4.2p1/readconf.h openssh-hpn-4.2p1/readconf.h | |
137 | --- openssh-4.2p1/readconf.h 2005-06-15 23:19:42.000000000 -0400 | |
138 | +++ openssh-hpn-4.2p1/readconf.h 2005-09-08 12:08:40.000000000 -0400 | |
139 | @@ -57,6 +57,7 @@ typedef struct { | |
140 | int compression_level; /* Compression level 1 (fast) to 9 | |
141 | * (best). */ | |
142 | int tcp_keep_alive; /* Set SO_KEEPALIVE. */ | |
143 | + int tcp_rcv_buf; /* user switch to set tcp recv buffer */ | |
144 | LogLevel log_level; /* Level for logging. */ | |
145 | ||
146 | int port; /* Port to connect. */ | |
147 | Common subdirectories: openssh-4.2p1/regress and openssh-hpn-4.2p1/regress | |
148 | Common subdirectories: openssh-4.2p1/scard and openssh-hpn-4.2p1/scard | |
149 | diff -p -u openssh-4.2p1/scp.c openssh-hpn-4.2p1/scp.c | |
150 | --- openssh-4.2p1/scp.c 2005-08-02 03:07:08.000000000 -0400 | |
151 | +++ openssh-hpn-4.2p1/scp.c 2005-09-08 12:10:35.000000000 -0400 | |
152 | @@ -231,7 +231,7 @@ main(int argc, char **argv) | |
153 | addargs(&args, "-oClearAllForwardings yes"); | |
154 | ||
155 | fflag = tflag = 0; | |
156 | - while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q1246S:o:F:")) != -1) | |
157 | + while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q1246S:o:F:w:")) != -1) | |
158 | switch (ch) { | |
159 | /* User-visible flags. */ | |
160 | case '1': | |
161 | @@ -292,6 +292,9 @@ main(int argc, char **argv) | |
162 | setmode(0, O_BINARY); | |
163 | #endif | |
164 | break; | |
165 | + case 'w': | |
166 | + addargs(&args, "-w%s", optarg); | |
167 | + break; | |
168 | default: | |
169 | usage(); | |
170 | } | |
171 | @@ -507,7 +510,7 @@ source(int argc, char **argv) | |
172 | off_t i, amt, statbytes; | |
173 | size_t result; | |
174 | int fd = -1, haderr, indx; | |
175 | - char *last, *name, buf[2048]; | |
176 | + char *last, *name, buf[16384]; | |
177 | int len; | |
178 | ||
179 | for (indx = 0; indx < argc; ++indx) { | |
180 | @@ -567,7 +570,11 @@ syserr: run_err("%s: %s", name, strerr | |
181 | (void) atomicio(vwrite, remout, buf, strlen(buf)); | |
182 | if (response() < 0) | |
183 | goto next; | |
184 | - if ((bp = allocbuf(&buffer, fd, 2048)) == NULL) { | |
185 | + /* this change decreases the number of read/write syscalls*/ | |
186 | + /* when scp acts as data source. this is the critical change*/ | |
187 | + /* buf can actually remain at 2k but increasing both to 16k*/ | |
188 | + /* seemed to make sense*/ | |
189 | + if ((bp = allocbuf(&buffer, fd, sizeof(buf))) == NULL) { | |
190 | next: (void) close(fd); | |
191 | continue; | |
192 | } | |
193 | @@ -728,7 +735,7 @@ sink(int argc, char **argv) | |
194 | int amt, exists, first, mask, mode, ofd, omode; | |
195 | off_t size, statbytes; | |
196 | int setimes, targisdir, wrerrno = 0; | |
197 | - char ch, *cp, *np, *targ, *why, *vect[1], buf[2048]; | |
198 | + char ch, *cp, *np, *targ, *why, *vect[1], buf[16384]; | |
199 | struct timeval tv[2]; | |
200 | ||
201 | #define atime tv[0] | |
202 | @@ -889,7 +896,7 @@ bad: run_err("%s: %s", np, strerror(er | |
203 | continue; | |
204 | } | |
205 | (void) atomicio(vwrite, remout, "", 1); | |
206 | - if ((bp = allocbuf(&buffer, ofd, 4096)) == NULL) { | |
207 | + if ((bp = allocbuf(&buffer, ofd, sizeof(buf))) == NULL) { | |
208 | (void) close(ofd); | |
209 | continue; | |
210 | } | |
211 | @@ -899,8 +906,8 @@ bad: run_err("%s: %s", np, strerror(er | |
212 | statbytes = 0; | |
213 | if (showprogress) | |
214 | start_progress_meter(curfile, size, &statbytes); | |
215 | - for (count = i = 0; i < size; i += 4096) { | |
216 | - amt = 4096; | |
217 | + for (count = i = 0; i < size; i += sizeof(buf)) { | |
218 | + amt = sizeof(buf); | |
219 | if (i + amt > size) | |
220 | amt = size - i; | |
221 | count += amt; | |
222 | @@ -917,7 +924,7 @@ bad: run_err("%s: %s", np, strerror(er | |
223 | } while (amt > 0); | |
224 | ||
225 | if (limit_rate) | |
226 | - bwlimit(4096); | |
227 | + bwlimit(sizeof(buf)); | |
228 | ||
229 | if (count == bp->cnt) { | |
230 | /* Keep reading so we stay sync'd up. */ | |
231 | @@ -1033,7 +1040,7 @@ usage(void) | |
232 | { | |
233 | (void) fprintf(stderr, | |
234 | "usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]\n" | |
235 | - " [-l limit] [-o ssh_option] [-P port] [-S program]\n" | |
236 | + " [-l limit] [-o ssh_option] [-P port] [-w buffer size] [-S program]\n" | |
237 | " [[user@]host1:]file1 [...] [[user@]host2:]file2\n"); | |
238 | exit(1); | |
239 | } | |
240 | diff -p -u openssh-4.2p1/serverloop.c openssh-hpn-4.2p1/serverloop.c | |
241 | --- openssh-4.2p1/serverloop.c 2005-07-17 03:26:44.000000000 -0400 | |
242 | +++ openssh-hpn-4.2p1/serverloop.c 2005-09-08 12:08:41.000000000 -0400 | |
243 | @@ -895,6 +895,8 @@ server_request_session(void) | |
244 | c = channel_new("session", SSH_CHANNEL_LARVAL, | |
245 | -1, -1, -1, /*window size*/0, CHAN_SES_PACKET_DEFAULT, | |
246 | 0, "server-session", 1); | |
247 | + if (!(datafellows & SSH_BUG_LARGEWINDOW)) | |
248 | + c->dynamic_window = 1; | |
249 | if (session_open(the_authctxt, c->self) != 1) { | |
250 | debug("session open failed, free channel %d", c->self); | |
251 | channel_free(c); | |
252 | diff -p -u openssh-4.2p1/sshconnect.c openssh-hpn-4.2p1/sshconnect.c | |
253 | --- openssh-4.2p1/sshconnect.c 2005-07-17 03:22:46.000000000 -0400 | |
254 | +++ openssh-hpn-4.2p1/sshconnect.c 2005-09-08 12:08:41.000000000 -0400 | |
255 | @@ -167,13 +167,58 @@ ssh_create_socket(int privileged, struct | |
256 | strerror(errno)); | |
257 | else | |
258 | debug("Allocated local port %d.", p); | |
259 | + | |
260 | + | |
261 | + /* tuning needs to happen after the socket is */ | |
262 | + /* created but before the connection happens */ | |
263 | + /* so winscale is negotiated properly -cjr */ | |
264 | + | |
265 | + /* Set tcp receive buffer if requested */ | |
266 | + if (options.tcp_rcv_buf) | |
267 | + { | |
268 | + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, | |
269 | + (void *)&options.tcp_rcv_buf, | |
270 | + sizeof(options.tcp_rcv_buf)) >= 0) | |
271 | + { | |
272 | + debug("setsockopt SO_RCVBUF: %.100s", strerror(errno)); | |
273 | + } | |
274 | + else | |
275 | + { | |
276 | + /* coudln't set the socket size to use spec. */ | |
277 | + /* should default to system param and continue */ | |
278 | + /* warn the user though - cjr */ | |
279 | + error("Couldn't set socket receive buffer as requested. Continuing anyway."); | |
280 | + } | |
281 | + } | |
282 | return sock; | |
283 | } | |
284 | sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); | |
285 | if (sock < 0) | |
286 | error("socket: %.100s", strerror(errno)); | |
287 | - | |
288 | - /* Bind the socket to an alternative local IP address */ | |
289 | + | |
290 | + /* tuning needs to happen after the socket is */ | |
291 | + /* created but before the connection happens */ | |
292 | + /* so winscale is negotiated properly -cjr */ | |
293 | + | |
294 | + /* Set tcp receive buffer if requested */ | |
295 | + if (options.tcp_rcv_buf) | |
296 | + { | |
297 | + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, | |
298 | + (void *)&options.tcp_rcv_buf, | |
299 | + sizeof(options.tcp_rcv_buf)) >= 0) | |
300 | + { | |
301 | + debug("setsockopt SO_RCVBUF: %.100s", strerror(errno)); | |
302 | + } | |
303 | + else | |
304 | + { | |
305 | + /* coudln't set the socket size to use spec. */ | |
306 | + /* should default to system param and continue */ | |
307 | + /* warn the user though - cjr */ | |
308 | + error("Couldn't set socket receive buffer as requested. Continuing anyway."); | |
309 | + } | |
310 | + } | |
311 | + | |
312 | + /* Bind the socket to an alternative local IP address */ | |
313 | if (options.bind_address == NULL) | |
314 | return sock; | |
315 | ||
316 | @@ -480,7 +525,7 @@ ssh_exchange_identification(void) | |
317 | snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n", | |
318 | compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1, | |
319 | compat20 ? PROTOCOL_MINOR_2 : minor1, | |
320 | - SSH_VERSION); | |
321 | + SSH_RELEASE); | |
322 | if (atomicio(vwrite, connection_out, buf, strlen(buf)) != strlen(buf)) | |
323 | fatal("write: %.100s", strerror(errno)); | |
324 | client_version_string = xstrdup(buf); | |
325 | diff -p -u openssh-4.2p1/sshd.c openssh-hpn-4.2p1/sshd.c | |
326 | --- openssh-4.2p1/sshd.c 2005-07-26 07:54:56.000000000 -0400 | |
327 | +++ openssh-hpn-4.2p1/sshd.c 2005-09-08 12:08:41.000000000 -0400 | |
328 | @@ -377,7 +377,7 @@ sshd_exchange_identification(int sock_in | |
329 | major = PROTOCOL_MAJOR_1; | |
330 | minor = PROTOCOL_MINOR_1; | |
331 | } | |
332 | - snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n", major, minor, SSH_VERSION); | |
333 | + snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n", major, minor, SSH_RELEASE); | |
334 | server_version_string = xstrdup(buf); | |
335 | ||
336 | /* Send our protocol version identification. */ | |
337 | diff -p -u openssh-4.2p1/version.h openssh-hpn-4.2p1/version.h | |
338 | --- openssh-4.2p1/version.h 2005-08-31 05:47:07.000000000 -0400 | |
339 | +++ openssh-hpn-4.2p1/version.h 2005-09-08 12:08:41.000000000 -0400 | |
340 | @@ -3,4 +3,5 @@ | |
341 | #define SSH_VERSION "OpenSSH_4.2" | |
342 | ||
343 | #define SSH_PORTABLE "p1" | |
344 | -#define SSH_RELEASE SSH_VERSION SSH_PORTABLE | |
345 | +#define SSH_HPN "-hpn" | |
346 | +#define SSH_RELEASE SSH_VERSION SSH_PORTABLE SSH_HPN | |
347 | diff -p -u openssh-4.2p1/ssh.c openssh-hpn-4.2p1/ssh.c | |
348 | --- openssh-4.2p1/ssh.c 2005-10-28 12:24:10.000000000 +0200 | |
349 | +++ openssh-hpn-4.2p1/ssh.c 2005-10-28 12:26:55.000000000 +0200 | |
350 | @@ -161,7 +161,7 @@ usage(void) | |
351 | { | |
352 | fprintf(stderr, | |
353 | "usage: ssh [-1246AaBCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]\n" | |
354 | -" [-D port] [-e escape_char] [-F configfile]\n" | |
355 | +" [-D port] [-e escape_char] [-F configfile] [-w receive buffer size]\n" | |
356 | " [-i identity_file] [-L [bind_address:]port:host:hostport]\n" | |
357 | " [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n" | |
358 | " [-R [bind_address:]port:host:hostport] [-S ctl_path]\n" | |
359 | @@ -242,9 +242,12 @@ main(int ac, char **av) | |
360 | /* Parse command-line arguments. */ | |
361 | host = NULL; | |
362 | ||
363 | + /* need to set options.tcp_rcv_buf to 0 */ | |
364 | + options.tcp_rcv_buf = 0; | |
365 | + | |
366 | again: | |
367 | while ((opt = getopt(ac, av, | |
368 | - "1246ab:c:e:fgi:kl:m:no:p:qstvxABCD:F:I:L:MNO:PR:S:TVXY")) != -1) { | |
369 | + "1246ab:c:e:fgi:kl:m:no:p:qstvw:xACD:F:I:L:MNO:PR:S:TVXY")) != -1) { | |
370 | switch (opt) { | |
371 | case '1': | |
372 | options.protocol = SSH_PROTO_1; | |
373 | @@ -489,6 +492,9 @@ again: | |
374 | case 'F': | |
375 | config = optarg; | |
376 | break; | |
377 | + case 'w': | |
378 | + options.tcp_rcv_buf = atoi(optarg); | |
379 | + break; | |
380 | default: | |
381 | usage(); | |
382 | } | |
383 | @@ -1098,6 +1104,7 @@ ssh_session2_open(void) | |
384 | window = CHAN_SES_WINDOW_DEFAULT; | |
385 | packetmax = CHAN_SES_PACKET_DEFAULT; | |
386 | if (tty_flag) { | |
387 | + window = 4*CHAN_SES_PACKET_DEFAULT; | |
388 | window >>= 1; | |
389 | packetmax >>= 1; | |
390 | } | |
391 | @@ -1106,6 +1113,9 @@ ssh_session2_open(void) | |
392 | window, packetmax, CHAN_EXTENDED_WRITE, | |
393 | "client-session", /*nonblock*/0); | |
394 | ||
395 | + if (!tty_flag && (!(datafellows & SSH_BUG_LARGEWINDOW))) { | |
396 | + c->dynamic_window = 1; | |
397 | + } | |
398 | debug3("ssh_session2_open: channel_new: %d", c->self); | |
399 | ||
400 | channel_send_open(c->self); |