git: aba6f33275e7 - main - sockets: provide protocol method pr_kqfilter
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 30 Apr 2025 21:14:42 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=aba6f33275e72b9de8b4936cd8c00dd671e5d6e8
commit aba6f33275e72b9de8b4936cd8c00dd671e5d6e8
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2025-04-30 21:13:58 +0000
Commit: Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2025-04-30 21:13:58 +0000
sockets: provide protocol method pr_kqfilter
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D48919
---
sys/kern/sys_socket.c | 10 +++++++++-
sys/kern/uipc_domain.c | 1 +
sys/kern/uipc_socket.c | 4 +---
sys/sys/protosw.h | 3 +++
sys/sys/socketvar.h | 1 +
5 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index 456d93ff0d68..c221106ae067 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -87,7 +87,7 @@ static fo_rdwr_t soo_read;
static fo_rdwr_t soo_write;
static fo_ioctl_t soo_ioctl;
static fo_poll_t soo_poll;
-extern fo_kqfilter_t soo_kqfilter;
+static fo_kqfilter_t soo_kqfilter;
static fo_stat_t soo_stat;
static fo_close_t soo_close;
static fo_chmod_t soo_chmod;
@@ -291,6 +291,14 @@ soo_poll(struct file *fp, int events, struct ucred *active_cred,
return (so->so_proto->pr_sopoll(so, events, td));
}
+static int
+soo_kqfilter(struct file *fp, struct knote *kn)
+{
+ struct socket *so = fp->f_data;
+
+ return (so->so_proto->pr_kqfilter(so, kn));
+}
+
static int
soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred)
{
diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c
index 2d68e11b9f0a..3f31f8ba421c 100644
--- a/sys/kern/uipc_domain.c
+++ b/sys/kern/uipc_domain.c
@@ -191,6 +191,7 @@ pr_init(struct domain *dom, struct protosw *pr)
DEFAULT(pr_sopoll, sopoll_generic);
DEFAULT(pr_setsbopt, sbsetopt);
DEFAULT(pr_aio_queue, soaio_queue_generic);
+ DEFAULT(pr_kqfilter, sokqfilter_generic);
#define NOTSUPP(foo) if (pr->foo == NULL) pr->foo = foo ## _notsupp
NOTSUPP(pr_accept);
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 10f81a959147..03a2c532f053 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -186,7 +186,6 @@ static int filt_soread(struct knote *kn, long hint);
static void filt_sowdetach(struct knote *kn);
static int filt_sowrite(struct knote *kn, long hint);
static int filt_soempty(struct knote *kn, long hint);
-fo_kqfilter_t soo_kqfilter;
static const struct filterops soread_filtops = {
.f_isfd = 1,
@@ -4488,9 +4487,8 @@ sopoll_generic(struct socket *so, int events, struct thread *td)
}
int
-soo_kqfilter(struct file *fp, struct knote *kn)
+sokqfilter_generic(struct socket *so, struct knote *kn)
{
- struct socket *so = kn->kn_fp->f_data;
struct sockbuf *sb;
sb_which which;
struct knlist *knl;
diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h
index 2f74148efa1d..4808f136cabf 100644
--- a/sys/sys/protosw.h
+++ b/sys/sys/protosw.h
@@ -51,6 +51,7 @@ struct stat;
struct ucred;
struct uio;
struct kaiocb;
+struct knote;
enum shutdown_how;
/* USE THESE FOR YOUR PROTOTYPES ! */
@@ -89,6 +90,7 @@ typedef int pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
typedef int pr_soreceive_t(struct socket *, struct sockaddr **,
struct uio *, struct mbuf **, struct mbuf **, int *);
typedef int pr_sopoll_t(struct socket *, int, struct thread *);
+typedef int pr_kqfilter_t(struct socket *, struct knote *);
typedef void pr_sosetlabel_t(struct socket *);
typedef void pr_close_t(struct socket *);
typedef int pr_bindat_t(int, struct socket *, struct sockaddr *,
@@ -138,6 +140,7 @@ struct protosw {
pr_sosetlabel_t *pr_sosetlabel; /* MAC, XXXGL: remove */
pr_setsbopt_t *pr_setsbopt; /* Socket buffer ioctls */
pr_chmod_t *pr_chmod; /* fchmod(2) */
+ pr_kqfilter_t *pr_kqfilter; /* kevent(2) */
};
#endif /* defined(_KERNEL) || defined(_WANT_PROTOSW) */
#ifdef _KERNEL
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
index 02d0ca139fa4..8e70ada24259 100644
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -527,6 +527,7 @@ struct socket *
struct socket *
sopeeloff(struct socket *);
int sopoll_generic(struct socket *so, int events, struct thread *td);
+int sokqfilter_generic(struct socket *so, struct knote *kn);
int soaio_queue_generic(struct socket *so, struct kaiocb *job);
int soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio,
struct mbuf **mp0, struct mbuf **controlp, int *flagsp);