ioctl cmd arg is u_long
[unix-history] / usr / src / sys / netinet / tcp_usrreq.c
index 686b65d..27a2a6e 100644 (file)
@@ -1,43 +1,42 @@
 /*
 /*
- * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1982, 1986, 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)tcp_usrreq.c        7.16 (Berkeley) %G%
+ *     @(#)tcp_usrreq.c        8.3 (Berkeley) %G%
  */
 
  */
 
-#include "param.h"
-#include "systm.h"
-#include "malloc.h"
-#include "mbuf.h"
-#include "socket.h"
-#include "socketvar.h"
-#include "protosw.h"
-#include "errno.h"
-#include "stat.h"
-
-#include "../net/if.h"
-#include "../net/route.h"
-
-#include "in.h"
-#include "in_systm.h"
-#include "ip.h"
-#include "in_pcb.h"
-#include "ip_var.h"
-#include "tcp.h"
-#include "tcp_fsm.h"
-#include "tcp_seq.h"
-#include "tcp_timer.h"
-#include "tcp_var.h"
-#include "tcpip.h"
-#include "tcp_debug.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/protosw.h>
+#include <sys/errno.h>
+#include <sys/stat.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/in_pcb.h>
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcp_fsm.h>
+#include <netinet/tcp_seq.h>
+#include <netinet/tcp_timer.h>
+#include <netinet/tcp_var.h>
+#include <netinet/tcpip.h>
+#include <netinet/tcp_debug.h>
 
 /*
  * TCP protocol interface to socket abstraction.
  */
 extern char *tcpstates[];
 
 /*
  * TCP protocol interface to socket abstraction.
  */
 extern char *tcpstates[];
-struct tcpcb *tcp_newtcpcb();
 
 /*
  * Process a TCP user request for TCP tb.  If this is a send request
 
 /*
  * Process a TCP user request for TCP tb.  If this is a send request
@@ -45,6 +44,7 @@ struct        tcpcb *tcp_newtcpcb();
  * (called from the software clock routine), then timertype tells which timer.
  */
 /*ARGSUSED*/
  * (called from the software clock routine), then timertype tells which timer.
  */
 /*ARGSUSED*/
+int
 tcp_usrreq(so, req, m, nam, control)
        struct socket *so;
        int req;
 tcp_usrreq(so, req, m, nam, control)
        struct socket *so;
        int req;
@@ -58,7 +58,7 @@ tcp_usrreq(so, req, m, nam, control)
 
 #if BSD>=43
        if (req == PRU_CONTROL)
 
 #if BSD>=43
        if (req == PRU_CONTROL)
-               return (in_control(so, (int)m, (caddr_t)nam,
+               return (in_control(so, (u_long)m, (caddr_t)nam,
                        (struct ifnet *)control));
        if (control && control->m_len) {
                m_freem(control);
                        (struct ifnet *)control));
        if (control && control->m_len) {
                m_freem(control);
@@ -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;
@@ -197,16 +201,9 @@ tcp_usrreq(so, req, m, nam, control)
         * done at higher levels; just return the address
         * of the peer, storing through addr.
         */
         * done at higher levels; just return the address
         * of the peer, storing through addr.
         */
-       case PRU_ACCEPT: {
-               struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *);
-
-               nam->m_len = sizeof (struct sockaddr_in);
-               sin->sin_family = AF_INET;
-               sin->sin_len = sizeof(*sin);
-               sin->sin_port = inp->inp_fport;
-               sin->sin_addr = inp->inp_faddr;
+       case PRU_ACCEPT:
+               in_setpeeraddr(inp, nam);
                break;
                break;
-               }
 
        /*
         * Mark the connection as being incapable of further output.
 
        /*
         * Mark the connection as being incapable of further output.
@@ -313,6 +310,7 @@ tcp_usrreq(so, req, m, nam, control)
        return (error);
 }
 
        return (error);
 }
 
+int
 #if BSD>=43
 tcp_ctloutput(op, so, level, optname, mp)
        int op;
 #if BSD>=43
 tcp_ctloutput(op, so, level, optname, mp)
        int op;
@@ -320,14 +318,26 @@ 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);
+               if (op == PRCO_SETOPT && *mp)
+                       (void) m_free(*mp);
+               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) {
 
@@ -352,7 +362,7 @@ tcp_ctloutput(op, so, level, optname, mp)
                        break;
 
                default:
                        break;
 
                default:
-                       error = EINVAL;
+                       error = ENOPROTOOPT;
                        break;
                }
                if (m)
                        break;
                }
                if (m)
@@ -371,11 +381,12 @@ tcp_ctloutput(op, so, level, optname, mp)
                        *mtod(m, int *) = tp->t_maxseg;
                        break;
                default:
                        *mtod(m, int *) = tp->t_maxseg;
                        break;
                default:
-                       error = EINVAL;
+                       error = ENOPROTOOPT;
                        break;
                }
                break;
        }
                        break;
                }
                break;
        }
+       splx(s);
        return (error);
 }
 #endif
        return (error);
 }
 #endif
@@ -388,6 +399,7 @@ u_long      tcp_recvspace = 1024*8;
  * internet protocol control block, tcp control block,
  * bufer space, and entering LISTEN state if to accept connections.
  */
  * internet protocol control block, tcp control block,
  * bufer space, and entering LISTEN state if to accept connections.
  */
+int
 tcp_attach(so)
        struct socket *so;
 {
 tcp_attach(so)
        struct socket *so;
 {