VBoxNetBaseService.cpp revision b73558f2e00416e86d24d6704100021758131e9b
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * VBoxNetDHCP - DHCP Service for connecting to IntNet.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/** @todo r=bird: Cut&Past rules... Please fix DHCP refs! */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright (C) 2009-2011 Oracle Corporation
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This file is part of VirtualBox Open Source Edition (OSE), as
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * available from http://www.virtualbox.org. This file is free software;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * you can redistribute it and/or modify it under the terms of the GNU
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * General Public License (GPL) as published by the Free Software
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Foundation, in version 2 as it comes in the "COPYING" file of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*******************************************************************************
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw* Header Files *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw*******************************************************************************/
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#define LOG_GROUP LOG_GROUP_NET_SERVICE
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <iprt/param.h>
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <iprt/path.h>
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <iprt/string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*******************************************************************************
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw* Structures and Typedefs *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw*******************************************************************************/
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States Data(const std::string& aName, const std::string& aNetworkName):
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m_hIf(INTNET_HANDLE_INVALID),
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States std::string m_TrunkName;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States INTNETIFHANDLE m_hIf; /**< The handle to the network interface. */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States std::vector<PRTGETOPTDEF> m_vecOptionDefs;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* cs for syncing */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /* Controls whether service will connect SVC for runtime needs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Event Queue */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /** receiving thread, used only if main is used */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*******************************************************************************
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw* Global Variables *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw*******************************************************************************/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Commonly used options for network configuration */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint VBoxNetBaseService::Data::recvLoop(RTTHREAD, void *pvUser)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw VBoxNetBaseService *pThis = static_cast<VBoxNetBaseService *>(pvUser);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pThis->doReceiveLoop();
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United StatesVBoxNetBaseService::VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName):m(NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m = new VBoxNetBaseService::Data(aName, aNetworkName);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Close the interface connection.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (m != NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States shutdown();
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States CloseReq.Hdr.cbReq = sizeof(CloseReq);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States CloseReq.pSession = m->m_pSession;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States CloseReq.hIf = m->m_hIf;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m->m_hIf = INTNET_HANDLE_INVALID;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (m->m_pSession != NIL_RTR0PTR)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m->m_pSession = NIL_RTR0PTR;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m = NULL;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If child class need Main we start receving thread which calls doReceiveLoop and enter to event polling loop
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and for the rest clients we do receiving on the current (main) thread.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States doReceiveLoop();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Parse the arguments.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * @returns 0 on success, fully bitched exit code on failure.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * @param argc Argument count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * @param argv Argument vector.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States RTGETOPTSTATE State;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m->m_vecOptionDefs.size(), 0, 0 /*fFlags*/);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* default initialization */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States m_enmTrunkType = kIntNetTrunkType_WhateverNone;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States Log2(("BaseService: parseArgs enter\n"));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States for (;;)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States RTGETOPTUNION Val;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (!rc)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States switch (rc)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States break;
m->m_cVerbosity++;
m->m_fNeedMain = true;
RTProcShortName());
return rc;
return rc;
return rc;
return rc;
return rc;
return rc;
rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_GET_BUFFER_PTRS, 0, &GetBufferPtrsReq.Hdr);
Log2(("VBoxNetBaseService: SUPR3CallVMMR0Ex(,VMMR0_DO_INTNET_IF_GET_BUFFER_PTRS,) failed, rc=%Rrc\n", rc));
return rc;
Log2(("VBoxNetBaseService: SUPR3CallVMMR0Ex(,VMMR0_DO_INTNET_IF_SET_PROMISCUOUS_MODE,) failed, rc=%Rrc\n", rc));
return VINF_SUCCESS;
syncEnter();
m->fShutdown = true;
syncLeave();
return rc;
int offFrame = 0;
return rc;
return m->m_Name;
return m->m_Network;
return m->m_MacAddress;
return m->m_Ipv4Address;
return m->m_Ipv4Netmask;
return m->m_cbSendBuf;
return m->m_cbRecvBuf;
return m->m_cVerbosity;
int rc;
switch (u8Type)
case INTNETHDR_TYPE_FRAME:
case INTNETHDR_TYPE_GSO:
case INTNETHDR_TYPE_PADDING:
if (m->fShutdown)
return VINF_SUCCESS;
void VBoxNetBaseService::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_list va) const
&vaCopy);
if (!pOptArray)
return NULL;
return pOptArray;