|
@@ -54,6 +54,7 @@ namespace {
|
|
|
, configListener(NULL)
|
|
|
, pathChecker(NULL)
|
|
|
, callbacks(NULL)
|
|
|
+ , inited()
|
|
|
{
|
|
|
callbacks = (ZT_Node_Callbacks*)malloc(sizeof(ZT_Node_Callbacks));
|
|
|
memset(callbacks, 0, sizeof(ZT_Node_Callbacks));
|
|
@@ -91,6 +92,10 @@ namespace {
|
|
|
jobject pathChecker;
|
|
|
|
|
|
ZT_Node_Callbacks *callbacks;
|
|
|
+
|
|
|
+ bool inited;
|
|
|
+
|
|
|
+ bool finishInitializing();
|
|
|
};
|
|
|
|
|
|
|
|
@@ -539,19 +544,81 @@ namespace {
|
|
|
}
|
|
|
|
|
|
typedef std::map<int64_t, JniRef*> NodeMap;
|
|
|
- static NodeMap nodeMap;
|
|
|
+ NodeMap nodeMap;
|
|
|
ZeroTier::Mutex nodeMapMutex;
|
|
|
|
|
|
+ bool isInited(int64_t nodeId) {
|
|
|
+
|
|
|
+ ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
+ NodeMap::iterator found = nodeMap.find(nodeId);
|
|
|
+
|
|
|
+ if (found == nodeMap.end()) {
|
|
|
+
|
|
|
+ //
|
|
|
+ // not in map yet, or has been removed from map
|
|
|
+ //
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ JniRef *ref = found->second;
|
|
|
+
|
|
|
+ assert(ref);
|
|
|
+
|
|
|
+ return ref->inited;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool JniRef::finishInitializing() {
|
|
|
+
|
|
|
+ ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
+ NodeMap::iterator found = nodeMap.find(id);
|
|
|
+
|
|
|
+ if (found != nodeMap.end()) {
|
|
|
+ //
|
|
|
+ // already in map
|
|
|
+ //
|
|
|
+ LOGE("Cannot finish initializing; node is already in map");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ nodeMap.insert(std::make_pair(id, this));
|
|
|
+
|
|
|
+ assert(!inited);
|
|
|
+ inited = true;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
ZT_Node* findNode(int64_t nodeId)
|
|
|
{
|
|
|
ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
NodeMap::iterator found = nodeMap.find(nodeId);
|
|
|
- if(found != nodeMap.end())
|
|
|
- {
|
|
|
- JniRef *ref = found->second;
|
|
|
- return ref->node;
|
|
|
+
|
|
|
+ assert(found != nodeMap.end());
|
|
|
+
|
|
|
+ JniRef *ref = found->second;
|
|
|
+
|
|
|
+ assert(ref);
|
|
|
+
|
|
|
+ return ref->node;
|
|
|
+ }
|
|
|
+
|
|
|
+ JniRef *removeRef(int64_t nodeId) {
|
|
|
+
|
|
|
+ ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
+
|
|
|
+ NodeMap::iterator found = nodeMap.find(nodeId);
|
|
|
+
|
|
|
+ if (found == nodeMap.end()) {
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
- return NULL;
|
|
|
+
|
|
|
+ JniRef *ref = found->second;
|
|
|
+
|
|
|
+ assert(ref);
|
|
|
+
|
|
|
+ nodeMap.erase(nodeId);
|
|
|
+
|
|
|
+ return ref;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -574,10 +641,13 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
|
|
|
/*
|
|
|
* Class: com_zerotier_sdk_Node
|
|
|
* Method: node_init
|
|
|
- * Signature: (J)Lcom/zerotier/sdk/ResultCode;
|
|
|
+ * Signature: (JLcom/zerotier/sdk/DataStoreGetListener;Lcom/zerotier/sdk/DataStorePutListener;Lcom/zerotier/sdk/PacketSender;Lcom/zerotier/sdk/EventListener;Lcom/zerotier/sdk/VirtualNetworkFrameListener;Lcom/zerotier/sdk/VirtualNetworkConfigListener;Lcom/zerotier/sdk/PathChecker;)Lcom/zerotier/sdk/ResultCode;
|
|
|
*/
|
|
|
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init(
|
|
|
- JNIEnv *env, jobject obj, jlong now)
|
|
|
+ JNIEnv *env, jobject obj, jlong now, jobject dataStoreGetListener,
|
|
|
+ jobject dataStorePutListener, jobject packetSender, jobject eventListener,
|
|
|
+ jobject frameListener, jobject configListener,
|
|
|
+ jobject pathChecker)
|
|
|
{
|
|
|
LOGV("Creating ZT_Node struct");
|
|
|
jobject resultObject = ResultCode_RESULT_OK_enum;
|
|
@@ -587,49 +657,42 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init(
|
|
|
ref->id = (int64_t)now;
|
|
|
env->GetJavaVM(&ref->jvm);
|
|
|
|
|
|
- jobject dataStoreGetListener = env->GetObjectField(obj, Node_getListener_field);
|
|
|
if(dataStoreGetListener == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->dataStoreGetListener = env->NewGlobalRef(dataStoreGetListener);
|
|
|
|
|
|
- jobject dataStorePutListener = env->GetObjectField(obj, Node_putListener_field);
|
|
|
if(dataStorePutListener == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->dataStorePutListener = env->NewGlobalRef(dataStorePutListener);
|
|
|
|
|
|
- jobject packetSender = env->GetObjectField(obj, Node_sender_field);
|
|
|
if(packetSender == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->packetSender = env->NewGlobalRef(packetSender);
|
|
|
|
|
|
- jobject frameListener = env->GetObjectField(obj, Node_frameListener_field);
|
|
|
if(frameListener == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->frameListener = env->NewGlobalRef(frameListener);
|
|
|
|
|
|
- jobject configListener = env->GetObjectField(obj, Node_configListener_field);
|
|
|
if(configListener == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->configListener = env->NewGlobalRef(configListener);
|
|
|
|
|
|
- jobject eventListener = env->GetObjectField(obj, Node_eventListener_field);
|
|
|
if(eventListener == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
ref->eventListener = env->NewGlobalRef(eventListener);
|
|
|
|
|
|
- jobject pathChecker = env->GetObjectField(obj, Node_pathChecker_field);
|
|
|
if(pathChecker != NULL)
|
|
|
{
|
|
|
ref->pathChecker = env->NewGlobalRef(pathChecker);
|
|
@@ -669,13 +732,29 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init(
|
|
|
return resultObject;
|
|
|
}
|
|
|
|
|
|
- ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
+ //
|
|
|
+ // node is now updated
|
|
|
+ //
|
|
|
ref->node = node;
|
|
|
- nodeMap.insert(std::make_pair(ref->id, ref));
|
|
|
+
|
|
|
+ if (!ref->finishInitializing()) {
|
|
|
+ LOGE("finishInitializing() failed");
|
|
|
+ return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
+ }
|
|
|
|
|
|
return resultObject;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Class: com_zerotier_sdk_Node
|
|
|
+ * Method: node_isInited
|
|
|
+ * Signature: (J)Z
|
|
|
+ */
|
|
|
+JNIEXPORT jboolean JNICALL Java_com_zerotier_sdk_Node_node_1isInited
|
|
|
+ (JNIEnv *env, jobject obj, jlong nodeId) {
|
|
|
+ return isInited(nodeId);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Class: com_zerotier_sdk_Node
|
|
|
* Method: node_delete
|
|
@@ -687,25 +766,15 @@ JNIEXPORT void JNICALL Java_com_zerotier_sdk_Node_node_1delete(
|
|
|
LOGV("Destroying ZT_Node struct");
|
|
|
int64_t nodeId = (int64_t)id;
|
|
|
|
|
|
- NodeMap::iterator found;
|
|
|
-
|
|
|
- ZeroTier::Mutex::Lock lock(nodeMapMutex);
|
|
|
- found = nodeMap.find(nodeId);
|
|
|
+ JniRef *ref = removeRef(nodeId);
|
|
|
|
|
|
- if(found != nodeMap.end())
|
|
|
- {
|
|
|
- JniRef *ref = found->second;
|
|
|
- nodeMap.erase(found);
|
|
|
+ if (!ref) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- ZT_Node_delete(ref->node);
|
|
|
+ ZT_Node_delete(ref->node);
|
|
|
|
|
|
- delete ref;
|
|
|
- ref = NULL;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- LOGE("Attempted to delete a node that doesn't exist!");
|
|
|
- }
|
|
|
+ delete ref;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -728,11 +797,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame(
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline);
|
|
|
if(nbtd_len < 1)
|
|
@@ -794,12 +858,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- LOGE("Couldn't find a valid node!");
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
unsigned int nbtd_len = (unsigned int)env->GetArrayLength(out_nextBackgroundTaskDeadline);
|
|
|
if(nbtd_len < 1)
|
|
@@ -917,11 +975,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline);
|
|
|
if(nbtd_len < 1)
|
|
@@ -951,12 +1004,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_join(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
-
|
|
|
uint64_t nwid = (uint64_t)in_nwid;
|
|
|
|
|
|
ZT_ResultCode rc = ZT_Node_join(node, nwid, NULL, NULL);
|
|
@@ -974,11 +1021,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
uint64_t nwid = (uint64_t)in_nwid;
|
|
|
|
|
@@ -1001,11 +1043,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
uint64_t nwid = (uint64_t)in_nwid;
|
|
|
uint64_t multicastGroup = (uint64_t)in_multicastGroup;
|
|
@@ -1031,11 +1068,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastUnsubscribe(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
uint64_t nwid = (uint64_t)in_nwid;
|
|
|
uint64_t multicastGroup = (uint64_t)in_multicastGroup;
|
|
@@ -1060,10 +1092,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_orbit(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t)id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
uint64_t moonWorldId = (uint64_t)in_moonWorldId;
|
|
|
uint64_t moonSeed = (uint64_t)in_moonSeed;
|
|
@@ -1084,10 +1112,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_deorbit(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t)id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- return ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
|
|
|
- }
|
|
|
|
|
|
uint64_t moonWorldId = (uint64_t)in_moonWorldId;
|
|
|
|
|
@@ -1105,11 +1129,6 @@ JNIEXPORT jlong JNICALL Java_com_zerotier_sdk_Node_address(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return 0;
|
|
|
- }
|
|
|
|
|
|
uint64_t address = ZT_Node_address(node);
|
|
|
return (jlong)address;
|
|
@@ -1142,11 +1161,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return 0;
|
|
|
- }
|
|
|
|
|
|
ZT_VirtualNetworkConfig *vnetConfig = ZT_Node_networkConfig(node, nwid);
|
|
|
|
|
@@ -1184,11 +1198,6 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return 0;
|
|
|
- }
|
|
|
|
|
|
ZT_PeerList *peerList = ZT_Node_peers(node);
|
|
|
|
|
@@ -1238,11 +1247,6 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks(
|
|
|
{
|
|
|
int64_t nodeId = (int64_t) id;
|
|
|
ZT_Node *node = findNode(nodeId);
|
|
|
- if(node == NULL)
|
|
|
- {
|
|
|
- // cannot find valid node. We should never get here.
|
|
|
- return 0;
|
|
|
- }
|
|
|
|
|
|
ZT_VirtualNetworkList *networkList = ZT_Node_networks(node);
|
|
|
if(networkList == NULL)
|