The default mesh power mode is the power mode that will be assigned to newly established peer links. Signed-off-by: Marco Porsch <marco.porsch@xxxxxxxxxxxxxxxxxxx> Signed-off-by: Ivan Bezyazychnyy <ivan.bezyazychnyy@xxxxxxxxx> --- mesh.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/mesh.c b/mesh.c index 26fd1b8..b2eb69d 100644 --- a/mesh.c +++ b/mesh.c @@ -73,6 +73,24 @@ static uint32_t _parse_u8_as_bool(const char *str, _any *ret) return 0; } +static uint32_t _parse_u8_power_mode(const char *str, _any *ret) +{ + unsigned long int v; + + /* Parse attribute for the name of power mode */ + if (!strcmp(str, "active")) + v = NL80211_MESH_POWER_ACTIVE; + else if (!strcmp(str, "light")) + v = NL80211_MESH_POWER_LIGHT_SLEEP; + else if (!strcmp(str, "deep")) + v = NL80211_MESH_POWER_DEEP_SLEEP; + else + return 0xff; + + ret->u.as_8 = (uint8_t)v; + return 0; +} + static uint32_t _parse_u16(const char *str, _any *ret) { char *endptr = NULL; @@ -115,6 +133,26 @@ static void _print_u8(struct nlattr *a) printf("%d", nla_get_u8(a)); } +static void _print_u8_power_mode(struct nlattr *a) +{ + unsigned long v = nla_get_u8(a); + + switch (v) { + case NL80211_MESH_POWER_ACTIVE: + printf("active"); + break; + case NL80211_MESH_POWER_LIGHT_SLEEP: + printf("light"); + break; + case NL80211_MESH_POWER_DEEP_SLEEP: + printf("deep"); + break; + default: + printf("undefined"); + break; + } +} + static void _print_u16(struct nlattr *a) { printf("%d", nla_get_u16(a)); @@ -221,6 +259,8 @@ const static struct mesh_param_descr _mesh_param_descrs[] = _my_nla_put_u16, _parse_u16, _print_u16_in_TUs}, {"mesh_dtim_period", NL80211_MESHCONF_DTIM_PERIOD, _my_nla_put_u8, _parse_u8, _print_u8}, + {"mesh_power_mode", NL80211_MESHCONF_POWER_MODE, + _my_nla_put_u8, _parse_u8_power_mode, _print_u8_power_mode}, }; static void print_all_mesh_param_descr(void) @@ -298,8 +338,15 @@ static int set_interface_meshparam(struct nl80211_state *state, /* Parse the new value */ ret = mdescr->parse_fn(value, &any); if (ret != 0) { - printf("%s must be set to a number " - "between 0 and %u\n", mdescr->name, ret); + if (mdescr->mesh_param_num + == NL80211_MESHCONF_POWER_MODE) + printf("%s must be set to active, light or " + "deep.\n", mdescr->name); + else + printf("%s must be set to a number " + "between 0 and %u\n", + mdescr->name, ret); + return 2; } -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html