Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 07 Jan 2003 17:20:45 -0800
From:      Maksim Yevmenkin <myevmenk@exodus.net>
To:        Doug Ambrisko <ambrisko@ambrisko.com>
Cc:        net@freebsd.org
Subject:   Re: if_tap.c interaction bug with netgraph??
Message-ID:  <3E1B7CED.8020907@exodus.net>
References:  <200301072316.h07NGuEJ047694@www.ambrisko.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3E1B7CED.8020907>