VBoxNetBaseService.cpp revision b73558f2e00416e86d24d6704100021758131e9b
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/* $Id$ */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/** @file
0f70ed40798198e1d9099c6ae3bdb239d2b8cf0dvboxsync * VBoxNetDHCP - DHCP Service for connecting to IntNet.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
0f70ed40798198e1d9099c6ae3bdb239d2b8cf0dvboxsync/** @todo r=bird: Cut&Past rules... Please fix DHCP refs! */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/*
a9749534ba173982f6c3bafe8d51ccd22960e493vboxsync * Copyright (C) 2009-2011 Oracle Corporation
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync *
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * available from http://www.virtualbox.org. This file is free software;
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * General Public License (GPL) as published by the Free Software
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/*******************************************************************************
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync* Header Files *
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync*******************************************************************************/
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#define LOG_GROUP LOG_GROUP_NET_SERVICE
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/com.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/listeners.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/string.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/Guid.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/array.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/ErrorInfo.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/errorprint.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/com/VirtualBox.h>
b73558f2e00416e86d24d6704100021758131e9bvboxsync#include <VBox/com/NativeEventQueue.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/alloca.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/buildconfig.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/err.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/net.h> /* must come before getopt.h. */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/getopt.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/initterm.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/param.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/path.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <iprt/process.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/stream.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/string.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <iprt/time.h>
b73558f2e00416e86d24d6704100021758131e9bvboxsync#include <iprt/thread.h>
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync#include <iprt/mem.h>
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <iprt/message.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <VBox/sup.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <VBox/intnet.h>
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync#include <VBox/intnetinline.h>
500aaaf3dc1d98456808e7618db3fb2e7c8fb8e0vboxsync#include <VBox/vmm/vmm.h>
8ffcab9595cc0d56977968cd496363502fd814aevboxsync#include <VBox/version.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <vector>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <string>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync#include <VBox/err.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include <VBox/log.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include "VBoxNetLib.h"
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#include "VBoxNetBaseService.h"
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#ifdef RT_OS_WINDOWS /* WinMain */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync# include <Windows.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync# include <stdlib.h>
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#endif
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/*******************************************************************************
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync* Structures and Typedefs *
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync*******************************************************************************/
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncstruct VBoxNetBaseService::Data
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync Data(const std::string& aName, const std::string& aNetworkName):
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_Name(aName),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_Network(aNetworkName),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_enmTrunkType(kIntNetTrunkType_WhateverNone),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_pSession(NIL_RTR0PTR),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_cbSendBuf(128 * _1K),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_cbRecvBuf(256 * _1K),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_hIf(INTNET_HANDLE_INVALID),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_pIfBuf(NULL),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m_cVerbosity(0),
b73558f2e00416e86d24d6704100021758131e9bvboxsync m_fNeedMain(false),
b73558f2e00416e86d24d6704100021758131e9bvboxsync m_EventQ(NULL),
b73558f2e00416e86d24d6704100021758131e9bvboxsync m_hThrRecv(NIL_RTTHREAD),
b73558f2e00416e86d24d6704100021758131e9bvboxsync fShutdown(false)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc = RTCritSectInit(&m_csThis);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync AssertRC(rc);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync };
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync std::string m_Name;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync std::string m_Network;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync std::string m_TrunkName;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync INTNETTRUNKTYPE m_enmTrunkType;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTMAC m_MacAddress;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTNETADDRIPV4 m_Ipv4Address;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTNETADDRIPV4 m_Ipv4Netmask;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PSUPDRVSESSION m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uint32_t m_cbSendBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uint32_t m_cbRecvBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync INTNETIFHANDLE m_hIf; /**< The handle to the network interface. */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PINTNETBUF m_pIfBuf; /**< Interface buffer. */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync std::vector<PRTGETOPTDEF> m_vecOptionDefs;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int32_t m_cVerbosity;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* cs for syncing */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTCRITSECT m_csThis;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* Controls whether service will connect SVC for runtime needs */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync bool m_fNeedMain;
b73558f2e00416e86d24d6704100021758131e9bvboxsync /* Event Queue */
b73558f2e00416e86d24d6704100021758131e9bvboxsync com::NativeEventQueue *m_EventQ;
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync /** receiving thread, used only if main is used */
b73558f2e00416e86d24d6704100021758131e9bvboxsync RTTHREAD m_hThrRecv;
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync bool fShutdown;
b73558f2e00416e86d24d6704100021758131e9bvboxsync static int recvLoop(RTTHREAD, void *);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync};
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync/*******************************************************************************
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync* Global Variables *
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync*******************************************************************************/
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync/* Commonly used options for network configuration */
e2843ed205192b88e54eef60ad541d00bbbc932avboxsyncstatic RTGETOPTDEF g_aGetOptDef[] =
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync{
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--name", 'N', RTGETOPT_REQ_STRING },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--network", 'n', RTGETOPT_REQ_STRING },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--trunk-name", 't', RTGETOPT_REQ_STRING },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--trunk-type", 'T', RTGETOPT_REQ_STRING },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--mac-address", 'a', RTGETOPT_REQ_MACADDR },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--ip-address", 'i', RTGETOPT_REQ_IPV4ADDR },
77da7a074c86956d36759983037056c00cb87535vboxsync { "--netmask", 'm', RTGETOPT_REQ_IPV4ADDR },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync { "--need-main", 'M', RTGETOPT_REQ_BOOL },
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync};
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncint VBoxNetBaseService::Data::recvLoop(RTTHREAD, void *pvUser)
b73558f2e00416e86d24d6704100021758131e9bvboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsync VBoxNetBaseService *pThis = static_cast<VBoxNetBaseService *>(pvUser);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync HRESULT hrc = com::Initialize();
b73558f2e00416e86d24d6704100021758131e9bvboxsync AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync pThis->doReceiveLoop();
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync return VINF_SUCCESS;
b73558f2e00416e86d24d6704100021758131e9bvboxsync}
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncVBoxNetBaseService::VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName):m(NULL)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m = new VBoxNetBaseService::Data(aName, aNetworkName);
d5b5f09d8841828e647de9da5003fda55ca4cd5evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_vecOptionDefs.push_back(&g_aGetOptDef[i]);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncVBoxNetBaseService::~VBoxNetBaseService()
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Close the interface connection.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync if (m != NULL)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
b73558f2e00416e86d24d6704100021758131e9bvboxsync shutdown();
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (m->m_hIf != INTNET_HANDLE_INVALID)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync INTNETIFCLOSEREQ CloseReq;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync CloseReq.Hdr.cbReq = sizeof(CloseReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync CloseReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync CloseReq.hIf = m->m_hIf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_hIf = INTNET_HANDLE_INVALID;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync AssertRC(rc);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (m->m_pSession != NIL_RTR0PTR)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync SUPR3Term(false /*fForced*/);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_pSession = NIL_RTR0PTR;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTCritSectDelete(&m->m_csThis);
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync delete m;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m = NULL;
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
e2843ed205192b88e54eef60ad541d00bbbc932avboxsyncint VBoxNetBaseService::init()
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync{
0566198d915e05531503035c7db85385839e708evboxsync if (isMainNeeded())
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync {
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync HRESULT hrc = com::Initialize();
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync hrc = virtualbox.createLocalObject(CLSID_VirtualBox);
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync }
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync return VINF_SUCCESS;
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync}
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncbool VBoxNetBaseService::isMainNeeded() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_fNeedMain;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncint VBoxNetBaseService::run()
b73558f2e00416e86d24d6704100021758131e9bvboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsync /**
b73558f2e00416e86d24d6704100021758131e9bvboxsync * If child class need Main we start receving thread which calls doReceiveLoop and enter to event polling loop
b73558f2e00416e86d24d6704100021758131e9bvboxsync * and for the rest clients we do receiving on the current (main) thread.
b73558f2e00416e86d24d6704100021758131e9bvboxsync */
b73558f2e00416e86d24d6704100021758131e9bvboxsync if (isMainNeeded())
b73558f2e00416e86d24d6704100021758131e9bvboxsync return startReceiveThreadAndEnterEventLoop();
b73558f2e00416e86d24d6704100021758131e9bvboxsync else
b73558f2e00416e86d24d6704100021758131e9bvboxsync {
b73558f2e00416e86d24d6704100021758131e9bvboxsync doReceiveLoop();
b73558f2e00416e86d24d6704100021758131e9bvboxsync return VINF_SUCCESS;
b73558f2e00416e86d24d6704100021758131e9bvboxsync }
b73558f2e00416e86d24d6704100021758131e9bvboxsync}
b73558f2e00416e86d24d6704100021758131e9bvboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/**
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Parse the arguments.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync *
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @returns 0 on success, fully bitched exit code on failure.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync *
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @param argc Argument count.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @param argv Argument vector.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncint VBoxNetBaseService::parseArgs(int argc, char **argv)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync RTGETOPTSTATE State;
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync PRTGETOPTDEF paOptionArray = getOptionsPtr();
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m->m_vecOptionDefs.size(), 0, 0 /*fFlags*/);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync AssertRCReturn(rc, 49);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync#if 0
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync /* default initialization */
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync m_enmTrunkType = kIntNetTrunkType_WhateverNone;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync#endif
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync Log2(("BaseService: parseArgs enter\n"));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync for (;;)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync RTGETOPTUNION Val;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync rc = RTGetOpt(&State, &Val);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (!rc)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync switch (rc)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'N': // --name
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Name = Val.psz;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'n': // --network
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Network = Val.psz;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 't': //--trunk-name
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_TrunkName = Val.psz;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'T': //--trunk-type
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (!strcmp(Val.psz, "none"))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_enmTrunkType = kIntNetTrunkType_None;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync else if (!strcmp(Val.psz, "whatever"))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_enmTrunkType = kIntNetTrunkType_WhateverNone;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync else if (!strcmp(Val.psz, "netflt"))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_enmTrunkType = kIntNetTrunkType_NetFlt;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync else if (!strcmp(Val.psz, "netadp"))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_enmTrunkType = kIntNetTrunkType_NetAdp;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync else if (!strcmp(Val.psz, "srvnat"))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_enmTrunkType = kIntNetTrunkType_SrvNat;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync else
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync RTStrmPrintf(g_pStdErr, "Invalid trunk type '%s'\n", Val.psz);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync return 1;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'a': // --mac-address
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_MacAddress = Val.MacAddr;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'i': // --ip-address
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Ipv4Address = Val.IPv4Addr;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync case 'm': // --netmask
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Ipv4Netmask = Val.IPv4Addr;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync break;
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'v': // --verbose
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_cVerbosity++;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync break;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'V': // --version (missed)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync RTPrintf("%sr%u\n", RTBldCfgVersion(), RTBldCfgRevision());
8ffcab9595cc0d56977968cd496363502fd814aevboxsync return 1;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync case 'M': // --need-main
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_fNeedMain = true;
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync break;
011bebd8930c3fa3df178d1c82ae88cc73c70d39vboxsync
84d24b25be3d7e4004bf1601d8e0754398111a04vboxsync case 'h': // --help (missed)
7f67048412d241d45c0835b9c403a5bb1c879030vboxsync RTPrintf("%s Version %sr%u\n"
8ffcab9595cc0d56977968cd496363502fd814aevboxsync "(C) 2009-" VBOX_C_YEAR " " VBOX_VENDOR "\n"
8ffcab9595cc0d56977968cd496363502fd814aevboxsync "All rights reserved.\n"
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync "\n"
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync "Usage: %s <options>\n"
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync "\n"
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync "Options:\n",
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync RTProcShortName(),
7f67048412d241d45c0835b9c403a5bb1c879030vboxsync RTBldCfgVersion(),
7f67048412d241d45c0835b9c403a5bb1c879030vboxsync RTBldCfgRevision(),
7f67048412d241d45c0835b9c403a5bb1c879030vboxsync RTProcShortName());
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); i++)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync RTPrintf(" -%c, %s\n", m->m_vecOptionDefs[i]->iShort, m->m_vecOptionDefs[i]->pszLong);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync usage(); /* to print Service Specific usage */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync return 1;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync default:
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync int rc1 = parseOpt(rc, Val);
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync if (RT_FAILURE(rc1))
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync {
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync rc = RTGetOptPrintError(rc, &Val);
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync RTPrintf("Use --help for more information.\n");
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync return rc;
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync RTMemFree(paOptionArray);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncint VBoxNetBaseService::tryGoOnline(void)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Open the session, load ring-0 and issue the request.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc = SUPR3Init(&m->m_pSession);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_FAILURE(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_pSession = NIL_RTR0PTR;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync LogRel(("VBoxNetBaseService: SUPR3Init -> %Rrc\n", rc));
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync char szPath[RTPATH_MAX];
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync rc = RTPathExecDir(szPath, sizeof(szPath) - sizeof("/VMMR0.r0"));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_FAILURE(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync LogRel(("VBoxNetBaseService: RTPathExecDir -> %Rrc\n", rc));
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync rc = SUPR3LoadVMM(strcat(szPath, "/VMMR0.r0"));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_FAILURE(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync LogRel(("VBoxNetBaseService: SUPR3LoadVMM(\"%s\") -> %Rrc\n", szPath, rc));
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Create the open request.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync PINTNETBUF pBuf;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync INTNETOPENREQ OpenReq;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.Hdr.cbReq = sizeof(OpenReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync OpenReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync strncpy(OpenReq.szNetwork, m->m_Network.c_str(), sizeof(OpenReq.szNetwork));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.szNetwork[sizeof(OpenReq.szNetwork) - 1] = '\0';
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync strncpy(OpenReq.szTrunk, m->m_TrunkName.c_str(), sizeof(OpenReq.szTrunk));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.szTrunk[sizeof(OpenReq.szTrunk) - 1] = '\0';
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync OpenReq.enmTrunkType = m->m_enmTrunkType;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.fFlags = 0; /** @todo check this */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync OpenReq.cbSend = m->m_cbSendBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync OpenReq.cbRecv = m->m_cbRecvBuf;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync OpenReq.hIf = INTNET_HANDLE_INVALID;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Issue the request.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync Log2(("attempting to open/create network \"%s\"...\n", OpenReq.szNetwork));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_OPEN, 0, &OpenReq.Hdr);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_FAILURE(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync Log2(("VBoxNetBaseService: SUPR3CallVMMR0Ex(,VMMR0_DO_INTNET_OPEN,) failed, rc=%Rrc\n", rc));
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_hIf = OpenReq.hIf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync Log2(("successfully opened/created \"%s\" - hIf=%#x\n", OpenReq.szNetwork, m->m_hIf));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Get the ring-3 address of the shared interface buffer.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
150e55a1de2d8702b09de9dd08e488cc9da197d9vboxsync INTNETIFGETBUFFERPTRSREQ GetBufferPtrsReq;
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync GetBufferPtrsReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync GetBufferPtrsReq.Hdr.cbReq = sizeof(GetBufferPtrsReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync GetBufferPtrsReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync GetBufferPtrsReq.hIf = m->m_hIf;
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync GetBufferPtrsReq.pRing3Buf = NULL;
b4feef6ee36ff3c271b06e7e52e22580cc66174bvboxsync GetBufferPtrsReq.pRing0Buf = NIL_RTR0PTR;
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_GET_BUFFER_PTRS, 0, &GetBufferPtrsReq.Hdr);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_FAILURE(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync Log2(("VBoxNetBaseService: SUPR3CallVMMR0Ex(,VMMR0_DO_INTNET_IF_GET_BUFFER_PTRS,) failed, rc=%Rrc\n", rc));
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return rc;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
9a12ad9a1028187595f21d9264898220c1ea565fvboxsync pBuf = GetBufferPtrsReq.pRing3Buf;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync Log2(("pBuf=%p cbBuf=%d cbSend=%d cbRecv=%d\n",
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync pBuf, pBuf->cbBuf, pBuf->cbSend, pBuf->cbRecv));
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_pIfBuf = pBuf;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /*
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Activate the interface.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync INTNETIFSETACTIVEREQ ActiveReq;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync ActiveReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync ActiveReq.Hdr.cbReq = sizeof(ActiveReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync ActiveReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync ActiveReq.hIf = m->m_hIf;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync ActiveReq.fActive = true;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SET_ACTIVE, 0, &ActiveReq.Hdr);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync if (RT_SUCCESS(rc))
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync return 0;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync /* bail out */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync Log2(("VBoxNetBaseService: SUPR3CallVMMR0Ex(,VMMR0_DO_INTNET_IF_SET_PROMISCUOUS_MODE,) failed, rc=%Rrc\n", rc));
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
f581f3e365dbaec7822752c865314476d86c7e16vboxsync /* ignore this error */
8a8d7629deae8875b70c6899e8b0f683b2a543e1vboxsync return VINF_SUCCESS;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncvoid VBoxNetBaseService::shutdown(void)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsync syncEnter();
b73558f2e00416e86d24d6704100021758131e9bvboxsync m->fShutdown = true;
b73558f2e00416e86d24d6704100021758131e9bvboxsync syncLeave();
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncint VBoxNetBaseService::syncEnter()
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return RTCritSectEnter(&m->m_csThis);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncint VBoxNetBaseService::syncLeave()
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return RTCritSectLeave(&m->m_csThis);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsyncint VBoxNetBaseService::waitForIntNetEvent(int cMillis)
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync{
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync int rc = VINF_SUCCESS;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync INTNETIFWAITREQ WaitReq;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync LogFlowFunc(("ENTER:cMillis: %d\n", cMillis));
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync WaitReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync WaitReq.Hdr.cbReq = sizeof(WaitReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync WaitReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync WaitReq.hIf = m->m_hIf;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync WaitReq.cMillies = cMillis;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_WAIT, 0, &WaitReq.Hdr);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync LogFlowFuncLeaveRC(rc);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync return rc;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync}
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync/* S/G API */
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsyncint VBoxNetBaseService::sendBufferOnWire(PCINTNETSEG pcSg, int cSg, size_t cbFrame)
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync{
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync PINTNETHDR pHdr = NULL;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync uint8_t *pu8Frame = NULL;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync /* Allocate frame */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc = IntNetRingAllocateFrame(&m->m_pIfBuf->Send, cbFrame, &pHdr, (void **)&pu8Frame);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync AssertRCReturn(rc, rc);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync /* Now we fill pvFrame with S/G above */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int offFrame = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync for (int idxSg = 0; idxSg < cSg; ++idxSg)
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync {
77da7a074c86956d36759983037056c00cb87535vboxsync memcpy(&pu8Frame[offFrame], pcSg[idxSg].pv, pcSg[idxSg].cb);
77da7a074c86956d36759983037056c00cb87535vboxsync offFrame+=pcSg[idxSg].cb;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync /* Commit */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync IntNetRingCommitFrameEx(&m->m_pIfBuf->Send, pHdr, cbFrame);
d5b5f09d8841828e647de9da5003fda55ca4cd5evboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync LogFlowFuncLeaveRC(rc);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync return rc;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync/**
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync * forcible ask for send packet on the "wire"
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync */
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsyncvoid VBoxNetBaseService::flushWire()
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync{
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync int rc = VINF_SUCCESS;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync INTNETIFSENDREQ SendReq;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync SendReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync SendReq.Hdr.cbReq = sizeof(SendReq);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync SendReq.pSession = m->m_pSession;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync SendReq.hIf = m->m_hIf;
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SEND, 0, &SendReq.Hdr);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync AssertRCReturnVoid(rc);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync LogFlowFuncLeave();
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync}
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncint VBoxNetBaseService::hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void const *pvData, size_t cbData) const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return VBoxNetUDPBroadcast(m->m_pSession, m->m_hIf, m->m_pIfBuf,
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Ipv4Address, &m->m_MacAddress, uSrcPort,
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uDstPort, pvData, cbData);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncconst std::string VBoxNetBaseService::getName() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_Name;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setName(const std::string& aName)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Name = aName;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncconst std::string VBoxNetBaseService::getNetwork() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_Network;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setNetwork(const std::string& aNetwork)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Network = aNetwork;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncconst RTMAC VBoxNetBaseService::getMacAddress() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_MacAddress;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setMacAddress(const RTMAC& aMac)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_MacAddress = aMac;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncconst RTNETADDRIPV4 VBoxNetBaseService::getIpv4Address() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_Ipv4Address;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setIpv4Address(const RTNETADDRIPV4& aAddress)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Ipv4Address = aAddress;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncconst RTNETADDRIPV4 VBoxNetBaseService::getIpv4Netmask() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_Ipv4Netmask;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setIpv4Netmask(const RTNETADDRIPV4& aNetmask)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_Ipv4Netmask = aNetmask;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncuint32_t VBoxNetBaseService::getSendBufSize() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_cbSendBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setSendBufSize(uint32_t cbBuf)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_cbSendBuf = cbBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncuint32_t VBoxNetBaseService::getRecvBufSize() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_cbRecvBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setRecvBufSize(uint32_t cbBuf)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_cbRecvBuf = cbBuf;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncint32_t VBoxNetBaseService::getVerbosityLevel() const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync return m->m_cVerbosity;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::setVerbosityLevel(int32_t aVerbosity)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_cVerbosity = aVerbosity;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::addCommandLineOption(const PRTGETOPTDEF optDef)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync m->m_vecOptionDefs.push_back(optDef);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::doReceiveLoop()
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int rc;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* Well we're ready */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PINTNETRINGBUF pRingBuf = &m->m_pIfBuf->Recv;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync for (;;)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /*
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync * Wait for a packet to become available.
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* 2. waiting for request for */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync rc = waitForIntNetEvent(2000);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (RT_FAILURE(rc))
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* do we want interrupt anyone ??? */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync continue;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync LogRel(("VBoxNetNAT: waitForIntNetEvent returned %Rrc\n", rc));
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync AssertRCReturnVoid(rc);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /*
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync * Process the receive buffer.
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PCINTNETHDR pHdr;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync while ((pHdr = IntNetRingGetNextFrameToRead(pRingBuf)) != NULL)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uint8_t const u8Type = pHdr->u8Type;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync size_t cbFrame = pHdr->cbFrame;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync switch (u8Type)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync case INTNETHDR_TYPE_FRAME:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void *pvFrame = IntNetHdrGetFramePtr(pHdr, m->m_pIfBuf);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync rc = processFrame(pvFrame, cbFrame);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (RT_FAILURE(rc) && rc == VERR_IGNORED)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* XXX: UDP + ARP for DHCP */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync VBOXNETUDPHDRS Hdrs;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync size_t cb;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void *pv = VBoxNetUDPMatch(m->m_pIfBuf, RTNETIPV4_PORT_BOOTPS, &m->m_MacAddress,
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync VBOXNETUDP_MATCH_UNICAST | VBOXNETUDP_MATCH_BROADCAST
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync | VBOXNETUDP_MATCH_CHECKSUM
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync | (m->m_cVerbosity > 2 ? VBOXNETUDP_MATCH_PRINT_STDERR : 0),
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync &Hdrs, &cb);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (pv && cb)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync processUDP(pv, cb);
1f81eb5400025393fd9b496ccde15364d6852ec9vboxsync else
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync VBoxNetArpHandleIt(m->m_pSession, m->m_hIf, m->m_pIfBuf, &m->m_MacAddress, m->m_Ipv4Address);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync break;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync case INTNETHDR_TYPE_GSO:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PCPDMNETWORKGSO pGso = IntNetHdrGetGsoContext(pHdr, m->m_pIfBuf);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync rc = processGSO(pGso, cbFrame);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (RT_FAILURE(rc) && rc == VERR_IGNORED)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync break;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync break;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync case INTNETHDR_TYPE_PADDING:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync break;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync default:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync break;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync IntNetRingSkipFrame(&m->m_pIfBuf->Recv);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync } /* loop */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncint VBoxNetBaseService::startReceiveThreadAndEnterEventLoop()
b73558f2e00416e86d24d6704100021758131e9bvboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsync AssertMsgReturn(isMainNeeded(), ("It's expected that we need Main"), VERR_INTERNAL_ERROR);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync /* start receiving thread */
b73558f2e00416e86d24d6704100021758131e9bvboxsync int rc = RTThreadCreate(&m->m_hThrRecv, /* thread handle*/
b73558f2e00416e86d24d6704100021758131e9bvboxsync &VBoxNetBaseService::Data::recvLoop, /* routine */
b73558f2e00416e86d24d6704100021758131e9bvboxsync this, /* user data */
b73558f2e00416e86d24d6704100021758131e9bvboxsync 128 * _1K, /* stack size */
b73558f2e00416e86d24d6704100021758131e9bvboxsync RTTHREADTYPE_IO, /* type */
b73558f2e00416e86d24d6704100021758131e9bvboxsync 0, /* flags, @todo: waitable ?*/
b73558f2e00416e86d24d6704100021758131e9bvboxsync "RECV");
b73558f2e00416e86d24d6704100021758131e9bvboxsync AssertRCReturn(rc,rc);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync m->m_EventQ = com::NativeEventQueue::getMainEventQueue();
b73558f2e00416e86d24d6704100021758131e9bvboxsync AssertPtrReturn(m->m_EventQ, VERR_INTERNAL_ERROR);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync while(true)
b73558f2e00416e86d24d6704100021758131e9bvboxsync {
b73558f2e00416e86d24d6704100021758131e9bvboxsync m->m_EventQ->processEventQueue(0);
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync if (m->fShutdown)
b73558f2e00416e86d24d6704100021758131e9bvboxsync break;
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync m->m_EventQ->processEventQueue(500);
b73558f2e00416e86d24d6704100021758131e9bvboxsync }
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync return VINF_SUCCESS;
b73558f2e00416e86d24d6704100021758131e9bvboxsync}
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvoid VBoxNetBaseService::debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (iMinLevel <= m->m_cVerbosity)
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync va_list va;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync va_start(va, pszFmt);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync debugPrintV(iMinLevel, fMsg, pszFmt, va);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync va_end(va);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync }
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync}
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/**
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * Print debug message depending on the m_cVerbosity level.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync *
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @param iMinLevel The minimum m_cVerbosity level for this message.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * @param fMsg Whether to dump parts for the current service message.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @param pszFmt The message format string.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * @param va Optional arguments.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncvoid VBoxNetBaseService::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_list va) const
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync if (iMinLevel <= m->m_cVerbosity)
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync {
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync va_list vaCopy; /* This dude is *very* special, thus the copy. */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync va_copy(vaCopy, va);
d5b5f09d8841828e647de9da5003fda55ca4cd5evboxsync RTStrmPrintf(g_pStdErr, "%s: %s: %N\n",
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync RTProcShortName(),
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync iMinLevel >= 2 ? "debug" : "info",
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync pszFmt,
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync &vaCopy);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync va_end(vaCopy);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync }
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync}
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
e2843ed205192b88e54eef60ad541d00bbbc932avboxsyncPRTGETOPTDEF VBoxNetBaseService::getOptionsPtr()
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync{
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync PRTGETOPTDEF pOptArray = NULL;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync pOptArray = (PRTGETOPTDEF)RTMemAlloc(sizeof(RTGETOPTDEF) * m->m_vecOptionDefs.size());
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync if (!pOptArray)
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync return NULL;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); ++i)
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync {
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PRTGETOPTDEF pOpt = m->m_vecOptionDefs[i];
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync memcpy(&pOptArray[i], m->m_vecOptionDefs[i], sizeof(RTGETOPTDEF));
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync }
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync return pOptArray;
e2843ed205192b88e54eef60ad541d00bbbc932avboxsync}