io_add(loop, &loop->signalio, signalio_handler, NULL, loop->pipefd[0], IO_READ);
}
+void signal_trigger(event_loop_t *loop, signal_t *sig) {
+
+ uint8_t signum = sig->signum;
+ write(loop->pipefd[1], &signum, 1);
+ return;
+
+}
+
void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum) {
if(sig->cb)
return;
meshlink_handle_t *mesh = xzalloc(sizeof *mesh);
mesh->confbase = xstrdup(confbase);
mesh->name = xstrdup(name);
+ pthread_mutex_init ( &(mesh->outpacketqueue_mutex), NULL);
event_loop_init(&mesh->loop);
mesh->loop.data = mesh;
}
bool meshlink_send(meshlink_handle_t *mesh, meshlink_node_t *destination, const void *data, unsigned int len) {
+
+ /* If there is no outgoing list yet, create one. */
+
+ if(!mesh->outpacketqueue)
+ mesh->outpacketqueue = list_alloc(NULL);
+
+ //add packet to the queue
+ outpacketqueue_t *packet_in_queue = xzalloc(sizeof *packet_in_queue);
+ packet_in_queue->destination=destination;
+ packet_in_queue->data=data;
+ packet_in_queue->len=len;
+ pthread_mutex_lock(&(mesh->outpacketqueue_mutex));
+ list_insert_head(mesh->outpacketqueue,packet_in_queue);
+ pthread_mutex_unlock(&(mesh->outpacketqueue_mutex));
+
+ //notify event loop
+ signal_trigger(&(mesh->loop),&(mesh->datafromapp));
+ return true;
+}
+
+void meshlink_send_from_queue(event_loop_t* el,meshlink_handle_t *mesh) {
vpn_packet_t packet;
meshlink_packethdr_t *hdr = (meshlink_packethdr_t *)packet.data;
- if (sizeof(meshlink_packethdr_t) + len > MAXSIZE) {
+
+ outpacketqueue_t* p = list_get_tail(mesh->outpacketqueue);
+ if (p)
+ list_delete_tail(mesh->outpacketqueue);
+ else return ;
+
+ if (sizeof(meshlink_packethdr_t) + p->len > MAXSIZE) {
//log something
- return false;
+ return ;
}
packet.probe = false;
memset(hdr, 0, sizeof *hdr);
- memcpy(hdr->destination, destination->name, sizeof hdr->destination);
+ memcpy(hdr->destination, p->destination->name, sizeof hdr->destination);
memcpy(hdr->source, mesh->self->name, sizeof hdr->source);
- packet.len = sizeof *hdr + len;
- memcpy(packet.data + sizeof *hdr, data, len);
+ packet.len = sizeof *hdr + p->len;
+ memcpy(packet.data + sizeof *hdr, p->data, p->len);
mesh->self->in_packets++;
mesh->self->in_bytes += packet.len;
route(mesh, mesh->self, &packet);
- return false;
+ return ;
}
meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name) {
#include <stdbool.h>
#include <stddef.h>
+#include "event.h"
#ifdef __cplusplus
extern "C" {
MESHLINK_ENOMEM, // Out of memory
MESHLINK_ENOENT, // Node is not known
} meshlink_errno_t;
+typedef struct outpacketqueue {
+ meshlink_node_t *destination;
+ const void *data;
+ unsigned int len;
+} outpacketqueue_t;
#ifndef MESHLINK_INTERNAL_H
*/
extern bool meshlink_send(meshlink_handle_t *mesh, meshlink_node_t *destination, const void *data, unsigned int len);
+extern void meshlink_send_from_queue(event_loop_t* el,meshlink_handle_t *mesh);
+
/// Get a handle for a specific node.
/** This function returns a handle for the node with the given name.
*
timeout_add(&mesh->loop, &mesh->pingtimer, timeout_handler, &mesh->pingtimer, &(struct timeval){mesh->pingtimeout, rand() % 100000});
timeout_add(&mesh->loop, &mesh->periodictimer, periodic_handler, &mesh->periodictimer, &(struct timeval){mesh->pingtimeout, rand() % 100000});
+ //Add signal handler
+ mesh->datafromapp.signum = 0;
+ signal_add(&(mesh->loop),&(mesh->datafromapp), (signal_cb_t)meshlink_send_from_queue,mesh, mesh->datafromapp.signum);
+
if(!event_loop_run(&mesh->loop)) {
logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", strerror(errno));
return 1;