[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.250 and 1.259.2.2

version 1.250, 2016/10/10 01:22:08 version 1.259.2.2, 2018/05/02 07:20:22
Line 295  sopendfree_thread(void *v)
Line 295  sopendfree_thread(void *v)
   
                         for (; m != NULL; m = next) {                          for (; m != NULL; m = next) {
                                 next = m->m_next;                                  next = m->m_next;
                                 KASSERT((~m->m_flags & (M_EXT|M_EXT_PAGES)) == 0);                                  KASSERT((~m->m_flags & (M_EXT|M_EXT_PAGES)) ==
                                       0);
                                 KASSERT(m->m_ext.ext_refcnt == 0);                                  KASSERT(m->m_ext.ext_refcnt == 0);
   
                                 rv += m->m_ext.ext_size;                                  rv += m->m_ext.ext_size;
Line 346  sosend_loan(struct socket *so, struct ui
Line 347  sosend_loan(struct socket *so, struct ui
         int i;          int i;
   
         if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))          if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))
                 return 0L;                  return (0);
   
         if (iov->iov_len < (size_t) space)          if (iov->iov_len < (size_t) space)
                 space = iov->iov_len;                  space = iov->iov_len;
Line 362  sosend_loan(struct socket *so, struct ui
Line 363  sosend_loan(struct socket *so, struct ui
   
         lva = sokvaalloc(sva, len, so);          lva = sokvaalloc(sva, len, so);
         if (lva == 0)          if (lva == 0)
                 return 0L;                  return 0;
   
         error = uvm_loan(&uio->uio_vmspace->vm_map, sva, len,          error = uvm_loan(&uio->uio_vmspace->vm_map, sva, len,
             m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);              m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);
         if (error) {          if (error) {
                 sokvafree(lva, len);                  sokvafree(lva, len);
                 return 0L;                  return (0);
         }          }
   
         for (i = 0, va = lva; i < npgs; i++, va += PAGE_SIZE)          for (i = 0, va = lva; i < npgs; i++, va += PAGE_SIZE)
Line 434  socket_listener_cb(kauth_cred_t cred, ka
Line 435  socket_listener_cb(kauth_cred_t cred, ka
   
         case KAUTH_REQ_NETWORK_SOCKET_OPEN:          case KAUTH_REQ_NETWORK_SOCKET_OPEN:
                 /* We allow "raw" routing/bluetooth sockets to anyone. */                  /* We allow "raw" routing/bluetooth sockets to anyone. */
                 if ((u_long)arg1 == PF_ROUTE || (u_long)arg1 == PF_OROUTE                  switch ((u_long)arg1) {
                     || (u_long)arg1 == PF_BLUETOOTH) {                  case PF_ROUTE:
                   case PF_OROUTE:
                   case PF_BLUETOOTH:
                   case PF_CAN:
                         result = KAUTH_RESULT_ALLOW;                          result = KAUTH_RESULT_ALLOW;
                 } else {                          break;
                   default:
                         /* Privileged, let secmodel handle this. */                          /* Privileged, let secmodel handle this. */
                         if ((u_long)arg2 == SOCK_RAW)                          if ((u_long)arg2 == SOCK_RAW)
                                 break;                                  break;
                           result = KAUTH_RESULT_ALLOW;
                           break;
                 }                  }
   
                 result = KAUTH_RESULT_ALLOW;  
   
                 break;                  break;
   
         case KAUTH_REQ_NETWORK_SOCKET_CANSEE:          case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
Line 648  solisten(struct socket *so, int backlog,
Line 652  solisten(struct socket *so, int backlog,
         short   oldopt, oldqlimit;          short   oldopt, oldqlimit;
   
         solock(so);          solock(so);
         if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |          if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
             SS_ISDISCONNECTING)) != 0) {              SS_ISDISCONNECTING)) != 0) {
                 sounlock(so);                  sounlock(so);
                 return EINVAL;                  return EINVAL;
Line 786  soabort(struct socket *so)
Line 790  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);
   
Line 1008  sosend(struct socket *so, struct sockadd
Line 1012  sosend(struct socket *so, struct sockadd
                                     uio->uio_iov->iov_len >= sock_loan_thresh &&                                      uio->uio_iov->iov_len >= sock_loan_thresh &&
                                     space >= sock_loan_thresh &&                                      space >= sock_loan_thresh &&
                                     (len = sosend_loan(so, uio, m,                                      (len = sosend_loan(so, uio, m,
                                                        space)) != 0L) {                                                         space)) != 0) {
                                         SOSEND_COUNTER_INCR(&sosend_loan_big);                                          SOSEND_COUNTER_INCR(&sosend_loan_big);
                                         space -= len;                                          space -= len;
                                         goto have_data;                                          goto have_data;
Line 1065  sosend(struct socket *so, struct sockadd
Line 1069  sosend(struct socket *so, struct sockadd
                         if (resid > 0)                          if (resid > 0)
                                 so->so_state |= SS_MORETOCOME;                                  so->so_state |= SS_MORETOCOME;
                         if (flags & MSG_OOB) {                          if (flags & MSG_OOB) {
                                 error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so,                                  error = (*so->so_proto->pr_usrreqs->pr_sendoob)(
                                     top, control);                                      so, top, control);
                         } else {                          } else {
                                 error = (*so->so_proto->pr_usrreqs->pr_send)(so,                                  error = (*so->so_proto->pr_usrreqs->pr_send)(so,
                                     top, addr, control, l);                                      top, addr, control, l);
Line 1240  soreceive(struct socket *so, struct mbuf
Line 1244  soreceive(struct socket *so, struct mbuf
                         if (m != NULL)                          if (m != NULL)
                                 goto dontblock;                                  goto dontblock;
                         error = so->so_error;                          error = so->so_error;
                         if ((flags & MSG_PEEK) == 0)                          so->so_error = 0;
                                 so->so_error = 0;  
                         goto release;                          goto release;
                 }                  }
                 if (so->so_state & SS_CANTRCVMORE) {                  if (so->so_state & SS_CANTRCVMORE) {
Line 1313  soreceive(struct socket *so, struct mbuf
Line 1316  soreceive(struct socket *so, struct mbuf
                 orig_resid = 0;                  orig_resid = 0;
                 if (flags & MSG_PEEK) {                  if (flags & MSG_PEEK) {
                         if (paddr)                          if (paddr)
                                 *paddr = m_copy(m, 0, m->m_len);                                  *paddr = m_copym(m, 0, m->m_len, M_DONTWAIT);
                         m = m->m_next;                          m = m->m_next;
                 } else {                  } else {
                         sbfree(&so->so_rcv, m);                          sbfree(&so->so_rcv, m);
Line 1338  soreceive(struct socket *so, struct mbuf
Line 1341  soreceive(struct socket *so, struct mbuf
                         orig_resid = 0;                          orig_resid = 0;
                         if (flags & MSG_PEEK) {                          if (flags & MSG_PEEK) {
                                 if (paddr)                                  if (paddr)
                                         *paddr = m_copy(m, 0, m->m_len);                                          *paddr = m_copym(m, 0, m->m_len, M_DONTWAIT);
                                 m = m->m_next;                                  m = m->m_next;
                         } else {                          } else {
                                 sbfree(&so->so_rcv, m);                                  sbfree(&so->so_rcv, m);
Line 1367  soreceive(struct socket *so, struct mbuf
Line 1370  soreceive(struct socket *so, struct mbuf
                 do {                  do {
                         if (flags & MSG_PEEK) {                          if (flags & MSG_PEEK) {
                                 if (controlp != NULL) {                                  if (controlp != NULL) {
                                         *controlp = m_copy(m, 0, m->m_len);                                          *controlp = m_copym(m, 0, m->m_len, M_DONTWAIT);
                                         controlp = &(*controlp)->m_next;                                          controlp = &(*controlp)->m_next;
                                 }                                  }
                                 m = m->m_next;                                  m = m->m_next;
Line 1407  soreceive(struct socket *so, struct mbuf
Line 1410  soreceive(struct socket *so, struct mbuf
                                  */                                   */
                                 if (dom->dom_dispose != NULL &&                                  if (dom->dom_dispose != NULL &&
                                     type == SCM_RIGHTS) {                                      type == SCM_RIGHTS) {
                                         sounlock(so);                                          sounlock(so);
                                         (*dom->dom_dispose)(cm);                                          (*dom->dom_dispose)(cm);
                                         solock(so);                                          solock(so);
                                 }                                  }
Line 1721  sosetopt1(struct socket *so, const struc
Line 1724  sosetopt1(struct socket *so, const struc
                 KASSERT(solocked(so));                  KASSERT(solocked(so));
                 break;                  break;
   
         case SO_LINGER:          case SO_LINGER:
                 error = sockopt_get(sopt, &l, sizeof(l));                  error = sockopt_get(sopt, &l, sizeof(l));
                 solock(so);                  solock(so);
                 if (error)                  if (error)
                         break;                          break;
                 if (l.l_linger < 0 || l.l_linger > USHRT_MAX ||                  if (l.l_linger < 0 || l.l_linger > USHRT_MAX ||
                     l.l_linger > (INT_MAX / hz)) {                      l.l_linger > (INT_MAX / hz)) {
                         error = EDOM;                          error = EDOM;
                         break;                          break;
                 }                  }
                 so->so_linger = l.l_linger;                  so->so_linger = l.l_linger;
                 if (l.l_onoff)                  if (l.l_onoff)
                         so->so_options |= SO_LINGER;                          so->so_options |= SO_LINGER;
                 else                  else
                         so->so_options &= ~SO_LINGER;                          so->so_options &= ~SO_LINGER;
                 break;                  break;
   
         case SO_DEBUG:          case SO_DEBUG:
         case SO_KEEPALIVE:          case SO_KEEPALIVE:
Line 1915  so_setsockopt(struct lwp *l, struct sock
Line 1918  so_setsockopt(struct lwp *l, struct sock
   
         return error;          return error;
 }  }
   
 /*  /*
  * internal get SOL_SOCKET options   * internal get SOL_SOCKET options
  */   */
Line 2092  sockopt_destroy(struct sockopt *sopt)
Line 2095  sockopt_destroy(struct sockopt *sopt)
 /*  /*
  * set sockopt value   * set sockopt value
  *      - value is copied into sockopt   *      - value is copied into sockopt
  *      - memory is allocated when necessary, will not sleep   *      - memory is allocated when necessary, will not sleep
  */   */
 int  int
 sockopt_set(struct sockopt *sopt, const void *buf, size_t len)  sockopt_set(struct sockopt *sopt, const void *buf, size_t len)
Line 2105  sockopt_set(struct sockopt *sopt, const 
Line 2108  sockopt_set(struct sockopt *sopt, const 
                         return error;                          return error;
         }          }
   
         KASSERT(sopt->sopt_size == len);          if (sopt->sopt_size < len)
                   return EINVAL;
   
         memcpy(sopt->sopt_data, buf, len);          memcpy(sopt->sopt_data, buf, len);
           sopt->sopt_retsize = len;
   
         return 0;          return 0;
 }  }
   
Line 2165  sockopt_setmbuf(struct sockopt *sopt, st
Line 2172  sockopt_setmbuf(struct sockopt *sopt, st
                         return error;                          return error;
         }          }
   
         KASSERT(sopt->sopt_size == len);          if (sopt->sopt_size < len)
                   return EINVAL;
   
         m_copydata(m, 0, len, sopt->sopt_data);          m_copydata(m, 0, len, sopt->sopt_data);
         m_freem(m);          m_freem(m);
           sopt->sopt_retsize = len;
   
         return 0;          return 0;
 }  }
Line 2240  filt_soread(struct knote *kn, long hint)
Line 2250  filt_soread(struct knote *kn, long hint)
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
                 kn->kn_fflags = so->so_error;                  kn->kn_fflags = so->so_error;
                 rv = 1;                  rv = 1;
         } else if (so->so_error)        /* temporary udp error */          } else if (so->so_error)
                 rv = 1;                  rv = 1;
         else if (kn->kn_sfflags & NOTE_LOWAT)          else if (kn->kn_sfflags & NOTE_LOWAT)
                 rv = (kn->kn_data >= kn->kn_sdata);                  rv = (kn->kn_data >= kn->kn_sdata);
         else          else
                 rv = (kn->kn_data >= so->so_rcv.sb_lowat);                  rv = (kn->kn_data >= so->so_rcv.sb_lowat);
         if (hint != NOTE_SUBMIT)          if (hint != NOTE_SUBMIT)
                 sounlock(so);                  sounlock(so);
Line 2279  filt_sowrite(struct knote *kn, long hint
Line 2289  filt_sowrite(struct knote *kn, long hint
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
                 kn->kn_fflags = so->so_error;                  kn->kn_fflags = so->so_error;
                 rv = 1;                  rv = 1;
         } else if (so->so_error)        /* temporary udp error */          } else if (so->so_error)
                 rv = 1;                  rv = 1;
         else if (((so->so_state & SS_ISCONNECTED) == 0) &&          else if (((so->so_state & SS_ISCONNECTED) == 0) &&
             (so->so_proto->pr_flags & PR_CONNREQUIRED))              (so->so_proto->pr_flags & PR_CONNREQUIRED))
Line 2315  filt_solisten(struct knote *kn, long hin
Line 2325  filt_solisten(struct knote *kn, long hin
         return rv;          return rv;
 }  }
   
 static const struct filterops solisten_filtops =  static const struct filterops solisten_filtops = {
         { 1, NULL, filt_sordetach, filt_solisten };          .f_isfd = 1,
 static const struct filterops soread_filtops =          .f_attach = NULL,
         { 1, NULL, filt_sordetach, filt_soread };          .f_detach = filt_sordetach,
 static const struct filterops sowrite_filtops =          .f_event = filt_solisten,
         { 1, NULL, filt_sowdetach, filt_sowrite };  };
   
   static const struct filterops soread_filtops = {
           .f_isfd = 1,
           .f_attach = NULL,
           .f_detach = filt_sordetach,
           .f_event = filt_soread,
   };
   
   static const struct filterops sowrite_filtops = {
           .f_isfd = 1,
           .f_attach = NULL,
           .f_detach = filt_sowdetach,
           .f_event = filt_sowrite,
   };
   
 int  int
 soo_kqfilter(struct file *fp, struct knote *kn)  soo_kqfilter(struct file *fp, struct knote *kn)
Line 2406  sopoll(struct socket *so, int events)
Line 2430  sopoll(struct socket *so, int events)
         return revents;          return revents;
 }  }
   
   struct mbuf **
   sbsavetimestamp(int opt, struct mbuf **mp)
   {
           struct timeval tv;
           microtime(&tv);
   
   #ifdef SO_OTIMESTAMP
           if (opt & SO_OTIMESTAMP) {
                   struct timeval50 tv50;
   
                   timeval_to_timeval50(&tv, &tv50);
                   *mp = sbcreatecontrol(&tv50, sizeof(tv50),
                       SCM_OTIMESTAMP, SOL_SOCKET);
                   if (*mp)
                           mp = &(*mp)->m_next;
           } else
   #endif
   
           if (opt & SO_TIMESTAMP) {
                   *mp = sbcreatecontrol(&tv, sizeof(tv),
                       SCM_TIMESTAMP, SOL_SOCKET);
                   if (*mp)
                           mp = &(*mp)->m_next;
           }
           return mp;
   }
   
   
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   

Legend:
Removed from v.1.250  
changed lines
  Added in v.1.259.2.2

CVSweb <webmaster@jp.NetBSD.org>