Add config option SetIpForward to allow preventing manipulation of ip_forward proc...
authorHenning Rogge <hrogge@googlemail.com>
Sat, 31 Mar 2012 10:56:19 +0000 (13:56 +0300)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 31 Mar 2012 10:56:19 +0000 (13:56 +0300)
files/olsrd.conf.default.full
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/linux/net.c
src/olsr_cfg.h

index cd06900..42d16a7 100644 (file)
 
 # Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix
 # length of more than 64 is not allowed.
-# (default is 0::/0
+# (default is 0::/0)
 
 # SmartGatewayPrefix 0::/0
 
+# Set to yes will make OLSRd to set the file 
+# /proc/sys/net/ipv4/ip_forward to 1 during startup. It will be
+# restored to the original value during shutdown
+# Set this to no makes OLSRd check the value, if its not 1
+# OLSRd will exit with an error.
+# (default is yes)
+
+# SetIpForward yes
+
 ##############################
 ### OLSR protocol settings ###
 ##############################
index 4c8734f..c305856 100644 (file)
@@ -770,6 +770,7 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->smart_gw_downlink = DEF_DOWNLINK_SPEED;
 
   cnf->use_src_ip_routes = DEF_USE_SRCIP_ROUTES;
+  cnf->set_ip_forward = true;
 
 #ifdef LINUX_NETLINK_ROUTING
   cnf->rtnl_s = 0;
@@ -835,7 +836,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   else
     printf("No interfaces    : NOT ALLOWED\n");
   printf("TOS              : 0x%02x\n", cnf->tos);
-  printf("OlsrPort          : 0x%03x\n", cnf->olsrport);
+  printf("OlsrPort          : %d\n", cnf->olsrport);
   printf("RtTable          : %u\n", cnf->rt_table);
   printf("RtTableDefault   : %u\n", cnf->rt_table_default);
   printf("RtTableTunnel    : %u\n", cnf->rt_table_tunnel);
index 80667c4..844c7a3 100644 (file)
@@ -223,6 +223,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_SMART_GW_PREFIX
 %token TOK_SRC_IP_ROUTES
 %token TOK_MAIN_IP
+%token TOK_SET_IPFORWARD
 
 %token TOK_HOSTLABEL
 %token TOK_NETLABEL
@@ -303,6 +304,7 @@ stmt:       idebug
           | ismart_gw_prefix
           | bsrc_ip_routes
           | amain_ip
+          | bset_ipforward
 ;
 
 block:      TOK_HNA4 hna4body
@@ -1398,6 +1400,16 @@ amain_ip: TOK_MAIN_IP TOK_IPV4_ADDR
   }
   free($2);
 }
+;
+
+bset_ipforward: TOK_SET_IPFORWARD TOK_BOOLEAN
+{
+  PARSER_DEBUG_PRINTF("Set IP-Forward procfile variable: %s\n", $2->boolean ? "yes" : "no");
+  olsr_cnf->set_ip_forward = $2->boolean;
+  free($2);
+}
+;
+
 
 plblock: TOK_PLUGIN TOK_STRING
 {
index ab1469b..0b363c7 100644 (file)
@@ -508,6 +508,10 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     yylval = NULL;
     return TOK_MAIN_IP;
 }
+"SetIpForward" {
+    yylval = NULL;
+    return TOK_SET_IPFORWARD;
+}
 "Ip4Broadcast" {
     yylval = NULL;
     return TOK_IP4BROADCAST;
index 3b6182f..e0283ff 100644 (file)
@@ -139,7 +139,7 @@ static int writeToProc(const char *file, char *old, char value) {
     return -1;
   }
 
-  if (rv != value) {
+  if (rv != value && value != 0) {
     if (lseek(fd, SEEK_SET, 0) == -1) {
       OLSR_PRINTF(0, "Error, cannot rewind proc entry %s: %s (%d)\n", file, strerror(errno), errno);
       return -1;
@@ -159,7 +159,10 @@ static int writeToProc(const char *file, char *old, char value) {
   if (old) {
     *old = rv;
   }
-  olsr_syslog(OLSR_LOG_INFO, "Writing '%c' (was %c) to %s", value, rv, file);
+
+  if (value) {
+    olsr_syslog(OLSR_LOG_INFO, "Writing '%c' (was %c) to %s", value, rv, file);
+  }
   return 0;
 }
 
@@ -205,10 +208,22 @@ kernel_parse_error:
  */
 void
 net_os_set_global_ifoptions(void) {
-  if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, '1')) {
-    OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n"
-        "you should manually ensure that IP forwarding is enabled!\n\n");
-    olsr_startup_sleep(3);
+  if (olsr_cnf->set_ip_forward) {
+    if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, '1')) {
+      OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n"
+          "you should manually ensure that IP forwarding is enabled!\n\n");
+      olsr_startup_sleep(3);
+    }
+  }
+  else {
+    if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, 0)) {
+      OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n"
+          "you should manually ensure that IP forwarding is enabled!\n\n");
+      olsr_startup_sleep(3);
+    }
+    else if (orig_fwd_state != '1') {
+      olsr_exit("IP Forwarding not activated, shutting down.\n", 1);
+    }
   }
 
   if (olsr_cnf->smart_gw_active) {
@@ -305,8 +320,10 @@ net_os_restore_ifoptions(void)
   OLSR_PRINTF(1, "Restoring network state\n");
 
   /* Restore IP forwarding to "off" */
-  if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, NULL, orig_fwd_state)) {
-    OLSR_PRINTF(1, "Error, could not restore ip_forward settings\n");
+  if (olsr_cnf->set_ip_forward) {
+    if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, NULL, orig_fwd_state)) {
+      OLSR_PRINTF(1, "Error, could not restore ip_forward settings\n");
+    }
   }
 
   if (olsr_cnf->smart_gw_active && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit)) {
index 3e55003..47752e3 100644 (file)
@@ -252,6 +252,8 @@ struct olsrd_config {
 
   float min_tc_vtime;
 
+  bool set_ip_forward;
+
   char *lock_file;
   bool use_niit;