From owner-freebsd-net@FreeBSD.ORG Tue Dec 21 11:57:33 2010 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C630E1065670 for ; Tue, 21 Dec 2010 11:57:33 +0000 (UTC) (envelope-from hedayati.mo@gmail.com) Received: from mail-ww0-f68.google.com (mail-ww0-f68.google.com [74.125.82.68]) by mx1.freebsd.org (Postfix) with ESMTP id 60A8D8FC19 for ; Tue, 21 Dec 2010 11:57:32 +0000 (UTC) Received: by wwj40 with SMTP id 40so1458061wwj.7 for ; Tue, 21 Dec 2010 03:57:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:from:date :message-id:subject:to:content-type; bh=AtiqQBG8nFgmp/NF3SeCbasfepWKXiWfi+etaEpbEoo=; b=lJRGZcixYi83nr7p2rpEyBc+Dr2XxvmLKG+4JM07RlkAPYK1jzeKmx2k0L1jvfOOew o7brzSKNipgiGcR6Za3FqJM3CNnP5NVPcb9t3Bm57p6lwRJZZLaFIrGVl1rzrLAMoNrE dxRohZM+hYHgJq3DVJtRTZQZoFgebhvBpSJ4s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=NGnpinRxHoJ2t/dmVmeKBNcQu+1E22+GfDRH/dtuMZLF6vyW9wbcrjp2OgI3wF5/dA OCbiFXGoeZ3CM/fZ5gXJb7XuWQT5b2fQbVO6scqsYUPzgyFNrLdn2wbzvIwTrlGDMbKn tVoMZfCGRfXEBt7ZcOLTIZRP2b9nydYs3odKU= Received: by 10.227.159.68 with SMTP id i4mr3355294wbx.176.1292931611680; Tue, 21 Dec 2010 03:40:11 -0800 (PST) MIME-Version: 1.0 Received: by 10.227.143.202 with HTTP; Tue, 21 Dec 2010 03:39:26 -0800 (PST) From: Mohammad Hedayati Date: Tue, 21 Dec 2010 15:09:26 +0330 Message-ID: To: freebsd-net@freebsd.org Content-Type: text/plain; charset=UTF-8 Subject: SOCK_STREAM socket in kernel space X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Dec 2010 11:57:33 -0000 I'm about to use a char device for a kind of distributed processing, so I've coded the open function as follows. The problem is that soaccept returns 0 without populating the raddr. I've checked netstat, everything seems to be fine, the socket is created, bound and the state is LISTENING. Even the remote is connection is ESTABLISHED. But, it cannot receive anything. it says that socket (sock variable) is not connected. int open(struct cdev *dev, int flag, int otyp, struct thread *td) { uprintf("in open...\n"); int error = -1; socktd = td; error = socreate(AF_INET, &sock, SOCK_STREAM, IPPROTO_TCP, td->td_proc->p_ucred, socktd); if(error != 0) return error; sockaddr.sin_len = sizeof(struct sockaddr_in); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(1234); sockaddr.sin_addr.s_addr = INADDR_ANY; error = sobind(sock, (struct sockaddr *)&sockaddr, socktd); uprintf("sobind error = %d\n", error); error = solisten(sock, 5, socktd); uprintf("solisten error = %d\n", error); error = soaccept(sock, (struct sockaddr **)&raddr); uprintf("soaccept error = %d, ip=%s\n", error, inet_ntoa(raddr->sin_addr)); uprintf("out open...\n"); return(error); } int read(struct cdev *dev, struct uio *uio, int ioflag) { int error = 0; error = soreceive(sock, (struct sockaddr **)&raddr, uio, NULL, NULL, NULL); return(error); }