Convert the pollrate variable internally to an unsigned int with the unit "microseconds"
authorBernd Petrovitsch <bernd@firmix.at>
Mon, 27 Oct 2008 12:05:23 +0000 (13:05 +0100)
committerBernd Petrovitsch <bernd@firmix.at>
Mon, 27 Oct 2008 12:05:23 +0000 (13:05 +0100)
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/olsrd_httpinfo.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/olsrd_conf.h
src/cfgparser/oparse.y
src/main.c
src/olsr_cfg.h
src/scheduler.c

index d6b60b1..68d4232 100644 (file)
@@ -78,7 +78,7 @@ build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
                  "Debug level:", "debug_level", 2, olsr_cnf->debug_level);
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
-                 "Pollrate:", "pollrate", 4, olsr_cnf->pollrate);
+                  "Pollrate:", "pollrate", 4, conv_pollrate_to_secs(olsr_cnf->pollrate));
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_string,
                  "TOS:", "tos", 6, "TBD");
 
@@ -265,10 +265,10 @@ process_param(char *key, char *value)
     {
       float fval = 1.1;
       sscanf(value, "%f", &fval);
-      if((fval < 0.0) || (fval > 1.0))
+      if (check_pollrate(&fval) < 0) {
        return -1;
-
-      olsr_cnf->pollrate = fval;
+      }
+      olsr_cnf->pollrate = conv_pollrate_to_microsecs(fval);
       return 1;
     }
 
index 81abfe9..3d536eb 100644 (file)
@@ -840,7 +840,7 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
 
     size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
 
-    size += snprintf(&buf[size], bufsize-size, "<td>Pollrate: %0.2f</td>\n", olsr_cnf->pollrate);
+    size += snprintf(&buf[size], bufsize-size, "<td>Pollrate: %0.2f</td>\n", conv_pollrate_to_secs(olsr_cnf->pollrate));
     size += snprintf(&buf[size], bufsize-size, "<td>TC redundancy: %d</td>\n", olsr_cnf->tc_redundancy);
     size += snprintf(&buf[size], bufsize-size, "<td>MPR coverage: %d</td>\n", olsr_cnf->mpr_coverage);
     size += snprintf(&buf[size], bufsize-size, "<td>NAT threshold: %f</td>\n", olsr_cnf->lq_nat_thresh);
index 82847a4..9a58610 100644 (file)
@@ -186,7 +186,7 @@ olsrd_write_cnf_buf(const struct olsrd_config *cnf, olsr_bool write_more_comment
 
   /* Pollrate */
   WRITE_TO_BUF("# Polling rate in seconds(float).\n# Auto uses default value 0.05 sec\n\n");
-  WRITE_TO_BUF("Pollrate\t%0.2f\n", cnf->pollrate);
+  WRITE_TO_BUF("Pollrate\t%0.2f\n", conv_pollrate_to_secs(cnf->pollrate));
 
   /* NIC Changes Pollrate */
   WRITE_TO_BUF("# Interval to poll network interfaces for configuration\n# changes. Defaults to 2.5 seconds\n");
index 00889a6..80f0404 100644 (file)
@@ -50,6 +50,7 @@
 #include <string.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -166,6 +167,20 @@ olsrd_parse_cnf(const char *filename)
 }
 
 
