(By Sklower) checkpoint the current state of Cherenson's work.
[unix-history] / usr / src / sys / netinet / tcp_usrreq.c
index 0e56af8..f9db771 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)tcp_usrreq.c        7.17 (Berkeley) %G%
+ *     @(#)tcp_usrreq.c        7.18 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -161,6 +161,10 @@ tcp_usrreq(so, req, m, nam, control)
                        error = ENOBUFS;
                        break;
                }
                        error = ENOBUFS;
                        break;
                }
+               /* Compute window scaling to request.  */
+               while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
+                   (TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat)
+                       tp->request_r_scale++;
                soisconnecting(so);
                tcpstat.tcps_connattempt++;
                tp->t_state = TCPS_SYN_SENT;
                soisconnecting(so);
                tcpstat.tcps_connattempt++;
                tp->t_state = TCPS_SYN_SENT;
@@ -320,14 +324,24 @@ tcp_ctloutput(op, so, level, optname, mp)
        int level, optname;
        struct mbuf **mp;
 {
        int level, optname;
        struct mbuf **mp;
 {
-       int error = 0;
-       struct inpcb *inp = sotoinpcb(so);
-       register struct tcpcb *tp = intotcpcb(inp);
+       int error = 0, s;
+       struct inpcb *inp;
+       register struct tcpcb *tp;
        register struct mbuf *m;
        register int i;
 
        register struct mbuf *m;
        register int i;
 
-       if (level != IPPROTO_TCP)
-               return (ip_ctloutput(op, so, level, optname, mp));
+       s = splnet();
+       inp = sotoinpcb(so);
+       if (inp == NULL) {
+               splx(s);
+               return (ECONNRESET);
+       }
+       if (level != IPPROTO_TCP) {
+               error = ip_ctloutput(op, so, level, optname, mp);
+               splx(s);
+               return (error);
+       }
+       tp = intotcpcb(inp);
 
        switch (op) {
 
 
        switch (op) {
 
@@ -376,6 +390,7 @@ tcp_ctloutput(op, so, level, optname, mp)
                }
                break;
        }
                }
                break;
        }
+       splx(s);
        return (error);
 }
 #endif
        return (error);
 }
 #endif