txtinfo: fix output of /sgw command
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 3 Dec 2014 16:57:31 +0000 (17:57 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 3 Dec 2014 17:55:07 +0000 (18:55 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/txtinfo/src/olsrd_txtinfo.c
src/gateway.c
src/gateway.h

index 6dfff81..e0f9899 100644 (file)
@@ -522,6 +522,14 @@ ipc_print_hna(struct autobuf *abuf)
 
 
 #ifdef __linux__
+
+/** interface names for smart gateway tunnel interfaces, IPv4 */
+extern struct interfaceName * sgwTunnel4InterfaceNames;
+
+/** interface names for smart gateway tunnel interfaces, IPv6 */
+extern struct interfaceName * sgwTunnel6InterfaceNames;
+
+
 /**
  * Construct the sgw table for a given ip version
  *
@@ -530,61 +538,66 @@ ipc_print_hna(struct autobuf *abuf)
  * @param fmtv the format for printing
  */
 static void sgw_ipvx(struct autobuf *abuf, bool ipv6, const char * fmth, const char * fmtv) {
-  struct gateway_entry * current_gw;
-  struct gw_list * list;
-  struct gw_container_entry * gw;
-
-  list = ipv6 ? &gw_list_ipv6 : &gw_list_ipv4;
-  if (list->count) {
-    char current[2] = { 0, 0 };
-    char originator[INET6_ADDRSTRLEN];
-    char prefix[(INET6_ADDRSTRLEN * 2) + 1];
-    uint32_t uplink = 0;
-    uint32_t downlink = 0;
-    olsr_linkcost pc = 0;
-    char sipv4[2] = { 0, 0 };
-    char sipv4nat[2] = { 0, 0 };
-    char sipv6[2] = { 0, 0 };
-    char if_name[IF_NAMESIZE];
-    char destination[INET6_ADDRSTRLEN];
-    long long int cost = 0;
-
-    memset(originator, 0, sizeof(originator));
-    memset(prefix, 0, sizeof(prefix));
-    memset(if_name, 0, sizeof(if_name));
-    memset(destination, 0, sizeof(destination));
-
-    abuf_appendf(abuf, "# Table: Smart Gateway IPv%s\n", ipv6 ? "6" : "4");
-    abuf_appendf(abuf, fmth, "#", "Originator", "Prefix", "Uplink", "Downlink", "PathCost", "IPv4", "IPv4-NAT", "IPv6", "Tunnel-Name", "Destination", "Cost");
-
-    current_gw = olsr_get_inet_gateway(false);
-    OLSR_FOR_ALL_GWS(&list->head, gw) {
-      if (gw) {
-        current[0] = (current_gw && (gw->gw == current_gw)) ? '*' : ' ';
-
-        if (gw->gw) {
-          struct tc_entry* tc = olsr_lookup_tc_entry(&gw->gw->originator);
-
-          inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->gw->originator, originator, sizeof(originator));
-          strncpy(prefix, olsr_ip_prefix_to_string(&gw->gw->external_prefix), sizeof(prefix));
-          prefix[sizeof(prefix) - 1] = '\0';
-          uplink = gw->gw->uplink;
-          downlink = gw->gw->downlink;
-          pc = tc ?tc->path_cost : ROUTE_COST_BROKEN;
-          sipv4[0] = gw->gw->ipv4 ? 'Y' : 'N';
-          sipv4nat[0] = gw->gw->ipv4nat ? 'Y' : 'N';
-          sipv6[0] = gw->gw->ipv6 ? 'Y' : 'N';
-        }
-        if (gw->tunnel) {
-          strncpy(if_name, gw->tunnel->if_name, sizeof(if_name));
-          inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, destination, sizeof(destination));
-        }
-        if (gw->gw) {
-          cost = (long long int)gw->gw->path_cost;
-        }
-        abuf_appendf(abuf, fmtv, current, originator, prefix, uplink, downlink, pc, sipv4, sipv4nat, sipv6, if_name, destination, cost);
-      }
-    } OLSR_FOR_ALL_GWS_END(gw);
+  struct gateway_entry * current_gw = olsr_get_inet_gateway(ipv6);
+  struct interfaceName * sgwTunnelInterfaceNames = !ipv6 ? sgwTunnel4InterfaceNames : sgwTunnel6InterfaceNames;
+  int i = 0;
+
+  abuf_appendf(abuf, "# Table: Smart Gateway IPv%s\n", ipv6 ? "6" : "4");
+  abuf_appendf(abuf, fmth, "#", "Originator", "Prefix", "Uplink", "Downlink", "PathCost", "IPv4", "IPv4-NAT", "IPv6", "Tunnel-Name", "Destination", "Cost");
+
+  for (i = 0; i < olsr_cnf->smart_gw_use_count; i++) {
+    bool selected;
+    struct ipaddr_str originatorStr;
+    const char * originator;
+    struct ipaddr_str prefixIpStr;
+    const char * prefixIPStr;
+    union olsr_ip_addr netmask = { { 0 } };
+    struct ipaddr_str prefixMaskStr;
+    const char * prefixMASKStr;
+    struct interfaceName * node = &sgwTunnelInterfaceNames[i];
+    struct ipaddr_str tunnelGwStr;
+    const char * tunnelGw;
+
+    struct gateway_entry * gw = node->gw;
+    struct tc_entry* tc;
+
+    if (!gw) {
+      continue;
+    }
+
+    tc = olsr_lookup_tc_entry(&gw->originator);
+    if (!tc) {
+      continue;
+    }
+
+    selected = current_gw && (current_gw == gw);
+    originator = olsr_ip_to_string(&originatorStr, &gw->originator);
+    prefixIPStr = olsr_ip_to_string(&prefixIpStr, &gw->external_prefix.prefix);
+
+    prefix_to_netmask((uint8_t *) &netmask, !ipv6 ? sizeof(netmask.v4) : sizeof(netmask.v6), gw->external_prefix.prefix_len);
+    prefixMASKStr = olsr_ip_to_string(&prefixMaskStr, &netmask);
+
+    tunnelGw = olsr_ip_to_string(&tunnelGwStr, &gw->originator);
+
+    {
+      char prefix[strlen(prefixIPStr) + 1 + strlen(prefixMASKStr) + 1];
+      snprintf(prefix, sizeof(prefix), "%s/%s", prefixIPStr, prefixMASKStr);
+
+      abuf_appendf(abuf, fmtv, //
+          selected ? "*" : " ", // selected
+          originator, // Originator
+          prefix, // Prefix IP / Prefix Mask
+          gw->uplink, // Uplink
+          gw->downlink, // Downlink
+          tc->path_cost, // PathCost
+          gw->ipv4 ? "Y" : "N", // IPv4
+          gw->ipv4nat ? "Y" : "N", // IPv4-NAT
+          gw->ipv6 ? "Y" : "N", // IPv6
+          node->name, // Tunnel-Name
+          tunnelGw, // Destination
+          gw->path_cost // Cost
+          );
+    }
   }
 }
 #endif /* __linux__ */
@@ -596,15 +609,19 @@ ipc_print_sgw(struct autobuf *abuf)
   abuf_puts(abuf, "Gateway mode is only supported in linux\n");
 #else
 
-  static const char * fmth4 = "%s%-16s %-33s %-8s %-8s %-10s %-4s %-8s %-4s %-16s %-16s %s\n";
-  static const char * fmtv4 = "%s%-16s %-33s %-8u %-8u %-10u %-4s %-8s %-4s %-16s %-16s %lld\n";
-  static const char * fmth6 = "%s%-46s %-93s %-8s %-8s %-10s %-4s %-8s %-4s %-16s %-46s %s\n";
-  static const char * fmtv6 = "%s%-46s %-93s %-8u %-8u %-10u %-4s %-8s %-4s %-16s %-46s %lld\n";
+  static const char * fmth4 = "%s%-15s %-31s %-9s %-9s %-10s %-4s %-8s %-4s %-15s %-15s %s\n";
+  static const char * fmtv4 = "%s%-15s %-31s %-9u %-9u %-10u %-4s %-8s %-4s %-15s %-15s %lld\n";
+#if 0
+  static const char * fmth6 = "%s%-45s %-91s %-9s %-9s %-10s %-4s %-8s %-4s %-15s %-45s %s\n";
+  static const char * fmtv6 = "%s%-45s %-91s %-9u %-9u %-10u %-4s %-8s %-4s %-15s %-45s %lld\n";
+#endif
 
   sgw_ipvx(abuf, false, fmth4, fmtv4);
   abuf_puts(abuf, "\n");
+#if 0
   sgw_ipvx(abuf, true, fmth6, fmtv6);
   abuf_puts(abuf, "\n");
+#endif
 #endif /* __linux__ */
 }
 
index 1d957a6..09515c9 100644 (file)
@@ -26,7 +26,6 @@
 #include "egressFile.h"
 
 #include <assert.h>
-#include <net/if.h>
 #include <linux/rtnetlink.h>
 
 /*
@@ -45,15 +44,6 @@ static struct olsr_ip_prefix ipv4_slash_0_route;
 /* ipv4 prefixes 0.0.0.0/1 and 128.0.0.0/1 */
 static struct olsr_ip_prefix ipv4_slash_1_routes[2];
 
-/** structure that holds an interface name, mark and a pointer to the gateway that uses it */
-struct interfaceName {
-  char name[IFNAMSIZ]; /**< interface name */
-  uint8_t tableNr; /**< routing table number */
-  uint8_t ruleNr; /**< IP rule number */
-  uint8_t bypassRuleNr; /**< bypass IP rule number */
-  struct gateway_entry *gw; /**< gateway that uses this interface name */
-};
-
 /** the gateway tree */
 struct avl_tree gateway_tree;
 
index c761c4f..114d73c 100644 (file)
@@ -14,6 +14,7 @@
 #include "olsr.h"
 #include "scheduler.h"
 #include "gateway_list.h"
+#include <net/if.h>
 
 /** used to signal to olsr_delete_gateway_entry to force deletion */
 #define FORCE_DELETE_GW_ENTRY 255
@@ -76,6 +77,17 @@ enum sgw_multi_change_phase {
   GW_MULTI_CHANGE_PHASE_SHUTDOWN = 2
 };
 
+#ifdef __linux__
+/** structure that holds an interface name, mark and a pointer to the gateway that uses it */
+struct interfaceName {
+  char name[IFNAMSIZ]; /**< interface name */
+  uint8_t tableNr; /**< routing table number */
+  uint8_t ruleNr; /**< IP rule number */
+  uint8_t bypassRuleNr; /**< bypass IP rule number */
+  struct gateway_entry *gw; /**< gateway that uses this interface name */
+};
+#endif /* __linux__ */
+
 /**
  * static inline struct gateway_entry * node2gateway (struct avl_node *ptr)
  *