VirtualBox

Ignore:
Timestamp:
Nov 30, 2013 2:08:42 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91032
Message:

VBoxNetBaseService hides all details of internal network implementation and become responsible for supporting receiving loop. Notification of children are done via introduced interface:

virtual int processFrame(void *, size_t) = 0;
virtual int processGSO(PCPDMNETWORKGSO, size_t) = 0;
virtual int processUDP(void *, size_t) = 0;

processFrame() and processGSO() might return VERR_IGNORED, to inform base service switch to processUDP() (e.g. for DHCP needs)

Location:
trunk/src/VBox/NetworkServices/NetLib
Files:
2 edited

Legend:

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

    r49558 r49735  
    7171*   Structures and Typedefs                                                    *
    7272*******************************************************************************/
     73struct VBoxNetBaseService::Data
     74{
     75    Data(const std::string& aName, const std::string& aNetworkName):
     76      m_Name(aName),
     77      m_Network(aNetworkName),
     78      m_enmTrunkType(kIntNetTrunkType_WhateverNone),
     79      m_pSession(NIL_RTR0PTR),
     80      m_cbSendBuf(128 * _1K),
     81      m_cbRecvBuf(256 * _1K),
     82      m_hIf(INTNET_HANDLE_INVALID),
     83      m_pIfBuf(NULL),
     84      m_cVerbosity(0),
     85      m_fNeedMain(false)
     86    {
     87        int rc = RTCritSectInit(&m_csThis);
     88        AssertRC(rc);
     89    };
     90
     91    std::string         m_Name;
     92    std::string         m_Network;
     93    std::string         m_TrunkName;
     94    INTNETTRUNKTYPE     m_enmTrunkType;
     95
     96    RTMAC               m_MacAddress;
     97    RTNETADDRIPV4       m_Ipv4Address;
     98    RTNETADDRIPV4       m_Ipv4Netmask;
     99
     100    PSUPDRVSESSION      m_pSession;
     101    uint32_t            m_cbSendBuf;
     102    uint32_t            m_cbRecvBuf;
     103    INTNETIFHANDLE      m_hIf;          /**< The handle to the network interface. */
     104    PINTNETBUF          m_pIfBuf;       /**< Interface buffer. */
     105
     106    std::vector<PRTGETOPTDEF> m_vecOptionDefs;
     107
     108    int32_t             m_cVerbosity;
     109
     110    /* cs for syncing */
     111    RTCRITSECT          m_csThis;
     112
     113    /* Controls whether service will connect SVC for runtime needs */
     114    bool                m_fNeedMain;
     115};
    73116
    74117/*******************************************************************************
     
    90133
    91134
    92 VBoxNetBaseService::VBoxNetBaseService()
    93 {
    94     int rc = RTCritSectInit(&m_csThis);
    95     AssertRC(rc);
    96     /* numbers from DrvIntNet */
    97     m_cbSendBuf             = 128 * _1K;
    98     m_cbRecvBuf             = 256 * _1K;
    99     m_hIf                   = INTNET_HANDLE_INVALID;
    100     m_pIfBuf                = NULL;
    101 
    102     m_cVerbosity            = 0;
    103     m_Name                  = "VBoxNetNAT";
    104     m_Network               = "intnet";
    105     m_fNeedMain             = false;
     135VBoxNetBaseService::VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName):m(NULL)
     136{
     137    m = new VBoxNetBaseService::Data(aName, aNetworkName);
    106138
    107139    for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i)
    108         m_vecOptionDefs.push_back(&g_aGetOptDef[i]);
     140        m->m_vecOptionDefs.push_back(&g_aGetOptDef[i]);
    109141}
    110142
     
    115147     * Close the interface connection.
    116148     */
    117     if (m_hIf != INTNET_HANDLE_INVALID)
    118     {
    119         INTNETIFCLOSEREQ CloseReq;
    120         CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    121         CloseReq.Hdr.cbReq = sizeof(CloseReq);
    122         CloseReq.pSession = m_pSession;
    123         CloseReq.hIf = m_hIf;
    124         m_hIf = INTNET_HANDLE_INVALID;
    125         int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr);
    126         AssertRC(rc);
    127     }
    128 
    129     if (m_pSession)
    130     {
    131         SUPR3Term(false /*fForced*/);
    132         m_pSession = NIL_RTR0PTR;
    133     }
    134     RTCritSectDelete(&m_csThis);
     149    if (m != NULL)
     150    {
     151        if (m->m_hIf != INTNET_HANDLE_INVALID)
     152        {
     153            INTNETIFCLOSEREQ CloseReq;
     154            CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
     155            CloseReq.Hdr.cbReq = sizeof(CloseReq);
     156            CloseReq.pSession = m->m_pSession;
     157            CloseReq.hIf = m->m_hIf;
     158            m->m_hIf = INTNET_HANDLE_INVALID;
     159            int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr);
     160            AssertRC(rc);
     161        }
     162
     163        if (m->m_pSession != NIL_RTR0PTR)
     164        {
     165            SUPR3Term(false /*fForced*/);
     166            m->m_pSession = NIL_RTR0PTR;
     167        }
     168
     169        RTCritSectDelete(&m->m_csThis);
     170       
     171        delete m;
     172        m = NULL;
     173    }       
    135174}
    136175
     
    150189}
    151190
     191
     192bool VBoxNetBaseService::isMainNeeded() const
     193{
     194    return m->m_fNeedMain;
     195}
    152196
    153197/**
     
    164208    RTGETOPTSTATE State;
    165209    PRTGETOPTDEF paOptionArray = getOptionsPtr();
    166     int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m_vecOptionDefs.size(), 0, 0 /*fFlags*/);
     210    int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m->m_vecOptionDefs.size(), 0, 0 /*fFlags*/);
    167211    AssertRCReturn(rc, 49);
    168212#if 0
     
    181225        {
    182226            case 'N': // --name
    183                 m_Name = Val.psz;
     227                m->m_Name = Val.psz;
    184228                break;
    185229
    186230            case 'n': // --network
    187                 m_Network = Val.psz;
     231                m->m_Network = Val.psz;
    188232                break;
    189233
    190234            case 't': //--trunk-name
    191                 m_TrunkName = Val.psz;
     235                m->m_TrunkName = Val.psz;
    192236                break;
    193237
    194238            case 'T': //--trunk-type
    195239                if (!strcmp(Val.psz, "none"))
    196                     m_enmTrunkType = kIntNetTrunkType_None;
     240                    m->m_enmTrunkType = kIntNetTrunkType_None;
    197241                else if (!strcmp(Val.psz, "whatever"))
    198                     m_enmTrunkType = kIntNetTrunkType_WhateverNone;
     242                    m->m_enmTrunkType = kIntNetTrunkType_WhateverNone;
    199243                else if (!strcmp(Val.psz, "netflt"))
    200                     m_enmTrunkType = kIntNetTrunkType_NetFlt;
     244                    m->m_enmTrunkType = kIntNetTrunkType_NetFlt;
    201245                else if (!strcmp(Val.psz, "netadp"))
    202                     m_enmTrunkType = kIntNetTrunkType_NetAdp;
     246                    m->m_enmTrunkType = kIntNetTrunkType_NetAdp;
    203247                else if (!strcmp(Val.psz, "srvnat"))
    204                     m_enmTrunkType = kIntNetTrunkType_SrvNat;
     248                    m->m_enmTrunkType = kIntNetTrunkType_SrvNat;
    205249                else
    206250                {
     
    211255
    212256            case 'a': // --mac-address
    213                 m_MacAddress = Val.MacAddr;
     257                m->m_MacAddress = Val.MacAddr;
    214258                break;
    215259
    216260            case 'i': // --ip-address
    217                 m_Ipv4Address = Val.IPv4Addr;
     261                m->m_Ipv4Address = Val.IPv4Addr;
    218262                break;
    219263
    220264            case 'm': // --netmask
    221                 m_Ipv4Netmask = Val.IPv4Addr;
     265                m->m_Ipv4Netmask = Val.IPv4Addr;
    222266                break;
    223267
    224268            case 'v': // --verbose
    225                 m_cVerbosity++;
     269                m->m_cVerbosity++;
    226270                break;
    227271
     
    231275
    232276            case 'M': // --need-main
    233                 m_fNeedMain = true;
     277                m->m_fNeedMain = true;
    234278                break;
    235279
     
    246290                         RTBldCfgRevision(),
    247291                         RTProcShortName());
    248                 for (unsigned int i = 0; i < m_vecOptionDefs.size(); i++)
    249                     RTPrintf("    -%c, %s\n", m_vecOptionDefs[i]->iShort, m_vecOptionDefs[i]->pszLong);
     292                for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); i++)
     293                    RTPrintf("    -%c, %s\n", m->m_vecOptionDefs[i]->iShort, m->m_vecOptionDefs[i]->pszLong);
    250294                usage(); /* to print Service Specific usage */
    251295                return 1;
     
    272316     * Open the session, load ring-0 and issue the request.
    273317     */
    274     int rc = SUPR3Init(&m_pSession);
     318    int rc = SUPR3Init(&m->m_pSession);
    275319    if (RT_FAILURE(rc))
    276320    {
    277         m_pSession = NIL_RTR0PTR;
     321        m->m_pSession = NIL_RTR0PTR;
    278322        LogRel(("VBoxNetBaseService: SUPR3Init -> %Rrc\n", rc));
    279323        return rc;
     
    302346    OpenReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    303347    OpenReq.Hdr.cbReq = sizeof(OpenReq);
    304     OpenReq.pSession = m_pSession;
    305     strncpy(OpenReq.szNetwork, m_Network.c_str(), sizeof(OpenReq.szNetwork));
     348    OpenReq.pSession = m->m_pSession;
     349    strncpy(OpenReq.szNetwork, m->m_Network.c_str(), sizeof(OpenReq.szNetwork));
    306350    OpenReq.szNetwork[sizeof(OpenReq.szNetwork) - 1] = '\0';
    307     strncpy(OpenReq.szTrunk, m_TrunkName.c_str(), sizeof(OpenReq.szTrunk));
     351    strncpy(OpenReq.szTrunk, m->m_TrunkName.c_str(), sizeof(OpenReq.szTrunk));
    308352    OpenReq.szTrunk[sizeof(OpenReq.szTrunk) - 1] = '\0';
    309     OpenReq.enmTrunkType = m_enmTrunkType;
     353    OpenReq.enmTrunkType = m->m_enmTrunkType;
    310354    OpenReq.fFlags = 0; /** @todo check this */
    311     OpenReq.cbSend = m_cbSendBuf;
    312     OpenReq.cbRecv = m_cbRecvBuf;
     355    OpenReq.cbSend = m->m_cbSendBuf;
     356    OpenReq.cbRecv = m->m_cbRecvBuf;
    313357    OpenReq.hIf = INTNET_HANDLE_INVALID;
    314358
     
    323367        return rc;
    324368    }
    325     m_hIf = OpenReq.hIf;
    326     Log2(("successfully opened/created \"%s\" - hIf=%#x\n", OpenReq.szNetwork, m_hIf));
     369    m->m_hIf = OpenReq.hIf;
     370    Log2(("successfully opened/created \"%s\" - hIf=%#x\n", OpenReq.szNetwork, m->m_hIf));
    327371
    328372    /*
     
    332376    GetBufferPtrsReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    333377    GetBufferPtrsReq.Hdr.cbReq = sizeof(GetBufferPtrsReq);
    334     GetBufferPtrsReq.pSession = m_pSession;
    335     GetBufferPtrsReq.hIf = m_hIf;
     378    GetBufferPtrsReq.pSession = m->m_pSession;
     379    GetBufferPtrsReq.hIf = m->m_hIf;
    336380    GetBufferPtrsReq.pRing3Buf = NULL;
    337381    GetBufferPtrsReq.pRing0Buf = NIL_RTR0PTR;
     
    345389    Log2(("pBuf=%p cbBuf=%d cbSend=%d cbRecv=%d\n",
    346390               pBuf, pBuf->cbBuf, pBuf->cbSend, pBuf->cbRecv));
    347     m_pIfBuf = pBuf;
     391    m->m_pIfBuf = pBuf;
    348392
    349393    /*
     
    353397    ActiveReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    354398    ActiveReq.Hdr.cbReq = sizeof(ActiveReq);
    355     ActiveReq.pSession = m_pSession;
    356     ActiveReq.hIf = m_hIf;
     399    ActiveReq.pSession = m->m_pSession;
     400    ActiveReq.hIf = m->m_hIf;
    357401    ActiveReq.fActive = true;
    358402    rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SET_ACTIVE, 0, &ActiveReq.Hdr);
     
    370414void VBoxNetBaseService::shutdown(void)
    371415{
     416}
     417
     418
     419int VBoxNetBaseService::syncEnter()
     420{
     421    return RTCritSectEnter(&m->m_csThis);
     422}
     423
     424
     425int VBoxNetBaseService::syncLeave()
     426{
     427    return RTCritSectLeave(&m->m_csThis);
    372428}
    373429
     
    380436    WaitReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    381437    WaitReq.Hdr.cbReq = sizeof(WaitReq);
    382     WaitReq.pSession = m_pSession;
    383     WaitReq.hIf = m_hIf;
     438    WaitReq.pSession = m->m_pSession;
     439    WaitReq.hIf = m->m_hIf;
    384440    WaitReq.cMillies = cMillis;
    385441
     
    392448int VBoxNetBaseService::sendBufferOnWire(PCINTNETSEG pcSg, int cSg, size_t cbFrame)
    393449{
    394     int rc = VINF_SUCCESS;
    395450    PINTNETHDR pHdr = NULL;
    396451    uint8_t *pu8Frame = NULL;
     452
     453    /* Allocate frame */
     454    int rc = IntNetRingAllocateFrame(&m->m_pIfBuf->Send, cbFrame, &pHdr, (void **)&pu8Frame);
     455    AssertRCReturn(rc, rc);
     456
     457    /* Now we fill pvFrame with S/G above */
    397458    int offFrame = 0;
    398     int idxSg = 0;
    399     /* Allocate frame */
    400     rc = IntNetRingAllocateFrame(&m_pIfBuf->Send, cbFrame, &pHdr, (void **)&pu8Frame);
    401     AssertRCReturn(rc, rc);
    402     /* Now we fill pvFrame with S/G above */
    403     for (idxSg = 0; idxSg < cSg; ++idxSg)
     459    for (int idxSg = 0; idxSg < cSg; ++idxSg)
    404460    {
    405461        memcpy(&pu8Frame[offFrame], pcSg[idxSg].pv, pcSg[idxSg].cb);
    406462        offFrame+=pcSg[idxSg].cb;
    407463    }
     464
    408465    /* Commit */
    409     IntNetRingCommitFrame(&m_pIfBuf->Send, pHdr);
     466    IntNetRingCommitFrameEx(&m->m_pIfBuf->Send, pHdr, cbFrame);
    410467
    411468    LogFlowFuncLeaveRC(rc);
    412469    return rc;
    413470}
     471
    414472/**
    415473 * forcible ask for send packet on the "wire"
     
    421479    SendReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
    422480    SendReq.Hdr.cbReq    = sizeof(SendReq);
    423     SendReq.pSession     = m_pSession;
    424     SendReq.hIf          = m_hIf;
     481    SendReq.pSession     = m->m_pSession;
     482    SendReq.hIf          = m->m_hIf;
    425483    rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SEND, 0, &SendReq.Hdr);
    426484    AssertRCReturnVoid(rc);
    427485    LogFlowFuncLeave();
    428486
     487}
     488
     489
     490int VBoxNetBaseService::hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
     491                                         void const *pvData, size_t cbData) const
     492{
     493    return VBoxNetUDPBroadcast(m->m_pSession, m->m_hIf, m->m_pIfBuf,
     494                        m->m_Ipv4Address, &m->m_MacAddress, uSrcPort,
     495                        uDstPort, pvData, cbData);
     496
     497}
     498
     499
     500const std::string VBoxNetBaseService::getName() const
     501{
     502    return m->m_Name;
     503}
     504
     505
     506void VBoxNetBaseService::setName(const std::string& aName)
     507{
     508    m->m_Name = aName;
     509}
     510
     511
     512const std::string VBoxNetBaseService::getNetwork() const
     513{
     514    return m->m_Network;
     515}
     516
     517
     518void VBoxNetBaseService::setNetwork(const std::string& aNetwork)
     519{
     520    m->m_Network = aNetwork;
     521}
     522
     523
     524const RTMAC VBoxNetBaseService::getMacAddress() const
     525{
     526    return m->m_MacAddress;
     527}
     528
     529
     530void VBoxNetBaseService::setMacAddress(const RTMAC& aMac)
     531{
     532    m->m_MacAddress = aMac;
     533}
     534
     535
     536const RTNETADDRIPV4 VBoxNetBaseService::getIpv4Address() const
     537{
     538    return m->m_Ipv4Address;
     539}
     540
     541
     542void VBoxNetBaseService::setIpv4Address(const RTNETADDRIPV4& aAddress)
     543{
     544    m->m_Ipv4Address = aAddress;
     545}
     546
     547
     548const RTNETADDRIPV4 VBoxNetBaseService::getIpv4Netmask() const
     549{
     550    return m->m_Ipv4Netmask;
     551}
     552
     553
     554void VBoxNetBaseService::setIpv4Netmask(const RTNETADDRIPV4& aNetmask)
     555{
     556    m->m_Ipv4Netmask = aNetmask;
     557}
     558
     559
     560uint32_t VBoxNetBaseService::getSendBufSize() const
     561{
     562    return m->m_cbSendBuf;
     563}
     564
     565
     566void VBoxNetBaseService::setSendBufSize(uint32_t cbBuf)
     567{
     568    m->m_cbSendBuf = cbBuf;
     569}
     570
     571
     572uint32_t VBoxNetBaseService::getRecvBufSize() const
     573{
     574    return m->m_cbRecvBuf;
     575}
     576
     577
     578void VBoxNetBaseService::setRecvBufSize(uint32_t cbBuf)
     579{
     580    m->m_cbRecvBuf = cbBuf;
     581}
     582
     583
     584int32_t VBoxNetBaseService::getVerbosityLevel() const
     585{
     586    return m->m_cVerbosity;
     587}
     588
     589
     590void VBoxNetBaseService::setVerbosityLevel(int32_t aVerbosity)
     591{
     592    m->m_cVerbosity = aVerbosity;
     593}
     594
     595
     596void VBoxNetBaseService::addCommandLineOption(const PRTGETOPTDEF optDef)
     597{
     598    m->m_vecOptionDefs.push_back(optDef);
     599}
     600
     601
     602void VBoxNetBaseService::doReceiveLoop()
     603{
     604    int rc;
     605    /* Well we're ready */
     606    PINTNETRINGBUF  pRingBuf = &m->m_pIfBuf->Recv;
     607
     608    for (;;)
     609    {
     610        /*
     611         * Wait for a packet to become available.
     612         */
     613        /* 2. waiting for request for */
     614        rc = waitForIntNetEvent(2000);
     615        if (RT_FAILURE(rc))
     616        {
     617            if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED)
     618            {
     619                /* do we want interrupt anyone ??? */
     620                continue;
     621            }
     622            LogRel(("VBoxNetNAT: waitForIntNetEvent returned %Rrc\n", rc));
     623            AssertRCReturnVoid(rc);
     624        }
     625
     626        /*
     627         * Process the receive buffer.
     628         */
     629        PCINTNETHDR pHdr;
     630
     631        while ((pHdr = IntNetRingGetNextFrameToRead(pRingBuf)) != NULL)
     632        {
     633            uint8_t const u8Type = pHdr->u8Type;
     634            size_t         cbFrame = pHdr->cbFrame;
     635            switch (u8Type)
     636            {
     637
     638                case INTNETHDR_TYPE_FRAME:
     639                    {
     640                        void *pvFrame = IntNetHdrGetFramePtr(pHdr, m->m_pIfBuf);
     641                        rc = processFrame(pvFrame, cbFrame);
     642                        if (RT_FAILURE(rc) && rc == VERR_IGNORED)
     643                        {
     644                            /* XXX: UDP + ARP for DHCP */
     645                            VBOXNETUDPHDRS Hdrs;
     646                            size_t  cb;
     647                            void   *pv = VBoxNetUDPMatch(m->m_pIfBuf, RTNETIPV4_PORT_BOOTPS, &m->m_MacAddress,
     648                                                         VBOXNETUDP_MATCH_UNICAST | VBOXNETUDP_MATCH_BROADCAST
     649                                                         | VBOXNETUDP_MATCH_CHECKSUM
     650                                                         | (m->m_cVerbosity > 2 ? VBOXNETUDP_MATCH_PRINT_STDERR : 0),
     651                                                         &Hdrs, &cb);
     652                            if (pv && cb)
     653                                processUDP(pv, cb);
     654                            else
     655                                VBoxNetArpHandleIt(m->m_pSession, m->m_hIf, m->m_pIfBuf, &m->m_MacAddress, m->m_Ipv4Address);
     656                        }
     657                    }
     658                    break;
     659                case INTNETHDR_TYPE_GSO:
     660                  {
     661                      PCPDMNETWORKGSO pGso = IntNetHdrGetGsoContext(pHdr, m->m_pIfBuf);
     662                      rc = processGSO(pGso, cbFrame);
     663                      if (RT_FAILURE(rc) && rc == VERR_IGNORED)
     664                          break;
     665                  }
     666                  break;
     667                case INTNETHDR_TYPE_PADDING:
     668                    break;
     669                default:
     670                    break;
     671            }
     672            IntNetRingSkipFrame(&m->m_pIfBuf->Recv);
     673
     674        } /* loop */
     675    }
     676
     677}
     678
     679
     680void VBoxNetBaseService::debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const
     681{
     682    if (iMinLevel <= m->m_cVerbosity)
     683    {
     684        va_list va;
     685        va_start(va, pszFmt);
     686        debugPrintV(iMinLevel, fMsg, pszFmt, va);
     687        va_end(va);
     688    }
    429689}
    430690
     
    440700void VBoxNetBaseService::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_list va) const
    441701{
    442     if (iMinLevel <= m_cVerbosity)
     702    if (iMinLevel <= m->m_cVerbosity)
    443703    {
    444704        va_list vaCopy;                 /* This dude is *very* special, thus the copy. */
     
    458718{
    459719    PRTGETOPTDEF pOptArray = NULL;
    460     pOptArray = (PRTGETOPTDEF)RTMemAlloc(sizeof(RTGETOPTDEF) * m_vecOptionDefs.size());
     720    pOptArray = (PRTGETOPTDEF)RTMemAlloc(sizeof(RTGETOPTDEF) * m->m_vecOptionDefs.size());
    461721    if (!pOptArray)
    462722        return NULL;
    463     for (unsigned int i = 0; i < m_vecOptionDefs.size(); ++i)
    464     {
    465         PRTGETOPTDEF pOpt = m_vecOptionDefs[i];
    466         memcpy(&pOptArray[i], m_vecOptionDefs[i], sizeof(RTGETOPTDEF));
     723    for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); ++i)
     724    {
     725        PRTGETOPTDEF pOpt = m->m_vecOptionDefs[i];
     726        memcpy(&pOptArray[i], m->m_vecOptionDefs[i], sizeof(RTGETOPTDEF));
    467727    }
    468728    return pOptArray;
  • trunk/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h

    r49560 r49735  
    2020
    2121#include <iprt/critsect.h>
    22 class VBoxNetBaseService
     22
     23
     24class VBoxNetHlpUDPService
    2325{
    2426public:
    25     VBoxNetBaseService();
     27virtual int                 hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
     28                                        void const *pvData, size_t cbData) const = 0;
     29};
     30
     31
     32# ifndef BASE_SERVICES_ONLY
     33class VBoxNetBaseService: public VBoxNetHlpUDPService
     34{
     35public:
     36    VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName);
    2637    virtual ~VBoxNetBaseService();
    2738    int                 parseArgs(int argc, char **argv);
    2839    int                 tryGoOnline(void);
    2940    void                shutdown(void);
    30     int                 syncEnter() { return RTCritSectEnter(&this->m_csThis);}
    31     int                 syncLeave() { return RTCritSectLeave(&this->m_csThis);}
     41    int                 syncEnter();
     42    int                 syncLeave();
    3243    int                 waitForIntNetEvent(int cMillis);
    3344    int                 sendBufferOnWire(PCINTNETSEG pSg, int cSg, size_t cbBuffer);
    3445    void                flushWire();
    3546
     47    virtual int         hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
     48                                        void const *pvData, size_t cbData) const;
    3649    virtual void        usage(void) = 0;
    3750    virtual int         run(void) = 0;
    3851    virtual int         parseOpt(int rc, const RTGETOPTUNION& getOptVal) = 0;
     52    virtual int         processFrame(void *, size_t) = 0;
     53    virtual int         processGSO(PCPDMNETWORKGSO, size_t) = 0;
     54    virtual int         processUDP(void *, size_t) = 0;
     55
    3956
    4057    virtual int         init(void);
    41     virtual bool        isMainNeeded() const { return m_fNeedMain; }
    42     /* VirtualBox instance */
    43     ComPtr<IVirtualBox> virtualbox;
     58    virtual bool        isMainNeeded() const;
    4459
    4560protected:
     61    const std::string getName() const;
     62    void setName(const std::string&);
     63
     64    const std::string getNetwork() const;
     65    void setNetwork(const std::string&);
     66
     67    const RTMAC getMacAddress() const;
     68    void setMacAddress(const RTMAC&);
     69
     70    const RTNETADDRIPV4 getIpv4Address() const;
     71    void setIpv4Address(const RTNETADDRIPV4&);
     72
     73    const RTNETADDRIPV4 getIpv4Netmask() const;
     74    void setIpv4Netmask(const RTNETADDRIPV4&);
     75
     76    uint32_t getSendBufSize() const;
     77    void setSendBufSize(uint32_t);
     78
     79    uint32_t getRecvBufSize() const;
     80    void setRecvBufSize(uint32_t);
     81
     82    int32_t getVerbosityLevel() const;
     83    void setVerbosityLevel(int32_t);
     84
     85    void addCommandLineOption(const PRTGETOPTDEF);
     86
    4687    /**
    4788     * Print debug message depending on the m_cVerbosity level.
     
    5293     * @param   ...             Optional arguments.
    5394     */
    54     void debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const
    55     {
    56         if (iMinLevel <= m_cVerbosity)
    57         {
    58             va_list va;
    59             va_start(va, pszFmt);
    60             debugPrintV(iMinLevel, fMsg, pszFmt, va);
    61             va_end(va);
    62         }
    63     }
    64 
     95    void debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const;
    6596    virtual void debugPrintV(int32_t iMinLevel, bool fMsg, const char *pszFmt, va_list va) const;
    6697
    67     /** @name The server configuration data members.
    68      * @{ */
    69     std::string         m_Name;
    70     std::string         m_Network;
    71     std::string         m_TrunkName;
    72     INTNETTRUNKTYPE     m_enmTrunkType;
    73     RTMAC               m_MacAddress;
    74     RTNETADDRIPV4       m_Ipv4Address;
    75     RTNETADDRIPV4       m_Ipv4Netmask;
    76     /** @} */
    77     /** @name The network interface
    78      * @{ */
    79     PSUPDRVSESSION      m_pSession;
    80     uint32_t            m_cbSendBuf;
    81     uint32_t            m_cbRecvBuf;
    82     INTNETIFHANDLE      m_hIf;          /**< The handle to the network interface. */
    83     PINTNETBUF          m_pIfBuf;       /**< Interface buffer. */
    84     std::vector<PRTGETOPTDEF> m_vecOptionDefs;
    85     /** @} */
    86     /** @name Debug stuff
    87      * @{  */
    88     int32_t             m_cVerbosity;
     98    void doReceiveLoop();
     99   
     100
     101protected:
     102    /* VirtualBox instance */
     103    ComPtr<IVirtualBox> virtualbox;
     104
     105private:
     106    struct Data;
     107    Data *m;
     108
    89109private:
    90110    PRTGETOPTDEF getOptionsPtr();
    91 
    92     /* cs for syncing */
    93     RTCRITSECT          m_csThis;
    94     /* Controls whether service will connect SVC for runtime needs */
    95     bool                m_fNeedMain;
    96 
    97     /** @} */
    98111};
     112# endif
    99113#endif
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