only read oob data once, unless PEEK; provision for TCP options
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 17 Sep 1985 14:23:53 +0000 (06:23 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 17 Sep 1985 14:23:53 +0000 (06:23 -0800)
SCCS-vsn: sys/netinet/tcp_usrreq.c 6.7

usr/src/sys/netinet/tcp_usrreq.c

index 60fdf36..c243372 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)tcp_usrreq.c        6.6 (Berkeley) %G%
+ *     @(#)tcp_usrreq.c        6.7 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -246,8 +246,9 @@ tcp_usrreq(so, req, m, nam, rights)
                return (0);
 
        case PRU_RCVOOB:
                return (0);
 
        case PRU_RCVOOB:
-               if (so->so_oobmark == 0 &&
-                   (so->so_state & SS_RCVATMARK) == 0) {
+               if ((so->so_oobmark == 0 &&
+                   (so->so_state & SS_RCVATMARK) == 0) ||
+                   tp->t_oobflags & TCPOOB_HADDATA) {
                        error = EINVAL;
                        break;
                }
                        error = EINVAL;
                        break;
                }
@@ -257,6 +258,8 @@ tcp_usrreq(so, req, m, nam, rights)
                }
                m->m_len = 1;
                *mtod(m, caddr_t) = tp->t_iobc;
                }
                m->m_len = 1;
                *mtod(m, caddr_t) = tp->t_iobc;
+               if (((int)nam & MSG_PEEK) == 0)
+                       tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA);
                break;
 
        case PRU_SENDOOB:
                break;
 
        case PRU_SENDOOB:
@@ -298,6 +301,18 @@ tcp_usrreq(so, req, m, nam, rights)
        return (error);
 }
 
        return (error);
 }
 
+tcp_ctloutput(op, so, level, optname, m)
+       int op;
+       struct socket *so;
+       int level, optname;
+       struct mbuf **m;
+{
+       if (level != IPPROTO_TCP)
+               return (ip_ctloutput(op, so, level, optname, m));
+       /* INCOMPLETE */
+       return (0);
+}
+
 int    tcp_sendspace = 1024*4;
 int    tcp_recvspace = 1024*4;
 /*
 int    tcp_sendspace = 1024*4;
 int    tcp_recvspace = 1024*4;
 /*