Hi,
I would like to propose following patches, but hadn't much time to check if they hide the real problem.
Kind regards, Sven
One of the first actions of gw_election is to check whether curr_gw is not NULL. In that case it will jumps to out. The rest of the code (before out) can now assume that gw_node is NULL. Therefore the router is only changed when curr_gw_tmp. This makes some printks in this block unnecessary which handle the case that curr_gw_tmp is NULL.
Signed-off-by: Sven Eckelmann sven@narfation.org --- gateway_client.c | 24 +++++------------------- 1 files changed, 5 insertions(+), 19 deletions(-)
diff --git a/gateway_client.c b/gateway_client.c index 65f3953..939fbfd 100644 --- a/gateway_client.c +++ b/gateway_client.c @@ -185,29 +185,15 @@ void gw_election(struct bat_priv *bat_priv) neigh_node_free_ref(router); }
- if (curr_gw != curr_gw_tmp) { + if (curr_gw_tmp) { router = orig_node_get_router(curr_gw_tmp->orig_node); if (!router) goto unlock;
- if ((curr_gw) && (!curr_gw_tmp)) - bat_dbg(DBG_BATMAN, bat_priv, - "Removing selected gateway - " - "no gateway in range\n"); - else if ((!curr_gw) && (curr_gw_tmp)) - bat_dbg(DBG_BATMAN, bat_priv, - "Adding route to gateway %pM " - "(gw_flags: %i, tq: %i)\n", - curr_gw_tmp->orig_node->orig, - curr_gw_tmp->orig_node->gw_flags, - router->tq_avg); - else - bat_dbg(DBG_BATMAN, bat_priv, - "Changing route to gateway %pM " - "(gw_flags: %i, tq: %i)\n", - curr_gw_tmp->orig_node->orig, - curr_gw_tmp->orig_node->gw_flags, - router->tq_avg); + bat_dbg(DBG_BATMAN, bat_priv, + "Adding route to gateway %pM (gw_flags: %i, tq: %i)\n", + curr_gw_tmp->orig_node->orig, + curr_gw_tmp->orig_node->gw_flags, router->tq_avg);
neigh_node_free_ref(router); gw_select(bat_priv, curr_gw_tmp);
The debug output of update_route has tests for "route deleted" and "route added". All other situations are handled as "route changed". This is not true because neigh_node and curr_router could be both NULL.
The function is not called in this situation, but the code might be interpreted wrong when reading it without this test.
Signed-off-by: Sven Eckelmann sven@narfation.org --- routing.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/routing.c b/routing.c index 8c403ce..3f8355c 100644 --- a/routing.c +++ b/routing.c @@ -109,7 +109,7 @@ static void update_route(struct bat_priv *bat_priv, tt_buff, tt_buff_len);
/* route changed */ - } else { + } else if (neigh_node && curr_router) { bat_dbg(DBG_ROUTES, bat_priv, "Changing route towards: %pM " "(now via %pM - was via %pM)\n",
On Tuesday 10 May 2011 11:22:37 Sven Eckelmann wrote:
The debug output of update_route has tests for "route deleted" and "route added". All other situations are handled as "route changed". This is not true because neigh_node and curr_router could be both NULL.
The function is not called in this situation, but the code might be interpreted wrong when reading it without this test.
Applied in revision 3e7fe2e.
Thanks, Marek
b.a.t.m.a.n@lists.open-mesh.org