Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_sockbuf.c
Show First 20 Lines • Show All 644 Lines • ▼ Show 20 Lines | if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, | ||||
sbsize_limit)) | sbsize_limit)) | ||||
return (false); | return (false); | ||||
sb->sb_mbmax = min(cc * sb_efficiency, sb_max); | sb->sb_mbmax = min(cc * sb_efficiency, sb_max); | ||||
if (sb->sb_lowat > sb->sb_hiwat) | if (sb->sb_lowat > sb->sb_hiwat) | ||||
sb->sb_lowat = sb->sb_hiwat; | sb->sb_lowat = sb->sb_hiwat; | ||||
return (true); | return (true); | ||||
} | } | ||||
/* | |||||
* Sets socket bytes/mbufs limits ignoring sb_max default. | |||||
*/ | |||||
static bool | |||||
sbreserve_force_locked(struct socket *so, sb_which which, u_long cc, | |||||
struct thread *td) | |||||
{ | |||||
struct sockbuf *sb = sobuf(so, which); | |||||
rlim_t sbsize_limit; | |||||
SOCK_BUF_LOCK_ASSERT(so, which); | |||||
sbsize_limit = td != NULL ? lim_cur(td, RLIMIT_SBSIZE) : RLIM_INFINITY; | |||||
if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, sbsize_limit)) | |||||
return (false); | |||||
sb->sb_mbmax = cc * sb_efficiency; | |||||
if (sb->sb_lowat > sb->sb_hiwat) | |||||
sb->sb_lowat = sb->sb_hiwat; | |||||
return (true); | |||||
} | |||||
int | int | ||||
sbsetopt(struct socket *so, int cmd, u_long cc) | sbsetopt(struct socket *so, int cmd, u_long cc) | ||||
{ | { | ||||
struct sockbuf *sb; | struct sockbuf *sb; | ||||
sb_which wh; | sb_which wh; | ||||
short *flags; | short *flags; | ||||
u_int *hiwat, *lowat; | u_int *hiwat, *lowat; | ||||
int error; | int error; | ||||
sb = NULL; | sb = NULL; | ||||
SOCK_LOCK(so); | SOCK_LOCK(so); | ||||
if (SOLISTENING(so)) { | if (SOLISTENING(so)) { | ||||
switch (cmd) { | switch (cmd) { | ||||
case SO_SNDLOWAT: | case SO_SNDLOWAT: | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
lowat = &so->sol_sbsnd_lowat; | lowat = &so->sol_sbsnd_lowat; | ||||
hiwat = &so->sol_sbsnd_hiwat; | hiwat = &so->sol_sbsnd_hiwat; | ||||
flags = &so->sol_sbsnd_flags; | flags = &so->sol_sbsnd_flags; | ||||
break; | break; | ||||
case SO_RCVLOWAT: | case SO_RCVLOWAT: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
case SO_RCVBUFFORCE: | |||||
lowat = &so->sol_sbrcv_lowat; | lowat = &so->sol_sbrcv_lowat; | ||||
hiwat = &so->sol_sbrcv_hiwat; | hiwat = &so->sol_sbrcv_hiwat; | ||||
flags = &so->sol_sbrcv_flags; | flags = &so->sol_sbrcv_flags; | ||||
break; | break; | ||||
} | } | ||||
} else { | } else { | ||||
switch (cmd) { | switch (cmd) { | ||||
case SO_SNDLOWAT: | case SO_SNDLOWAT: | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
sb = &so->so_snd; | sb = &so->so_snd; | ||||
wh = SO_SND; | wh = SO_SND; | ||||
break; | break; | ||||
case SO_RCVLOWAT: | case SO_RCVLOWAT: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
case SO_RCVBUFFORCE: | |||||
sb = &so->so_rcv; | sb = &so->so_rcv; | ||||
wh = SO_RCV; | wh = SO_RCV; | ||||
break; | break; | ||||
} | } | ||||
flags = &sb->sb_flags; | flags = &sb->sb_flags; | ||||
hiwat = &sb->sb_hiwat; | hiwat = &sb->sb_hiwat; | ||||
lowat = &sb->sb_lowat; | lowat = &sb->sb_lowat; | ||||
SOCK_BUF_LOCK(so, wh); | SOCK_BUF_LOCK(so, wh); | ||||
} | } | ||||
error = 0; | error = 0; | ||||
switch (cmd) { | switch (cmd) { | ||||
case SO_SNDBUF: | case SO_SNDBUF: | ||||
case SO_RCVBUF: | case SO_RCVBUF: | ||||
if (SOLISTENING(so)) { | if (SOLISTENING(so)) { | ||||
if (cc > sb_max_adj) { | if (cc > sb_max_adj) { | ||||
error = ENOBUFS; | error = ENOBUFS; | ||||
break; | break; | ||||
} | } | ||||
*hiwat = cc; | *hiwat = cc; | ||||
if (*lowat > *hiwat) | if (*lowat > *hiwat) | ||||
*lowat = *hiwat; | *lowat = *hiwat; | ||||
} else { | } else { | ||||
if (!sbreserve_locked(so, wh, cc, curthread)) | if (!sbreserve_locked(so, wh, cc, curthread)) | ||||
error = ENOBUFS; | |||||
} | |||||
if (error == 0) | |||||
*flags &= ~SB_AUTOSIZE; | |||||
break; | |||||
case SO_RCVBUFFORCE: | |||||
if (SOLISTENING(so)) { | |||||
*hiwat = cc; | |||||
if (*lowat > *hiwat) | |||||
*lowat = *hiwat; | |||||
} else { | |||||
if (!sbreserve_force_locked(so, wh, cc, curthread)) | |||||
error = ENOBUFS; | error = ENOBUFS; | ||||
} | } | ||||
if (error == 0) | if (error == 0) | ||||
*flags &= ~SB_AUTOSIZE; | *flags &= ~SB_AUTOSIZE; | ||||
break; | break; | ||||
case SO_SNDLOWAT: | case SO_SNDLOWAT: | ||||
case SO_RCVLOWAT: | case SO_RCVLOWAT: | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 1,124 Lines • Show Last 20 Lines |