Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 09 Dec 2006 22:25:26 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        bsd.devil@gmail.com
Cc:        freebsd-hackers@FreeBSD.ORG, freebsd-questions@FreeBSD.ORG
Subject:   Re: Example network protocol implementation
Message-ID:  <20061209.222526.-816359937.imp@bsdimp.com>
In-Reply-To: <eb7c8e2e0612091218r61bb72b4q49faee99d85c509d@mail.gmail.com>
References:  <eb7c8e2e0612091218r61bb72b4q49faee99d85c509d@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <eb7c8e2e0612091218r61bb72b4q49faee99d85c509d@mail.gmail.com>
            "Vishal Patil" <bsd.devil@gmail.com> writes:
: Could someone point me to an example that shows a SIMPLE network protocol
: implemented over TCP/IP inside the FreeBSD kernel. I think I could look at
: the NFS client driver but is there an example simpler than that. Also is
: there a guide explaining how to go about developing TCP/IP based network
: protocols for FreeBSD.

[ to implement iSCSI in the kernel ]

I'm unsure which side you wish to be on.

There's accept filters that you can write, but I doubt that's what you
want to do.  This would be good if you are implementing an iSCSI
target on FreeBSD, maybe (then again, maybe not).

If you want to be an iSCSI initiator (I think that's the right term),
then you'll need to do things similar to what
sys/nfsclient/nfs_socket.c does.  I could do a quick code walkthrough,
but you'd likely be better off studying the nfs code since it will
give you a better understanding than I can in a few lines.  In
addition, because locking has changed over time, the exact version
matters.  Careful study will show differences in what locks are
needed, if any.

But in a nutshell, you call socreate to get a socket.  You setup the
various fields in the socket data structures.  You call sosetopt to do
the latter.  sobind will set this host's endpoint, and soconnect will
connect the socket to the remote side.  You'll need to setup send and
receive buffers and manage them with soreceive and sosend.  there's
some callbacks that also need to be established as well.  And some
socket layer locking that may be exposed to your code because there
are so few in-kernel protocol implementations that aren't peers to
TCP, UDP or IP.

I hope this helps.

Warner





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