]> git.meshlink.io Git - meshlink/blobdiff - src/net_socket.c
Merge branch 'master' into 1.1
[meshlink] / src / net_socket.c
index 8df9f38075356632ab778336e9966689bbfa027f..47a41684a7f93008871b88a6cd43616326137756 100644 (file)
 
 #include "system.h"
 
-#include "avl_tree.h"
+#include "splay_tree.h"
 #include "conf.h"
 #include "connection.h"
-#include "event.h"
 #include "logger.h"
 #include "meta.h"
 #include "net.h"
@@ -55,8 +54,7 @@ list_t *outgoing_list = NULL;
 
 /* Setup sockets */
 
-static void configure_tcp(connection_t *c)
-{
+static void configure_tcp(connection_t *c) {
        int option;
 
 #ifdef O_NONBLOCK
@@ -75,12 +73,12 @@ static void configure_tcp(connection_t *c)
 
 #if defined(SOL_TCP) && defined(TCP_NODELAY)
        option = 1;
-       setsockopt(c->socket, SOL_TCP, TCP_NODELAY, &option, sizeof(option));
+       setsockopt(c->socket, SOL_TCP, TCP_NODELAY, &option, sizeof option);
 #endif
 
 #if defined(SOL_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY)
        option = IPTOS_LOWDELAY;
-       setsockopt(c->socket, SOL_IP, IP_TOS, &option, sizeof(option));
+       setsockopt(c->socket, SOL_IP, IP_TOS, &option, sizeof option);
 #endif
 }
 
@@ -190,7 +188,7 @@ int setup_listen_socket(const sockaddr_t *sa)
        /* Optimize TCP settings */
 
        option = 1;
-       setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
+       setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof option);
 
 #if defined(SOL_IPV6) && defined(IPV6_V6ONLY)
        if(sa->sa.sa_family == AF_INET6)
@@ -202,10 +200,10 @@ int setup_listen_socket(const sockaddr_t *sa)
 #if defined(SOL_SOCKET) && defined(SO_BINDTODEVICE)
                struct ifreq ifr;
 
-               memset(&ifr, 0, sizeof(ifr));
+               memset(&ifr, 0, sizeof ifr);
                strncpy(ifr.ifr_ifrn.ifrn_name, iface, IFNAMSIZ);
 
-               if(setsockopt(nfd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr))) {
+               if(setsockopt(nfd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof ifr)) {
                        closesocket(nfd);
                        logger(LOG_ERR, _("Can't bind to interface %s: %s"), iface,
                                   strerror(errno));
@@ -235,8 +233,7 @@ int setup_listen_socket(const sockaddr_t *sa)
        return nfd;
 }
 
-int setup_vpn_in_socket(const sockaddr_t *sa)
-{
+int setup_vpn_in_socket(const sockaddr_t *sa) {
        int nfd;
        char *addrstr;
        int option;
@@ -274,7 +271,7 @@ int setup_vpn_in_socket(const sockaddr_t *sa)
 #endif
 
        option = 1;
-       setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
+       setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof option);
 
 #if defined(SOL_IPV6) && defined(IPV6_V6ONLY)
        if(sa->sa.sa_family == AF_INET6)
@@ -312,10 +309,11 @@ int setup_vpn_in_socket(const sockaddr_t *sa)
        return nfd;
 } /* int setup_vpn_in_socket */
 
-void retry_outgoing(outgoing_t *outgoing)
-{
-       event_t *event;
+static void retry_outgoing_handler(int fd, short events, void *data) {
+       setup_outgoing_connection(data);
+}
 
+void retry_outgoing(outgoing_t *outgoing) {
        cp();
 
        outgoing->timeout += 5;
@@ -323,32 +321,28 @@ void retry_outgoing(outgoing_t *outgoing)
        if(outgoing->timeout > maxtimeout)
                outgoing->timeout = maxtimeout;
 
-       event = new_event();
-       event->handler = (event_handler_t) setup_outgoing_connection;
-       event->time = now + outgoing->timeout;
-       event->data = outgoing;
-       event_add(event);
+       timeout_set(&outgoing->ev, retry_outgoing_handler, outgoing);
+       event_add(&outgoing->ev, &(struct timeval){outgoing->timeout, 0});
 
        ifdebug(CONNECTIONS) logger(LOG_NOTICE,
                           _("Trying to re-establish outgoing connection in %d seconds"),
                           outgoing->timeout);
 }
 
-void finish_connecting(connection_t *c)
-{
+void finish_connecting(connection_t *c) {
        cp();
 
        ifdebug(CONNECTIONS) logger(LOG_INFO, _("Connected to %s (%s)"), c->name, c->hostname);
 
        configure_tcp(c);
 
-       c->last_ping_time = now;
+       c->last_ping_time = time(NULL);
+       c->status.connecting = false;
 
        send_id(c);
 }
 
-void do_outgoing_connection(connection_t *c)
-{
+void do_outgoing_connection(connection_t *c) {
        char *address, *port;
        int result;
 
@@ -359,8 +353,9 @@ begin:
                if(!c->outgoing->cfg) {
                        ifdebug(CONNECTIONS) logger(LOG_ERR, _("Could not set up a meta connection to %s"),
                                           c->name);
-                       c->status.remove = true;
                        retry_outgoing(c->outgoing);
+                       c->outgoing = NULL;
+                       connection_del(c);
                        return;
                }
 
@@ -443,8 +438,22 @@ begin:
        return;
 }
 
-void setup_outgoing_connection(outgoing_t *outgoing)
-{
+void handle_meta_read(struct bufferevent *event, void *data) {
+       logger(LOG_EMERG, _("handle_meta_read() called"));
+       abort();
+}
+
+void handle_meta_write(struct bufferevent *event, void *data) {
+       ifdebug(META) logger(LOG_DEBUG, _("handle_meta_write() called"));
+}
+
+void handle_meta_connection_error(struct bufferevent *event, short what, void *data) {
+       connection_t *c = data;
+       logger(LOG_EMERG, _("handle_meta_connection_error() called: %d: %s"), what, strerror(errno));
+       terminate_connection(c, c->status.active);
+}
+
+void setup_outgoing_connection(outgoing_t *outgoing) {
        connection_t *c;
        node_t *n;
 
@@ -479,32 +488,39 @@ void setup_outgoing_connection(outgoing_t *outgoing)
        }
 
        c->outgoing = outgoing;
-       c->last_ping_time = now;
+       c->last_ping_time = time(NULL);
 
        connection_add(c);
 
        do_outgoing_connection(c);
+
+       event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c);
+       event_add(&c->inevent, NULL);
+       c->buffer = bufferevent_new(c->socket, handle_meta_read, handle_meta_write, handle_meta_connection_error, c);
+       if(!c->buffer) {
+               logger(LOG_EMERG, _("bufferevent_new() failed: %s"), strerror(errno));
+               abort();
+       }
+       bufferevent_disable(c->buffer, EV_READ);
 }
 
 /*
   accept a new tcp connect and create a
   new connection
 */
-bool handle_new_meta_connection(int sock)
-{
+void handle_new_meta_connection(int sock, short events, void *data) {
        connection_t *c;
        sockaddr_t sa;
        int fd;
-       socklen_t len = sizeof(sa);
+       socklen_t len = sizeof sa;
 
        cp();
 
        fd = accept(sock, &sa.sa, &len);
 
        if(fd < 0) {
-               logger(LOG_ERR, _("Accepting a new connection failed: %s"),
-                          strerror(errno));
-               return false;
+               logger(LOG_ERR, _("Accepting a new connection failed: %s"), strerror(errno));
+               return;
        }
 
        sockaddrunmap(&sa);
@@ -519,18 +535,25 @@ bool handle_new_meta_connection(int sock)
        c->address = sa;
        c->hostname = sockaddr2hostname(&sa);
        c->socket = fd;
-       c->last_ping_time = now;
+       c->last_ping_time = time(NULL);
 
        ifdebug(CONNECTIONS) logger(LOG_NOTICE, _("Connection from %s"), c->hostname);
 
+       event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c);
+       event_add(&c->inevent, NULL);
+       c->buffer = bufferevent_new(c->socket, NULL, handle_meta_write, handle_meta_connection_error, c);
+       if(!c->buffer) {
+               logger(LOG_EMERG, _("bufferevent_new() failed: %s"), strerror(errno));
+               abort();
+       }
+       bufferevent_disable(c->buffer, EV_READ);
+               
        configure_tcp(c);
 
        connection_add(c);
 
        c->allow_request = ID;
        send_id(c);
-
-       return true;
 }
 
 void free_outgoing(outgoing_t *outgoing) {
@@ -549,7 +572,7 @@ void try_outgoing_connections(void)
        char *name;
        outgoing_t *outgoing;
        connection_t *c;
-       avl_node_t *node;
+       splay_node_t *node;
        
        cp();
 
@@ -575,7 +598,7 @@ void try_outgoing_connections(void)
                        continue;
                }
 
-               outgoing = xmalloc_and_zero(sizeof(*outgoing));
+               outgoing = xmalloc_and_zero(sizeof *outgoing);
                outgoing->name = name;
                list_insert_tail(outgoing_list, outgoing);
                setup_outgoing_connection(outgoing);