version 1.97.2.2, 2005/10/31 13:37:33 |
version 1.99, 2004/04/22 01:01:40 |
Line 162 int sokvawaiters; |
|
Line 162 int sokvawaiters; |
|
|
|
static size_t sodopendfree(struct socket *); |
static size_t sodopendfree(struct socket *); |
static size_t sodopendfreel(struct socket *); |
static size_t sodopendfreel(struct socket *); |
static __inline void sokvareserve(struct socket *, vsize_t); |
static __inline vsize_t sokvareserve(struct socket *, vsize_t); |
static __inline void sokvaunreserve(vsize_t); |
static __inline void sokvaunreserve(vsize_t); |
|
|
static __inline void |
static __inline vsize_t |
sokvareserve(struct socket *so, vsize_t len) |
sokvareserve(struct socket *so, vsize_t len) |
{ |
{ |
int s; |
int s; |
|
int error; |
|
|
s = splvm(); |
s = splvm(); |
simple_lock(&so_pendfree_slock); |
simple_lock(&so_pendfree_slock); |
Line 190 sokvareserve(struct socket *so, vsize_t |
|
Line 191 sokvareserve(struct socket *so, vsize_t |
|
|
|
SOSEND_COUNTER_INCR(&sosend_kvalimit); |
SOSEND_COUNTER_INCR(&sosend_kvalimit); |
sokvawaiters++; |
sokvawaiters++; |
(void) ltsleep(&socurkva, PVM, "sokva", 0, &so_pendfree_slock); |
error = ltsleep(&socurkva, PVM | PCATCH, "sokva", 0, |
|
&so_pendfree_slock); |
sokvawaiters--; |
sokvawaiters--; |
|
if (error) { |
|
len = 0; |
|
break; |
|
} |
} |
} |
socurkva += len; |
socurkva += len; |
simple_unlock(&so_pendfree_slock); |
simple_unlock(&so_pendfree_slock); |
splx(s); |
splx(s); |
|
return len; |
} |
} |
|
|
static __inline void |
static __inline void |
Line 225 sokvaalloc(vsize_t len, struct socket *s |
|
Line 232 sokvaalloc(vsize_t len, struct socket *s |
|
* reserve kva. |
* reserve kva. |
*/ |
*/ |
|
|
sokvareserve(so, len); |
if (sokvareserve(so, len) == 0) |
|
return 0; |
|
|
/* |
/* |
* allocate kva. |
* allocate kva. |
|
|
socreate(int dom, struct socket **aso, int type, int proto) |
socreate(int dom, struct socket **aso, int type, int proto) |
{ |
{ |
struct proc *p; |
struct proc *p; |
struct protosw *prp; |
const struct protosw *prp; |
struct socket *so; |
struct socket *so; |
int error, s; |
int error, s; |
|
|
Line 479 socreate(int dom, struct socket **aso, i |
|
Line 487 socreate(int dom, struct socket **aso, i |
|
#endif |
#endif |
if (p != 0) |
if (p != 0) |
so->so_uid = p->p_ucred->cr_uid; |
so->so_uid = p->p_ucred->cr_uid; |
|
else |
|
so->so_uid = UID_MAX; |
error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, |
error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0, |
(struct mbuf *)(long)proto, (struct mbuf *)0, p); |
(struct mbuf *)(long)proto, (struct mbuf *)0, p); |
if (error) { |
if (error) { |
Line 540 sofree(struct socket *so) |
|
Line 550 sofree(struct socket *so) |
|
if (!soqremque(so, 0)) |
if (!soqremque(so, 0)) |
return; |
return; |
} |
} |
sbrelease(&so->so_snd); |
if (so->so_rcv.sb_hiwat) |
|
(void)chgsbsize(so->so_uid, &so->so_rcv.sb_hiwat, 0, |
|
RLIM_INFINITY); |
|
if (so->so_snd.sb_hiwat) |
|
(void)chgsbsize(so->so_uid, &so->so_snd.sb_hiwat, 0, |
|
RLIM_INFINITY); |
|
sbrelease(&so->so_snd, so); |
sorflush(so); |
sorflush(so); |
pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
} |
} |
Line 926 soreceive(struct socket *so, struct mbuf |
|
Line 942 soreceive(struct socket *so, struct mbuf |
|
{ |
{ |
struct mbuf *m, **mp; |
struct mbuf *m, **mp; |
int flags, len, error, s, offset, moff, type, orig_resid; |
int flags, len, error, s, offset, moff, type, orig_resid; |
struct protosw *pr; |
const struct protosw *pr; |
struct mbuf *nextrecord; |
struct mbuf *nextrecord; |
int mbuf_removed = 0; |
int mbuf_removed = 0; |
|
|
Line 1329 soreceive(struct socket *so, struct mbuf |
|
Line 1345 soreceive(struct socket *so, struct mbuf |
|
int |
int |
soshutdown(struct socket *so, int how) |
soshutdown(struct socket *so, int how) |
{ |
{ |
struct protosw *pr; |
const struct protosw *pr; |
|
|
pr = so->so_proto; |
pr = so->so_proto; |
if (!(how == SHUT_RD || how == SHUT_WR || how == SHUT_RDWR)) |
if (!(how == SHUT_RD || how == SHUT_WR || how == SHUT_RDWR)) |
|
|
sorflush(struct socket *so) |
sorflush(struct socket *so) |
{ |
{ |
struct sockbuf *sb, asb; |
struct sockbuf *sb, asb; |
struct protosw *pr; |
const struct protosw *pr; |
int s; |
int s; |
|
|
sb = &so->so_rcv; |
sb = &so->so_rcv; |
Line 1367 sorflush(struct socket *so) |
|
Line 1383 sorflush(struct socket *so) |
|
splx(s); |
splx(s); |
if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) |
if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) |
(*pr->pr_domain->dom_dispose)(asb.sb_mb); |
(*pr->pr_domain->dom_dispose)(asb.sb_mb); |
sbrelease(&asb); |
sbrelease(&asb, so); |
} |
} |
|
|
int |
int |
Line 1391 sosetopt(struct socket *so, int level, i |
|
Line 1407 sosetopt(struct socket *so, int level, i |
|
error = EINVAL; |
error = EINVAL; |
goto bad; |
goto bad; |
} |
} |
if (mtod(m, struct linger *)->l_linger < 0 || |
|
mtod(m, struct linger *)->l_linger > (INT_MAX / hz)) { |
|
error = EDOM; |
|
goto bad; |
|
} |
|
so->so_linger = mtod(m, struct linger *)->l_linger; |
so->so_linger = mtod(m, struct linger *)->l_linger; |
/* fall thru... */ |
/* fall thru... */ |
|
|
Line 1446 sosetopt(struct socket *so, int level, i |
|
Line 1457 sosetopt(struct socket *so, int level, i |
|
case SO_RCVBUF: |
case SO_RCVBUF: |
if (sbreserve(optname == SO_SNDBUF ? |
if (sbreserve(optname == SO_SNDBUF ? |
&so->so_snd : &so->so_rcv, |
&so->so_snd : &so->so_rcv, |
(u_long) optval) == 0) { |
(u_long) optval, so) == 0) { |
error = ENOBUFS; |
error = ENOBUFS; |
goto bad; |
goto bad; |
} |
} |
Line 1769 SYSCTL_SETUP(sysctl_kern_somaxkva_setup, |
|
Line 1780 SYSCTL_SETUP(sysctl_kern_somaxkva_setup, |
|
|
|
sysctl_createv(clog, 0, NULL, NULL, |
sysctl_createv(clog, 0, NULL, NULL, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLTYPE_INT, "somaxkva", |
CTLTYPE_INT, "somaxkva", NULL, |
SYSCTL_DESCR("Maximum amount of kernel memory to be " |
|
"used for socket buffers"), |
|
sysctl_kern_somaxkva, 0, NULL, 0, |
sysctl_kern_somaxkva, 0, NULL, 0, |
CTL_KERN, KERN_SOMAXKVA, CTL_EOL); |
CTL_KERN, KERN_SOMAXKVA, CTL_EOL); |
} |
} |