#include "meshlink_internal.h"
#include "netutl.h"
#include "node.h"
+#include "submesh.h"
#include "protocol.h"
#include "route.h"
#include "sockaddr.h"
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
{"Name", VAR_SERVER},
/* Host configuration */
+ {"SubMesh", VAR_HOST | VAR_SAFE},
{"CanonicalAddress", VAR_HOST},
{"Address", VAR_HOST | VAR_MULTIPLE},
{"ECDSAPublicKey", VAR_HOST},
mesh->discovery = true;
mesh->invitation_timeout = 604800; // 1 week
mesh->netns = params->netns;
+ mesh->submeshes = NULL;
if(usingname) {
mesh->name = xstrdup(params->name);
return mesh;
}
+meshlink_submesh_t *meshlink_submesh_open(meshlink_handle_t *mesh, const char *submesh) {
+ meshlink_submesh_t *s = NULL;
+
+ if(!mesh) {
+ logger(NULL, MESHLINK_ERROR, "No mesh handle given!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ if(!submesh || !*submesh) {
+ logger(NULL, MESHLINK_ERROR, "No submesh name given!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ s = (meshlink_submesh_t *)lookup_submesh(mesh, submesh);
+
+ if(s) {
+ logger(NULL, MESHLINK_ERROR, "SubMesh Already exists!\n");
+ meshlink_errno = MESHLINK_EEXIST;
+ return NULL;
+ }
+
+ s = (meshlink_submesh_t *)new_submesh();
+ s->name = xstrdup(submesh);
+
+ submesh_add(mesh, (submesh_t *)s);
+
+ meshlink_errno = MESHLINK_OK;
+ return s;
+}
+
static void *meshlink_main_loop(void *arg) {
meshlink_handle_t *mesh = arg;
mesh->invitation_timeout = timeout;
}
-char *meshlink_invite_ex(meshlink_handle_t *mesh, const char *name, uint32_t flags) {
+char *meshlink_invite_ex(meshlink_handle_t *mesh, meshlink_submesh_t *submesh, const char *name, uint32_t flags) {
+ meshlink_submesh_t *s = NULL;
+
if(!mesh) {
meshlink_errno = MESHLINK_EINVAL;
return NULL;
}
+ if(submesh) {
+ s = (meshlink_submesh_t *)lookup_submesh(mesh, submesh->name);
+
+ if(s != submesh) {
+ logger(mesh, MESHLINK_DEBUG, "Invalid SubMesh Handle.\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+ }
+
pthread_mutex_lock(&(mesh->mesh_mutex));
// Check validity of the new node's name
// Fill in the details.
fprintf(f, "Name = %s\n", name);
+
+ if(s) {
+ fprintf(f, "SubMesh = %s\n", s->name);
+ }
+
fprintf(f, "ConnectTo = %s\n", mesh->self->name);
// Copy Broadcast and Mode
return url;
}
-char *meshlink_invite(meshlink_handle_t *mesh, const char *name) {
- return meshlink_invite_ex(mesh, name, 0);
+char *meshlink_invite(meshlink_handle_t *mesh, meshlink_submesh_t *submesh, const char *name) {
+ return meshlink_invite_ex(mesh, submesh, name, 0);
}
bool meshlink_join(meshlink_handle_t *mesh, const char *invitation) {