sgw: add get_gwcost_scaled and get_gwcost_text functions
authorFerry Huberts <ferry.huberts@pelagic.nl>
Sun, 10 Apr 2016 19:53:22 +0000 (21:53 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 11 Apr 2016 20:55:55 +0000 (22:55 +0200)
For later use

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway_costs.c
src/gateway_costs.h

index 82dcb62..249fe91 100644 (file)
@@ -5,6 +5,8 @@
 extern "C" {
 #endif /* __cplusplus */
 
+#include <stdio.h>
+
 #define SCALING_SHIFT_CLASSIC 31
 #define SCALING_SHIFT 23
 #define MAX_SMARTGW_SPEED 320000000
@@ -43,6 +45,29 @@ int64_t gw_costs_weigh(bool up, uint32_t path_cost, uint32_t exitUk, uint32_t ex
   return (costU + costD + costE);
 }
 
+double get_gwcost_scaled(int64_t cost) {
+  if (cost != INT64_MAX) {
+    unsigned int shift = !olsr_cnf->smart_gw_divider_etx ? SCALING_SHIFT_CLASSIC : SCALING_SHIFT;
+
+    double integerNumber = (double) (cost >> shift);
+    double fractionNumber = (double) (cost & ((1 << shift) - 1)) / (1 << shift);
+
+    return integerNumber + fractionNumber;
+  }
+
+  return (double)cost;
+}
+
+const char * get_gwcost_text(int64_t cost, struct gwtextbuffer *buffer) {
+  if (cost == INT64_MAX) {
+    return "INFINITE";
+  }
+
+  snprintf(buffer->buf, sizeof(buffer->buf), "%.3f", get_gwcost_scaled(cost));
+  buffer->buf[sizeof(buffer->buf) - 1] = '\0';
+  return buffer->buf;
+}
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index d68c4e9..df04a5d 100644 (file)
@@ -62,6 +62,9 @@
 extern "C" {
 #endif /* __cplusplus */
 
+  struct gwtextbuffer {
+    char buf[16];
+  };
 
   /**
    * Weigh the path costs and the gateway bandwidth.
@@ -81,6 +84,10 @@ extern "C" {
    */
   int64_t gw_costs_weigh(bool up, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
 
+  double get_gwcost_scaled(int64_t cost);
+
+  const char * get_gwcost_text(int64_t cost, struct gwtextbuffer *buffer);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */