365
365
static VBOXNETFLTGLOBALS g_VBoxNetFltSolarisGlobals;
367
367
/** The list of all opened streams. */
368
vboxnetflt_stream_t *g_VBoxNetFltSolarisStreams;
368
vboxnetflt_stream_t *g_VBoxNetFltSolarisStreams = NULL;
370
370
/** Global mutex protecting open/close. */
371
371
static RTSEMFASTMUTEX g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
373
/** Global credentials using during open/close. */
374
static cred_t *g_pVBoxNetFltSolarisCred = NULL;
374
377
* g_VBoxNetFltInstance is the current PVBOXNETFLTINS to be associated with the stream being created
375
378
* in ModOpen. This is just shared global data between the dynamic attach and the ModOpen procedure.
377
PVBOXNETFLTINS volatile g_VBoxNetFltSolarisInstance;
380
PVBOXNETFLTINS volatile g_VBoxNetFltSolarisInstance = NULL;
379
382
/** Goes along with the instance to determine type of stream being opened/created. */
380
VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType;
383
VBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType = kUndefined;
408
411
g_VBoxNetFltSolarisStreams = NULL;
409
412
g_VBoxNetFltSolarisInstance = NULL;
411
int rc = RTSemFastMutexCreate(&g_VBoxNetFltSolarisMtx);
413
g_pVBoxNetFltSolarisCred = crdup(kcred);
414
if (RT_LIKELY(g_pVBoxNetFltSolarisCred))
415
* Initialize the globals and connect to the support driver.
417
* This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv)
418
* for establishing the connect to the support driver.
420
memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
421
rc = vboxNetFltInitGlobalsAndIdc(&g_VBoxNetFltSolarisGlobals);
416
rc = RTSemFastMutexCreate(&g_VBoxNetFltSolarisMtx);
422
417
if (RT_SUCCESS(rc))
424
rc = mod_install(&g_VBoxNetFltSolarisModLinkage);
428
LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
429
vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltSolarisGlobals);
420
* Initialize the globals and connect to the support driver.
422
* This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv)
423
* for establishing the connect to the support driver.
425
memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
426
rc = vboxNetFltInitGlobalsAndIdc(&g_VBoxNetFltSolarisGlobals);
429
rc = mod_install(&g_VBoxNetFltSolarisModLinkage);
433
LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
434
vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltSolarisGlobals);
437
LogRel((DEVICE_NAME ":failed to initialize globals.\n"));
439
RTSemFastMutexDestroy(g_VBoxNetFltSolarisMtx);
440
g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
432
LogRel((DEVICE_NAME ":failed to initialize globals.\n"));
434
RTSemFastMutexDestroy(g_VBoxNetFltSolarisMtx);
435
g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
445
LogRel((DEVICE_NAME ":failed to allocate credentials.\n"));
474
if (g_pVBoxNetFltSolarisCred)
476
crfree(g_pVBoxNetFltSolarisCred);
477
g_pVBoxNetFltSolarisCred = NULL;
463
480
if (g_VBoxNetFltSolarisMtx != NIL_RTSEMFASTMUTEX)
465
482
RTSemFastMutexDestroy(g_VBoxNetFltSolarisMtx);
606
623
LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModOpen pQueue=%p pDev=%p fOpenMode=%d fStreamMode=%d\n", pQueue, pDev,
607
624
fOpenMode, fStreamMode));
609
int rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
610
AssertRCReturn(rc, rc);
615
629
if (pQueue->q_ptr)
617
631
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen invalid open.\n"));
618
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
636
* Check that the request was initiated by our code.
638
* This ASSUMES that crdup() will return a copy with a unique address and
639
* not do any kind of clever pooling. This check will when combined with
640
* g_VBoxNetFltSolarisMtx prevent races and that the instance gets
641
* associated with the wrong streams.
643
if (pCred != g_pVBoxNetFltSolarisCred)
645
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen invalid credentials.\n"));
623
650
* Check for the VirtualBox instance.
625
652
PVBOXNETFLTINS pThis = g_VBoxNetFltSolarisInstance;
628
655
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to get VirtualBox instance.\n"));
629
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
634
660
* Check VirtualBox stream type.
636
if (g_VBoxNetFltSolarisStreamType == kUndefined)
662
if ( g_VBoxNetFltSolarisStreamType != kPromiscStream
663
&& g_VBoxNetFltSolarisStreamType != kArpStream
664
&& g_VBoxNetFltSolarisStreamType != kIp6Stream
665
&& g_VBoxNetFltSolarisStreamType != kIp4Stream)
638
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode.\n"));
639
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
667
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode. Type=%d\n", g_VBoxNetFltSolarisStreamType));
707
733
case kPromiscStream: ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.pvPromiscStream, pStream); break;
708
734
default: /* Heh. */
710
AssertRelease(pStream->Type);
736
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen huh!? Invalid stream type %d\n", pStream->Type));
722
749
*ppPrevStream = pStream;
725
* Release global lock, & do not hold locks across putnext calls.
752
* Increment IntNet reference count for this stream.
727
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
754
vboxNetFltRetain(pThis, false /* fBusy */);
729
756
qprocson(pQueue);
795
821
LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModClose pQueue=%p fOpenMode=%d\n", pQueue, fOpenMode));
797
int rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
798
AssertRCReturn(rc, rc);
800
823
vboxnetflt_stream_t *pStream = NULL;
801
824
vboxnetflt_stream_t **ppPrevStream = NULL;
807
830
if (RT_UNLIKELY(!pStream))
809
832
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModClose failed to get stream.\n"));
810
vboxNetFltRelease(pStream->pThis, false /* fBusy */);
811
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
1690
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to find %s in the host stack.\n"));
1713
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to find %s in the host stack.\n", DEVICE_NAME));
1693
1716
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to get module information. rc=%d\n"));
1822
g_VBoxNetFltSolarisInstance = pThis;
1823
g_VBoxNetFltSolarisStreamType = kPromiscStream;
1825
rc = ldi_ioctl(pThis->u.s.hIface, I_PUSH, (intptr_t)DEVICE_NAME, FKIOCTL, kcred, &ret);
1827
g_VBoxNetFltSolarisInstance = NULL;
1828
g_VBoxNetFltSolarisStreamType = kUndefined;
1845
if (RT_LIKELY(g_pVBoxNetFltSolarisCred)) /* Paranoia */
1847
rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
1848
AssertRCReturn(rc, rc);
1850
g_VBoxNetFltSolarisInstance = pThis;
1851
g_VBoxNetFltSolarisStreamType = kPromiscStream;
1853
rc = ldi_ioctl(pThis->u.s.hIface, I_PUSH, (intptr_t)DEVICE_NAME, FKIOCTL, g_pVBoxNetFltSolarisCred, &ret);
1855
g_VBoxNetFltSolarisInstance = NULL;
1856
g_VBoxNetFltSolarisStreamType = kUndefined;
1858
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
1862
LogRel((DEVICE_NAME ":vboxNetFltSolarisOpenStream huh!? Missing credentials.\n"));
1863
rc = VERR_INVALID_POINTER;
1831
1867
return VINF_SUCCESS;
1839
1875
LogRel((DEVICE_NAME ":vboxNetFltSolarisOpenStream Failed to search for filter in interface '%s'.\n", pThis->szName));
1877
ldi_close(pThis->u.s.hIface, FREAD | FWRITE, kcred);
1841
1879
return VERR_INTNET_FLT_IF_FAILED;
1852
1890
LogFlow((DEVICE_NAME ":vboxNetFltSolarisCloseStream pThis=%p\n"));
1854
vboxNetFltRetain(pThis, false /* fBusy */);
1856
1892
ldi_close(pThis->u.s.hIface, FREAD | FWRITE, kcred);
1982
2018
* Inject/Eject from the host IP stack.
1985
vboxNetFltRetain(pThis, false /* fBusy */);
1988
2022
* Set global data which will be grabbed by ModOpen.
1989
2023
* There is a known (though very unlikely) race here because
1990
2024
* of the inability to pass user data while inserting.
1992
g_VBoxNetFltSolarisInstance = pThis;
1993
g_VBoxNetFltSolarisStreamType = kIp4Stream;
2026
rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
2027
AssertRCReturn(rc, rc);
2031
g_VBoxNetFltSolarisInstance = pThis;
2032
g_VBoxNetFltSolarisStreamType = kIp4Stream;
1995
2035
rc = strioctl(pIp4VNode, fAttach ? _I_INSERT : _I_REMOVE, (intptr_t)&StrMod, 0, K_TO_K,
1998
g_VBoxNetFltSolarisInstance = NULL;
1999
g_VBoxNetFltSolarisStreamType = kUndefined;
2036
g_pVBoxNetFltSolarisCred, &ret);
2040
g_VBoxNetFltSolarisInstance = NULL;
2041
g_VBoxNetFltSolarisStreamType = kUndefined;
2044
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
2004
vboxNetFltRetain(pThis, false /* fBusy */);
2007
2049
* Inject/Eject from the host ARP stack.
2009
g_VBoxNetFltSolarisInstance = pThis;
2010
g_VBoxNetFltSolarisStreamType = kArpStream;
2051
rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
2052
AssertRCReturn(rc, rc);
2056
g_VBoxNetFltSolarisInstance = pThis;
2057
g_VBoxNetFltSolarisStreamType = kArpStream;
2012
2060
rc = strioctl(pArpVNode, fAttach ? _I_INSERT : _I_REMOVE, (intptr_t)&ArpStrMod, 0, K_TO_K,
2015
g_VBoxNetFltSolarisInstance = NULL;
2016
g_VBoxNetFltSolarisStreamType = kUndefined;
2061
g_pVBoxNetFltSolarisCred, &ret);
2065
g_VBoxNetFltSolarisInstance = NULL;
2066
g_VBoxNetFltSolarisStreamType = kUndefined;
2069
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
2061
2114
strioctl(pIp4VNode, _I_REMOVE, (intptr_t)&StrMod, 0, K_TO_K, kcred, &ret);
2063
2116
vboxNetFltSolarisRelinkIp4(pUdp4VNode, &Ip4Interface, Ip4MuxFd, ArpMuxFd);
2066
vboxNetFltRelease(pThis, false /* fBusy */);
2070
2120
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to %s the IP stack. rc=%d\n",
2071
2121
fAttach ? "inject into" : "eject from", rc));
2074
g_VBoxNetFltSolarisInstance = NULL;
2075
g_VBoxNetFltSolarisStreamType = kUndefined;
2078
vboxNetFltRelease(pThis, false /* fBusy */);
2081
2125
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to find position. rc=%d rc2=%d\n", rc, rc2));
2214
2258
rc = vboxNetFltSolarisDetermineModPos(fAttach, pIp6VNode, &StrMod.pos);
2215
2259
if (RT_SUCCESS(rc))
2218
vboxNetFltRetain(pThis, false /* fBusy */);
2221
2262
* Set global data which will be grabbed by ModOpen.
2222
2263
* There is a known (though very unlikely) race here because
2223
2264
* of the inability to pass user data while inserting.
2225
g_VBoxNetFltSolarisInstance = pThis;
2226
g_VBoxNetFltSolarisStreamType = kIp6Stream;
2266
rc = RTSemFastMutexRequest(g_VBoxNetFltSolarisMtx);
2267
AssertRCReturn(rc, rc);
2271
g_VBoxNetFltSolarisInstance = pThis;
2272
g_VBoxNetFltSolarisStreamType = kIp6Stream;
2229
2276
* Inject/Eject from the host IPv6 stack.
2231
2278
rc = strioctl(pIp6VNode, fAttach ? _I_INSERT : _I_REMOVE, (intptr_t)&StrMod, 0, K_TO_K,
2279
g_pVBoxNetFltSolarisCred, &ret);
2235
2283
g_VBoxNetFltSolarisInstance = NULL;
2236
2284
g_VBoxNetFltSolarisStreamType = kUndefined;
2287
RTSemFastMutexRelease(g_VBoxNetFltSolarisMtx);
2239
2292
* Our job's not yet over; we need to relink the upper and lower streams
2240
2293
* otherwise we've pretty much screwed up the host interface.
2271
2324
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to %s the IP stack. rc=%d\n",
2272
2325
fAttach ? "inject into" : "eject from", rc));
2274
vboxNetFltRelease(pThis, false /* fBusy */);
2351
2402
ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, true);
2352
2403
vboxNetFltSolarisCloseStream(pThis);
2353
int rc = vboxNetFltSolarisAttachIp4(pThis, false /* fAttach */);
2404
int rc = VINF_SUCCESS;
2405
if (pThis->u.s.pvIp4Stream)
2406
rc = vboxNetFltSolarisAttachIp4(pThis, false /* fAttach */);
2354
2407
if (pThis->u.s.pvIp6Stream)
2355
2408
rc = vboxNetFltSolarisAttachIp6(pThis, false /* fAttach */);