d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/* $Id$ */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/** @file
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync * VBoxNetUDP - IntNet Client Library.
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync */
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * 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#ifndef ___VBoxNetBaseService_h___
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#define ___VBoxNetBaseService_h___
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync#include <iprt/critsect.h>
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncclass VBoxNetHlpUDPService
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync{
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncpublic:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsyncvirtual int hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void const *pvData, size_t cbData) const = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync};
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncclass VBoxNetLockee
b73558f2e00416e86d24d6704100021758131e9bvboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsyncpublic:
b73558f2e00416e86d24d6704100021758131e9bvboxsync virtual int syncEnter() = 0;
b73558f2e00416e86d24d6704100021758131e9bvboxsync virtual int syncLeave() = 0;
b73558f2e00416e86d24d6704100021758131e9bvboxsync};
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncclass VBoxNetALock
b73558f2e00416e86d24d6704100021758131e9bvboxsync{
b73558f2e00416e86d24d6704100021758131e9bvboxsyncpublic:
b73558f2e00416e86d24d6704100021758131e9bvboxsync VBoxNetALock(VBoxNetLockee *a_lck):m_lck(a_lck)
b73558f2e00416e86d24d6704100021758131e9bvboxsync {
b73558f2e00416e86d24d6704100021758131e9bvboxsync if (m_lck)
b73558f2e00416e86d24d6704100021758131e9bvboxsync m_lck->syncEnter();
b73558f2e00416e86d24d6704100021758131e9bvboxsync }
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync ~VBoxNetALock()
b73558f2e00416e86d24d6704100021758131e9bvboxsync {
b73558f2e00416e86d24d6704100021758131e9bvboxsync if (m_lck)
b73558f2e00416e86d24d6704100021758131e9bvboxsync m_lck->syncLeave();
b73558f2e00416e86d24d6704100021758131e9bvboxsync }
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsyncprivate:
b73558f2e00416e86d24d6704100021758131e9bvboxsync VBoxNetLockee *m_lck;
b73558f2e00416e86d24d6704100021758131e9bvboxsync};
b73558f2e00416e86d24d6704100021758131e9bvboxsync
0d49a2fbc9857ad8dd29542de7fb37202f1a283fvboxsync# ifndef BASE_SERVICES_ONLY
b73558f2e00416e86d24d6704100021758131e9bvboxsyncclass VBoxNetBaseService: public VBoxNetHlpUDPService, public VBoxNetLockee
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync{
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsyncpublic:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync virtual ~VBoxNetBaseService();
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync int parseArgs(int argc, char **argv);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync int tryGoOnline(void);
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync void shutdown(void);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int syncEnter();
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int syncLeave();
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync int waitForIntNetEvent(int cMillis);
1b8fb9123956247b778a8aee821295b360b41e6fvboxsync int abortWait();
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync int sendBufferOnWire(PCINTNETSEG pSg, int cSg, size_t cbBuffer);
2622c26c6b4105d944a29c5e2c77b6ef26e10101vboxsync void flushWire();
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync virtual int hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void const *pvData, size_t cbData) const;
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync virtual void usage(void) = 0;
0f70ed40798198e1d9099c6ae3bdb239d2b8cf0dvboxsync virtual int parseOpt(int rc, const RTGETOPTUNION& getOptVal) = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync virtual int processFrame(void *, size_t) = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync virtual int processGSO(PCPDMNETWORKGSO, size_t) = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync virtual int processUDP(void *, size_t) = 0;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
1af704e0ccef76a9d375efc06d2a5eba6d679809vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync virtual int init(void);
b73558f2e00416e86d24d6704100021758131e9bvboxsync virtual int run(void);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync virtual bool isMainNeeded() const;
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsyncprotected:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync const std::string getName() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setName(const std::string&);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync const std::string getNetwork() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setNetwork(const std::string&);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync const RTMAC getMacAddress() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setMacAddress(const RTMAC&);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync const RTNETADDRIPV4 getIpv4Address() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setIpv4Address(const RTNETADDRIPV4&);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync const RTNETADDRIPV4 getIpv4Netmask() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setIpv4Netmask(const RTNETADDRIPV4&);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uint32_t getSendBufSize() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setSendBufSize(uint32_t);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync uint32_t getRecvBufSize() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setRecvBufSize(uint32_t);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync int32_t getVerbosityLevel() const;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void setVerbosityLevel(int32_t);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void addCommandLineOption(const PRTGETOPTDEF);
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync /**
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * Print debug message depending on the m_cVerbosity level.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync *
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * @param iMinLevel The minimum m_cVerbosity level for this message.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * @param fMsg Whether to dump parts for the current DHCP message.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * @param pszFmt The message format string.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync * @param ... Optional arguments.
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const;
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync virtual void debugPrintV(int32_t iMinLevel, bool fMsg, const char *pszFmt, va_list va) const;
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync private:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync void doReceiveLoop();
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync /** starts receiving thread and enter event polling loop. */
b73558f2e00416e86d24d6704100021758131e9bvboxsync int startReceiveThreadAndEnterEventLoop();
b73558f2e00416e86d24d6704100021758131e9bvboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync protected:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync /* VirtualBox instance */
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync ComPtr<IVirtualBox> virtualbox;
2883e7039d8138676e0a0d96c56f4838f1bf049bvboxsync ComPtr<IVirtualBoxClient> virtualboxClient;
2e2dec6e64c09dd7e3fe4ad0ee8bb5cf7d63762evboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync private:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync struct Data;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync Data *m;
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync
b73558f2e00416e86d24d6704100021758131e9bvboxsync private:
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync PRTGETOPTDEF getOptionsPtr();
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync};
0e1eea910a209a7a8edeed71c9be066a02f59202vboxsync# endif
d1a00c93378091ef28db9d959b2d692cc8143a07vboxsync#endif