2013-07-04 20:56:19 +00:00
|
|
|
/*
|
|
|
|
* ZeroTier One - Global Peer to Peer Ethernet
|
2014-02-16 20:40:22 +00:00
|
|
|
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
2013-07-04 20:56:19 +00:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
* --
|
|
|
|
*
|
|
|
|
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
|
|
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
|
|
*
|
|
|
|
* If you would like to embed ZeroTier into a commercial application or
|
|
|
|
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
|
|
* LLC. Start here: http://www.zerotier.com/
|
|
|
|
*/
|
|
|
|
|
2013-12-07 00:49:20 +00:00
|
|
|
#ifndef ZT_NODE_HPP
|
|
|
|
#define ZT_NODE_HPP
|
2013-07-04 20:56:19 +00:00
|
|
|
|
2014-09-15 23:32:55 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
|
2014-09-12 23:57:37 +00:00
|
|
|
#include "../include/ZeroTierOne.h"
|
2013-11-20 21:16:30 +00:00
|
|
|
|
2013-07-04 20:56:19 +00:00
|
|
|
namespace ZeroTier {
|
|
|
|
|
2014-07-31 21:09:32 +00:00
|
|
|
class EthernetTapFactory;
|
|
|
|
class RoutingTable;
|
2014-10-21 22:18:50 +00:00
|
|
|
class SocketManager;
|
2014-07-31 21:09:32 +00:00
|
|
|
|
2013-07-04 20:56:19 +00:00
|
|
|
/**
|
|
|
|
* A ZeroTier One node
|
|
|
|
*/
|
|
|
|
class Node
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Returned by node main if/when it terminates
|
|
|
|
*/
|
|
|
|
enum ReasonForTermination
|
|
|
|
{
|
2013-12-10 23:30:53 +00:00
|
|
|
/**
|
|
|
|
* Node is currently in run()
|
|
|
|
*/
|
2013-07-04 20:56:19 +00:00
|
|
|
NODE_RUNNING = 0,
|
2013-12-10 23:30:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Node is shutting down for normal reasons, including a signal
|
|
|
|
*/
|
2013-07-04 20:56:19 +00:00
|
|
|
NODE_NORMAL_TERMINATION = 1,
|
2013-12-10 23:30:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* An upgrade is available. Its path is in reasonForTermination().
|
|
|
|
*/
|
|
|
|
NODE_RESTART_FOR_UPGRADE = 2,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A serious unrecoverable error has occurred.
|
|
|
|
*/
|
2014-03-19 20:56:48 +00:00
|
|
|
NODE_UNRECOVERABLE_ERROR = 3,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An address collision occurred (typically this should cause re-invocation with resetIdentity set to true)
|
|
|
|
*/
|
|
|
|
NODE_ADDRESS_COLLISION = 4
|
2013-07-04 20:56:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new node
|
|
|
|
*
|
2014-07-31 21:09:32 +00:00
|
|
|
* The node is not executed until run() is called. The supplied tap factory
|
|
|
|
* and routing table must not be freed until the node is no longer
|
2014-09-12 23:57:37 +00:00
|
|
|
* executing. Node does not delete these objects; the caller still owns
|
2014-07-31 21:09:32 +00:00
|
|
|
* them.
|
2013-07-04 20:56:19 +00:00
|
|
|
*
|
2014-07-31 21:09:32 +00:00
|
|
|
* @param hp Home directory path or NULL for system-wide default for this platform
|
|
|
|
* @param tf Ethernet tap factory for platform network stack
|
|
|
|
* @param rt Routing table interface for platform network stack
|
2014-10-21 22:18:50 +00:00
|
|
|
* @param sm Socket manager for physical network I/O
|
2014-07-31 21:09:32 +00:00
|
|
|
* @param resetIdentity If true, delete identity before starting and regenerate
|
2014-10-03 18:59:50 +00:00
|
|
|
* @param overrideRootTopology Override root topology with this dictionary (in string serialized format) and do not update (default: NULL for none)
|
2013-07-04 20:56:19 +00:00
|
|
|
*/
|
2014-07-31 21:09:32 +00:00
|
|
|
Node(
|
|
|
|
const char *hp,
|
|
|
|
EthernetTapFactory *tf,
|
|
|
|
RoutingTable *rt,
|
2014-10-21 22:18:50 +00:00
|
|
|
SocketManager *sm,
|
2014-10-03 18:59:50 +00:00
|
|
|
bool resetIdentity,
|
|
|
|
const char *overrideRootTopology = (const char *)0) throw();
|
2013-07-04 20:56:19 +00:00
|
|
|
|
|
|
|
~Node();
|
|
|
|
|
|
|
|
/**
|
2014-09-12 23:57:37 +00:00
|
|
|
* Execute node in current thread, return on shutdown
|
2013-07-04 20:56:19 +00:00
|
|
|
*
|
|
|
|
* @return Reason for termination
|
|
|
|
*/
|
|
|
|
ReasonForTermination run()
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Obtain a human-readable reason for node termination
|
|
|
|
*
|
|
|
|
* @return Reason for node termination or NULL if run() has not returned
|
|
|
|
*/
|
2014-09-12 23:57:37 +00:00
|
|
|
const char *terminationMessage() const
|
2013-07-04 20:56:19 +00:00
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
2014-09-11 00:16:40 +00:00
|
|
|
* Terminate this node, causing run() to return
|
2013-08-30 19:02:12 +00:00
|
|
|
*
|
|
|
|
* @param reason Reason for termination
|
2014-09-12 23:57:37 +00:00
|
|
|
* @param reasonText Text to be returned by terminationMessage()
|
2013-07-04 20:56:19 +00:00
|
|
|
*/
|
2013-08-30 19:02:12 +00:00
|
|
|
void terminate(ReasonForTermination reason,const char *reasonText)
|
2013-07-04 20:56:19 +00:00
|
|
|
throw();
|
2014-01-30 01:24:55 +00:00
|
|
|
|
|
|
|
/**
|
2014-03-19 20:56:48 +00:00
|
|
|
* Forget p2p links now and resynchronize with peers
|
2014-09-12 23:57:37 +00:00
|
|
|
*
|
|
|
|
* This can be used if the containing application knows its network environment has
|
|
|
|
* changed. ZeroTier itself tries to detect such changes, but is not always successful.
|
2014-01-30 01:24:55 +00:00
|
|
|
*/
|
|
|
|
void resync()
|
|
|
|
throw();
|
2013-07-04 20:56:19 +00:00
|
|
|
|
2014-09-12 23:57:37 +00:00
|
|
|
/**
|
|
|
|
* @return True if we appear to be online in some viable capacity
|
|
|
|
*/
|
|
|
|
bool online()
|
|
|
|
throw();
|
|
|
|
|
2014-09-15 23:32:55 +00:00
|
|
|
/**
|
|
|
|
* @return True if run() has been called
|
|
|
|
*/
|
|
|
|
bool started()
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return True if run() has not yet returned
|
|
|
|
*/
|
|
|
|
bool running()
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return True if initialization phase of startup is complete
|
|
|
|
*/
|
|
|
|
bool initialized()
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return This node's address (in least significant 40 bits of 64-bit int) or 0 if not yet initialized
|
|
|
|
*/
|
|
|
|
uint64_t address()
|
|
|
|
throw();
|
|
|
|
|
2014-09-11 00:16:40 +00:00
|
|
|
/**
|
|
|
|
* Join a network
|
|
|
|
*
|
2014-09-12 23:57:37 +00:00
|
|
|
* Use getNetworkStatus() to check the network's status after joining. If you
|
|
|
|
* are already a member of the network, this does nothing.
|
|
|
|
*
|
|
|
|
* @param nwid 64-bit network ID
|
2014-09-11 00:16:40 +00:00
|
|
|
*/
|
2014-09-12 23:57:37 +00:00
|
|
|
void join(uint64_t nwid)
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
2014-10-24 23:35:06 +00:00
|
|
|
* Leave a network (if a member)
|
2014-09-11 00:16:40 +00:00
|
|
|
*
|
2014-09-12 23:57:37 +00:00
|
|
|
* @param nwid 64-bit network ID
|
|
|
|
*/
|
|
|
|
void leave(uint64_t nwid)
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the status of this node
|
|
|
|
*
|
|
|
|
* @param status Buffer to fill with status information
|
2014-09-11 00:16:40 +00:00
|
|
|
*/
|
2014-09-12 23:57:37 +00:00
|
|
|
void status(ZT1_Node_Status *status)
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
2014-09-12 23:57:37 +00:00
|
|
|
/**
|
|
|
|
* @return List of known peers or NULL on failure
|
|
|
|
*/
|
|
|
|
ZT1_Node_PeerList *listPeers()
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
2014-09-12 23:57:37 +00:00
|
|
|
/**
|
|
|
|
* @param nwid 64-bit network ID
|
|
|
|
* @return Network status or NULL if we are not a member of this network
|
|
|
|
*/
|
|
|
|
ZT1_Node_Network *getNetworkStatus(uint64_t nwid)
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
2014-09-12 23:57:37 +00:00
|
|
|
* @return List of networks we've joined or NULL on failure
|
2014-09-11 00:16:40 +00:00
|
|
|
*/
|
2014-09-12 23:57:37 +00:00
|
|
|
ZT1_Node_NetworkList *listNetworks()
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
2014-09-12 23:57:37 +00:00
|
|
|
* Free a query result buffer
|
|
|
|
*
|
|
|
|
* Use this to free the return values of listNetworks(), listPeers(), etc.
|
|
|
|
*
|
|
|
|
* @param qr Query result buffer
|
|
|
|
*/
|
|
|
|
void freeQueryResult(void *qr)
|
|
|
|
throw();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check for software updates (if enabled) (updates will eventually get factored out of node/)
|
2014-09-11 00:16:40 +00:00
|
|
|
*/
|
2014-09-12 23:57:37 +00:00
|
|
|
bool updateCheck()
|
2014-09-11 00:16:40 +00:00
|
|
|
throw();
|
|
|
|
|
2014-03-19 20:56:48 +00:00
|
|
|
static const char *versionString() throw();
|
2013-07-04 20:56:19 +00:00
|
|
|
static unsigned int versionMajor() throw();
|
|
|
|
static unsigned int versionMinor() throw();
|
|
|
|
static unsigned int versionRevision() throw();
|
|
|
|
|
|
|
|
private:
|
2013-07-18 15:43:46 +00:00
|
|
|
// Nodes are not copyable
|
|
|
|
Node(const Node&);
|
|
|
|
const Node& operator=(const Node&);
|
|
|
|
|
2013-07-04 20:56:19 +00:00
|
|
|
void *const _impl; // private implementation
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace ZeroTier
|
|
|
|
|
2013-08-26 21:22:20 +00:00
|
|
|
#endif
|