Added interface weight option in configfile
authorAndreas Tonnesen <andreto@olsr.org>
Thu, 17 Feb 2005 17:23:19 +0000 (17:23 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Thu, 17 Feb 2005 17:23:19 +0000 (17:23 +0000)
files/olsrd.conf.5.gz
files/olsrd.conf.default
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/olsr_cfg.h
src/unix/ifnet.c
src/win32/ifnet.c

index 45df703..d6a096c 100644 (file)
Binary files a/files/olsrd.conf.5.gz and b/files/olsrd.conf.5.gz differ
index 1b3c10f..c5c6603 100644 (file)
@@ -249,5 +249,17 @@ Interface "XXX" "YYY"
 
     # HNA validity time
     # HnaValidityTime  15.0
+
+    # When multiple links exist between hosts
+    # the weight of interface is used to determine
+    # the link to use. Normally the weight is
+    # automatically calculated by olsrd based
+    # on the characteristics of the interface,
+    # but here you can specify a fixed value.
+    # Olsrd will choos links with the lowest value.
+
+    # Weight 0
+
+
 }
 
index eaa5b55..2ed138b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_conf.c,v 1.32 2005/02/15 17:17:44 tlopatic Exp $
+ * $Id: olsrd_conf.c,v 1.33 2005/02/17 17:21:24 kattemat Exp $
  */
 
 
@@ -174,7 +174,7 @@ olsrd_parse_cnf(const char *filename)
   
   fclose(yyin);
 
-  /* Turn the if queue "around" (added by user request) */
+  /* Reverse the queue (added by user request) */
   in = cnf->interfaces;
   new_ifqueue = NULL;
 
@@ -344,7 +344,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
          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)
@@ -510,6 +510,9 @@ get_default_if_config()
 
   io->lq_mult = NULL;
 
+  io->weight.fixed = OLSR_FALSE;
+  io->weight.value = 0;
+
   io->hello_params.emission_interval = HELLO_INTERVAL;
   io->hello_params.validity_time = NEIGHB_HOLD_TIME;
   io->tc_params.emission_interval = TC_INTERVAL;
index 478f3a3..cf60d78 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oparse.y,v 1.24 2005/02/15 17:17:46 tlopatic Exp $
+ * $Id: oparse.y,v 1.25 2005/02/17 17:21:24 kattemat Exp $
  */
 
 
@@ -162,6 +162,7 @@ static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg)
 %token TOK_IP6ADDRTYPE
 %token TOK_IP6MULTISITE
 %token TOK_IP6MULTIGLOBAL
+%token TOK_IFWEIGHT
 %token TOK_HELLOINT
 %token TOK_HELLOVAL
 %token TOK_TCINT
@@ -254,6 +255,7 @@ ifstmts:   | ifstmts ifstmt
 ;
 
 ifstmt:      vcomment
+             | iifweight
              | isetip4br
              | isetip6addrt
              | isetip6mults
@@ -290,7 +292,6 @@ imaxipc: TOK_MAXIPC TOK_INTEGER
 }
 ;
 
-
 ipchost: TOK_HOSTLABEL TOK_IP4_ADDR
 {
   struct in_addr in;
@@ -350,6 +351,26 @@ ipcnet: TOK_NETLABEL TOK_IP4_ADDR TOK_IP4_ADDR
 }
 ;
 
+iifweight:       TOK_IFWEIGHT TOK_INTEGER
+{
+  int ifcnt = ifs_in_curr_cfg;
+  struct olsr_if *ifs = cnf->interfaces;
+
+  if(PARSER_DEBUG) printf("Fixed willingness: %d\n", $2->integer);
+
+  while(ifcnt)
+    {
+      ifs->cnf->weight.value = $2->integer;
+      ifs->cnf->weight.fixed = OLSR_TRUE;
+
+      ifs = ifs->next;
+      ifcnt--;
+    }
+
+  free($2);
+}
+;
+
 isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
 {
   struct in_addr in;
index 2c5025b..8834f68 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oscan.lex,v 1.15 2005/02/15 17:17:56 tlopatic Exp $
+ * $Id: oscan.lex,v 1.16 2005/02/17 17:21:24 kattemat Exp $
  */
 
 
@@ -381,6 +381,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
   return TOK_CLEAR_SCREEN;
 }
 
