zts_stop(), join_network_soft()

This commit is contained in:
Joseph Henry
2017-03-14 11:57:47 -07:00
parent 361db2ef1f
commit 4d54827cbb
5 changed files with 37 additions and 17 deletions

View File

@@ -30,7 +30,7 @@
#ifndef _SDK_DEBUG_H_ #ifndef _SDK_DEBUG_H_
#define _SDK_DEBUG_H_ #define _SDK_DEBUG_H_
#define DEBUG_LEVEL 4 // Set this to adjust what you'd like to see in the debug traces #define DEBUG_LEVEL 5 // Set this to adjust what you'd like to see in the debug traces
#define MSG_ERROR 1 // Errors #define MSG_ERROR 1 // Errors
#define MSG_TRANSFER 2 // RX/TX specific statements #define MSG_TRANSFER 2 // RX/TX specific statements
@@ -136,7 +136,7 @@ extern "C" {
#if defined(__ANDROID__) #if defined(__ANDROID__)
#define DEBUG_FLOW(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_FLOW : %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)) #define DEBUG_FLOW(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "ZT_FLOW : %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args))
#else #else
#define DEBUG_FLOW(fmt, args...) fprintf(stderr, "ZT_FLOW: %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args) #define DEBUG_FLOW(fmt, args...) fprintf(stderr, "ZT_FLOW : %14s:%4d:%25s: " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)
#endif #endif
#else #else
#define DEBUG_FLOW(fmt, args...) #define DEBUG_FLOW(fmt, args...)

View File

@@ -27,6 +27,8 @@
#define SDK_MTU ZT_MAX_MTU // 2800, usually #define SDK_MTU ZT_MAX_MTU // 2800, usually
#define UNIX_SOCK_BUF_SIZE 1024*1024
// --- lwIP // --- lwIP
#define APPLICATION_POLL_FREQ 2 #define APPLICATION_POLL_FREQ 2
#define ZT_LWIP_TCP_TIMER_INTERVAL 50 #define ZT_LWIP_TCP_TIMER_INTERVAL 50
@@ -51,4 +53,4 @@
// UDP Buffer sizes (should be about the size of your MTU) // UDP Buffer sizes (should be about the size of your MTU)
#define DEFAULT_UDP_TX_BUF_SZ ZT_MAX_MTU #define DEFAULT_UDP_TX_BUF_SZ ZT_MAX_MTU
#define DEFAULT_UDP_RX_BUF_SZ ZT_MAX_MTU * 128 #define DEFAULT_UDP_RX_BUF_SZ ZT_MAX_MTU * 10

View File

@@ -133,8 +133,10 @@ bool zts_proxy_is_running(const char *nwid);
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);
void zts_stop_service(); void zts_stop_service();
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_leave_network(const char * nwid); void zts_leave_network(const char * nwid);
// void zts_get_addresses(const char * nwid, char * addrstr); // 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);

View File

