upgrade to lwip 2.0.0, beginning support for IPV6
This commit is contained in:
17
src/SDK.h
17
src/SDK.h
@@ -90,7 +90,7 @@ extern char *debug_logfile;
|
||||
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_get_proxy_server_address(const char * nwid, struct sockaddr_storage *addr);
|
||||
bool zts_proxy_is_running();
|
||||
bool zts_proxy_is_running(const char *nwid);
|
||||
|
||||
// ZT Service Controls
|
||||
void zts_start_service(const char *path);
|
||||
@@ -99,17 +99,19 @@ void zts_stop_service();
|
||||
bool zts_service_is_running();
|
||||
void zts_join_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_ipv6_address(const char *nwid, char *addrstr);
|
||||
int zts_get_device_id();
|
||||
bool zts_is_relayed();
|
||||
char *zts_get_homepath();
|
||||
|
||||
// ZT Intercept/RPC Controls
|
||||
// TODO: Remove any?
|
||||
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);
|
||||
//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_connect(CONNECT_SIG);
|
||||
@@ -153,7 +155,8 @@ ssize_t zts_recvmsg(RECVMSG_SIG);
|
||||
JNIEXPORT jstring JNICALL Java_ZeroTier_ZTSDK_zt_1get_1homepath(JNIEnv *env, jobject thisObj);
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_ZTSDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_ZTSDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1ipv4_1address(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1ipv6_1address(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1is_1relayed();
|
||||
|
||||
// SOCKS5 PROXY SERVER CONTROLS
|
||||
|
||||
@@ -21,7 +21,6 @@ void zt_start_service_and_rpc(const char * path, const char * nwid);
|
||||
bool zt_service_is_running();
|
||||
void zt_join_network(const char *nwid);
|
||||
void zt_leave_network(const char *nwid);
|
||||
void zt_is_running(const char *nwid);
|
||||
void zt_get_ipv4_address(const char *nwid, char *addrstr);
|
||||
void zt_get_ipv6_address(const char *nwid, char *addrstr);
|
||||
|
||||
@@ -29,6 +28,7 @@ void zt_get_ipv6_address(const char *nwid, char *addrstr);
|
||||
// SOCKS5 PROXY CONTROLS
|
||||
void zt_start_proxy_server(const char *nwid, struct sockaddr_storage addr);
|
||||
void zt_stop_proxy_server(const char *nwid);
|
||||
void zt_proxy_is_running(const char *nwid);
|
||||
void zt_get_proxy_server_address(const char *nwid, struct sockaddr_storage addr);
|
||||
|
||||
// SOCKET API
|
||||
|
||||
@@ -44,12 +44,13 @@
|
||||
|
||||
#include "SDK_LWIPStack.hpp"
|
||||
|
||||
#include "lwip/tcp_impl.h"
|
||||
//#include "lwip/tcp_impl.h"
|
||||
#include "lwip/priv/tcp_priv.h"
|
||||
#include "netif/etharp.h"
|
||||
#include "lwip/api.h"
|
||||
#include "lwip/ip.h"
|
||||
#include "lwip/ip_addr.h"
|
||||
#include "lwip/ip_frag.h"
|
||||
//#include "lwip/ip_frag.h"
|
||||
#include "lwip/tcp.h"
|
||||
#include "lwip/init.h"
|
||||
#include "lwip/mem.h"
|
||||
@@ -57,6 +58,8 @@
|
||||
#include "lwip/ip_addr.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/udp.h"
|
||||
#include "lwip/tcp.h"
|
||||
|
||||
|
||||
#include "SDK.h"
|
||||
#include "SDK_Debug.h"
|
||||
@@ -176,7 +179,10 @@ bool NetconEthernetTap::addIp(const InetAddress &ip)
|
||||
_ips.push_back(ip);
|
||||
std::sort(_ips.begin(),_ips.end());
|
||||
|
||||
DEBUG_INFO("ETHARP_HWADDR_LEN = %d", ETHARP_HWADDR_LEN);
|
||||
|
||||
if (ip.isV4()) {
|
||||
DEBUG_INFO("IPV4");
|
||||
// Set IP
|
||||
static ip_addr_t ipaddr, netmask, gw;
|
||||
IP4_ADDR(&gw,127,0,0,1);
|
||||
@@ -187,16 +193,43 @@ bool NetconEthernetTap::addIp(const InetAddress &ip)
|
||||
lwipstack->__netif_add(&interface,&ipaddr, &netmask, &gw, NULL, tapif_init, lwipstack->_ethernet_input);
|
||||
interface.state = this;
|
||||
interface.output = lwipstack->_etharp_output;
|
||||
_mac.copyTo(interface.hwaddr, 6);
|
||||
_mac.copyTo(interface.hwaddr, ETHARP_HWADDR_LEN);
|
||||
interface.mtu = _mtu;
|
||||
interface.name[0] = 't';
|
||||
interface.name[1] = 'p';
|
||||
interface.linkoutput = low_level_output;
|
||||
interface.hwaddr_len = 6;
|
||||
interface.hwaddr_len = ETHARP_HWADDR_LEN;
|
||||
interface.flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
|
||||
lwipstack->__netif_set_default(&interface);
|
||||
lwipstack->__netif_set_up(&interface);
|
||||
}
|
||||
|
||||
if(ip.isV6())
|
||||
{
|
||||
DEBUG_INFO("IPV6");
|
||||
/*
|
||||
// Set IP
|
||||
static ip_addr_t ipaddr, netmask, gw;
|
||||
IP6_ADDR(&gw,127,0,0,1);
|
||||
ipaddr.addr = *((u32_t *)ip.rawIpData());
|
||||
netmask.addr = *((u32_t *)ip.netmask().rawIpData());
|
||||
|
||||
// Set up the lwip-netif for LWIP's sake
|
||||
lwipstack->__netif_add(&interface,&ipaddr, &netmask, &gw, NULL, tapif_init, lwipstack->_ethernet_input);
|
||||
interface.state = this;
|
||||
interface.output = lwipstack->_etharp_output;
|
||||
_mac.copyTo(interface.hwaddr, ETHARP_HWADDR_LEN);
|
||||
interface.mtu = _mtu;
|
||||
interface.name[0] = 't';
|
||||
interface.name[1] = 'p';
|
||||
interface.linkoutput = low_level_output;
|
||||
interface.hwaddr_len = ETHARP_HWADDR_LEN;
|
||||
interface.flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
|
||||
lwipstack->__netif_set_default(&interface);
|
||||
lwipstack->__netif_set_up(&interface);
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -739,17 +772,24 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newPCB, err_t err)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct pbuf * p, struct ip_addr * addr, u16_t port)
|
||||
void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct pbuf * p, ip_addr_t * addr, u16_t port)
|
||||
{
|
||||
Larg *l = (Larg*)arg;
|
||||
//DEBUG_EXTRA("nc_udp_recved(conn=%p,pcb=%p,port=%d)\n", (void*)&(l->conn), (void*)&upcb, port);
|
||||
int tot = 0;
|
||||
unsigned char *addr_pos, *sz_pos, *payload_pos;
|
||||
struct pbuf* q = p;
|
||||
struct sockaddr_storage sockaddr_big;
|
||||
|
||||
#if defined(LWIP_IPV6)
|
||||
struct sockaddr_in addr_in;
|
||||
addr_in.sin_addr.s_addr = addr->addr;
|
||||
addr_in.sin_port = port;
|
||||
#else // ipv4
|
||||
struct sockaddr_in *addr_in = (struct sockaddr_in *)&sockaddr_big;
|
||||
addr_in->sin_addr.s_addr = addr->addr;
|
||||
addr_in->sin_port = port;
|
||||
#endif
|
||||
|
||||
Mutex::Lock _l2(l->tap->_rx_buf_m);
|
||||
// Cycle through pbufs and write them to the RX buffer
|
||||
|
||||
@@ -229,7 +229,7 @@ namespace ZeroTier {
|
||||
*/
|
||||
static err_t nc_recved(void *arg, struct tcp_pcb *PCB, struct pbuf *p, err_t err);
|
||||
static err_t nc_recved_proxy(void *arg, struct tcp_pcb *PCB, struct pbuf *p, err_t err);
|
||||
static void nc_udp_recved(void * arg, struct udp_pcb * upcb, struct pbuf * p, struct ip_addr * addr, u16_t port);
|
||||
static void nc_udp_recved(void * arg, struct udp_pcb * upcb, struct pbuf * p, ip_addr_t * addr, u16_t port);
|
||||
|
||||
|
||||
/*
|
||||
@@ -475,12 +475,14 @@ namespace ZeroTier {
|
||||
ip_addr_t convert_ip(struct sockaddr_in * addr)
|
||||
{
|
||||
ip_addr_t conn_addr;
|
||||
/*
|
||||
struct sockaddr_in *ipv4 = addr;
|
||||
short a = ip4_addr1(&(ipv4->sin_addr));
|
||||
short b = ip4_addr2(&(ipv4->sin_addr));
|
||||
short c = ip4_addr3(&(ipv4->sin_addr));
|
||||
short d = ip4_addr4(&(ipv4->sin_addr));
|
||||
IP4_ADDR(&conn_addr, a,b,c,d);
|
||||
*/
|
||||
return conn_addr;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include "lwip/ip_addr.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/init.h"
|
||||
#include "lwip/tcp_impl.h"
|
||||
//#include "lwip/tcp_impl.h"
|
||||
#include "lwip/udp.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -43,7 +43,7 @@
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
typedef ip_addr ip_addr_t;
|
||||
//typedef ip_addr ip_addr_t;
|
||||
struct tcp_pcb;
|
||||
|
||||
// lwip General Stack API
|
||||
@@ -52,7 +52,7 @@ struct tcp_pcb;
|
||||
#define LWIP_HTONS_SIG u16_t x
|
||||
#define LWIP_NTOHS_SIG u16_t x
|
||||
#define IPADDR_NTOA_SIG const ip_addr_t *addr
|
||||
#define ETHARP_OUTPUT_SIG struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr
|
||||
#define ETHARP_OUTPUT_SIG struct netif *netif, struct pbuf *q, const ip_addr_t *ipaddr
|
||||
#define ETHERNET_INPUT_SIG struct pbuf *p, struct netif *netif
|
||||
#define IP_INPUT_SIG struct pbuf *p, struct netif *inp
|
||||
#define NETIF_SET_DEFAULT_SIG struct netif *netif
|
||||
@@ -62,12 +62,12 @@ struct tcp_pcb;
|
||||
|
||||
// lwIP UDP API
|
||||
#define UDP_NEW_SIG void
|
||||
#define UDP_CONNECT_SIG struct udp_pcb * pcb, struct ip_addr * ipaddr, u16_t port
|
||||
#define UDP_CONNECT_SIG struct udp_pcb * pcb, ip_addr_t * ipaddr, u16_t port
|
||||
#define UDP_SEND_SIG struct udp_pcb * pcb, struct pbuf * p
|
||||
#define UDP_SENDTO_SIG struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, u16_t dst_port
|
||||
#define UDP_RECV_SIG struct udp_pcb * pcb, void (* recv)(void * arg, struct udp_pcb * upcb, struct pbuf * p, struct ip_addr * addr, u16_t port), void * recv_arg
|
||||
#define UDP_RECV_SIG struct udp_pcb * pcb, void (* recv)(void * arg, struct udp_pcb * upcb, struct pbuf * p, ip_addr_t * addr, u16_t port), void * recv_arg
|
||||
#define UDP_RECVED_SIG struct udp_pcb * pcb, u16_t len
|
||||
#define UDP_BIND_SIG struct udp_pcb * pcb, struct ip_addr * ipaddr, u16_t port
|
||||
#define UDP_BIND_SIG struct udp_pcb * pcb, const ip_addr_t * ipaddr, u16_t port
|
||||
#define UDP_REMOVE_SIG struct udp_pcb *pcb
|
||||
|
||||
// lwIP TCP API
|
||||
@@ -77,7 +77,7 @@ struct tcp_pcb;
|
||||
#define TCP_RECV_SIG struct tcp_pcb * pcb, err_t (* recv)(void * arg, struct tcp_pcb * tpcb, struct pbuf * p, err_t err)
|
||||
#define TCP_RECVED_SIG struct tcp_pcb * pcb, u16_t len
|
||||
#define TCP_SNDBUF_SIG struct tcp_pcb * pcb
|
||||
#define TCP_CONNECT_SIG struct tcp_pcb * pcb, struct ip_addr * ipaddr, u16_t port, err_t (* connected)(void * arg, struct tcp_pcb * tpcb, err_t err)
|
||||
#define TCP_CONNECT_SIG struct tcp_pcb * pcb, ip_addr_t * ipaddr, u16_t port, err_t (* connected)(void * arg, struct tcp_pcb * tpcb, err_t err)
|
||||
#define TCP_RECV_SIG struct tcp_pcb * pcb, err_t (* recv)(void * arg, struct tcp_pcb * tpcb, struct pbuf * p, err_t err)
|
||||
#define TCP_ERR_SIG struct tcp_pcb * pcb, void (* err)(void * arg, err_t err)
|
||||
#define TCP_POLL_SIG struct tcp_pcb * pcb, err_t (* poll)(void * arg, struct tcp_pcb * tpcb), u8_t interval
|
||||
@@ -88,7 +88,7 @@ struct tcp_pcb;
|
||||
#define TCP_ACCEPT_SIG struct tcp_pcb * pcb, err_t (* accept)(void * arg, struct tcp_pcb * newpcb, err_t err)
|
||||
#define TCP_LISTEN_SIG struct tcp_pcb * pcb
|
||||
#define TCP_LISTEN_WITH_BACKLOG_SIG struct tcp_pcb * pcb, u8_t backlog
|
||||
#define TCP_BIND_SIG struct tcp_pcb * pcb, struct ip_addr * ipaddr, u16_t port
|
||||
#define TCP_BIND_SIG struct tcp_pcb * pcb, ip_addr_t * ipaddr, u16_t port
|
||||
#define TCP_INPUT_SIG struct pbuf *p, struct netif *inp
|
||||
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
|
||||
@@ -106,6 +106,11 @@ int zts_stop_proxy_server(const char *nwid) {
|
||||
return 0;
|
||||
}
|
||||
//
|
||||
bool zts_proxy_is_running(const char *nwid)
|
||||
{
|
||||
return false; // TODO
|
||||
}
|
||||
//
|
||||
int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage * addr) {
|
||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
@@ -152,41 +157,51 @@ void zts_stop_service() {
|
||||
}
|
||||
|
||||
// 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
|
||||
void zts_get_addresses(const char * nwid, char *addrstr)
|
||||
// Now only returns first assigned address per network. Shouldn't normally be a problem.
|
||||
|
||||
// Get IPV4 Address for this device on given network
|
||||
void zts_get_ipv4_address(const char *nwid, char *addrstr)
|
||||
{
|
||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
if(tap && tap->_ips.size()){
|
||||
for(int i=0; i<tap->_ips.size(); i++)
|
||||
{
|
||||
std::string addr = tap->_ips[0].toString();
|
||||
DEBUG_EXTRA("addr=%s, addrlen=%d", addr.c_str(), addr.length());
|
||||
}
|
||||
//memcpy(addrstr, addr.c_str(), addr.length());
|
||||
}
|
||||
else {
|
||||
memcpy(addrstr, "-1.-1.-1.-1/-1", 14);
|
||||
}
|
||||
}
|
||||
// Get IPV6 Address for this device on given network
|
||||
void zts_get_ipv6_address(const char *nwid, char *addrstr)
|
||||
{
|
||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
if(tap && tap->_ips.size()){
|
||||
std::string addr = tap->_ips[0].toString();
|
||||
DEBUG_INFO("addr.length() = %d, addr = %s\n", addr.length(), addr.c_str());
|
||||
DEBUG_EXTRA("addr=%s, addrlen=%d", addr.c_str(), addr.length());
|
||||
memcpy(addrstr, addr.c_str(), addr.length());
|
||||
}
|
||||
else {
|
||||
memcpy(addrstr, "-1.-1.-1.-1/-1", 14);
|
||||
}
|
||||
/*
|
||||
uint64_t nwid_int = strtoull(nwid.c_str(), NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
std::vector<std::string> ip_strings;
|
||||
if(tap) {
|
||||
for(int i=0; i<tap->_ips.size(); i++) {
|
||||
ip_strings.push_back(tap->_ips[i].toString());
|
||||
}
|
||||
return ip_strings;
|
||||
}
|
||||
return ip_strings;
|
||||
*/
|
||||
}
|
||||
//
|
||||
int zts_get_device_id() { /* TODO */ return 0; }
|
||||
//
|
||||
// Get device ID
|
||||
int zts_get_device_id()
|
||||
{
|
||||
/* TODO */ return 0;
|
||||
}
|
||||
//
|
||||
bool zts_is_relayed() {
|
||||
// TODO
|
||||
// zt1Service->getNode()->peers()
|
||||
return false;
|
||||
}
|
||||
//
|
||||
// Return the home path for this instance of ZeroTier
|
||||
char *zts_get_homepath() {
|
||||
return (char*)givenHomeDir.c_str();
|
||||
}
|
||||
@@ -203,12 +218,15 @@ char *zts_get_homepath() {
|
||||
FuncPtr Debug;
|
||||
void SetDebugFunction( FuncPtr fp ) { Debug = fp; }
|
||||
|
||||
/*
|
||||
// Starts a ZeroTier service at the given path
|
||||
void unity_start_service(char * path, int len) {
|
||||
std::string dstr = std::string(path);
|
||||
dstr = "unity_start_service(): path = " + dstr;
|
||||
Debug(dstr.c_str());
|
||||
init_service(INTERCEPT_DISABLED, path);
|
||||
zts_start_service(path);
|
||||
|
||||
//std::string dstr = std::string(path);
|
||||
//dstr = "unity_start_service(): path = " + dstr;
|
||||
//Debug(dstr.c_str());
|
||||
//init_service(INTERCEPT_DISABLED, path);
|
||||
}
|
||||
// Starts a ZeroTier service and RPC
|
||||
void unity_start_service_and_rpc(char * path, char *nwid, int len) {
|
||||
@@ -217,6 +235,7 @@ char *zts_get_homepath() {
|
||||
Debug(dstr.c_str());
|
||||
init_service_and_rpc(INTERCEPT_DISABLED, path, nwid);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
||||
@@ -231,20 +250,6 @@ char *zts_get_homepath() {
|
||||
// between build environments whilst also preventing duplicate symbols
|
||||
// we need to check for this case
|
||||
|
||||
/*
|
||||
#if defined(USING_BRIDGING_HEADER)
|
||||
void zts_start_service(const char *path)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void zts_start_service(const char *path, const char *nwid)
|
||||
{
|
||||
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
void zts_start_service(const char *path)
|
||||
{
|
||||
DEBUG_INFO("path=%s", path);
|
||||
@@ -253,40 +258,9 @@ void zts_start_service(const char *path)
|
||||
zts_start_core_service(NULL);
|
||||
}
|
||||
|
||||
#if !defined(USING_BRIDGING_HEADER)
|
||||
void zt_start_service(const char * path, const char *nwid) {
|
||||
DEBUG_INFO("path=%s", path);
|
||||
if(path)
|
||||
homeDir = path;
|
||||
zts_start_core_service(NULL);
|
||||
}
|
||||
|
||||
void zt_join_network()
|
||||
{
|
||||
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
#if (defined(__APPLE__) || defined(__linux__)) && (!defined(__IOS__) && !defined(__ANDROID__))
|
||||
void zt_start_service(const char * path, const char *nwid) {
|
||||
printf("path = %s\n", path);
|
||||
if(path)
|
||||
homeDir = path;
|
||||
zts_start_core_service(NULL);
|
||||
}
|
||||
void zt_join_network(const char * nwid) {
|
||||
zts_join_network(nwid);
|
||||
}
|
||||
void zt_leave_network(const char * nwid) {
|
||||
zts_leave_network(nwid);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// Typically used on iOS/OSX
|
||||
#if !defined(__ANDROID__)
|
||||
/*
|
||||
// Starts a service thread and performs basic setup tasks
|
||||
void init_service(int key, const char * path) {
|
||||
givenHomeDir = path;
|
||||
@@ -295,11 +269,13 @@ void zt_join_network()
|
||||
*intercept_thread_id = key;
|
||||
pthread_create(&intercept_thread, NULL, zts_start_core_service, (void *)(intercept_thread_id));
|
||||
}
|
||||
void init_service_and_rpc(int key, const char * path, const char * nwid) {
|
||||
rpcEnabled = true;
|
||||
rpcNWID = nwid;
|
||||
init_service(key, path);
|
||||
}
|
||||
|
||||
//void init_service_and_rpc(int key, const char * path, const char * nwid) {
|
||||
// rpcEnabled = true;
|
||||
// rpcNWID = nwid;
|
||||
// init_service(key, path);
|
||||
//}
|
||||
|
||||
// Enables or disables intercept for current thread using key in thread-local storage
|
||||
void set_intercept_status(int mode) {
|
||||
#if defined(__APPLE__)
|
||||
@@ -312,6 +288,7 @@ void zt_join_network()
|
||||
*intercept_thread_id = mode;
|
||||
pthread_setspecific(thr_id_key, intercept_thread_id);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
||||
@@ -366,7 +343,7 @@ void zt_join_network()
|
||||
}
|
||||
// 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
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1ipv4_1address(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
|
||||
char address_string[32];
|
||||
memset(address_string, 0, 32);
|
||||
@@ -376,24 +353,20 @@ void zt_join_network()
|
||||
jstring _str = (*env).NewStringUTF(address_string);
|
||||
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||
return addresses;
|
||||
/*
|
||||
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
|
||||
std::vector<std::string> address_strings = zts_get_addresses(nwid_str);
|
||||
jclass clazz = (*env).FindClass("java/util/ArrayList");
|
||||
jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V"));
|
||||
if(address_strings.size()) {
|
||||
for (int n=0;n<address_strings.size();n++) {
|
||||
jstring _str = (*env).NewStringUTF(address_strings[n].c_str());
|
||||
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||
}
|
||||
}
|
||||
else { // Add dummy value
|
||||
jstring _str = (*env).NewStringUTF("-1.-1.-1.-1/-1");
|
||||
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||
}
|
||||
return addresses;
|
||||
*/
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1ipv6_1address(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
|
||||
char address_string[32];
|
||||
memset(address_string, 0, 32);
|
||||
zts_get_addresses(nwid_str, address_string);
|
||||
jclass clazz = (*env).FindClass("java/util/ArrayList");
|
||||
jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V"));
|
||||
jstring _str = (*env).NewStringUTF(address_string);
|
||||
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
|
||||
return addresses;
|
||||
}
|
||||
|
||||
// Returns the device is in integer form
|
||||
JNIEXPORT jint Java_ZeroTier_ZTSDK_zt_1get_1device_1id() {
|
||||
return zts_get_device_id();
|
||||
@@ -402,19 +375,6 @@ void zt_join_network()
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1is_1relayed() {
|
||||
return zts_is_relayed();
|
||||
}
|
||||
// Returns the local address of the SOCKS5 Proxy server
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1get_1proxy_1server_1address(JNIEnv *env, jobject thisObj, jstring nwid, jobject ztaddr) {
|
||||
struct sockaddr_in addr;
|
||||
int err = zts_get_proxy_server_address(env->GetStringUTFChars(nwid, NULL), (struct sockaddr_storage*)&addr);
|
||||
// SET ZTAddress fields
|
||||
jfieldID fid;
|
||||
jclass cls = env->GetObjectClass(ztaddr);
|
||||
fid = env->GetFieldID(cls, "port", "I");
|
||||
env->SetIntField(ztaddr, fid, addr.sin_port);
|
||||
fid = env->GetFieldID(cls,"_rawAddr", "J");
|
||||
env->SetLongField(ztaddr, fid,addr.sin_addr.s_addr);
|
||||
return err;
|
||||
}
|
||||
// Starts a SOCKS5 proxy server for a given ZeroTier network
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1start_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid, jobject ztaddr) {
|
||||
const char *nwidstr = env->GetStringUTFChars(nwid, NULL);
|
||||
@@ -431,6 +391,19 @@ void zt_join_network()
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1stop_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
return zts_stop_proxy_server((char*)env->GetStringUTFChars(nwid, NULL));
|
||||
}
|
||||
// Returns the local address of the SOCKS5 Proxy server
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1get_1proxy_1server_1address(JNIEnv *env, jobject thisObj, jstring nwid, jobject ztaddr) {
|
||||
struct sockaddr_in addr;
|
||||
int err = zts_get_proxy_server_address(env->GetStringUTFChars(nwid, NULL), (struct sockaddr_storage*)&addr);
|
||||
// SET ZTAddress fields
|
||||
jfieldID fid;
|
||||
jclass cls = env->GetObjectClass(ztaddr);
|
||||
fid = env->GetFieldID(cls, "port", "I");
|
||||
env->SetIntField(ztaddr, fid, addr.sin_port);
|
||||
fid = env->GetFieldID(cls,"_rawAddr", "J");
|
||||
env->SetLongField(ztaddr, fid,addr.sin_addr.s_addr);
|
||||
return err;
|
||||
}
|
||||
//
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1proxy_1is_1running(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
// TODO: implement
|
||||
@@ -442,15 +415,16 @@ void zt_join_network()
|
||||
// ------------------------------- zts_start_service ----------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Starts a ZeroTier service in the background
|
||||
void *zts_start_core_service(void *thread_id) {
|
||||
#if defined(__ANDROID__)
|
||||
DEBUG_INFO("ZTSDK_BUILD_VERSION = %d", ZTSDK_BUILD_VERSION);
|
||||
#endif
|
||||
|
||||
#if defined(SDK_BUNDLED) && !defined(__ANDROID__)
|
||||
set_intercept_status(INTERCEPT_DISABLED); // Ignore network calls from ZT service
|
||||
#endif
|
||||
//#if defined(SDK_BUNDLED) && !defined(__ANDROID__)
|
||||
// set_intercept_status(INTERCEPT_DISABLED); // Ignore network calls from ZT service
|
||||
//#endif
|
||||
|
||||
#if defined(__UNITY_3D__)
|
||||
char current_dir[MAX_DIR_SZ];
|
||||
|
||||
@@ -34,21 +34,21 @@
|
||||
|
||||
// ZEROTIER CONTROLS
|
||||
// Starts a ZeroTier service at the specified path
|
||||
// This will only support SOCKS5 Proxy
|
||||
extern "C" void zt_start_service(const char *path, const char *nwid) {
|
||||
//zts_start_service(path);
|
||||
init_service(INTERCEPT_DISABLED, path);
|
||||
zts_start_service(path);
|
||||
//init_service(INTERCEPT_DISABLED, path);
|
||||
}
|
||||
|
||||
// Starts a ZeroTier service at the specified path and initializes the RPC mechanism
|
||||
// This will allow direct API calls
|
||||
extern "C" void zt_start_service_and_rpc(const char *path, const char *nwid) {
|
||||
init_service_and_rpc(INTERCEPT_DISABLED, path, nwid);
|
||||
}
|
||||
//
|
||||
//extern "C" void zt_start_service_and_rpc(const char *path, const char *nwid) {
|
||||
// init_service_and_rpc(INTERCEPT_DISABLED, path, nwid);
|
||||
//}
|
||||
|
||||
// Stops the core ZeroTier service
|
||||
extern "C" void zt_stop_service() {
|
||||
zts_stop_service();
|
||||
}
|
||||
//
|
||||
// Returns whether the core ZeroTier service is running
|
||||
extern "C" bool zt_service_is_running() {
|
||||
return zts_service_is_running();
|
||||
}
|
||||
@@ -80,8 +80,8 @@ extern "C" void zt_stop_proxy_server(const char *nwid) {
|
||||
zts_stop_proxy_server(nwid);
|
||||
}
|
||||
//
|
||||
extern "C" void zt_proxy_running(const char *homepath, const char *nwid, struct sockaddr_storage *addr) {
|
||||
zts_start_proxy_server(homepath, nwid, addr);
|
||||
extern "C" void zt_proxy_is_running(const char *nwid) {
|
||||
zts_proxy_is_running(nwid);
|
||||
}
|
||||
//
|
||||
extern "C" void zt_get_proxy_server_address(const char *nwid, struct sockaddr_storage *addr) {
|
||||
@@ -97,6 +97,7 @@ extern "C" void zt_init_rpc(const char *path, const char *nwid) {
|
||||
|
||||
|
||||
// SOCKET API
|
||||
// These are used in ZTSDK.swift to implement the higher-level API
|
||||
extern "C" int zt_socket(SOCKET_SIG) {
|
||||
return zts_socket(socket_family, socket_type, protocol);
|
||||
}
|
||||
|
||||
@@ -59,42 +59,43 @@ class ZTSDK : NSObject
|
||||
dispatch_async(queue) {
|
||||
self.ztnc_start_service(path)
|
||||
}
|
||||
sleep(2)
|
||||
sleep(3)
|
||||
while(service_is_running() == false) { /* waiting for service to start */ }
|
||||
}
|
||||
|
||||
// Stops the ZeroTier background service
|
||||
func stop_service() {
|
||||
zt_stop_service();
|
||||
zt_stop_service()
|
||||
}
|
||||
|
||||
// Returns whether the ZeroTier background service is running
|
||||
func service_is_running() -> Bool {
|
||||
return zt_service_is_running();
|
||||
return zt_service_is_running()
|
||||
}
|
||||
|
||||
// Joins a ZeroTier network
|
||||
func join_network(nwid: String) {
|
||||
zt_join_network(nwid);
|
||||
zt_join_network(nwid)
|
||||
}
|
||||
|
||||
// Leaves a ZeroTier network
|
||||
func leave_network(nwid: String) {
|
||||
zt_leave_network(nwid);
|
||||
zt_leave_network(nwid)
|
||||
}
|
||||
|
||||
// Returns the IPV4 address of this device on a given ZeroTier network
|
||||
func get_ipv4_address(nwid: String) -> String? {
|
||||
var str_buf = [Int8](count: 16, repeatedValue: 0)
|
||||
zt_get_ipv4_address(nwid,&str_buf);
|
||||
return String(str_buf);
|
||||
zt_get_ipv4_address(nwid,&str_buf)
|
||||
return String.fromCString(str_buf)
|
||||
//return "IPV4"
|
||||
}
|
||||
|
||||
// Returns the IPV6 address of this device on a given ZeroTier network
|
||||
func get_ipv6_address(nwid: String) -> String? {
|
||||
var str_buf = [Int8](count: 16, repeatedValue: 0)
|
||||
zt_get_ipv6_address(nwid,&str_buf);
|
||||
return String(str_buf);
|
||||
zt_get_ipv6_address(nwid,&str_buf)
|
||||
return String.fromCString(str_buf)
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user