VirtualBox

Ignore:
Timestamp:
Mar 12, 2015 2:55:13 PM (10 years ago)
Author:
vboxsync
Message:

VBoxNetDHCP/VBoxNetNAT: set RTTHREADFLAGS_WAITABLE for the receive thread to make it actually waitable; coding style

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp

    r54723 r54730  
    11/* $Id$ */
    22/** @file
    3  * VBoxNetDHCP - DHCP Service for connecting to IntNet.
     3 * VBoxNetBaseService - common services for VBoxNetDHCP and VBoxNetNAT.
    44 */
    5 /** @todo r=bird: Cut&Past rules... Please fix DHCP refs! */
    65
    76/*
    8  * Copyright (C) 2009-2011 Oracle Corporation
     7 * Copyright (C) 2009-2015 Oracle Corporation
    98 *
    109 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    172171     * Close the interface connection.
    173172     */
    174     if (m != NULL)
     173    if (m)
    175174    {
    176175        shutdown();
     
    228227{
    229228    /**
    230      * If child class need Main we start receving thread which calls doReceiveLoop and enter to event polling loop
    231      * and for the rest clients we do receiving on the current (main) thread.
     229     * If the child class needs Main we start the receving thread which calls
     230     * doReceiveLoop and enter to event polling loop. For other clients we do
     231     * receiving on the current (main) thread.
    232232     */
    233233    if (isMainNeeded())
    234234        return startReceiveThreadAndEnterEventLoop();
    235     else
    236     {
    237         doReceiveLoop();
    238         return VINF_SUCCESS;
    239     }
     235
     236    doReceiveLoop();
     237    return VINF_SUCCESS;
    240238}
    241239
     
    341339
    342340            default:
     341            {
    343342                int rc1 = parseOpt(rc, Val);
    344343                if (RT_FAILURE(rc1))
     
    348347                    return rc;
    349348                }
     349                break;
     350            }
    350351        }
    351352    }
     
    464465    {
    465466        int rc = abortWait();
    466         AssertRC(rc);
     467        AssertRC(rc == VINF_SUCCESS || rc == VERR_SEM_DESTROYED);
    467468        rc = m->m_EventQ->interruptEventQueueProcessing();
    468469        if (RT_SUCCESS(rc))
     
    564565    AssertRCReturnVoid(rc);
    565566    LogFlowFuncLeave();
    566 
    567567}
    568568
     
    691691         * Wait for a packet to become available.
    692692         */
    693         /* 2. waiting for request for */
    694693        rc = waitForIntNetEvent(2000);
     694        if (rc == VERR_SEM_DESTROYED)
     695            break;
     696
    695697        if (RT_FAILURE(rc))
    696698        {
     
    700702                continue;
    701703            }
    702             LogRel(("VBoxNetNAT: waitForIntNetEvent returned %Rrc\n", rc));
     704            LogRel(("VBoxNetBaseService: waitForIntNetEvent returned %Rrc\n", rc));
    703705            AssertRCReturnVoid(rc);
    704706        }
     
    708710         */
    709711        PCINTNETHDR pHdr;
    710 
    711712        while ((pHdr = IntNetRingGetNextFrameToRead(pRingBuf)) != NULL)
    712713        {
    713714            uint8_t const u8Type = pHdr->u8Type;
    714             size_t         cbFrame = pHdr->cbFrame;
     715            size_t        cbFrame = pHdr->cbFrame;
    715716            switch (u8Type)
    716717            {
    717 
    718718                case INTNETHDR_TYPE_FRAME:
     719                {
     720                    void *pvFrame = IntNetHdrGetFramePtr(pHdr, m->m_pIfBuf);
     721                    rc = processFrame(pvFrame, cbFrame);
     722                    if (RT_FAILURE(rc) && rc == VERR_IGNORED)
    719723                    {
    720                         void *pvFrame = IntNetHdrGetFramePtr(pHdr, m->m_pIfBuf);
    721                         rc = processFrame(pvFrame, cbFrame);
    722                         if (RT_FAILURE(rc) && rc == VERR_IGNORED)
    723                         {
    724                             /* XXX: UDP + ARP for DHCP */
    725                             VBOXNETUDPHDRS Hdrs;
    726                             size_t  cb;
    727                             void   *pv = VBoxNetUDPMatch(m->m_pIfBuf, RTNETIPV4_PORT_BOOTPS, &m->m_MacAddress,
    728                                                          VBOXNETUDP_MATCH_UNICAST | VBOXNETUDP_MATCH_BROADCAST
    729                                                          | VBOXNETUDP_MATCH_CHECKSUM
    730                                                          | (m->m_cVerbosity > 2 ? VBOXNETUDP_MATCH_PRINT_STDERR : 0),
    731                                                          &Hdrs, &cb);
    732                             if (pv && cb)
    733                                 processUDP(pv, cb);
    734                             else
    735                                 VBoxNetArpHandleIt(m->m_pSession, m->m_hIf, m->m_pIfBuf, &m->m_MacAddress, m->m_Ipv4Address);
    736                         }
     724                        /* XXX: UDP + ARP for DHCP */
     725                        VBOXNETUDPHDRS Hdrs;
     726                        size_t  cb;
     727                        void   *pv = VBoxNetUDPMatch(m->m_pIfBuf, RTNETIPV4_PORT_BOOTPS, &m->m_MacAddress,
     728                                                       VBOXNETUDP_MATCH_UNICAST
     729                                                     | VBOXNETUDP_MATCH_BROADCAST
     730                                                     | VBOXNETUDP_MATCH_CHECKSUM
     731                                                     | (m->m_cVerbosity > 2 ? VBOXNETUDP_MATCH_PRINT_STDERR : 0),
     732                                                     &Hdrs, &cb);
     733                        if (pv && cb)
     734                            processUDP(pv, cb);
     735                        else
     736                            VBoxNetArpHandleIt(m->m_pSession, m->m_hIf, m->m_pIfBuf, &m->m_MacAddress, m->m_Ipv4Address);
    737737                    }
    738738                    break;
     739                }
    739740                case INTNETHDR_TYPE_GSO:
    740                   {
    741                       PCPDMNETWORKGSO pGso = IntNetHdrGetGsoContext(pHdr, m->m_pIfBuf);
    742                       rc = processGSO(pGso, cbFrame);
    743                       if (RT_FAILURE(rc) && rc == VERR_IGNORED)
    744                           break;
    745                   }
    746                   break;
     741                {
     742                    PCPDMNETWORKGSO pGso = IntNetHdrGetGsoContext(pHdr, m->m_pIfBuf);
     743                    rc = processGSO(pGso, cbFrame);
     744                    if (RT_FAILURE(rc) && rc == VERR_IGNORED)
     745                        break;
     746                    break;
     747                }
     748
    747749                case INTNETHDR_TYPE_PADDING:
    748750                    break;
     751
    749752                default:
    750753                    break;
    751754            }
    752755            IntNetRingSkipFrame(&m->m_pIfBuf->Recv);
    753 
    754756        } /* loop */
    755757    }
    756 
    757758}
    758759
     
    768769                            128 * _1K, /* stack size */
    769770                            RTTHREADTYPE_IO, /* type */
    770                             0, /* flags, @todo: waitable ?*/
     771                            RTTHREADFLAGS_WAITABLE, /* flags */
    771772                            "RECV");
    772773    AssertRCReturn(rc, rc);
     
    822823        va_end(vaCopy);
    823824    }
    824 
    825825}
    826826
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