gw: add SmartGatewayMarkOffsetServerTunnel configuration parameter
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 18 Feb 2014 15:06:50 +0000 (16:06 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 20 Feb 2014 14:26:30 +0000 (15:26 +0100)
We need it in the policy routing script

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
12 files changed:
README-Olsr-Extensions
files/olsrd.conf.default.full
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
files/sgw_policy_routing_setup.sh
lib/jsoninfo/src/olsrd_jsoninfo.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/gateway.c
src/olsr_cfg.h

index 3a7af3e..0b9ce5a 100644 (file)
@@ -275,11 +275,12 @@ All other parameters will be ignored if SmartGateway is set to "no"
    SmartGatewayUseCount is larger than 1 (in which case it must be explicitly
    set).
    The default setting is 'not set'.
-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- SmartGatewayMarkOffsetServerTunnel, 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. These settings are only relevant when a multi-gateway setup is
+   used.
+   The default settings are 90, 91 and 101 respectively.
 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".
index 21fd505..9491d9c 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# Determines the offset of the smart gateway server tunnel interface mark that
+# is used in the policy routing rules in a multi-gateway setup. Only relevant
+# when a multi-gateway setup is used.
+# (default is 90)
+
+# SmartGatewayMarkOffsetServerTunnel 90
+
 # Determines the offset of the smart gateway egress interfaces mark that are
 # used in the policy routing rules in a multi-gateway setup. Only relevant
 # when a multi-gateway setup is used.
index 078e2f9..6618c1e 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# Determines the offset of the smart gateway server tunnel interface mark that
+# is used in the policy routing rules in a multi-gateway setup. Only relevant
+# when a multi-gateway setup is used.
+# (default is 90)
+
+# SmartGatewayMarkOffsetServerTunnel 90
+
 # Determines the offset of the smart gateway egress interfaces mark that are
 # used in the policy routing rules in a multi-gateway setup. Only relevant
 # when a multi-gateway setup is used.
index 64e30d8..0b7bd49 100644 (file)
 
 # SmartGatewayEgressInterfaces ""
 
+# Determines the offset of the smart gateway server tunnel interface mark that
+# is used in the policy routing rules in a multi-gateway setup. Only relevant
+# when a multi-gateway setup is used.
+# (default is 90)
+
+# SmartGatewayMarkOffsetServerTunnel 90
+
 # Determines the offset of the smart gateway egress interfaces mark that are
 # used in the policy routing rules in a multi-gateway setup. Only relevant
 # when a multi-gateway setup is used.
index f34182f..9b4c737 100755 (executable)
@@ -39,7 +39,7 @@ function usage() {
   echo "    - mode     : ${MODE_GENERIC}, ${MODE_OLSRIF}, ${MODE_SGWSRVTUN}, ${MODE_EGRESSIF} or ${MODE_SGWTUN}"
   echo "    - addMode  : ${ADDMODE_ADD} or ${ADDMODE_DEL}"
   echo "    - ifname   : an interface name, not relevant for generic mode"
-  echo "    - ifmark   : an interface marking (number), only relevant for ${MODE_EGRESSIF} and ${MODE_SGWTUN} modes"
+  echo "    - ifmark   : an interface marking (number), only relevant for modes ${MODE_SGWSRVTUN}, ${MODE_EGRESSIF} and ${MODE_SGWTUN}"
 }
 
 function error() {
@@ -73,8 +73,8 @@ function olsrif() {
 }
 
 function sgwsrvtun() {
-  # do nothing
-  echo -n "" > /dev/null
+  "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING  -m conntrack --ctstate NEW -i "${1}" -j CONNMARK --set-mark "${2}"
+  "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}"
 }
 
 function egressif() {
@@ -143,7 +143,7 @@ fi
 # check argument count for all modes
 if ([ "${mode}" == "${MODE_GENERIC}" ]   && [ ${argc} -ne 0 ]) || \
    ([ "${mode}" == "${MODE_OLSRIF}" ]    && [ ${argc} -ne 1 ]) || \
-   ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 1 ]) || \
+   ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 2 ]) || \
    ([ "${mode}" == "${MODE_EGRESSIF}"  ] && [ ${argc} -ne 2 ]) || \
    ([ "${mode}" == "${MODE_SGWTUN}"  ]   && [ ${argc} -ne 2 ]); then
   error "Not enough arguments or too many arguments"
index 966292c..a6f85fe 100644 (file)
@@ -1006,6 +1006,7 @@ ipc_print_config(struct autobuf *abuf)
       abuf_json_string(abuf, "smartGatewayEgressInterfaces", egressbuf.buf);
       abuf_free(&egressbuf);
     }
+    abuf_json_int(abuf, "smartGatewayMarkOffsetServerTunnel", olsr_cnf->smart_gw_mark_offset_srvtun);
     abuf_json_int(abuf, "smartGatewayMarkOffsetEgress", olsr_cnf->smart_gw_mark_offset_egress);
     abuf_json_int(abuf, "smartGatewayMarkOffsetTunnels", olsr_cnf->smart_gw_mark_offset_tunnels);
     abuf_json_boolean(abuf, "smartGatewayAllowNat", olsr_cnf->smart_gw_allow_nat);
index f1b68ef..3b3032f 100644 (file)
@@ -569,6 +569,16 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   }
   abuf_appendf(out,
     "\n"
+    "# Determines the offset of the smart gateway server tunnel interface mark that\n"
+    "# is used in the policy routing rules in a multi-gateway setup. Only relevant\n"
+    "# when a multi-gateway setup is used.\n"
+    "# (default is %u)\n"
+    "\n", DEF_GW_MARK_OFFSET_SRVTUN);
+  abuf_appendf(out, "%sSmartGatewayMarkOffsetServerTunnel %u\n",
+      cnf->smart_gw_mark_offset_srvtun == DEF_GW_MARK_OFFSET_SRVTUN ? "# " : "",
+      cnf->smart_gw_mark_offset_srvtun);
+  abuf_appendf(out,
+    "\n"
     "# Determines the offset of the smart gateway egress interfaces mark that are\n"
     "# used in the policy routing rules in a multi-gateway setup. Only relevant\n"
     "# when a multi-gateway setup is used.\n"
index 816ac0b..bc63523 100644 (file)
@@ -635,6 +635,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
     {
+      uint8_t srvtun = cnf->smart_gw_mark_offset_srvtun;
       uint8_t egressLow = cnf->smart_gw_mark_offset_egress;
       uint8_t egressHigh = egressLow + cnf->smart_gw_egress_interfaces_count - 1;
       uint8_t tunnelsLow = cnf->smart_gw_mark_offset_tunnels;
@@ -661,6 +662,22 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
                      valueInRange(low1 , low2, high2) || valueInRange(high1, low2, high2) || \
                      valueInRange(low2,  low1, high1) || valueInRange(high2, low1, high1))
 
+      /* check that the server tunnel mark is not in the egress interface mark ranges */
+      overlap = valueInRange(srvtun, egressLow, egressHigh);
+      if (overlap) {
+        fprintf(stderr, "Error, server tunnel mark %u is in the egress interface mark range [%u, %u]\n",
+            srvtun, egressLow, egressHigh);
+        return -1;
+      }
+
+      /* check that the server tunnel mark is not in the tunnel interface mark ranges */
+      overlap = valueInRange(srvtun, tunnelsLow, tunnelsHigh);
+      if (overlap) {
+        fprintf(stderr, "Error, server tunnel mark %u is in the tunnel interface mark range [%u, %u]\n",
+            srvtun, tunnelsLow, tunnelsHigh);
+        return -1;
+      }
+
       /* check that the egress and tunnel marks ranges do not overlap */
       overlap = rangesOverlap(egressLow, egressHigh, tunnelsLow, tunnelsHigh);
       if (overlap) {
@@ -911,6 +928,7 @@ 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_mark_offset_srvtun = DEF_GW_MARK_OFFSET_SRVTUN;
   cnf->smart_gw_mark_offset_egress = DEF_GW_MARK_OFFSET_EGRESS;
   cnf->smart_gw_mark_offset_tunnels = DEF_GW_MARK_OFFSET_TUNNELS;
   cnf->smart_gw_allow_nat = DEF_GW_ALLOW_NAT;
@@ -1059,6 +1077,8 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   }
   printf("\n");
 
+  printf("SmGw. Mark SrvTun: %u\n", cnf->smart_gw_mark_offset_srvtun);
+
   printf("SmGw. Mark Egress: %u\n", cnf->smart_gw_mark_offset_egress);
 
   printf("SmGw. Mark Tunnel: %u\n", cnf->smart_gw_mark_offset_tunnels);
index 40d3054..7841ee9 100644 (file)
@@ -221,6 +221,7 @@ 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_MARK_OFFSET_SRVTUN
 %token TOK_SMART_GW_MARK_OFFSET_EGRESS
 %token TOK_SMART_GW_MARK_OFFSET_TUNNELS
 %token TOK_SMART_GW_ALLOW_NAT
@@ -314,6 +315,7 @@ stmt:       idebug
           | ismart_gw_use_count
           | ismart_gw_takedown_percentage
           | ssmart_gw_policyrouting_script
+          | ismart_gw_mark_offset_srvtun
           | ismart_gw_mark_offset_egress
           | ismart_gw_mark_offset_tunnels
           | bsmart_gw_allow_nat
@@ -1431,6 +1433,14 @@ sgw_egress_if: TOK_STRING
 }
 ;
 
