2021-05-17 03:18:39

by Neal Cardwell

[permalink] [raw]
Subject: Re: Listening on a TCP socket from a Kernel Module

On Sun, May 16, 2021 at 7:20 PM louisrossberg
<[email protected]> 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


2021-05-17 18:25:06

by David Laight

[permalink] [raw]
Subject: RE: Listening on a TCP socket from a Kernel Module

From: Neal Cardwell
> Sent: 17 May 2021 02:55
>
> On Sun, May 16, 2021 at 7:20 PM louisrossberg
> <[email protected]> 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.

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)