Re: Example network protocol implementation

2006-12-11 Thread Robert Watson

On Sat, 9 Dec 2006, Vishal Patil wrote:

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. Thanks


Here are some consumers of sockets in the kernel:

- NFS client, which creates and connects both UDP and TCP sockets, uses them
  for I/O, etc.

- NFS server, which uses UDP and TCP sockets for I/O.  Unlike the NFS client,
  it doesn't open the sockets in kernel, rather, it relies on a user process
  (nfsd) passing validated sockets into the kernel.

- System V streams (dev/streams), which uses socket pairs to implement
  streams.  Does creation and I/O.

- fifofs, which implements POSIX fifos using a pair of UNIX domain sockets.
  Again, does creation and I/O.

- portalfs, which implements the portal file system using sockets.

- ng_ksocket, which provides a netgraph interface to sockets in the kernel.

- netncp, which provides an NCP RPC interface over SPX/IPX for nwfs.

- netsmb, which provides an SMB RPC interface over TCP/IP for smbfs.

- rpclnt, which is used by the nfs4client, and is functionally similar to the
  NFS client RPC code for NFS2/NFS3 in nfsclient.

- bootp_subr.c and krpc_subr.c, which are used by the NFS root code to set up
  NFS access during a diskless boot: they perform the bootp exchange to
  retrieve an IP address, and then the necessary RPC mount protocol to query a
  root file handle to set up the NFS client for the file system root.

All of these examples have upsides and downsides, and vary in maturity.  I'd 
probably start by looking at the NFS client and fifofs.  One of the biggest 
questions you'll need to answer is what your event model is and how it will 
relate to any worker threads you may have.  Many of the in-kernel socket 
consumers use socket upcalls to get direct notifications of socket events from 
within the network stack, allowing for fast socket draining and TCP acking. 
On the other hand, in the netisr/ithread context, you can't perform blocking 
memory allocation and disk I/O, so if that will be involved, you'll need 
worker threads in the style of the NFS server.


Robert N M Watson
Computer Laboratory
University of Cambridge
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Example network protocol implementation

2006-12-09 Thread Vishal Patil

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.
Thanks

- Vishal
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Example network protocol implementation

2006-12-09 Thread perryh
Vishal Patil [EMAIL PROTECTED] wrote:

 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.

NFS normally runs over UDP, not TCP.  Telnet is one of the simpler
TCP-based applications, but it is not done in the kernel (nor are
most network apps).  Is there some particular reason why you need
an example that is implemented inside the kernel, vs in userland?
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Example network protocol implementation

2006-12-09 Thread Daniel Molina Wegener
On Saturday 09 December 2006 17:18, Vishal Patil wrote:
 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.

  Try looking at telnet(1) and telnetd(8) source code, also 
fetch(1) should works too...

 Thanks

 - Vishal
 ___
 freebsd-hackers@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
 To unsubscribe, send any mail to
 [EMAIL PROTECTED]

Best regards,
-- 
 . 0 . | Daniel Molina Wegener
 . . 0 | dmw at unete dot cl
 0 0 0 | FreeBSD User
___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Example network protocol implementation

2006-12-09 Thread Vishal Patil

For implementing iSCSI protocol as a kernel driver.

On 12/9/06, [EMAIL PROTECTED] [EMAIL PROTECTED] wrote:


Vishal Patil [EMAIL PROTECTED] wrote:

 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.

NFS normally runs over UDP, not TCP.  Telnet is one of the simpler
TCP-based applications, but it is not done in the kernel (nor are
most network apps).  Is there some particular reason why you need
an example that is implemented inside the kernel, vs in userland?


___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: Example network protocol implementation

2006-12-09 Thread M. Warner Losh
In message: [EMAIL PROTECTED]
Vishal Patil [EMAIL PROTECTED] 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


___
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to [EMAIL PROTECTED]