[5/4] batman-adv: Make hop_penalty configurable via sysfs
Commit Message
When having a mixed topology of both very mobile and rather static
nodes, you are usually best advised to set the originator interval on
all nodes to a level best suited for the most mobile node.
However, if most of the nodes are rather static, this can create a lot
of undesired overhead as a trade-off then. If setting the interval too
low on the static nodes, a mobile node might be chosen as a router for
too long, not switching away from it fast enough because of its
mobility and the low frequency of ogms of static nodes.
Exposing the hop_penalty is especially useful for the stated scenario: A
static node can keep the default originator interval, a mobile node can
select a quicker one resulting in faster route updates towards this
mobile node. Additionally, such a mobile node could select a higher hop
penalty (or even set it to 255 to disable acting as a router for other
nodes) to make it less desirable, letting other nodes avoid selecting
this mobile node as a router.
Signed-off-by: Linus Lüssing <linus.luessing@ascom.ch>
---
bat_sysfs.c | 2 ++
main.h | 2 --
send.c | 7 ++++---
soft-interface.c | 1 +
types.h | 1 +
5 files changed, 8 insertions(+), 5 deletions(-)
Comments
On Wednesday 13 October 2010 13:33:09 Linus Lüssing wrote:
> Exposing the hop_penalty is especially useful for the stated scenario: A
> static node can keep the default originator interval, a mobile node can
> select a quicker one resulting in faster route updates towards this
> mobile node. Additionally, such a mobile node could select a higher hop
> penalty (or even set it to 255 to disable acting as a router for other
> nodes) to make it less desirable, letting other nodes avoid selecting
> this mobile node as a router.
Could you please complete this patch by providing the proper sysfs API
documentation. For a reference simply check the sysfs-class-net-mesh file which
is now part of the repository.
Thanks,
Marek
On Wednesday 13 October 2010 13:33:09 Linus Lüssing wrote:
> Exposing the hop_penalty is especially useful for the stated scenario: A
> static node can keep the default originator interval, a mobile node can
> select a quicker one resulting in faster route updates towards this
> mobile node. Additionally, such a mobile node could select a higher hop
> penalty (or even set it to 255 to disable acting as a router for other
> nodes) to make it less desirable, letting other nodes avoid selecting
> this mobile node as a router.
Applied in revision 1843.
Thanks,
Marek
@@ -298,6 +298,7 @@ BAT_ATTR_BOOL(fragmentation, S_IRUGO | S_IWUSR, update_min_mtu);
static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, show_vis_mode, store_vis_mode);
static BAT_ATTR(gw_mode, S_IRUGO | S_IWUSR, show_gw_mode, store_gw_mode);
BAT_ATTR_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * JITTER, INT_MAX, NULL);
+BAT_ATTR_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, TQ_MAX_VALUE, NULL);
#ifdef CONFIG_BATMAN_ADV_DEBUG
BAT_ATTR_UINT(log_level, S_IRUGO | S_IWUSR, 0, 3, NULL);
#endif
@@ -309,6 +310,7 @@ static struct bat_attribute *mesh_attrs[] = {
&bat_attr_vis_mode,
&bat_attr_gw_mode,
&bat_attr_orig_interval,
+ &bat_attr_hop_penalty,
#ifdef CONFIG_BATMAN_ADV_DEBUG
&bat_attr_log_level,
#endif
@@ -52,8 +52,6 @@
#define TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
#define TQ_TOTAL_BIDRECT_LIMIT 1
-#define TQ_HOP_PENALTY 10
-
#define NUM_WORDS (TQ_LOCAL_WINDOW_SIZE / WORD_BIT_SIZE)
#define PACKBUFF_SIZE 2000
@@ -35,9 +35,10 @@
static void send_outstanding_bcast_packet(struct work_struct *work);
/* apply hop penalty for a normal link */
-static uint8_t hop_penalty(const uint8_t tq)
+static uint8_t hop_penalty(const uint8_t tq, struct bat_priv *bat_priv)
{
- return (tq * (TQ_MAX_VALUE - TQ_HOP_PENALTY)) / (TQ_MAX_VALUE);
+ int hop_penalty = atomic_read(&bat_priv->hop_penalty);
+ return (tq * (TQ_MAX_VALUE - hop_penalty)) / (TQ_MAX_VALUE);
}
/* when do we schedule our own packet to be sent */
@@ -339,7 +340,7 @@ void schedule_forward_packet(struct orig_node *orig_node,
}
/* apply hop penalty */
- batman_packet->tq = hop_penalty(batman_packet->tq);
+ batman_packet->tq = hop_penalty(batman_packet->tq, bat_priv);
bat_dbg(DBG_BATMAN, bat_priv,
"Forwarding packet: tq_orig: %i, tq_avg: %i, "
@@ -593,6 +593,7 @@ struct net_device *softif_create(char *name)
atomic_set(&bat_priv->gw_mode, GW_MODE_OFF);
atomic_set(&bat_priv->gw_class, 0);
atomic_set(&bat_priv->orig_interval, 1000);
+ atomic_set(&bat_priv->hop_penalty, 10);
atomic_set(&bat_priv->log_level, 0);
atomic_set(&bat_priv->fragmentation, 1);
atomic_set(&bat_priv->bcast_queue_left, BCAST_QUEUE_LEN);
@@ -131,6 +131,7 @@ struct bat_priv {
atomic_t gw_mode; /* GW_MODE_* */
atomic_t gw_class; /* uint */
atomic_t orig_interval; /* uint */
+ atomic_t hop_penalty; /* uint */
atomic_t log_level; /* uint */
atomic_t bcast_seqno;
atomic_t bcast_queue_left;