+"Weight" {
+  yylval = NULL;
+  return TOK_IFWEIGHT;
+}
+
 "Ip4Broadcast" {
   yylval = NULL;
   return TOK_IP4BROADCAST;
index ce9a8eb..bb81524 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_cfg.h,v 1.17 2005/02/15 17:17:43 tlopatic Exp $
+ * $Id: olsr_cfg.h,v 1.18 2005/02/17 17:21:24 kattemat Exp $
  */
 
 
@@ -124,12 +124,19 @@ struct olsr_lq_mult
   struct olsr_lq_mult *next;
 };
 
+struct olsr_if_weight
+{
+  int        value;
+  olsr_bool  fixed;
+};
+
 struct if_config_options
 {
   union olsr_ip_addr       ipv4_broadcast;
   int                      ipv6_addrtype;
   union olsr_ip_addr       ipv6_multi_site;
   union olsr_ip_addr       ipv6_multi_glbl;
+  struct olsr_if_weight    weight;
   struct olsr_msg_params   hello_params;
   struct olsr_msg_params   tc_params;
   struct olsr_msg_params   mid_params;
index 4e27348..78a0ccc 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.16 2005/02/17 07:19:49 kattemat Exp $
+ * $Id: ifnet.c,v 1.17 2005/02/17 17:21:24 kattemat Exp $
  */
 
 
@@ -202,7 +202,10 @@ chk_if_changed(struct olsr_if *iface)
   ifp->is_wireless = check_wireless_interface(ifr.ifr_name);
 
   /* Set interface metric */
-  ifp->int_metric = calculate_if_metric(ifr.ifr_name);
+  if(iface->cnf->weight.fixed)
+    ifp->int_metric = iface->cnf->weight.value;
+  else
+    ifp->int_metric = calculate_if_metric(ifr.ifr_name);
 
   /* Get MTU */
   if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
@@ -660,7 +663,11 @@ chk_if_up(struct olsr_if *iface, int debuglvl)
   ifs.if_index = if_nametoindex(ifr.ifr_name);
   
   /* Set interface metric */
-  ifs.int_metric = calculate_if_metric(ifr.ifr_name);
+  /* Set interface metric */
+  if(iface->cnf->weight.fixed)
+    ifs.int_metric = iface->cnf->weight.value;
+  else
+    ifs.int_metric = calculate_if_metric(ifr.ifr_name);
   olsr_printf(1, "\tMetric: %d\n", ifs.int_metric);
 
   /* setting the interfaces number*/
index f349222..e584c59 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.13 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: ifnet.c,v 1.14 2005/02/17 17:23:19 kattemat Exp $
  */
 
 #include "../interfaces.h"
@@ -624,7 +624,10 @@ int chk_if_changed(struct olsr_if *IntConf)
     olsr_printf(1, "\tLAN/WLAN change: %d -> %d.\n", Int->is_wireless, IsWlan);
 
     Int->is_wireless = IsWlan;
-    Int->int_metric = IsWlan;
+    if(IntConf->weight.fixed)
+      Int->int_metric = IntConf->weight.value;
+    else
+      Int->int_metric = IsWlan;
 
     Res = 1;
   }
@@ -771,7 +774,10 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel)
     IsWlan = 1;
 
   New->is_wireless = IsWlan;
-  New->int_metric = IsWlan;
+  if(IntConf->weight.fixed)
+    New->int_metric = IntConf->weight.value;
+  else
+    New->int_metric = IsWlan;
 
   New->olsr_seqnum = random() & 0xffff;