sgw: add SmartGatewayInstanceId setting
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 5 Nov 2015 16:46:32 +0000 (17:46 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 6 Nov 2015 11:16:33 +0000 (12:16 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
README-Olsr-Extensions
files/olsrd.conf.default.full.txt
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/olsr_cfg.h

index 6884e74..af89e94 100644 (file)
@@ -256,7 +256,13 @@ All other parameters will be ignored if SmartGateway is set to "no"
    effects of breaking connections (due to the selection of a new gateway) on
    a dynamic network.
    The default setting is 1.
-2- SmartGatewayTakeDownPercentage determines the take-down percentage for a
+2- SmartGatewayInstanceId is the olsrd instance id, which is needed for proper
+   cleanup of multi-gateway iptables and ip rules when running multiple olsrd
+   instances on a node. This setting MUST be configured when the multi-gateway
+   mode is enabled and must be unique between the olsrd instances running on
+   the node. It may not contain whitespace and may not be empty.
+   The default setting is <not set>.
+3- 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
@@ -266,19 +272,19 @@ All other parameters will be ignored if SmartGateway is set to "no"
    only when a new tunnel is created while then are already
    'SmartGatewayUseCount' tunnels.
    The default setting is 0.
-3- SmartGatewayPolicyRoutingScript controls the policy routing script that is
+4- SmartGatewayPolicyRoutingScript controls 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 reference
    script is included.
    The default setting is <not set>.
-4- SmartGatewayEgressInterfaces determines the egress interfaces that are part
+5- 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). This setting can contain multiple interfaces, for example
      SmartGatewayEgressInterfaces "eth0" "eth1" "ppp0"
    The default setting is <not set>.
-5- SmartGatewayEgressFile declares the file that contains the bandwidth
+6- SmartGatewayEgressFile declares the file that contains the bandwidth
    parameters of the egress interfaces declared by SmartGatewayEgressInterfaces.
    Every line in the file declares bandwidth parameters of an egress interface,
    with the format:
@@ -304,36 +310,36 @@ All other parameters will be ignored if SmartGateway is set to "no"
    interface, but not like a ppp interface) then the network/prefix field must
    be set in order for a network route to be programmed.
    The default setting is "/var/run/olsrd-sgw-egress.conf".
-6- SmartGatewayEgressFilePeriod determines the period (in milliseconds) on which
+7- SmartGatewayEgressFilePeriod determines the period (in milliseconds) on which
    the SmartGatewayEgressFile is checked for changes and processed if changed.
    The default setting is 5000.
-7- SmartGatewayStatusFile declares the file that is written by olsrd to contain
+8- SmartGatewayStatusFile declares the file that is written by olsrd to contain
    the status of the smart gateways and is only relevant when
    SmartGatewayUseCount is larger than 1.
    The default setting is <not set>
-8- SmartGatewayTablesOffset and SmartGatewayRulesOffset determine the ranges of
+9- SmartGatewayTablesOffset and SmartGatewayRulesOffset determine the ranges of
    policy routing rule markings that are used in a multi-gateway setup (see the
    policy routing script for an explanation).
    The default settings are 90 and 0 respectively. The value of 0 for
    SmartGatewayRulesOffset will automatically align the table and rule numbers
    for the server tunnel, egress interfaces and gateway tunnel interfaces.
-9- SmartGatewayAllowNAT controls whether you want to allow the selection
+10-SmartGatewayAllowNAT controls whether you want to allow the selection
    of an outgoing ipv4 gateway with NAT (Network Address Translation).
    The default setting is "yes".
-10-SmartGatewayPeriod determines the period (in milliseconds) on which
+11-SmartGatewayPeriod determines the period (in milliseconds) on which
    a new smart gateway selection is performed.
    The default setting is 10000 milliseconds.
-11-SmartGatewayStableCount determines the number of times the same new gateway
+12-SmartGatewayStableCount determines the number of times the same new gateway
    must be chosen before that new smart gateway is actually selected.
    The default setting is 6.
-12-SmartGatewayThreshold (percentage) controls whether you want to allow
+13-SmartGatewayThreshold (percentage) 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.
-13-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
+14-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
    SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing
    of gateway bandwidth and ETX costs.
-14-SmartGatewayMaxCostMaxEtx: When a node advertises the maximum bandwidth
+15-SmartGatewayMaxCostMaxEtx: When a node advertises the maximum bandwidth
    and its ETX is below the value of this setting then the resulting gateway
    costs are equal to the ETX, otherwise the normal calculation of the
    gateway costs applies (default is 2560).
index adc241b..4834662 100644 (file)
 
 # SmartGatewayTakeDownPercentage 25
 
+# Determines the olsrd instance id, which is needed for proper cleanup
+# of multi-gateway iptables and ip rules when running multiple olsrd
+# instances on a node. This setting MUST be configured when the
+# multi-gateway mode is enabled and must be unique between the olsrd
+# instances running on the node. It may not contain whitespace and may
+# not be empty.
+# (default is not set)
+
+# SmartGatewayInstanceId <not set>
+
 # 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 dc861ad..4beb80f 100644 (file)
@@ -685,6 +685,21 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
       cnf->smart_gw_takedown_percentage);
   abuf_puts(out,
     "\n"
+    "# Determines the olsrd instance id, which is needed for proper cleanup\n"
+    "# of multi-gateway iptables and ip rules when running multiple olsrd\n"
+    "# instances on a node. This setting MUST be configured when the\n"
+    "# multi-gateway mode is enabled and must be unique between the olsrd\n"
+    "# instances running on the node. It may not contain whitespace and may\n"
+    "# not be empty.\n"
+    "# (default is <not set>)\n"
+    "\n");
+  abuf_appendf(out, "%sSmartGatewayInstanceId %s%s%s\n",
+      !cnf->smart_gw_instance_id ? "# " : "",
+      !cnf->smart_gw_instance_id ? "" : "\"",
+      !cnf->smart_gw_instance_id ? "<not set>" : cnf->smart_gw_instance_id,
+      !cnf->smart_gw_instance_id ? "" : "\"");
+  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 c68477f..2683f20 100644 (file)
@@ -63,6 +63,7 @@
 #include <linux/version.h>
 #include <sys/stat.h>
 #include <net/if.h>
+#include <ctype.h>
 #endif /* __linux__ */
 
 extern FILE *yyin;
@@ -600,6 +601,28 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
          return -1;
        }
 
+    if (!cnf->smart_gw_instance_id) {
+      fprintf(stderr, "Error, no smart gateway instance id configured in multi-gateway mode\n");
+      return -1;
+    }
+
+    {
+      size_t len = strlen(cnf->smart_gw_instance_id);
+      size_t index = 0;
+
+      if (!len) {
+        fprintf(stderr, "Error, smart gateway instance id can not be empty\n");
+        return -1;
+      }
+
+      while (index++ < len) {
+        if (isspace(cnf->smart_gw_instance_id[index])) {
+          fprintf(stderr, "Error, smart gateway instance id contains whitespace\n");
+          return -1;
+        }
+      }
+    }
+
     if (!cnf->smart_gw_policyrouting_script) {
       fprintf(stderr, "Error, no policy routing script configured in multi-gateway mode\n");
       return -1;
@@ -990,6 +1013,7 @@ set_default_cnf(struct olsrd_config *cnf, char * configuration_file)
   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_instance_id = NULL;
   cnf->smart_gw_policyrouting_script = NULL;
   cnf->smart_gw_egress_interfaces = NULL;
   cnf->smart_gw_egress_interfaces_count = 0;
@@ -1133,6 +1157,8 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("SmGw. Takedown%%  : %u\n", cnf->smart_gw_takedown_percentage);
 
+  printf("SmGw. Instance Id: %s\n", cnf->smart_gw_instance_id);
+
   printf("SmGw. Pol. Script: %s\n", cnf->smart_gw_policyrouting_script);
 
   printf("SmGw. Egress I/Fs:");
index ad36e04..6685364 100644 (file)
@@ -222,6 +222,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL
 %token TOK_SMART_GW_USE_COUNT
 %token TOK_SMART_GW_TAKEDOWN_PERCENTAGE
+%token TOK_SMART_GW_INSTANCE_ID
 %token TOK_SMART_GW_POLICYROUTING_SCRIPT
 %token TOK_SMART_GW_EGRESS_IFS
 %token TOK_SMART_GW_EGRESS_FILE
@@ -321,6 +322,7 @@ stmt:       idebug
           | bsmart_gw_always_remove_server_tunnel
           | ismart_gw_use_count
           | ismart_gw_takedown_percentage
+          | ssmart_gw_instance_id
           | ssmart_gw_policyrouting_script
           | ssmart_gw_egress_file
           | ismart_gw_egress_file_period
@@ -1363,6 +1365,14 @@ ismart_gw_takedown_percentage: TOK_SMART_GW_TAKEDOWN_PERCENTAGE TOK_INTEGER
 }
 ;
 
+ssmart_gw_instance_id: TOK_SMART_GW_INSTANCE_ID TOK_STRING
+{
+  PARSER_DEBUG_PRINTF("Smart gateway instance id: %s\n", $2->string);
+  olsr_cnf->smart_gw_instance_id = $2->string;
+  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 8d499c0..f6b146d 100644 (file)
@@ -486,6 +486,11 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_TAKEDOWN_PERCENTAGE;
 }
 
+"SmartGatewayInstanceId" {
+    yylval = NULL;
+    return TOK_SMART_GW_INSTANCE_ID;
+}
+
 "SmartGatewayPolicyRoutingScript" {
     yylval = NULL;
     return TOK_SMART_GW_POLICYROUTING_SCRIPT;
index 0f29d99..e0a7951 100644 (file)
@@ -317,6 +317,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_instance_id;
   char *smart_gw_policyrouting_script;
   struct sgw_egress_if * smart_gw_egress_interfaces;
   uint8_t smart_gw_egress_interfaces_count;