gw: change the costs type to signed 64bits
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 13 Jun 2014 09:34:32 +0000 (11:34 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 13 Jun 2014 10:05:39 +0000 (12:05 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/httpinfo/src/olsrd_httpinfo.c
lib/txtinfo/src/olsrd_txtinfo.c
src/gateway.c
src/gateway.h
src/gateway_costs.c
src/gateway_costs.h
src/gateway_default_handler.c

index 0dff3b7..80031af 100644 (file)
@@ -1612,7 +1612,7 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6) {
         if (!gw->gw) {
           abuf_puts(abuf, "      <td></td>\n");
         } else {
-          abuf_appendf(abuf, "      <td>%llu</td>\n", (long long unsigned int)gw->gw->path_cost);
+          abuf_appendf(abuf, "      <td>%lld</td>\n", (long long int)gw->gw->path_cost);
         }
         abuf_puts(abuf, "    </tr>\n");
       }
index 51a396f..66937fa 100644 (file)
@@ -546,7 +546,7 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6, const char * fmth, const c
     char sipv6[2] = { 0, 0 };
     char if_name[IF_NAMESIZE];
     char destination[INET6_ADDRSTRLEN];
-    long long unsigned int cost = 0;
+    long long int cost = 0;
 
     memset(originator, 0, sizeof(originator));
     memset(prefix, 0, sizeof(prefix));
@@ -578,7 +578,7 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6, const char * fmth, const c
           inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, destination, sizeof(destination));
         }
         if (gw->gw) {
-          cost = (long long unsigned int)gw->gw->path_cost;
+          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);
       }
@@ -595,9 +595,9 @@ ipc_print_sgw(struct autobuf *abuf)
 #else
 
   static const char * fmth4 = "%s%-16s %-33s %-8s %-8s %-8s %-4s %-8s %-4s %-16s %-16s %s\n";
-  static const char * fmtv4 = "%s%-16s %-33s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-16s %llu\n";
+  static const char * fmtv4 = "%s%-16s %-33s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-16s %lld\n";
   static const char * fmth6 = "%s%-46s %-93s %-8s %-8s %-8s %-4s %-8s %-4s %-16s %-46s %s\n";
-  static const char * fmtv6 = "%s%-46s %-93s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-46s %llu\n";
+  static const char * fmtv6 = "%s%-46s %-93s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-46s %lld\n";
 
   sgw_ipvx(abuf, false, fmth4, fmtv4);
   abuf_puts(abuf, "\n");
index c8f0ff5..76501ca 100644 (file)
@@ -500,7 +500,7 @@ static void removeGatewayFromList(struct gw_list * gw_list, bool ipv4, struct gw
  * @param current_gw the current gateway
  */
 static void takeDownExpensiveGateways(struct gw_list * gw_list, bool ipv4, struct gw_container_entry * current_gw) {
-  uint64_t current_gw_cost_boundary;
+  int64_t current_gw_cost_boundary;
 
   /*
    * exit immediately when takedown is disabled, there is no current gateway, or
@@ -513,7 +513,7 @@ static void takeDownExpensiveGateways(struct gw_list * gw_list, bool ipv4, struc
   /* get the cost boundary */
   current_gw_cost_boundary = current_gw->gw->path_cost;
   if (olsr_cnf->smart_gw_takedown_percentage < 100) {
-    if (current_gw_cost_boundary <= (UINT64_MAX / 100)) {
+    if (current_gw_cost_boundary <= (INT64_MAX / 100)) {
       current_gw_cost_boundary =  ((current_gw_cost_boundary * 100) / olsr_cnf->smart_gw_takedown_percentage);
     } else {
       /* perform scaling because otherwise the percentage calculation can overflow */
@@ -899,7 +899,7 @@ bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *ma
 void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno) {
   struct gw_container_entry * new_gw_in_list;
   uint8_t *ptr;
-  uint64_t prev_path_cost = 0;
+  int64_t prev_path_cost = 0;
   struct gateway_entry *gw = node2gateway(avl_find(&gateway_tree, originator));
 
   if (!gw) {
index 7dd53c7..5ca479e 100644 (file)
@@ -54,7 +54,7 @@ struct gateway_entry {
     struct olsr_ip_prefix external_prefix;
     uint32_t uplink;
     uint32_t downlink;
-    uint64_t path_cost; /**< the gateway path costs */
+    int64_t path_cost; /**< the gateway path costs */
     bool ipv4;
     bool ipv4nat;
     bool ipv6;
@@ -116,7 +116,7 @@ struct olsr_gw_handler {
      * @param gw the gateway
      * @return the costs
      */
-    uint64_t (*getcosts)(struct gateway_entry *gw);
+    int64_t (*getcosts)(struct gateway_entry *gw);
 
     /**
      * Called when a new gateway must be chosen.
index 2b75961..5aa549b 100644 (file)
@@ -4,22 +4,22 @@
 extern "C" {
 #endif /* __cplusplus */
 
-#define SCALING_SHIFT_CLASSIC 32
-#define SCALING_SHIFT 24
+#define SCALING_SHIFT_CLASSIC 31
+#define SCALING_SHIFT 23
 
-uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
-  uint64_t costU;
-  uint64_t costD;
-  uint64_t costE;
+int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
+  int64_t costU;
+  int64_t costD;
+  int64_t costE;
 
   if (!weights.Detx) {
     /* only consider path costs (classic behaviour) (but scale to 64 bit) */
-    return (uint64_t) path_cost << SCALING_SHIFT_CLASSIC;
+    return ((int64_t) path_cost) << SCALING_SHIFT_CLASSIC;
   }
 
   if (!exitUk || !exitDk) {
     /* zero bandwidth */
-    return UINT64_MAX;
+    return INT64_MAX;
   }
 
   if ((exitUk == UINT32_MAX) && (exitDk == UINT32_MAX)) {
@@ -27,9 +27,9 @@ uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost,
     return path_cost;
   }
 
-  costU = (((uint64_t) (1000 * weights.WexitU))    << SCALING_SHIFT) / exitUk;
-  costD = (((uint64_t) (1000 * weights.WexitD))    << SCALING_SHIFT) / exitDk;
-  costE = (((uint64_t) (weights.Wetx * path_cost)) << SCALING_SHIFT) / weights.Detx;
+  costU = (((int64_t) (1000 * weights.WexitU))    << SCALING_SHIFT) / exitUk;
+  costD = (((int64_t) (1000 * weights.WexitD))    << SCALING_SHIFT) / exitDk;
+  costE = (((int64_t) (weights.Wetx * path_cost)) << SCALING_SHIFT) / weights.Detx;
 
   return (costU + costD + costE);
 }
index 454e1e1..f83dab9 100644 (file)
  * path_cost_weight(max) = 0x3E418    + 0x3E418    + 0xFEFFFFFF01
  * path_cost_weight(max) = 0xFF0007C731
  *
- * Because we can multiply 0xFF0007C731 by 2^24 without overflowing a
- * 64 bits number, we do this to increase accuracy.
+ * Because we can multiply 0xFF0007C731 by 2^24 without overflowing an
+ * unsigned 64 bits number, we could do this to increase accuracy.
+ *
+ * However, since we also want to implement this in Java, which doesn't support
+ * unsigned types, we multiply 0xFF0007C731 by 2^23 without overflowing a
+ * signed 64 bits number.
  */
 
 #include "stdint.h"
@@ -77,9 +81,9 @@ extern "C" {
    * @param path_cost the (ETX) path cost to the gateway
    * @param exitUk the gateway exit link uplink bandwidth (in kbps)
    * @param exitDk the gateway exit link downlink bandwidth (in kbps)
-   * @return the weighed path cost, UINT64_MAX when exitUk and/or exitDk are zero
+   * @return the weighed path cost, INT64_MAX when exitUk and/or exitDk are zero
    */
-  uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
+  int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
 
 #ifdef __cplusplus
 }
index dfc214f..5a39fcf 100644 (file)
@@ -24,7 +24,7 @@ static struct costs_weights gw_costs_weights;
 static void gw_default_init(void);
 static void gw_default_cleanup(void);
 static void gw_default_startup_handler(void);
-static uint64_t gw_default_getcosts(struct gateway_entry *gw);
+static int64_t gw_default_getcosts(struct gateway_entry *gw);
 static void gw_default_choosegw_handler(bool ipv4, bool ipv6);
 static void gw_default_update_handler(struct gateway_entry *);
 static void gw_default_delete_handler(struct gateway_entry *);
@@ -52,12 +52,12 @@ struct olsr_gw_handler gw_def_handler = {
  * @param path_cost the path cost
  * @return the threshold path cost
  */
-static inline uint64_t gw_default_calc_threshold(uint64_t path_cost) {
+static inline int64_t gw_default_calc_threshold(int64_t path_cost) {
   if (olsr_cnf->smart_gw_thresh == 0) {
     return path_cost;
   }
 
-  return ((path_cost * (uint64_t) olsr_cnf->smart_gw_thresh) + (uint64_t) 50) / (uint64_t) 100;
+  return ((path_cost * olsr_cnf->smart_gw_thresh) + 50) / 100;
 }
 
 /**
@@ -65,8 +65,8 @@ static inline uint64_t gw_default_calc_threshold(uint64_t path_cost) {
  * depending on the costs
  */
 static void gw_default_choose_gateway(void) {
-  uint64_t cost_ipv4_threshold = UINT64_MAX;
-  uint64_t cost_ipv6_threshold = UINT64_MAX;
+  int64_t cost_ipv4_threshold = INT64_MAX;
+  int64_t cost_ipv6_threshold = INT64_MAX;
   bool cost_ipv4_threshold_valid = false;
   bool cost_ipv6_threshold_valid = false;
   struct gateway_entry *chosen_gw_ipv4 = NULL;
@@ -91,9 +91,9 @@ static void gw_default_choose_gateway(void) {
   }
 
   OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) {
-    uint64_t gw_cost = gw->path_cost;
+    int64_t gw_cost = gw->path_cost;
 
-    if (gw_cost == UINT64_MAX) {
+    if (gw_cost == INT64_MAX) {
       /* never select a node with infinite costs */
       continue;
     }
@@ -102,7 +102,7 @@ static void gw_default_choose_gateway(void) {
       bool gw_eligible_v4 = gw->ipv4
           /* && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) *//* contained in gw_def_choose_new_ipv4_gw */
           && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat);
-      if (gw_eligible_v4 && gw_cost < (chosen_gw_ipv4 ? chosen_gw_ipv4->path_cost : UINT64_MAX)
+      if (gw_eligible_v4 && gw_cost < (chosen_gw_ipv4 ? chosen_gw_ipv4->path_cost : INT64_MAX)
           && (!cost_ipv4_threshold_valid || (gw_cost < cost_ipv4_threshold))) {
         chosen_gw_ipv4 = gw;
       }
@@ -111,7 +111,7 @@ static void gw_default_choose_gateway(void) {
     if (gw_def_choose_new_ipv6_gw) {
       bool gw_eligible_v6 = gw->ipv6
           /* && olsr_cnf->ip_version == AF_INET6 *//* contained in gw_def_choose_new_ipv6_gw */;
-      if (gw_eligible_v6 && gw_cost < (chosen_gw_ipv6 ? chosen_gw_ipv6->path_cost : UINT64_MAX)
+      if (gw_eligible_v6 && gw_cost < (chosen_gw_ipv6 ? chosen_gw_ipv6->path_cost : INT64_MAX)
           && (!cost_ipv6_threshold_valid || (gw_cost < cost_ipv6_threshold))) {
         chosen_gw_ipv6 = gw;
       }
@@ -248,13 +248,13 @@ static void gw_default_startup_handler(void) {
  * Called when the costs of a gateway must be determined.
  *
  * @param gw the gateway
- * @return the costs, or UINT64_MAX in case the gateway is null or has inifinite costs
+ * @return the costs, or INT64_MAX in case the gateway is null or has infinite costs
  */
-static uint64_t gw_default_getcosts(struct gateway_entry *gw) {
+static int64_t gw_default_getcosts(struct gateway_entry *gw) {
   struct tc_entry* tc;
 
   if (!gw) {
-    return UINT64_MAX;
+    return INT64_MAX;
   }
 
   tc = olsr_lookup_tc_entry(&gw->originator);
@@ -263,7 +263,7 @@ static uint64_t gw_default_getcosts(struct gateway_entry *gw) {
     /* gateways should not exist without tc entry */
     /* do not consider nodes with an infinite ETX */
     /* do not consider nodes without bandwidth or with a uni-directional link */
-    return UINT64_MAX;
+    return INT64_MAX;
   }
 
   /* determine the path cost */