sync with OpenBSD -current
This commit is contained in:
parent
7d66fd8cb0
commit
3f3212838f
122 changed files with 1363 additions and 8580 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: uipc_socket.c,v 1.315 2024/01/26 18:24:23 mvs Exp $ */
|
||||
/* $OpenBSD: uipc_socket.c,v 1.316 2024/02/03 22:50:08 mvs Exp $ */
|
||||
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -72,26 +72,20 @@ int filt_soread(struct knote *kn, long hint);
|
|||
void filt_sowdetach(struct knote *kn);
|
||||
int filt_sowrite(struct knote *kn, long hint);
|
||||
int filt_soexcept(struct knote *kn, long hint);
|
||||
int filt_solisten(struct knote *kn, long hint);
|
||||
int filt_somodify(struct kevent *kev, struct knote *kn);
|
||||
int filt_soprocess(struct knote *kn, struct kevent *kev);
|
||||
|
||||
const struct filterops solisten_filtops = {
|
||||
.f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE,
|
||||
.f_attach = NULL,
|
||||
.f_detach = filt_sordetach,
|
||||
.f_event = filt_solisten,
|
||||
.f_modify = filt_somodify,
|
||||
.f_process = filt_soprocess,
|
||||
};
|
||||
int filt_sowmodify(struct kevent *kev, struct knote *kn);
|
||||
int filt_sowprocess(struct knote *kn, struct kevent *kev);
|
||||
|
||||
int filt_sormodify(struct kevent *kev, struct knote *kn);
|
||||
int filt_sorprocess(struct knote *kn, struct kevent *kev);
|
||||
|
||||
const struct filterops soread_filtops = {
|
||||
.f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE,
|
||||
.f_attach = NULL,
|
||||
.f_detach = filt_sordetach,
|
||||
.f_event = filt_soread,
|
||||
.f_modify = filt_somodify,
|
||||
.f_process = filt_soprocess,
|
||||
.f_modify = filt_sormodify,
|
||||
.f_process = filt_sorprocess,
|
||||
};
|
||||
|
||||
const struct filterops sowrite_filtops = {
|
||||
|
@ -99,8 +93,8 @@ const struct filterops sowrite_filtops = {
|
|||
.f_attach = NULL,
|
||||
.f_detach = filt_sowdetach,
|
||||
.f_event = filt_sowrite,
|
||||
.f_modify = filt_somodify,
|
||||
.f_process = filt_soprocess,
|
||||
.f_modify = filt_sowmodify,
|
||||
.f_process = filt_sowprocess,
|
||||
};
|
||||
|
||||
const struct filterops soexcept_filtops = {
|
||||
|
@ -108,18 +102,8 @@ const struct filterops soexcept_filtops = {
|
|||
.f_attach = NULL,
|
||||
.f_detach = filt_sordetach,
|
||||
.f_event = filt_soexcept,
|
||||
.f_modify = filt_somodify,
|
||||
.f_process = filt_soprocess,
|
||||
};
|
||||
|
||||
void klist_soassertlk(void *);
|
||||
int klist_solock(void *);
|
||||
void klist_sounlock(void *, int);
|
||||
|
||||
const struct klistops socket_klistops = {
|
||||
.klo_assertlk = klist_soassertlk,
|
||||
.klo_lock = klist_solock,
|
||||
.klo_unlock = klist_sounlock,
|
||||
.f_modify = filt_sormodify,
|
||||
.f_process = filt_sorprocess,
|
||||
};
|
||||
|
||||
#ifndef SOMINCONN
|
||||
|
@ -158,8 +142,10 @@ soalloc(const struct domain *dp, int wait)
|
|||
return (NULL);
|
||||
rw_init_flags(&so->so_lock, dp->dom_name, RWL_DUPOK);
|
||||
refcnt_init(&so->so_refcnt);
|
||||
klist_init(&so->so_rcv.sb_klist, &socket_klistops, so);
|
||||
klist_init(&so->so_snd.sb_klist, &socket_klistops, so);
|
||||
mtx_init(&so->so_rcv.sb_mtx, IPL_MPFLOOR);
|
||||
mtx_init(&so->so_snd.sb_mtx, IPL_MPFLOOR);
|
||||
klist_init_mutex(&so->so_rcv.sb_klist, &so->so_rcv.sb_mtx);
|
||||
klist_init_mutex(&so->so_snd.sb_klist, &so->so_snd.sb_mtx);
|
||||
sigio_init(&so->so_sigio);
|
||||
TAILQ_INIT(&so->so_q0);
|
||||
TAILQ_INIT(&so->so_q);
|
||||
|
@ -1757,7 +1743,7 @@ somove(struct socket *so, int wait)
|
|||
void
|
||||
sorwakeup(struct socket *so)
|
||||
{
|
||||
soassertlocked(so);
|
||||
soassertlocked_readonly(so);
|
||||
|
||||
#ifdef SOCKET_SPLICE
|
||||
if (so->so_rcv.sb_flags & SB_SPLICE) {
|
||||
|
@ -1785,7 +1771,7 @@ sorwakeup(struct socket *so)
|
|||
void
|
||||
sowwakeup(struct socket *so)
|
||||
{
|
||||
soassertlocked(so);
|
||||
soassertlocked_readonly(so);
|
||||
|
||||
#ifdef SOCKET_SPLICE
|
||||
if (so->so_snd.sb_flags & SB_SPLICE)
|
||||
|
@ -2134,7 +2120,46 @@ void
|
|||
sohasoutofband(struct socket *so)
|
||||
{
|
||||
pgsigio(&so->so_sigio, SIGURG, 0);
|
||||
knote_locked(&so->so_rcv.sb_klist, 0);
|
||||
knote(&so->so_rcv.sb_klist, 0);
|
||||
}
|
||||
|
||||
void
|
||||
sofilt_lock(struct socket *so, struct sockbuf *sb)
|
||||
{
|
||||
switch (so->so_proto->pr_domain->dom_family) {
|
||||
case PF_INET:
|
||||
case PF_INET6:
|
||||
NET_LOCK_SHARED();
|
||||
break;
|
||||
default:
|
||||
rw_enter_write(&so->so_lock);
|
||||
break;
|
||||
}
|
||||
|
||||
mtx_enter(&sb->sb_mtx);
|
||||
}
|
||||
|
||||
void
|
||||
sofilt_unlock(struct socket *so, struct sockbuf *sb)
|
||||
{
|
||||
mtx_leave(&sb->sb_mtx);
|
||||
|
||||
switch (so->so_proto->pr_domain->dom_family) {
|
||||
case PF_INET:
|
||||
case PF_INET6:
|
||||
NET_UNLOCK_SHARED();
|
||||
break;
|
||||
default:
|
||||
rw_exit_write(&so->so_lock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
sofilt_assert_locked(struct socket *so, struct sockbuf *sb)
|
||||
{
|
||||
MUTEX_ASSERT_LOCKED(&sb->sb_mtx);
|
||||
soassertlocked_readonly(so);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -2143,13 +2168,9 @@ soo_kqfilter(struct file *fp, struct knote *kn)
|
|||
struct socket *so = kn->kn_fp->f_data;
|
||||
struct sockbuf *sb;
|
||||
|
||||
solock(so);
|
||||
switch (kn->kn_filter) {
|
||||
case EVFILT_READ:
|
||||
if (so->so_options & SO_ACCEPTCONN)
|
||||
kn->kn_fop = &solisten_filtops;
|
||||
else
|
||||
kn->kn_fop = &soread_filtops;
|
||||
kn->kn_fop = &soread_filtops;
|
||||
sb = &so->so_rcv;
|
||||
break;
|
||||
case EVFILT_WRITE:
|
||||
|
@ -2161,12 +2182,10 @@ soo_kqfilter(struct file *fp, struct knote *kn)
|
|||
sb = &so->so_rcv;
|
||||
break;
|
||||
default:
|
||||
sounlock(so);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
klist_insert_locked(&sb->sb_klist, kn);
|
||||
sounlock(so);
|
||||
klist_insert(&sb->sb_klist, kn);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
@ -2185,7 +2204,23 @@ filt_soread(struct knote *kn, long hint)
|
|||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv = 0;
|
||||
|
||||
soassertlocked(so);
|
||||
sofilt_assert_locked(so, &so->so_rcv);
|
||||
|
||||
if (so->so_options & SO_ACCEPTCONN) {
|
||||
kn->kn_data = so->so_qlen;
|
||||
rv = (kn->kn_data != 0);
|
||||
|
||||
if (kn->kn_flags & (__EV_POLL | __EV_SELECT)) {
|
||||
if (so->so_state & SS_ISDISCONNECTED) {
|
||||
kn->kn_flags |= __EV_HUP;
|
||||
rv = 1;
|
||||
} else {
|
||||
rv = soreadable(so);
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
kn->kn_data = so->so_rcv.sb_cc;
|
||||
#ifdef SOCKET_SPLICE
|
||||
|
@ -2226,7 +2261,7 @@ filt_sowrite(struct knote *kn, long hint)
|
|||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv;
|
||||
|
||||
soassertlocked(so);
|
||||
sofilt_assert_locked(so, &so->so_snd);
|
||||
|
||||
kn->kn_data = sbspace(so, &so->so_snd);
|
||||
if (so->so_snd.sb_state & SS_CANTSENDMORE) {
|
||||
|
@ -2257,7 +2292,7 @@ filt_soexcept(struct knote *kn, long hint)
|
|||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv = 0;
|
||||
|
||||
soassertlocked(so);
|
||||
sofilt_assert_locked(so, &so->so_rcv);
|
||||
|
||||
#ifdef SOCKET_SPLICE
|
||||
if (isspliced(so)) {
|
||||
|
@ -2283,77 +2318,55 @@ filt_soexcept(struct knote *kn, long hint)
|
|||
}
|
||||
|
||||
int
|
||||
filt_solisten(struct knote *kn, long hint)
|
||||
{
|
||||
struct socket *so = kn->kn_fp->f_data;
|
||||
int active;
|
||||
|
||||
soassertlocked(so);
|
||||
|
||||
kn->kn_data = so->so_qlen;
|
||||
active = (kn->kn_data != 0);
|
||||
|
||||
if (kn->kn_flags & (__EV_POLL | __EV_SELECT)) {
|
||||
if (so->so_state & SS_ISDISCONNECTED) {
|
||||
kn->kn_flags |= __EV_HUP;
|
||||
active = 1;
|
||||
} else {
|
||||
active = soreadable(so);
|
||||
}
|
||||
}
|
||||
|
||||
return (active);
|
||||
}
|
||||
|
||||
int
|
||||
filt_somodify(struct kevent *kev, struct knote *kn)
|
||||
filt_sowmodify(struct kevent *kev, struct knote *kn)
|
||||
{
|
||||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv;
|
||||
|
||||
solock(so);
|
||||
sofilt_lock(so, &so->so_snd);
|
||||
rv = knote_modify(kev, kn);
|
||||
sounlock(so);
|
||||
sofilt_unlock(so, &so->so_snd);
|
||||
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
filt_soprocess(struct knote *kn, struct kevent *kev)
|
||||
filt_sowprocess(struct knote *kn, struct kevent *kev)
|
||||
{
|
||||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv;
|
||||
|
||||
solock(so);
|
||||
sofilt_lock(so, &so->so_snd);
|
||||
rv = knote_process(kn, kev);
|
||||
sounlock(so);
|
||||
sofilt_unlock(so, &so->so_snd);
|
||||
|
||||
return (rv);
|
||||
}
|
||||
|
||||
void
|
||||
klist_soassertlk(void *arg)
|
||||
int
|
||||
filt_sormodify(struct kevent *kev, struct knote *kn)
|
||||
{
|
||||
struct socket *so = arg;
|
||||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv;
|
||||
|
||||
soassertlocked(so);
|
||||
sofilt_lock(so, &so->so_rcv);
|
||||
rv = knote_modify(kev, kn);
|
||||
sofilt_unlock(so, &so->so_rcv);
|
||||
|
||||
return (rv);
|
||||
}
|
||||
|
||||
int
|
||||
klist_solock(void *arg)
|
||||
filt_sorprocess(struct knote *kn, struct kevent *kev)
|
||||
{
|
||||
struct socket *so = arg;
|
||||
struct socket *so = kn->kn_fp->f_data;
|
||||
int rv;
|
||||
|
||||
solock(so);
|
||||
return (1);
|
||||
}
|
||||
sofilt_lock(so, &so->so_rcv);
|
||||
rv = knote_process(kn, kev);
|
||||
sofilt_unlock(so, &so->so_rcv);
|
||||
|
||||
void
|
||||
klist_sounlock(void *arg, int ls)
|
||||
{
|
||||
struct socket *so = arg;
|
||||
|
||||
sounlock(so);
|
||||
return (rv);
|
||||
}
|
||||
|
||||
#ifdef DDB
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue