gw: when a node advertises maximum bandwidth then only consider path costs
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 5 Mar 2014 13:09:21 +0000 (14:09 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 5 Mar 2014 13:11:52 +0000 (14:11 +0100)
So that we can setup nodes in a way that they will attract all gw tunnels
in the mesh. This is - for example - very useful for situations where
vehicles drive into their base, which has a node with a 'free' Internet
link.

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

index c6ba787..80c0adf 100644 (file)
@@ -135,6 +135,11 @@ static uint32_t deserialize_gw_speed(uint8_t value) {
     return 0;
   }
 
+  if (value == UINT8_MAX) {
+    /* maximum value: also return maximum value */
+    return UINT32_MAX;
+  }
+
   speed = (value >> 3) + 1;
   exp = value & 7;
 
@@ -159,7 +164,7 @@ static uint8_t serialize_gw_speed(uint32_t speed) {
   }
 
   if (speed > 320000000) {
-    return 0xff;
+    return UINT8_MAX;
   }
 
   while ((speed > 32 || (speed % 10) == 0) && exp < 7) {
index 9ae20d5..2b75961 100644 (file)
@@ -22,6 +22,11 @@ uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost,
     return UINT64_MAX;
   }
 
+  if ((exitUk == UINT32_MAX) && (exitDk == UINT32_MAX)) {
+    /* maximum bandwidth: only consider path costs */
+    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;