]> git.pld-linux.org Git - packages/openssh.git/blob - openssh-4.2p1-hpn11.patch
- outdated
[packages/openssh.git] / openssh-4.2p1-hpn11.patch
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);
This page took 0.098094 seconds and 3 git commands to generate.