137 lines
5.5 KiB
Diff
137 lines
5.5 KiB
Diff
From: Sven Eckelmann <sven@narfation.org>
|
|
Date: Sat, 4 Mar 2017 16:33:31 +0100
|
|
Subject: batman-adv: Initialize gw sel_class via batadv_algo
|
|
|
|
The gateway selection class variable is shared between different algorithm
|
|
versions. But the interpretation of the content is algorithm specific. The
|
|
initialization is therefore also algorithm specific.
|
|
|
|
But this was implemented incorrectly and the initialization for BATMAN_V
|
|
always overwrote the value previously written for BATMAN_IV. This could
|
|
only be avoided when BATMAN_V was disabled during compile time.
|
|
|
|
Using a special batadv_algo hook for this initialization avoids this
|
|
problem.
|
|
|
|
Fixes: 80b2d47be2c7 ("batman-adv: B.A.T.M.A.N. V - implement GW selection logic")
|
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
|
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
|
|
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ef565a1434966750644affda86fd11b0b69edbfe
|
|
|
|
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
index f00f666e2ccd4714bb7a5210c48e39edb40e0c17..7bfd0d7ef49df8e699f91e2b827b824aa3657c0d 100644
|
|
--- a/net/batman-adv/bat_iv_ogm.c
|
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
|
@@ -2477,6 +2477,16 @@ static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
|
|
batadv_iv_ogm_schedule(hard_iface);
|
|
}
|
|
|
|
+/**
|
|
+ * batadv_iv_init_sel_class - initialize GW selection class
|
|
+ * @bat_priv: the bat priv with all the soft interface information
|
|
+ */
|
|
+static void batadv_iv_init_sel_class(struct batadv_priv *bat_priv)
|
|
+{
|
|
+ /* set default TQ difference threshold to 20 */
|
|
+ atomic_set(&bat_priv->gw.sel_class, 20);
|
|
+}
|
|
+
|
|
static struct batadv_gw_node *
|
|
batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
|
|
{
|
|
@@ -2823,6 +2833,7 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
|
.del_if = batadv_iv_ogm_orig_del_if,
|
|
},
|
|
.gw = {
|
|
+ .init_sel_class = batadv_iv_init_sel_class,
|
|
.get_best_gw_node = batadv_iv_gw_get_best_gw_node,
|
|
.is_eligible = batadv_iv_gw_is_eligible,
|
|
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
|
|
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
|
index 2ac612d7bab4d0b4035c9e476dab17536349dca3..2e2471ca84e392faac7fd6537bf137161e27542a 100644
|
|
--- a/net/batman-adv/bat_v.c
|
|
+++ b/net/batman-adv/bat_v.c
|
|
@@ -668,6 +668,16 @@ err_ifinfo1:
|
|
return ret;
|
|
}
|
|
|
|
+/**
|
|
+ * batadv_v_init_sel_class - initialize GW selection class
|
|
+ * @bat_priv: the bat priv with all the soft interface information
|
|
+ */
|
|
+static void batadv_v_init_sel_class(struct batadv_priv *bat_priv)
|
|
+{
|
|
+ /* set default throughput difference threshold to 5Mbps */
|
|
+ atomic_set(&bat_priv->gw.sel_class, 50);
|
|
+}
|
|
+
|
|
static ssize_t batadv_v_store_sel_class(struct batadv_priv *bat_priv,
|
|
char *buff, size_t count)
|
|
{
|
|
@@ -1052,6 +1062,7 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
|
|
.dump = batadv_v_orig_dump,
|
|
},
|
|
.gw = {
|
|
+ .init_sel_class = batadv_v_init_sel_class,
|
|
.store_sel_class = batadv_v_store_sel_class,
|
|
.show_sel_class = batadv_v_show_sel_class,
|
|
.get_best_gw_node = batadv_v_gw_get_best_gw_node,
|
|
@@ -1092,9 +1103,6 @@ int batadv_v_mesh_init(struct batadv_priv *bat_priv)
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- /* set default throughput difference threshold to 5Mbps */
|
|
- atomic_set(&bat_priv->gw.sel_class, 50);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/net/batman-adv/gateway_common.c b/net/batman-adv/gateway_common.c
|
|
index 21184810d89f69e372673aff221a74382945491d..3e3f91ab694fb8e61ecb4df356e72334b56e0fbe 100644
|
|
--- a/net/batman-adv/gateway_common.c
|
|
+++ b/net/batman-adv/gateway_common.c
|
|
@@ -253,6 +253,11 @@ static void batadv_gw_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
|
|
*/
|
|
void batadv_gw_init(struct batadv_priv *bat_priv)
|
|
{
|
|
+ if (bat_priv->algo_ops->gw.init_sel_class)
|
|
+ bat_priv->algo_ops->gw.init_sel_class(bat_priv);
|
|
+ else
|
|
+ atomic_set(&bat_priv->gw.sel_class, 1);
|
|
+
|
|
batadv_tvlv_handler_register(bat_priv, batadv_gw_tvlv_ogm_handler_v1,
|
|
NULL, BATADV_TVLV_GW, 1,
|
|
BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
|
|
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
|
index 4e447bf17332c191dda694b9b3e49e06073814fc..08432b14386a53c771c54b9eb38893d94c6f9b53 100644
|
|
--- a/net/batman-adv/soft-interface.c
|
|
+++ b/net/batman-adv/soft-interface.c
|
|
@@ -821,7 +821,6 @@ static int batadv_softif_init_late(struct net_device *dev)
|
|
atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
|
|
#endif
|
|
atomic_set(&bat_priv->gw.mode, BATADV_GW_MODE_OFF);
|
|
- atomic_set(&bat_priv->gw.sel_class, 20);
|
|
atomic_set(&bat_priv->gw.bandwidth_down, 100);
|
|
atomic_set(&bat_priv->gw.bandwidth_up, 20);
|
|
atomic_set(&bat_priv->orig_interval, 1000);
|
|
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
index e913aee28c98bf77cdd7fe92496fa4b188ff9604..5137d859694c28f60cad33325127617c047412ff 100644
|
|
--- a/net/batman-adv/types.h
|
|
+++ b/net/batman-adv/types.h
|
|
@@ -1489,6 +1489,7 @@ struct batadv_algo_orig_ops {
|
|
|
|
/**
|
|
* struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific)
|
|
+ * @init_sel_class: initialize GW selection class (optional)
|
|
* @store_sel_class: parse and stores a new GW selection class (optional)
|
|
* @show_sel_class: prints the current GW selection class (optional)
|
|
* @get_best_gw_node: select the best GW from the list of available nodes
|
|
@@ -1499,6 +1500,7 @@ struct batadv_algo_orig_ops {
|
|
* @dump: dump gateways to a netlink socket (optional)
|
|
*/
|
|
struct batadv_algo_gw_ops {
|
|
+ void (*init_sel_class)(struct batadv_priv *bat_priv);
|
|
ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff,
|
|
size_t count);
|
|
ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff);
|