batman-adv: iv_ogm, Reduce code duplication
The difference between tq1 and tq2 are calculated the same way in two separate functions. This patch moves the common code to a separate function 'batadv_iv_ogm_neigh_diff' which handles everything necessary. The other two functions can then handle errors and use the difference directly. Signed-off-by: Markus Pargmann <mpa@pengutronix.de> [sven@narfation.org: rebased on current version, initialize return variable in batadv_iv_ogm_neigh_diff, add kerneldoc, convert to bool return type] Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
This commit is contained in:
parent
a8d8d1de41
commit
57b125029c
|
@ -2018,6 +2018,51 @@ static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
|
||||||
seq_puts(seq, "No batman nodes in range ...\n");
|
seq_puts(seq, "No batman nodes in range ...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_iv_ogm_neigh_diff - calculate tq difference of two neighbors
|
||||||
|
* @neigh1: the first neighbor object of the comparison
|
||||||
|
* @if_outgoing1: outgoing interface for the first neighbor
|
||||||
|
* @neigh2: the second neighbor object of the comparison
|
||||||
|
* @if_outgoing2: outgoing interface for the second neighbor
|
||||||
|
* @diff: pointer to integer receiving the calculated difference
|
||||||
|
*
|
||||||
|
* The content of *@diff is only valid when this function returns true.
|
||||||
|
* It is less, equal to or greater than 0 if the metric via neigh1 is lower,
|
||||||
|
* the same as or higher than the metric via neigh2
|
||||||
|
*
|
||||||
|
* Return: true when the difference could be calculated, false otherwise
|
||||||
|
*/
|
||||||
|
static bool batadv_iv_ogm_neigh_diff(struct batadv_neigh_node *neigh1,
|
||||||
|
struct batadv_hard_iface *if_outgoing1,
|
||||||
|
struct batadv_neigh_node *neigh2,
|
||||||
|
struct batadv_hard_iface *if_outgoing2,
|
||||||
|
int *diff)
|
||||||
|
{
|
||||||
|
struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
|
||||||
|
u8 tq1, tq2;
|
||||||
|
bool ret = true;
|
||||||
|
|
||||||
|
neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
|
||||||
|
neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
|
||||||
|
|
||||||
|
if (!neigh1_ifinfo || !neigh2_ifinfo) {
|
||||||
|
ret = false;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
tq1 = neigh1_ifinfo->bat_iv.tq_avg;
|
||||||
|
tq2 = neigh2_ifinfo->bat_iv.tq_avg;
|
||||||
|
*diff = (int)tq1 - (int)tq2;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (neigh1_ifinfo)
|
||||||
|
batadv_neigh_ifinfo_put(neigh1_ifinfo);
|
||||||
|
if (neigh2_ifinfo)
|
||||||
|
batadv_neigh_ifinfo_put(neigh2_ifinfo);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors
|
* batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors
|
||||||
* @neigh1: the first neighbor object of the comparison
|
* @neigh1: the first neighbor object of the comparison
|
||||||
|
@ -2033,27 +2078,13 @@ static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
|
||||||
struct batadv_neigh_node *neigh2,
|
struct batadv_neigh_node *neigh2,
|
||||||
struct batadv_hard_iface *if_outgoing2)
|
struct batadv_hard_iface *if_outgoing2)
|
||||||
{
|
{
|
||||||
struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
|
bool ret;
|
||||||
u8 tq1, tq2;
|
|
||||||
int diff;
|
int diff;
|
||||||
|
|
||||||
neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
|
ret = batadv_iv_ogm_neigh_diff(neigh1, if_outgoing1, neigh2,
|
||||||
neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
|
if_outgoing2, &diff);
|
||||||
|
if (!ret)
|
||||||
if (!neigh1_ifinfo || !neigh2_ifinfo) {
|
return 0;
|
||||||
diff = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
tq1 = neigh1_ifinfo->bat_iv.tq_avg;
|
|
||||||
tq2 = neigh2_ifinfo->bat_iv.tq_avg;
|
|
||||||
diff = tq1 - tq2;
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (neigh1_ifinfo)
|
|
||||||
batadv_neigh_ifinfo_put(neigh1_ifinfo);
|
|
||||||
if (neigh2_ifinfo)
|
|
||||||
batadv_neigh_ifinfo_put(neigh2_ifinfo);
|
|
||||||
|
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
@ -2075,29 +2106,15 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
|
||||||
struct batadv_neigh_node *neigh2,
|
struct batadv_neigh_node *neigh2,
|
||||||
struct batadv_hard_iface *if_outgoing2)
|
struct batadv_hard_iface *if_outgoing2)
|
||||||
{
|
{
|
||||||
struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
|
|
||||||
u8 tq1, tq2;
|
|
||||||
bool ret;
|
bool ret;
|
||||||
|
int diff;
|
||||||
|
|
||||||
neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
|
ret = batadv_iv_ogm_neigh_diff(neigh1, if_outgoing1, neigh2,
|
||||||
neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
|
if_outgoing2, &diff);
|
||||||
|
if (!ret)
|
||||||
/* we can't say that the metric is better */
|
return false;
|
||||||
if (!neigh1_ifinfo || !neigh2_ifinfo) {
|
|
||||||
ret = false;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
tq1 = neigh1_ifinfo->bat_iv.tq_avg;
|
|
||||||
tq2 = neigh2_ifinfo->bat_iv.tq_avg;
|
|
||||||
ret = (tq1 - tq2) > -BATADV_TQ_SIMILARITY_THRESHOLD;
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (neigh1_ifinfo)
|
|
||||||
batadv_neigh_ifinfo_put(neigh1_ifinfo);
|
|
||||||
if (neigh2_ifinfo)
|
|
||||||
batadv_neigh_ifinfo_put(neigh2_ifinfo);
|
|
||||||
|
|
||||||
|
ret = diff > -BATADV_TQ_SIMILARITY_THRESHOLD;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue