sgw: add egress file reader settings
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 29 Oct 2014 10:22:55 +0000 (11:22 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 12 Nov 2014 10:45:25 +0000 (11:45 +0100)
* SmartGatewayEgressFile: the file with egress bandwidths and network
  configurations.
* SmartGatewayEgressFilePeriod: the period on which to check & process
  the SmartGatewayEgressFile.

The egress file reader will be added later on.

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 52f1bea..3c5cf8e 100644 (file)
@@ -278,26 +278,55 @@ All other parameters will be ignored if SmartGateway is set to "no"
    set). This setting can contain multiple interfaces, for example
      SmartGatewayEgressInterfaces "eth0" "eth1" "ppp0"
    The default setting is <not set>.
-5- SmartGatewayTablesOffset and SmartGatewayRulesOffset determine the ranges of
+5- 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:
+     # this is a comment
+     interface=upstream,downstream,pathcost,network/prefix,gateway
+   Only the upstream and downstream fields are mandatory, the other fields are
+   optional. An empty field signifies that its default should be used.
+   The field defaults are:
+     upstream           = 0 (Kbps)
+     downstream         = 0 (Kbps)
+     pathcost           = 0 (dimensionless, 1024 is equivalent to 1 hop)
+     network/prefix     = no default / not set
+                          - network is an IP address
+                          - prefix is a number in the range [0, 24] for IPv4
+                            and in the range [0, 128] for IPv6
+     gateway            = no default / not set (IP address)
+   Note that when an interface needs a gateway to properly transport traffic
+   then the gateway IP address field MUST be set; doing otherwise will
+   result in non-functional routes being programmed. When an interface doesn't
+   need a gateway (for example a ppp interface) then the gateway IP address
+   field must be left empty.
+   Also note that when an interface has an attached network (like an Ethernet
+   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
+   the SmartGatewayEgressFile is checked for changes and processed if changed.
+   The default setting is 5000.
+7- 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.
-6- SmartGatewayAllowNAT controls whether you want to allow the selection
+8- SmartGatewayAllowNAT controls whether you want to allow the selection
    of an outgoing ipv4 gateway with NAT (Network Address Translation).
    The default setting is "yes".
-7- SmartGatewayPeriod determines the period (in milliseconds) on which
+9- SmartGatewayPeriod determines the period (in milliseconds) on which
    a new smart gateway selection is performed.
    The default setting is 10000 milliseconds.
-8- SmartGatewayStableCount determines the number of times the same new gateway
+10-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.
-9- SmartGatewayThreshold (percentage) controls whether you want to allow
+11-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.
-10-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
+12-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
    SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing
    of gateway bandwidth and ETX costs.
 
index f4fa14a..3df50c2 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# 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:
+#   # this is a comment
+#   interface=upstream,downstream,pathcost,network/prefix,gateway
+# (default is /var/run/olsrd-sgw-egress.conf)
+
+# SmartGatewayEgressFile "/var/run/olsrd-sgw-egress.conf"
+
+# Determines the period (in milliseconds) on which the SmartGatewayEgressFile
+# is checked for changes and processed if changed.
+# (default is 5000)
+
+# SmartGatewayEgressFilePeriod "5000"
+
 # Determines the routing tables offset for multi-gateway policy routing tables
 # See the policy routing script for an explanation.
 # (default is 90)
index e694e3d..a5a6fe3 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# 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:
+#   # this is a comment
+#   interface=upstream,downstream,pathcost,network/prefix,gateway
+# (default is /var/run/olsrd-sgw-egress.conf)
+
+# SmartGatewayEgressFile "/var/run/olsrd-sgw-egress.conf"
+
+# Determines the period (in milliseconds) on which the SmartGatewayEgressFile
+# is checked for changes and processed if changed.
+# (default is 5000)
+
+# SmartGatewayEgressFilePeriod "5000"
+
 # Determines the routing tables offset for multi-gateway policy routing tables
 # See the policy routing script for an explanation.
 # (default is 90)
index 2b5587b..4fe6ed3 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# 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:
+#   # this is a comment
+#   interface=upstream,downstream,pathcost,network/prefix,gateway
+# (default is /var/run/olsrd-sgw-egress.conf)
+
+# SmartGatewayEgressFile "/var/run/olsrd-sgw-egress.conf"
+
+# Determines the period (in milliseconds) on which the SmartGatewayEgressFile
+# is checked for changes and processed if changed.
+# (default is 5000)
+
+# SmartGatewayEgressFilePeriod "5000"
+
 # Determines the routing tables offset for multi-gateway policy routing tables
 # See the policy routing script for an explanation.
 # (default is 90)
index 0029b50..762107f 100644 (file)
@@ -581,6 +581,41 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   }
   abuf_appendf(out,
     "\n"
+    "# SmartGatewayEgressFile declares the file that contains the bandwidth\n"
+    "# parameters of the egress interfaces declared by SmartGatewayEgressInterfaces.\n"
+    "# Every line in the file declares bandwidth parameters of an egress interface,\n"
+    "# with the format:\n"
+    "#   # this is a comment\n"
+    "#   interface=upstream,downstream,pathcost,network/prefix,gateway\n"
+    "# Only the upstream and downstream fields are mandatory, the other fields are\n"
+    "# optional. An empty field signifies that its default should be used.\n"
+    "# The field defaults are:\n"
+    "#   upstream           = 0 (Kbps)\n"
+    "#   downstream         = 0 (Kbps)\n"
+    "#   pathcost           = 0 (dimensionless, 1024 is equivalent to 1 hop)\n"
+    "#   network/prefix     = no default / not set\n"
+    "#                        - network is an IP address\n"
+    "#                        - prefix is a number in the range [0, 24] for IPv4\n"
+    "#                          and in the range [0, 128] for IPv6\n"
+    "#   gateway            = no default / not set (IP address)\n"
+    "# (default is %s)\n"
+    "\n", DEF_GW_EGRESS_FILE);
+  {
+    bool def = !cnf->smart_gw_egress_file || !strcmp(cnf->smart_gw_egress_file, DEF_GW_EGRESS_FILE);
+    abuf_appendf(out, "%sSmartGatewayEgressFile %s\n",
+      def ? "# " : "", def ? DEF_GW_EGRESS_FILE : cnf->smart_gw_egress_file);
+  }
+  abuf_appendf(out,
+    "\n"
+    "# SmartGatewayEgressFilePeriod determines the period (in milliseconds) on which\n"
+    "# the SmartGatewayEgressFile is checked for changes and processed if changed.\n"
+    "# (default is %u)\n"
+    "\n", DEF_GW_EGRESS_FILE_PERIOD);
+  abuf_appendf(out, "%sSmartGatewayEgressFilePeriod %u\n",
+      cnf->smart_gw_egress_file_period == DEF_GW_EGRESS_FILE_PERIOD ? "# " : "",
+      cnf->smart_gw_egress_file_period);
+  abuf_appendf(out,
+    "\n"
     "# Determines the routing tables offset for multi-gateway policy routing tables\n"
     "# See the policy routing script for an explanation.\n"
     "# (default is %u)\n"
index c610d5e..542333b 100644 (file)
@@ -658,6 +658,11 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
       return -1;
     }
 
+    if (cnf->smart_gw_egress_file_period < MIN_SMARTGW_EGRESS_FILE_PERIOD) {
+      fprintf(stderr, "Error, egress file period must be at least %u\n", MIN_SMARTGW_EGRESS_FILE_PERIOD);
+      return -1;
+    }
+
     {
       uint32_t nrOfTables = 1 + cnf->smart_gw_egress_interfaces_count + cnf->smart_gw_use_count;
 
@@ -975,6 +980,8 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->smart_gw_policyrouting_script = NULL;
   cnf->smart_gw_egress_interfaces = NULL;
   cnf->smart_gw_egress_interfaces_count = 0;
+  cnf->smart_gw_egress_file = NULL;
+  cnf->smart_gw_egress_file_period = DEF_GW_EGRESS_FILE_PERIOD;
   cnf->smart_gw_offset_tables = DEF_GW_OFFSET_TABLES;
   cnf->smart_gw_offset_rules = DEF_GW_OFFSET_RULES;
   cnf->smart_gw_allow_nat = DEF_GW_ALLOW_NAT;
@@ -1123,6 +1130,10 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   }
   printf("\n");
 
+  printf("SmGw. Egress File: %s\n", !cnf->smart_gw_egress_file ? DEF_GW_EGRESS_FILE : cnf->smart_gw_egress_file);
+
+  printf("SmGw. Egr Fl Per.: %u\n", cnf->smart_gw_egress_file_period);
+
   printf("SmGw. Offst Tabls: %u\n", cnf->smart_gw_offset_tables);
 
   printf("SmGw. Offst Rules: %u\n", cnf->smart_gw_offset_rules);
