On Sun, May 16, 2021 at 7:20 PM louisrossberg
[off-list ref] wrote:
Hello, can somebody point me in the right direction for
what I would use to listen on a TCP socket from the
kernel? I am working on a kernel module and have spent the
past day looking through include/net and include/linux for
something that would allow me to do so. I know TCP
listening is typically done in userspace, but it should be
possible at the kernel level right? tcp_diag looks
promising, but it seems like that is mainly for monitoring
sockets, and I'm not sure if I would be able to provide
responses from it.
Louis Rossberg,
Warped Technologies
Perhaps kernel_listen() and related functions (kernel_bind(),
kernel_accept(), etc.) in net/socket.c might do the trick for your use
case? Looking at how the callers of these functions structure their
code might give you enough to go on.
(I'm adding the Linux kernel networking mailing list to this thread as well.)
best regards,
neal
From: Neal Cardwell
Sent: 17 May 2021 02:55
On Sun, May 16, 2021 at 7:20 PM louisrossberg
[off-list ref] wrote:
quoted
Hello, can somebody point me in the right direction for
what I would use to listen on a TCP socket from the
kernel? I am working on a kernel module and have spent the
past day looking through include/net and include/linux for
something that would allow me to do so. I know TCP
listening is typically done in userspace, but it should be
possible at the kernel level right? tcp_diag looks
promising, but it seems like that is mainly for monitoring
sockets, and I'm not sure if I would be able to provide
responses from it.
Louis Rossberg,
Warped Technologies
Perhaps kernel_listen() and related functions (kernel_bind(),
kernel_accept(), etc.) in net/socket.c might do the trick for your use
case? Looking at how the callers of these functions structure their
code might give you enough to go on.
They should work.
There are a couple of issues though:
- There is no getsockopt() support in current kernels.
- You may need to use __sock_create() rather than sock_create_kern()
in order to hold a reference to the network namespace.
It may be possible to use the wakeup callbacks that select/poll use.
But it is probably safer to use blocking operations from a separate
kernel thread.
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)