VirtualBox

Ignore:
Timestamp:
Nov 30, 2011 4:05:54 AM (13 years ago)
Author:
vboxsync
Message:

NAT/service: GSO handling fixed, some logging was added.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp

    r39410 r39468  
    195195    AssertReleaseRC(rc);
    196196
     197    g_pNAT->fIsRunning = true;
    197198    rc = RTThreadCreate(&m_ThrNAT, AsyncIoThread, this, 128 * _1K, RTTHREADTYPE_DEFAULT, 0, "NAT");
    198199    rc = RTThreadCreate(&m_ThrSndNAT, natSndThread, this, 128 * _1K, RTTHREADTYPE_DEFAULT, 0, "SndNAT");
     
    212213    fIsRunning = true;
    213214    PINTNETRINGBUF  pRingBuf = &m_pIfBuf->Recv;
    214     //RTThreadSetType(RTThreadSelf(), RTTHREADTYPE_IO);
     215    RTThreadSetType(RTThreadSelf(), RTTHREADTYPE_IO);
    215216    for (;;)
    216217    {
     
    224225        WaitReq.hIf = m_hIf;
    225226        WaitReq.cMillies = 2000; /* 2 secs - the sleep is for some reason uninterruptible... */  /** @todo fix interruptability in SrvIntNet! */
    226 #if 1
     227#if 0
    227228        RTReqProcess(m_pSendQueue, 0);
    228229        RTReqProcess(m_pUrgSendQueue, 0);
     
    232233        {
    233234            if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED)
     235            {
     236                natNotifyNATThread();
    234237                continue;
     238            }
    235239            LogRel(("VBoxNetNAT: VMMR0_DO_INTNET_IF_WAIT returned %Rrc\n", rc));
    236240            return;
     
    258262                    }
    259263                    memcpy(pvSlirpFrame, IntNetHdrGetFramePtr(pHdr, m_pIfBuf), cbFrame);
     264#if 0
    260265                    IntNetRingSkipFrame(&m_pIfBuf->Recv);
     266#endif
    261267
    262268                    /* don't wait, we may have to wakeup the NAT thread first */
    263269                    rc = RTReqCallEx(m_pReqQueue, NULL /*ppReq*/, 0 /*cMillies*/, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
    264270                                     (PFNRT)SendWorker, 2, m, cbFrame);
     271                    natNotifyNATThread();
    265272                    AssertReleaseRC(rc);
    266273                break;
    267274                case INTNETHDR_TYPE_GSO:
     275#if 1
    268276                {
    269277                    /** @todo pass these unmodified. */
     
    277285
    278286                    uint8_t abHdrScratch[256];
    279                     uint32_t const cSegs = PDMNetGsoCalcSegmentCount(pGso, cbFrame - sizeof(*pGso));
     287                    cbFrame -= sizeof(PDMNETWORKGSO);
     288                    uint32_t const cSegs = PDMNetGsoCalcSegmentCount(pGso, cbFrame);
    280289                    for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
    281290                    {
     
    283292                        void  *pvSegFrame = PDMNetGsoCarveSegmentQD(pGso, (uint8_t *)(pGso + 1), cbFrame, abHdrScratch,
    284293                                                                    iSeg, cSegs, &cbSegFrame);
    285                         m = slirp_ext_m_get(g_pNAT->m_pNATState, cbFrame, &pvSlirpFrame, &cbIgnored);
     294                        m = slirp_ext_m_get(g_pNAT->m_pNATState, cbSegFrame, &pvSlirpFrame, &cbIgnored);
    286295                        if (!m)
    287296                        {
     
    290299                            break;
    291300                        }
    292                         memcpy(pvSlirpFrame, pvSegFrame, cbFrame);
     301                        memcpy(pvSlirpFrame, pvSegFrame, cbSegFrame);
    293302
    294303                        rc = RTReqCallEx(m_pReqQueue, NULL /*ppReq*/, 0 /*cMillies*/,
     
    297306                        AssertReleaseRC(rc);
    298307                    }
    299                     IntNetRingSkipFrame(&m_pIfBuf->Recv);
    300308                }
    301309                break;
     310#endif
    302311                case INTNETHDR_TYPE_PADDING:
    303                     IntNetRingSkipFrame(&m_pIfBuf->Recv);
    304312                break;
    305313                default:
    306                     IntNetRingSkipFrame(&m_pIfBuf->Recv);
    307314                    STAM_REL_COUNTER_INC(&m_pIfBuf->cStatBadFrames);
    308315                break;
    309316                }
    310317
    311 #ifndef RT_OS_WINDOWS
    312                 /* kick select() */
    313                 rc = RTPipeWrite(m_hPipeWrite, "", 1, &cbIgnored);
    314                 AssertRC(rc);
    315 #else
    316                 /* kick WSAWaitForMultipleEvents */
    317                 rc = WSASetEvent(m_hWakeupEvent);
    318                 AssertRelease(rc == TRUE);
    319 #endif
     318                IntNetRingSkipFrame(&m_pIfBuf->Recv);
    320319            }
    321             natNotifyNATThread();
    322 
    323320    }
    324321    fIsRunning = false;
     
    359356extern "C" void slirp_urg_output(void *pvUser, struct mbuf *m, const uint8_t *pu8Buf, int cb)
    360357{
     358    LogFlowFunc(("ENTER: m:%p, pu8Buf:%p, cb:%d\n", m, pu8Buf, cb));
    361359    int rc = RTReqCallEx(g_pNAT->m_pUrgSendQueue,  NULL /*ppReq*/, 0 /*cMillies*/, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
    362360                         (PFNRT)IntNetSendWorker, 4, (uintptr_t)1, (uintptr_t)pu8Buf, (uintptr_t)cb, (uintptr_t)m);
     
    364362    RTSemEventSignal(g_pNAT->m_EventUrgSend);
    365363    AssertReleaseRC(rc);
     364    LogFlowFuncLeave();
    366365}
    367366extern "C" void slirp_output(void *pvUser, struct mbuf *m, const uint8_t *pu8Buf, int cb)
    368367{
     368    LogFlowFunc(("ENTER: m:%p, pu8Buf:%p, cb:%d\n", m, pu8Buf, cb));
    369369    AssertRelease(g_pNAT == pvUser);
    370370    int rc = RTReqCallEx(g_pNAT->m_pSendQueue,  NULL /*ppReq*/, 0 /*cMillies*/, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
     
    373373    RTSemEventSignal(g_pNAT->m_EventSend);
    374374    AssertReleaseRC(rc);
     375    LogFlowFuncLeave();
    375376}
    376377
     
    386387static void SendWorker(struct mbuf *m, size_t cb)
    387388{
     389    LogFlowFunc(("ENTER: m:%p ,cb:%d\n", m, cb));
    388390    slirp_input(g_pNAT->m_pNATState, m, cb);
    389 }
    390 
    391 static void IntNetSendWorker(bool urg, void *pvFrame, size_t cbFrame, struct mbuf *m)
    392 {
    393     Log2(("VBoxNetNAT: going to send some bytes ... \n"));
     391    LogFlowFuncLeave();
     392}
     393
     394static void IntNetSendWorker(bool fUrg, void *pvFrame, size_t cbFrame, struct mbuf *m)
     395{
    394396    VBoxNetNAT         *pThis = g_pNAT;
    395397    INTNETIFSENDREQ     SendReq;
    396398    int rc;
    397399
    398     if (!urg)
    399     {
    400         while (ASMAtomicReadU32(&g_pNAT->cUrgPkt) != 0
     400    LogFlowFunc(("ENTER: urg:%RTbool ,pvFrame:%p, cbFrame:%d, m:%p\n", fUrg, pvFrame, cbFrame, m));
     401    if (!fUrg)
     402    {
     403        /* non-urgent datagramm sender */
     404        while (   ASMAtomicReadU32(&g_pNAT->cUrgPkt) != 0
    401405               || ASMAtomicReadU32(&g_pNAT->cPkt) == 0)
    402406            rc = RTSemEventWait(g_pNAT->m_EventSend, RT_INDEFINITE_WAIT);
     
    427431        rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SEND, 0, &SendReq.Hdr);
    428432    }
     433    AssertRC((rc));
    429434    if (RT_FAILURE(rc))
    430435        Log2(("VBoxNetNAT: Failed to send packet; rc=%Rrc\n", rc));
    431436
    432     if (!urg)
     437    if (!fUrg)
    433438    {
    434439        ASMAtomicDecU32(&g_pNAT->cPkt);
     
    438443            RTSemEventSignal(g_pNAT->m_EventSend);
    439444    }
     445    slirp_ext_m_free(pThis->m_pNATState, m, (uint8_t *)pvFrame);
    440446    natNotifyNATThread();
    441     slirp_ext_m_free(pThis->m_pNATState, m, (uint8_t *)pvFrame);
     447    LogFlowFuncLeave();
    442448}
    443449
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