From owner-freebsd-net Tue Jan 7 17:23:35 2003 Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id EE3D737B405 for ; Tue, 7 Jan 2003 17:23:30 -0800 (PST) Received: from scl8owa02.int.exodus.net (scl8out02.exodus.net [66.35.230.242]) by mx1.FreeBSD.org (Postfix) with ESMTP id 428E343EA9 for ; Tue, 7 Jan 2003 17:23:30 -0800 (PST) (envelope-from Maksim.Yevmenkin@cw.com) Received: from scl8owa01.int.exodus.net ([66.35.230.241]) by scl8owa02.int.exodus.net with Microsoft SMTPSVC(5.0.2195.5329); Tue, 7 Jan 2003 17:23:30 -0800 Received: from exodus.net ([165.193.27.35]) by scl8owa01.int.exodus.net over TLS secured channel with Microsoft SMTPSVC(5.0.2195.5329); Tue, 7 Jan 2003 17:23:29 -0800 Message-ID: <3E1B7CED.8020907@exodus.net> Date: Tue, 07 Jan 2003 17:20:45 -0800 From: Maksim Yevmenkin User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.1) Gecko/20021126 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Doug Ambrisko Cc: net@freebsd.org Subject: Re: if_tap.c interaction bug with netgraph?? References: <200301072316.h07NGuEJ047694@www.ambrisko.com> Content-Type: multipart/mixed; boundary="------------040204080006040801000807" X-OriginalArrivalTime: 08 Jan 2003 01:23:30.0031 (UTC) FILETIME=[8D458FF0:01C2B6B4] Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org This is a multi-part message in MIME format. --------------040204080006040801000807 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Doug, >| >I've run into this bug since about 4.6-stable of some time. I use netgraph >| >to connect to a tap device in vmnet mode since in vmnet mode it is >| >persistan. In tap mode if comes and goes depending on whether or not I >| >have the device open. Anyways I couldn't get data to come in the vmnet >| >node through netgraph with only the interface up, auto source off and >| >promicious on (ie. bridge mode). This patches fixes it by doing >| >and init to get the interface going. Any objections to this change? >| >If you give the interface an IP then it works okay except you shouldn't >| >have to do that. >| >| "vmnet" mode is special. It has been introduced when if_tap and >| vmnet were merged into one driver. I tried to be compatible with old >| vmnet driver (note XXX comment). Just need to make sure this does >| not break VMWare (will try later today). > >Doesn't break vmware for me. I've been running this patch for a long time. >Also I've been doing it under -stable and not -current. I will need to >test this under -current to see what happens before checking it in. > Thank you. >Currently vmware would be broken if you didn't ifconfig tap1 and then >connected it to a physical NIC on the host so you could plumb the >vmware session to a real ethernet port. Something I have done in the >past. Vmware as normaly used wouldn't see this problem since it would >have an IP assigned to it. > >| Another possible solution is to introduce "persistent" mode for tap, i.e. >| a couple of new ioctl()'s for tap device to set/get persistent mode and >| to init tap interface. > >I guess that would work. Since I do most of this from shell scripts >using netgraph to connect things together in strange ways for testing >it's nice not having to use any ioctl's. > I have attached the patch (untested) that implements three new ioctl() for tap device. You might want to try it. I agree ioctl() is not very shell friendly, but you always can write a five lines of C code and call it tapcontrol :) thanks, max --------------040204080006040801000807 Content-Type: text/plain; name="if_tap.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="if_tap.diff" diff -u /sys/net/if_tap.c ./if_tap.c --- /sys/net/if_tap.c Mon Nov 25 15:23:38 2002 +++ ./if_tap.c Tue Jan 7 16:25:06 2003 @@ -464,7 +464,8 @@ * interface, if we are in VMnet mode. just close the device. */ - if (((tp->tap_flags & TAP_VMNET) == 0) && (ifp->if_flags & IFF_UP)) { + if (((tp->tap_flags & TAP_VMNET) == 0) && + ((tp->tap_flags & TAP_PERSIST) == 0) && (ifp->if_flags & IFF_UP)) { s = splimp(); if_down(ifp); if (ifp->if_flags & IFF_RUNNING) { @@ -739,6 +740,21 @@ case SIOCSIFADDR: /* set MAC address of the remote side */ bcopy(data, tp->ether_addr, sizeof(tp->ether_addr)); + break; + + case TAPINIT: + tapifinit(tp); + break; + + case TAPSPERSIST: + if (*(int *)data) + tp->tap_flags |= TAP_PERSIST; + else + tp->tap_flags &= ~TAP_PERSIST; + break; + + case TAPGPERSIST: + *(int *)data = (tp->tap_flags & TAP_PERSIST)? 1 : 0; break; default: diff -u /sys/net/if_tap.h ./if_tap.h --- /sys/net/if_tap.h Fri Apr 5 21:15:29 2002 +++ ./if_tap.h Tue Jan 7 16:22:29 2003 @@ -55,6 +55,9 @@ #define TAPGDEBUG _IOR('t', 89, int) #define TAPSIFINFO _IOW('t', 91, struct tapinfo) #define TAPGIFINFO _IOR('t', 92, struct tapinfo) +#define TAPINIT _IO ('t', 93) +#define TAPSPERSIST _IOW('t', 94, int) +#define TAPGPERSIST _IOW('t', 95, int) /* VMware ioctl's */ #define VMIO_SIOCSIFFLAGS _IO('V', 0) diff -u /sys/net/if_tapvar.h ./if_tapvar.h --- /sys/net/if_tapvar.h Fri Apr 5 21:15:29 2002 +++ ./if_tapvar.h Tue Jan 7 16:20:09 2003 @@ -53,6 +53,7 @@ #define TAP_ASYNC (1 << 3) #define TAP_READY (TAP_OPEN|TAP_INITED) #define TAP_VMNET (1 << 4) +#define TAP_PERSIST (1 << 5) u_int8_t ether_addr[ETHER_ADDR_LEN]; /* ether addr of the remote side */ --------------040204080006040801000807-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message