smart gateway: make period and stable count configurable
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 2 May 2012 10:14:23 +0000 (12:14 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 2 May 2012 11:20:21 +0000 (13:20 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
README-Olsr-Extensions
files/olsrd.conf.default.full
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/gateway_default_handler.c
src/olsr_cfg.h

index 55cb7d3..a6e9d13 100644 (file)
@@ -221,6 +221,8 @@ More information on NIIT can be found at: http://wiki.freifunk.net/Niit
     5.) Smart gateways (asymmetric gateway tunnels)
 *******************************************************
 
+    5.1) Introduction
+
 The smart gateway mechanism was written by Markus Kittenberger and
 Henning Rogge to allow an OLSR user to directly choose their default
 Internet gateway instead of relying on the hop by hop decisions on
@@ -246,22 +248,26 @@ SmartGateway <yes/no>
 All other parameters will be ignored if SmartGateway is set to "no"
 (the default is "no").
 
-On the client side there are two additional parameters.
-The first parameter controls whether you want to allow the selection
-of an outgoing ipv4 gateway with NAT (Network Address Translation).
-The default setting is "yes".
 
-SmartGatewayAllowNAT <yes/no>
+    5.2) Client Side
+
+1- SmartGatewayAllowNAT controls whether you want to allow the selection
+   of an outgoing ipv4 gateway with NAT (Network Address Translation).
+   The default setting is "yes".
+2- SmartGatewayPeriod determines the period (in milliseconds) on which
+   a new smart gateway selection is performed.
+   The default setting is 10000 milliseconds.
+3- SmartGatewayStableCount determines the number of times the link state
+   database must be stable before a new smart gateway is selected.
+   The default setting is 6.
+4- SmartGatewayThreshold controls whether you want to allow re-selection
+   of a new outgoing gateway if its routing cost is lower or equal to the
+   configured percentage of the routing cost of the current gateway.
+   The default setting is 0, which disables it.
 
-The second parameter controls whether you want to allow re-selection
-of a new outgoing gateway if its routing cost is lower or equal to the
-configured percentage of the routing cost of the current gateway.
-The default setting is 0, which disables it.
 
-SmartGatewayThreshold <threshold>
+    5.3) Uplink Side
 
-The uplink side of the smart gateway code has four parameters to
-set up the type of the uplink:
 1- SmartGatewayUplink defines which kind of uplink is exported to the
    other mesh nodes. The existence of the uplink is detected by looking
    for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. The default
@@ -277,10 +283,8 @@ set up the type of the uplink:
    translation. The maximum prefix length is 64 bits,
    the default is ::/0 (no prefix).
 
-SmartGatewayUplink <none/ipv4/ipv6/both>
-SmartGatewayUplinkNAT <yes/no>
-SmartGatewaySpeed <uplink> <downlink>
-SmartGatewayPrefix <prefix>
+
+    5.4) Architecture & Notes
 
 On the smart gateway server (the OLSR instance announcing 'Internet here!' via
 HNA 0/0 or similar) the implicit tunl0 interface is used to forward incoming
index 42d16a7..5fc51d0 100644 (file)
 
 # SmartGatewayAllowNAT yes
 
+# Determines the period (in milliseconds) on which a new smart gateway
+# selection is performed.
+# (default is 10000 milliseconds)
+
+# SmartGatewayPeriod 10000
+
+# Determines the number of times the link state database must be stable
+# before a new smart gateway is selected.
+# (default is 6)
+
+# SmartGatewayStableCount 6
+
 # When another gateway than the current one has a cost of less than the cost
 # of the current gateway multiplied by SmartGatewayThreshold then the smart
 # gateway is switched to the other gateway. The unit is percentage.
index a986eed..ee81e83 100644 (file)
 
 # SmartGatewayAllowNAT yes
 
+# Determines the period (in milliseconds) on which a new smart gateway
+# selection is performed.
+# (default is 10000 milliseconds)
+
+# SmartGatewayPeriod 10000
+
+# Determines the number of times the link state database must be stable
+# before a new smart gateway is selected.
+# (default is 6)
+
+# SmartGatewayStableCount 6
+
 # When another gateway than the current one has a cost of less than the cost
 # of the current gateway multiplied by SmartGatewayThreshold then the smart
 # gateway is switched to the other gateway. The unit is percentage.