index e9b8e47..f45ed60 100644 (file)
@@ -223,6 +223,8 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_SMART_GW_TAKEDOWN_PERCENTAGE
 %token TOK_SMART_GW_POLICYROUTING_SCRIPT
 %token TOK_SMART_GW_EGRESS_IFS
+%token TOK_SMART_GW_EGRESS_FILE
+%token TOK_SMART_GW_EGRESS_FILE_PERIOD
 %token TOK_SMART_GW_OFFSET_TABLES
 %token TOK_SMART_GW_OFFSET_RULES
 %token TOK_SMART_GW_ALLOW_NAT
@@ -317,6 +319,8 @@ stmt:       idebug
           | ismart_gw_use_count
           | ismart_gw_takedown_percentage
           | ssmart_gw_policyrouting_script
+          | ssmart_gw_egress_file
+          | ismart_gw_egress_file_period
           | ismart_gw_offset_tables
           | ismart_gw_offset_rules
           | bsmart_gw_allow_nat
@@ -1442,6 +1446,22 @@ sgw_egress_if: TOK_STRING
 }
 ;
 
+ssmart_gw_egress_file: TOK_SMART_GW_EGRESS_FILE TOK_STRING
+{
+  PARSER_DEBUG_PRINTF("Smart gateway egress file: %s\n", $2->string);
+  olsr_cnf->smart_gw_egress_file = $2->string;
+  free($2);
+}
+;
+
+ismart_gw_egress_file_period: TOK_SMART_GW_EGRESS_FILE_PERIOD TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("Smart gateway egress file period: %d\n", $2->integer);
+  olsr_cnf->smart_gw_egress_file_period = $2->integer;
+  free($2);
+}
+;
+
 ismart_gw_offset_tables: TOK_SMART_GW_OFFSET_TABLES TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("Smart gateway tables offset: %d\n", $2->integer);
index b123fe4..bfe9054 100644 (file)
@@ -496,6 +496,16 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_EGRESS_IFS;
 }
 
+"SmartGatewayEgressFile" {
+    yylval = NULL;
+    return TOK_SMART_GW_EGRESS_FILE;
+}
+
+"SmartGatewayEgressFilePeriod" {
+    yylval = NULL;
+    return TOK_SMART_GW_EGRESS_FILE_PERIOD;
+}
+
 "SmartGatewayTablesOffset" {
     yylval = NULL;
     return TOK_SMART_GW_OFFSET_TABLES;
index 839d417..57214e7 100644 (file)
 #define DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL  false
 #define DEF_GW_USE_COUNT     1
 #define DEF_GW_TAKEDOWN_PERCENTAGE 25
+#define DEF_GW_EGRESS_FILE    "/var/run/olsrd-sgw-egress.conf"
+#define DEF_GW_EGRESS_FILE_PERIOD 5000
 #define DEF_GW_OFFSET_TABLES 90
 #define DEF_GW_OFFSET_RULES  0
 #define DEF_GW_PERIOD        10*1000
 #define MIN_SMARTGW_USE_COUNT_MIN  1
 #define MAX_SMARTGW_USE_COUNT_MAX  64
 
+#define MIN_SMARTGW_EGRESS_FILE_PERIOD 1000
+
 #define MAX_SMARTGW_EGRESS_INTERFACE_COUNT_MAX 32
 
 #define MIN_SMARTGW_PERIOD   1*1000
@@ -314,6 +318,8 @@ struct olsrd_config {
   char *smart_gw_policyrouting_script;
   struct sgw_egress_if * smart_gw_egress_interfaces;
   uint8_t smart_gw_egress_interfaces_count;
+  char *smart_gw_egress_file;
+  uint32_t smart_gw_egress_file_period;
   uint32_t smart_gw_offset_tables;
   uint32_t smart_gw_offset_rules;
   uint32_t smart_gw_period;