Added sanity check function in config parser
authorAndreas Tonnesen <andreto@olsr.org>
Sat, 20 Nov 2004 21:42:35 +0000 (21:42 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sat, 20 Nov 2004 21:42:35 +0000 (21:42 +0000)
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/main.c
src/olsr.c
src/olsr_cfg.h

index 35080cf..9089671 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsrd_conf.c,v 1.20 2004/11/20 17:37:25 tlopatic Exp $
+ * $Id: olsrd_conf.c,v 1.21 2004/11/20 21:42:35 kattemat Exp $
  *
  */
 
@@ -171,6 +171,148 @@ olsrd_parse_cnf(char *filename)
 }
 
 
+int
+olsrd_sanity_check_cnf(struct olsrd_config *cnf)
+{
+  struct olsr_if           *in = cnf->interfaces;
+  struct if_config_options *io;
+
+  /* Debug level */
+  if(cnf->debug_level < MIN_DEBUGLVL ||
+     cnf->debug_level > MAX_DEBUGLVL)
+    {
+      fprintf(stderr, "Debuglevel %d is not allowed\n", cnf->debug_level);
+      return -1;
+    }
+
+  /* TOS */
+  if(//cnf->tos < MIN_TOS ||
+     cnf->tos > MAX_TOS)
+    {
+      fprintf(stderr, "TOS %d is not allowed\n", cnf->tos);
+      return -1;
+    }
+
+  if(cnf->willingness_auto == OLSR_FALSE &&
+     (cnf->willingness < MIN_WILLINGNESS ||
+      cnf->willingness > MAX_WILLINGNESS))
+    {
+      fprintf(stderr, "willingness %d is not allowed\n", cnf->willingness);
+      return -1;
+    }
+
+  /* Hysteresis */
+
+  if(cnf->hysteresis_param.scaling < MIN_HYST_PARAM ||
+     cnf->hysteresis_param.scaling > MAX_HYST_PARAM)
+    {
+      fprintf(stderr, "Hyst scaling %0.2f is not allowed\n", cnf->hysteresis_param.scaling);
+      return -1;
+    }
+
+  if(cnf->hysteresis_param.thr_high <= cnf->hysteresis_param.thr_low)
+    {
+      fprintf(stderr, "Hyst upper(%0.2f) thr must be bigger than lower(%0.2f) threshold!\n", cnf->hysteresis_param.thr_high, cnf->hysteresis_param.thr_low);
+      return -1;
+    }
+
+  if(cnf->hysteresis_param.thr_high < MIN_HYST_PARAM ||
+     cnf->hysteresis_param.thr_high > MAX_HYST_PARAM)
+    {
+      fprintf(stderr, "Hyst upper thr %0.2f is not allowed\n", cnf->hysteresis_param.thr_high);
+      return -1;
+    }
+
+  if(cnf->hysteresis_param.thr_low < MIN_HYST_PARAM ||
+     cnf->hysteresis_param.thr_low > MAX_HYST_PARAM)
+    {
+      fprintf(stderr, "Hyst lower thr %0.2f is not allowed\n", cnf->hysteresis_param.thr_low);
+      return -1;
+    }
+
+
+  /* Pollrate */
+
+  if(cnf->pollrate < MIN_POLLRATE ||
+     cnf->pollrate > MAX_POLLRATE)
+    {
+      fprintf(stderr, "Pollrate %0.2f is not allowed\n", cnf->pollrate);
+      return -1;
+    }
+
+  /* TC redundancy */
+
+  if(//cnf->tc_redundancy < MIN_TC_REDUNDANCY ||
+     cnf->tc_redundancy > MAX_TC_REDUNDANCY)
+    {
+      fprintf(stderr, "TC redundancy %d is not allowed\n", cnf->tc_redundancy);
+      return -1;
+    }
+
+  /* MPR coverage */
+  if(cnf->mpr_coverage < MIN_MPR_COVERAGE ||
+     cnf->mpr_coverage > MAX_MPR_COVERAGE)
+    {
+      fprintf(stderr, "MPR coverage %d is not allowed\n", cnf->mpr_coverage);
+      return -1;
+    }
+
+  /* Interfaces */
+  while(in)
+    {
+      io = in->cnf;
+
+      if(in->name == NULL || !strlen(in->name))
+       {
+         fprintf(stderr, "Interface has no name!\n");
+         return -1;
+       }
+
+      if(io == NULL)
+       {
+         fprintf(stderr, "Interface %s has no configuration!\n", in->name);
+         return -1;
+       }
+
+      /* HELLO interval */
+      if(io->hello_params.emission_interval < cnf->pollrate ||
+        io->hello_params.emission_interval > io->hello_params.validity_time)
+       {
+         fprintf(stderr, "Bad HELLO parameters! (em: %0.2f, vt: %0.2f)\n", io->hello_params.emission_interval, io->hello_params.validity_time);
+         return -1;
+       }
+
+      /* TC interval */
+      if(io->tc_params.emission_interval < cnf->pollrate ||
+        io->tc_params.emission_interval > io->tc_params.validity_time)
+       {
+         fprintf(stderr, "Bad TC parameters! (em: %0.2f, vt: %0.2f)\n", io->tc_params.emission_interval, io->tc_params.validity_time);
+         return -1;
+       }
+
+      /* MID interval */
+      if(io->mid_params.emission_interval < cnf->pollrate ||
+        io->mid_params.emission_interval > io->mid_params.validity_time)
+       {
+         fprintf(stderr, "Bad MID parameters! (em: %0.2f, vt: %0.2f)\n", io->mid_params.emission_interval, io->mid_params.validity_time);
+         return -1;
+       }
+
+      /* HNA interval */
+      if(io->hna_params.emission_interval < cnf->pollrate ||
+        io->hna_params.emission_interval > io->hna_params.validity_time)
+       {
+         fprintf(stderr, "Bad HNA parameters! (em: %0.2f, vt: %0.2f)\n", io->hna_params.emission_interval, io->hna_params.validity_time);
+         return -1;
+       }
+
+      in = in->next;
+    }
+
+  return 0;
+}
+
+
 void
 olsrd_free_cnf(struct olsrd_config *cnf)
 {
@@ -178,7 +320,6 @@ olsrd_free_cnf(struct olsrd_config *cnf)
   struct hna6_entry        *h6d, *h6 = cnf->hna6_entries;
   struct olsr_if           *ind, *in = cnf->interfaces;
   struct plugin_entry      *ped, *pe = cnf->plugins;
-  struct if_config_options *iod, *io;
   
   while(h4)
     {
@@ -196,13 +337,7 @@ olsrd_free_cnf(struct olsrd_config *cnf)
 
   while(in)
     {
-      io = in->cnf;
-      while(io)
-       {
-         iod = io;
-         io = io->next;
-         free(iod);
-       }
+      free(in->cnf);
       ind = in;
       in = in->next;
       free(ind->name);
index e643dc7..60cd858 100644 (file)
@@ -21,7 +21,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: oparse.y,v 1.17 2004/11/20 18:46:03 kattemat Exp $
+ * $Id: oparse.y,v 1.18 2004/11/20 21:42:35 kattemat Exp $
  *
  */
 
@@ -343,11 +343,6 @@ isetip6multg: TOK_IP6MULTIGLOBAL TOK_IP6_ADDR
 isethelloint: TOK_HELLOINT TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tHELLO interval: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->hello_params.emission_interval = $2->floating;
     free($2);
 }
@@ -355,11 +350,6 @@ isethelloint: TOK_HELLOINT TOK_FLOAT
 isethelloval: TOK_HELLOVAL TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tHELLO validity: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->hello_params.validity_time = $2->floating;
     free($2);
 }
@@ -367,11 +357,6 @@ isethelloval: TOK_HELLOVAL TOK_FLOAT
 isettcint: TOK_TCINT TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tTC interval: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->tc_params.emission_interval = $2->floating;
     free($2);
 }
