Windows Ethernet tap refactoring complete.

This commit is contained in:
Adam Ierymenko 2014-08-04 21:48:59 -07:00
parent df0a8e8450
commit 7adf0eac7e
7 changed files with 402 additions and 295 deletions

View file

@ -31,95 +31,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <ifdef.h>
#include <string>
#include <queue>
#include <stdexcept>
#include "../Constants.hpp"
#include "../EthernetTap.hpp"
#include "../Mutex.hpp"
#include "../Thread.hpp"
#include "../Array.hpp"
#include "../node/Constants.hpp"
#include "../node/EthernetTap.hpp"
#include "../node/Mutex.hpp"
#include "../node/Thread.hpp"
#include "../node/Array.hpp"
#include "../node/MulticastGroup.hpp"
namespace ZeroTier {
/**
* Windows Ethernet tap device using bundled ztTap driver
*/
class WindowsEthernetTap : public EthernetTap
{
public:
/**
* Open tap device, installing and creating one if it does not exist
*
* @param renv Runtime environment
* @param tag A tag (presently the hex network ID) used to identify persistent tap devices in the registry
* @param mac MAC address of device
* @param mtu MTU of device
* @param desc If non-NULL, a description (not used on all OSes)
* @param handler Handler function to be called when data is received from the tap
* @param arg First argument to handler function
* @throws std::runtime_error Unable to allocate device
*/
WindowsEthernetTap(
const RuntimeEnvironment *renv,
const char *tag,
const char *pathToHelpers,
const MAC &mac,
unsigned int mtu,
unsigned int metric,
uint64_t nwid,
const char *desiredDevice,
const char *friendlyName,
void (*handler)(void *,const MAC &,const MAC &,unsigned int,const Buffer<4096> &),
void *arg)
throw(std::runtime_error);
void *arg);
virtual ~WindowsEthernetTap();
virtual void setEnabled(bool en);
virtual bool enabled() const;
virtual void setDisplayName(const char *dn);
virtual bool addIP(const InetAddress &ip);
virtual bool removeIP(const InetAddress &ip);
virtual std::set<InetAddress> ips() const;
virtual void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
virtual std::string deviceName() const;
virtual std::string persistentId() const;
virtual void setFriendlyName(const char *friendlyName);
virtual bool updateMulticastGroups(std::set<MulticastGroup> &groups);
/**
* Thread main method; do not call elsewhere
*/
inline const NET_LUID &luid() const { return _deviceLuid; }
inline const GUID &guid() const { return _deviceGuid; }
inline const std::string &instanceId() const { return _deviceInstanceId; }
void threadMain()
throw();
/**
* Remove persistent tap device by device name
*
* @param _r Runtime environment
* @param pdev Device name as returned by persistentId() while tap is running
* @return True if a device was deleted
*/
static bool deletePersistentTapDevice(const RuntimeEnvironment *_r,const char *pid);
/**
* Clean persistent tap devices that are not in the supplied set
*
* @param _r Runtime environment
* @param exceptThese Devices to leave in place
* @param alsoRemoveUnassociatedDevices If true, remove devices not associated with any network as well
* @return Number of devices deleted or -1 if an error prevented the operation from being performed
*/
static int cleanPersistentTapDevices(const RuntimeEnvironment *_r,const std::set<std::string> &exceptThese,bool alsoRemoveUnassociatedDevices);
private:
bool _disableTapDevice();
bool _enableTapDevice();
NET_IFINDEX _getDeviceIndex(); // throws on failure
void (*_handler)(void *,const MAC &,const MAC &,unsigned int,const Buffer<4096> &);
void *_arg;
Thread _thread;
volatile HANDLE _tap;
HANDLE _injectSemaphore;
GUID _deviceGuid;
NET_LUID _deviceLuid;
std::string _netCfgInstanceId; // NetCfgInstanceId, a GUID
std::string _deviceInstanceId; // DeviceInstanceID, another kind of "instance ID"
std::queue< std::pair< Array<char,ZT_IF_MTU + 32>,unsigned int > > _injectPending;
Mutex _injectPending_m;
std::string _pathToHelpers;
volatile bool _run;
volatile bool _initialized;
volatile bool _enabled;