sgw: invoke the cleanup mode of the policy script on start and stop
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 5 Nov 2015 21:01:26 +0000 (22:01 +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>
src/gateway.c

index 162a7bc..8f20ea4 100644 (file)
@@ -34,6 +34,7 @@
  * Defines for the multi-gateway script
  */
 
+#define SCRIPT_MODE_CLEANUP   "cleanup"
 #define SCRIPT_MODE_GENERIC   "generic"
 #define SCRIPT_MODE_OLSRIF    "olsrif"
 #define SCRIPT_MODE_SGWSRVTUN "sgwsrvtun"
@@ -296,13 +297,17 @@ static bool multiGwRunScript(const char * mode, bool addMode, const char * ifNam
   struct autobuf buf;
   int r;
 
-  assert(!strcmp(mode, SCRIPT_MODE_GENERIC) //
+  assert(!strcmp(mode, SCRIPT_MODE_CLEANUP) //
+      || !strcmp(mode, SCRIPT_MODE_GENERIC) //
       || !strcmp(mode, SCRIPT_MODE_OLSRIF)//
       || !strcmp(mode, SCRIPT_MODE_SGWSRVTUN)//
       || !strcmp(mode, SCRIPT_MODE_EGRESSIF)//
       || !strcmp(mode, SCRIPT_MODE_SGWTUN)//
       );
 
+  assert(strcmp(mode, SCRIPT_MODE_CLEANUP) //
+      || (!strcmp(mode, SCRIPT_MODE_CLEANUP) && !ifName && !tableNr && !ruleNr && !bypassRuleNr));
+
   assert(strcmp(mode, SCRIPT_MODE_GENERIC) //
       || (!strcmp(mode, SCRIPT_MODE_GENERIC) && !ifName && !tableNr && !ruleNr && !bypassRuleNr));
 
@@ -353,6 +358,16 @@ static bool multiGwRunScript(const char * mode, bool addMode, const char * ifNam
   return (r == 0);
 }
 
+/**
+ * Cleanup multi-gateway iptables and ip rules
+ *
+ * @param add true to add policy routing, false to remove it
+ * @return true when successful
+ */
+static bool multiGwRulesCleanup(bool add) {
+  return multiGwRunScript(SCRIPT_MODE_CLEANUP, add, NULL, 0, 0, 0);
+}
+
 /**
  * Setup generic multi-gateway iptables and ip rules
  *
@@ -814,6 +829,7 @@ int olsr_startup_gateways(void) {
     return 0;
   }
 
+  ok = ok && multiGwRulesCleanup(true);
   ok = ok && multiGwRulesGeneric(true);
   ok = ok && multiGwRulesSgwServerTunnel(true);
   ok = ok && multiGwRulesOlsrInterfaces(true);
@@ -900,6 +916,7 @@ void olsr_shutdown_gateways(void) {
   (void)multiGwRulesOlsrInterfaces(false);
   (void)multiGwRulesSgwServerTunnel(false);
   (void)multiGwRulesGeneric(false);
+  (void)multiGwRulesCleanup(false);
 }
 
 /**