index c277ef6..be543b9 100644 (file)
 
 # SmartGatewayAllowNAT yes
 
+# Determines the period (in milliseconds) on which a new smart gateway
+# selection is performed.
+# (default is 10000 milliseconds)
+
+# SmartGatewayPeriod 10000
+
+# Determines the number of times the link state database must be stable
+# before a new smart gateway is selected.
+# (default is 6)
+
+# SmartGatewayStableCount 6
+
 # When another gateway than the current one has a cost of less than the cost
 # of the current gateway multiplied by SmartGatewayThreshold then the smart
 # gateway is switched to the other gateway. The unit is percentage.
index 6cfc3b4..dd58dc5 100644 (file)
@@ -446,6 +446,24 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
       cnf->smart_gw_allow_nat ? "yes" : "no");
   abuf_puts(out,
     "\n"
+    "# Determines the period (in milliseconds) on which a new smart gateway\n"
+    "# selection is performed.\n"
+    "# (default is 10000 milliseconds)\n"
+    "\n");
+  abuf_appendf(out, "%sSmartGatewayPeriod %d\n",
+      cnf->smart_gw_period == DEF_GW_PERIOD ? "# " : "",
+      cnf->smart_gw_period);
+  abuf_puts(out,
+    "\n"
+    "# Determines the number of times the link state database must be stable\n"
+    "# before a new smart gateway is selected.\n"
+    "# (default is 6)\n"
+    "\n");
+  abuf_appendf(out, "%sSmartGatewayStableCount %d\n",
+      cnf->smart_gw_stablecount == DEF_GW_STABLE_COUNT ? "# " : "",
+      cnf->smart_gw_stablecount);
+  abuf_puts(out,
+    "\n"
     "# When another gateway than the current one has a cost of less than the cost\n"
     "# of the current gateway multiplied by SmartGatewayThreshold then the smart\n"
     "# gateway is switched to the other gateway. The unit is percentage.\n"
index 422660f..08b3c4a 100644 (file)
@@ -549,6 +549,16 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
          fprintf(stderr, "Warning, you are using the min_tc_vtime hack. We hope you know what you are doing... contact olsr.org otherwise.\n");
   }
 
+  if (cnf->smart_gw_period < MIN_SMARTGW_PERIOD || cnf->smart_gw_period > MAX_SMARTGW_PERIOD) {
+    fprintf(stderr, "Error, bad gateway period: %d msec (should be %d-%d)\n",
+        cnf->smart_gw_period, MIN_SMARTGW_PERIOD, MAX_SMARTGW_PERIOD);
+    return -1;
+  }
+  if (cnf->smart_gw_stablecount < MIN_SMARTGW_STABLE || cnf->smart_gw_stablecount > MAX_SMARTGW_STABLE) {
+    fprintf(stderr, "Error, bad gateway stable count: %d (should be %d-%d)\n",
+        cnf->smart_gw_stablecount, MIN_SMARTGW_STABLE, MAX_SMARTGW_STABLE);
+    return -1;
+  }
   if (((cnf->smart_gw_thresh < MIN_SMARTGW_THRES) || (cnf->smart_gw_thresh > MAX_SMARTGW_THRES)) && (cnf->smart_gw_thresh != 0)) {
     fprintf(stderr, "Smart gateway threshold %d is not allowed (should be %d-%d)\n", cnf->smart_gw_thresh,
             MIN_SMARTGW_THRES, MAX_SMARTGW_THRES);
@@ -764,6 +774,8 @@ set_default_cnf(struct olsrd_config *cnf)
 
   cnf->smart_gw_active = DEF_SMART_GW;
   cnf->smart_gw_allow_nat = DEF_GW_ALLOW_NAT;
+  cnf->smart_gw_period = DEF_GW_PERIOD;
+  cnf->smart_gw_stablecount = DEF_GW_STABLE_COUNT;
   cnf->smart_gw_thresh = DEF_GW_THRESH;
   cnf->smart_gw_type = DEF_GW_TYPE;
   cnf->smart_gw_uplink = DEF_UPLINK_SPEED;
@@ -883,6 +895,10 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("SmGw. Allow NAT  : %s\n", cnf->smart_gw_allow_nat ? "yes" : "no");
 
+  printf("SmGw. period     : %d\n", cnf->smart_gw_period);
+
+  printf("SmGw. stablecount: %d\n", cnf->smart_gw_stablecount);
+
   printf("SmGw. threshold  : %d%%\n", cnf->smart_gw_thresh);
 
   printf("Smart Gw. Uplink : %s\n", GW_UPLINK_TXT[cnf->smart_gw_type]);
index 844c7a3..d260e58 100644 (file)
@@ -216,6 +216,8 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_USE_NIIT
 %token TOK_SMART_GW
 %token TOK_SMART_GW_ALLOW_NAT
+%token TOK_SMART_GW_PERIOD
+%token TOK_SMART_GW_STABLECOUNT
 %token TOK_SMART_GW_THRESH
 %token TOK_SMART_GW_UPLINK
 %token TOK_SMART_GW_UPLINK_NAT
@@ -297,6 +299,8 @@ stmt:       idebug
           | suse_niit
           | bsmart_gw
           | bsmart_gw_allow_nat
+          | ismart_gw_period
+          | asmart_gw_stablecount
           | asmart_gw_thresh
           | ssmart_gw_uplink
           | bsmart_gw_uplink_nat
@@ -1290,6 +1294,22 @@ bsmart_gw_allow_nat: TOK_SMART_GW_ALLOW_NAT TOK_BOOLEAN
 }
 ;
 
