Added IP deny set and filtering
authorAndreas Tonnesen <andreto@olsr.org>
Mon, 11 Apr 2005 18:43:40 +0000 (18:43 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Mon, 11 Apr 2005 18:43:40 +0000 (18:43 +0000)
CHANGELOG
src/main.c
src/net.c
src/net.h
src/process_package.c

index 93770d1..fd380c3 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,15 @@
 This file states changes as of version 0.2.4:
-$Id: CHANGELOG,v 1.42 2005/04/11 09:09:23 kattemat Exp $
+$Id: CHANGELOG,v 1.43 2005/04/11 18:43:22 kattemat Exp $
 
 0.4.10 --------------------------------------------------------------------
 
+IP ADDRESS VALIDATION
+
+Olsrd now maintains a set of IP addresses that is considered
+invalid. Checks against this set is done on all received
+OLSR packets announced originator addresses. The dataset can
+be updated dynamically.
+
 PLUGIN INTERFACE
 
 Updated interface version to 3 and added more noticeable warning 
index 853243c..68f9be2 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.74 2005/04/05 09:01:03 kattemat Exp $
+ * $Id: main.c,v 1.75 2005/04/11 18:43:37 kattemat Exp $
  */
 
 #include <unistd.h>
@@ -314,6 +314,8 @@ main(int argc, char *argv[])
       minsize = (int)sizeof(olsr_u8_t) * 4; /* Minimum packetsize IPv4 */
     }
 
+  /* Initialize net */
+  init_net();
 
   /* Initializing networkinterfaces */
   if(!ifinit())
index 88dc5c0..09bb35f 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.38 2005/03/10 20:43:13 kattemat Exp $
+ * $Id: net.c,v 1.39 2005/04/11 18:43:40 kattemat Exp $
  */
 
 #include "net.h"
@@ -66,6 +66,61 @@ struct olsr_netbuf *netbufs[MAX_IFS];
 
 static char ipv6_buf[100]; /* for address coversion */
 
+static struct deny_address_entry *deny_entries;
+
+static char *deny_ipv4_defaults[] =
+  {
+    "0.0.0.0",
+    "127.0.0.1",
+    NULL
+  };
+
+static char *deny_ipv6_defaults[] =
+  {
+    "0::0",
+    "0::1",
+    NULL
+  };
+
+
+void
+init_net()
+{
+  union olsr_ip_addr addr;
+  int i;
+
+  /* Block invalid addresses */
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IPv4 */
+      for(i = 0; deny_ipv4_defaults[i] != NULL; i++)
+       {
+         if(inet_pton(olsr_cnf->ip_version, deny_ipv4_defaults[i], &addr) < 0)
+           {
+             fprintf(stderr, "Error converting fixed IP %s for deny rule!!\n",
+                     deny_ipv4_defaults[i]);
+             continue;
+           }
+         olsr_add_invalid_address(&addr);
+       }
+    }
+  else 
+    {
+      /* IPv6 */
+      for(i = 0; deny_ipv6_defaults[i] != NULL; i++)
+       {
+         if(inet_pton(olsr_cnf->ip_version, deny_ipv6_defaults[i], &addr) < 0)
+           {
+             fprintf(stderr, "Error converting fixed IP %s for deny rule!!\n",
+                     deny_ipv6_defaults[i]);
+             continue;
+           }
+         olsr_add_invalid_address(&addr);
+       }
+
+    }
+}
+
 /**
  * Create a outputbuffer for the given interface. This
  * function will allocate the needed storage according 
@@ -629,3 +684,49 @@ olsr_ip_to_string(union olsr_ip_addr *addr)
 
   return ret;
 }
+
+
+void
+olsr_add_invalid_address(union olsr_ip_addr *adr)
+{
+  struct deny_address_entry *new_entry;
+
+  new_entry = olsr_malloc(sizeof(struct deny_address_entry), "Add deny address");
+
+  new_entry->next = deny_entries;
+  COPY_IP(&new_entry->addr, adr);
+
+  deny_entries = new_entry;
+
+  OLSR_PRINTF(1, "Added %s to IP deny set\n", olsr_ip_to_string(&new_entry->addr))
+  return;
+}
+
+/**
+ *Converts the 32bit olsr_u32_t datatype to
+ *a char array.
+ *
+ *<b>NON REENTRANT</b>
+ *
+ *@param addr6 the address to "convert"
+ *@return a char pointer to the string containing the IP
+ */
+olsr_bool
+olsr_validate_address(union olsr_ip_addr *adr)
+{
+  struct deny_address_entry *deny_entry = deny_entries;
+
+  while(deny_entry)
+    {
+      if(COMP_IP(adr, &deny_entry->addr))
+       {
+         OLSR_PRINTF(1, "Validation of address %s failed!\n",
+                     olsr_ip_to_string(adr))
+         return OLSR_FALSE;
+       }
+
+      deny_entry = deny_entry->next;
+    }
+
+  return OLSR_TRUE;
+}
index d2166f0..55492b1 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.h,v 1.17 2005/03/04 21:30:16 kattemat Exp $
+ * $Id: net.h,v 1.18 2005/04/11 18:43:40 kattemat Exp $
  */
 
 
 #include <arpa/inet.h>
 #include <net/if.h>
 
+struct deny_address_entry
+{
+  union olsr_ip_addr        addr;
+  struct deny_address_entry *next;
+};
+
+
 /* Output buffer structure */
 
 struct olsr_netbuf
@@ -115,6 +122,10 @@ add_ptf(int (*)(char *, int *));
 int
 del_ptf(int (*f)(char *, int *));
 
+olsr_bool
+olsr_validate_address(union olsr_ip_addr *);
 
+void
+olsr_add_invalid_address(union olsr_ip_addr *);
 
 #endif
index 3fc564f..079f34e 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_package.c,v 1.33 2005/02/26 23:01:41 kattemat Exp $
+ * $Id: process_package.c,v 1.34 2005/04/11 18:43:40 kattemat Exp $
  */
 
 
@@ -201,6 +201,12 @@ olsr_process_received_hello(union olsr_message *m, struct interface *in_if, unio
 
   hello_chgestruct(&message, m);
 
+  if(!olsr_validate_address(&message.source_addr))
+    {
+      olsr_free_hello_packet(&message);
+      return;
+    }
+
   olsr_hello_tap(&message, in_if, from_addr);
 }
 
@@ -317,6 +323,12 @@ olsr_process_received_tc(union olsr_message *m, struct interface *in_if, union o
 
   tc_chgestruct(&message, m, from_addr);
 
+  if(!olsr_validate_address(&message.source_addr))
+    {
+      olsr_free_tc_packet(&message);
+      return;
+    }
+
   olsr_tc_tap(&message, in_if, from_addr, m);
 }
 
@@ -342,6 +354,12 @@ olsr_process_received_mid(union olsr_message *m, struct interface *in_if, union
 
   mid_chgestruct(&message, m);
 
+  if(!olsr_validate_address(&message.mid_origaddr))
+    {
+      olsr_free_mid_packet(&message);
+      return;
+    }
+
   if(!olsr_check_dup_table_proc(&message.mid_origaddr, 
                                message.mid_seqno))
     {
@@ -418,6 +436,12 @@ olsr_process_received_hna(union olsr_message *m, struct interface *in_if, union
 
   hna_chgestruct(&message, m);
 
+  if(!olsr_validate_address(&message.originator))
+    {
+      olsr_free_hna_packet(&message);
+      return;
+    }
+
   if(!olsr_check_dup_table_proc(&message.originator, 
                                message.packet_seq_number))
     {