[Olsr-dev] [RFC] [PATCH v1 4/7] gateway: add interface to get the gateway costs
Ferry Huberts
(spam-protected)
Tue Nov 13 11:32:58 CET 2012
From: Ferry Huberts <(spam-protected)>
We need it when we are going to keep the active gateway(s) in a list
Signed-off-by: Ferry Huberts <(spam-protected)>
---
src/gateway.h | 8 ++++++++
src/gateway_default_handler.c | 28 ++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/src/gateway.h b/src/gateway.h
index 5643884..8ac6eab 100644
--- a/src/gateway.h
+++ b/src/gateway.h
@@ -103,6 +103,14 @@ struct olsr_gw_handler {
void (*startup)(void);
/**
+ * Called when the costs of a gateway must be determined.
+ *
+ * @param gw the gateway
+ * @return the costs
+ */
+ uint64_t (*getcosts)(struct gateway_entry *gw);
+
+ /**
* Called when a new gateway must be chosen.
*
* @param ipv4 true when an IPv4 gateway must be chosen
diff --git a/src/gateway_default_handler.c b/src/gateway_default_handler.c
index 1d683f4..558bf12 100644
--- a/src/gateway_default_handler.c
+++ b/src/gateway_default_handler.c
@@ -22,6 +22,7 @@ static struct timer_entry *gw_def_timer;
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 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 *);
@@ -33,6 +34,7 @@ struct olsr_gw_handler gw_def_handler = {
&gw_default_init,
&gw_default_cleanup,
&gw_default_startup_handler,
+ &gw_default_getcosts,
&gw_default_choosegw_handler,
&gw_default_update_handler,
&gw_default_delete_handler
@@ -343,6 +345,32 @@ 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 has inifinite costs
+ */
+static uint64_t gw_default_getcosts(struct gateway_entry *gw) {
+ struct tc_entry* tc;
+
+ if (!gw) {
+ return UINT64_MAX;
+ }
+
+ tc = olsr_lookup_tc_entry(&gw->originator);
+
+ if (!tc || (tc->path_cost == ROUTE_COST_BROKEN) || (!gw->uplink || !gw->downlink)) {
+ /* 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;
+ }
+
+ /* determine the path cost */
+ return gw_default_weigh_costs(tc->path_cost, gw->uplink, gw->downlink);
+}
+
+/**
* Choose a new gateway
*
* @param ipv4 lookup new v4 gateway
--
1.7.11.7
More information about the Olsr-dev
mailing list