mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2024-12-25 23:51:06 +00:00
Work in progress on RPC.
This commit is contained in:
parent
668c428051
commit
083ae2d097
@ -49,7 +49,15 @@ namespace ZeroTier {
|
||||
class NodeConfig;
|
||||
|
||||
/**
|
||||
* Local network endpoint
|
||||
* Local membership to a network
|
||||
*
|
||||
* Networks configure themselves via RPC by accessing the function
|
||||
* com.zerotier.one.Network.bootstrap at any supernode. This returns
|
||||
* a series of key/value pairs that includes the IP address
|
||||
* information for this node on the network and -- for closed
|
||||
* networks -- a URL to retreive the network's membership list.
|
||||
* A SHA-256 hash is also included to verify the return from this
|
||||
* URL query.
|
||||
*/
|
||||
class Network : NonCopyable
|
||||
{
|
||||
|
31
node/RPC.cpp
Normal file
31
node/RPC.cpp
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
*
|
||||
* 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/
|
||||
*/
|
||||
|
||||
#include "RuntimeEnvironment.hpp"
|
||||
#include "RPC.hpp"
|
||||
#include "Switch.hpp"
|
||||
#include "Topology.hpp"
|
183
node/RPC.hpp
Normal file
183
node/RPC.hpp
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
*
|
||||
* 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/
|
||||
*/
|
||||
|
||||
#ifndef _ZT_RPC_HPP
|
||||
#define _ZT_RPC_HPP
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
|
||||
#include "NonCopyable.hpp"
|
||||
#include "Mutex.hpp"
|
||||
#include "Address.hpp"
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
class RuntimeEnvironment;
|
||||
|
||||
/**
|
||||
* Peer or method not found
|
||||
*/
|
||||
#define ZT_RPC_ERROR_NOT_FOUND -1
|
||||
|
||||
/**
|
||||
* A runtime error occurred
|
||||
*/
|
||||
#define ZT_RPC_ERROR_RUNTIME -2
|
||||
|
||||
/**
|
||||
* Call was expired without response from target
|
||||
*/
|
||||
#define ZT_RPC_ERROR_EXPIRED_NO_RESPONSE -3
|
||||
|
||||
/**
|
||||
* Call was cancelled (or RPC is shutting down)
|
||||
*/
|
||||
#define ZT_RPC_ERROR_CANCELLED -4
|
||||
|
||||
/**
|
||||
* RPC request and result handler
|
||||
*/
|
||||
class RPC : NonCopyable
|
||||
{
|
||||
public:
|
||||
#ifndef _WIN32
|
||||
/**
|
||||
* A local service accessible by RPC, non-Windows only for now
|
||||
*
|
||||
* Each service DLL must export these functions:
|
||||
*
|
||||
* void ZeroTierPluginInit();
|
||||
* int ZeroTierPluginDo(unsigned int,const unsigned int *,const void **,const unsigned int **,const void ***);
|
||||
* void ZeroTierPluginFree(int,const unsigned int *,const void **);
|
||||
* void ZeroTierPluginDestroy();
|
||||
*
|
||||
* Init is called on library load, Destroy on unload. Do() may
|
||||
* be called from multiple threads concurrently, so any locking
|
||||
* is the responsibility of the library. These must have C
|
||||
* function signatures (extern "C" in C++).
|
||||
*
|
||||
* Do's arguments are: the number of paramters, the size of each parameter in bytes,
|
||||
* and each parameter's contents. The last two arguments are result parameters. The
|
||||
* first result parameter must be set to an array of integers describing the size of
|
||||
* each result. The second is set to an array of pointers to actual results. The number
|
||||
* of results (size of both arrays) is returned. If Do() returns zero or negative,
|
||||
* these result paremeters are not used by the caller and don't need to be set.
|
||||
*
|
||||
* After the caller is done with Do()'s results, it calls ZeroTierPluginFree() to
|
||||
* free them. This may also be called concurrently. Free() takes the number of
|
||||
* results, the array of result sizes, and the result array.
|
||||
*/
|
||||
class LocalService : NonCopyable
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @param dllPath Path to DLL/shared object
|
||||
* @throws std::invalid_argument Unable to properly load or resolve symbol(s) in DLL
|
||||
*/
|
||||
LocalService(const char *dllPath)
|
||||
throw(std::invalid_argument);
|
||||
|
||||
~LocalService();
|
||||
|
||||
/**
|
||||
* Call the DLL, return result
|
||||
*
|
||||
* @param args Input arguments
|
||||
* @return Results from DLL
|
||||
* @throws std::runtime_error Error calling DLL
|
||||
*/
|
||||
std::vector<std::string> operator()(const std::vector<std::string> &args)
|
||||
throw(std::runtime_error);
|
||||
|
||||
private:
|
||||
void *_dlhandle;
|
||||
};
|
||||
#endif
|
||||
|
||||
RPC(const RuntimeEnvironment *renv);
|
||||
~RPC();
|
||||
|
||||
/**
|
||||
* Used by PacketDecoder to call local RPC methods
|
||||
*
|
||||
* @param name Name of locally loaded method to call
|
||||
* @param args Arguments to method
|
||||
* @return Return value of method, and results (negative first item and empty vector means error)
|
||||
*/
|
||||
std::pair< int,std::vector<std::string> > callLocal(const std::string &name,const std::vector<std::string> &args)
|
||||
throw();
|
||||
|
||||
/**
|
||||
* Call a remote service
|
||||
*
|
||||
* @param peer Peer to call on
|
||||
* @param name Name of remote function
|
||||
* @param args Arguments to remote function
|
||||
* @param handler Handler to call on result
|
||||
* @param arg First argument to handler
|
||||
* @return Call ID (packet ID of sent packet)
|
||||
*/
|
||||
uint64_t callRemote(
|
||||
const Address &peer,
|
||||
const std::string &name,
|
||||
const std::vector<std::string> &args,
|
||||
void (*handler)(void *,uint64_t,const Address &,int,const std::vector<std::string> &),
|
||||
void *arg)
|
||||
throw(std::invalid_argument);
|
||||
|
||||
/**
|
||||
* Periodically called to clean up, such as by expiring remote calls
|
||||
*/
|
||||
void clean();
|
||||
|
||||
private:
|
||||
const RuntimeEnvironment *_r;
|
||||
|
||||
std::map<std::string,LocalService *> _rpcServices;
|
||||
Mutex _rpcServices_m;
|
||||
|
||||
struct RemoteCallOutstanding
|
||||
{
|
||||
uint64_t callTime;
|
||||
Address peer;
|
||||
std::string name;
|
||||
std::vector<std::string> &args;
|
||||
void (*handler)(void *,uint64_t,const Address &,int,const std::vector<std::string> &);
|
||||
void *arg;
|
||||
};
|
||||
std::map<uint64_t,RemoteCallOutstanding> _remoteCallsOutstanding;
|
||||
Mutex _remoteCallsOutstanding_m;
|
||||
};
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user