[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.215.4.4 and 1.240

version 1.215.4.4, 2014/05/18 17:46:08 version 1.240, 2015/05/02 17:18:03
Line 528  socreate(int dom, struct socket **aso, i
Line 528  socreate(int dom, struct socket **aso, i
         so = soget(true);          so = soget(true);
         so->so_type = type;          so->so_type = type;
         so->so_proto = prp;          so->so_proto = prp;
         so->so_refcnt = 1;  
   
         so->so_send = sosend;          so->so_send = sosend;
         so->so_receive = soreceive;          so->so_receive = soreceive;
 #ifdef MBUFTRACE  #ifdef MBUFTRACE
Line 542  socreate(int dom, struct socket **aso, i
Line 540  socreate(int dom, struct socket **aso, i
         so->so_cpid = l->l_proc->p_pid;          so->so_cpid = l->l_proc->p_pid;
   
         /*          /*
          * Lock assigned and taken during pr_attach, unless we share           * Lock assigned and taken during PCB attach, unless we share
          * the lock with another socket, e.g. socketpair(2) case.           * the lock with another socket, e.g. socketpair(2) case.
          */           */
         if (lockso) {          if (lockso) {
                 lock = lockso->so_lock;                  lock = lockso->so_lock;
                 so->so_lock = lock;                  so->so_lock = lock;
                 mutex_obj_hold(lock);                  mutex_obj_hold(lock);
                   mutex_enter(lock);
         }          }
   
           /* Attach the PCB (returns with the socket lock held). */
         error = (*prp->pr_usrreqs->pr_attach)(so, proto);          error = (*prp->pr_usrreqs->pr_attach)(so, proto);
           KASSERT(solocked(so));
   
         if (error) {          if (error) {
                 solock(so);  
                 KASSERT(so->so_pcb == NULL);                  KASSERT(so->so_pcb == NULL);
                 so->so_state |= SS_NOFDREF;                  so->so_state |= SS_NOFDREF;
                 sofree(so);                  sofree(so);
                 return error;                  return error;
         }          }
         so->so_cred = kauth_cred_dup(l->l_cred);          so->so_cred = kauth_cred_dup(l->l_cred);
           sounlock(so);
   
         *aso = so;          *aso = so;
         return 0;          return 0;
Line 598  fsocreate(int domain, struct socket **so
Line 600  fsocreate(int domain, struct socket **so
         if (flags & SOCK_NONBLOCK) {          if (flags & SOCK_NONBLOCK) {
                 so->so_state |= SS_NBIO;                  so->so_state |= SS_NBIO;
         }          }
         fp->f_data = so;          fp->f_socket = so;
         fd_affix(curproc, fp, fd);          fd_affix(curproc, fp, fd);
   
         if (sop != NULL) {          if (sop != NULL) {
Line 608  fsocreate(int domain, struct socket **so
Line 610  fsocreate(int domain, struct socket **so
         return error;          return error;
 }  }
   
 void  
 soref(struct socket *so)  
 {  
         atomic_inc_uint(&so->so_refcnt);  
 }  
   
 void  
 sounref(struct socket *so)  
 {  
         if (atomic_dec_uint_nv(&so->so_refcnt) > 0) {  
                 return;  
         }  
         soput(so);  
 }  
   
 int  int
 sofamily(const struct socket *so)  sofamily(const struct socket *so)
 {  {
Line 637  sofamily(const struct socket *so)
Line 624  sofamily(const struct socket *so)
 }  }
   
 int  int
 sobind(struct socket *so, struct mbuf *nam, struct lwp *l)  sobind(struct socket *so, struct sockaddr *nam, struct lwp *l)
 {  {
         int error;          int     error;
   
         solock(so);          solock(so);
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          if (nam->sa_family != so->so_proto->pr_domain->dom_family) {
             PRU_BIND, NULL, nam, NULL, l);                  sounlock(so);
                   return EAFNOSUPPORT;
           }
           error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l);
         sounlock(so);          sounlock(so);
         return error;          return error;
 }  }
Line 651  sobind(struct socket *so, struct mbuf *n
Line 641  sobind(struct socket *so, struct mbuf *n
 int  int
 solisten(struct socket *so, int backlog, struct lwp *l)  solisten(struct socket *so, int backlog, struct lwp *l)
 {  {
         int error;          int     error;
   
         solock(so);          solock(so);
         if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |          if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
Line 659  solisten(struct socket *so, int backlog,
Line 649  solisten(struct socket *so, int backlog,
                 sounlock(so);                  sounlock(so);
                 return EINVAL;                  return EINVAL;
         }          }
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l);
             PRU_LISTEN, NULL, NULL, NULL, l);  
         if (error != 0) {          if (error != 0) {
                 sounlock(so);                  sounlock(so);
                 return error;                  return error;
Line 677  solisten(struct socket *so, int backlog,
Line 666  solisten(struct socket *so, int backlog,
 void  void
 sofree(struct socket *so)  sofree(struct socket *so)
 {  {
           u_int refs;
   
         KASSERT(solocked(so));          KASSERT(solocked(so));
   
Line 706  sofree(struct socket *so)
Line 696  sofree(struct socket *so)
         KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));          KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));
         KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));          KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
         sorflush(so);          sorflush(so);
           refs = so->so_aborting; /* XXX */
         /* Remove acccept filter if one is present. */          /* Remove acccept filter if one is present. */
         if (so->so_accf != NULL)          if (so->so_accf != NULL)
                 (void)accept_filt_clear(so);                  (void)accept_filt_clear(so);
         sounlock(so);          sounlock(so);
           if (refs == 0)          /* XXX */
         /* Will soput() if the last reference. */                  soput(so);
         sounref(so);  
 }  }
   
 /*  /*
Line 768  soclose(struct socket *so)
Line 758  soclose(struct socket *so)
         }          }
  drop:   drop:
         if (so->so_pcb) {          if (so->so_pcb) {
                   KASSERT(solocked(so));
                 (*so->so_proto->pr_usrreqs->pr_detach)(so);                  (*so->so_proto->pr_usrreqs->pr_detach)(so);
         }          }
  discard:   discard:
Line 786  soabort(struct socket *so)
Line 777  soabort(struct socket *so)
 {  {
         u_int refs;          u_int refs;
         int error;          int error;
   
         KASSERT(solocked(so));          KASSERT(solocked(so));
         KASSERT(so->so_head == NULL);          KASSERT(so->so_head == NULL);
   
         soref(so);          so->so_aborting++;              /* XXX */
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          error = (*so->so_proto->pr_usrreqs->pr_abort)(so);
             PRU_ABORT, NULL, NULL, NULL, NULL);          refs = --so->so_aborting;       /* XXX */
         refs = so->so_refcnt;          if (error || (refs == 0)) {
         sounref(so);  
   
         /* XXX: Fix PRU_ABORT to behave consistently. */  
         if (error || refs == 1) {  
                 sofree(so);                  sofree(so);
         } else {          } else {
                 sounlock(so);                  sounlock(so);
         }          }
         sounref(so);  
         return error;          return error;
 }  }
   
 int  int
 soaccept(struct socket *so, struct mbuf *nam)  soaccept(struct socket *so, struct sockaddr *nam)
 {  {
         int error;          int error;
   
Line 815  soaccept(struct socket *so, struct mbuf 
Line 801  soaccept(struct socket *so, struct mbuf 
         KASSERT((so->so_state & SS_NOFDREF) != 0);          KASSERT((so->so_state & SS_NOFDREF) != 0);
   
         so->so_state &= ~SS_NOFDREF;          so->so_state &= ~SS_NOFDREF;
   
         if ((so->so_state & SS_ISDISCONNECTED) == 0 ||          if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
             (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)              (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam);
                     PRU_ACCEPT, NULL, nam, NULL, NULL);  
         else          else
                 error = ECONNABORTED;                  error = ECONNABORTED;
   
Line 827  soaccept(struct socket *so, struct mbuf 
Line 811  soaccept(struct socket *so, struct mbuf 
 }  }
   
 int  int
 soconnect(struct socket *so, struct mbuf *nam, struct lwp *l)  soconnect(struct socket *so, struct sockaddr *nam, struct lwp *l)
 {  {
         int error;          int error;
   
Line 846  soconnect(struct socket *so, struct mbuf
Line 830  soconnect(struct socket *so, struct mbuf
             (error = sodisconnect(so))))              (error = sodisconnect(so))))
                 error = EISCONN;                  error = EISCONN;
         else          else
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l);
                     PRU_CONNECT, NULL, nam, NULL, l);  
   
         return error;          return error;
 }  }
Line 857  soconnect2(struct socket *so1, struct so
Line 840  soconnect2(struct socket *so1, struct so
 {  {
         KASSERT(solocked2(so1, so2));          KASSERT(solocked2(so1, so2));
   
         return (*so1->so_proto->pr_usrreqs->pr_generic)(so1,          return (*so1->so_proto->pr_usrreqs->pr_connect2)(so1, so2);
             PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, NULL);  
 }  }
   
 int  int
Line 873  sodisconnect(struct socket *so)
Line 855  sodisconnect(struct socket *so)
         } else if (so->so_state & SS_ISDISCONNECTING) {          } else if (so->so_state & SS_ISDISCONNECTING) {
                 error = EALREADY;                  error = EALREADY;
         } else {          } else {
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so);
                     PRU_DISCONNECT, NULL, NULL, NULL, NULL);  
         }          }
         return (error);          return (error);
 }  }
