X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Flibmeshlink.c;h=fd7426cace616e9e48e2e2a377689ad7d81169ef;hb=9097c5bb92396e2471e99f0e61a75756a1e9200b;hp=761b3a4137b76202986deaf039d9b2ce07830575;hpb=2956559f7d12caa9779207525419801e0e9ab3e3;p=meshlink diff --git a/src/libmeshlink.c b/src/libmeshlink.c index 761b3a41..fd7426ca 100644 --- a/src/libmeshlink.c +++ b/src/libmeshlink.c @@ -17,12 +17,19 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "libmeshlink.h" -#ifdef HAVE_SYS_MMAN_H -#include -#endif +#include "system.h" + +#include + +#include "connection.h" #include "crypto.h" #include "ecdsagen.h" +#include "edge.h" +#include "libmeshlink.h" +#include "net.h" +#include "node.h" +#include "protocol.h" + char *hosts_dir = NULL; static char *name = NULL; char *tinc_conf = NULL; @@ -33,37 +40,6 @@ static bool tty = false; static bool do_mlock = false; #endif -/* - initialize network -*/ -bool setup_meshlink_network(void) { - init_connections(); - init_nodes(); - init_edges(); - init_requests(); - - if(get_config_int(lookup_config(config_tree, "PingInterval"), &pinginterval)) { - if(pinginterval < 1) { - pinginterval = 86400; - } - } else - pinginterval = 60; - - if(!get_config_int(lookup_config(config_tree, "PingTimeout"), &pingtimeout)) - pingtimeout = 5; - if(pingtimeout < 1 || pingtimeout > pinginterval) - pingtimeout = pinginterval; - - //TODO: check if this makes sense in libmeshlink - if(!get_config_int(lookup_config(config_tree, "MaxOutputBufferSize"), &maxoutbufsize)) - maxoutbufsize = 10 * MTU; - - if(!setup_myself()) - return false; - - return true; -} - /* Open a file with the desired permissions, minus the umask. Also, if we want to create an executable file, we call fchmod() to set the executable bits. */ @@ -292,7 +268,7 @@ static bool try_bind(int port) { return true; } -int check_port(char *name) { +int check_port(const char *name) { if(try_bind(655)) return 655; @@ -366,13 +342,26 @@ bool tinc_setup(const char* confbaseapi, const char* name) { bool tinc_start(const char* confbaseapi) { pthread_t tincThread; - confbase = confbaseapi; - pthread_create(&tincThread,NULL,tinc_main_thread,confbaseapi); + confbase = xstrdup(confbaseapi); + pthread_create(&tincThread,NULL,tinc_main_thread,confbase); pthread_detach(tincThread); return true; } -bool tinc_main_thread(void * in) { +__attribute__((constructor)) static void meshlink_init(void) { + /* Slllluuuuuuurrrrp! */ + + gettimeofday(&now, NULL); + srand(now.tv_sec + now.tv_usec); + crypto_init(); +} + +__attribute__((destructor)) static void meshlink_exit(void) { + crypto_exit(); +} + + +void *tinc_main_thread(void * in) { static bool status = false; /* If nonzero, write log entries to a separate file. */ @@ -384,61 +373,16 @@ bool tinc_main_thread(void * in) { init_configuration(&config_tree); - /* Slllluuuuuuurrrrp! */ - - gettimeofday(&now, NULL); - srand(now.tv_sec + now.tv_usec); - crypto_init(); - if(!read_server_config()) return false; //char *priority = NULL; //shoud be not needed in libmeshlink -#ifdef HAVE_MLOCKALL - /* Lock all pages into memory if requested. - * This has to be done after daemon()/fork() so it works for child. - * No need to do that in parent as it's very short-lived. */ - if(do_mlock && mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "mlockall", - strerror(errno)); - return 1; - } -#endif - /* Setup sockets and open device. */ - if(!setup_meshlink_network()) + if(!setup_network()) goto end; - /* Change process priority */ - //should be not needed in libmeshlink - //if(get_config_string(lookup_config(config_tree, "ProcessPriority"), &priority)) { - // if(!strcasecmp(priority, "Normal")) { - // if (setpriority(NORMAL_PRIORITY_CLASS) != 0) { - // logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "setpriority", strerror(errno)); - // goto end; - // } - // } else if(!strcasecmp(priority, "Low")) { - // if (setpriority(BELOW_NORMAL_PRIORITY_CLASS) != 0) { - // logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "setpriority", strerror(errno)); - // goto end; - // } - // } else if(!strcasecmp(priority, "High")) { - // if (setpriority(HIGH_PRIORITY_CLASS) != 0) { - // logger(DEBUG_ALWAYS, LOG_ERR, "System call `%s' failed: %s", "setpriority", strerror(errno)); - // goto end; - // } - // } else { - // logger(DEBUG_ALWAYS, LOG_ERR, "Invalid priority `%s`!", priority); - // goto end; - // } - //} - - /* drop privileges */ - //if (!drop_privs()) - // goto end; - /* Start main loop. It only exits when tinc is killed. */ logger(DEBUG_ALWAYS, LOG_NOTICE, "Ready"); @@ -456,67 +400,37 @@ end: //free(priority); - crypto_exit(); - exit_configuration(&config_tree); - return status; - + return (void *)status; } bool tinc_stop(); -bool route_meshlink(node_t *source,vpn_packet_t *packet) { - - printf("data %s\n",packet->data); - printf("data 16%s\n",packet->data+16); - printf("data 32%s\n",packet->data+32); - node_t* owner = NULL; - - tincpackethdr* hdr = (tincpackethdr*)packet->data; - owner = lookup_node(hdr->destination); - - if (owner == NULL) { - //Lookup failed - printf("NULL\n"); - return false; - } - printf("lookupnode %s\n",owner->name); - - if(!owner->status.reachable) { - //Do some here - return false; - } - - //TODO: I skipped here a lot of checks ! - - send_packet(owner,packet); - -} // can be called from any thread bool tinc_send_packet(node_t *receiver, const char* buf, unsigned int len) { vpn_packet_t packet; tincpackethdr* hdr = malloc(sizeof(tincpackethdr)); - - if (sizeof(hdr) + len > MAXSIZE) { + if (sizeof(tincpackethdr) + len > MAXSIZE) { //log something return false; } + memset(hdr->legacymtu,1,sizeof(hdr->legacymtu)); memcpy(hdr->destination,receiver->name,sizeof(hdr->destination)); memcpy(hdr->source,myself->name,sizeof(hdr->source)); packet.priority = 0; - packet.len = len + 32; + packet.len = sizeof(tincpackethdr) + len; - memcpy(packet.data,hdr,32); - memcpy(packet.data+32,buf,len); + memcpy(packet.data,hdr,sizeof(tincpackethdr)); + memcpy(packet.data+sizeof(tincpackethdr),buf,len); myself->in_packets++; myself->in_bytes += packet.len; - route_meshlink(myself, &packet); + route(myself, &packet); return true; }