Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Jun 2007 21:39:58 +0200
From:      "Nicolas Cormier" <n.cormier@gmail.com>
To:        "John Polstra" <jdp@polstra.com>
Cc:        freebsd-hackers@freebsd.org, Julian Elischer <julian@elischer.org>
Subject:   Re: in-kernel tcp server
Message-ID:  <c4630b800706201239jdf09685t1574e78493492029@mail.gmail.com>
In-Reply-To: <46797825.10900@polstra.com>
References:  <c4630b800706180227x2f1f433dr4ef55e8623062bf1@mail.gmail.com> <467787EF.9060009@elischer.org> <46797825.10900@polstra.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 6/20/07, John Polstra <jdp@polstra.com> wrote:
> Julian Elischer wrote:
> > Nicolas Cormier wrote:
> >> Hi,
> >>
> >> I'm trying to write a little tcp-server kernel module (like tftp).
> >> I didn't find a lot of documents about the kernel network programming,
> >> just one thread which talks about netgraph.
> >> In the freebsd includes I found /usr/include/sys/socketvar.h (so*).
> >>
> >> What's the easy way to create a basic tcp server
> >> (create/bind/listen/accept/send/recv) : use netgraph's ksocket or so*
> >> ?
> >>
> >> Thanks in advance !
> >> PS: the whole job must be done in the kernel.
> >
> >
> >
> > yes it can (and has been) done..
> > John Polstra did it many years ago.. using netgraph ksockets.
> > He had an in-kernel web server.
> > At least I THINK it was him :-)
>
> Yes, that's right.  I started out using netgraph ksockets, but later on
> it evolved, mainly for performance reasons.  (I needed it to be really,
> really fast.)  The first change was that I eliminated the ksockets and
> worked directly at the link layer, using ng_ether nodes.  I implemented
> a small, stripped down TCP stack and bypassed the FreeBSD native
> TCP/IP/socket layers.  This was still done with netgraph, using just the
> ng_ether nodes talking to my own ng_webclient / ng_webserver nodes.  It
> improved the performance immensely.
>
> More recently I restructured it quite a bit to get better MP performance
> using FreeBSD 7.x.  (The original version was based on 4.x).  I found
> that the netgraph locking and internode communication mechanism impacted
> performance too much under 7.x.  So I eliminated the ng_ether nodes and
> made the webserver / webclient nodes talk directly to the interfaces via
> the if_input / if_output hooks.  It still uses netgraph, but really only
> as a configuration and management mechanism.  No actual network traffic
> flows between netgraph nodes.  This change also resulted in a big
> performance improvement.

Thx, I have started with ng_ksockets, for the now it is sufficient.

> Unfortunately, my contract forbids me to release the source code publicly.

Bad news !
Thanks a lot for your answer, a last question "why did you not used
so* functions ?"
-- 
Nicolas Cormier



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c4630b800706201239jdf09685t1574e78493492029>