improved debugging usability for all platforms
This commit is contained in:
@@ -102,9 +102,9 @@ public class ZTSDK {
|
||||
return zt_get_proxy_port(nwid);
|
||||
}
|
||||
|
||||
public native boolean zt_running();
|
||||
public boolean running() {
|
||||
return zt_running();
|
||||
public native boolean zt_service_is_running();
|
||||
public boolean service_is_running() {
|
||||
return zt_service_is_running();
|
||||
}
|
||||
|
||||
|
||||
@@ -272,4 +272,11 @@ public class ZTSDK {
|
||||
//public static native int zt_getsockopt(int fd, int type, int protocol);
|
||||
//public static native int zt_setsockopt(int fd, int type, int protocol);
|
||||
//public static native int zt_getsockname(int fd, int type, int protocol);
|
||||
|
||||
|
||||
// PROXY SERVER CONTROLS
|
||||
public native boolean zt_proxy_is_running();
|
||||
public boolean proxy_is_running() {
|
||||
return zt_proxy_is_running();
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,14 @@ public class MainActivity extends AppCompatActivity {
|
||||
zt.start_service(homeDir);
|
||||
}
|
||||
}).start();
|
||||
while(!zt.running()) { }
|
||||
while(!zt.service_is_running()) { }
|
||||
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// client/server mode toggle
|
||||
int mode = 4, err;
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
7C9587951D6FB4C80014AF6B /* SDK_Service.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA03DE1D628E88003F9B1A /* SDK_Service.cpp */; };
|
||||
7CAA03DF1D628E88003F9B1A /* SDK_Service.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CAA03DE1D628E88003F9B1A /* SDK_Service.cpp */; };
|
||||
7CC003261D1216E3003E68DC /* ZeroTierSDK_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC003251D1216E3003E68DC /* ZeroTierSDK_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
7CC003501D12178D003E68DC /* SDK_Debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003421D12178D003E68DC /* SDK_Debug.c */; };
|
||||
7CC003511D12178D003E68DC /* SDK_EthernetTap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */; };
|
||||
7CC003521D12178D003E68DC /* SDK_Intercept.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003461D12178D003E68DC /* SDK_Intercept.c */; };
|
||||
7CC003531D12178D003E68DC /* SDK_Proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003481D12178D003E68DC /* SDK_Proxy.cpp */; };
|
||||
@@ -84,7 +83,6 @@
|
||||
7CC004351D121840003E68DC /* Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0041C1D121840003E68DC /* Utils.cpp */; };
|
||||
7CC0043A1D12184F003E68DC /* ControlPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC004361D12184F003E68DC /* ControlPlane.cpp */; };
|
||||
7CC0043B1D12184F003E68DC /* OneService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC004381D12184F003E68DC /* OneService.cpp */; };
|
||||
7CC0043C1D1316BF003E68DC /* SDK_Debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003421D12178D003E68DC /* SDK_Debug.c */; };
|
||||
7CC0043D1D1316BF003E68DC /* SDK_EthernetTap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */; };
|
||||
7CC0043E1D1316BF003E68DC /* SDK_Intercept.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003461D12178D003E68DC /* SDK_Intercept.c */; };
|
||||
7CC0043F1D1316BF003E68DC /* SDK_Proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003481D12178D003E68DC /* SDK_Proxy.cpp */; };
|
||||
@@ -156,7 +154,6 @@
|
||||
7CC004841D131704003E68DC /* tcpip.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003641D1217C3003E68DC /* tcpip.c */; };
|
||||
7CC004851D1318DA003E68DC /* lz4.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0035A1D1217B2003E68DC /* lz4.c */; };
|
||||
7CC004861D1318DA003E68DC /* http_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003571D1217A1003E68DC /* http_parser.c */; };
|
||||
7CC004871D131E21003E68DC /* SDK_Debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003421D12178D003E68DC /* SDK_Debug.c */; };
|
||||
7CC004881D131E21003E68DC /* SDK_EthernetTap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */; };
|
||||
7CC004891D131E21003E68DC /* SDK_Intercept.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003461D12178D003E68DC /* SDK_Intercept.c */; };
|
||||
7CC0048A1D131E21003E68DC /* SDK_Proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003481D12178D003E68DC /* SDK_Proxy.cpp */; };
|
||||
@@ -228,7 +225,6 @@
|
||||
7CC004D01D131E37003E68DC /* lz4.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0035A1D1217B2003E68DC /* lz4.c */; };
|
||||
7CC004D11D131E37003E68DC /* http_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003571D1217A1003E68DC /* http_parser.c */; };
|
||||
7CC004D21D131F76003E68DC /* ip_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003921D1217DD003E68DC /* ip_addr.c */; };
|
||||
7CC004D71D13247A003E68DC /* SDK_Debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003421D12178D003E68DC /* SDK_Debug.c */; };
|
||||
7CC004D81D13247A003E68DC /* SDK_EthernetTap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */; };
|
||||
7CC004D91D13247A003E68DC /* SDK_Intercept.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003461D12178D003E68DC /* SDK_Intercept.c */; };
|
||||
7CC004DA1D13247A003E68DC /* SDK_Proxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003481D12178D003E68DC /* SDK_Proxy.cpp */; };
|
||||
@@ -314,7 +310,6 @@
|
||||
7CC003341D1216F8003E68DC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7CC0033C1D121741003E68DC /* ZeroTierSDK_Unity3D_OSX.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZeroTierSDK_Unity3D_OSX.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7CC0033E1D121742003E68DC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
7CC003421D12178D003E68DC /* SDK_Debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SDK_Debug.c; path = ../../../src/SDK_Debug.c; sourceTree = "<group>"; };
|
||||
7CC003431D12178D003E68DC /* SDK_Debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDK_Debug.h; path = ../../../src/SDK_Debug.h; sourceTree = "<group>"; };
|
||||
7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SDK_EthernetTap.cpp; path = ../../../src/SDK_EthernetTap.cpp; sourceTree = "<group>"; };
|
||||
7CC003451D12178D003E68DC /* SDK_EthernetTap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = SDK_EthernetTap.hpp; path = ../../../src/SDK_EthernetTap.hpp; sourceTree = "<group>"; };
|
||||
@@ -733,7 +728,6 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7CAA03DE1D628E88003F9B1A /* SDK_Service.cpp */,
|
||||
7CC003421D12178D003E68DC /* SDK_Debug.c */,
|
||||
7CC003431D12178D003E68DC /* SDK_Debug.h */,
|
||||
7CC003441D12178D003E68DC /* SDK_EthernetTap.cpp */,
|
||||
7CC003451D12178D003E68DC /* SDK_EthernetTap.hpp */,
|
||||
@@ -958,7 +952,6 @@
|
||||
7CC003821D1217D1003E68DC /* memp.c in Sources */,
|
||||
7CC003661D1217C3003E68DC /* api_msg.c in Sources */,
|
||||
7CC004291D121840003E68DC /* NetworkConfig.cpp in Sources */,
|
||||
7CC003501D12178D003E68DC /* SDK_Debug.c in Sources */,
|
||||
7CC004321D121840003E68DC /* SHA512.cpp in Sources */,
|
||||
7CC003531D12178D003E68DC /* SDK_Proxy.cpp in Sources */,
|
||||
7CC003961D1217DD003E68DC /* icmp.c in Sources */,
|
||||
@@ -1101,7 +1094,6 @@
|
||||
7CC0045D1D1316F5003E68DC /* BackgroundResolver.cpp in Sources */,
|
||||
7CC0045E1D1316F5003E68DC /* Http.cpp in Sources */,
|
||||
7CC0045F1D1316F5003E68DC /* OSUtils.cpp in Sources */,
|
||||
7CC0043C1D1316BF003E68DC /* SDK_Debug.c in Sources */,
|
||||
7CC0043D1D1316BF003E68DC /* SDK_EthernetTap.cpp in Sources */,
|
||||
7CC0043E1D1316BF003E68DC /* SDK_Intercept.c in Sources */,
|
||||
7CC0043F1D1316BF003E68DC /* SDK_Proxy.cpp in Sources */,
|
||||
@@ -1152,7 +1144,6 @@
|
||||
7CC004CD1D131E2D003E68DC /* netifapi.c in Sources */,
|
||||
7CC004CE1D131E2D003E68DC /* sockets.c in Sources */,
|
||||
7CC004CF1D131E2D003E68DC /* tcpip.c in Sources */,
|
||||
7CC004871D131E21003E68DC /* SDK_Debug.c in Sources */,
|
||||
7CC004881D131E21003E68DC /* SDK_EthernetTap.cpp in Sources */,
|
||||
7CC004891D131E21003E68DC /* SDK_Intercept.c in Sources */,
|
||||
7CC0048A1D131E21003E68DC /* SDK_Proxy.cpp in Sources */,
|
||||
@@ -1261,7 +1252,6 @@
|
||||
7CC004F81D1324A2003E68DC /* BackgroundResolver.cpp in Sources */,
|
||||
7CC004F91D1324A2003E68DC /* Http.cpp in Sources */,
|
||||
7CC004FA1D1324A2003E68DC /* OSUtils.cpp in Sources */,
|
||||
7CC004D71D13247A003E68DC /* SDK_Debug.c in Sources */,
|
||||
7CC004D81D13247A003E68DC /* SDK_EthernetTap.cpp in Sources */,
|
||||
7CC004D91D13247A003E68DC /* SDK_Intercept.c in Sources */,
|
||||
7CC004DA1D13247A003E68DC /* SDK_Proxy.cpp in Sources */,
|
||||
|
||||
72
src/SDK.h
72
src/SDK.h
@@ -86,15 +86,16 @@ extern char *debug_logfile;
|
||||
// the specific way needed for that platform, but will be implemented
|
||||
// in terms of zts_*
|
||||
|
||||
// NOTE: Each platform specific exposed API will be implemented in terms of zts_*
|
||||
// SOCKS5 Proxy Controls
|
||||
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();
|
||||
|
||||
// ZT Service Controls
|
||||
void *zts_start_service(void *thread_id);
|
||||
void zts_stop_service();
|
||||
bool zts_is_running();
|
||||
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);
|
||||
@@ -144,44 +145,43 @@ ssize_t zts_recvmsg(RECVMSG_SIG);
|
||||
// Android JNI Direct-call API
|
||||
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
|
||||
#if defined(__ANDROID__)
|
||||
// Exported JNI : ZT SERVICE CONTROLS
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1start_1service(JNIEnv *env, jobject thisObj, jstring path);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1stop_service();
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj);
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1is_1relayed();
|
||||
// Returns the homepath
|
||||
JNIEXPORT jstring JNICALL Java_ZeroTier_SDK_zt_1get_1homepath(JNIEnv *env, jobject thisObj);
|
||||
// ZT SERVICE CONTROLS
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1start_1service(JNIEnv *env, jobject thisObj, jstring path);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1stop_service();
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1service_1is_1running(JNIEnv *env, jobject thisObj);
|
||||
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 jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1is_1relayed();
|
||||
|
||||
// Exported JNI : SOCKS5 PROXY SERVER CONTROLS
|
||||
// Stops the SOCKS5 proxy server for a given ZeroTier network
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1start_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid, jobject zaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1stop_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1get_1proxy_1server_1address(JNIEnv *env, jobject thisObj, jstring nwid, jobject zaddr);
|
||||
|
||||
// Exported JNI : SOCKET API
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1socket(JNIEnv *env, jobject thisObj, jint family, jint type, jint protocol);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1connect(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1bind(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1accept4(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port, jint flags);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1accept(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1listen(JNIEnv *env, jobject thisObj, jint fd, int backlog);
|
||||
// SOCKS5 PROXY SERVER CONTROLS
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1start_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid, jobject zaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1stop_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1get_1proxy_1server_1address(JNIEnv *env, jobject thisObj, jstring nwid, jobject zaddr);
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1proxy_1is_1running(JNIEnv *env, jobject thisObj, jstring nwid);
|
||||
|
||||
// SOCKET API
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1socket(JNIEnv *env, jobject thisObj, jint family, jint type, jint protocol);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1connect(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1bind(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1accept4(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port, jint flags);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1accept(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1listen(JNIEnv *env, jobject thisObj, jint fd, int backlog);
|
||||
// TCP
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1write(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1read(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1send(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, int flags);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1write(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1read(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1send(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, int flags);
|
||||
// UDP
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1sendto(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, jint flags, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1recvfrom(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, jint flags, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1sendto(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, jint flags, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1recvfrom(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, jint flags, jobject ztaddr);
|
||||
// GENERAL UTILITY
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1close(JNIEnv *env, jobject thisObj, jint fd);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1fcntl(JNIEnv *env, jobject thisObj, jint socket, jint cmd, jint flags);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1setsockopt(JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getsockopt(JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getsockname(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getpeername(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1close(JNIEnv *env, jobject thisObj, jint fd);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1fcntl(JNIEnv *env, jobject thisObj, jint socket, jint cmd, jint flags);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1setsockopt(JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getsockopt(JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getsockname(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr);
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getpeername(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
131
src/SDK_Debug.c
131
src/SDK_Debug.c
@@ -1,131 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
||||
*
|
||||
* 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 _COMMON_DEBUG_
|
||||
#define _COMMON_DEBUG_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <netdb.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <pthread.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#ifndef SDK_DEBUG_H
|
||||
#define SDK_DEBUG_H
|
||||
|
||||
// Set during make (e.g. make SDK_DEBUG=2)
|
||||
#define DEBUG_LEVEL 4
|
||||
|
||||
#define MSG_ERROR 1 // Errors
|
||||
#define MSG_TRANSFER 2 // RX/TX specific statements
|
||||
#define MSG_INFO 3 // Information which is generally useful to any user
|
||||
#define MSG_DEBUG 4 // Information which is only useful to someone debugging
|
||||
#define MSG_DEBUG_EXTRA 5 // If nothing in your world makes sense
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#if __ANDROID__
|
||||
#include <jni.h>
|
||||
#include <android/log.h>
|
||||
#define LOG_TAG "ZTSDK"
|
||||
#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
|
||||
#else
|
||||
#define LOGV(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGI(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGD(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGE(...) fprintf(stdout, __VA_ARGS__)
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
//char *debug_logfile = (char*)0;
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
|
||||
//#if !defined(__ANDROID__)
|
||||
void dwr(int level, const char *fmt, ... )
|
||||
{
|
||||
#if defined(SDK_DEBUG)
|
||||
if(level > DEBUG_LEVEL)
|
||||
return;
|
||||
int saveerr;
|
||||
saveerr = errno;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
char timestring[20];
|
||||
time_t timestamp;
|
||||
timestamp = time(NULL);
|
||||
strftime(timestring, sizeof(timestring), "%H:%M:%S", localtime(×tamp));
|
||||
#if defined(__ANDROID__)
|
||||
pid_t tid = gettid();
|
||||
#elif defined(__linux__)
|
||||
pid_t tid = 5;//syscall(SYS_gettid);
|
||||
#elif defined(__APPLE__)
|
||||
pid_t tid = pthread_mach_thread_np(pthread_self());
|
||||
#endif
|
||||
#if defined(SDK_DEBUG_LOG_TO_FILE)
|
||||
if(!debug_logfile) { // Try to get logfile from env
|
||||
debug_logfile = getenv("ZT_SDK_LOGFILE");
|
||||
}
|
||||
if(debug_logfile) {
|
||||
FILE *file = fopen(debug_logfile,"a");
|
||||
fprintf(file, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(file, fmt, ap);
|
||||
fclose(file);
|
||||
va_end(ap);
|
||||
}
|
||||
#endif
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
|
||||
// Outputs to Android debug console
|
||||
#if defined(__ANDROID__)
|
||||
__android_log_vprint(ANDROID_LOG_VERBOSE, "ZT-JNI", fmt, ap);
|
||||
#endif
|
||||
|
||||
fflush(stderr);
|
||||
errno = saveerr;
|
||||
va_end(ap);
|
||||
#endif // _SDK_DEBUG
|
||||
}
|
||||
//#endif
|
||||
|
||||
#endif //
|
||||
#endif //
|
||||
126
src/SDK_Debug.h
126
src/SDK_Debug.h
@@ -26,33 +26,129 @@
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _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 MSG_ERROR 1 // Errors
|
||||
#define MSG_TRANSFER 2 // RX/TX specific statements
|
||||
#define MSG_INFO 3 // Information which is generally useful to any user
|
||||
#define MSG_DEBUG 4 // Information which is only useful to someone debugging
|
||||
#define MSG_DEBUG_EXTRA 5 // If nothing in your world makes sense
|
||||
#define MSG_INFO 3 // Information which is generally useful to any developer
|
||||
#define MSG_EXTRA 4 // If nothing in your world makes sense
|
||||
|
||||
extern char *debug_logfile;
|
||||
#define __SHOW_FILENAMES__ true
|
||||
|
||||
// filenames
|
||||
#if __SHOW_FILENAMES__
|
||||
#if __SHOW_FULL_FILENAME_PATH__
|
||||
#define __FILENAME__ __FILE__ // show the entire mess
|
||||
#else
|
||||
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) // shorten
|
||||
#endif
|
||||
#else
|
||||
#define __FILENAME__ // omit filename
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#if __ANDROID__
|
||||
#endif
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#include <jni.h>
|
||||
#include <android/log.h>
|
||||
#define LOG_TAG "ZTSDK"
|
||||
#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
|
||||
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
|
||||
#endif
|
||||
|
||||
//#if defined(SDK_DEBUG)
|
||||
#if DEBUG_LEVEL >= MSG_ERROR
|
||||
#define DEBUG_ERROR(fmt, args...) fprintf(stderr, "\nZT_ERROR: %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)
|
||||
#else
|
||||
#define DEBUG_ERROR(fmt, args...)
|
||||
#endif
|
||||
#if DEBUG_LEVEL >= MSG_INFO
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_INFO(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "\nZT_INFO : %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args))
|
||||
#else
|
||||
#define LOGV(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGI(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGD(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define LOGE(...) fprintf(stdout, __VA_ARGS__)
|
||||
#define DEBUG_INFO(fmt, args...) fprintf(stderr, "\nZT_INFO : %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)
|
||||
#define DEBUG_BLANK(fmt, args...) fprintf(stderr, "\nZT_INFO : %s:%d:" fmt "\n", __FILENAME__, __LINE__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_INFO(fmt, args...)
|
||||
#define DEBUG_BLANK(fmt, args...)
|
||||
#endif
|
||||
#if DEBUG_LEVEL >= MSG_TRANSFER
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_TRANS(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "\nZT_TRANS : %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args))
|
||||
#else
|
||||
#define DEBUG_TRANS(fmt, args...) fprintf(stderr, "\nZT_TRANS: %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_TRANS(fmt, args...)
|
||||
#endif
|
||||
#if DEBUG_LEVEL >= MSG_EXTRA
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_EXTRA(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "\nZT_EXTRA : %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args))
|
||||
#else
|
||||
#define DEBUG_EXTRA(fmt, args...) fprintf(stderr, "\nZT_EXTRA: %s:%d:%s(): " fmt "\n", __FILENAME__, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_EXTRA(fmt, args...)
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // _SDK_DEBUG_H_
|
||||
|
||||
|
||||
/*
|
||||
void dwr(int level, const char *fmt, ... )
|
||||
{
|
||||
#if defined(SDK_DEBUG)
|
||||
if(level > DEBUG_LEVEL)
|
||||
return;
|
||||
int saveerr;
|
||||
saveerr = errno;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
char timestring[20];
|
||||
time_t timestamp;
|
||||
timestamp = time(NULL);
|
||||
strftime(timestring, sizeof(timestring), "%H:%M:%S", localtime(×tamp));
|
||||
#if defined(__ANDROID__)
|
||||
pid_t tid = gettid();
|
||||
#elif defined(__linux__)
|
||||
pid_t tid = 5;//syscall(SYS_gettid);
|
||||
#elif defined(__APPLE__)
|
||||
pid_t tid = pthread_mach_thread_np(pthread_self());
|
||||
#endif
|
||||
#if defined(SDK_DEBUG_LOG_TO_FILE)
|
||||
if(!debug_logfile) { // Try to get logfile from env
|
||||
debug_logfile = getenv("ZT_SDK_LOGFILE");
|
||||
}
|
||||
if(debug_logfile) {
|
||||
FILE *file = fopen(debug_logfile,"a");
|
||||
fprintf(file, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(file, fmt, ap);
|
||||
fclose(file);
|
||||
va_end(ap);
|
||||
}
|
||||
#endif
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "%s [tid=%7d] ", timestring, tid);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
|
||||
// Outputs to Android debug console
|
||||
#if defined(__ANDROID__)
|
||||
__android_log_vprint(ANDROID_LOG_VERBOSE, "ZT-JNI", fmt, ap);
|
||||
#endif
|
||||
|
||||
fflush(stderr);
|
||||
errno = saveerr;
|
||||
va_end(ap);
|
||||
#endif // _SDK_DEBUG
|
||||
}
|
||||
*/
|
||||
@@ -58,8 +58,8 @@
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/udp.h"
|
||||
|
||||
#include "SDK_Debug.c"
|
||||
#include "SDK.h"
|
||||
#include "SDK_Debug.h"
|
||||
|
||||
#if !defined(__IOS__) && !defined(__ANDROID__) && !defined(__UNITY_3D__) && !defined(__XCODE__)
|
||||
const ip_addr_t ip_addr_any = { IPADDR_ANY };
|
||||
@@ -142,9 +142,9 @@ NetconEthernetTap::NetconEthernetTap(
|
||||
lwipstack->__lwip_init();
|
||||
|
||||
_unixListenSocket = _phy.unixListen(sockPath,(void *)this);
|
||||
dwr(MSG_DEBUG, " NetconEthernetTap initialized on: %s\n", sockPath);
|
||||
DEBUG_INFO(" NetconEthernetTap initialized on: %s\n", sockPath);
|
||||
if (!_unixListenSocket)
|
||||
dwr(MSG_ERROR, "unable to bind to: %s\n", sockPath);
|
||||
DEBUG_ERROR("unable to bind to: %s\n", sockPath);
|
||||
_thread = Thread::start(this);
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ bool NetconEthernetTap::enabled() const
|
||||
|
||||
bool NetconEthernetTap::addIp(const InetAddress &ip)
|
||||
{
|
||||
dwr(MSG_DEBUG, "addIp(): ZT address = %s", ip.toString().c_str());
|
||||
DEBUG_INFO("addIp(): ZT address = %s", ip.toString().c_str());
|
||||
Mutex::Lock _l(_ips_m);
|
||||
if (std::find(_ips.begin(),_ips.end(),ip) == _ips.end()) {
|
||||
_ips.push_back(ip);
|
||||
@@ -222,7 +222,7 @@ std::vector<InetAddress> NetconEthernetTap::ips() const
|
||||
|
||||
void NetconEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "RX packet: len = %d\n", len);
|
||||
DEBUG_EXTRA("RX packet: len = %d\n", len);
|
||||
struct pbuf *p,*q;
|
||||
if (!_enabled)
|
||||
return;
|
||||
@@ -240,7 +240,7 @@ void NetconEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType
|
||||
// First pbuf gets ethernet header at start
|
||||
q = p;
|
||||
if (q->len < sizeof(ethhdr)) {
|
||||
dwr(MSG_ERROR,"_put(): Dropped packet: first pbuf smaller than ethernet header\n");
|
||||
DEBUG_ERROR("_put(): Dropped packet: first pbuf smaller than ethernet header\n");
|
||||
return;
|
||||
}
|
||||
memcpy(q->payload,ðhdr,sizeof(ethhdr));
|
||||
@@ -253,13 +253,13 @@ void NetconEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType
|
||||
dataptr += q->len;
|
||||
}
|
||||
} else {
|
||||
dwr(MSG_ERROR,"put(): Dropped packet: no pbufs available\n");
|
||||
DEBUG_ERROR("put(): Dropped packet: no pbufs available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
if(interface.input(p, &interface) != ERR_OK) {
|
||||
dwr(MSG_ERROR,"put(): Error while RXing packet (netif->input)\n");
|
||||
DEBUG_ERROR("put(): Error while RXing packet (netif->input)\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,7 +276,6 @@ void NetconEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,s
|
||||
{
|
||||
std::vector<MulticastGroup> newGroups;
|
||||
Mutex::Lock _l(_multicastGroups_m);
|
||||
|
||||
// TODO: get multicast subscriptions from LWIP
|
||||
std::vector<InetAddress> allIps(ips());
|
||||
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip)
|
||||
@@ -294,7 +293,6 @@ void NetconEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,s
|
||||
removed.push_back(*m);
|
||||
}
|
||||
_multicastGroups.swap(newGroups);
|
||||
|
||||
}
|
||||
|
||||
void NetconEthernetTap::threadMain()
|
||||
@@ -318,7 +316,7 @@ void NetconEthernetTap::threadMain()
|
||||
if(!_Connections[i]->sock || _Connections[i]->type != SOCK_STREAM)
|
||||
continue;
|
||||
int fd = _phy.getDescriptor(_Connections[i]->sock);
|
||||
// dwr(MSG_DEBUG," tap_thread(): tcp\\jobs = {%d, %d}\n", _Connection.size(), jobmap.size());
|
||||
// DEBUG_INFO(" tap_thread(): tcp\\jobs = {%d, %d}\n", _Connection.size(), jobmap.size());
|
||||
// If there's anything on the RX buf, set to notify in case we stalled
|
||||
if(_Connections[i]->rxsz > 0)
|
||||
_phy.setNotifyWritable(_Connections[i]->sock, true);
|
||||
@@ -327,14 +325,14 @@ void NetconEthernetTap::threadMain()
|
||||
|
||||
ssize_t n = read(fd,&tmpbuf,BUF_SZ);
|
||||
if(_Connections[i]->TCP_pcb->state == SYN_SENT) {
|
||||
dwr(MSG_DEBUG_EXTRA," tap_thread(): (sock=%p) state = SYN_SENT, should finish or be removed soon\n",
|
||||
DEBUG_EXTRA(" tap_thread(): (sock=%p) state = SYN_SENT, should finish or be removed soon\n",
|
||||
(void*)&(_Connections[i]->sock));
|
||||
}
|
||||
if((n < 0 && errno != EAGAIN) || (n == 0 && errno == EAGAIN)) {
|
||||
dwr(MSG_DEBUG," tap_thread(): closing sock (%x)\n", _Connections[i]->sock);
|
||||
DEBUG_INFO(" tap_thread(): closing sock (%x)\n", (void*)_Connections[i]->sock);
|
||||
closeConnection(_Connections[i]->sock);
|
||||
} else if (n > 0) {
|
||||
dwr(MSG_DEBUG," tap_thread(): data read during connection check (%d bytes)\n", n);
|
||||
DEBUG_INFO(" tap_thread(): data read during connection check (%ld bytes)\n", n);
|
||||
phyOnUnixData(_Connections[i]->sock,_phy.getuptr(_Connections[i]->sock),&tmpbuf,n);
|
||||
}
|
||||
}
|
||||
@@ -376,11 +374,11 @@ Connection *NetconEthernetTap::getConnection(PhySocket *sock)
|
||||
|
||||
void NetconEthernetTap::closeConnection(PhySocket *sock)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "closeConnection(sock=%x):\n", sock);
|
||||
DEBUG_EXTRA("closeConnection(sock=%x):\n", sock);
|
||||
Mutex::Lock _l(_close_m);
|
||||
// Here we assume _tcpconns_m is already locked by caller
|
||||
if(!sock) {
|
||||
dwr(MSG_DEBUG_EXTRA,"closeConnection(): invalid PhySocket\n");
|
||||
DEBUG_EXTRA("closeConnection(): invalid PhySocket\n");
|
||||
return;
|
||||
}
|
||||
Connection *conn = getConnection(sock);
|
||||
@@ -390,14 +388,14 @@ void NetconEthernetTap::closeConnection(PhySocket *sock)
|
||||
lwipstack->__udp_remove(conn->UDP_pcb);
|
||||
}
|
||||
if(conn->TCP_pcb && conn->TCP_pcb->state != CLOSED) {
|
||||
dwr(MSG_DEBUG_EXTRA,"closeConnection(conn=%p,sock=%p): PCB->state = %d\n",
|
||||
DEBUG_EXTRA("closeConnection(conn=%p,sock=%p): PCB->state = %d\n",
|
||||
(void*)&conn, (void*)&sock, conn->TCP_pcb->state);
|
||||
if(conn->TCP_pcb->state == SYN_SENT /*|| conn->TCP_pcb->state == CLOSE_WAIT*/) {
|
||||
dwr(MSG_DEBUG_EXTRA,"closeConnection(sock=%p): invalid PCB state for this operation. ignoring.\n",
|
||||
DEBUG_EXTRA("closeConnection(sock=%p): invalid PCB state for this operation. ignoring.\n",
|
||||
(void*)&sock);
|
||||
return;
|
||||
}
|
||||
dwr(MSG_DEBUG_EXTRA, "__tcp_close(...)\n");
|
||||
DEBUG_EXTRA("__tcp_close(...)\n");
|
||||
if(lwipstack->__tcp_close(conn->TCP_pcb) == ERR_OK) {
|
||||
// Unregister callbacks for this PCB
|
||||
lwipstack->__tcp_arg(conn->TCP_pcb, NULL);
|
||||
@@ -407,7 +405,7 @@ void NetconEthernetTap::closeConnection(PhySocket *sock)
|
||||
lwipstack->__tcp_poll(conn->TCP_pcb, NULL, 1);
|
||||
}
|
||||
else {
|
||||
dwr(MSG_DEBUG_EXTRA,"closeConnection(sock=%p): error while calling tcp_close()\n", (void*)&sock);
|
||||
DEBUG_EXTRA("closeConnection(sock=%p): error while calling tcp_close()\n", (void*)&sock);
|
||||
}
|
||||
}
|
||||
for(size_t i=0;i<_Connections.size();++i) {
|
||||
@@ -424,7 +422,7 @@ void NetconEthernetTap::closeConnection(PhySocket *sock)
|
||||
}
|
||||
|
||||
void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr) {
|
||||
dwr(MSG_DEBUG_EXTRA, "phyOnUnixClose(sock=%p):\n", (void*)&sock);
|
||||
DEBUG_EXTRA("phyOnUnixClose(sock=%p):\n", (void*)&sock);
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
closeConnection(sock);
|
||||
}
|
||||
@@ -432,7 +430,7 @@ void NetconEthernetTap::phyOnUnixClose(PhySocket *sock,void **uptr) {
|
||||
|
||||
void NetconEthernetTap::processReceivedData(PhySocket *sock,void **uptr,bool lwip_invoked)
|
||||
{
|
||||
//dwr(MSG_DEBUG_EXTRA,"processReceivedData(sock=%p): lwip_invoked = %d\n", (void*)&sock, lwip_invoked);
|
||||
//DEBUG_EXTRA("processReceivedData(sock=%p): lwip_invoked = %d\n", (void*)&sock, lwip_invoked);
|
||||
if(!lwip_invoked) {
|
||||
_tcpconns_m.lock();
|
||||
_rx_buf_m.lock();
|
||||
@@ -464,19 +462,19 @@ void NetconEthernetTap::processReceivedData(PhySocket *sock,void **uptr,bool lwi
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_TRANSFER,"UDP RX <--- :: {TX: %.3f%%, RX: %d, sock=%x} :: payload = %d bytes (%d.%d.%d.%d:%d)\n",
|
||||
DEBUG_TRANS("UDP RX <--- :: {TX: %.3f%%, RX: %d, sock=%x} :: payload = %d bytes (%d.%d.%d.%d:%d)\n",
|
||||
(float)conn->txsz / max, conn->rxsz/* / max*/, conn->sock, payload_sz, d[0],d[1],d[2],d[3], port);
|
||||
#endif
|
||||
}
|
||||
// STREAM
|
||||
//dwr(MSG_DEBUG, "phyOnUnixWritable(): tid = %d\n", pthread_mach_thread_np(pthread_self()));
|
||||
//DEBUG_INFO("phyOnUnixWritable(): tid = %d\n", pthread_mach_thread_np(pthread_self()));
|
||||
if(conn->type==SOCK_STREAM) { // Only acknolwedge receipt of TCP packets
|
||||
lwipstack->__tcp_recved(conn->TCP_pcb, n);
|
||||
dwr(MSG_TRANSFER,"TCP RX <--- :: {TX: %.3f%%, RX: %.3f%%, sock=%x} :: %d bytes\n",
|
||||
DEBUG_TRANS("TCP RX <--- :: {TX: %.3f%%, RX: %.3f%%, sock=%x} :: %ld bytes\n",
|
||||
(float)conn->txsz / max, (float)conn->rxsz / max, conn->sock, n);
|
||||
}
|
||||
} else {
|
||||
dwr(MSG_DEBUG_EXTRA," processReceivedData(): errno = %d, rxsz = %d\n", errno, conn->rxsz);
|
||||
DEBUG_EXTRA(" processReceivedData(): errno = %d, rxsz = %d\n", errno, conn->rxsz);
|
||||
_phy.setNotifyWritable(conn->sock, false);
|
||||
}
|
||||
}
|
||||
@@ -490,16 +488,15 @@ void NetconEthernetTap::processReceivedData(PhySocket *sock,void **uptr,bool lwi
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void NetconEthernetTap::phyOnUnixWritable(PhySocket *sock,void **uptr,bool lwip_invoked)
|
||||
{
|
||||
//dwr(MSG_DEBUG_EXTRA," phyOnUnixWritable(sock=%p): lwip_invoked = %d\n", (void*)&sock, lwip_invoked);
|
||||
//DEBUG_EXTRA(" phyOnUnixWritable(sock=%p): lwip_invoked = %d\n", (void*)&sock, lwip_invoked);
|
||||
processReceivedData(sock,uptr,lwip_invoked);
|
||||
}
|
||||
|
||||
void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "phyOnUnixData(%p), len = %d\n", (void*)&sock, len);
|
||||
DEBUG_EXTRA("phyOnUnixData(%p), len = %d\n", (void*)&sock, (int)len);
|
||||
uint64_t CANARY_num;
|
||||
pid_t pid, tid;
|
||||
ssize_t wlen = len;
|
||||
@@ -521,11 +518,11 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
|
||||
if(detected_rpc) {
|
||||
unloadRPC(data, pid, tid, timestamp, CANARY, cmd, payload);
|
||||
memcpy(&CANARY_num, CANARY, CANARY_SZ);
|
||||
dwr(MSG_DEBUG_EXTRA," <sock=%p> RPC: (pid=%d, tid=%d, timestamp=%s, cmd=%d)\n",
|
||||
DEBUG_EXTRA(" <sock=%p> RPC: (pid=%d, tid=%d, timestamp=%s, cmd=%d)\n",
|
||||
(void*)&sock, pid, tid, timestamp, cmd);
|
||||
|
||||
if(cmd == RPC_SOCKET) {
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_SOCKET\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_SOCKET\n", (void*)&sock);
|
||||
// Create new lwip socket and associate it with this sock
|
||||
struct socket_st socket_rpc;
|
||||
memcpy(&socket_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct socket_st));
|
||||
@@ -553,7 +550,7 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
|
||||
// Find job
|
||||
sockdata = jobmap[CANARY_num];
|
||||
if(!sockdata.first) {
|
||||
dwr(MSG_DEBUG," <sock=%p> unable to locate job entry for %llu\n", (void*)&sock, CANARY_num);
|
||||
DEBUG_INFO(" <sock=%p> unable to locate job entry for %llu\n", (void*)&sock, CANARY_num);
|
||||
return;
|
||||
} else
|
||||
foundJob = true;
|
||||
@@ -615,36 +612,36 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
|
||||
rpcSock = sockdata.first;
|
||||
buf = (unsigned char*)sockdata.second;
|
||||
unloadRPC(buf, pid, tid, timestamp, CANARY, cmd, payload);
|
||||
dwr(MSG_DEBUG_EXTRA," <sock=%p> RPC: (pid=%d, tid=%d, timestamp=%s, cmd=%d)\n",
|
||||
DEBUG_EXTRA(" <sock=%p> RPC: (pid=%d, tid=%d, timestamp=%s, cmd=%d)\n",
|
||||
(void*)&sock, pid, tid, timestamp, cmd);
|
||||
|
||||
switch(cmd) {
|
||||
case RPC_BIND:
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_BIND\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_BIND\n", (void*)&sock);
|
||||
struct bind_st bind_rpc;
|
||||
memcpy(&bind_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct bind_st));
|
||||
handleBind(sock, rpcSock, uptr, &bind_rpc);
|
||||
break;
|
||||
case RPC_LISTEN:
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_LISTEN\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_LISTEN\n", (void*)&sock);
|
||||
struct listen_st listen_rpc;
|
||||
memcpy(&listen_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct listen_st));
|
||||
handleListen(sock, rpcSock, uptr, &listen_rpc);
|
||||
break;
|
||||
case RPC_GETSOCKNAME:
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_GETSOCKNAME\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_GETSOCKNAME\n", (void*)&sock);
|
||||
struct getsockname_st getsockname_rpc;
|
||||
memcpy(&getsockname_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
|
||||
handleGetsockname(sock, rpcSock, uptr, &getsockname_rpc);
|
||||
break;
|
||||
case RPC_GETPEERNAME:
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_GETPEERNAME\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_GETPEERNAME\n", (void*)&sock);
|
||||
struct getsockname_st getpeername_rpc;
|
||||
memcpy(&getpeername_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct getsockname_st));
|
||||
handleGetpeername(sock, rpcSock, uptr, &getpeername_rpc);
|
||||
break;
|
||||
case RPC_CONNECT:
|
||||
dwr(MSG_DEBUG," <sock=%p> RPC_CONNECT\n", (void*)&sock);
|
||||
DEBUG_INFO(" <sock=%p> RPC_CONNECT\n", (void*)&sock);
|
||||
struct connect_st connect_rpc;
|
||||
memcpy(&connect_rpc, &buf[IDX_PAYLOAD+STRUCT_IDX], sizeof(struct connect_st));
|
||||
handleConnect(sock, rpcSock, conn, &connect_rpc);
|
||||
@@ -661,13 +658,13 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data,
|
||||
}
|
||||
|
||||
int NetconEthernetTap::sendReturnValue(PhySocket *sock, int retval, int _errno = 0){
|
||||
dwr(MSG_DEBUG_EXTRA," sendReturnValue(sock=%p)\n", (void*)&sock);
|
||||
DEBUG_EXTRA(" sendReturnValue(sock=%p)\n", (void*)&sock);
|
||||
return sendReturnValue(_phy.getDescriptor(sock), retval, _errno);
|
||||
}
|
||||
int NetconEthernetTap::sendReturnValue(int fd, int retval, int _errno = 0)
|
||||
{
|
||||
//#if !defined(USE_SOCKS_PROXY)
|
||||
dwr(MSG_DEBUG_EXTRA," sendReturnValue(): fd = %d, retval = %d, errno = %d\n", fd, retval, _errno);
|
||||
DEBUG_EXTRA(" sendReturnValue(): fd = %d, retval = %d, errno = %d\n", fd, retval, _errno);
|
||||
int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
|
||||
char retmsg[sz];
|
||||
memset(&retmsg, 0, sizeof(retmsg));
|
||||
@@ -697,7 +694,7 @@ void NetconEthernetTap::unloadRPC(void *data, pid_t &pid, pid_t &tid,
|
||||
|
||||
err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newPCB, err_t err)
|
||||
{
|
||||
dwr(MSG_DEBUG, "nc_accept(pcb=%p)\n", (void*)&newPCB);
|
||||
DEBUG_INFO("nc_accept(pcb=%p)\n", (void*)&newPCB);
|
||||
Larg *l = (Larg*)arg;
|
||||
Mutex::Lock _l(l->tap->_tcpconns_m);
|
||||
Connection *conn = l->conn;
|
||||
@@ -717,7 +714,7 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newPCB, err_t err)
|
||||
if(socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0) {
|
||||
if(errno < 0) {
|
||||
l->tap->sendReturnValue(conn, -1, errno);
|
||||
dwr(MSG_ERROR," nc_accept(): unable to create socketpair\n");
|
||||
DEBUG_ERROR(" nc_accept(): unable to create socketpair\n");
|
||||
return ERR_MEM;
|
||||
}
|
||||
}
|
||||
@@ -740,14 +737,14 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newPCB, err_t err)
|
||||
tcp_accepted(conn->TCP_pcb); // Let lwIP know that it can queue additional incoming connections
|
||||
return ERR_OK;
|
||||
} else
|
||||
dwr(MSG_ERROR," nc_accept(): can't locate Connection object for PCB.\n");
|
||||
DEBUG_ERROR(" nc_accept(): can't locate Connection object for PCB.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct pbuf * p, struct ip_addr * addr, u16_t port)
|
||||
{
|
||||
Larg *l = (Larg*)arg;
|
||||
//dwr(MSG_DEBUG_EXTRA, "nc_udp_recved(conn=%p,pcb=%p,port=%d)\n", (void*)&(l->conn), (void*)&upcb, port);
|
||||
//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;
|
||||
@@ -762,7 +759,7 @@ void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct
|
||||
if(p) {
|
||||
// Intra-API "packetization" scheme: [addr_len|addr|payload_len|payload]
|
||||
if(l->conn->rxsz == DEFAULT_UDP_RX_BUF_SZ) { // if UDP buffer full
|
||||
dwr(MSG_DEBUG, "nc_udp_recved(): UDP RX buffer full. Discarding oldest payload segment\n");
|
||||
DEBUG_INFO("nc_udp_recved(): UDP RX buffer full. Discarding oldest payload segment\n");
|
||||
memmove(l->conn->rxbuf, l->conn->rxbuf + ZT_MAX_MTU, DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU);
|
||||
addr_pos = l->conn->rxbuf + (DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU); // TODO:
|
||||
sz_pos = addr_pos + sizeof(struct sockaddr_storage);
|
||||
@@ -788,7 +785,7 @@ void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct
|
||||
if(tot) {
|
||||
l->conn->rxsz += ZT_MAX_MTU;
|
||||
memcpy(sz_pos, &tot, sizeof(tot));
|
||||
//dwr(MSG_DEBUG_EXTRA, " nc_udp_recved(): data_len = %d, rxsz = %d, addr_info_len = %d\n",
|
||||
//DEBUG_EXTRA(" nc_udp_recved(): data_len = %d, rxsz = %d, addr_info_len = %d\n",
|
||||
// tot, l->conn->rxsz, sizeof(u32_t) + sizeof(u16_t));
|
||||
l->tap->phyOnUnixWritable(l->conn->sock, NULL, true);
|
||||
l->tap->_phy.setNotifyWritable(l->conn->sock, true);
|
||||
@@ -800,13 +797,13 @@ void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct
|
||||
err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *PCB, struct pbuf *p, err_t err)
|
||||
{
|
||||
Larg *l = (Larg*)arg;
|
||||
dwr(MSG_DEBUG_EXTRA, "nc_recved(conn=%p,pcb=%p)\n", (void*)&(l->conn), (void*)&PCB);
|
||||
DEBUG_EXTRA("nc_recved(conn=%p,pcb=%p)\n", (void*)&(l->conn), (void*)&PCB);
|
||||
int tot = 0;
|
||||
struct pbuf* q = p;
|
||||
Mutex::Lock _l(l->tap->_tcpconns_m);
|
||||
|
||||
if(!l->conn) {
|
||||
dwr(MSG_ERROR," nc_recved(): no connection\n");
|
||||
DEBUG_ERROR(" nc_recved(): no connection\n");
|
||||
return ERR_OK;
|
||||
}
|
||||
if(p == NULL) {
|
||||
@@ -825,7 +822,7 @@ err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *PCB, struct pbuf *
|
||||
int avail = DEFAULT_TCP_RX_BUF_SZ - l->conn->rxsz;
|
||||
int len = p->len;
|
||||
if(avail < len)
|
||||
dwr(MSG_ERROR," nc_recved(): not enough room (%d bytes) on RX buffer\n", avail);
|
||||
DEBUG_ERROR(" nc_recved(): not enough room (%d bytes) on RX buffer\n", avail);
|
||||
memcpy(l->conn->rxbuf + (l->conn->rxsz), p->payload, len);
|
||||
l->conn->rxsz += len;
|
||||
p = p->next;
|
||||
@@ -844,7 +841,7 @@ err_t NetconEthernetTap::nc_recved(void *arg, struct tcp_pcb *PCB, struct pbuf *
|
||||
|
||||
err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *PCB, u16_t len)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "nc_sent(pcb=%p)\n", (void*)&PCB);
|
||||
DEBUG_EXTRA("nc_sent(pcb=%p)\n", (void*)&PCB);
|
||||
Larg *l = (Larg*)arg;
|
||||
Mutex::Lock _l(l->tap->_tcpconns_m);
|
||||
if(l->conn->probation && l->conn->txsz == 0){
|
||||
@@ -862,13 +859,13 @@ err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *PCB, u16_t len)
|
||||
|
||||
err_t NetconEthernetTap::nc_connected_proxy(void *arg, struct tcp_pcb *PCB, err_t err)
|
||||
{
|
||||
dwr(MSG_DEBUG, "nc_connected_proxy(pcb=%p)\n", (void*)&PCB);
|
||||
DEBUG_INFO("nc_connected_proxy(pcb=%p)\n", (void*)&PCB);
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *PCB, err_t err)
|
||||
{
|
||||
dwr(MSG_DEBUG, "nc_connected(pcb=%p)\n", (void*)&PCB);
|
||||
DEBUG_INFO("nc_connected(pcb=%p)\n", (void*)&PCB);
|
||||
Larg *l = (Larg*)arg;
|
||||
if(l && l->conn)
|
||||
l->tap->sendReturnValue(l->tap->_phy.getDescriptor(l->conn->rpcSock), ERR_OK);
|
||||
@@ -882,54 +879,54 @@ err_t NetconEthernetTap::nc_poll(void* arg, struct tcp_pcb *PCB)
|
||||
|
||||
void NetconEthernetTap::nc_err(void *arg, err_t err)
|
||||
{
|
||||
dwr(MSG_DEBUG,"nc_err() = %d\n", err);
|
||||
DEBUG_INFO("nc_err() = %d\n", err);
|
||||
Larg *l = (Larg*)arg;
|
||||
Mutex::Lock _l(l->tap->_tcpconns_m);
|
||||
|
||||
if(!l->conn)
|
||||
dwr(MSG_ERROR," nc_err(): connection is NULL!\n");
|
||||
DEBUG_ERROR(" nc_err(): connection is NULL!\n");
|
||||
int fd = l->tap->_phy.getDescriptor(l->conn->sock);
|
||||
|
||||
switch(err)
|
||||
{
|
||||
case ERR_MEM:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_MEM->ENOMEM\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_MEM->ENOMEM\n");
|
||||
l->tap->sendReturnValue(fd, -1, ENOMEM);
|
||||
break;
|
||||
case ERR_BUF:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_BUF->ENOBUFS\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_BUF->ENOBUFS\n");
|
||||
l->tap->sendReturnValue(fd, -1, ENOBUFS);
|
||||
break;
|
||||
case ERR_TIMEOUT:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_TIMEOUT->ETIMEDOUT\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_TIMEOUT->ETIMEDOUT\n");
|
||||
l->tap->sendReturnValue(fd, -1, ETIMEDOUT);
|
||||
break;
|
||||
case ERR_RTE:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_RTE->ENETUNREACH\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_RTE->ENETUNREACH\n");
|
||||
l->tap->sendReturnValue(fd, -1, ENETUNREACH);
|
||||
break;
|
||||
case ERR_INPROGRESS:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_INPROGRESS->EINPROGRESS\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_INPROGRESS->EINPROGRESS\n");
|
||||
l->tap->sendReturnValue(fd, -1, EINPROGRESS);
|
||||
break;
|
||||
case ERR_VAL:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_VAL->EINVAL\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_VAL->EINVAL\n");
|
||||
l->tap->sendReturnValue(fd, -1, EINVAL);
|
||||
break;
|
||||
case ERR_WOULDBLOCK:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_WOULDBLOCK->EWOULDBLOCK\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_WOULDBLOCK->EWOULDBLOCK\n");
|
||||
l->tap->sendReturnValue(fd, -1, EWOULDBLOCK);
|
||||
break;
|
||||
case ERR_USE:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_USE->EADDRINUSE\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_USE->EADDRINUSE\n");
|
||||
l->tap->sendReturnValue(fd, -1, EADDRINUSE);
|
||||
break;
|
||||
case ERR_ISCONN:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_ISCONN->EISCONN\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_ISCONN->EISCONN\n");
|
||||
l->tap->sendReturnValue(fd, -1, EISCONN);
|
||||
break;
|
||||
case ERR_ABRT:
|
||||
dwr(MSG_ERROR," nc_err(): ERR_ABRT->ECONNREFUSED\n");
|
||||
DEBUG_ERROR(" nc_err(): ERR_ABRT->ECONNREFUSED\n");
|
||||
l->tap->sendReturnValue(fd, -1, ECONNREFUSED);
|
||||
break;
|
||||
|
||||
@@ -953,7 +950,7 @@ void NetconEthernetTap::nc_err(void *arg, err_t err)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dwr(MSG_ERROR," nc_err(): closing connection\n");
|
||||
DEBUG_ERROR(" nc_err(): closing connection\n");
|
||||
l->tap->closeConnection(l->conn);
|
||||
}
|
||||
|
||||
@@ -966,7 +963,7 @@ void NetconEthernetTap::handleGetsockname(PhySocket *sock, PhySocket *rpcSock, v
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
Connection *conn = getConnection(sock);
|
||||
if(conn->local_addr == NULL){
|
||||
dwr(MSG_DEBUG_EXTRA," handleGetsockname(): No address info available. Is it bound?");
|
||||
DEBUG_EXTRA(" handleGetsockname(): No address info available. Is it bound?");
|
||||
struct sockaddr_storage storage;
|
||||
memset(&storage, 0, sizeof(struct sockaddr_storage));
|
||||
write(_phy.getDescriptor(rpcSock), NULL, sizeof(struct sockaddr_storage));
|
||||
@@ -980,7 +977,7 @@ void NetconEthernetTap::handleGetpeername(PhySocket *sock, PhySocket *rpcSock, v
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
Connection *conn = getConnection(sock);
|
||||
if(conn->peer_addr == NULL){
|
||||
dwr(MSG_DEBUG_EXTRA," handleGetpeername(): No peer address info available. Is it connected?");
|
||||
DEBUG_EXTRA(" handleGetpeername(): No peer address info available. Is it connected?");
|
||||
struct sockaddr_storage storage;
|
||||
memset(&storage, 0, sizeof(struct sockaddr_storage));
|
||||
write(_phy.getDescriptor(rpcSock), NULL, sizeof(struct sockaddr_storage));
|
||||
@@ -997,7 +994,7 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u
|
||||
ip_addr_t connAddr;
|
||||
if(!_ips.size()) {
|
||||
// We haven't been given an address yet. Binding at this stage is premature
|
||||
dwr(MSG_ERROR, " handleBind(): ZT address hasn't been provided. Cannot bind yet.");
|
||||
DEBUG_ERROR(" handleBind(): ZT address hasn't been provided. Cannot bind yet.");
|
||||
sendReturnValue(rpcSock, -1, ENOMEM);
|
||||
return;
|
||||
}
|
||||
@@ -1008,11 +1005,11 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_DEBUG," handleBind(): %d.%d.%d.%d : %d\n", d[0],d[1],d[2],d[3], port);
|
||||
DEBUG_INFO(" handleBind(): %d.%d.%d.%d : %d\n", d[0],d[1],d[2],d[3], port);
|
||||
|
||||
connAddr.addr = *((u32_t *)_ips[0].rawIpData());
|
||||
Connection *conn = getConnection(sock);
|
||||
dwr(MSG_DEBUG," handleBind(sock=%p,fd=%d,port=%d)\n", (void*)&sock, bind_rpc->fd, port);
|
||||
DEBUG_INFO(" handleBind(sock=%p,fd=%d,port=%d)\n", (void*)&sock, bind_rpc->fd, port);
|
||||
if(conn) {
|
||||
if(conn->type == SOCK_DGRAM) {
|
||||
#if defined(__ANDROID__)
|
||||
@@ -1036,7 +1033,7 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u
|
||||
if(conn->TCP_pcb->state == CLOSED){
|
||||
err = lwipstack->__tcp_bind(conn->TCP_pcb, &connAddr, port);
|
||||
if(err != ERR_OK) {
|
||||
dwr(MSG_ERROR," handleBind(): err = %d\n", err);
|
||||
DEBUG_ERROR(" handleBind(): err = %d\n", err);
|
||||
if(err == ERR_USE)
|
||||
sendReturnValue(rpcSock, -1, EADDRINUSE);
|
||||
if(err == ERR_MEM)
|
||||
@@ -1048,20 +1045,20 @@ void NetconEthernetTap::handleBind(PhySocket *sock, PhySocket *rpcSock, void **u
|
||||
sendReturnValue(rpcSock, ERR_OK, ERR_OK); // Success
|
||||
}
|
||||
} else {
|
||||
dwr(MSG_ERROR," handleBind(): PCB (conn=%p,pcb=%p) not in CLOSED state. Ignoring BIND request.\n",
|
||||
DEBUG_ERROR(" handleBind(): PCB (conn=%p,pcb=%p) not in CLOSED state. Ignoring BIND request.\n",
|
||||
(void*)&conn, (void*)&conn->TCP_pcb);
|
||||
sendReturnValue(rpcSock, -1, EINVAL);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dwr(MSG_ERROR," handleBind(): unable to locate Connection.\n");
|
||||
DEBUG_ERROR(" handleBind(): unable to locate Connection.\n");
|
||||
sendReturnValue(rpcSock, -1, EBADF);
|
||||
}
|
||||
}
|
||||
|
||||
void NetconEthernetTap::handleListen(PhySocket *sock, PhySocket *rpcSock, void **uptr, struct listen_st *listen_rpc)
|
||||
{
|
||||
dwr(MSG_DEBUG, "handleListen(sock=%p)\n", (void*)&sock);
|
||||
DEBUG_INFO("handleListen(sock=%p)\n", (void*)&sock);
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
Connection *conn = getConnection(sock);
|
||||
|
||||
@@ -1071,12 +1068,12 @@ void NetconEthernetTap::handleListen(PhySocket *sock, PhySocket *rpcSock, void *
|
||||
return;
|
||||
}
|
||||
if(!conn) {
|
||||
dwr(MSG_ERROR," handleListen(): unable to locate Connection.\n");
|
||||
DEBUG_ERROR(" handleListen(): unable to locate Connection.\n");
|
||||
sendReturnValue(rpcSock, -1, EBADF);
|
||||
return;
|
||||
}
|
||||
if(conn->TCP_pcb->state == LISTEN) {
|
||||
dwr(MSG_ERROR," handleListen(): PCB is already in listening state.\n");
|
||||
DEBUG_ERROR(" handleListen(): PCB is already in listening state.\n");
|
||||
sendReturnValue(rpcSock, ERR_OK, ERR_OK);
|
||||
return;
|
||||
}
|
||||
@@ -1103,19 +1100,19 @@ Connection * NetconEthernetTap::handleSocketProxy(PhySocket *sock, int socket_ty
|
||||
{
|
||||
Connection *conn = getConnection(sock);
|
||||
if(!conn){
|
||||
dwr(MSG_DEBUG, "handleSocketProxy(sock=%p): Unable to locate Connection object for this PhySocket\n", (void*)&sock);
|
||||
DEBUG_INFO("handleSocketProxy(sock=%p): Unable to locate Connection object for this PhySocket\n", (void*)&sock);
|
||||
return NULL;
|
||||
}
|
||||
dwr(MSG_DEBUG, "handleSocketProxy(sock=%p)\n", (void*)&sock);
|
||||
DEBUG_INFO("handleSocketProxy(sock=%p)\n", (void*)&sock);
|
||||
struct udp_pcb *new_udp_PCB = NULL;
|
||||
struct tcp_pcb *new_tcp_PCB = NULL;
|
||||
if(socket_type == SOCK_DGRAM) {
|
||||
dwr(MSG_DEBUG, " handleSocketProxy(): SOCK_DGRAM\n");
|
||||
DEBUG_INFO(" handleSocketProxy(): SOCK_DGRAM\n");
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
new_udp_PCB = lwipstack->__udp_new();
|
||||
}
|
||||
else if(socket_type == SOCK_STREAM) {
|
||||
dwr(MSG_DEBUG, " handleSocketProxy(): SOCK_STREAM\n");
|
||||
DEBUG_INFO(" handleSocketProxy(): SOCK_STREAM\n");
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
new_tcp_PCB = lwipstack->__tcp_new();
|
||||
}
|
||||
@@ -1126,25 +1123,25 @@ Connection * NetconEthernetTap::handleSocketProxy(PhySocket *sock, int socket_ty
|
||||
conn->peer_addr = NULL;
|
||||
if(conn->type == SOCK_DGRAM) conn->UDP_pcb = new_udp_PCB;
|
||||
if(conn->type == SOCK_STREAM) conn->TCP_pcb = new_tcp_PCB;
|
||||
dwr(MSG_DEBUG, " handleSocketProxy(): Updated sock=%p\n", (void*)&sock);
|
||||
DEBUG_INFO(" handleSocketProxy(): Updated sock=%p\n", (void*)&sock);
|
||||
return conn;
|
||||
}
|
||||
dwr(MSG_ERROR," handleSocketProxy(): Memory not available for new PCB\n");
|
||||
DEBUG_ERROR(" handleSocketProxy(): Memory not available for new PCB\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Connection * NetconEthernetTap::handleSocket(PhySocket *sock, void **uptr, struct socket_st* socket_rpc)
|
||||
{
|
||||
dwr(MSG_DEBUG, "handleSocket(sock=%p)\n", (void*)&sock);
|
||||
DEBUG_INFO("handleSocket(sock=%p)\n", (void*)&sock);
|
||||
struct udp_pcb *new_udp_PCB = NULL;
|
||||
struct tcp_pcb *new_tcp_PCB = NULL;
|
||||
if(socket_rpc->socket_type == SOCK_DGRAM) {
|
||||
dwr(MSG_DEBUG, "handleSocket(): SOCK_DGRAM\n");
|
||||
DEBUG_INFO("handleSocket(): SOCK_DGRAM\n");
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
new_udp_PCB = lwipstack->__udp_new();
|
||||
}
|
||||
else if(socket_rpc->socket_type == SOCK_STREAM) {
|
||||
dwr(MSG_DEBUG, "handleSocket(): SOCK_STREAM\n");
|
||||
DEBUG_INFO("handleSocket(): SOCK_STREAM\n");
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
new_tcp_PCB = lwipstack->__tcp_new();
|
||||
}
|
||||
@@ -1160,14 +1157,14 @@ Connection * NetconEthernetTap::handleSocket(PhySocket *sock, void **uptr, struc
|
||||
_Connections.push_back(newConn);
|
||||
return newConn;
|
||||
}
|
||||
dwr(MSG_ERROR," handleSocket(): Memory not available for new PCB\n");
|
||||
DEBUG_ERROR(" handleSocket(): Memory not available for new PCB\n");
|
||||
sendReturnValue(_phy.getDescriptor(sock), -1, ENOMEM);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *rawAddr)
|
||||
{
|
||||
dwr(MSG_DEBUG, "handleConnectProxy(%p)\n", (void*)&sock);
|
||||
DEBUG_INFO("handleConnectProxy(%p)\n", (void*)&sock);
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
int port = rawAddr->sin_port;
|
||||
ip_addr_t connAddr = convert_ip(rawAddr);
|
||||
@@ -1175,13 +1172,13 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
|
||||
|
||||
Connection *conn = getConnection(sock);
|
||||
if(!conn) {
|
||||
dwr(MSG_DEBUG, " handleConnectProxy(): Unable to locate Connection object for (sock=%p)\n", (void*)&sock);
|
||||
DEBUG_INFO(" handleConnectProxy(): Unable to locate Connection object for (sock=%p)\n", (void*)&sock);
|
||||
return -1;
|
||||
}
|
||||
if(conn->type == SOCK_DGRAM) {
|
||||
// Generates no network traffic
|
||||
if((err = lwipstack->__udp_connect(conn->UDP_pcb,&connAddr,port)) < 0)
|
||||
dwr(MSG_DEBUG, "handleConnectProxy(): Error while connecting to with UDP\n");
|
||||
DEBUG_INFO("handleConnectProxy(): Error while connecting to with UDP\n");
|
||||
lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn));
|
||||
errno = ERR_OK;
|
||||
return 0;
|
||||
@@ -1199,10 +1196,10 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_DEBUG," handleConnectProxy(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
|
||||
dwr(MSG_DEBUG," handleConnectProxy(): pcb->state = %x\n", conn->TCP_pcb->state);
|
||||
DEBUG_INFO(" handleConnectProxy(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
|
||||
DEBUG_INFO(" handleConnectProxy(): pcb->state = %x\n", conn->TCP_pcb->state);
|
||||
if(conn->TCP_pcb->state != CLOSED) {
|
||||
dwr(MSG_DEBUG," handleConnectProxy(): PCB != CLOSED, cannot connect using this PCB\n");
|
||||
DEBUG_INFO(" handleConnectProxy(): PCB != CLOSED, cannot connect using this PCB\n");
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
}
|
||||
@@ -1246,7 +1243,7 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
|
||||
// that's it!
|
||||
// - Most instances of a retval for a connect() should happen
|
||||
// in the nc_connect() and nc_err() callbacks!
|
||||
dwr(MSG_ERROR," handleConnectProxy(): unable to connect\n");
|
||||
DEBUG_ERROR(" handleConnectProxy(): unable to connect\n");
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
}
|
||||
@@ -1254,7 +1251,7 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
|
||||
conn->listening=true;
|
||||
return 0;
|
||||
} else {
|
||||
dwr(MSG_ERROR," handleConnectProxy(): could not locate PCB based on their fd\n");
|
||||
DEBUG_ERROR(" handleConnectProxy(): could not locate PCB based on their fd\n");
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
@@ -1263,7 +1260,7 @@ int NetconEthernetTap::handleConnectProxy(PhySocket *sock, struct sockaddr_in *r
|
||||
|
||||
void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Connection *conn, struct connect_st* connect_rpc)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "handleConnect(%p)\n", (void*)&sock);
|
||||
DEBUG_EXTRA("handleConnect(%p)\n", (void*)&sock);
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
struct sockaddr_in *rawAddr = (struct sockaddr_in *) &connect_rpc->addr;
|
||||
int port = lwipstack->__lwip_ntohs(rawAddr->sin_port);
|
||||
@@ -1275,12 +1272,12 @@ void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Conne
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_DEBUG," handleConnect(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
|
||||
DEBUG_INFO(" handleConnect(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], port);
|
||||
|
||||
if(conn->type == SOCK_DGRAM) {
|
||||
// Generates no network traffic
|
||||
if((err = lwipstack->__udp_connect(conn->UDP_pcb,&connAddr,port)) < 0)
|
||||
dwr(MSG_ERROR, "handleConnect(): Error while connecting to with UDP\n");
|
||||
DEBUG_ERROR("handleConnect(): Error while connecting to with UDP\n");
|
||||
lwipstack->__udp_recv(conn->UDP_pcb, nc_udp_recved, new Larg(this, conn));
|
||||
sendReturnValue(rpcSock, 0, ERR_OK);
|
||||
return;
|
||||
@@ -1292,9 +1289,9 @@ void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Conne
|
||||
lwipstack->__tcp_poll(conn->TCP_pcb, nc_poll, APPLICATION_POLL_FREQ);
|
||||
lwipstack->__tcp_arg(conn->TCP_pcb, new Larg(this, conn));
|
||||
|
||||
dwr(MSG_DEBUG_EXTRA," handleConnect(): pcb->state = %x\n", conn->TCP_pcb->state);
|
||||
DEBUG_EXTRA(" handleConnect(): pcb->state = %x\n", conn->TCP_pcb->state);
|
||||
if(conn->TCP_pcb->state != CLOSED) {
|
||||
dwr(MSG_DEBUG," handleConnect(): PCB != CLOSED, cannot connect using this PCB\n");
|
||||
DEBUG_INFO(" handleConnect(): PCB != CLOSED, cannot connect using this PCB\n");
|
||||
sendReturnValue(rpcSock, -1, EAGAIN);
|
||||
return;
|
||||
}
|
||||
@@ -1339,48 +1336,48 @@ void NetconEthernetTap::handleConnect(PhySocket *sock, PhySocket *rpcSock, Conne
|
||||
// that's it!
|
||||
// - Most instances of a retval for a connect() should happen
|
||||
// in the nc_connect() and nc_err() callbacks!
|
||||
dwr(MSG_ERROR," handleConnect(): unable to connect\n");
|
||||
DEBUG_ERROR(" handleConnect(): unable to connect\n");
|
||||
sendReturnValue(rpcSock, -1, EAGAIN);
|
||||
}
|
||||
// Everything seems to be ok, but we don't have enough info to retval
|
||||
conn->listening=true;
|
||||
conn->rpcSock=rpcSock; // used for return value from lwip CB
|
||||
} else {
|
||||
dwr(MSG_ERROR," handleConnect(): could not locate PCB based on their fd\n");
|
||||
DEBUG_ERROR(" handleConnect(): could not locate PCB based on their fd\n");
|
||||
sendReturnValue(rpcSock, -1, EBADF);
|
||||
}
|
||||
}
|
||||
|
||||
void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "handleWrite(conn=%p)\n", (void*)&conn);
|
||||
DEBUG_EXTRA("handleWrite(conn=%p)\n", (void*)&conn);
|
||||
if(!conn || (!conn->TCP_pcb && !conn->UDP_pcb)) {
|
||||
dwr(MSG_ERROR," handleWrite(): invalid connection\n");
|
||||
DEBUG_ERROR(" handleWrite(): invalid connection\n");
|
||||
return;
|
||||
}
|
||||
if(conn->type == SOCK_DGRAM) {
|
||||
if(!conn->UDP_pcb) {
|
||||
dwr(MSG_ERROR, " handleWrite(): type = SOCK_DGRAM, invalid UDP_pcb\n");
|
||||
DEBUG_ERROR(" handleWrite(): type = SOCK_DGRAM, invalid UDP_pcb\n");
|
||||
return;
|
||||
}
|
||||
// TODO: Packet re-assembly hasn't yet been tested with lwIP so UDP packets are limited to MTU-sized chunks
|
||||
int udp_trans_len = conn->txsz < ZT_UDP_DEFAULT_PAYLOAD_MTU ? conn->txsz : ZT_UDP_DEFAULT_PAYLOAD_MTU;
|
||||
|
||||
dwr(MSG_DEBUG_EXTRA, " handleWrite(): Allocating pbuf chain of size (%d) for UDP packet, TXSZ = %d\n", udp_trans_len, conn->txsz);
|
||||
DEBUG_EXTRA(" handleWrite(): Allocating pbuf chain of size (%d) for UDP packet, TXSZ = %d\n", udp_trans_len, conn->txsz);
|
||||
struct pbuf * pb = lwipstack->__pbuf_alloc(PBUF_TRANSPORT, udp_trans_len, PBUF_POOL);
|
||||
if(!pb){
|
||||
dwr(MSG_ERROR, " handleWrite(): unable to allocate new pbuf of size (%d)\n", conn->txsz);
|
||||
DEBUG_ERROR(" handleWrite(): unable to allocate new pbuf of size (%d)\n", conn->txsz);
|
||||
return;
|
||||
}
|
||||
memcpy(pb->payload, conn->txbuf, udp_trans_len);
|
||||
int err = lwipstack->__udp_send(conn->UDP_pcb, pb);
|
||||
|
||||
if(err == ERR_MEM) {
|
||||
dwr(MSG_ERROR, " handleWrite(): Error sending packet. Out of memory\n");
|
||||
DEBUG_ERROR(" handleWrite(): Error sending packet. Out of memory\n");
|
||||
} else if(err == ERR_RTE) {
|
||||
dwr(MSG_ERROR, " handleWrite(): Could not find route to destinations address\n");
|
||||
DEBUG_ERROR(" handleWrite(): Could not find route to destinations address\n");
|
||||
} else if(err != ERR_OK) {
|
||||
dwr(MSG_ERROR, " handleWrite(): Error sending packet - %d\n", err);
|
||||
DEBUG_ERROR(" handleWrite(): Error sending packet - %d\n", err);
|
||||
} else {
|
||||
// Success
|
||||
int buf_remaining = (conn->txsz)-udp_trans_len;
|
||||
@@ -1398,7 +1395,7 @@ void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
|
||||
dwr(MSG_TRANSFER,"UDP TX ---> :: {TX: ------, RX: ------, sock=%x} :: %d bytes (%d.%d.%d.%d:%d)\n",
|
||||
DEBUG_TRANS("UDP TX ---> :: {TX: ------, RX: ------, sock=%x} :: %d bytes (%d.%d.%d.%d:%d)\n",
|
||||
conn->sock, udp_trans_len, d[0], d[1], d[2], d[3], port);
|
||||
#endif
|
||||
}
|
||||
@@ -1407,7 +1404,7 @@ void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
}
|
||||
else if(conn->type == SOCK_STREAM) {
|
||||
if(!conn->TCP_pcb) {
|
||||
dwr(MSG_ERROR, " handleWrite(): type = SOCK_STREAM, invalid TCP_pcb\n");
|
||||
DEBUG_ERROR(" handleWrite(): type = SOCK_STREAM, invalid TCP_pcb\n");
|
||||
return;
|
||||
}
|
||||
// How much we are currently allowed to write to the connection
|
||||
@@ -1419,7 +1416,7 @@ void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
// corresponding PhySocket until nc_sent() is called and confirms that there is
|
||||
// now space on the buffer
|
||||
if(!conn->probation) {
|
||||
dwr(MSG_ERROR," handleWrite(): sndbuf == 0, LWIP stack is full\n");
|
||||
DEBUG_ERROR(" handleWrite(): sndbuf == 0, LWIP stack is full\n");
|
||||
_phy.setNotifyReadable(conn->sock, false);
|
||||
conn->probation = true;
|
||||
}
|
||||
@@ -1438,9 +1435,9 @@ void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
err = lwipstack->__tcp_write(conn->TCP_pcb, &conn->txbuf, r, TCP_WRITE_FLAG_COPY);
|
||||
lwipstack->__tcp_output(conn->TCP_pcb);
|
||||
if(err != ERR_OK) {
|
||||
dwr(MSG_ERROR," handleWrite(): error while writing to PCB, (err = %d)\n", err);
|
||||
DEBUG_ERROR(" handleWrite(): error while writing to PCB, (err = %d)\n", err);
|
||||
if(err == -1)
|
||||
dwr(MSG_ERROR," handleWrite(): out of memory\n");
|
||||
DEBUG_ERROR(" handleWrite(): out of memory\n");
|
||||
return;
|
||||
} else {
|
||||
sz = (conn->txsz)-r;
|
||||
@@ -1448,7 +1445,7 @@ void NetconEthernetTap::handleWrite(Connection *conn)
|
||||
memmove(&conn->txbuf, (conn->txbuf+r), sz);
|
||||
conn->txsz -= r;
|
||||
int max = conn->type == SOCK_STREAM ? DEFAULT_TCP_TX_BUF_SZ : DEFAULT_UDP_TX_BUF_SZ;
|
||||
dwr(MSG_TRANSFER,"TCP TX ---> :: {TX: %.3f%%, RX: %.3f%%, sock=%p} :: %d bytes\n",
|
||||
DEBUG_TRANS("TCP TX ---> :: {TX: %.3f%%, RX: %.3f%%, sock=%p} :: %d bytes\n",
|
||||
(float)conn->txsz / (float)max, (float)conn->rxsz / max, (void*)&conn->sock, r);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
#if defined(SDK_INTERCEPT)
|
||||
#if defined(_SDK_INTERCEPT_)
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
@@ -42,7 +42,7 @@
|
||||
#include <pthread.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
//#include <sys/socket.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/resource.h>
|
||||
@@ -59,9 +59,8 @@
|
||||
#include "SDK_Debug.h"
|
||||
#include "SDK_RPC.h"
|
||||
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
pthread_key_t thr_id_key;
|
||||
char *api_netpath;
|
||||
//char *api_netpath;
|
||||
|
||||
// externs common between SDK_Intercept and SDK_Socket from SDK.h
|
||||
#if defined(__linux__)
|
||||
@@ -93,7 +92,7 @@ char *api_netpath;
|
||||
|
||||
extern void load_symbols()
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA,"load_symbols\n");
|
||||
DEBUG_EXTRA("");
|
||||
#if defined(__linux__)
|
||||
realaccept4 = dlsym(RTLD_NEXT, "accept4");
|
||||
#if !defined(__ANDROID__)
|
||||
@@ -122,7 +121,7 @@ char *api_netpath;
|
||||
// Return whether 'intercept' API is enabled for this thread
|
||||
|
||||
bool check_intercept_enabled() {
|
||||
dwr(MSG_DEBUG_EXTRA, "check_intercept_enabled()\n");
|
||||
DEBUG_EXTRA("");
|
||||
if(!realconnect){
|
||||
load_symbols();
|
||||
}
|
||||
@@ -157,7 +156,7 @@ char *api_netpath;
|
||||
addr_un = (struct sockaddr_un*)&addr;
|
||||
return strcmp(addr_un->sun_path, api_netpath) == 0;
|
||||
}
|
||||
dwr(MSG_DEBUG,"connected_to_service(): Not connected to service\n");
|
||||
DEBUG_INFO("connected_to_service(): Not connected to service\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -170,7 +169,7 @@ char *api_netpath;
|
||||
#if !defined(__ANDROID__)
|
||||
ssize_t sendto(SENDTO_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "sendto(%d, ..., %d)\n", fd, len);
|
||||
DEBUG_INFO("fd=%d, len=%d\n", fd, (int)len);
|
||||
//if (!check_intercept_enabled())
|
||||
return realsendto(fd, buf, len, flags, addr, addrlen);
|
||||
return zts_sendto(fd, buf, len, flags, addr, addrlen);
|
||||
@@ -185,7 +184,7 @@ char *api_netpath;
|
||||
#if !defined(__ANDROID__)
|
||||
ssize_t sendmsg(SENDMSG_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "sendmsg()\n");
|
||||
DEBUG_INFO("");
|
||||
//if(!check_intercept_enabled())
|
||||
return realsendmsg(fd, msg, flags);
|
||||
zts_sendmsg(fd, msg, flags);
|
||||
@@ -201,7 +200,7 @@ char *api_netpath;
|
||||
#if !defined(__ANDROID__)
|
||||
ssize_t recvfrom(RECVFROM_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "recvfrom(%d)\n", socket);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
if(!check_intercept_enabled())
|
||||
return realrecvfrom(fd, buf, len, flags, addr, addrlen);
|
||||
return zts_recvfrom(fd, buf, len, flags, addr, addrlen);
|
||||
@@ -216,7 +215,7 @@ char *api_netpath;
|
||||
#if !defined(__ANDROID__)
|
||||
ssize_t recvmsg(RECVMSG_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "recvmsg(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
//if(!check_intercept_enabled())
|
||||
return realrecvmsg(fd, msg, flags);
|
||||
return zts_recvmsg(fd, msg, flags);
|
||||
@@ -230,7 +229,7 @@ char *api_netpath;
|
||||
|
||||
int setsockopt(SETSOCKOPT_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "setsockopt(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
if (!check_intercept_enabled())
|
||||
return realsetsockopt(fd, level, optname, optval, optlen);
|
||||
#if defined(__linux__)
|
||||
@@ -253,7 +252,7 @@ char *api_netpath;
|
||||
|
||||
int getsockopt(GETSOCKOPT_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "getsockopt(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
if (!check_intercept_enabled() || !connected_to_service(fd))
|
||||
return realgetsockopt(fd, level, optname, optval, optlen);
|
||||
return zts_getsockopt(fd, level, optname, optval, optlen);
|
||||
@@ -265,15 +264,15 @@ char *api_netpath;
|
||||
// int socket_family, int socket_type, int protocol
|
||||
|
||||
int socket(SOCKET_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "socket()\n");
|
||||
{
|
||||
DEBUG_INFO();
|
||||
if (!check_intercept_enabled() && socket_type) {
|
||||
int err = realsocket(socket_family, socket_type, protocol);
|
||||
if(err < 0) {
|
||||
perror("socket:\n");
|
||||
}
|
||||
else {
|
||||
dwr(MSG_DEBUG, " socket() = %d\n", err);
|
||||
DEBUG_INFO("err=%d", err);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@@ -284,7 +283,7 @@ char *api_netpath;
|
||||
#endif
|
||||
|| socket_family == AF_UNIX) {
|
||||
int err = realsocket(socket_family, socket_type, protocol);
|
||||
dwr(MSG_DEBUG,"realsocket() = %d\n", err);
|
||||
DEBUG_BLANK("realsocket(): err=%d\n", err);
|
||||
return err;
|
||||
}
|
||||
return zts_socket(socket_family, socket_type, protocol);
|
||||
@@ -297,14 +296,14 @@ char *api_netpath;
|
||||
|
||||
int connect(CONNECT_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG, "connect(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
struct sockaddr_in *connaddr;
|
||||
connaddr = (struct sockaddr_in *)addr;
|
||||
if(addr->sa_family == AF_LOCAL || addr->sa_family == AF_UNIX) {
|
||||
struct sockaddr_storage storage;
|
||||
memcpy(&storage, addr, addrlen);
|
||||
struct sockaddr_un *s_un = (struct sockaddr_un*)&storage;
|
||||
dwr(MSG_DEBUG, "connect(): address = %s\n", s_un->sun_path);
|
||||
DEBUG_INFO("addr=%s\n", s_un->sun_path);
|
||||
}
|
||||
|
||||
int port = connaddr->sin_port;
|
||||
@@ -314,7 +313,7 @@ char *api_netpath;
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_DEBUG,"connect(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], ntohs(port));
|
||||
DEBUG_INFO("addr=%d.%d.%d.%d:%d\n", d[0],d[1],d[2],d[3], ntohs(port));
|
||||
|
||||
if(!check_intercept_enabled())
|
||||
return realconnect(fd, addr, addrlen);
|
||||
@@ -360,7 +359,7 @@ char *api_netpath;
|
||||
|
||||
int bind(BIND_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG,"bind(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
// make sure we don't touch any standard outputs
|
||||
if(fd == 0 || fd == 1 || fd == 2)
|
||||
return(realbind(fd, addr, addrlen));
|
||||
@@ -373,7 +372,7 @@ char *api_netpath;
|
||||
#endif
|
||||
|| connaddr->sin_family == AF_UNIX) {
|
||||
int err = realbind(fd, addr, addrlen);
|
||||
dwr(MSG_DEBUG,"realbind, err = %d\n", err);
|
||||
DEBUG_BLANK("realbind(): err=%d", err);
|
||||
return err;
|
||||
}
|
||||
int port = connaddr->sin_port;
|
||||
@@ -383,7 +382,7 @@ char *api_netpath;
|
||||
d[1] = (ip >> 8) & 0xFF;
|
||||
d[2] = (ip >> 16) & 0xFF;
|
||||
d[3] = (ip >> 24) & 0xFF;
|
||||
dwr(MSG_DEBUG,"bind(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], ntohs(port));
|
||||
DEBUG_INFO("addr=%d.%d.%d.%d:%d\n", d[0],d[1],d[2],d[3], ntohs(port));
|
||||
|
||||
int sock_type;
|
||||
socklen_t sock_type_len = sizeof(sock_type);
|
||||
@@ -418,7 +417,7 @@ char *api_netpath;
|
||||
|
||||
#if defined(__linux__)
|
||||
int accept4(ACCEPT4_SIG) {
|
||||
dwr(MSG_DEBUG,"accept4(%d):\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
return zts_accept4(fd, addr, addrlen, flags);
|
||||
}
|
||||
#endif
|
||||
@@ -429,7 +428,7 @@ char *api_netpath;
|
||||
// int fd struct sockaddr *addr, socklen_t *addrlen
|
||||
|
||||
int accept(ACCEPT_SIG) {
|
||||
dwr(MSG_DEBUG,"accept(%d):\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
if (!check_intercept_enabled())
|
||||
return realaccept(fd, addr, addrlen);
|
||||
|
||||
@@ -437,7 +436,7 @@ char *api_netpath;
|
||||
if(fcntl(fd, F_GETFD) < 0) {
|
||||
return -1;
|
||||
errno = EBADF;
|
||||
dwr(MSG_DEBUG,"EBADF\n");
|
||||
DEBUG_INFO("EBADF\n");
|
||||
return -1;
|
||||
}
|
||||
// Check that it is a socket
|
||||
@@ -445,13 +444,13 @@ char *api_netpath;
|
||||
socklen_t opt_len;
|
||||
if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *) &opt, &opt_len) < 0) {
|
||||
errno = ENOTSOCK;
|
||||
dwr(MSG_DEBUG,"ENOTSOCK\n");
|
||||
DEBUG_INFO("ENOTSOCK\n");
|
||||
return -1;
|
||||
}
|
||||
// Check that this socket supports accept()
|
||||
if(!(opt && (SOCK_STREAM | SOCK_SEQPACKET))) {
|
||||
errno = EOPNOTSUPP;
|
||||
dwr(MSG_DEBUG,"EOPNOTSUPP\n");
|
||||
DEBUG_INFO("EOPNOTSUPP\n");
|
||||
return -1;
|
||||
}
|
||||
// Check that we haven't hit the soft-limit file descriptors allowed
|
||||
@@ -459,18 +458,18 @@ char *api_netpath;
|
||||
getrlimit(RLIMIT_NOFILE, &rl);
|
||||
if(fd >= rl.rlim_cur){
|
||||
errno = EMFILE;
|
||||
dwr(MSG_DEBUG,"EMFILE\n");
|
||||
DEBUG_INFO("EMFILE\n");
|
||||
return -1;
|
||||
}
|
||||
// Check address length
|
||||
if(addrlen < 0) {
|
||||
errno = EINVAL;
|
||||
dwr(MSG_DEBUG,"EINVAL\n");
|
||||
DEBUG_INFO("EINVAL\n");
|
||||
return -1;
|
||||
}
|
||||
// redirect calls for standard I/O descriptors to kernel
|
||||
if(fd == 0 || fd == 1 || fd == 2){
|
||||
dwr(MSG_DEBUG,"realaccept():\n");
|
||||
DEBUG_BLANK("realaccept(): ");
|
||||
return(realaccept(fd, addr, addrlen));
|
||||
}
|
||||
|
||||
@@ -484,7 +483,7 @@ char *api_netpath;
|
||||
|
||||
int listen(LISTEN_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG,"listen(%d):\n", fd);
|
||||
DEBUG_INFO("listen(%d):\n", fd);
|
||||
if (!check_intercept_enabled())
|
||||
return reallisten(fd, backlog);
|
||||
|
||||
@@ -521,7 +520,7 @@ char *api_netpath;
|
||||
// int fd
|
||||
|
||||
int close(CLOSE_SIG) {
|
||||
dwr(MSG_DEBUG, " close(%d)\n", fd);
|
||||
DEBUG_INFO(" close(%d)\n", fd);
|
||||
if(!check_intercept_enabled()) {
|
||||
return realclose(fd);
|
||||
}
|
||||
@@ -535,14 +534,14 @@ char *api_netpath;
|
||||
|
||||
int getsockname(GETSOCKNAME_SIG)
|
||||
{
|
||||
dwr(MSG_DEBUG,"getsockname(%d):\n", fd);
|
||||
DEBUG_INFO("getsockname(%d):\n", fd);
|
||||
#if !defined(__IOS__)
|
||||
if (!check_intercept_enabled())
|
||||
return realgetsockname(fd, addr, addrlen);
|
||||
#endif
|
||||
dwr(MSG_DEBUG,"getsockname(%d)\n", fd);
|
||||
DEBUG_INFO("getsockname(%d)\n", fd);
|
||||
if(!connected_to_service(fd)) {
|
||||
dwr(MSG_DEBUG,"getsockname(): not used by service\n");
|
||||
DEBUG_INFO("getsockname(): not used by service\n");
|
||||
return realgetsockname(fd, addr, addrlen);
|
||||
}
|
||||
return zts_getsockname(fd, addr, addrlen);
|
||||
@@ -570,7 +569,7 @@ char *api_netpath;
|
||||
|
||||
if (!check_intercept_enabled())
|
||||
return realsyscall(number,a,b,c,d,e,f);
|
||||
dwr(MSG_DEBUG,"syscall(%u, ...)\n", number);
|
||||
DEBUG_INFO("syscall(%u, ...)\n", number);
|
||||
|
||||
#if defined(__i386__)
|
||||
// TODO: Implement for 32-bit systems: syscall(__NR_socketcall, 18, args);
|
||||
@@ -597,5 +596,5 @@ char *api_netpath;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // zts_SDK_INTERCEPT
|
||||
#endif // _SDK_INTERCEPT_
|
||||
|
||||
|
||||
@@ -102,9 +102,9 @@ public class ZTSDK {
|
||||
return zt_get_proxy_port(nwid);
|
||||
}
|
||||
|
||||
public native boolean zt_running();
|
||||
public boolean running() {
|
||||
return zt_running();
|
||||
public native boolean zt_service_is_running();
|
||||
public boolean service_is_running() {
|
||||
return zt_service_is_running();
|
||||
}
|
||||
|
||||
|
||||
@@ -272,4 +272,11 @@ public class ZTSDK {
|
||||
//public static native int zt_getsockopt(int fd, int type, int protocol);
|
||||
//public static native int zt_setsockopt(int fd, int type, int protocol);
|
||||
//public static native int zt_getsockname(int fd, int type, int protocol);
|
||||
|
||||
|
||||
// PROXY SERVER CONTROLS
|
||||
public native boolean zt_proxy_is_running();
|
||||
public boolean proxy_is_running() {
|
||||
return zt_proxy_is_running();
|
||||
}
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
#define ZTSDK_BUILD_VERSION 34
|
||||
#define ZTSDK_BUILD_VERSION 44
|
||||
|
||||
@@ -80,12 +80,12 @@ namespace ZeroTier
|
||||
|
||||
int NetconEthernetTap::stopProxyServer()
|
||||
{
|
||||
dwr(MSG_DEBUG, "stopProxyServer()");
|
||||
DEBUG_INFO("stopProxyServer()");
|
||||
if(proxyListenPhySocket) {
|
||||
_phy.close(proxyListenPhySocket);
|
||||
return 0;
|
||||
}
|
||||
dwr(MSG_ERROR, "stopProxyServer(): Invalid proxyListenPhySocket");
|
||||
DEBUG_ERROR("stopProxyServer(): Invalid proxyListenPhySocket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -96,25 +96,25 @@ namespace ZeroTier
|
||||
// - If no address, assume 127.0.0.1:<networks.d/nwid.port>
|
||||
// - If no port assignment file, 127.0.0.1:RANDOM_PORT
|
||||
|
||||
dwr(MSG_DEBUG, "startProxyServer()\n");
|
||||
DEBUG_INFO("startProxyServer()\n");
|
||||
int portno = -1;
|
||||
if(addr) {
|
||||
dwr(MSG_DEBUG, "startProxyServer(): Using provided address");
|
||||
DEBUG_INFO("startProxyServer(): Using provided address");
|
||||
// This address pointer may come from a different memory space and might be de-allocated, so we keep a copy
|
||||
memcpy(&proxyServerAddress, addr, sizeof(struct sockaddr_storage));
|
||||
struct sockaddr_in *in4 = (struct sockaddr_in *)&addr;
|
||||
proxyListenPhySocket = _phy.tcpListen((const struct sockaddr*)&in4,(void *)this);
|
||||
sockstate = SOCKS_OPEN;
|
||||
dwr(MSG_DEBUG, "SOCKS5 proxy server address for <%.16llx> is: <%s> (sock=%p)\n", nwid, inet_ntoa(in4->sin_addr), /*ntohs(in4->sin_port), */(void*)&proxyListenPhySocket);
|
||||
DEBUG_INFO("SOCKS5 proxy server address for <%.16llx> is: <%s> (sock=%p)\n", nwid, inet_ntoa(in4->sin_addr), /*ntohs(in4->sin_port), */(void*)&proxyListenPhySocket);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
dwr(MSG_DEBUG, "startProxyServer(): No address provided. Checking port file.");
|
||||
DEBUG_INFO("startProxyServer(): No address provided. Checking port file.");
|
||||
// Look for a port file for this network's proxy server instance
|
||||
char portFile[4096];
|
||||
Utils::snprintf(portFile,sizeof(portFile),"%s/networks.d/%.16llx.port",homepath,nwid);
|
||||
std::string portStr;
|
||||
printf("Proxy(): Reading port from: %s\n", portFile);
|
||||
DEBUG_INFO("Proxy(): Reading port from: %s\n", portFile);
|
||||
if(ZeroTier::OSUtils::fileExists(portFile,true))
|
||||
{
|
||||
if(ZeroTier::OSUtils::readFile(portFile, portStr)) {
|
||||
@@ -125,12 +125,12 @@ namespace ZeroTier
|
||||
unsigned int randp = 0;
|
||||
Utils::getSecureRandom(&randp,sizeof(randp));
|
||||
portno = 1000 + (randp % 1000);
|
||||
dwr(MSG_DEBUG, "Proxy(): No port specified in networks.d/%.16llx.port, randomly picking port\n", nwid);
|
||||
DEBUG_INFO("Proxy(): No port specified in networks.d/%.16llx.port, randomly picking port\n", nwid);
|
||||
std::stringstream ss;
|
||||
ss << portno;
|
||||
portStr = ss.str();
|
||||
if(!ZeroTier::OSUtils::writeFile(portFile, portStr)) {
|
||||
dwr(MSG_ERROR, "unable to write proxy port file: %s\n", portFile);
|
||||
DEBUG_ERROR("unable to write proxy port file: %s\n", portFile);
|
||||
}
|
||||
}
|
||||
struct sockaddr_in in4;
|
||||
@@ -140,7 +140,7 @@ namespace ZeroTier
|
||||
in4.sin_port = Utils::hton((uint16_t)portno);
|
||||
proxyListenPhySocket = _phy.tcpListen((const struct sockaddr*)&in4,(void *)this);
|
||||
sockstate = SOCKS_OPEN;
|
||||
//dwr(MSG_DEBUG, "SOCKS5 proxy server address for <%.16llx> is: <%s:%d> (sock=%p)\n", nwid, , portno, (void*)&proxyListenPhySocket);
|
||||
//DEBUG_INFO("SOCKS5 proxy server address for <%.16llx> is: <%s:%d> (sock=%p)\n", nwid, , portno, (void*)&proxyListenPhySocket);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -168,14 +168,14 @@ namespace ZeroTier
|
||||
|
||||
void NetconEthernetTap::phyOnTcpData(PhySocket *sock,void **uptr,void *data,unsigned long len)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnTcpData(): sock=%p, len=%lu\n", (void*)&sock, len);
|
||||
DEBUG_INFO("phyOnTcpData(): sock=%p, len=%lu\n", (void*)&sock, len);
|
||||
unsigned char *buf;
|
||||
buf = (unsigned char *)data;
|
||||
|
||||
// Get connection for this PhySocket
|
||||
Connection *conn = getConnection(sock);
|
||||
if(!conn) {
|
||||
dwr(MSG_DEBUG, "phyOnTcpData(): Unable to locate Connection for sock=%p\n", (void*)&sock);
|
||||
DEBUG_INFO("phyOnTcpData(): Unable to locate Connection for sock=%p\n", (void*)&sock);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ namespace ZeroTier
|
||||
if(conn->proxy_conn_state == SOCKS_COMPLETE)
|
||||
{
|
||||
if(len) {
|
||||
dwr(MSG_DEBUG, "len=%lu\n", len);
|
||||
DEBUG_INFO("len=%lu\n", len);
|
||||
memcpy((&conn->txbuf)+(conn->txsz), buf, len);
|
||||
conn->txsz += len;
|
||||
handleWrite(conn);
|
||||
@@ -192,7 +192,7 @@ namespace ZeroTier
|
||||
|
||||
if(conn->proxy_conn_state==SOCKS_UDP)
|
||||
{
|
||||
dwr(MSG_DEBUG, "SOCKS_UDP from client\n");
|
||||
DEBUG_INFO("SOCKS_UDP from client\n");
|
||||
// +----+------+------+----------+----------+----------+
|
||||
// |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
|
||||
// +----+------+------+----------+----------+----------+
|
||||
@@ -222,7 +222,7 @@ namespace ZeroTier
|
||||
if(firstSupportedMethod == 2) {
|
||||
supportedMethod = firstSupportedMethod;
|
||||
}
|
||||
dwr(MSG_DEBUG, " INFO <ver=%d, meth_len=%d, supp_meth=%d>\n", version, methodsLength, supportedMethod);
|
||||
DEBUG_INFO(" INFO <ver=%d, meth_len=%d, supp_meth=%d>\n", version, methodsLength, supportedMethod);
|
||||
|
||||
// Send METHOD selection msg
|
||||
// +----+--------+
|
||||
@@ -255,11 +255,11 @@ namespace ZeroTier
|
||||
int cmd = buf[IDX_COMMAND];
|
||||
int addr_type = buf[IDX_ATYP];
|
||||
|
||||
dwr(MSG_DEBUG, "SOCKS REQUEST = <ver=%d, cmd=%d, typ=%d>\n", version, cmd, addr_type);
|
||||
DEBUG_INFO("SOCKS REQUEST = <ver=%d, cmd=%d, typ=%d>\n", version, cmd, addr_type);
|
||||
|
||||
// CONNECT request
|
||||
if(cmd == 1) {
|
||||
dwr(MSG_DEBUG, "CONNECT request\n");
|
||||
DEBUG_INFO("CONNECT request\n");
|
||||
// Ipv4
|
||||
/*
|
||||
if(addr_type == 144)
|
||||
@@ -269,12 +269,12 @@ namespace ZeroTier
|
||||
memcpy(&raw_addr, &buf[4], 4);
|
||||
char newaddr[16];
|
||||
inet_ntop(AF_INET, &raw_addr, (char*)newaddr, INET_ADDRSTRLEN);
|
||||
dwr(MSG_DEBUG, "new addr = %s\n", newaddr);
|
||||
DEBUG_INFO("new addr = %s\n", newaddr);
|
||||
|
||||
int rawport, port;
|
||||
memcpy(&rawport, &buf[5], 2);
|
||||
port = Utils::ntoh(rawport);
|
||||
dwr(MSG_DEBUG, "new port = %d\n", port);
|
||||
DEBUG_INFO("new port = %d\n", port);
|
||||
|
||||
// Assemble new address
|
||||
struct sockaddr_in addr;
|
||||
@@ -283,13 +283,13 @@ namespace ZeroTier
|
||||
addr.sin_port = Utils::hton(8080);
|
||||
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
dwr(MSG_DEBUG, "fd = %d\n", fd);
|
||||
DEBUG_INFO("fd = %d\n", fd);
|
||||
|
||||
if(fd < 0)
|
||||
perror("socket");
|
||||
|
||||
int err = connect(fd, (struct sockaddr*)&addr, sizeof(addr));
|
||||
dwr(MSG_DEBUG, "connect_err = %d\n", err);
|
||||
DEBUG_INFO("connect_err = %d\n", err);
|
||||
if(err < 0)
|
||||
perror("connect");
|
||||
}
|
||||
@@ -302,7 +302,7 @@ namespace ZeroTier
|
||||
ExtractAddress(addr_type,buf,&addr);
|
||||
PhySocket * new_sock = handleSocketProxy(sock, SOCK_STREAM);
|
||||
if(!new_sock)
|
||||
dwr(MSG_ERROR, "Error while creating proxied-socket\n");
|
||||
DEBUG_ERROR("Error while creating proxied-socket\n");
|
||||
handleConnectProxy(sock, &addr);
|
||||
|
||||
// Convert connection err code into SOCKS-err-code
|
||||
@@ -324,7 +324,7 @@ namespace ZeroTier
|
||||
// | 1 | 1 | X'00' | 1 | Variable | 2 |
|
||||
// +----+-----+-------+------+----------+----------+
|
||||
|
||||
dwr(MSG_DEBUG, "REPLY = %d\n", addr.sin_port);
|
||||
DEBUG_INFO("REPLY = %d\n", addr.sin_port);
|
||||
char reply[len]; // TODO: determine proper length
|
||||
int addr_len = domain_len;
|
||||
memset(reply, 0, len); // Create reply buffer at least as big as incoming SOCKS request data
|
||||
@@ -346,7 +346,7 @@ namespace ZeroTier
|
||||
// BIND Request
|
||||
if(cmd == 2)
|
||||
{
|
||||
dwr(MSG_DEBUG, "BIND request\n");
|
||||
DEBUG_INFO("BIND request\n");
|
||||
//char raw_addr[15];
|
||||
//int bind_port;
|
||||
}
|
||||
@@ -355,7 +355,7 @@ namespace ZeroTier
|
||||
if(cmd == 3)
|
||||
{
|
||||
// PORT supplied should be port assigned by server in previous msg
|
||||
dwr(MSG_DEBUG, "UDP association request\n");
|
||||
DEBUG_INFO("UDP association request\n");
|
||||
|
||||
// SOCKS_CONNECT (Cont.)
|
||||
// +----+-----+-------+------+----------+----------+
|
||||
@@ -381,10 +381,10 @@ namespace ZeroTier
|
||||
// Create new lwIP PCB
|
||||
PhySocket * new_sock = handleSocketProxy(sock, SOCK_DGRAM);
|
||||
|
||||
dwr(MSG_DEBUG, "new_sock = %p\n", (void*)&sock);
|
||||
dwr(MSG_DEBUG, "new_sock = %p\n", (void*)&new_sock);
|
||||
DEBUG_INFO("new_sock = %p\n", (void*)&sock);
|
||||
DEBUG_INFO("new_sock = %p\n", (void*)&new_sock);
|
||||
if(!new_sock)
|
||||
dwr(MSG_ERROR, "Error while creating proxied-socket\n");
|
||||
DEBUG_ERROR("Error while creating proxied-socket\n");
|
||||
|
||||
// Form address
|
||||
struct sockaddr_in addr;
|
||||
@@ -407,7 +407,7 @@ namespace ZeroTier
|
||||
|
||||
void NetconEthernetTap::phyOnTcpAccept(PhySocket *sockL,PhySocket *sockN,void **uptrL,void **uptrN,const struct sockaddr *from)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnTcpAccept(): sock=%p\n", (void*)&sockN);
|
||||
DEBUG_INFO("phyOnTcpAccept(): sock=%p\n", (void*)&sockN);
|
||||
Connection *newConn = new Connection();
|
||||
newConn->sock = sockN;
|
||||
_phy.setNotifyWritable(sockN, false);
|
||||
@@ -416,17 +416,17 @@ namespace ZeroTier
|
||||
|
||||
void NetconEthernetTap::phyOnTcpConnect(PhySocket *sock,void **uptr,bool success)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnTcpConnect(): sock=%p\n", (void*)&sock);
|
||||
DEBUG_INFO("phyOnTcpConnect(): sock=%p\n", (void*)&sock);
|
||||
}
|
||||
|
||||
// Unused -- no UDP or TCP from this thread/Phy<>
|
||||
void NetconEthernetTap::phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *local_address, const struct sockaddr *from,void *data,unsigned long len)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnDatagram(): len = %lu\n", len);
|
||||
DEBUG_INFO("phyOnDatagram(): len = %lu\n", len);
|
||||
if(len) {
|
||||
Connection *conn = getConnection(sock);
|
||||
if(!conn){
|
||||
dwr(MSG_ERROR, "unable to locate Connection: sock=%p\n", (void*)sock);
|
||||
DEBUG_ERROR("unable to locate Connection: sock=%p\n", (void*)sock);
|
||||
return;
|
||||
}
|
||||
unsigned char *buf = (unsigned char*)data;
|
||||
@@ -438,20 +438,20 @@ namespace ZeroTier
|
||||
|
||||
void NetconEthernetTap::phyOnTcpClose(PhySocket *sock,void **uptr)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnTcpClose(): sock=%p\n", (void*)&sock);
|
||||
DEBUG_INFO("phyOnTcpClose(): sock=%p\n", (void*)&sock);
|
||||
Mutex::Lock _l(_tcpconns_m);
|
||||
closeConnection(sock);
|
||||
}
|
||||
|
||||
void NetconEthernetTap::phyOnTcpWritable(PhySocket *sock,void **uptr, bool lwip_invoked)
|
||||
{
|
||||
dwr(MSG_DEBUG, " phyOnTcpWritable(): sock=%p\n", (void*)&sock);
|
||||
DEBUG_INFO(" phyOnTcpWritable(): sock=%p\n", (void*)&sock);
|
||||
processReceivedData(sock,uptr,lwip_invoked);
|
||||
}
|
||||
|
||||
// RX data on stream socks and send back over client sock's underlying fd
|
||||
void NetconEthernetTap::phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,bool readable,bool writable)
|
||||
{
|
||||
dwr(MSG_DEBUG, "phyOnFileDescriptorActivity(): sock=%p\n", (void*&)sock);
|
||||
DEBUG_INFO("phyOnFileDescriptorActivity(): sock=%p\n", (void*&)sock);
|
||||
}
|
||||
}
|
||||
@@ -30,12 +30,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
// For defining the Android direct-call API
|
||||
#if defined(__ANDROID__)
|
||||
#include <jni.h>
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -55,8 +50,8 @@
|
||||
|
||||
|
||||
// externs common between SDK_Intercept and SDK_Socket from SDK.h
|
||||
int (*realsocket)(SOCKET_SIG);
|
||||
int (*realconnect)(CONNECT_SIG);
|
||||
//int (*realsocket)(SOCKET_SIG);
|
||||
//int (*realconnect)(CONNECT_SIG);
|
||||
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
std::string service_path;
|
||||
pthread_t intercept_thread;
|
||||
int * intercept_thread_id;
|
||||
pthread_key_t thr_id_key;
|
||||
extern pthread_key_t thr_id_key;
|
||||
static ZeroTier::OneService *volatile zt1Service;
|
||||
|
||||
std::string localHomeDir; // Local shortened path
|
||||
@@ -75,30 +75,29 @@ void zts_init_rpc(const char * path, const char * nwid);
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
|
||||
int zts_start_proxy_server(const char *homepath, const char * nwid, struct sockaddr_storage * addr) {
|
||||
LOGV("zts_start_proxy_server\n");
|
||||
dwr(MSG_DEBUG, "zts_start_proxy_server()\n");
|
||||
DEBUG_INFO();
|
||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
if(tap) {
|
||||
if(tap->startProxyServer(homepath, nwid_int, addr) < 0) {
|
||||
dwr(MSG_ERROR, "zts_start_proxy_server(%s): Problem while starting server.", nwid);
|
||||
DEBUG_ERROR("zts_start_proxy_server(%s): Problem while starting server.", nwid);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
dwr(MSG_ERROR, "zts_start_proxy_server(%s): Invalid tap. Possibly incorrect NWID", nwid);
|
||||
DEBUG_ERROR("zts_start_proxy_server(%s): Invalid tap. Possibly incorrect NWID", nwid);
|
||||
return 0;
|
||||
}
|
||||
int zts_stop_proxy_server(const char *nwid) {
|
||||
dwr(MSG_DEBUG, "zts_stop_proxy_server()");
|
||||
DEBUG_INFO("zts_stop_proxy_server()");
|
||||
uint64_t nwid_int = strtoull(nwid, NULL, 16);
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
if(tap) {
|
||||
if(tap->stopProxyServer() < 0) {
|
||||
dwr(MSG_ERROR, "zts_stop_proxy_server(%s): Problem while stopping server.", nwid);
|
||||
DEBUG_ERROR("zts_stop_proxy_server(%s): Problem while stopping server.", nwid);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
dwr(MSG_ERROR, "zts_stop_proxy_server(%s): Invalid tap. Possibly incorrect NWID", nwid);
|
||||
DEBUG_ERROR("zts_stop_proxy_server(%s): Invalid tap. Possibly incorrect NWID", nwid);
|
||||
return 0;
|
||||
}
|
||||
int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage * addr) {
|
||||
@@ -114,13 +113,13 @@ int zts_get_proxy_server_address(const char * nwid, struct sockaddr_storage * ad
|
||||
// Basic ZT service controls
|
||||
// Will also spin up a SOCKS5 proxy server if USE_SOCKS_PROXY is set
|
||||
void zts_join_network(const char * nwid) {
|
||||
LOGV("zts_join_network\n");
|
||||
DEBUG_INFO();
|
||||
std::string confFile = zt1Service->givenHomePath() + "/networks.d/" + nwid + ".conf";
|
||||
if(!ZeroTier::OSUtils::mkdir(netDir)) {
|
||||
dwr(MSG_ERROR, "unable to create %s\n", netDir.c_str());
|
||||
DEBUG_INFO("unable to create %s\n", netDir.c_str());
|
||||
}
|
||||
if(!ZeroTier::OSUtils::writeFile(confFile.c_str(), "")) {
|
||||
dwr(MSG_ERROR, "unable to write network conf file: %s\n", confFile.c_str());
|
||||
DEBUG_INFO("unable to write network conf file: %s\n", confFile.c_str());
|
||||
}
|
||||
zt1Service->join(nwid);
|
||||
// Provide the API with the RPC information
|
||||
@@ -132,7 +131,7 @@ void zts_join_network(const char * nwid) {
|
||||
#endif
|
||||
}
|
||||
void zts_leave_network(const char * nwid) { zt1Service->leave(nwid); }
|
||||
bool zts_is_running() { return zt1Service->isRunning(); }
|
||||
bool zts_service_is_running() { return zt1Service->isRunning(); }
|
||||
void zts_stop_service() { zt1Service->terminate(); }
|
||||
|
||||
// FIXME: Re-implemented to make it play nicer with the C-linkage required for Xcode integrations
|
||||
@@ -143,7 +142,7 @@ void zts_get_addresses(const char * nwid, char *addrstr)
|
||||
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
|
||||
if(tap && tap->_ips.size()){
|
||||
std::string addr = tap->_ips[0].toString();
|
||||
dwr(MSG_DEBUG, "addr.length() = %d, addr = %s\n", addr.length(), addr.c_str());
|
||||
DEBUG_INFO("addr.length() = %d, addr = %s\n", addr.length(), addr.c_str());
|
||||
memcpy(addrstr, addr.c_str(), addr.length());
|
||||
}
|
||||
else {
|
||||
@@ -222,26 +221,30 @@ char *zts_get_homepath() {
|
||||
/* NOTE: Since on Android devices the sdcard is formatted as fat32, we can't use just any
|
||||
location to set up the RPC unix domain socket. Rather we must use the application's specific
|
||||
data directory given by getApplicationContext().getFilesDir() */
|
||||
JNIEXPORT int JNICALL Java_ZeroTier_SDK_zt_1start_1service(JNIEnv *env, jobject thisObj, jstring path) {
|
||||
JNIEXPORT int JNICALL Java_ZeroTier_ZTSDK_zt_1start_1service(JNIEnv *env, jobject thisObj, jstring path) {
|
||||
if(path)
|
||||
homeDir = env->GetStringUTFChars(path, NULL);
|
||||
zts_start_service(NULL);
|
||||
}
|
||||
// Shuts down ZeroTier service and SOCKS5 Proxy server
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1stop_1service(JNIEnv *env, jobject thisObj) {
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_ZTSDK_zt_1stop_1service(JNIEnv *env, jobject thisObj) {
|
||||
if(zt1Service)
|
||||
zts_stop_service();
|
||||
// TODO: Also terminate SOCKS5 Proxy
|
||||
// zts_stop_proxy_server();
|
||||
}
|
||||
// Returns whether the ZeroTier service is running
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj) {
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1service_1is_1running(JNIEnv *env, jobject thisObj) {
|
||||
if(zt1Service)
|
||||
return zts_is_running();
|
||||
return zts_service_is_running();
|
||||
return false;
|
||||
}
|
||||
// Returns path for ZT config/data files
|
||||
JNIEXPORT jstring JNICALL Java_ZeroTier_ZTSDK_zt_1get_1homepath(JNIEnv *env, jobject thisObj) {
|
||||
return (*env).NewStringUTF(zts_get_homepath());
|
||||
}
|
||||
// Join a network
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_ZTSDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
const char *nwidstr;
|
||||
if(nwid) {
|
||||
nwidstr = env->GetStringUTFChars(nwid, NULL);
|
||||
@@ -249,7 +252,7 @@ char *zts_get_homepath() {
|
||||
}
|
||||
}
|
||||
// Leave a network
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
JNIEXPORT void JNICALL Java_ZeroTier_ZTSDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
const char *nwidstr;
|
||||
if(nwid) {
|
||||
nwidstr = env->GetStringUTFChars(nwid, NULL);
|
||||
@@ -258,7 +261,7 @@ char *zts_get_homepath() {
|
||||
}
|
||||
// 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_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
JNIEXPORT jobject JNICALL Java_ZeroTier_ZTSDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
|
||||
char address_string[32];
|
||||
memset(address_string, 0, 32);
|
||||
@@ -287,15 +290,15 @@ char *zts_get_homepath() {
|
||||
*/
|
||||
}
|
||||
// Returns the device is in integer form
|
||||
JNIEXPORT jint Java_ZeroTier_SDK_zt_1get_1device_1id() {
|
||||
JNIEXPORT jint Java_ZeroTier_ZTSDK_zt_1get_1device_1id() {
|
||||
return zts_get_device_id();
|
||||
}
|
||||
// Returns whether the path to an endpoint is currently relayed by a root server
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1is_1relayed() {
|
||||
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_SDK_zt_1get_1proxy_1server_1address(JNIEnv *env, jobject thisObj, jstring nwid, jobject ztaddr) {
|
||||
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
|
||||
@@ -308,7 +311,7 @@ char *zts_get_homepath() {
|
||||
return err;
|
||||
}
|
||||
// Starts a SOCKS5 proxy server for a given ZeroTier network
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1start_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid, jobject ztaddr) {
|
||||
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);
|
||||
struct sockaddr_in addr;
|
||||
// GET ZTAddress fields
|
||||
@@ -320,11 +323,12 @@ char *zts_get_homepath() {
|
||||
return zts_start_proxy_server((char *)zts_get_homepath, nwidstr, (struct sockaddr_storage *)&addr);
|
||||
}
|
||||
//
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1stop_1proxy_1server(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
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));
|
||||
}
|
||||
JNIEXPORT jstring JNICALL Java_ZeroTier_SDK_zt_1get_1homepath(JNIEnv *env, jobject thisObj) {
|
||||
return (*env).NewStringUTF(zts_get_homepath());
|
||||
//
|
||||
JNIEXPORT jboolean JNICALL Java_ZeroTier_ZTSDK_zt_1proxy_1is_1running(JNIEnv *env, jobject thisObj, jstring nwid) {
|
||||
// TODO: implement
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -362,8 +366,7 @@ char *zts_get_homepath() {
|
||||
// Starts a ZeroTier service in the background
|
||||
void *zts_start_service(void *thread_id) {
|
||||
#if defined(__ANDROID__)
|
||||
dwr(MSG_DEBUG, "ZTSDK_BUILD_VERSION = %d\n", ZTSDK_BUILD_VERSION);
|
||||
LOGV("ZTSDK_BUILD_VERSION = %d\n", ZTSDK_BUILD_VERSION);
|
||||
DEBUG_INFO("ZTSDK_BUILD_VERSION = %d\n", ZTSDK_BUILD_VERSION);
|
||||
#endif
|
||||
|
||||
#if defined(SDK_BUNDLED) && !defined(__ANDROID__)
|
||||
@@ -392,7 +395,7 @@ void *zts_start_service(void *thread_id) {
|
||||
localHomeDir = homeDir; // Used for RPC and *can* differ from homeDir on some platforms
|
||||
#endif
|
||||
|
||||
dwr(MSG_DEBUG, "homeDir = %s\n", homeDir.c_str());
|
||||
DEBUG_INFO("homeDir = %s\n", homeDir.c_str());
|
||||
// Where network .conf files will be stored
|
||||
netDir = homeDir + "/networks.d";
|
||||
zt1Service = (ZeroTier::OneService *)0;
|
||||
@@ -409,7 +412,7 @@ void *zts_start_service(void *thread_id) {
|
||||
ptmp.append(*pi);
|
||||
if ((*pi != ".")&&(*pi != "..")) {
|
||||
if (!ZeroTier::OSUtils::mkdir(ptmp)) {
|
||||
dwr(MSG_ERROR, "startOneService(): home path does not exist, and could not create\n");
|
||||
DEBUG_ERROR("startOneService(): home path does not exist, and could not create\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,11 +75,10 @@
|
||||
#include "Constants.hpp" // For Tap's MTU
|
||||
|
||||
// Prototypes
|
||||
void dwr(int level, const char *fmt, ... );
|
||||
char *api_netpath = (char *)0;
|
||||
void load_symbols();
|
||||
void load_symbols_rpc();
|
||||
int (*realclose)(CLOSE_SIG);
|
||||
//int (*realclose)(CLOSE_SIG);
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ---------------------------------- zt_init_rpc -------------------------------
|
||||
@@ -88,7 +87,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// Assembles (and/or) sets the RPC path for communication with the ZeroTier service
|
||||
void zts_init_rpc(const char *path, const char *nwid)
|
||||
{
|
||||
// dwr(MSG_DEBUG_EXTRA, "zt_init_rpc\n");
|
||||
DEBUG_EXTRA("zt_init_rpc\n");
|
||||
#if !defined(__IOS__)
|
||||
// Since we don't use function interposition in iOS
|
||||
if(!realconnect) {
|
||||
@@ -113,10 +112,10 @@ int (*realclose)(CLOSE_SIG);
|
||||
// This is used when you're dynamically-linking our library into your application at runtime
|
||||
if (!api_netpath) {
|
||||
api_netpath = getenv("ZT_NC_NETWORK");
|
||||
dwr(MSG_DEBUG, "$ZT_NC_NETWORK(len=%d) = %s\n", strlen(api_netpath), api_netpath);
|
||||
DEBUG_INFO("$ZT_NC_NETWORK(len=%d) = %s\n", strlen(api_netpath), api_netpath);
|
||||
}
|
||||
#endif
|
||||
dwr(MSG_DEBUG_EXTRA, "zt_init_rpc(): api_netpath = %s\n", api_netpath);
|
||||
DEBUG_EXTRA("zt_init_rpc(): api_netpath = %s\n", api_netpath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +127,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, const void *buf, size_t len
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1send(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, int flags)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1send(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, int flags)
|
||||
{
|
||||
jbyte *body = (*env)->GetByteArrayElements(env, buf, 0);
|
||||
char * bufp = (char *)malloc(sizeof(char)*len);
|
||||
@@ -148,7 +147,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#if defined(__ANDROID__)
|
||||
// TODO: Check result of each JNI call
|
||||
// UDP TX
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1sendto(
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1sendto(
|
||||
JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len, jint flags, jobject ztaddr)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
@@ -177,7 +176,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
ssize_t zts_sendto(SENDTO_SIG) // Used as internal implementation
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "zt_sendto(%d, ...)\n", fd);
|
||||
DEBUG_EXTRA("zt_sendto(%d, ...)\n", fd);
|
||||
if(len > ZT_UDP_DEFAULT_PAYLOAD_MTU) {
|
||||
errno = EMSGSIZE; // Msg is too large
|
||||
return -1;
|
||||
@@ -198,7 +197,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// This connect call is used to get the address info to the stack for sending the packet
|
||||
int err;
|
||||
if((err = zts_connect(fd, addr, addrlen)) < 0) {
|
||||
LOGV("sendto(): unknown problem passing address info to stack\n");
|
||||
DEBUG_ERROR("unknown problem passing address info to stack");
|
||||
errno = EISCONN; // double-check this is correct
|
||||
return -1;
|
||||
}
|
||||
@@ -218,7 +217,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
ssize_t zts_sendmsg(SENDMSG_SIG)
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "zt_sendmsg(%d)\n", fd);
|
||||
DEBUG_EXTRA("fd=%d",fd);
|
||||
char * p, * buf;
|
||||
size_t tot_len = 0;
|
||||
size_t err;
|
||||
@@ -253,7 +252,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// UDP RX
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1recvfrom(
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1recvfrom(
|
||||
JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf, jint len, jint flags, jobject ztaddr)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
@@ -283,7 +282,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
int tmpsz = 0; // payload size
|
||||
// dwr(MSG_DEBUG_EXTRA,"zt_recvfrom(%d, ...)\n", fd);
|
||||
// DEBUG_EXTRA("zt_recvfrom(%d, ...)\n", fd);
|
||||
if(read(fd, buf, ZT_MAX_MTU) > 0) {
|
||||
// TODO: case for address size mismatch?
|
||||
memcpy(addr, buf, addrlen);
|
||||
@@ -308,7 +307,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
ssize_t zts_recvmsg(RECVMSG_SIG)
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA, "zt_recvmsg(%d)\n", fd);
|
||||
DEBUG_EXTRA("zt_recvmsg(%d)\n", fd);
|
||||
ssize_t err, n, tot_len = 0;
|
||||
char *buf, *p;
|
||||
struct iovec *iov = msg->msg_iov;
|
||||
@@ -366,7 +365,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// TCP TX
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1write(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1write(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len)
|
||||
{
|
||||
jbyte *body = (*env)->GetByteArrayElements(env, buf, 0);
|
||||
char * bufp = (char *)malloc(sizeof(char)*len);
|
||||
@@ -376,7 +375,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
return written_bytes;
|
||||
}
|
||||
// TCP RX
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1read(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1read(JNIEnv *env, jobject thisObj, jint fd, jarray buf, jint len)
|
||||
{
|
||||
jbyte *body = (*env)->GetByteArrayElements(env, buf, 0);
|
||||
int read_bytes = read(fd, body, len);
|
||||
@@ -391,7 +390,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, int level, int optname, const void *optval, socklen_t optlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1setsockopt(
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1setsockopt(
|
||||
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen) {
|
||||
return zts_setsockopt(fd, level, optname, optval, optlen);
|
||||
}
|
||||
@@ -403,7 +402,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
int zts_setsockopt(SETSOCKOPT_SIG)
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG, "zt_setsockopt(%d)\n", fd);
|
||||
DEBUG_INFO("zt_setsockopt(%d)\n", fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -413,7 +412,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, int level, int optname, void *optval, socklen_t *optlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getsockopt(
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getsockopt(
|
||||
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jint optval, jint optlen) {
|
||||
return zts_getsockopt(fd, level, optname, optval, optlen);
|
||||
}
|
||||
@@ -425,7 +424,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
int zts_getsockopt(GETSOCKOPT_SIG)
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG,"zt_getsockopt(%d)\n", fd);
|
||||
DEBUG_INFO("zt_getsockopt(%d)\n", fd);
|
||||
if(optname == SO_TYPE) {
|
||||
int* val = (int*)optval;
|
||||
*val = 2;
|
||||
@@ -440,7 +439,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int socket_family, int socket_type, int protocol
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1socket(JNIEnv *env, jobject thisObj, jint family, jint type, jint protocol) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1socket(JNIEnv *env, jobject thisObj, jint family, jint type, jint protocol) {
|
||||
return zts_socket(family, type, protocol);
|
||||
}
|
||||
#endif
|
||||
@@ -452,7 +451,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG, "zt_socket()\n");
|
||||
DEBUG_INFO("");
|
||||
// Check that type makes sense
|
||||
#if defined(__linux__)
|
||||
int flags = socket_type & ~SOCK_TYPE_MASK;
|
||||
@@ -488,9 +487,9 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
#endif
|
||||
// -1 is passed since we we're generating the new socket in this call
|
||||
printf("api_netpath = %s\n", api_netpath);
|
||||
DEBUG_INFO("api_netpath=%s\n", api_netpath);
|
||||
int err = rpc_send_command(api_netpath, RPC_SOCKET, -1, &rpc_st, sizeof(struct socket_st));
|
||||
dwr(MSG_DEBUG," socket() = %d\n", err);
|
||||
DEBUG_INFO("err=%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -500,10 +499,10 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, const struct sockaddr *addr, socklen_t addrlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1connect(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1connect(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
struct sockaddr_in addr;
|
||||
const char *str = (*env)->GetStringUTFChars(env, addrstr, 0);
|
||||
dwr(MSG_DEBUG, "zt_connect(): fd = %d\naddr = %s\nport=%d", fd, str, port);
|
||||
DEBUG_INFO("zt_connect(): fd = %d\naddr = %s\nport=%d", fd, str, port);
|
||||
addr.sin_addr.s_addr = inet_addr(str);
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons( port );
|
||||
@@ -519,7 +518,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG,"zt_connect(%d)\n", fd);
|
||||
DEBUG_INFO("zt_connect(%d)\n", fd);
|
||||
struct connect_st rpc_st;
|
||||
#if defined(__linux__)
|
||||
#if !defined(__ANDROID__)
|
||||
@@ -540,10 +539,10 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, const struct sockaddr *addr, socklen_t addrlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1bind(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1bind(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
struct sockaddr_in addr;
|
||||
const char *str = (*env)->GetStringUTFChars(env, addrstr, 0);
|
||||
dwr(MSG_DEBUG, "zt_bind(): fd = %d\naddr = %s\nport=%d", fd, str, port);
|
||||
DEBUG_INFO("zt_bind(): fd = %d\naddr = %s\nport=%d", fd, str, port);
|
||||
addr.sin_addr.s_addr = inet_addr(str);
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons( port );
|
||||
@@ -559,7 +558,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG,"zt_bind(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
struct bind_st rpc_st;
|
||||
rpc_st.fd = fd;
|
||||
#if defined(__linux__)
|
||||
@@ -581,7 +580,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, struct sockaddr *addr, socklen_t *addrlen, int flags
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1accept4(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port, jint flags) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1accept4(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port, jint flags) {
|
||||
struct sockaddr_in addr;
|
||||
char *str;
|
||||
// = env->GetStringUTFChars(addrstr, NULL);
|
||||
@@ -601,7 +600,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG,"zt_accept4(%d):\n", fd);
|
||||
DEBUG_INFO("zt_accept4(%d):\n", fd);
|
||||
#if !defined(__ANDROID__)
|
||||
if ((flags & SOCK_CLOEXEC))
|
||||
fcntl(fd, F_SETFL, FD_CLOEXEC);
|
||||
@@ -619,7 +618,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd struct sockaddr *addr, socklen_t *addrlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1accept(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1accept(JNIEnv *env, jobject thisObj, jint fd, jstring addrstr, jint port) {
|
||||
struct sockaddr_in addr;
|
||||
// TODO: Send addr info back to Javaland
|
||||
addr.sin_addr.s_addr = inet_addr("");
|
||||
@@ -636,14 +635,14 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG,"zt_accept(%d):\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
// FIXME: Find a better solution for this before production
|
||||
#if !defined(__UNITY_3D__)
|
||||
if(addr)
|
||||
addr->sa_family = AF_INET;
|
||||
#endif
|
||||
int new_fd = get_new_fd(fd);
|
||||
dwr(MSG_DEBUG,"newfd = %d\n", new_fd);
|
||||
DEBUG_INFO("newfd=%d", new_fd);
|
||||
|
||||
if(new_fd > 0) {
|
||||
errno = ERR_OK;
|
||||
@@ -659,7 +658,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, int backlog
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1listen(JNIEnv *env, jobject thisObj, jint fd, int backlog) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1listen(JNIEnv *env, jobject thisObj, jint fd, int backlog) {
|
||||
return zts_listen(fd, backlog);
|
||||
}
|
||||
#endif
|
||||
@@ -671,7 +670,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG,"zt_listen(%d):\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
struct listen_st rpc_st;
|
||||
rpc_st.fd = fd;
|
||||
rpc_st.backlog = backlog;
|
||||
@@ -691,7 +690,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1close(JNIEnv *env, jobject thisObj, jint fd) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1close(JNIEnv *env, jobject thisObj, jint fd) {
|
||||
return zts_close(fd);
|
||||
}
|
||||
#endif
|
||||
@@ -703,7 +702,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG, "zt_close(%d)\n", fd);
|
||||
DEBUG_INFO("fd=%d", fd);
|
||||
return realclose(fd);
|
||||
}
|
||||
|
||||
@@ -713,7 +712,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, struct sockaddr *addr, socklen_t *addrlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getsockname(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getsockname(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr) {
|
||||
struct sockaddr_in addr;
|
||||
int err = zts_getsockname(fd, &addr, sizeof(struct sockaddr));
|
||||
jfieldID fid;
|
||||
@@ -733,7 +732,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG_EXTRA,"zt_getsockname(%d):\n", fd);
|
||||
DEBUG_EXTRA("fd=%d", fd);
|
||||
struct getsockname_st rpc_st;
|
||||
rpc_st.fd = fd;
|
||||
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
||||
@@ -751,13 +750,13 @@ int (*realclose)(CLOSE_SIG);
|
||||
}
|
||||
if(!sum) { // RXed a zero-ed address buffer, currently the only way to signal a problem
|
||||
errno = ENOTSOCK; // TODO: general error, needs to be more specific
|
||||
dwr(MSG_ERROR, "zt_getpeername(): no address info given by service.\n");
|
||||
DEBUG_ERROR("no address info given by service.");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
errno = ENOTSOCK; // TODO: general error, needs to be more specific
|
||||
dwr(MSG_ERROR, "zt_getpeername(): unable to read address info from service.\n", err);
|
||||
DEBUG_ERROR("unable to read address info from service. err=%d", err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -775,7 +774,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, struct sockaddr *addr, socklen_t *addrlen
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1getpeername(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1getpeername(JNIEnv *env, jobject thisObj, jint fd, jobject ztaddr) {
|
||||
struct sockaddr_in addr;
|
||||
int err = zts_getpeername(fd, &addr, sizeof(struct sockaddr));
|
||||
jfieldID fid;
|
||||
@@ -795,7 +794,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
#endif
|
||||
{
|
||||
get_api_netpath();
|
||||
dwr(MSG_DEBUG_EXTRA,"zt_getpeername(%d):\n", fd);
|
||||
DEBUG_EXTRA("fd=%d", fd);
|
||||
struct getsockname_st rpc_st;
|
||||
rpc_st.fd = fd;
|
||||
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
||||
@@ -814,13 +813,13 @@ int (*realclose)(CLOSE_SIG);
|
||||
}
|
||||
if(!sum) { // RXed a zero-ed address buffer, currently the only way to signal a problem
|
||||
errno = ENOTSOCK; // TODO: general error, needs to be more specific
|
||||
dwr(MSG_ERROR, "zt_getpeername(): no address info given by service.\n");
|
||||
DEBUG_ERROR("no address info given by service.");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
errno = ENOTSOCK; // TODO: general error, needs to be more specific
|
||||
dwr(MSG_ERROR, "zt_getpeername(): unable to read address info from service.\n", err);
|
||||
DEBUG_ERROR("unable to read address info from service. err=%d", err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -838,7 +837,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
// int fd, int cmd, int flags
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_SDK_zt_1fcntl(JNIEnv *env, jobject thisObj, jint fd, jint cmd, jint flags) {
|
||||
JNIEXPORT jint JNICALL Java_ZeroTier_ZTSDK_zt_1fcntl(JNIEnv *env, jobject thisObj, jint fd, jint cmd, jint flags) {
|
||||
return zts_fcntl(fd,cmd,flags);
|
||||
}
|
||||
#endif
|
||||
@@ -849,7 +848,7 @@ int (*realclose)(CLOSE_SIG);
|
||||
int zts_fcntl(FCNTL_SIG)
|
||||
#endif
|
||||
{
|
||||
dwr(MSG_DEBUG_EXTRA,"zt_fcntl(%d, %d, %d)\n", fd, cmd, flags);
|
||||
DEBUG_EXTRA("fd=%d, cmd=%d, flags=%d", fd, cmd, flags);
|
||||
return fcntl(fd,cmd,flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,10 @@ 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_get_proxy_server_address(const char *nwid, struct sockaddr_storage *addr) {
|
||||
zts_get_proxy_server_address(nwid, addr);
|
||||
}
|
||||
@@ -84,38 +88,38 @@ extern "C" int zt_socket(SOCKET_SIG) {
|
||||
return zts_socket(socket_family, socket_type, protocol);
|
||||
}
|
||||
extern "C" int zt_connect(CONNECT_SIG) {
|
||||
return zts_connect(__fd, __addr, __len);
|
||||
return zts_connect(fd, addr, addrlen);
|
||||
}
|
||||
extern "C" int zt_bind(BIND_SIG){
|
||||
return zts_bind(sockfd, addr, addrlen);
|
||||
return zts_bind(fd, addr, addrlen);
|
||||
}
|
||||
extern "C" int zt_accept(ACCEPT_SIG) {
|
||||
return zts_accept(sockfd, addr, addrlen);
|
||||
return zts_accept(fd, addr, addrlen);
|
||||
}
|
||||
extern "C" int zt_listen(LISTEN_SIG) {
|
||||
return zts_listen(sockfd, backlog);
|
||||
return zts_listen(fd, backlog);
|
||||
}
|
||||
extern "C" int zt_setsockopt(SETSOCKOPT_SIG) {
|
||||
return zts_setsockopt(socket, level, optname, optval, optlen);
|
||||
return zts_setsockopt(fd, level, optname, optval, optlen);
|
||||
}
|
||||
extern "C" int zt_getsockopt(GETSOCKOPT_SIG) {
|
||||
return zts_getsockopt(sockfd, level, optname, optval, optlen);
|
||||
return zts_getsockopt(fd, level, optname, optval, optlen);
|
||||
}
|
||||
extern "C" int zt_close(CLOSE_SIG) {
|
||||
return zts_close(fd);
|
||||
}
|
||||
extern "C" int zt_getsockname(GETSOCKNAME_SIG) {
|
||||
return zts_getsockname(sockfd, addr, addrlen);
|
||||
return zts_getsockname(fd, addr, addrlen);
|
||||
}
|
||||
extern "C" int zt_getpeername(GETPEERNAME_SIG) {
|
||||
return zts_getpeername(sockfd, addr, addrlen);
|
||||
return zts_getpeername(fd, addr, addrlen);
|
||||
}
|
||||
extern "C" int zt_fcntl(FCNTL_SIG) {
|
||||
return zts_fcntl(fd, cmd, flags);
|
||||
}
|
||||
extern "C" ssize_t zt_recvfrom(RECVFROM_SIG) {
|
||||
return zts_recvfrom(socket, buffer, length, flags, address, address_len);
|
||||
return zts_recvfrom(fd, buf, len, flags, addr, addrlen);
|
||||
}
|
||||
extern "C" ssize_t zt_sendto(SENDTO_SIG) {
|
||||
return zts_sendto(sockfd, buf, len, flags, addr, addr_len);
|
||||
return zts_sendto(fd, buf, len, flags, addr, addrlen);
|
||||
}
|
||||
Reference in New Issue
Block a user