[BACK]Return to uipc_socket.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/uipc_socket.c between version 1.66.2.3 and 1.67

version 1.66.2.3, 2002/08/29 05:23:14 version 1.67, 2002/06/10 20:43:16
Line 134  soinit(void)
Line 134  soinit(void)
 #endif /* SOSEND_COUNTERS */  #endif /* SOSEND_COUNTERS */
 }  }
   
 #ifdef SOSEND_NO_LOAN  #ifdef SOSEND_LOAN
 int use_sosend_loan = 0;  
 #else  
 int use_sosend_loan = 1;  int use_sosend_loan = 1;
   #else
   int use_sosend_loan = 0;
 #endif  #endif
   
 struct mbuf *so_pendfree;  struct mbuf *so_pendfree;
Line 894  soreceive(struct socket *so, struct mbuf
Line 894  soreceive(struct socket *so, struct mbuf
                         error = EWOULDBLOCK;                          error = EWOULDBLOCK;
                         goto release;                          goto release;
                 }                  }
                 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");  
                 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1");  
                 sbunlock(&so->so_rcv);                  sbunlock(&so->so_rcv);
                 error = sbwait(&so->so_rcv);                  error = sbwait(&so->so_rcv);
                 splx(s);                  splx(s);
Line 904  soreceive(struct socket *so, struct mbuf
Line 902  soreceive(struct socket *so, struct mbuf
                 goto restart;                  goto restart;
         }          }
  dontblock:   dontblock:
         /*  
          * On entry here, m points to the first record of the socket buffer.  
          * While we process the initial mbufs containing address and control  
          * info, we save a copy of m->m_nextpkt into nextrecord.  
          */  
 #ifdef notyet /* XXXX */  #ifdef notyet /* XXXX */
         if (uio->uio_procp)          if (uio->uio_procp)
                 uio->uio_procp->p_stats->p_ru.ru_msgrcv++;                  uio->uio_procp->p_stats->p_ru.ru_msgrcv++;
 #endif  #endif
         KASSERT(m == so->so_rcv.sb_mb);  
         SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");  
         SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");  
         nextrecord = m->m_nextpkt;          nextrecord = m->m_nextpkt;
         if (pr->pr_flags & PR_ADDR) {          if (pr->pr_flags & PR_ADDR) {
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
Line 968  soreceive(struct socket *so, struct mbuf
Line 958  soreceive(struct socket *so, struct mbuf
                         controlp = &(*controlp)->m_next;                          controlp = &(*controlp)->m_next;
                 }                  }
         }          }
   
         /*  
          * If m is non-NULL, we have some data to read.  From now on,  
          * make sure to keep sb_lastrecord consistent when working on  
          * the last packet on the chain (nextrecord == NULL) and we  
          * change m->m_nextpkt.  
          */  
         if (m) {          if (m) {
                 if ((flags & MSG_PEEK) == 0) {                  if ((flags & MSG_PEEK) == 0)
                         m->m_nextpkt = nextrecord;                          m->m_nextpkt = nextrecord;
                         /*  
                          * If nextrecord == NULL (this is a single chain),  
                          * then sb_lastrecord may not be valid here if m  
                          * was changed earlier.  
                          */  
                         if (nextrecord == NULL) {  
                                 KASSERT(so->so_rcv.sb_mb == m);  
                                 so->so_rcv.sb_lastrecord = m;  
                         }  
                 }  
                 type = m->m_type;                  type = m->m_type;
                 if (type == MT_OOBDATA)                  if (type == MT_OOBDATA)
                         flags |= MSG_OOB;                          flags |= MSG_OOB;
         } else {  
                 if ((flags & MSG_PEEK) == 0) {  
                         KASSERT(so->so_rcv.sb_mb == m);  
                         so->so_rcv.sb_mb = nextrecord;  
                         SB_EMPTY_FIXUP(&so->so_rcv);  
                 }  
         }          }
         SBLASTRECORDCHK(&so->so_rcv, "soreceive 2");  
         SBLASTMBUFCHK(&so->so_rcv, "soreceive 2");  
   
         moff = 0;          moff = 0;
         offset = 0;          offset = 0;
         while (m && uio->uio_resid > 0 && error == 0) {          while (m && uio->uio_resid > 0 && error == 0) {
Line 1028  soreceive(struct socket *so, struct mbuf
Line 992  soreceive(struct socket *so, struct mbuf
                  * block interrupts again.                   * block interrupts again.
                  */                   */
                 if (mp == 0) {                  if (mp == 0) {
                         SBLASTRECORDCHK(&so->so_rcv, "soreceive uiomove");  
                         SBLASTMBUFCHK(&so->so_rcv, "soreceive uiomove");  
                         splx(s);                          splx(s);
                         error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio);                          error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio);
                         s = splsoftnet();                          s = splsoftnet();
Line 1071  soreceive(struct socket *so, struct mbuf
Line 1033  soreceive(struct socket *so, struct mbuf
                                         MFREE(m, so->so_rcv.sb_mb);                                          MFREE(m, so->so_rcv.sb_mb);
                                         m = so->so_rcv.sb_mb;                                          m = so->so_rcv.sb_mb;
                                 }                                  }
                                 /*                                  if (m)
                                  * If m != NULL, we also know that  
                                  * so->so_rcv.sb_mb != NULL.  
                                  */  
                                 KASSERT(so->so_rcv.sb_mb == m);  
                                 if (m) {  
                                         m->m_nextpkt = nextrecord;                                          m->m_nextpkt = nextrecord;
                                         if (nextrecord == NULL)  
                                                 so->so_rcv.sb_lastrecord = m;  
                                 } else {  
                                         so->so_rcv.sb_mb = nextrecord;  
                                         SB_EMPTY_FIXUP(&so->so_rcv);  
                                 }  
                                 SBLASTRECORDCHK(&so->so_rcv, "soreceive 3");  
                                 SBLASTMBUFCHK(&so->so_rcv, "soreceive 3");  
                         }                          }
                 } else {                  } else {
                         if (flags & MSG_PEEK)                          if (flags & MSG_PEEK)
Line 1124  soreceive(struct socket *so, struct mbuf
Line 1073  soreceive(struct socket *so, struct mbuf
                     !sosendallatonce(so) && !nextrecord) {                      !sosendallatonce(so) && !nextrecord) {
                         if (so->so_error || so->so_state & SS_CANTRCVMORE)                          if (so->so_error || so->so_state & SS_CANTRCVMORE)
                                 break;                                  break;
                         /*  
                          * If we are peeking and the socket receive buffer is  
                          * full, stop since we can't get more data to peek at.  
                          */  
                         if ((flags & MSG_PEEK) && sbspace(&so->so_rcv) <= 0)  
                                 break;  
                         /*  
                          * If we've drained the socket buffer, tell the  
                          * protocol in case it needs to do something to  
                          * get it filled again.  
                          */  
                         if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)  
                                 (*pr->pr_usrreq)(so, PRU_RCVD,  
                                     (struct mbuf *)0,  
                                     (struct mbuf *)(long)flags,  
                                     (struct mbuf *)0,  
                                     (struct proc *)0);  
                         SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");  
                         SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");  
                         error = sbwait(&so->so_rcv);                          error = sbwait(&so->so_rcv);
                         if (error) {                          if (error) {
                                 sbunlock(&so->so_rcv);                                  sbunlock(&so->so_rcv);
Line 1160  soreceive(struct socket *so, struct mbuf
Line 1090  soreceive(struct socket *so, struct mbuf
                         (void) sbdroprecord(&so->so_rcv);                          (void) sbdroprecord(&so->so_rcv);
         }          }
         if ((flags & MSG_PEEK) == 0) {          if ((flags & MSG_PEEK) == 0) {
                 if (m == 0) {                  if (m == 0)
                         /*  
                          * First part is an inline SB_EMPTY_FIXUP().  Second  
                          * part makes sure sb_lastrecord is up-to-date if  
                          * there is still data in the socket buffer.  
                          */  
                         so->so_rcv.sb_mb = nextrecord;                          so->so_rcv.sb_mb = nextrecord;
                         if (so->so_rcv.sb_mb == NULL) {  
                                 so->so_rcv.sb_mbtail = NULL;  
                                 so->so_rcv.sb_lastrecord = NULL;  
                         } else if (nextrecord->m_nextpkt == NULL)  
                                 so->so_rcv.sb_lastrecord = nextrecord;  
                 }  
                 SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");  
                 SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");  
                 if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)                  if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
                         (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,                          (*pr->pr_usrreq)(so, PRU_RCVD, (struct mbuf *)0,
                             (struct mbuf *)(long)flags, (struct mbuf *)0,                              (struct mbuf *)(long)flags, (struct mbuf *)0,

Legend:
Removed from v.1.66.2.3  
changed lines
  Added in v.1.67

CVSweb <webmaster@jp.NetBSD.org>