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>