@@ -60,8 +60,7 @@ std::string service_path;
std::string localHomeDir; // Local shortened path std::string localHomeDir; // Local shortened path
std::string givenHomeDir; // What the user/application provides as a suggestion std::string givenHomeDir; // What the user/application provides as a suggestion
std::string homeDir; // The resultant platform-specific dir we *must* use internally std::string homeDir; // The resultant platform-specific dir we *must* use internally
std::string netDir; std::string netDir; // Where network .conf files are to be written
std::string rpcNWID;
pthread_t intercept_thread; pthread_t intercept_thread;
pthread_key_t thr_id_key; pthread_key_t thr_id_key;
@@ -123,7 +122,7 @@ int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage * ad
// Basic ZT service controls // Basic ZT service controls
// Will also spin up a SOCKS5 proxy server if USE_SOCKS_PROXY is set // Will also spin up a SOCKS5 proxy server if USE_SOCKS_PROXY is set
void zts_join_network(const char * nwid) { void zts_join_network(const char * nwid) {
DEBUG_INFO(); DEBUG_ERROR();
std::string confFile = zt1Service->givenHomePath() + "/networks.d/" + nwid + ".conf"; std::string confFile = zt1Service->givenHomePath() + "/networks.d/" + nwid + ".conf";
if(!ZeroTier::OSUtils::mkdir(netDir)) { if(!ZeroTier::OSUtils::mkdir(netDir)) {
DEBUG_ERROR("unable to create: %s", netDir.c_str()); DEBUG_ERROR("unable to create: %s", netDir.c_str());
@@ -140,6 +139,17 @@ void zts_join_network(const char * nwid) {
zts_start_proxy_server(homeDir.c_str(), nwid, NULL); // NULL addr for default zts_start_proxy_server(homeDir.c_str(), nwid, NULL); // NULL addr for default
#endif #endif
} }
// Just create the dir and conf file required, don't instruct the core to do anything
void zts_join_network_soft(const char * filepath, const char * nwid) {
std::string net_dir = std::string(filepath) + "/networks.d/";
std::string confFile = net_dir + std::string(nwid) + ".conf";
if(!ZeroTier::OSUtils::mkdir(net_dir)) {
DEBUG_ERROR("unable to create: %s", net_dir.c_str());
}
if(!ZeroTier::OSUtils::writeFile(confFile.c_str(), "")) {
DEBUG_ERROR("unable to write network conf file: %s", confFile.c_str());
}
}
// //
void zts_leave_network(const char * nwid) { void zts_leave_network(const char * nwid) {
if(zt1Service) if(zt1Service)
@@ -154,6 +164,12 @@ void zts_stop_service() {
if(zt1Service) if(zt1Service)
zt1Service->terminate(); zt1Service->terminate();
} }
void zts_stop() {
DEBUG_INFO("Stopping STSDK");
zts_stop_service();
/* TODO: kill each proxy server as well
zts_stop_proxy_server(...); */
}
// FIXME: Re-implemented to make it play nicer with the C-linkage required for Xcode integrations // FIXME: Re-implemented to make it play nicer with the C-linkage required for Xcode integrations
// 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.

View File

@@ -63,7 +63,7 @@ namespace ZeroTier {
int NetconEthernetTap::sendReturnValue(int fd, int retval, int _errno) int NetconEthernetTap::sendReturnValue(int fd, int retval, int _errno)
{ {
//#if !defined(USE_SOCKS_PROXY) //#if !defined(USE_SOCKS_PROXY)
DEBUG_EXTRA("fd=%d, retval=%d, errno=%d", fd, retval, _errno); //DEBUG_EXTRA("fd=%d, retval=%d, errno=%d", fd, retval, _errno);
int sz = sizeof(char) + sizeof(retval) + sizeof(errno); int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
char retmsg[sz]; char retmsg[sz];
memset(&retmsg, 0, sizeof(retmsg)); memset(&retmsg, 0, sizeof(retmsg));
@@ -328,7 +328,7 @@ void NetconEthernetTap::closeConnection(PhySocket *sock)
} }
void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr) { void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr) {
DEBUG_EXTRA("physock=%p", sock); //DEBUG_EXTRA("physock=%p", sock);
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
//closeConnection(sock); //closeConnection(sock);
} }
@@ -359,7 +359,7 @@ void NetconEthernetTap::phyOnUnixWritable(PhySocket *sock,void **uptr,bool lwip_
void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len) void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len)
{ {
DEBUG_EXTRA("physock=%p, len=%d", sock, (int)len); //DEBUG_EXTRA("physock=%p, len=%d", sock, (int)len);
uint64_t CANARY_num; uint64_t CANARY_num;
pid_t pid, tid; pid_t pid, tid;
ssize_t wlen = len; ssize_t wlen = len;
@@ -384,7 +384,7 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
// DEBUG_EXTRA(" RPC: physock=%p, (pid=%d, tid=%d, timestamp=%s, cmd=%d)", sock, pid, tid, timestamp, cmd); // DEBUG_EXTRA(" RPC: physock=%p, (pid=%d, tid=%d, timestamp=%s, cmd=%d)", sock, pid, tid, timestamp, cmd);
if(cmd == RPC_SOCKET) { if(cmd == RPC_SOCKET) {
DEBUG_INFO("RPC_SOCKET, physock=%p", sock); //DEBUG_INFO("RPC_SOCKET, physock=%p", sock);
// Create new lwip socket and associate it with this sock // Create new lwip socket and associate it with this sock
struct socket_st socket_rpc; struct socket_st socket_rpc;
memcpy(&socket_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct socket_st)); memcpy(&socket_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct socket_st));
@@ -478,31 +478,31 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
// DEBUG_EXTRA(" RPC: physock=%p, (pid=%d, tid=%d, timestamp=%s, cmd=%d)", sock, pid, tid, timestamp, cmd); // DEBUG_EXTRA(" RPC: physock=%p, (pid=%d, tid=%d, timestamp=%s, cmd=%d)", sock, pid, tid, timestamp, cmd);
switch(cmd) { switch(cmd) {
case RPC_BIND: case RPC_BIND:
DEBUG_INFO("RPC_BIND, physock=%p", sock); //DEBUG_INFO("RPC_BIND, physock=%p", sock);
struct bind_st bind_rpc; struct bind_st bind_rpc;
memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st)); memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st));
handleBind(sock, rpcSock, uptr, &bind_rpc); handleBind(sock, rpcSock, uptr, &bind_rpc);
break; break;
case RPC_LISTEN: case RPC_LISTEN:
DEBUG_INFO("RPC_LISTEN, physock=%p", sock); //DEBUG_INFO("RPC_LISTEN, physock=%p", sock);
struct listen_st listen_rpc; struct listen_st listen_rpc;
memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st)); memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st));
handleListen(sock, rpcSock, uptr, &listen_rpc); handleListen(sock, rpcSock, uptr, &listen_rpc);
break; break;
case RPC_GETSOCKNAME: case RPC_GETSOCKNAME:
DEBUG_INFO("RPC_GETSOCKNAME, physock=%p", sock); //DEBUG_INFO("RPC_GETSOCKNAME, physock=%p", sock);
struct getsockname_st getsockname_rpc; struct getsockname_st getsockname_rpc;
memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st)); memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc); handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc);
break; break;
case RPC_GETPEERNAME: case RPC_GETPEERNAME:
DEBUG_INFO("RPC_GETPEERNAME, physock=%p", sock); //DEBUG_INFO("RPC_GETPEERNAME, physock=%p", sock);
struct getsockname_st getpeername_rpc; struct getsockname_st getpeername_rpc;
memcpy(&getpeername_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st)); memcpy(&getpeername_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
handleGetpeername(sock, rpcSock, uptr, &getpeername_rpc); handleGetpeername(sock, rpcSock, uptr, &getpeername_rpc);
break; break;
case RPC_CONNECT: case RPC_CONNECT:
DEBUG_INFO("RPC_CONNECT, physock=%p", sock); //DEBUG_INFO("RPC_CONNECT, physock=%p", sock);
struct connect_st connect_rpc; struct connect_st connect_rpc;
memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st)); memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st));
handleConnect(sock, rpcSock, conn, &connect_rpc); handleConnect(sock, rpcSock, conn, &connect_rpc);
@@ -574,7 +574,7 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
// Connect a stack's PCB/socket/Connection object to a remote host // Connect a stack's PCB/socket/Connection object to a remote host
void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Connection *conn, struct connect_st* connect_rpc) void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Connection *conn, struct connect_st* connect_rpc)
{ {
DEBUG_ATTN("physock=%p", sock); //DEBUG_ATTN("physock=%p", sock);
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
#if defined(SDK_PICOTCP) #if defined(SDK_PICOTCP)
pico_handleConnect(sock, rpcSock, conn, connect_rpc); pico_handleConnect(sock, rpcSock, conn, connect_rpc);