gateway: add SmartGatewayTakeDownPercentage configuration parameter
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 19 Apr 2013 11:12:46 +0000 (13:12 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 23 Apr 2013 13:56:12 +0000 (15:56 +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/olsr_cfg.h

index 5423e03..51baf28 100644 (file)
@@ -256,36 +256,44 @@ All other parameters will be ignored if SmartGateway is set to "no"
    breaking connections (due to the selection of a new gateway) on a dynamic
    network.
    The default setting is 1.
-2- SmartGatewayPolicyRoutingScript controles the policy routing script that is
+2- SmartGatewayTakeDownPercentage determines the take-down percentage for a
+   non-current smart gateway tunnel. If the cost of the current smart gateway
+   tunnel is less than this percentage of the cost of the non-current smart
+   gateway tunnel, then the non-current smart gateway tunnel is taken down
+   because it is then presumed to be 'too expensive'.
+   This setting is only relevant when SmartGatewayUseCount is larger than 1;
+   a value of 0 will result in the tunnels not being taken down proactively.
+   The default setting is 0.
+3- SmartGatewayPolicyRoutingScript controles the policy routing script that is
    executed during startup and shutdown of olsrd. The script is only executed
    when SmartGatewayUseCount is set to a value larger than 1. The script must
    setup policy routing rules such that multi-gateway mode works. A sample
    script is included.
    The default setting is 'not set'.
-3- SmartGatewayEgressInterfaces determines the egress interfaces that are part
+4- SmartGatewayEgressInterfaces determines the egress interfaces that are part
    of the multi-gateway setup and therefore only relevant when
    SmartGatewayUseCount is larger than 1 (in which case it must be explicitly
    set).
    The default setting is 'not set'.
-4- SmartGatewayMarkOffsetEgress and SmartGatewayMarkOffsetTunnels determine
+5- SmartGatewayMarkOffsetEgress and SmartGatewayMarkOffsetTunnels determine
    the ranges of policy routing rule markings that are used in a multi-gateway
    setup. The ranges are not allowed to overlap. Both settings are only
    relevant when a multi-gateway setup is used.
    The default settings are 91 and 101 respectively.
-5- SmartGatewayAllowNAT controls whether you want to allow the selection
+6- SmartGatewayAllowNAT controls whether you want to allow the selection
    of an outgoing ipv4 gateway with NAT (Network Address Translation).
    The default setting is "yes".
-6- SmartGatewayPeriod determines the period (in milliseconds) on which
+7- SmartGatewayPeriod determines the period (in milliseconds) on which
    a new smart gateway selection is performed.
    The default setting is 10000 milliseconds.
-7- SmartGatewayStableCount determines the number of times the link state
+8- 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.
-8- SmartGatewayThreshold controls whether you want to allow re-selection
+9- 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.
-9- SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
+10-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
    SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing
    of gateway bandwidth and ETX costs.
 
index bdb6894..21fd505 100644 (file)
 
 # SmartGatewayUseCount 1
 
+# Determines the take-down percentage for a non-current smart gateway tunnel.
+# If the cost of the current smart gateway tunnel is less than this percentage
+# of the cost of the non-current smart gateway tunnel, then the non-current smart
+# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
+# This setting is only relevant when SmartGatewayUseCount is larger than 1;
+# a value of 0 will result in the tunnels not being taken down proactively.
+# (default is 0)
+
+# SmartGatewayTakeDownPercentage 0
+
 # Determines the policy routing script that is executed during startup and
 # shutdown of olsrd. The script is only executed when SmartGatewayUseCount
 # is set to a value larger than 1. The script must setup policy routing
index cfb24d4..078e2f9 100644 (file)
 
 # SmartGatewayUseCount 1
 
+# Determines the take-down percentage for a non-current smart gateway tunnel.
+# If the cost of the current smart gateway tunnel is less than this percentage
+# of the cost of the non-current smart gateway tunnel, then the non-current smart
+# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
+# This setting is only relevant when SmartGatewayUseCount is larger than 1;
+# a value of 0 will result in the tunnels not being taken down proactively.
+# (default is 0)
+
+# SmartGatewayTakeDownPercentage 0
+
 # Determines the policy routing script that is executed during startup and
 # shutdown of olsrd. The script is only executed when SmartGatewayUseCount
 # is set to a value larger than 1. The script must setup policy routing
index 7e7b8cc..64e30d8 100644 (file)
 
 # SmartGatewayUseCount 1
 
+# Determines the take-down percentage for a non-current smart gateway tunnel.
+# If the cost of the current smart gateway tunnel is less than this percentage
+# of the cost of the non-current smart gateway tunnel, then the non-current smart
+# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
+# This setting is only relevant when SmartGatewayUseCount is larger than 1;
+# a value of 0 will result in the tunnels not being taken down proactively.
+# (default is 0)
+
+# SmartGatewayTakeDownPercentage 0
+
 # Determines the policy routing script that is executed during startup and
 # shutdown of olsrd. The script is only executed when SmartGatewayUseCount
 # is set to a value larger than 1. The script must setup policy routing
index 1a5277d..b308bb2 100644 (file)
@@ -458,6 +458,19 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
       cnf->smart_gw_use_count);
   abuf_puts(out,
     "\n"
+    "# Determines the take-down percentage for a non-current smart gateway tunnel.\n"
+    "# If the cost of the current smart gateway tunnel is less than this percentage\n"
+    "# of the cost of the non-current smart gateway tunnel, then the non-current smart\n"
+    "# gateway tunnel is taken down because it is then presumed to be 'too expensive'.\n"
+    "# This setting is only relevant when SmartGatewayUseCount is larger than 1;\n"
+    "# a value of 0 will result in the tunnels not being taken down proactively.\n"
+    "# (default is 0)\n"
+    "\n");
+  abuf_appendf(out, "%sSmartGatewayTakeDownPercentage %d\n",
+      cnf->smart_gw_takedown_percentage == DEF_GW_TAKEDOWN_PERCENTAGE ? "# " : "",
+      cnf->smart_gw_takedown_percentage);
+  abuf_puts(out,
+    "\n"
     "# Determines the policy routing script that is executed during startup and\n"
     "# shutdown of olsrd. The script is only executed when SmartGatewayUseCount\n"
     "# is set to a value larger than 1. The script must setup policy routing\n"
index b2cc735..ca856f5 100644 (file)
@@ -564,6 +564,13 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
   if (cnf->smart_gw_use_count > 1) {
     struct sgw_egress_if * sgwegressif = cnf->smart_gw_egress_interfaces;
 
+       /* check that the sgw takedown percentage is in the range [0, 100] */
+       if (/*(cnf->smart_gw_takedown_percentage < 0) ||*/ (cnf->smart_gw_takedown_percentage > 100)) {
+         fprintf(stderr, "Error, smart gateway takedown percentage (%u) is not in the range [0, 100]\n",
+                 cnf->smart_gw_takedown_percentage);
+         return -1;
+       }
+
     if (!cnf->smart_gw_policyrouting_script) {
       fprintf(stderr, "Error, no policy routing script configured in multi-gateway mode\n");
       return -1;
@@ -890,6 +897,7 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->smart_gw_active = DEF_SMART_GW;
   cnf->smart_gw_always_remove_server_tunnel = DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL;
   cnf->smart_gw_use_count = DEF_GW_USE_COUNT;
+  cnf->smart_gw_takedown_percentage = DEF_GW_TAKEDOWN_PERCENTAGE;
   cnf->smart_gw_policyrouting_script = NULL;
   cnf->smart_gw_egress_interfaces = NULL;
   cnf->smart_gw_egress_interfaces_count = 0;
@@ -1027,6 +1035,8 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("SmGw. Use Count  : %u\n", cnf->smart_gw_use_count);
 
+  printf("SmGw. Takedown%%  : %u\n", cnf->smart_gw_takedown_percentage);
+
   printf("SmGw. Pol. Script: %s\n", cnf->smart_gw_policyrouting_script);
 
   printf("SmGw. Egress I/Fs:");
index e29c560..9b4b9e4 100644 (file)
@@ -218,6 +218,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_SMART_GW
 %token TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL
 %token TOK_SMART_GW_USE_COUNT
+%token TOK_SMART_GW_TAKEDOWN_PERCENTAGE
 %token TOK_SMART_GW_POLICYROUTING_SCRIPT
 %token TOK_SMART_GW_EGRESS_IFS
 %token TOK_SMART_GW_MARK_OFFSET_EGRESS
@@ -311,6 +312,7 @@ stmt:       idebug
           | bsmart_gw
           | bsmart_gw_always_remove_server_tunnel
           | ismart_gw_use_count
+          | ismart_gw_takedown_percentage
           | ssmart_gw_policyrouting_script
           | ismart_gw_mark_offset_egress
           | ismart_gw_mark_offset_tunnels
@@ -1333,6 +1335,14 @@ ismart_gw_use_count: TOK_SMART_GW_USE_COUNT TOK_INTEGER
 }
 ;
 
+ismart_gw_takedown_percentage: TOK_SMART_GW_TAKEDOWN_PERCENTAGE TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("Smart gateway takedown percentage: %d\n", $2->integer);
+  olsr_cnf->smart_gw_takedown_percentage = $2->integer;
+  free($2);
+}
+;
+
 ssmart_gw_policyrouting_script: TOK_SMART_GW_POLICYROUTING_SCRIPT TOK_STRING
 {
   PARSER_DEBUG_PRINTF("Smart gateway policy routing script: %s\n", $2->string);
index fc07b1e..6321acd 100644 (file)
@@ -476,6 +476,11 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_USE_COUNT;
 }
 
+"SmartGatewayTakeDownPercentage" {
+    yylval = NULL;
+    return TOK_SMART_GW_TAKEDOWN_PERCENTAGE;
+}
+
 "SmartGatewayPolicyRoutingScript" {
     yylval = NULL;
     return TOK_SMART_GW_POLICYROUTING_SCRIPT;
index 24bd69c..bf409fd 100644 (file)
@@ -83,6 +83,7 @@
 #define DEF_SMART_GW         false
 #define DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL  false
 #define DEF_GW_USE_COUNT     1
+#define DEF_GW_TAKEDOWN_PERCENTAGE 25
 #define DEF_GW_MARK_OFFSET_EGRESS   91
 #define DEF_GW_MARK_OFFSET_TUNNELS 101
 #define DEF_GW_PERIOD        10*1000
@@ -293,6 +294,7 @@ struct olsrd_config {
 
   bool smart_gw_active, smart_gw_always_remove_server_tunnel, smart_gw_allow_nat, smart_gw_uplink_nat;
   uint8_t smart_gw_use_count;
+  uint8_t smart_gw_takedown_percentage;
   char *smart_gw_policyrouting_script;
   struct sgw_egress_if * smart_gw_egress_interfaces;
   uint8_t smart_gw_egress_interfaces_count;