Line 1070  sosend(struct socket *so, struct mbuf *a
Line 1051  sosend(struct socket *so, struct mbuf *a
                                 so->so_options |= SO_DONTROUTE;                                  so->so_options |= SO_DONTROUTE;
                         if (resid > 0)                          if (resid > 0)
                                 so->so_state |= SS_MORETOCOME;                                  so->so_state |= SS_MORETOCOME;
                         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                          if (flags & MSG_OOB) {
                             (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,                                  error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so,
                             top, addr, control, curlwp);                                      top, control);
                           } else {
                                   struct sockaddr *sin = NULL;
                                   if (addr) {
                                           sin = mtod(addr, struct sockaddr *);
                                   }
                                   error = (*so->so_proto->pr_usrreqs->pr_send)(so,
                                       top, sin, control, l);
                           }
                         if (dontroute)                          if (dontroute)
                                 so->so_options &= ~SO_DONTROUTE;                                  so->so_options &= ~SO_DONTROUTE;
                         if (resid > 0)                          if (resid > 0)
Line 1184  soreceive(struct socket *so, struct mbuf
Line 1173  soreceive(struct socket *so, struct mbuf
         if (flags & MSG_OOB) {          if (flags & MSG_OOB) {
                 m = m_get(M_WAIT, MT_DATA);                  m = m_get(M_WAIT, MT_DATA);
                 solock(so);                  solock(so);
                 error = (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVOOB, m,                  error = (*pr->pr_usrreqs->pr_recvoob)(so, m, flags & MSG_PEEK);
                     (struct mbuf *)(long)(flags & MSG_PEEK), NULL, l);  
                 sounlock(so);                  sounlock(so);
                 if (error)                  if (error)
                         goto bad;                          goto bad;
Line 1552  soreceive(struct socket *so, struct mbuf
Line 1540  soreceive(struct socket *so, struct mbuf
                          * get it filled again.                           * get it filled again.
                          */                           */
                         if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)                          if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)
                                 (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD,                                  (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
                                     NULL, (struct mbuf *)(long)flags, NULL, l);  
                         SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");                          SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
                         SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");                          SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
                         if (wakeup_state & SS_RESTARTSYS)                          if (wakeup_state & SS_RESTARTSYS)
Line 1594  soreceive(struct socket *so, struct mbuf
Line 1581  soreceive(struct socket *so, struct mbuf
                 SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");                  SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
                 SBLASTMBUFCHK(&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_usrreqs->pr_generic)(so, PRU_RCVD, NULL,                          (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
                             (struct mbuf *)(long)flags, NULL, l);  
         }          }
         if (orig_resid == uio->uio_resid && orig_resid &&          if (orig_resid == uio->uio_resid && orig_resid &&
             (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {              (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
Line 1629  soshutdown(struct socket *so, int how)
Line 1615  soshutdown(struct socket *so, int how)
                 error = 0;                  error = 0;
         }          }
         if (how == SHUT_WR || how == SHUT_RDWR)          if (how == SHUT_WR || how == SHUT_RDWR)
                 error = (*pr->pr_usrreqs->pr_generic)(so,                  error = (*pr->pr_usrreqs->pr_shutdown)(so);
                     PRU_SHUTDOWN, NULL, NULL, NULL, NULL);  
   
         return error;          return error;
 }  }
Line 2197  filt_sordetach(struct knote *kn)
Line 2182  filt_sordetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
         solock(so);          solock(so);
         SLIST_REMOVE(&so->so_rcv.sb_sel.sel_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.sel_klist))          if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))
Line 2212  filt_soread(struct knote *kn, long hint)
Line 2197  filt_soread(struct knote *kn, long hint)
         struct socket   *so;          struct socket   *so;
         int rv;          int rv;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
         if (hint != NOTE_SUBMIT)          if (hint != NOTE_SUBMIT)
                 solock(so);                  solock(so);
         kn->kn_data = so->so_rcv.sb_cc;          kn->kn_data = so->so_rcv.sb_cc;
Line 2236  filt_sowdetach(struct knote *kn)
Line 2221  filt_sowdetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
         solock(so);          solock(so);
         SLIST_REMOVE(&so->so_snd.sb_sel.sel_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.sel_klist))          if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))
Line 2251  filt_sowrite(struct knote *kn, long hint
Line 2236  filt_sowrite(struct knote *kn, long hint
         struct socket   *so;          struct socket   *so;
         int rv;          int rv;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
         if (hint != NOTE_SUBMIT)          if (hint != NOTE_SUBMIT)
                 solock(so);                  solock(so);
         kn->kn_data = sbspace(&so->so_snd);          kn->kn_data = sbspace(&so->so_snd);
Line 2280  filt_solisten(struct knote *kn, long hin
Line 2265  filt_solisten(struct knote *kn, long hin
         struct socket   *so;          struct socket   *so;
         int rv;          int rv;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
   
         /*          /*
          * Set kn_data to number of incoming connections, not           * Set kn_data to number of incoming connections, not
Line 2308  soo_kqfilter(struct file *fp, struct kno
Line 2293  soo_kqfilter(struct file *fp, struct kno
         struct socket   *so;          struct socket   *so;
         struct sockbuf  *sb;          struct sockbuf  *sb;
   
         so = ((file_t *)kn->kn_obj)->f_data;          so = ((file_t *)kn->kn_obj)->f_socket;
         solock(so);          solock(so);
         switch (kn->kn_filter) {          switch (kn->kn_filter) {
         case EVFILT_READ:          case EVFILT_READ:

Legend:
Removed from v.1.215.4.4  
changed lines
  Added in v.1.240

CVSweb <webmaster@jp.NetBSD.org>