Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk	(revision 13729)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk	(revision 13730)
@@ -142,4 +142,8 @@
 	$(PATH_SUB_CURRENT)
 vboxnetflt_LDFLAGS.solaris += -N drv/vboxdrv
+ifdef VBOXNETFLT_SOLARIS_USE_NETINFO
+ vboxnetflt_DEFS.solaris += VBOXNETFLT_SOLARIS_USE_NETINFO
+ vboxnetflt_LDFLAGS.solaris += -N misc/neti
+endif
 vboxnetflt_LIBS = \
 	$(PATH_LIB)/SUPR0IdcClient$(VBOX_SUFF_LIB)
Index: /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
===================================================================
--- /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 13729)
+++ /trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 13730)
@@ -55,4 +55,13 @@
 #include <sys/sunddi.h>
 #include <sys/sunldi.h>
+
+/*
+ * Experimental: Using netinfo interfaces and queuing out packets.
+ * This is for playing better with IPFilter.
+ */
+#undef VBOXNETFLT_SOLARIS_USE_NETINFO
+#ifdef VBOXNETFLT_SOLARIS_USE_NETINFO
+# include <sys/neti.h>
+#endif
 
 // Workaround for very strange define in sys/user.h
@@ -2047,5 +2056,5 @@
 
                                 /*
-                                 * Inject/Eject from the host IP stack.
+                                 * Inject/Eject from the host IPv6 stack.
                                  */
                                 rc = strioctl(pIp6VNode, fAttach ? _I_INSERT : _I_REMOVE, (intptr_t)&StrMod, 0, K_TO_K,
@@ -3148,4 +3157,42 @@
     if (fDst & INTNETTRUNKDIR_WIRE)
     {
+#ifdef VBOXNETFLT_SOLARIS_USE_NETINFO
+        netstack_t *pNetStack = netstack_get_current();
+        if (pNetStack)
+        {
+            net_data_t pNetData = net_lookup_impl(NHF_INET, pNetStack);
+            if (pNetData)
+            {
+                phy_if_t pInterface = net_phylookup(pNetData, pThis->szName);
+                if (pInterface)
+                {
+                    net_inject_t InjectData;
+                    InjectData.ni_packet = pMsg;
+                    InjectData.ni_physical = pInterface;
+                    bzero(&InjectData.ni_addr, sizeof(InjectData.ni_addr));
+                    InjectData.ni_addr.ss_family = AF_INET;
+
+                    /*
+                     * Queue out rather than direct out transmission.
+                     */
+                    int rc = net_inject(pNetData, NI_QUEUE_OUT, &InjectData);
+                    if (!rc)
+                        rc = VINF_SUCCESS;
+                    else
+                    {
+                        LogRel((DEVICE_NAME ":queuing IP packet for transmission failed. rc=%d\n", rc));
+                        rc = VERR_NET_IO_ERROR;
+                    }
+                }
+                else
+                    LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit failed to lookup physical interface.\n"));
+            }
+            else
+                LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit failed to get IP hooks.\n"));
+            netstack_rele(pNetStack);
+        }
+        else
+            LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit failed to get current net stack.\n"));
+#else
         vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
         if (RT_LIKELY(pPromiscStream))
@@ -3165,4 +3212,6 @@
             }
         }
+#endif
+
     }
 
