version 1.235.2.7, 2017/08/28 17:53:07 |
version 1.247, 2015/10/13 21:28:35 |
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)) == |
KASSERT((~m->m_flags & (M_EXT|M_EXT_PAGES)) == 0); |
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 435 socket_listener_cb(kauth_cred_t cred, ka |
|
Line 434 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. */ |
switch ((u_long)arg1) { |
if ((u_long)arg1 == PF_ROUTE || (u_long)arg1 == PF_OROUTE |
case PF_ROUTE: |
|| (u_long)arg1 == PF_BLUETOOTH) { |
case PF_OROUTE: |
|
case PF_BLUETOOTH: |
|
case PF_CAN: |
|
result = KAUTH_RESULT_ALLOW; |
result = KAUTH_RESULT_ALLOW; |
break; |
} else { |
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 652 solisten(struct socket *so, int backlog, |
|
Line 648 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 790 soabort(struct socket *so) |
|
Line 786 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 1002 sosend(struct socket *so, struct sockadd |
|
Line 998 sosend(struct socket *so, struct sockadd |
|
m = m_gethdr(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_reset_rcvif(m); |
m->m_pkthdr.rcvif = NULL; |
} else { |
} else { |
m = m_get(M_WAIT, MT_DATA); |
m = m_get(M_WAIT, MT_DATA); |
mlen = MLEN; |
mlen = MLEN; |
Line 1069 sosend(struct socket *so, struct sockadd |
|
Line 1065 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)( |
error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so, |
so, top, control); |
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 1328 soreceive(struct socket *so, struct mbuf |
|
Line 1324 soreceive(struct socket *so, struct mbuf |
|
m->m_next = NULL; |
m->m_next = NULL; |
m = so->so_rcv.sb_mb; |
m = so->so_rcv.sb_mb; |
} else { |
} else { |
m = so->so_rcv.sb_mb = m_free(m); |
MFREE(m, so->so_rcv.sb_mb); |
|
m = so->so_rcv.sb_mb; |
} |
} |
sbsync(&so->so_rcv, nextrecord); |
sbsync(&so->so_rcv, nextrecord); |
} |
} |
Line 1352 soreceive(struct socket *so, struct mbuf |
|
Line 1349 soreceive(struct socket *so, struct mbuf |
|
m->m_next = 0; |
m->m_next = 0; |
m = so->so_rcv.sb_mb; |
m = so->so_rcv.sb_mb; |
} else { |
} else { |
m = so->so_rcv.sb_mb = m_free(m); |
MFREE(m, so->so_rcv.sb_mb); |
|
m = so->so_rcv.sb_mb; |
} |
} |
} |
} |
} |
} |
Line 1411 soreceive(struct socket *so, struct mbuf |
|
Line 1409 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 1507 soreceive(struct socket *so, struct mbuf |
|
Line 1505 soreceive(struct socket *so, struct mbuf |
|
so->so_rcv.sb_mb = m = m->m_next; |
so->so_rcv.sb_mb = m = m->m_next; |
*mp = NULL; |
*mp = NULL; |
} else { |
} else { |
m = so->so_rcv.sb_mb = m_free(m); |
MFREE(m, so->so_rcv.sb_mb); |
|
m = so->so_rcv.sb_mb; |
} |
} |
/* |
/* |
* If m != NULL, we also know that |
* If m != NULL, we also know that |
Line 1725 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 1919 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 2096 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 2248 filt_soread(struct knote *kn, long hint) |
|
Line 2247 filt_soread(struct knote *kn, long hint) |
|
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 2410 sopoll(struct socket *so, int events) |
|
Line 2409 sopoll(struct socket *so, int events) |
|
return revents; |
return revents; |
} |
} |
|
|
struct mbuf ** |
|
sbsavetimestamp(int opt, struct mbuf *m, 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> |
|
|