From owner-freebsd-questions@FreeBSD.ORG Sun Dec 10 05:27:25 2006 Return-Path: X-Original-To: freebsd-questions@FreeBSD.ORG Delivered-To: freebsd-questions@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 1FD3016A40F; Sun, 10 Dec 2006 05:27:25 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (vc4-2-0-87.dsl.netrack.net [199.45.160.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id 68E6343C9F; Sun, 10 Dec 2006 05:26:16 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from localhost (localhost [127.0.0.1]) by harmony.bsdimp.com (8.13.4/8.13.4) with ESMTP id kBA5OUw7065670; Sat, 9 Dec 2006 22:24:30 -0700 (MST) (envelope-from imp@bsdimp.com) Date: Sat, 09 Dec 2006 22:25:26 -0700 (MST) Message-Id: <20061209.222526.-816359937.imp@bsdimp.com> To: bsd.devil@gmail.com From: "M. Warner Losh" In-Reply-To: References: X-Mailer: Mew version 4.2 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0 (harmony.bsdimp.com [127.0.0.1]); Sat, 09 Dec 2006 22:24:30 -0700 (MST) Cc: freebsd-hackers@FreeBSD.ORG, freebsd-questions@FreeBSD.ORG Subject: Re: Example network protocol implementation X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Dec 2006 05:27:25 -0000 In message: "Vishal Patil" 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