From owner-freebsd-questions@FreeBSD.ORG Fri May 16 14:20:59 2008 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C2F621065675 for ; Fri, 16 May 2008 14:20:59 +0000 (UTC) (envelope-from freebsd-questions-local@be-well.ilk.org) Received: from be-well.ilk.org (dsl092-078-145.bos1.dsl.speakeasy.net [66.92.78.145]) by mx1.freebsd.org (Postfix) with ESMTP id 5C58A8FC32 for ; Fri, 16 May 2008 14:20:59 +0000 (UTC) (envelope-from freebsd-questions-local@be-well.ilk.org) Received: by be-well.ilk.org (Postfix, from userid 1147) id 3FC15284C7; Fri, 16 May 2008 10:20:58 -0400 (EDT) To: "Bob McConnell" References: <20080514234101.P2316@wojtek.tensor.gdynia.pl> From: Lowell Gilbert Date: Fri, 16 May 2008 10:20:58 -0400 In-Reply-To: (Bob McConnell's message of "Thu\, 15 May 2008 14\:49\:26 -0400") Message-ID: <448wyas52t.fsf@be-well.ilk.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: freebsd-questions@freebsd.org Subject: Re: Unable to talk to tap(4) 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: Fri, 16 May 2008 14:20:59 -0000 "Bob McConnell" writes: > From: Bob McConnell >>From: Wojciech Puchar >>>> >>>> The basic setup sequence is: >>>> >>>> ifconfig tap0 create >>>> ifconfig tap0 inet 10.3.4.254/24 >>>> route -v add 10.3.4.0/24 10.3.4.254 >>> >>> ifconfig tap0 up >>> >>> ? >>> >> >> 'ifconfig' already showed the interface flag UP. Adding this command >> to the sequence has no effect on it. I also tried 'ifconfig tap0 > promisc'. >> >> Is EFAULT really a memory access exception? >> >>>> >>>> At this point, I can ping that address and my application can open >>>> either /dev/net/tap0 or /dev/tap0. But when I try to read() from > those >>>> devices, I have problems. >>>> >>>> /dev/net/tap0 always returns with errno = 19 (ENODEV - Operation not >>>> supported?). >>>> >>>> /dev/tap0 returns errno = 14 (EFAULT - bad address). At this point, >>>> 'ifconfig' shows that the inet address is no longer attached and >>>> 'netstat -rn' shows the route I added above has been dropped. >>>> >>>> I have been searching for several days to find more information > about >>>> this device, but have not found anything specific to FreeBSD. All of > the >>>> examples and instructions are for Linux or tun(4), both of which are >>>> significantly different devices. >>>> >>>> My code so far: >>>> >>>> ----------------- tear along dotted line ----------------- >>>> tapFD = open ("/dev/tap0", O_RDWR); >>>> if (tapFD < 0) { >>>> fprintf (stderr, "Failed to open /dev/tap0: %d.\n", tapFD); >>>> exit (2); >>>> } >>>> >>>> fprintf (stderr, "Successfully opened /dev/tap0.\n"); >>>> >>>> unsigned char * buffer = (unsigned char*)malloc(1514); >>>> if (buffer = NULL) { >>>> fprintf (stderr, "No memory available.\n"); >>>> close (tapFD); >>>> exit(3); >>>> } > > When I replace the malloc with an automatic array, the > error goes away and I get the data I am looking for. i.e.: > > unsigned char buffer[1514]; > > So why can't I use malloc to create that buffer? Maybe you forgot to include stdlib.h? That could end up with the compiler adjusting the parameters incorrectly. Incidentally, this problem is why casting the return value of malloc is discouraged; the compiler would warn about such a problem if the (completely unnecessary) cast were not present. >>>> int lenth = 0; >>>> >>>> again: >>>> lenth = read(tapFD, buffer, 1514); >>>> if (lenth < 0) { >>>> int error = errno; >>>> if (error == EINTR) >>>> goto again; >>>> fprintf (stderr, "tap read error: %d\n", error); >>>> } >>>> else { >>>> int index; >>>> >>>> fprintf (stdout, "%d bytes received.\n", lenth); >>>> for (index = 0; index < lenth; ++index) { >>>> fprintf (stdout, " %02x", buffer[index]); >>>> if (index % 16 == 15) >>>> fprintf (stdout, "\n"); >>>> } >>>> fprintf (stdout, "\n"); >>>> } >>>> >>>> close (tapFD); >>>> ----------------- tear along dotted line ----------------- >>>> >>>> Just in the interest of full disclosure, I am running a stock >>>> installation of FreeBSD 7.0 in a VMWare 5.5.4 session on WinXP. > There >>>> are also two virtual Ethernet cards, one connected to a host only >>>> subnet, the other bridged onto a real Ethernet segment. I am using > IPFW >>>> with DummyNet to inject some measure of reality into this system. >>>> >>>> This is the beginnings of a test bench for several commercial >>>> applications. My goal, once I get this device working, is to write > an >>>> application for tap(4) that will emulate a few hundred embedded > devices, >>>> each opening a socket directly to a server, which currently resides > in >>>> another VM session on the host only network. This setup, coupled > with >>>> real devices on the external network should give us a much more >>>> realistic environment for stress testing our systems. >>>> >>>> Thank you, >>>> >>>> Bob McConnell > _______________________________________________ > freebsd-questions@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-questions > To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.org" > -- Lowell Gilbert, embedded/networking software engineer, Boston area http://be-well.ilk.org/~lowell/