Allow disabling of broadcast packets.
[oweals/tinc.git] / src / route.c
index 9e9f9d041997752d52f6adb0e724a3a5618a3983..0b77bd4a11bacd9ba6a8baa4510f8c57cc191b74 100644 (file)
@@ -39,6 +39,7 @@ bool directonly = false;
 bool priorityinheritance = false;
 int macexpire = 600;
 bool overwrite_mac = false;
+bool broadcast = true;
 mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}};
 
 /* Sizes of various headers */
@@ -423,11 +424,11 @@ static void route_ipv4(node_t *source, vpn_packet_t *packet) {
        if(!checklength(source, packet, ether_size + ip_size))
                return;
 
-       if(((packet->data[30] & 0xf0) == 0xe0) || (
+       if(broadcast && (((packet->data[30] & 0xf0) == 0xe0) || (
                        packet->data[30] == 255 &&
                        packet->data[31] == 255 &&
                        packet->data[32] == 255 &&
-                       packet->data[33] == 255))
+                       packet->data[33] == 255)))
                broadcast_packet(source, packet);
        else
                route_ipv4_unicast(source, packet);
@@ -715,7 +716,7 @@ static void route_ipv6(node_t *source, vpn_packet_t *packet) {
                return;
        }
 
-       if(packet->data[38] == 255)
+       if(broadcast && packet->data[38] == 255)
                broadcast_packet(source, packet);
        else
                route_ipv6_unicast(source, packet);
@@ -805,7 +806,8 @@ static void route_mac(node_t *source, vpn_packet_t *packet) {
        subnet = lookup_subnet_mac(NULL, &dest);
 
        if(!subnet) {
-               broadcast_packet(source, packet);
+               if(broadcast)
+                       broadcast_packet(source, packet);
                return;
        }