@@ -379,11 +364,6 @@ isettcint: TOK_TCINT TOK_FLOAT
 isettcval: TOK_TCVAL TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tTC validity: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->tc_params.validity_time = $2->floating;
     free($2);
 }
@@ -391,11 +371,6 @@ isettcval: TOK_TCVAL TOK_FLOAT
 isetmidint: TOK_MIDINT TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tMID interval: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->mid_params.emission_interval = $2->floating;
     free($2);
 }
@@ -403,11 +378,6 @@ isetmidint: TOK_MIDINT TOK_FLOAT
 isetmidval: TOK_MIDVAL TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tMID validity: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->mid_params.validity_time = $2->floating;
     free($2);
 }
@@ -415,11 +385,6 @@ isetmidval: TOK_MIDVAL TOK_FLOAT
 isethnaint: TOK_HNAINT TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tHNA interval: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->hna_params.emission_interval = $2->floating;
     free($2);
 }
@@ -427,11 +392,6 @@ isethnaint: TOK_HNAINT TOK_FLOAT
 isethnaval: TOK_HNAVAL TOK_FLOAT
 {
     if(PARSER_DEBUG) printf("\tHNA validity: %0.2f\n", $2->floating);
-    if($2->floating < MIN_INTERVAL)
-      {
-       fprintf(stderr, "%0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
     cnf->interfaces->cnf->hna_params.validity_time = $2->floating;
     free($2);
 }
@@ -443,13 +403,6 @@ idebug:       TOK_DEBUGLEVEL TOK_INTEGER
 
   cnf->debug_level = $2->integer;
   if(PARSER_DEBUG) printf("Debug level: %d\n", cnf->debug_level);
-    if($2->integer < MIN_DEBUGLVL ||
-       $2->integer > MAX_DEBUGLVL)
-      {
-       fprintf(stderr, "Debuglevel %d is not allowed\n", $2->integer);
-       exit(EXIT_FAILURE);
-      }
-
   free($2);
 }
 ;
@@ -586,13 +539,6 @@ bnoint: TOK_NOINT TOK_BOOLEAN
 atos: TOK_TOS TOK_INTEGER
 {
   if(PARSER_DEBUG) printf("TOS: %d\n", $2->integer);
-    if($2->integer < MIN_TOS ||
-       $2->integer > MAX_TOS)
-      {
-       fprintf(stderr, "%d is not allowed\n", $2->integer);
-       exit(EXIT_FAILURE);
-      }
-
   cnf->tos = $2->integer;
 
   free($2);
@@ -605,12 +551,6 @@ awillingness: TOK_WILLINGNESS TOK_INTEGER
   cnf->willingness_auto = OLSR_FALSE;
 
   if(PARSER_DEBUG) printf("Willingness: %d\n", $2->integer);
-    if($2->integer < MIN_WILLINGNESS ||
-       $2->integer > MAX_WILLINGNESS)
-      {
-       fprintf(stderr, "willingness %d is not allowed\n", $2->integer);
-       exit(EXIT_FAILURE);
-      }
   cnf->willingness = $2->integer;
 
   free($2);
@@ -641,13 +581,6 @@ fhystscale: TOK_HYSTSCALE TOK_FLOAT
 {
   cnf->hysteresis_param.scaling = $2->floating;
   if(PARSER_DEBUG) printf("Hysteresis Scaling: %0.2f\n", $2->floating);
-    if($2->floating < MIN_HYST_PARAM ||
-       $2->floating > MAX_HYST_PARAM)
-      {
-       fprintf(stderr, "Hyst scaling %0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
-
   free($2);
 }
 ;
@@ -657,12 +590,6 @@ fhystupper: TOK_HYSTUPPER TOK_FLOAT
 {
   cnf->hysteresis_param.thr_high = $2->floating;
   if(PARSER_DEBUG) printf("Hysteresis UpperThr: %0.2f\n", $2->floating);
-    if($2->floating < MIN_HYST_PARAM ||
-       $2->floating > MAX_HYST_PARAM)
-      {
-       fprintf(stderr, "Hyst upper thr %0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
   free($2);
 }
 ;
@@ -672,12 +599,6 @@ fhystlower: TOK_HYSTLOWER TOK_FLOAT
 {
   cnf->hysteresis_param.thr_low = $2->floating;
   if(PARSER_DEBUG) printf("Hysteresis LowerThr: %0.2f\n", $2->floating);
-    if($2->floating < MIN_HYST_PARAM ||
-       $2->floating > MAX_HYST_PARAM)
-      {
-       fprintf(stderr, "Hyst lower thr %0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
   free($2);
 }
 ;
@@ -685,12 +606,6 @@ fhystlower: TOK_HYSTLOWER TOK_FLOAT
 fpollrate: TOK_POLLRATE TOK_FLOAT
 {
   if(PARSER_DEBUG) printf("Pollrate %0.2f\n", $2->floating);
-    if($2->floating < MIN_POLLRATE ||
-       $2->floating > MAX_POLLRATE)
-      {
-       fprintf(stderr, "Pollrate %0.2f is not allowed\n", $2->floating);
-       exit(EXIT_FAILURE);
-      }
   cnf->pollrate = $2->floating;
 
   free($2);
@@ -701,32 +616,15 @@ fpollrate: TOK_POLLRATE TOK_FLOAT
 atcredundancy: TOK_TCREDUNDANCY TOK_INTEGER
 {
   if(PARSER_DEBUG) printf("TC redundancy %d\n", $2->integer);
-  if($2->integer < MIN_TC_REDUNDANCY ||
-     $2->integer > MAX_TC_REDUNDANCY)
-    {
-      fprintf(stderr, "TC redundancy %d is not allowed\n", $2->integer);
-      exit(EXIT_FAILURE);
-    }
-
   cnf->tc_redundancy = $2->integer;
-
   free($2);
-
 }
 ;
 
 amprcoverage: TOK_MPRCOVERAGE TOK_INTEGER
 {
   if(PARSER_DEBUG) printf("MPR coverage %d\n", $2->integer);
-    if($2->integer < MIN_MPR_COVERAGE ||
-       $2->integer > MAX_MPR_COVERAGE)
-      {
-       fprintf(stderr, "MPR coverage %d is not allowed\n", $2->integer);
-       exit(EXIT_FAILURE);
-      }
-
   cnf->mpr_coverage = $2->integer;
-
   free($2);
 }
 ;
@@ -735,7 +633,6 @@ alq_level: TOK_LQ_LEVEL TOK_INTEGER
 {
   if(PARSER_DEBUG) printf("Link quality level %d\n", $2->integer);
   cnf->lq_level = $2->integer;
-
   free($2);
 }
 ;
@@ -744,7 +641,6 @@ alq_wsize: TOK_LQ_WSIZE TOK_INTEGER
 {
   if(PARSER_DEBUG) printf("Link quality window size %d\n", $2->integer);
   cnf->lq_wsize = $2->integer;
-
   free($2);
 }
 ;
index 7f76da4..8c68491 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: main.c,v 1.41 2004/11/17 19:24:01 kattemat Exp $
+ * $Id: main.c,v 1.42 2004/11/20 21:42:34 kattemat Exp $
  *
  */
 
@@ -52,6 +52,8 @@ olsr_shutdown(int);
 /*
  * Local function prototypes
  */
+void
+olsr_reconfigure(int);
 
 static void
 print_usage(void);
@@ -62,6 +64,7 @@ set_default_values(void);
 static int
 set_default_ifcnfs(struct olsr_if *, struct if_config_options *);
 
+static char **olsr_argv;
 
 /**
  * Main entrypoint
@@ -79,6 +82,8 @@ main(int argc, char *argv[])
   struct stat statbuf;
   char conf_file_name[FILENAME_MAX];
   
+  olsr_argv = argv;
+
 #ifdef WIN32
   WSADATA WsaData;
   int len;
@@ -433,6 +438,13 @@ main(int argc, char *argv[])
     }
 
 
+  /* Sanity check configuration */
+  if(olsrd_sanity_check_cnf(olsr_cnf) < 0)
+    {
+      fprintf(stderr, "Bad configuration!\n");
+      olsr_exit(__func__, EXIT_FAILURE);      
+    }
+
   /*
    *Interfaces need to be specified
    */
@@ -603,6 +615,7 @@ main(int argc, char *argv[])
 #ifdef WIN32
   SetConsoleCtrlHandler(SignalHandler, OLSR_TRUE);
 #else
+  signal(SIGHUP, olsr_reconfigure);  
   signal(SIGINT, olsr_shutdown);  
   signal(SIGTERM, olsr_shutdown);  
 #endif
@@ -620,7 +633,26 @@ main(int argc, char *argv[])
 
 
 
+/**
+ * Reconfigure olsrd. Currently kind of a hack...
+ *
+ */
+#ifndef WIN32
+void
+olsr_reconfigure(int signal)
+{
+  if(!fork())
+    {
+      /* New process */
+      sleep(3);
+      printf("Restarting %s\n", olsr_argv[0]);
+      execv(olsr_argv[0], olsr_argv);
+    }
+  olsr_shutdown(0);
 
+  printf("RECONFIGURING!\n");
+}
+#endif
 
 
 /**
index dd3712a..4a8920a 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr.c,v 1.25 2004/11/20 17:27:07 tlopatic Exp $
+ * $Id: olsr.c,v 1.26 2004/11/20 21:42:35 kattemat Exp $
  *
  */
 
@@ -169,10 +169,10 @@ olsr_process_changes()
     return;
 
   if (olsr_cnf->debug_level > 0 && olsr_cnf->clear_screen && isatty(1))
-    {
+  {
       clear_console();
       printf("<<<< %s (%s) >>>>\n", SOFTWARE_VERSION, __DATE__);
-    }
+  }
 
   if (changes_neighborhood)
     {
index d6aae7c..2273a0b 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr_cfg.h,v 1.12 2004/11/20 18:46:03 kattemat Exp $
+ * $Id: olsr_cfg.h,v 1.13 2004/11/20 21:42:35 kattemat Exp $
  *
  */
 
@@ -108,7 +108,6 @@ struct if_config_options
   struct olsr_msg_params   tc_params;
   struct olsr_msg_params   mid_params;
   struct olsr_msg_params   hna_params;
-  struct if_config_options *next;
 };
 
 
@@ -211,6 +210,9 @@ struct olsrd_config
 struct olsrd_config *
 olsrd_parse_cnf(char *);
 
+int
+olsrd_sanity_check_cnf(struct olsrd_config *);
+
 void
 olsrd_free_cnf(struct olsrd_config *);