]> git.meshlink.io Git - meshlink/blobdiff - src/bsd/device.c
More consistent variable naming.
[meshlink] / src / bsd / device.c
index 045fc188241b03f07864453cba54f760bb758cf8..70f4757fedbf5669e1b75c834df1072bc4ab06cd 100644 (file)
@@ -1,7 +1,7 @@
 /*
     device.c -- Interaction BSD tun/tap device
-    Copyright (C) 2001-2004 Ivo Timmermans <ivo@tinc-vpn.org>,
-                  2001-2004 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2001-2005 Ivo Timmermans,
+                  2001-2007 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -49,10 +49,6 @@ static device_type_t device_type = DEVICE_TYPE_TUN;
 #endif
 
 bool setup_device(void) {
-#ifdef TUNSIFHEAD
-       const int zero = 0;
-       const int one = 1;
-#endif
        char *type;
 
        cp();
@@ -91,20 +87,40 @@ bool setup_device(void) {
                        device_type = DEVICE_TYPE_TUN;
                case DEVICE_TYPE_TUN:
 #ifdef TUNSIFHEAD
+               {       
+                       const int zero = 0;
                        if(ioctl(device_fd, TUNSIFHEAD, &zero, sizeof zero) == -1) {
                                logger(LOG_ERR, _("System call `%s' failed: %s"), "ioctl", strerror(errno));
                                return false;
                        }
+               }
 #endif
+#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
+               {
+                       const int mode = IFF_BROADCAST | IFF_MULTICAST;
+                       ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode);
+               }
+#endif
+
                        device_info = _("Generic BSD tun device");
                        break;
                case DEVICE_TYPE_TUNIFHEAD:
 #ifdef TUNSIFHEAD
+               {
+                       const int one = 1;
                        if(ioctl(device_fd, TUNSIFHEAD, &one, sizeof one) == -1) {
                                logger(LOG_ERR, _("System call `%s' failed: %s"), "ioctl", strerror(errno));
                                return false;
                        }
+               }
+#endif
+#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
+               {
+                               const int mode = IFF_BROADCAST | IFF_MULTICAST;
+                               ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode);
+               }
 #endif
+
                        device_info = _("Generic BSD tun device");
                        break;
                case DEVICE_TYPE_TAP:
@@ -126,13 +142,13 @@ void close_device(void) {
 }
 
 bool read_packet(vpn_packet_t *packet) {
-       int lenin;
+       int inlen;
 
        cp();
 
        switch(device_type) {
                case DEVICE_TYPE_TUN:
-                       if((lenin = read(device_fd, packet->data + 14, MTU - 14)) <= 0) {
+                       if((inlen = read(device_fd, packet->data + 14, MTU - 14)) <= 0) {
                                logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info,
                                           device, strerror(errno));
                                return false;
@@ -154,14 +170,14 @@ bool read_packet(vpn_packet_t *packet) {
                                        return false;
                        }
 
-                       packet->len = lenin + 14;
+                       packet->len = inlen + 14;
                        break;
 
                case DEVICE_TYPE_TUNIFHEAD: {
                        u_int32_t type;
                        struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
 
-                       if((lenin = readv(device_fd, vector, 2)) <= 0) {
+                       if((inlen = readv(device_fd, vector, 2)) <= 0) {
                                logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info,
                                           device, strerror(errno));
                                return false;
@@ -185,18 +201,18 @@ bool read_packet(vpn_packet_t *packet) {
                                        return false;
                        }
 
-                       packet->len = lenin + 10;
+                       packet->len = inlen + 10;
                        break;
                }
 
                case DEVICE_TYPE_TAP:
-                       if((lenin = read(device_fd, packet->data, MTU)) <= 0) {
+                       if((inlen = read(device_fd, packet->data, MTU)) <= 0) {
                                logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info,
                                           device, strerror(errno));
                                return false;
                        }
 
-                       packet->len = lenin;
+                       packet->len = inlen;
                        break;
 
                default:
@@ -211,8 +227,7 @@ bool read_packet(vpn_packet_t *packet) {
        return true;
 }
 
-bool write_packet(vpn_packet_t *packet)
-{
+bool write_packet(vpn_packet_t *packet) {
        cp();
 
        ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Writing packet of %d bytes to %s"),
@@ -229,7 +244,7 @@ bool write_packet(vpn_packet_t *packet)
 
                case DEVICE_TYPE_TUNIFHEAD: {
                        u_int32_t type;
-                       struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
+                       struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, packet->len - 14}};
                        int af;
                        
                        af = (packet->data[12] << 8) + packet->data[13];
@@ -273,8 +288,7 @@ bool write_packet(vpn_packet_t *packet)
        return true;
 }
 
-void dump_device_stats(void)
-{
+void dump_device_stats(void) {
        cp();
 
        logger(LOG_DEBUG, _("Statistics for %s %s:"), device_info, device);