+ismart_gw_period: TOK_SMART_GW_PERIOD TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("Smart gateway period: %d\n", $2->integer);
+  olsr_cnf->smart_gw_period = $2->integer;
+  free($2);
+}
+;
+
+asmart_gw_stablecount: TOK_SMART_GW_STABLECOUNT TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("Smart gateway stablecount: %d\n", $2->integer);
+  olsr_cnf->smart_gw_stablecount = $2->integer;
+  free($2);
+}
+;
+
 asmart_gw_thresh: TOK_SMART_GW_THRESH TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("Smart gateway threshold: %d\n", $2->integer);
index 0b363c7..7c8200c 100644 (file)
@@ -471,6 +471,16 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_ALLOW_NAT;
 }
 
+"SmartGatewayPeriod" {
+    yylval = NULL;
+    return TOK_SMART_GW_PERIOD;
+}
+
+"SmartGatewayStableCount" {
+    yylval = NULL;
+    return TOK_SMART_GW_STABLECOUNT;
+}
+
 "SmartGatewayThreshold" {
     yylval = NULL;
     return TOK_SMART_GW_THRESH;
index dba2f42..ddd1f1d 100644 (file)
@@ -104,7 +104,7 @@ static void gw_default_timer(void *unused __attribute__ ((unused))) {
     gw_def_stablecount = 0;
   }
 
-  if (gw_def_stablecount >= DEF_GW_STABLE_COUNT) {
+  if (gw_def_stablecount >= olsr_cnf->smart_gw_stablecount) {
     gw_default_choose_gateway();
   }
 }
@@ -126,7 +126,7 @@ static void gw_default_startup_handler(void) {
   gw_def_finished_ipv6 |= olsr_cnf->has_ipv6_gateway;
 
   /* start gateway selection timer */
-  olsr_set_timer(&gw_def_timer, DEF_GW_PERIOD, 0, true, &gw_default_timer, NULL, 0);
+  olsr_set_timer(&gw_def_timer, olsr_cnf->smart_gw_period, 0, true, &gw_default_timer, NULL, 0);
 }
 
 static void gw_default_update_handler(struct gateway_entry *gw) {
index cfa8a24..b588da1 100644 (file)
 #define MAX_LQ_AGING         1.0
 #define MIN_LQ_AGING         0.01
 
+#define MIN_SMARTGW_PERIOD   1*1000
+#define MAX_SMARTGW_PERIOD   320000*1000
+
+#define MIN_SMARTGW_STABLE   1
+#define MAX_SMARTGW_STABLE   254
+
 #define MIN_SMARTGW_THRES    10
 #define MAX_SMARTGW_THRES    100
 
@@ -263,6 +269,8 @@ struct olsrd_config {
   bool use_niit;
 
   bool smart_gw_active, smart_gw_allow_nat, smart_gw_uplink_nat;
+  uint32_t smart_gw_period;
+  uint8_t smart_gw_stablecount;
   uint8_t smart_gw_thresh;
   enum smart_gw_uplinktype smart_gw_type;
   uint32_t smart_gw_uplink, smart_gw_downlink;