Added disable_redirects_global function
authorAndreas Tonnesen <andreto@olsr.org>
Sun, 28 Aug 2005 19:30:30 +0000 (19:30 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sun, 28 Aug 2005 19:30:30 +0000 (19:30 +0000)
src/bsd/net.c
src/linux/net.c
src/linux/net.h
src/main.c
src/net_os.h
src/unix/ifnet.c

index b0df700..f121cfb 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.25 2005/06/22 20:04:35 kattemat Exp $
+ * $Id: net.c,v 1.26 2005/08/28 19:30:29 kattemat Exp $
  */
 
 #include "defs.h"
@@ -85,8 +85,6 @@ static int ignore_redir;
 static int send_redir;
 static int gateway;
 
-static int first_time = 1;
-
 static int set_sysctl_int(char *name, int new)
 {
   int old;
@@ -159,20 +157,11 @@ int enable_ip_forwarding(int version)
   return 1;
 }
 
-int disable_redirects(char *if_name, int index, int version)
+int
+disable_redirects_global(int version)
 {
   char *name;
 
-  // this function gets called for each interface olsrd uses; however,
-  // FreeBSD can only globally control ICMP redirects, and not on a
-  // per-interface basis; hence, only disable ICMP redirects on the first
-  // invocation
-
-  if (first_time == 0)
-    return 1;
-
-  first_time = 0;
-
   // do not accept ICMP redirects
 
 #ifdef __OpenBSD__
@@ -218,6 +207,15 @@ int disable_redirects(char *if_name, int index, int version)
   return 1;
 }
 
+int disable_redirects(char *if_name, int index, int version)
+{
+  // this function gets called for each interface olsrd uses; however,
+  // FreeBSD can only globally control ICMP redirects, and not on a
+  // per-interface basis; hence, only disable ICMP redirects in the "global"
+  // function
+  return 1;
+}
+
 int deactivate_spoof(char *if_name, int index, int version)
 {
   return 1;
index 9f70e6b..aa9cbfd 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.27 2005/05/30 17:23:09 kattemat Exp $
+ * $Id: net.c,v 1.28 2005/08/28 19:30:30 kattemat Exp $
  */
 
 
@@ -155,6 +155,53 @@ enable_ip_forwarding(int version)
 }
 
 
+int
+disable_redirects_global(int version)
+{
+  FILE *proc_redirect;
+  char procfile[FILENAME_MAX];
+
+  if(version == AF_INET6)
+    return -1;
+
+  strcpy(procfile, "/proc/sys/net/ipv4/conf/all/send_redirects");
+
+  if((proc_redirect = fopen(procfile, "r")) == NULL)
+    {
+      fprintf(stderr, "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n", procfile);
+      
+      sleep(3);
+      return -1;
+    }
+  else
+    {
+      orig_global_redirect_state = fgetc(proc_redirect);
+      fclose(proc_redirect);
+    }
+
+  if(orig_global_redirect_state == '0')
+    {
+      return 0;
+    }
+
+  if ((proc_redirect = fopen(procfile, "w"))==NULL)
+    {
+      fprintf(stderr, "Could not open %s for writing!\n", procfile);
+      fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n");
+      sleep(3);
+      return 0;
+    }
+  else
+    {
+      syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
+      fputs("0", proc_redirect);
+    }
+  fclose(proc_redirect);
+  
+  return 1;
+}
+
+
 /**
  *
  *@return 1 on sucess 0 on failiure
@@ -294,6 +341,27 @@ restore_settings(int version)
 
     }
 
+  /* Restore global ICMP redirect setting */
+  if(orig_global_redirect_state != '0')
+    {
+      if(version == AF_INET)
+       {
+         strcpy(procfile, "/proc/sys/net/ipv4/conf/all/send_redirects");
+
+         if ((proc_fd = fopen(procfile, "w")) == NULL)
+           {
+             fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
+           }
+         else
+           {
+             syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_global_redirect_state);
+             fputc(orig_global_redirect_state, proc_fd);
+             fclose(proc_fd);
+           }
+       }
+    }
+
+
   if(version == AF_INET6)
     return 0;
 
index dc20d01..3096fa9 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.h,v 1.6 2004/11/21 11:30:30 kattemat Exp $
+ * $Id: net.h,v 1.7 2005/08/28 19:30:30 kattemat Exp $
  */
 
 
@@ -66,6 +66,7 @@
 
 /* The original state of the IP forwarding proc entry */
 char orig_fwd_state;
+char orig_global_redirect_state;
 
 /* Struct uesd to store original redirect/ingress setting */
 struct nic_state
index 583e55e..4eb4a09 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.81 2005/06/03 08:00:55 kattemat Exp $
+ * $Id: main.c,v 1.82 2005/08/28 19:30:29 kattemat Exp $
  */
 
 #include <unistd.h>
@@ -249,6 +249,11 @@ main(int argc, char *argv[])
   if(olsr_cnf->debug_level > 1)
     olsrd_print_cnf(olsr_cnf);
 
+#ifndef WIN32
+  /* Disable redirects globally */
+  disable_redirects_global(olsr_cnf->ip_version);
+#endif
+
   /*
    *socket for icotl calls
    */
index cefeb19..effe092 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_os.h,v 1.11 2005/05/30 13:13:38 kattemat Exp $
+ * $Id: net_os.h,v 1.12 2005/08/28 19:30:29 kattemat Exp $
  */
 
 
@@ -85,6 +85,9 @@ convert_ip_to_mac(union olsr_ip_addr *, struct sockaddr *, char *);
 int
 disable_redirects(char *, int, int);
 
+int
+disable_redirects_global(int);
+
 int
 deactivate_spoof(char *, int, int);
 
index 5489298..8286a3b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ifnet.c,v 1.28 2005/08/05 13:47:40 kattemat Exp $
+ * $Id: ifnet.c,v 1.29 2005/08/28 19:30:30 kattemat Exp $
  */
 
 
@@ -902,7 +902,8 @@ chk_if_up(struct olsr_if *iface, int debuglvl)
     {
       /* IP version 4 */
       ifp->ip_addr.v4 = ((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr;
-      
+      ((struct sockaddr_in *)&addrsock)->sin_addr.s_addr =  
+       ((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr;
       /*
        *We create one socket for each interface and bind
        *the socket to it. This to ensure that we can control