This patch extends the hop penalty setting to be configurable not only on a node scope but also on a per hard interface basis.
Signed-off-by: Linus Lüssing linus.luessing@c0d3.blue --- README.rst | 7 ++++++- event.c | 4 ++++ hop_penalty.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ man/batctl.8 | 4 ++++ 4 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/README.rst b/README.rst index 128f539..4830347 100644 --- a/README.rst +++ b/README.rst @@ -562,8 +562,13 @@ Usage::
Example::
- $ batctl penalty + $ batctl hop_penalty 30 + $ batctl hardif eth0 hop_penalty + 0 + $ batctl hardif eth0 hop_penalty 50 + $ batctl hardif eth0 hop_penalty + 50
batctl isolation_mark diff --git a/event.c b/event.c index cebb803..3fbc6cc 100644 --- a/event.c +++ b/event.c @@ -317,6 +317,10 @@ static void event_parse_set_hardif(struct nlattr **attrs)
printf("%s (%s): set hardif:\n", meshif_name, hardif_name);
+ if (attrs[BATADV_ATTR_HOP_PENALTY]) + printf("* hop_penalty %u\n", + nla_get_u8(attrs[BATADV_ATTR_HOP_PENALTY])); + if (attrs[BATADV_ATTR_ELP_INTERVAL]) printf("* elp_interval %u ms\n", nla_get_u32(attrs[BATADV_ATTR_ELP_INTERVAL])); diff --git a/hop_penalty.c b/hop_penalty.c index 1f8f1db..5f1aabc 100644 --- a/hop_penalty.c +++ b/hop_penalty.c @@ -70,6 +70,22 @@ static int get_hop_penalty(struct state *state) NULL, print_hop_penalty); }
+static int get_attrs_hop_penalty_if(struct nl_msg *msg, void *arg) +{ + struct state *state = arg; + + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, state->hif); + + return 0; +} + +static int get_hop_penalty_if(struct state *state) +{ + return sys_simple_nlquery(state, BATADV_CMD_GET_HARDIF, + get_attrs_hop_penalty_if, + print_hop_penalty); +} + static int set_attrs_hop_penalty(struct nl_msg *msg, void *arg) { struct state *state = arg; @@ -87,6 +103,24 @@ static int set_hop_penalty(struct state *state) set_attrs_hop_penalty, NULL); }
+static int set_attrs_hop_penalty_if(struct nl_msg *msg, void *arg) +{ + struct state *state = arg; + struct settings_data *settings = state->cmd->arg; + struct hop_penalty_data *data = settings->data; + + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, state->hif); + nla_put_u8(msg, BATADV_ATTR_HOP_PENALTY, data->hop_penalty); + + return 0; +} + +static int set_hop_penalty_if(struct state *state) +{ + return sys_simple_nlquery(state, BATADV_CMD_SET_HARDIF, + set_attrs_hop_penalty_if, NULL); +} + static struct settings_data batctl_settings_hop_penalty = { .sysfs_name = "hop_penalty", .data = &hop_penalty, @@ -95,7 +129,20 @@ static struct settings_data batctl_settings_hop_penalty = { .netlink_set = set_hop_penalty, };
+static struct settings_data batctl_settings_hop_penalty_if = { + .sysfs_name = NULL, + .data = &hop_penalty, + .parse = parse_hop_penalty, + .netlink_get = get_hop_penalty_if, + .netlink_set = set_hop_penalty_if, +}; + COMMAND_NAMED(SUBCOMMAND_MIF, hop_penalty, "hp", handle_sys_setting, COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, &batctl_settings_hop_penalty, "[penalty] \tdisplay or modify hop_penalty setting"); + +COMMAND_NAMED(SUBCOMMAND_HIF, hop_penalty, "hp", handle_sys_setting, + COMMAND_FLAG_MESH_IFACE | COMMAND_FLAG_NETLINK, + &batctl_settings_hop_penalty_if, + "[penalty] \tdisplay or modify hop_penalty setting"); diff --git a/man/batctl.8 b/man/batctl.8 index 6e75cdd..d4d5fe5 100644 --- a/man/batctl.8 +++ b/man/batctl.8 @@ -109,6 +109,10 @@ disable fragmentation. If no parameter is given the current hop penalty setting is displayed. Otherwise the parameter is used to set the hop penalty. The penalty is can be 0-255 (255 sets originator message's TQ to zero when forwarded by this hop). .br +.IP "[\fBhardif <hardif>\fP] \fBhop_penalty\fP|\fBhp\fP [\fBpenalty\fP]" +If no parameter is given the current hop penalty setting of the hard interface is displayed. Otherwise the parameter is used to set the +hop penalty. The penalty can be 0-255 (255 sets originator message's TQ to zero when forwarded over this interface). +.br .IP "[\fBmeshif <netdev>\fP] \fBnetwork_coding\fP|\fBnc\fP [\fB0\fP|\fB1\fP]" If no parameter is given the current network coding mode setting is displayed. Otherwise the parameter is used to enable or disable network coding.