Local link-specific power mode defines a mesh power mode in which it operates for the mesh peering with the station. Possibility of setting local link-specific power mode is added. Signed-off-by: Ivan Bezyazychnyy <ivan.bezyazychnyy@xxxxxxxxx> Signed-off-by: Mike Krinkin <krinkin.m.u@xxxxxxxxx> --- include/linux/nl80211.h | 3 +++ include/net/cfg80211.h | 2 ++ net/mac80211/cfg.c | 5 +++++ net/wireless/nl80211.c | 8 ++++++++ 4 files changed, 18 insertions(+), 0 deletions(-) diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 001e9e3..ce789ce 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -1054,6 +1054,7 @@ enum nl80211_commands { * %NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that * are managed in software: interfaces of these types aren't subject to * any restrictions in their number or combinations. + * @NL80211_ATTR_LOCAL_MESH_POWER_MODE: local mesh STA link-specific power mode * * @%NL80211_ATTR_REKEY_DATA: nested attribute containing the information * necessary for GTK rekeying in the device, see &enum nl80211_rekey_data. @@ -1337,6 +1338,8 @@ enum nl80211_attrs { NL80211_ATTR_TDLS_SUPPORT, NL80211_ATTR_TDLS_EXTERNAL_SETUP, + NL80211_ATTR_LOCAL_MESH_POWER_MODE, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index e00e04e..2204222 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -456,6 +456,7 @@ enum station_parameters_apply_mask { * as the AC bitmap in the QoS info field * @max_sp: max Service Period. same format as the MAX_SP in the * QoS info field (but already shifted down) + * @local_ps_mode: local link-specific mesh power save mode */ struct station_parameters { u8 *supported_rates; @@ -470,6 +471,7 @@ struct station_parameters { struct ieee80211_ht_cap *ht_capa; u8 uapsd_queues; u8 max_sp; + u8 local_ps_mode; }; /** diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index e253afa..78c61ee 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -804,6 +804,11 @@ static void sta_apply_parameters(struct ieee80211_local *local, mesh_plink_block(sta); break; } + + if (params->local_ps_mode) { + ieee80211s_set_local_ps_mode(sta, + params->local_ps_mode); + } #endif } } diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 48260c2..80bc2a7 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -2517,6 +2517,10 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) params.plink_state = nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); + if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) + params.local_ps_mode = + nla_get_u8(info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); + err = get_vlan(info, rdev, ¶ms.vlan); if (err) goto out; @@ -2531,6 +2535,8 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) /* disallow mesh-specific things */ if (params.plink_action) err = -EINVAL; + if (params.local_ps_mode) + err = -EINVAL; break; case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_STATION: @@ -2554,6 +2560,8 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && (params.sta_flags_mask & BIT(NL80211_STA_FLAG_TDLS_PEER))) err = -EINVAL; + if (params.local_ps_mode) + err = -EINVAL; break; case NL80211_IFTYPE_MESH_POINT: /* disallow things mesh doesn't support */ -- 1.7.3.4 -- 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