mDNS: review of Alessandro Gnagni patch, inserted a config value to enable or disable...
authorAlessandro Gnagni <enterprise.nx@gmail.com>
Tue, 5 Jun 2012 07:20:46 +0000 (09:20 +0200)
committerSaverio Proto <zioproto@gmail.com>
Mon, 13 Aug 2012 17:37:39 +0000 (19:37 +0200)
lib/mdns/README
lib/mdns/src/NetworkInterfaces.c
lib/mdns/src/NetworkInterfaces.h
lib/mdns/src/mdns.c
lib/mdns/src/olsrd_plugin.c

index 9418f3d..0950f8d 100644 (file)
@@ -46,7 +46,8 @@ LoadPlugin "olsrd_mdns.so.1.0.0"
 {
 PlParam     "NonOlsrIf"  "eth0"
 PlParam     "NonOlsrIf"  "eth1"
-PlParam     "MDNS_TTL"  "5"
+PlParam     "MDNS_TTL"   "5"
+PLParam     "TTL_Check"  "true"
 }
 
 Where eth0 and eth1 are the names of the interfaces where you want to capture traffic (and decapsulate incoming traffic).
@@ -57,6 +58,7 @@ This version of the plugin will not chech this stuff to be properly configured!
 MDNS_TTL is the time to live given to the MDNS OLSR messages. It makes no sense to announce your services to hosts that are too many hops away, because they will experience a very bad unicast connection.
 With this TTL setting we can tune how far we announce our services and we make the protocol scale much better
 
+TTL_Check enable or disable the rule that set TTL/HopLimit of generated mDns packet to 1 and discard capture of packets with TTL/HopLimit set to 1
 === References ===
 
  * Multicast DNS: [http://tools.ietf.org/html/draft-cheshire-dnsext-multicastdns-07 IETF draft-cheshire-dnsext-multicastdns-07]
index be8a599..9aac2ea 100644 (file)
@@ -60,6 +60,7 @@
 #include <netinet/ip.h>         /* struct ip */
 #include <netinet/udp.h>        /* SOL_UDP */
 #include <stdlib.h>             /* atoi, malloc */
+#include <strings.h>    /* strcasecmp */
 
 /* OLSRD includes */
 #include "olsr.h"               /* OLSR_PRINTF() */
@@ -77,6 +78,7 @@
 #include "Address.h"            /* IsMulticast() */
 
 int my_MDNS_TTL = 0;
+int my_TTL_Check = 1;
 
 /* List of network interface objects used by BMF plugin */
 struct TBmfInterface *BmfInterfaces = NULL;
@@ -542,6 +544,14 @@ AddNonOlsrBmfIf(const char *ifName, void *data __attribute__ ((unused)), set_plu
   return 0;
 }                               /* AddNonOlsrBmfIf */
 
+
+int
+set_TTL_Check(const char *TTL_Check, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+assert(TTL_Check!= NULL);
+set_plugin_boolean(TTL_Check, &my_TTL_Check, addon);
+} /* Set TTL Check */
+
 int
 AddFilteredHost(const char *host, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
 {
index e04159b..82371d2 100644 (file)
@@ -104,6 +104,7 @@ struct TBmfInterface {
 extern struct TBmfInterface *BmfInterfaces;
 
 extern int my_MDNS_TTL;
+extern int my_TTL_Check;
 
 extern int HighestSkfd;
 extern fd_set InputSet;
@@ -146,6 +147,7 @@ void AddInterface(struct interface *newIntf);
 void CloseBmfNetworkInterfaces(void);
 int AddNonOlsrBmfIf(const char *ifName, void *data, set_plugin_parameter_addon addon);
 int AddFilteredHost(const char *host, void *data, set_plugin_parameter_addon addon);
+int set_TTL_Check(const char *TTL_Check, void *data, set_plugin_parameter_addon addon);
 int set_MDNS_TTL(const char *MDNS_TTL, void *data, set_plugin_parameter_addon addon);
 int IsNonOlsrBmfIf(const char *ifName);
 void CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadAddr);
index 34046fc..fc4e31e 100644 (file)
@@ -115,12 +115,14 @@ PacketReceivedFromOLSR(unsigned char *encapsulationUdpData, int len)
       if ((encapsulationUdpData[0] & 0xf0) == 0x40) {
         dest.sll_protocol = htons(ETH_P_IP);
        stripped_len = ntohs(ipHeader->ip_len);
-       ipHeader->ip_ttl = (u_int8_t) 1; //setting up TTL to 1 to avoid mdns packets flood 
+       if(my_TTL_Check)
+               ipHeader->ip_ttl = (u_int8_t) 1; //setting up TTL to 1 to avoid mdns packets flood 
        }
       if ((encapsulationUdpData[0] & 0xf0) == 0x60) {
         dest.sll_protocol = htons(ETH_P_IPV6);
         stripped_len = 40 + ntohs(ip6Header->ip6_plen); //IPv6 Header size (40) + payload_len 
-        ip6Header->ip6_hops = (uint8_t) 1; //setting up Hop Limit to 1 to avoid mdns packets flood
+        if(my_TTL_Check)
+               ip6Header->ip6_hops = (uint8_t) 1; //setting up Hop Limit to 1 to avoid mdns packets flood
         }
       // Sven-Ola: Don't know how to handle the "stripped_len is uninitialized" condition, maybe exit(1) is better...?
       if (0 == stripped_len) return;
@@ -376,8 +378,9 @@ BmfPacketCaptured(
     if (destPort != 5353) {
       return;
     }
-    if(((u_int8_t) ipHeader->ip_ttl) <= ((u_int8_t) 1))    // Discard mdns packet with TTL limit 1 or less
-      return;
+    if(my_TTL_Check)
+       if(((u_int8_t) ipHeader->ip_ttl) <= ((u_int8_t) 1))    // Discard mdns packet with TTL limit 1 or less
+               return;
 
     if (isInFilteredList(&src)) {
 
@@ -408,9 +411,9 @@ BmfPacketCaptured(
     if (destPort != 5353) {
       return;
     }
-    
-    if(((uint8_t) ipHeader6->ip6_hops) <= ((uint8_t) 1))  // Discard mdns packet with hop limit 1 or less
-      return;
+    if(my_TTL_Check)
+       if(((uint8_t) ipHeader6->ip6_hops) <= ((uint8_t) 1))  // Discard mdns packet with hop limit 1 or less
+               return;
     
     if (isInFilteredList(&src)) {
     
index 920e040..ded6c71 100644 (file)
@@ -126,6 +126,7 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
   {.name = "NonOlsrIf",.set_plugin_parameter = &AddNonOlsrBmfIf,.data = NULL},
   {.name = "MDNS_TTL", .set_plugin_parameter = &set_MDNS_TTL, .data = NULL },
   {.name = "FilteredHost", .set_plugin_parameter = &AddFilteredHost, .data = NULL },
+  {.name = "TTL_Check", .set_plugin_parameter = &set_TTL_Check, .data = NULL},
   //{ .name = "DoLocalBroadcast", .set_plugin_parameter = &DoLocalBroadcast, .data = NULL },
   //{ .name = "BmfInterface", .set_plugin_parameter = &SetBmfInterfaceName, .data = NULL },
   //{ .name = "BmfInterfaceIp", .set_plugin_parameter = &SetBmfInterfaceIp, .data = NULL },