MinTCVTime parameter hack for Berlin FF network... feel free to ask on the mailing...
authorHenning Rogge <hrogge@googlemail.com>
Fri, 22 May 2009 21:12:53 +0000 (23:12 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Fri, 22 May 2009 21:12:53 +0000 (23:12 +0200)
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/olsr_cfg.h
src/tc_set.c

index 119c034..883b168 100644 (file)
@@ -275,6 +275,14 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     return -1;
   }
 
+  if (cnf->min_tc_vtime < 0.0) {
+       fprintf(stderr, "Error, negative minimal tc time not allowed.\n");
+       return -1;
+  }
+  if (cnf->min_tc_vtime > 0.0) {
+         fprintf(stderr, "Warning, you are using the min_tc_vtime hack. We hope you know what you are doing... contact olsr.org otherwise.\n");
+  }
+
   /* Interfaces */
   while (in) {
     io = in->cnf;
@@ -311,6 +319,10 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
       return -1;
     }
 
+    if (cnf->min_tc_vtime > 0.0 && (io->tc_params.validity_time / io->tc_params.emission_interval) < 128) {
+      fprintf(stderr, "Please use a tc vtime at least 128 times the emission interval while using the min_tc_vtime hack.\n");
+      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,
@@ -553,7 +565,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
       } else {
         printf("\tIPv4 broadcast           : AUTO\n");
       }
-      
+
       if (in->cnf->mode==IF_MODE_ETHER){
         printf("\tMode           : ether\n");
       } else {
index aa4bc9c..c3eb1b8 100644 (file)
@@ -198,6 +198,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_LQ_MULT
 %token TOK_CLEAR_SCREEN
 %token TOK_PLPARAM
+%token TOK_MIN_TC_VTIME
 
 %token TOK_HOSTLABEL
 %token TOK_NETLABEL
@@ -259,6 +260,7 @@ stmt:       idebug
           | alq_aging
           | bclear_screen
           | vcomment
+          | amin_tc_vtime
 ;
 
 block:      TOK_HNA4 hna4body
@@ -1043,6 +1045,14 @@ alq_aging: TOK_LQ_AGING TOK_FLOAT
 }
 ;
 
+amin_tc_vtime: TOK_MIN_TC_VTIME TOK_FLOAT
+{
+  PARSER_DEBUG_PRINTF("Minimum TC validity time %f\n", $2->floating);
+  olsr_cnf->min_tc_vtime = $2->floating;
+  free($2);
+}
+;
+
 alq_plugin: TOK_LQ_PLUGIN TOK_STRING
 {
   olsr_cnf->lq_algorithm = $2->string;
index c3c6c65..d3d1476 100644 (file)
@@ -420,6 +420,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_LQ_MULT;
 }
 
+"MinTCVTime" {
+    yylval = NULL;
+    return TOK_MIN_TC_VTIME;
+}
+
 "ClearScreen" {
     yylval = NULL;
     return TOK_CLEAR_SCREEN;
index 8c46b80..79262b4 100644 (file)
@@ -76,6 +76,7 @@
 #define DEF_OLSRPORT        698
 #define DEF_RTPROTO         0 /* 0 means OS-specific default */
 #define DEF_RTTABLE         254
+#define DEF_MIN_TC_VTIME    0.0
 
 /* Bounds */
 
@@ -221,6 +222,7 @@ struct olsrd_config {
   char *lq_algorithm;
   uint8_t lq_dlimit;
 
+  float min_tc_vtime;
   /* Stuff set by olsrd */
   uint16_t system_tick_divider;        /* Tick resolution */
   uint8_t maxplen;                     /* maximum prefix len */
index 4310983..6d7129f 100644 (file)
@@ -827,6 +827,10 @@ olsr_input_tc(union olsr_message * msg, struct interface * input_if __attribute_
 
   tc = olsr_lookup_tc_entry(&originator);
 
+  if (vtime < (olsr_reltime)(olsr_cnf->min_tc_vtime*1000)) {
+         vtime = (olsr_reltime)(olsr_cnf->min_tc_vtime*1000);
+  }
+
   if (tc && 0 != tc->edge_tree.count) {
     if (olsr_seq_inrange_high((int)tc->msg_seq - TC_SEQNO_WINDOW, tc->msg_seq, msg_seq)
         && olsr_seq_inrange_high((int)tc->ansn - TC_ANSN_WINDOW, tc->ansn, ansn)) {