[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.56.2.7 and 1.78

version 1.56.2.7, 2002/09/06 08:48:16 version 1.78, 2003/02/26 06:31:11
Line 95  __KERNEL_RCSID(0, "$NetBSD$");
Line 95  __KERNEL_RCSID(0, "$NetBSD$");
   
 #include <uvm/uvm.h>  #include <uvm/uvm.h>
   
 static void     filt_sordetach(struct knote *kn);  
 static int      filt_soread(struct knote *kn, long hint);  
 static void     filt_sowdetach(struct knote *kn);  
 static int      filt_sowrite(struct knote *kn, long hint);  
 static int      filt_solisten(struct knote *kn, long hint);  
   
 static const struct filterops solisten_filtops =  
         { 1, NULL, filt_sordetach, filt_solisten };  
 const struct filterops soread_filtops =  
         { 1, NULL, filt_sordetach, filt_soread };  
 const struct filterops sowrite_filtops =  
         { 1, NULL, filt_sowdetach, filt_sowrite };  
   
 struct pool     socket_pool;  struct pool     socket_pool;
   
   MALLOC_DEFINE(M_SOOPTS, "soopts", "socket options");
   MALLOC_DEFINE(M_SONAME, "soname", "socket name");
   
 extern int      somaxconn;                      /* patchable (XXX sysctl) */  extern int      somaxconn;                      /* patchable (XXX sysctl) */
 int             somaxconn = SOMAXCONN;  int             somaxconn = SOMAXCONN;
   
Line 164  int sokvawaiters;
Line 154  int sokvawaiters;
 #define SOCK_LOAN_CHUNK         65536  #define SOCK_LOAN_CHUNK         65536
   
 static void  static void
 sodoloanfree(caddr_t buf, u_int size)  sodoloanfree(caddr_t buf, size_t size)
 {  {
         struct vm_page **pgs;          struct vm_page **pgs;
         vaddr_t va, sva, eva;          vaddr_t va, sva, eva;
Line 234  sodopendfree(struct socket *so)
Line 224  sodopendfree(struct socket *so)
 }  }
   
 static void  static void
 soloanfree(struct mbuf *m, caddr_t buf, u_int size, void *arg)  soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg)
 {  {
         struct socket *so = arg;          struct socket *so = arg;
         int s;          int s;
Line 355  socreate(int dom, struct socket **aso, i
Line 345  socreate(int dom, struct socket **aso, i
         so->so_proto = prp;          so->so_proto = prp;
         so->so_send = sosend;          so->so_send = sosend;
         so->so_receive = soreceive;          so->so_receive = soreceive;
   #ifdef MBUFTRACE
           so->so_rcv.sb_mowner = &prp->pr_domain->dom_mowner;
           so->so_snd.sb_mowner = &prp->pr_domain->dom_mowner;
           so->so_mowner = &prp->pr_domain->dom_mowner;
   #endif
         if (p != 0)          if (p != 0)
                 so->so_uid = p->p_ucred->cr_uid;                  so->so_uid = p->p_ucred->cr_uid;
         error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0,          error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0,
Line 691  sosend(struct socket *so, struct mbuf *a
Line 686  sosend(struct socket *so, struct mbuf *a
                                         top->m_flags |= M_EOR;                                          top->m_flags |= M_EOR;
                         } else do {                          } else do {
                                 if (top == 0) {                                  if (top == 0) {
                                         MGETHDR(m, M_WAIT, MT_DATA);                                          m = m_gethdr(M_WAIT, MT_DATA);
                                         mlen = MHLEN;                                          mlen = MHLEN;
                                         m->m_pkthdr.len = 0;                                          m->m_pkthdr.len = 0;
                                         m->m_pkthdr.rcvif = (struct ifnet *)0;                                          m->m_pkthdr.rcvif = (struct ifnet *)0;
                                 } else {                                  } else {
                                         MGET(m, M_WAIT, MT_DATA);                                          m = m_get(M_WAIT, MT_DATA);
                                         mlen = MLEN;                                          mlen = MLEN;
                                 }                                  }
                                   MCLAIM(m, so->so_snd.sb_mowner);
                                 if (use_sosend_loan &&                                  if (use_sosend_loan &&
                                     uio->uio_iov->iov_len >= SOCK_LOAN_THRESH &&                                      uio->uio_iov->iov_len >= SOCK_LOAN_THRESH &&
                                     space >= SOCK_LOAN_THRESH &&                                      space >= SOCK_LOAN_THRESH &&
Line 710  sosend(struct socket *so, struct mbuf *a
Line 706  sosend(struct socket *so, struct mbuf *a
                                 }                                  }
                                 if (resid >= MINCLSIZE && space >= MCLBYTES) {                                  if (resid >= MINCLSIZE && space >= MCLBYTES) {
                                         SOSEND_COUNTER_INCR(&sosend_copy_big);                                          SOSEND_COUNTER_INCR(&sosend_copy_big);
                                         MCLGET(m, M_WAIT);                                          m_clget(m, M_WAIT);
                                         if ((m->m_flags & M_EXT) == 0)                                          if ((m->m_flags & M_EXT) == 0)
                                                 goto nopages;                                                  goto nopages;
                                         mlen = MCLBYTES;                                          mlen = MCLBYTES;
Line 1354  sosetopt(struct socket *so, int level, i
Line 1350  sosetopt(struct socket *so, int level, i
                                 goto bad;                                  goto bad;
                         }                          }
                         tv = mtod(m, struct timeval *);                          tv = mtod(m, struct timeval *);
                         if (tv->tv_sec * hz + tv->tv_usec / tick > SHRT_MAX) {                          if (tv->tv_sec > (SHRT_MAX - tv->tv_usec / tick) / hz) {
                                 error = EDOM;                                  error = EDOM;
                                 goto bad;                                  goto bad;
                         }                          }
                         val = tv->tv_sec * hz + tv->tv_usec / tick;                          val = tv->tv_sec * hz + tv->tv_usec / tick;
                           if (val == 0 && tv->tv_usec != 0)
                                   val = 1;
   
                         switch (optname) {                          switch (optname) {
   
Line 1483  sohasoutofband(struct socket *so)
Line 1481  sohasoutofband(struct socket *so)
         selwakeup(&so->so_rcv.sb_sel);          selwakeup(&so->so_rcv.sb_sel);
 }  }
   
   
 int  
 soo_kqfilter(struct file *fp, struct knote *kn)  
 {  
         struct socket   *so;  
         struct sockbuf  *sb;  
   
         so = (struct socket *)kn->kn_fp->f_data;  
         switch (kn->kn_filter) {  
         case EVFILT_READ:  
                 if (so->so_options & SO_ACCEPTCONN)  
                         kn->kn_fop = &solisten_filtops;  
                 else  
                         kn->kn_fop = &soread_filtops;  
                 sb = &so->so_rcv;  
                 break;  
         case EVFILT_WRITE:  
                 kn->kn_fop = &sowrite_filtops;  
                 sb = &so->so_snd;  
                 break;  
         default:  
                 return (1);  
         }  
         SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext);  
         sb->sb_flags |= SB_KNOTE;  
         return (0);  
 }  
   
 static void  static void
 filt_sordetach(struct knote *kn)  filt_sordetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
         SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_rcv.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist))          if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))
                 so->so_rcv.sb_flags &= ~SB_KNOTE;                  so->so_rcv.sb_flags &= ~SB_KNOTE;
 }  }
   
Line 1548  filt_sowdetach(struct knote *kn)
Line 1518  filt_sowdetach(struct knote *kn)
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
         SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_snd.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist))          if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))
                 so->so_snd.sb_flags &= ~SB_KNOTE;                  so->so_snd.sb_flags &= ~SB_KNOTE;
 }  }
   