+int
+check_pollrate(float *pollrate)
+{
+  if (*pollrate > MAX_POLLRATE) {
+    fprintf(stderr, "Pollrate %0.2f is too large\n", *pollrate);
+    return -1;
+  }
+  if (*pollrate < MIN_POLLRATE || *pollrate < 1.0/sysconf(_SC_CLK_TCK)) {
+    fprintf(stderr, "Pollrate %0.2f is too small - setting it to %ld\n", *pollrate, sysconf(_SC_CLK_TCK));
+    *pollrate = 1.0/sysconf(_SC_CLK_TCK);
+  }
+  return 0;
+}
+
 int
 olsrd_sanity_check_cnf(struct olsrd_config *cnf)
 {
@@ -235,22 +250,12 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* Check Link quality dijkstra limit */
-  if (olsr_cnf->lq_dinter < cnf->pollrate && olsr_cnf->lq_dlimit != 255) {
+  if (olsr_cnf->lq_dinter < conv_pollrate_to_secs(cnf->pollrate) && olsr_cnf->lq_dlimit != 255) {
        fprintf(stderr, "Link quality dijkstra limit must be higher than pollrate\n");
        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;
-    }
-
   /* NIC Changes Pollrate */
-
   if(cnf->nic_chgs_pollrate < MIN_NICCHGPOLLRT ||
      cnf->nic_chgs_pollrate > MAX_NICCHGPOLLRT)
     {
@@ -259,7 +264,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* TC redundancy */
-
   if(//cnf->tc_redundancy < MIN_TC_REDUNDANCY ||
      cnf->tc_redundancy > MAX_TC_REDUNDANCY)
     {
@@ -283,7 +287,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* Link quality level */
-
   if(cnf->lq_level > MAX_LQ_LEVEL)
     {
       fprintf(stderr, "LQ level %d is not allowed\n", cnf->lq_level);
@@ -338,7 +341,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
           io->hello_params.validity_time = (int)(REFRESH_INTERVAL / cnf->lq_aging);
       }
 
-      if(io->hello_params.emission_interval < cnf->pollrate ||
+      if(io->hello_params.emission_interval < conv_pollrate_to_secs(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);
@@ -346,7 +349,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* TC interval */
-      if(io->tc_params.emission_interval < cnf->pollrate ||
+      if(io->tc_params.emission_interval < conv_pollrate_to_secs(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);
@@ -354,7 +357,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* MID interval */
-      if(io->mid_params.emission_interval < cnf->pollrate ||
+      if(io->mid_params.emission_interval < conv_pollrate_to_secs(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);
@@ -362,7 +365,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* HNA interval */
-      if(io->hna_params.emission_interval < cnf->pollrate ||
+      if(io->hna_params.emission_interval < conv_pollrate_to_secs(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);
@@ -460,7 +463,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->hysteresis_param.thr_high = HYST_THRESHOLD_HIGH;
     cnf->hysteresis_param.thr_low = HYST_THRESHOLD_LOW;
 
-    cnf->pollrate = DEF_POLLRATE;
+    cnf->pollrate = conv_pollrate_to_microsecs(DEF_POLLRATE);
     cnf->nic_chgs_pollrate = DEF_NICCHGPOLLRT;
 
     cnf->tc_redundancy = TC_REDUNDANCY;
@@ -577,7 +580,7 @@ olsrd_print_cnf(const struct olsrd_config *cnf)
   }
 
 
-  printf("Pollrate         : %0.2f\n", cnf->pollrate);
+  printf("Pollrate         : %0.2f\n", conv_pollrate_to_secs(cnf->pollrate));
 
   printf("NIC ChangPollrate: %0.2f\n", cnf->nic_chgs_pollrate);
 
index 6eda564..3847c4c 100644 (file)
@@ -50,8 +50,7 @@
 
 extern int current_line;
 
-struct conf_token
-{
+struct conf_token {
   olsr_u32_t integer;
   float      floating;
   olsr_bool  boolean;
index a5a47a4..a14e875 100644 (file)
@@ -932,7 +932,10 @@ fhystlower: TOK_HYSTLOWER TOK_FLOAT
 fpollrate: TOK_POLLRATE TOK_FLOAT
 {
   PARSER_DEBUG_PRINTF("Pollrate %0.2f\n", $2->floating);
-  olsr_cnf->pollrate = $2->floating;
+  if (check_pollrate(&$2->floating) < 0) {
+    YYABORT;
+  }
+  olsr_cnf->pollrate = conv_pollrate_to_microsecs($2->floating);
   free($2);
 }
 ;
index a3aa0e8..966de25 100644 (file)
@@ -234,7 +234,6 @@ 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);      
     }
 
@@ -745,9 +744,14 @@ olsr_process_arguments(int argc, char *argv[],
      * Set the polling interval to be used by olsrd.
      */
     if (strcmp(*argv, "-T") == 0) {
+      float pollrate;
       NEXT_ARG;
       CHECK_ARGC;
-      sscanf(*argv,"%f",&cnf->pollrate);
+      sscanf(*argv,"%f", &pollrate);
+      if (check_pollrate(&pollrate) < 0) {
+       olsr_exit(__func__, EXIT_FAILURE);
+      }
+      cnf->pollrate = conv_pollrate_to_microsecs(pollrate);
       continue;
     }
 
index c86ac7b..bdf2f12 100644 (file)
@@ -212,7 +212,7 @@ struct olsrd_config
   struct ip_prefix_list    *hna_entries;
   struct ip_prefix_list    *ipc_nets;
   struct olsr_if           *interfaces;
-  float                    pollrate;
+  olsr_u32_t               pollrate; /* in microseconds */
   float                    nic_chgs_pollrate;
   olsr_bool                clear_screen;
   olsr_u8_t                tc_redundancy;
@@ -285,10 +285,16 @@ int olsrd_write_cnf(const struct olsrd_config *, const char *);
 
 void init_default_if_config(struct if_config_options *);
 
-  struct if_config_options *get_default_if_config(void);
+struct if_config_options *get_default_if_config(void);
 
 struct olsrd_config *olsrd_get_default_cnf(void);
 
+int check_pollrate(float *pollrate);
+
+static inline float conv_pollrate_to_secs(olsr_u32_t p)   { return p / 1000000.0; }
+
+static inline olsr_u32_t conv_pollrate_to_microsecs(float p) { return p * 1000000; }
+
 #if defined WIN32
 void win32_stdio_hack(unsigned int);
 
@@ -297,6 +303,7 @@ void *win32_olsrd_malloc(size_t size);
 void win32_olsrd_free(void *ptr);
 #endif
 
+
 #if defined __cplusplus
 }
 #endif
index 07026d9..f3f8a31 100644 (file)
@@ -359,8 +359,7 @@ static void handle_fds(const unsigned long next_interval)
 void
 olsr_scheduler(void)
 {
-  OLSR_PRINTF(1, "Scheduler started - polling every %0.2f seconds\n",
-             olsr_cnf->pollrate);
+  OLSR_PRINTF(1, "Scheduler started - polling every %u microseconds\n", olsr_cnf->pollrate);
 
   /* Main scheduler loop */
   while (app_state == STATE_RUNNING) {
@@ -371,7 +370,7 @@ olsr_scheduler(void)
      * to avoid any undesired side effects if the system clock changes.
      */
     now_times = olsr_times();
-    next_interval = GET_TIMESTAMP(olsr_cnf->pollrate * MSEC_PER_SEC);
+    next_interval = GET_TIMESTAMP(olsr_cnf->pollrate / USEC_PER_MSEC);
 
     /* Read incoming data */
     poll_sockets();