added 6PLANE address address/ID getters for zts_* API
This commit is contained in:
63
src/sdk.h
63
src/sdk.h
@@ -28,6 +28,17 @@
|
|||||||
#ifndef _ZT_SDK_H
|
#ifndef _ZT_SDK_H
|
||||||
#define _ZT_SDK_H 1
|
#define _ZT_SDK_H 1
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// ---------------------------- Compilation flag checks -------------------------
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define INTERCEPT_ENABLED 111
|
||||||
|
#define INTERCEPT_DISABLED 222
|
||||||
|
#define MAX_DIR_SZ 256 // Max path length used for home dir
|
||||||
|
|
||||||
#if defined(SDK_SERVICE)
|
#if defined(SDK_SERVICE)
|
||||||
// Sanity checks for compilation
|
// Sanity checks for compilation
|
||||||
#if !defined(SDK_LWIP) && !defined(SDK_PICOTCP)
|
#if !defined(SDK_LWIP) && !defined(SDK_PICOTCP)
|
||||||
@@ -44,22 +55,20 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/socket.h>
|
// ------------------------------------------------------------------------------
|
||||||
#include <stdbool.h>
|
// -------------- Socket API function signatures for convenience ----------------
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
#define SETSOCKOPT_SIG int fd, int level, int optname, const void *optval, socklen_t optlen
|
#define SETSOCKOPT_SIG int fd, int level, int optname, const void *optval, socklen_t optlen
|
||||||
#define GETSOCKOPT_SIG int fd, int level, int optname, void *optval, socklen_t *optlen
|
#define GETSOCKOPT_SIG int fd, int level, int optname, void *optval, socklen_t *optlen
|
||||||
|
|
||||||
#define SENDMSG_SIG int fd, const struct msghdr *msg, int flags
|
#define SENDMSG_SIG int fd, const struct msghdr *msg, int flags
|
||||||
#define SENDTO_SIG int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t addrlen
|
#define SENDTO_SIG int fd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t addrlen
|
||||||
#define RECV_SIG int fd, void *buf, size_t len, int flags
|
#define RECV_SIG int fd, void *buf, size_t len, int flags
|
||||||
#define RECVFROM_SIG int fd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t *addrlen
|
#define RECVFROM_SIG int fd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t *addrlen
|
||||||
#define RECVMSG_SIG int fd, struct msghdr *msg,int flags
|
#define RECVMSG_SIG int fd, struct msghdr *msg,int flags
|
||||||
|
|
||||||
#define SEND_SIG int fd, const void *buf, size_t len, int flags
|
#define SEND_SIG int fd, const void *buf, size_t len, int flags
|
||||||
#define WRITE_SIG int fd, const void *buf, size_t len
|
#define WRITE_SIG int fd, const void *buf, size_t len
|
||||||
#define READ_SIG int fd, void *buf, size_t len
|
#define READ_SIG int fd, void *buf, size_t len
|
||||||
|
|
||||||
#define SOCKET_SIG int socket_family, int socket_type, int protocol
|
#define SOCKET_SIG int socket_family, int socket_type, int protocol
|
||||||
#define CONNECT_SIG int fd, const struct sockaddr *addr, socklen_t addrlen
|
#define CONNECT_SIG int fd, const struct sockaddr *addr, socklen_t addrlen
|
||||||
#define BIND_SIG int fd, const struct sockaddr *addr, socklen_t addrlen
|
#define BIND_SIG int fd, const struct sockaddr *addr, socklen_t addrlen
|
||||||
@@ -80,15 +89,15 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define INTERCEPT_ENABLED 111
|
|
||||||
#define INTERCEPT_DISABLED 222
|
|
||||||
#define MAX_DIR_SZ 256 // Max path length used for home dir
|
|
||||||
|
|
||||||
extern void load_symbols();
|
extern void load_symbols();
|
||||||
extern void zts_init_rpc(const char *path, const char *nwid);
|
extern void zts_init_rpc(const char *path, const char *nwid);
|
||||||
extern char *api_netpath;
|
extern char *api_netpath;
|
||||||
extern char *debug_logfile;
|
extern char *debug_logfile;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// ------------------------- Ancient INTERCEPT-related cruft --------------------
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Function pointers to original system calls
|
// Function pointers to original system calls
|
||||||
// - These are used when we detect that either the intercept is not
|
// - These are used when we detect that either the intercept is not
|
||||||
// available or that ZeroTier hasn't administered the given socket
|
// available or that ZeroTier hasn't administered the given socket
|
||||||
@@ -116,19 +125,15 @@ extern char *debug_logfile;
|
|||||||
extern int (*realclose)(CLOSE_SIG);
|
extern int (*realclose)(CLOSE_SIG);
|
||||||
extern int (*realgetsockname)(GETSOCKNAME_SIG);
|
extern int (*realgetsockname)(GETSOCKNAME_SIG);
|
||||||
|
|
||||||
// Direct call
|
// ------------------------------------------------------------------------------
|
||||||
// - Skips intercept
|
// ---------------------------- Direct API call section -------------------------
|
||||||
// - Uses RPC
|
// ------------------------------------------------------------------------------
|
||||||
// - Depending on the target, the API will be exposed as zt_* in
|
|
||||||
// the specific way needed for that platform, but will be implemented
|
|
||||||
// in terms of zts_*
|
|
||||||
|
|
||||||
// SOCKS5 Proxy Controls
|
// SOCKS5 Proxy Controls
|
||||||
int zts_start_proxy_server(const char *homepath, const char * nwid, struct sockaddr_storage * addr);
|
int zts_start_proxy_server(const char *homepath, const char * nwid, struct sockaddr_storage * addr);
|
||||||
int zts_stop_proxy_server(const char *nwid);
|
int zts_stop_proxy_server(const char *nwid);
|
||||||
int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage *addr);
|
int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage *addr);
|
||||||
bool zts_proxy_is_running(const char *nwid);
|
bool zts_proxy_is_running(const char *nwid);
|
||||||
|
|
||||||
// ZT Service Controls
|
// ZT Service Controls
|
||||||
void zts_start_service(const char *path);
|
void zts_start_service(const char *path);
|
||||||
void *zts_start_core_service(void *thread_id);
|
void *zts_start_core_service(void *thread_id);
|
||||||
@@ -137,22 +142,17 @@ void zts_stop();
|
|||||||
bool zts_service_is_running();
|
bool zts_service_is_running();
|
||||||
void zts_join_network(const char * nwid);
|
void zts_join_network(const char * nwid);
|
||||||
void zts_join_network_soft(const char * filepath, const char * nwid);
|
void zts_join_network_soft(const char * filepath, const char * nwid);
|
||||||
|
void zts_leave_network_soft(const char * filepath, const char * nwid);
|
||||||
void zts_leave_network(const char * nwid);
|
void zts_leave_network(const char * nwid);
|
||||||
// void zts_get_addresses(const char * nwid, char * addrstr);
|
|
||||||
void zts_get_ipv4_address(const char *nwid, char *addrstr);
|
void zts_get_ipv4_address(const char *nwid, char *addrstr);
|
||||||
void zts_get_ipv6_address(const char *nwid, char *addrstr);
|
void zts_get_ipv6_address(const char *nwid, char *addrstr);
|
||||||
bool zts_has_address(const char *nwid);
|
bool zts_has_address(const char *nwid);
|
||||||
int zts_get_device_id();
|
int zts_get_device_id(char *devID);
|
||||||
bool zts_is_relayed();
|
int zts_get_device_id_from_file(const char *filepath, char *devID);
|
||||||
char *zts_get_homepath();
|
char *zts_get_homepath();
|
||||||
|
void zts_get_6plane_addr(char *addr, const char *nwid, const char *devID);
|
||||||
// ZT Intercept/RPC Controls
|
void zts_get_rfc4193_addr(char *addr, const char *nwid, const char *devID);
|
||||||
// TODO: Remove any?
|
// BSD-like socket API
|
||||||
//void set_intercept_status(int mode); // TODO: Rethink this
|
|
||||||
//void init_service(int key, const char * path);
|
|
||||||
//void init_service_and_rpc(int key, const char * path, const char * nwid);
|
|
||||||
//void init_intercept(int key);
|
|
||||||
|
|
||||||
int zts_socket(SOCKET_SIG);
|
int zts_socket(SOCKET_SIG);
|
||||||
int zts_connect(CONNECT_SIG);
|
int zts_connect(CONNECT_SIG);
|
||||||
int zts_bind(BIND_SIG);
|
int zts_bind(BIND_SIG);
|
||||||
@@ -167,12 +167,10 @@ int zts_getsockname(GETSOCKNAME_SIG);
|
|||||||
int zts_getpeername(GETPEERNAME_SIG);
|
int zts_getpeername(GETPEERNAME_SIG);
|
||||||
int zts_close(CLOSE_SIG);
|
int zts_close(CLOSE_SIG);
|
||||||
int zts_fcntl(FCNTL_SIG);
|
int zts_fcntl(FCNTL_SIG);
|
||||||
|
|
||||||
ssize_t zts_sendto(SENDTO_SIG);
|
ssize_t zts_sendto(SENDTO_SIG);
|
||||||
ssize_t zts_sendmsg(SENDMSG_SIG);
|
ssize_t zts_sendmsg(SENDMSG_SIG);
|
||||||
ssize_t zts_recvfrom(RECVFROM_SIG);
|
ssize_t zts_recvfrom(RECVFROM_SIG);
|
||||||
ssize_t zts_recvmsg(RECVMSG_SIG);
|
ssize_t zts_recvmsg(RECVMSG_SIG);
|
||||||
|
|
||||||
#if defined(__UNITY_3D__)
|
#if defined(__UNITY_3D__)
|
||||||
ssize_t zts_recv(int fd, void *buf, int len);
|
ssize_t zts_recv(int fd, void *buf, int len);
|
||||||
ssize_t zts_send(int fd, void *buf, int len);
|
ssize_t zts_send(int fd, void *buf, int len);
|
||||||
@@ -185,7 +183,10 @@ ssize_t zts_recvmsg(RECVMSG_SIG);
|
|||||||
void zt_leave_network(const char * nwid);
|
void zt_leave_network(const char * nwid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Android JNI Direct-call API
|
// ------------------------------------------------------------------------------
|
||||||
|
// --------------------- Direct API call section (for Android) ------------------
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
|
||||||
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
// ZT SERVICE CONTROLS
|
// ZT SERVICE CONTROLS
|
||||||
@@ -228,7 +229,7 @@ ssize_t zts_recvmsg(RECVMSG_SIG);
|
|||||||
|
|
||||||
|
|
||||||
// Prototypes for redefinition of syscalls
|
// Prototypes for redefinition of syscalls
|
||||||
// - Implemented in SDK_Intercept.c
|
// - Implemented in intercept.c
|
||||||
#if defined(SDK_INTERCEPT)
|
#if defined(SDK_INTERCEPT)
|
||||||
int socket(SOCKET_SIG);
|
int socket(SOCKET_SIG);
|
||||||
int connect(CONNECT_SIG);
|
int connect(CONNECT_SIG);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#include "OneService.hpp"
|
#include "OneService.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
#include "OSUtils.hpp"
|
#include "OSUtils.hpp"
|
||||||
|
#include "InetAddress.hpp"
|
||||||
|
|
||||||
#include "tap.hpp"
|
#include "tap.hpp"
|
||||||
#include "sdk.h"
|
#include "sdk.h"
|
||||||
@@ -152,20 +153,26 @@ void zts_join_network_soft(const char * filepath, const char * nwid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
// Prevent service from joining network upon startup
|
||||||
|
void zts_leave_network_soft(const char * filepath, const char * nwid) {
|
||||||
|
std::string net_dir = std::string(filepath) + "/networks.d/";
|
||||||
|
ZeroTier::OSUtils::rm((net_dir + nwid + ".conf").c_str());
|
||||||
|
}
|
||||||
|
// Instruct the service to leave the network
|
||||||
void zts_leave_network(const char * nwid) {
|
void zts_leave_network(const char * nwid) {
|
||||||
if(zt1Service)
|
if(zt1Service)
|
||||||
zt1Service->leave(nwid);
|
zt1Service->leave(nwid);
|
||||||
}
|
}
|
||||||
//
|
// Check whether the service is running
|
||||||
bool zts_service_is_running() {
|
bool zts_service_is_running() {
|
||||||
return !zt1Service ? false : zt1Service->isRunning();
|
return !zt1Service ? false : zt1Service->isRunning();
|
||||||
}
|
}
|
||||||
//
|
// Stop the service
|
||||||
void zts_stop_service() {
|
void zts_stop_service() {
|
||||||
if(zt1Service)
|
if(zt1Service)
|
||||||
zt1Service->terminate();
|
zt1Service->terminate();
|
||||||
}
|
}
|
||||||
|
// Stop the service, proxy server, stack, etc
|
||||||
void zts_stop() {
|
void zts_stop() {
|
||||||
DEBUG_INFO("Stopping STSDK");
|
DEBUG_INFO("Stopping STSDK");
|
||||||
zts_stop_service();
|
zts_stop_service();
|
||||||
@@ -177,7 +184,6 @@ void zts_stop() {
|
|||||||
// Now only returns first assigned address per network. Shouldn't normally be a problem.
|
// Now only returns first assigned address per network. Shouldn't normally be a problem.
|
||||||
|
|
||||||
// Get IPV4 Address for this device on given network
|
// Get IPV4 Address for this device on given network
|
||||||
|
|
||||||
bool zts_has_address(const char *nwid)
|
bool zts_has_address(const char *nwid)
|
||||||
{
|
{
|
||||||
char ipv4_addr[64], ipv6_addr[64];
|
char ipv4_addr[64], ipv6_addr[64];
|
||||||
@@ -190,8 +196,6 @@ bool zts_has_address(const char *nwid)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void zts_get_ipv4_address(const char *nwid, char *addrstr)
|
void zts_get_ipv4_address(const char *nwid, char *addrstr)
|
||||||
{
|
{
|
||||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||||
@@ -229,23 +233,46 @@ void zts_get_ipv6_address(const char *nwid, char *addrstr)
|
|||||||
memcpy(addrstr, "-1.-1.-1.-1/-1", 14);
|
memcpy(addrstr, "-1.-1.-1.-1/-1", 14);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Get device ID
|
// Get device ID (from running service)
|
||||||
int zts_get_device_id()
|
int zts_get_device_id(char *devID) {
|
||||||
{
|
if(zt1Service) {
|
||||||
// zt->node->status
|
char id[10];
|
||||||
/* TODO */ return 0;
|
sprintf(id, "%lx",zt1Service->getNode()->address());
|
||||||
|
memcpy(devID, id, 10);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
//
|
// Get device ID (from file)
|
||||||
bool zts_is_relayed() {
|
int zts_get_device_id_from_file(const char *filepath, char *devID) {
|
||||||
// TODO
|
std::string fname("identity.public");
|
||||||
// zt1Service->getNode()->peers()
|
std::string fpath(filepath);
|
||||||
return false;
|
|
||||||
|
if(ZeroTier::OSUtils::fileExists((fpath + ZT_PATH_SEPARATOR_S + fname).c_str(),false)) {
|
||||||
|
std::string oldid;
|
||||||
|
ZeroTier::OSUtils::readFile((fpath + ZT_PATH_SEPARATOR_S + fname).c_str(),oldid);
|
||||||
|
memcpy(devID, oldid.c_str(), 10); // first 10 bytes of file
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
// Return the home path for this instance of ZeroTier
|
// Return the home path for this instance of ZeroTier
|
||||||
char *zts_get_homepath() {
|
char *zts_get_homepath() {
|
||||||
return (char*)givenHomeDir.c_str();
|
return (char*)givenHomeDir.c_str();
|
||||||
}
|
}
|
||||||
|
// Returns a 6PLANE IPv6 address given a network ID and zerotier ID
|
||||||
|
void zts_get_6plane_addr(char *addr, const char *nwid, const char *devID)
|
||||||
|
{
|
||||||
|
ZeroTier::InetAddress _6planeAddr = ZeroTier::InetAddress::makeIpv66plane(ZeroTier::Utils::hexStrToU64(nwid),ZeroTier::Utils::hexStrToU64(devID));
|
||||||
|
memcpy(addr, _6planeAddr.toIpString().c_str(), 40);
|
||||||
|
}
|
||||||
|
// Returns a RFC 4193 IPv6 address given a network ID and zerotier ID
|
||||||
|
void zts_get_rfc4193_addr(char *addr, const char *nwid, const char *devID)
|
||||||
|
{
|
||||||
|
ZeroTier::InetAddress _6planeAddr = ZeroTier::InetAddress::makeIpv6rfc4193(ZeroTier::Utils::hexStrToU64(nwid),ZeroTier::Utils::hexStrToU64(devID));
|
||||||
|
memcpy(addr, _6planeAddr.toIpString().c_str(), 40);
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
// ----------------------------- .NET Interop functions -------------------------
|
// ----------------------------- .NET Interop functions -------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user