Line 1591  filt_solisten(struct knote *kn, long hin
Line 1561  filt_solisten(struct knote *kn, long hin
         kn->kn_data = so->so_qlen;          kn->kn_data = so->so_qlen;
         return (kn->kn_data > 0);          return (kn->kn_data > 0);
 }  }
   
   static const struct filterops solisten_filtops =
           { 1, NULL, filt_sordetach, filt_solisten };
   static const struct filterops soread_filtops =
           { 1, NULL, filt_sordetach, filt_soread };
   static const struct filterops sowrite_filtops =
           { 1, NULL, filt_sowdetach, filt_sowrite };
   
   int
   soo_kqfilter(struct file *fp, struct knote *kn)
   {
           struct socket   *so;
           struct sockbuf  *sb;
   
           so = (struct socket *)kn->kn_fp->f_data;
           switch (kn->kn_filter) {
           case EVFILT_READ:
                   if (so->so_options & SO_ACCEPTCONN)
                           kn->kn_fop = &solisten_filtops;
                   else
                           kn->kn_fop = &soread_filtops;
                   sb = &so->so_rcv;
                   break;
           case EVFILT_WRITE:
                   kn->kn_fop = &sowrite_filtops;
                   sb = &so->so_snd;
                   break;
           default:
                   return (1);
           }
           SLIST_INSERT_HEAD(&sb->sb_sel.sel_klist, kn, kn_selnext);
           sb->sb_flags |= SB_KNOTE;
           return (0);
   }
   

Legend:
Removed from v.1.56.2.7  
changed lines
  Added in v.1.78

CVSweb <webmaster@jp.NetBSD.org>