+ismart_gw_mark_offset_srvtun: TOK_SMART_GW_MARK_OFFSET_SRVTUN TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("Smart gateway mark offset server tunnel interface: %d\n", $2->integer);
+  olsr_cnf->smart_gw_mark_offset_srvtun = $2->integer;
+  free($2);
+}
+;
+
 ismart_gw_mark_offset_egress: TOK_SMART_GW_MARK_OFFSET_EGRESS TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("Smart gateway mark offset egress interfaces: %d\n", $2->integer);
index 6321acd..169a67b 100644 (file)
@@ -491,6 +491,11 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_EGRESS_IFS;
 }
 
+"SmartGatewayMarkOffsetServerTunnel" {
+    yylval = NULL;
+    return TOK_SMART_GW_MARK_OFFSET_SRVTUN;
+}
+
 "SmartGatewayMarkOffsetEgress" {
     yylval = NULL;
     return TOK_SMART_GW_MARK_OFFSET_EGRESS;
index 2775455..17d168e 100644 (file)
@@ -287,12 +287,11 @@ static bool multiGwRunScript(const char * mode, bool add, const char * ifname, u
     assert(!strcmp(mode, SCRIPT_MODE_GENERIC));
   }
   if (ifmark) {
-    assert(!strcmp(mode, SCRIPT_MODE_EGRESSIF) || !strcmp(mode, SCRIPT_MODE_SGWTUN));
+    assert(!strcmp(mode, SCRIPT_MODE_SGWSRVTUN) || !strcmp(mode, SCRIPT_MODE_EGRESSIF) || !strcmp(mode, SCRIPT_MODE_SGWTUN));
     assert(ifname);
     abuf_appendf(&buf, " \"%u\"", *ifmark);
   } else {
-    assert(!strcmp(mode, SCRIPT_MODE_GENERIC) || !strcmp(mode, SCRIPT_MODE_OLSRIF) ||
-      !strcmp(mode, SCRIPT_MODE_SGWSRVTUN));
+    assert(!strcmp(mode, SCRIPT_MODE_GENERIC) || !strcmp(mode, SCRIPT_MODE_OLSRIF));
   }
 
   r = system(buf.buf);
@@ -341,7 +340,7 @@ static bool multiGwRulesOlsrInterfaces(bool add) {
  * @return true when successful
  */
 static bool multiGwRulesSgwServerTunnel(bool add) {
-  return multiGwRunScript(SCRIPT_MODE_SGWSRVTUN, add, server_tunnel_name(), NULL);
+  return multiGwRunScript(SCRIPT_MODE_SGWSRVTUN, add, server_tunnel_name(), &olsr_cnf->smart_gw_mark_offset_srvtun);
 }
 
 /**
index 25d9a88..fbe8302 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_MARK_OFFSET_SRVTUN   90
 #define DEF_GW_MARK_OFFSET_EGRESS   91
 #define DEF_GW_MARK_OFFSET_TUNNELS 101
 #define DEF_GW_PERIOD        10*1000
@@ -318,6 +319,7 @@ struct olsrd_config {
   char *smart_gw_policyrouting_script;
   struct sgw_egress_if * smart_gw_egress_interfaces;
   uint8_t smart_gw_egress_interfaces_count;
+  uint8_t smart_gw_mark_offset_srvtun;
   uint8_t smart_gw_mark_offset_egress;
   uint8_t smart_gw_mark_offset_tunnels;
   uint32_t smart_gw_period;