VirtualBox

Changeset 12531 in vbox for trunk/src


Ignore:
Timestamp:
Sep 17, 2008 9:24:05 AM (16 years ago)
Author:
vboxsync
Message:

Solaris/vboxnetflt: retain instance on recv and writes. Plus other bits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r12326 r12531  
    2828#include <iprt/mem.h>
    2929#include <iprt/thread.h>
     30#include <iprt/spinlock.h>
    3031
    3132#include <inet/ip.h>
     
    760761static int VBoxNetFltSolarisModReadPut(queue_t *pQueue, mblk_t *pMsg)
    761762{
     763    if (!pMsg)
     764        return 0;
     765
    762766    LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut pQueue=%p pMsg=%p\n"));
    763767
    764768    bool fSendUpstream = true;
     769    bool fActive = false;
    765770    vboxnetflt_stream_t *pStream = pQueue->q_ptr;
     771    PVBOXNETFLTINS pThis = NULL;
    766772
    767773    /*
     
    773779        && pMsg)
    774780    {
    775         PVBOXNETFLTINS pThis = vboxNetFltSolarisFindInstance(pStream);
     781        pThis = vboxNetFltSolarisFindInstance(pStream);
    776782        if (RT_LIKELY(pThis))
    777783        {
     784            /*
     785             * Retain the instance if we're actively filtering.
     786             */
     787            RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     788            RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
     789            fActive = ASMAtomicUoReadBool(&pThis->fActive);
     790            if (fActive)
     791                vboxNetFltRetain(pThis, true);
     792            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     793
    778794            switch (DB_TYPE(pMsg))
    779795            {
     
    782798                    LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut M_DATA\n"));
    783799
    784                     vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);
    785                     fSendUpstream = false;          /* vboxNetFltSolarisRecv would send it if required, do nothing more here. */
     800                    if (fActive)
     801                    {
     802                        vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);
     803                        fSendUpstream = false;
     804                    }
    786805                    break;
    787806                }
     
    804823                            LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: DL_UNITDATA_IND\n"));
    805824
    806                             vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);
    807                             fSendUpstream = false;      /* vboxNetFltSolarisRecv would send it if required, do nothing more here. */
     825                            if (fActive)
     826                            {
     827                                vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);
     828                                fSendUpstream = false;
     829                            }
    808830                            break;
    809831                        }
     
    860882                    if (pIOC->ioc_id == pStream->ModeReqId)
    861883                    {
    862                         pStream->fRawMode = !pStream->fRawMode;
     884                        pStream->fRawMode = true;
    863885                        LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: Mode acknowledgement. RawMode is %s\n",
    864886                                pStream->fRawMode ? "ON" : "OFF"));
     
    902924    }
    903925
     926    if (fActive)
     927        vboxNetFltRelease(pThis, true);
     928
    904929    return 0;
    905930}
     
    922947     */
    923948    bool fSendDownstream = true;
     949    bool fActive = false;
    924950    vboxnetflt_stream_t *pStream = pQueue->q_ptr;
     951    PVBOXNETFLTINS pThis = NULL;
    925952
    926953    /*
     
    932959        && pMsg)
    933960    {
    934         PVBOXNETFLTINS pThis = vboxNetFltSolarisFindInstance(pStream);
     961        pThis = vboxNetFltSolarisFindInstance(pStream);
    935962        if (RT_LIKELY(pThis))
    936963        {
     964            /*
     965             * Retain the instance if we're actively filtering.
     966             */
     967            RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     968            RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
     969            fActive = ASMAtomicUoReadBool(&pThis->fActive);
     970            if (fActive)
     971                vboxNetFltRetain(pThis, true);
     972            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     973
    937974            switch (DB_TYPE(pMsg))
    938975            {
     
    9911028                    if (pIOC->ioc_cmd == DL_IOC_HDR_INFO)
    9921029                    {
    993                         if (pThis->fActive)
     1030                        fSendDownstream = false;
     1031
     1032                        /*
     1033                         * Some sanity checks.
     1034                         */
     1035                        if (   !pMsg->b_cont
     1036                            || (MBLKL(pMsg->b_cont) < sizeof(dl_unitdata_req_t) + VBOXNETFLT_DLADDRL)
     1037                            || (*((uint32_t *)pMsg->b_cont->b_rptr) != DL_UNITDATA_REQ))
    9941038                        {
    995                             fSendDownstream = false;
    996 
    997                             /*
    998                              * Some sanity checks.
    999                              */
    1000                             if (   !pMsg->b_cont
    1001                                 || (MBLKL(pMsg->b_cont) < sizeof(dl_unitdata_req_t) + VBOXNETFLT_DLADDRL)
    1002                                 || (*((uint32_t *)pMsg->b_cont->b_rptr) != DL_UNITDATA_REQ))
    1003                             {
    1004                                 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid fast path request!\n"));
    1005                                 miocnak(pQueue, pMsg, 0, EPROTO);
    1006                                 break;
    1007                             }
    1008 
    1009                             dl_unitdata_req_t *pDlReq = (dl_unitdata_req_t *)pMsg->b_cont->b_rptr;
    1010                             size_t cbOffset = pDlReq->dl_dest_addr_offset;
    1011                             size_t cbAddr = pDlReq->dl_dest_addr_length;
    1012                             if (   !MBLKIN(pMsg->b_cont, cbOffset, cbAddr)
    1013                                 || cbAddr != VBOXNETFLT_DLADDRL)
    1014                             {
    1015                                 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid header in fast path request!\n"));
    1016                                 miocnak(pQueue, pMsg, 0, EPROTO);
    1017                                 break;
    1018                             }
    1019 
    1020                             vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_cont->b_rptr + cbOffset);
    1021                             mblk_t *pReplyMsg = allocb(sizeof(RTNETETHERHDR), BPRI_MED);
    1022                             if (RT_UNLIKELY(!pReplyMsg))
    1023                             {
    1024                                 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid header in fast path request!\n"));
    1025                                 miocnak(pQueue, pMsg, 0, ENOMEM);
    1026                                 break;                               
    1027                             }
    1028 
    1029                             PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
    1030                             bcopy(&pDLSapAddr->Mac, &pEthHdr->DstMac, sizeof(RTMAC));
    1031                             bcopy(&pThis->u.s.Mac, &pEthHdr->SrcMac, sizeof(RTMAC));
    1032                             pEthHdr->EtherType = RT_H2BE_U16(pDLSapAddr->SAP);
    1033 
    1034                             linkb(pMsg, pReplyMsg);
    1035 
    1036                             /*
    1037                              * Somebody is wanting fast path when we need raw mode.
    1038                              * Since we are evil, let's acknowledge the request ourselves!
    1039                              */
    1040                             miocack(pQueue, pMsg, msgsize(pMsg->b_cont), EINVAL);
    1041                             LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Fast path request acknowledged.\n"));
     1039                            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid fast path request!\n"));
     1040                            miocnak(pQueue, pMsg, 0, EPROTO);
     1041                            break;
    10421042                        }
     1043
     1044                        dl_unitdata_req_t *pDlReq = (dl_unitdata_req_t *)pMsg->b_cont->b_rptr;
     1045                        size_t cbOffset = pDlReq->dl_dest_addr_offset;
     1046                        size_t cbAddr = pDlReq->dl_dest_addr_length;
     1047                        if (   !MBLKIN(pMsg->b_cont, cbOffset, cbAddr)
     1048                            || cbAddr != VBOXNETFLT_DLADDRL)
     1049                        {
     1050                            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid header in fast path request!\n"));
     1051                            miocnak(pQueue, pMsg, 0, EPROTO);
     1052                            break;
     1053                        }
     1054
     1055                        vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_cont->b_rptr + cbOffset);
     1056                        mblk_t *pReplyMsg = allocb(sizeof(RTNETETHERHDR), BPRI_MED);
     1057                        if (RT_UNLIKELY(!pReplyMsg))
     1058                        {
     1059                            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Invalid header in fast path request!\n"));
     1060                            miocnak(pQueue, pMsg, 0, ENOMEM);
     1061                            break;                               
     1062                        }
     1063
     1064                        PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
     1065                        bcopy(&pDLSapAddr->Mac, &pEthHdr->DstMac, sizeof(RTMAC));
     1066                        bcopy(&pThis->u.s.Mac, &pEthHdr->SrcMac, sizeof(RTMAC));
     1067                        pEthHdr->EtherType = RT_H2BE_U16(pDLSapAddr->SAP);
     1068
     1069                        linkb(pMsg, pReplyMsg);
     1070
     1071                        /*
     1072                         * Somebody is wanting fast path when we need raw mode.
     1073                         * Since we are evil, let's acknowledge the request ourselves!
     1074                         */
     1075                        miocack(pQueue, pMsg, msgsize(pMsg->b_cont), EINVAL);
     1076                        LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModWritePut: Fast path request acknowledged.\n"));
    10431077                    }
    10441078                    break;
     
    10941128            putq(pQueue, pMsg);
    10951129    }
     1130
     1131    if (fActive)
     1132        vboxNetFltRelease(pThis, true);
    10961133
    10971134    return 0;
     
    21602197    PINTNETSG pSG = (PINTNETSG)alloca(RT_OFFSETOF(INTNETSG, aSegs[cSegs]));
    21612198    int rc = vboxNetFltSolarisMBlkToSG(pThis, pMsg, pSG, cSegs, fSrc);
    2162     if (VBOX_FAILURE(rc))
     2199    if (RT_FAILURE(rc))
    21632200    {
    21642201        LogRel((DEVICE_NAME ":vboxNetFltSolarisMBlkToSG failed. rc=%d\n", rc));
     
    23772414
    23782415    PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr;
     2416    uint8_t *pb = pMsg->b_rptr;
    23792417    if (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPV4))
    23802418    {
     
    23832421        if (RTNetIPv4IsHdrValid(pIpHdr, cbLen, cbLen))
    23842422        {
    2385             uint8_t *pb = pMsg->b_rptr;
    23862423            if (pIpHdr->ip_p == RTNETIPV4_PROT_ICMP)
    23872424                LogFlow((DEVICE_NAME ":ICMP D=%.6Rhxs  S=%.6Rhxs  T=%04x\n", pb, pb + 6, RT_BE2H_U16(*(uint16_t *)(pb + 12))));
     
    23912428                LogFlow((DEVICE_NAME ":UDP D=%.6Rhxs  S=%.6Rhxs\n", pb, pb + 6));
    23922429        }
     2430        else if (!pMsg->b_cont)
     2431        {
     2432            LogFlow((DEVICE_NAME ":Invalid IP header.\n"));
     2433        }
    23932434        else
    23942435        {
    2395             LogFlow((DEVICE_NAME ":Invalid IP header.\n"));
    2396             return;
     2436            LogFlow((DEVICE_NAME ":Chained IP packet. Skipped validity check.\n"));
    23972437        }
    23982438    }
     
    24022442        LogFlow((DEVICE_NAME ":ARP Op=%d\n", pArpHdr->ar_oper));
    24032443    }
     2444    else if (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPV6))
     2445    {
     2446        LogFlow((DEVICE_NAME ":IPv6 D=%.6Rhxs S=%.6Rhxs\n", pb, pb + 6));       
     2447    }
     2448    else if (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPX_1)
     2449             || pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPX_2)
     2450             || pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPX_3))
     2451    {
     2452        LogFlow((DEVICE_NAME ":IPX packet.\n"));
     2453    }   
    24042454    else
    24052455    {
     
    24152465{
    24162466    vboxnetflt_stream_t *pStream = pThis->u.s.pvStream;
    2417     return pStream->fPromisc;
     2467    if (pStream)
     2468        return pStream->fPromisc;
     2469
     2470    LogRel((DEVICE_NAME ":vboxNetFltPortOsIsPromiscuous stream not found!!\n"));
     2471    return false;
    24182472}
    24192473
     
    24562510     */
    24572511    vboxnetflt_stream_t *pStream = pThis->u.s.pvStream;
    2458     Assert(pStream->Type == kIpStream);
    2459     int rc = vboxNetFltSolarisPromiscReq(pStream->pReadQueue, fActive);
    2460     if (VBOX_FAILURE(rc))
    2461         LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive failed to request promiscuous mode! rc=%d\n", rc));
     2512    if (pStream)
     2513    {
     2514        int rc = vboxNetFltSolarisPromiscReq(pStream->pReadQueue, fActive);
     2515        if (RT_FAILURE(rc))
     2516            LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive failed to request promiscuous mode! rc=%d\n", rc));
     2517    }
     2518    else
     2519        LogRel((DEVICE_NAME ":vboxNetFltPortOsSetActive stream not found!\n"));
    24622520}
    24632521
     
    25572615        mblk_t *pDlpiMsg;
    25582616        int rc = vboxNetFltSolarisRawToUnitData(pMsg, &pDlpiMsg);
    2559         if (VBOX_FAILURE(rc))
     2617        if (RT_FAILURE(rc))
    25602618        {
    25612619            LogRel((DEVICE_NAME ":vboxNetFltSolarisRawToUnitData failed! rc=%d\n", rc));
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette