sgw: cost calculation can now directly account for interface up/down status
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 9 Oct 2014 09:36:57 +0000 (11:36 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 15 Oct 2014 15:39:51 +0000 (17:39 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway_costs.c
src/gateway_costs.h
src/gateway_default_handler.c

index 5aa549b..7a4ebf9 100644 (file)
@@ -7,11 +7,16 @@ extern "C" {
 #define SCALING_SHIFT_CLASSIC 31
 #define SCALING_SHIFT 23
 
-int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
+int64_t gw_costs_weigh(bool up, 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 (!up) {
+    /* interface is down */
+    return INT64_MAX;
+  }
+
   if (!weights.Detx) {
     /* only consider path costs (classic behaviour) (but scale to 64 bit) */
     return ((int64_t) path_cost) << SCALING_SHIFT_CLASSIC;
index f83dab9..72f49a6 100644 (file)
@@ -56,6 +56,7 @@
  */
 
 #include "stdint.h"
+#include "stdbool.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -77,13 +78,14 @@ extern "C" {
    * If the ETX divider is zero, then no weighing is performed and only the path
    * costs are considered (classic behaviour), but scaled to a 64 bit number.
    *
+   * @param up true when the relevant interface is up
    * @param weights the weights for the calculation
    * @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, INT64_MAX when exitUk and/or exitDk are zero
+   * @return the weighed path cost, INT64_MAX when up is false or when exitUk and/or exitDk are zero
    */
-  int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
+  int64_t gw_costs_weigh(bool up, const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
 
 #ifdef __cplusplus
 }
index 5a39fcf..958495c 100644 (file)
@@ -267,7 +267,7 @@ static int64_t gw_default_getcosts(struct gateway_entry *gw) {
   }
 
   /* determine the path cost */
-  return gw_costs_weigh(gw_costs_weights, tc->path_cost, gw->uplink, gw->downlink);
+  return gw_costs_weigh(true, gw_costs_weights, tc->path_cost, gw->uplink, gw->downlink);
 }
 
 /**