Use libvdeplug.h instead of libvdeplug_dyn.h
[tinc] / src / vde_device.c
index 73ad713..f30c3e3 100644 (file)
 
 #include "system.h"
 
-#include <libvdeplug_dyn.h>
+#include <libvdeplug.h>
 
 #include "conf.h"
 #include "device.h"
 #include "names.h"
 #include "net.h"
 #include "logger.h"
-#include "utils.h"
 #include "route.h"
 #include "xalloc.h"
 
-static struct vdepluglib plug;
 static struct vdeconn *conn = NULL;
 static int port = 0;
 static char *group = NULL;
-static char *device_info;
+static const char *device_info = "VDE socket";
 
 static bool setup_device(void) {
-       libvdeplug_dynopen(plug);
-
-       if(!plug.dl_handle) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Could not open libvdeplug library!");
-               return false;
+       if(!get_config_string(lookup_config(config_tree, "Device"), &device)) {
+               xasprintf(&device, RUNSTATEDIR "/vde.ctl");
        }
 
-       if(!get_config_string(lookup_config(config_tree, "Device"), &device))
-               xasprintf(&device, LOCALSTATEDIR "/run/vde.ctl");
-
        get_config_string(lookup_config(config_tree, "Interface"), &iface);
 
        get_config_int(lookup_config(config_tree, "VDEPort"), &port);
 
        get_config_string(lookup_config(config_tree, "VDEGroup"), &group);
 
-       device_info = "VDE socket";
-
        struct vde_open_args args = {
                .port = port,
                .group = group,
                .mode = 0700,
        };
 
-       conn = plug.vde_open(device, identname, &args);
+       conn = vde_open(device, identname, &args);
+
        if(!conn) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Could not open VDE socket %s", device);
                return false;
        }
 
-       device_fd = plug.vde_datafd(conn);
+       device_fd = vde_datafd(conn);
 
 #ifdef FD_CLOEXEC
        fcntl(device_fd, F_SETFD, FD_CLOEXEC);
@@ -75,35 +66,49 @@ static bool setup_device(void) {
 
        logger(DEBUG_ALWAYS, LOG_INFO, "%s is a %s", device, device_info);
 
-       if(routing_mode == RMODE_ROUTER)
+       if(routing_mode == RMODE_ROUTER) {
                overwrite_mac = true;
+       }
 
        return true;
 }
 
 static void close_device(void) {
        if(conn) {
-               plug.vde_close(conn); conn = NULL;
+               vde_close(conn);
+               conn = NULL;
        }
 
-       if(plug.dl_handle)
-               libvdeplug_dynclose(plug);
-
-       free(device); device = NULL;
+       free(device);
+       device = NULL;
 
-       free(iface); iface = NULL;
+       free(iface);
+       iface = NULL;
 
        device_info = NULL;
 }
 
 static bool read_packet(vpn_packet_t *packet) {
-       int lenin = (ssize_t)plug.vde_recv(conn, DATA(packet), MTU, 0);
+       ssize_t lenin = vde_recv(conn, DATA(packet), MTU, 0);
+
        if(lenin <= 0) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno));
                event_exit();
                return false;
        }
 
+       if(lenin == 1) {
+               logger(DEBUG_TRAFFIC, LOG_DEBUG,
+                      "Dropped a packet received from %s - the sender was not allowed to send that packet.", device_info);
+               return false;
+       }
+
+       if(lenin < 14) {
+               logger(DEBUG_TRAFFIC, LOG_DEBUG,
+                      "Received an invalid packet from %s - packet shorter than an ethernet header).", device_info);
+               return false;
+       }
+
        packet->len = lenin;
 
        logger(DEBUG_TRAFFIC, LOG_DEBUG, "Read packet of %d bytes from %s", packet->len, device_info);
@@ -112,7 +117,7 @@ static bool read_packet(vpn_packet_t *packet) {
 }
 
 static bool write_packet(vpn_packet_t *packet) {
-       if((ssize_t)plug.vde_send(conn, DATA(packet), packet->len, 0) < 0) {
+       if(vde_send(conn, DATA(packet), packet->len, 0) < 0) {
                if(errno != EINTR && errno != EAGAIN) {
                        logger(DEBUG_ALWAYS, LOG_ERR, "Can't write to %s %s: %s", device_info, device, strerror(errno));
                        event_exit();