VirtualBox

Ignore:
Timestamp:
Sep 21, 2008 11:47:07 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36894
Message:

Solaris/vboxnetflt: race handling, more paranoid.

File:
1 edited

Legend:

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

    r12606 r12618  
    604604    }
    605605
     606    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     607    PVBOXNETFLTINS pThis = pState->pCurInstance;
     608    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
     609
    606610    /*
    607611     * Check VirtualBox stream type.
     
    610614    {
    611615        LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode.\n"));
     616
     617        RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    612618        return ENOENT;
    613619    }
     
    638644        {
    639645            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate promiscuous stream data.\n"));
     646
     647            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    640648            return ENOMEM;
    641649        }
     
    656664        {
    657665            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate stream data.\n"));
     666   
     667            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    658668            return ENOMEM;
    659669        }
     
    666676     * the one that we will associate this stream with.
    667677     */
    668     pStream->pThis = pState->pCurInstance;
     678    pStream->pThis = pThis;
    669679    pStream->Type = pState->CurType;
    670680    switch (pStream->Type)
    671681    {
    672         case kIpStream:         pState->pCurInstance->u.s.pvIpStream = pStream;         break;
    673         case kArpStream:        pState->pCurInstance->u.s.pvArpStream = pStream;        break;
    674         case kPromiscStream:    pState->pCurInstance->u.s.pvPromiscStream = pStream;    break;
    675         default:    AssertRelease(pStream->Type);   break;
     682        case kIpStream:         ASMAtomicUoWritePtr(&pThis->u.s.pvIpStream, pStream);         break;
     683        case kArpStream:        ASMAtomicUoWritePtr(&pThis->u.s.pvArpStream, pStream);        break;
     684        case kPromiscStream:    ASMAtomicUoWritePtr(&pThis->u.s.pvPromiscStream, pStream);    break;
     685        default:    /* Heh. */
     686        {
     687                RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     688                AssertRelease(pStream->Type);
     689                break;
     690        }
    676691    }
    677692
     
    693708        /*
    694709         * Bind to SAP 0 (DL_ETHER).
    695          * Note: We don't support DL_TPR (token passing ring) SAP as that is
    696          * unnecessary asynchronous work to get DL_INFO_REQ acknowledgements
    697          * and determine SAP based on the Mac Type etc. Besides nobody uses
    698          * TPR anymore as far as I know.
     710         * Note: We don't support DL_TPR (token passing ring) SAP as that is unnecessary asynchronous
     711         * work to get DL_INFO_REQ acknowledgements and determine SAP based on the Mac Type etc.
     712         * Besides TPR doesn't really exist anymore practically as far as I know.
    699713         */
    700714        int rc = vboxNetFltSolarisBindReq(pStream->pReadQueue, 0 /* SAP */);
    701         if (RT_UNLIKELY(RT_FAILURE(rc)))
    702         {
     715        if (RT_LIKELY(RT_SUCCESS(rc)))
     716        {
     717            /*
     718             * Request the physical address (we cache the acknowledgement).
     719             */
     720            /** @todo take a look at DLPI notifications additionally for these things. */
     721            rc = vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue);
     722            if (RT_LIKELY(RT_SUCCESS(rc)))
     723            {
     724                /*
     725                 * Enable raw mode.
     726                 */
     727                rc = vboxNetFltSolarisSetRawMode(pPromiscStream);
     728                if (RT_FAILURE(rc))
     729                    LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc));
     730            }
     731            else
     732                LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc));
     733        }
     734        else       
    703735            LogRel((DEVICE_NAME ":vboxNetFltSolarisBindReq failed rc=%Vrc.\n", rc));
     736
     737        if (RT_FAILURE(rc))
     738        {
     739            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    704740            return EPROTO;
    705         }
    706 
    707         /*
    708          * Request the physical address (we cache the acknowledgement).
    709          */
    710         /** @todo take a look at DLPI notifications additionally for these things. */
    711         rc = vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue);
    712         if (RT_UNLIKELY(RT_FAILURE(rc)))
    713         {
    714             LogRel((DEVICE_NAME ":vboxNetFltSolarisPhysAddrReq failed rc=%Vrc.\n", rc));
    715             return EPROTO;
    716         }
    717 
    718         /*
    719          * Enable raw mode.
    720          */
    721         rc = vboxNetFltSolarisSetRawMode(pPromiscStream);
    722         if (RT_UNLIKELY(RT_FAILURE(rc)))
    723         {
    724             LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc));
    725             return EPROTO;       
    726741        }
    727742    }
     
    732747    LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModOpen returns 0, DevMinor=%d pQueue=%p\n", DevMinor, pStream->pReadQueue));
    733748
     749    RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    734750    return 0;
    735751}
     
    763779        return ENXIO;
    764780    }
     781
     782    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     783    PVBOXNETFLTINS pThis = pStream->pThis;
     784    RTSpinlockAcquire(pThis->hSpinlock, &Tmp);
    765785
    766786    qprocsoff(pQueue);
     
    782802        case kArpStream:        ASMAtomicUoWritePtr(pStream->pThis->u.s.pvArpStream, NULL);     break;
    783803        case kPromiscStream:    ASMAtomicUoWritePtr(pStream->pThis->u.s.pvPromiscStream, NULL); break;
    784         default: AssertRelease(pStream->Type); break;
     804        default:    /* Heh. */
     805        {
     806            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     807            AssertRelease(pStream->Type);
     808            break;
     809        }
    785810    }
    786811
     
    791816    NOREF(fOpenMode);
    792817    NOREF(pCred);
     818
     819    RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    793820
    794821    return 0;
     
    23142341        fSrc = INTNETTRUNKDIR_HOST;
    23152342
    2316 #if 1
     2343    /*
     2344     * Afaik; we no longer need to worry about incorrect checksums because we now use
     2345     * a dedicated stream and don't intercept packets under IP/ARP which might be doing
     2346     * checksum offloading.
     2347     */
     2348#if 0
    23172349    if (fSrc & INTNETTRUNKDIR_HOST)
    23182350    {
     
    23212353            pMsg = pCorrectedMsg;
    23222354    }
     2355
     2356    vboxNetFltSolarisAnalyzeMBlk(pMsg);
    23232357#endif
    2324 
    2325     vboxNetFltSolarisAnalyzeMBlk(pMsg);
    23262358
    23272359    /*
     
    24332465        PRTNETIPV4 pIpHdr = (PRTNETIPV4)pbProtocol;
    24342466        size_t cbPayload = cbIpPacket - (pIpHdr->ip_hl << 2);
    2435 
    24362467        bool fChecksumAdjusted = false;
    2437 
    2438         /*
    2439          * Fix up TCP/UDP and IP checksums if they're incomplete/invalid.
    2440          */
    2441         if (pIpHdr->ip_p == RTNETIPV4_PROT_TCP)
     2468        if (RTNetIPv4IsHdrValid(pIpHdr, cbPayload, cbPayload))
    24422469        {
    24432470            pbProtocol += (pIpHdr->ip_hl << 2);
    2444             PRTNETTCP pTcpHdr = (PRTNETTCP)pbProtocol;
    2445             uint16_t TcpChecksum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL);
    2446             if (pTcpHdr->th_sum != TcpChecksum)
     2471
     2472            /*
     2473             * Fix up TCP/UDP and IP checksums if they're incomplete/invalid.
     2474             */
     2475            if (pIpHdr->ip_p == RTNETIPV4_PROT_TCP)
    24472476            {
    2448                 pTcpHdr->th_sum = TcpChecksum;
    2449                 fChecksumAdjusted = true;
    2450                 LogFlow((DEVICE_NAME ":fixed TCP checksum.\n"));
     2477                PRTNETTCP pTcpHdr = (PRTNETTCP)pbProtocol;
     2478                uint16_t TcpChecksum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL);
     2479                if (pTcpHdr->th_sum != TcpChecksum)
     2480                {
     2481                    pTcpHdr->th_sum = TcpChecksum;
     2482                    fChecksumAdjusted = true;
     2483                    LogFlow((DEVICE_NAME ":fixed TCP checksum.\n"));
     2484                }
    24512485            }
    2452 
    2453             uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr);
    2454             if (pIpHdr->ip_sum != IpChecksum)
     2486            else if (pIpHdr->ip_p == RTNETIPV4_PROT_UDP)
    24552487            {
    2456                 pIpHdr->ip_sum = IpChecksum;
    2457                 fChecksumAdjusted = true;
    2458                 LogFlow((DEVICE_NAME ":fixed IP checksum.\n"));
    2459             }
    2460         }
    2461         else if (pIpHdr->ip_p == RTNETIPV4_PROT_UDP)
    2462         {
    2463             pbProtocol += (pIpHdr->ip_hl << 2);
    2464             PRTNETUDP pUdpHdr = (PRTNETUDP)pbProtocol;
    2465             uint16_t UdpChecksum = RTNetIPv4UDPChecksum(pIpHdr, pUdpHdr, pUdpHdr + 1);
    2466 
    2467             if (pUdpHdr->uh_sum != UdpChecksum)
    2468             {
    2469                 pUdpHdr->uh_sum = UdpChecksum;
    2470                 fChecksumAdjusted = true;
    2471                 LogFlow((DEVICE_NAME ":Fixed UDP checksum."));
    2472             }
    2473 
    2474             uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr);
    2475             if (pIpHdr->ip_sum != IpChecksum)
    2476             {
    2477                 pIpHdr->ip_sum = IpChecksum;
    2478                 fChecksumAdjusted = true;
    2479                 LogFlow((DEVICE_NAME ":fixed IP checksum.\n"));
     2488                PRTNETUDP pUdpHdr = (PRTNETUDP)pbProtocol;
     2489                uint16_t UdpChecksum = RTNetIPv4UDPChecksum(pIpHdr, pUdpHdr, pUdpHdr + 1);
     2490
     2491                if (pUdpHdr->uh_sum != UdpChecksum)
     2492                {
     2493                    pUdpHdr->uh_sum = UdpChecksum;
     2494                    fChecksumAdjusted = true;
     2495                    LogFlow((DEVICE_NAME ":Fixed UDP checksum."));
     2496                }
    24802497            }
    24812498        }
Note: See TracChangeset for help on using the changeset viewer.

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