sgw: show all sgw tunnels in the output file instead of only the active one
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 12 Nov 2014 14:55:15 +0000 (15:55 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 12 Nov 2014 14:58:53 +0000 (15:58 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c

index 2f0aa01..8cbbe66 100644 (file)
@@ -1998,36 +1998,40 @@ static void writeProgramStatusFile(enum sgw_multi_change_phase phase) {
 
   /* olsr */
   {
-    struct gw_container_entry * gwContainer = (olsr_cnf->ip_version == AF_INET) ? current_ipv4_gw : current_ipv6_gw;
-    struct gateway_entry * gw = !gwContainer ? NULL : gwContainer->gw;
-    struct olsr_iptunnel_entry * tunnel = !gwContainer ? NULL : gwContainer->tunnel;
-    struct tc_entry* tc = !gw ? NULL : olsr_lookup_tc_entry(&gw->originator);
-
-    struct ipaddr_str originatorStr;
-    const char * originator = !gw ? IPNONE : olsr_ip_to_string(&originatorStr, &gw->originator);
-    struct ipaddr_str prefixIpStr;
-    const char * prefixIPStr = !gw ? IPNONE : olsr_ip_to_string(&prefixIpStr, &gw->external_prefix.prefix);
-    uint8_t prefix_len = !gw ? 0 : gw->external_prefix.prefix_len;
-    struct interfaceName * tunnelName = !gw ? NULL : find_interfaceName(gw);
-    struct ipaddr_str tunnelGwStr;
-    const char * tunnelGw = !tunnel ? IPNONE : olsr_ip_to_string(&tunnelGwStr, &tunnel->target);
-    bool selected = bestOverallLink.valid && bestOverallLink.isOlsr;
-
-    char prefix[strlen(prefixIPStr) + 1 + 3 + 1];
-    snprintf(prefix, sizeof(prefix), "%s/%d", prefixIPStr, prefix_len);
-
-    fprintf(fp, fmt_values, //
-        selected ? "*" : " ", // selected
-        originator, // Originator
-        !gw ? MASKNONE : prefix, // Prefix IP
-        !gw ? 0 : gw->uplink, // Uplink
-        !gw ? 0 : gw->downlink, // Downlink
-        (!gw || !tc) ? ROUTE_COST_BROKEN : tc->path_cost, // PathCost
-        "olsr", // Type
-        !tunnelName ? "none" : tunnelName->name, // Interface
-        tunnelGw, // Gateway
-        !gw ? INT64_MAX : gw->path_cost // Cost
+    struct gateway_entry * current_gw = olsr_get_inet_gateway((olsr_cnf->ip_version == AF_INET) ? false : true);
+    struct interfaceName * sgwTunnelInterfaceNames = (olsr_cnf->ip_version == AF_INET) ? sgwTunnel4InterfaceNames : sgwTunnel6InterfaceNames;
+
+    int i = 0;
+    for (i = 0; i < olsr_cnf->smart_gw_use_count; i++) {
+      struct interfaceName * node = &sgwTunnelInterfaceNames[i];
+      struct gateway_entry * gw = node->gw;
+      struct tc_entry* tc = !gw ? NULL : olsr_lookup_tc_entry(&gw->originator);
+
+      struct ipaddr_str originatorStr;
+      const char * originator = !gw ? IPNONE : olsr_ip_to_string(&originatorStr, &gw->originator);
+      struct ipaddr_str prefixIpStr;
+      const char * prefixIPStr = !gw ? IPNONE : olsr_ip_to_string(&prefixIpStr, &gw->external_prefix.prefix);
+      uint8_t prefix_len = !gw ? 0 : gw->external_prefix.prefix_len;
+      struct ipaddr_str tunnelGwStr;
+      const char * tunnelGw = !gw ? IPNONE : olsr_ip_to_string(&tunnelGwStr, &gw->originator);
+      bool selected = bestOverallLink.valid && bestOverallLink.isOlsr && current_gw && (current_gw == gw);
+
+      char prefix[strlen(prefixIPStr) + 1 + 3 + 1];
+      snprintf(prefix, sizeof(prefix), "%s/%d", prefixIPStr, prefix_len);
+
+      fprintf(fp, fmt_values, //
+          selected ? "*" : " ", // selected
+          originator, // Originator
+          !gw ? MASKNONE : prefix, // Prefix IP
+          !gw ? 0 : gw->uplink, // Uplink
+          !gw ? 0 : gw->downlink, // Downlink
+          (!gw || !tc) ? ROUTE_COST_BROKEN : tc->path_cost, // PathCost
+          "olsr", // Type
+          node->name, // Interface
+          tunnelGw, // Gateway
+          !gw ? INT64_MAX : gw->path_cost // Cost
       );
+    }
   }
 
   fclose(fp);