diff options
author | Marco Porsch <marco@cozybit.com> | 2013-01-07 10:04:52 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-01-16 16:48:04 -0500 |
commit | 3b1c5a5307fb5277f395efdcf330c064d79df07d (patch) | |
tree | 9aca9007c05a70a0bce2c18c3c60fcfda1b7923d | |
parent | 9bdbf04db099c11bbbaea9dcea7465c508531fb8 (diff) |
{cfg,nl}80211: mesh power mode primitives and userspace access
Add the nl80211_mesh_power_mode enumeration which holds possible
values for the mesh power mode. These modes are unknown, active,
light sleep and deep sleep.
Add power_mode entry to the mesh config structure to hold the
user-configured default mesh power mode. This value will be used
for new peer links.
Add the dot11MeshAwakeWindowDuration value to the mesh config.
The awake window is a duration in TU describing how long the STA
will stay awake after transmitting its beacon in PS mode.
Add access routines to:
- get/set local link-specific power mode (STA)
- get remote STA's link-specific power mode (STA)
- get remote STA's non-peer power mode (STA)
- get/set default mesh power mode (mesh config)
- get/set mesh awake window duration (mesh config)
All config changes may be done at mesh runtime and take effect
immediately.
Signed-off-by: Marco Porsch <marco@cozybit.com>
Signed-off-by: Ivan Bezyazychnyy <ivan.bezyazychnyy@gmail.com>
Signed-off-by: Mike Krinkin <krinkin.m.u@gmail.com>
[fix commit message line length, error handling in set station]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | include/net/cfg80211.h | 21 | ||||
-rw-r--r-- | include/uapi/linux/nl80211.h | 47 | ||||
-rw-r--r-- | net/wireless/mesh.c | 3 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 43 |
4 files changed, 113 insertions, 1 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 516aded3697f..d9f08f65f7a5 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -610,6 +610,8 @@ enum station_parameters_apply_mask { | |||
610 | * @sta_modify_mask: bitmap indicating which parameters changed | 610 | * @sta_modify_mask: bitmap indicating which parameters changed |
611 | * (for those that don't have a natural "no change" value), | 611 | * (for those that don't have a natural "no change" value), |
612 | * see &enum station_parameters_apply_mask | 612 | * see &enum station_parameters_apply_mask |
613 | * @local_pm: local link-specific mesh power save mode (no change when set | ||
614 | * to unknown) | ||
613 | */ | 615 | */ |
614 | struct station_parameters { | 616 | struct station_parameters { |
615 | u8 *supported_rates; | 617 | u8 *supported_rates; |
@@ -625,6 +627,7 @@ struct station_parameters { | |||
625 | struct ieee80211_vht_cap *vht_capa; | 627 | struct ieee80211_vht_cap *vht_capa; |
626 | u8 uapsd_queues; | 628 | u8 uapsd_queues; |
627 | u8 max_sp; | 629 | u8 max_sp; |
630 | enum nl80211_mesh_power_mode local_pm; | ||
628 | }; | 631 | }; |
629 | 632 | ||
630 | /** | 633 | /** |
@@ -655,6 +658,9 @@ struct station_parameters { | |||
655 | * @STATION_INFO_STA_FLAGS: @sta_flags filled | 658 | * @STATION_INFO_STA_FLAGS: @sta_flags filled |
656 | * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled | 659 | * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled |
657 | * @STATION_INFO_T_OFFSET: @t_offset filled | 660 | * @STATION_INFO_T_OFFSET: @t_offset filled |
661 | * @STATION_INFO_LOCAL_PM: @local_pm filled | ||
662 | * @STATION_INFO_PEER_PM: @peer_pm filled | ||
663 | * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled | ||
658 | */ | 664 | */ |
659 | enum station_info_flags { | 665 | enum station_info_flags { |
660 | STATION_INFO_INACTIVE_TIME = 1<<0, | 666 | STATION_INFO_INACTIVE_TIME = 1<<0, |
@@ -678,6 +684,9 @@ enum station_info_flags { | |||
678 | STATION_INFO_STA_FLAGS = 1<<18, | 684 | STATION_INFO_STA_FLAGS = 1<<18, |
679 | STATION_INFO_BEACON_LOSS_COUNT = 1<<19, | 685 | STATION_INFO_BEACON_LOSS_COUNT = 1<<19, |
680 | STATION_INFO_T_OFFSET = 1<<20, | 686 | STATION_INFO_T_OFFSET = 1<<20, |
687 | STATION_INFO_LOCAL_PM = 1<<21, | ||
688 | STATION_INFO_PEER_PM = 1<<22, | ||
689 | STATION_INFO_NONPEER_PM = 1<<23, | ||
681 | }; | 690 | }; |
682 | 691 | ||
683 | /** | 692 | /** |
@@ -791,6 +800,9 @@ struct sta_bss_parameters { | |||
791 | * @sta_flags: station flags mask & values | 800 | * @sta_flags: station flags mask & values |
792 | * @beacon_loss_count: Number of times beacon loss event has triggered. | 801 | * @beacon_loss_count: Number of times beacon loss event has triggered. |
793 | * @t_offset: Time offset of the station relative to this host. | 802 | * @t_offset: Time offset of the station relative to this host. |
803 | * @local_pm: local mesh STA power save mode | ||
804 | * @peer_pm: peer mesh STA power save mode | ||
805 | * @nonpeer_pm: non-peer mesh STA power save mode | ||
794 | */ | 806 | */ |
795 | struct station_info { | 807 | struct station_info { |
796 | u32 filled; | 808 | u32 filled; |
@@ -820,6 +832,9 @@ struct station_info { | |||
820 | 832 | ||
821 | u32 beacon_loss_count; | 833 | u32 beacon_loss_count; |
822 | s64 t_offset; | 834 | s64 t_offset; |
835 | enum nl80211_mesh_power_mode local_pm; | ||
836 | enum nl80211_mesh_power_mode peer_pm; | ||
837 | enum nl80211_mesh_power_mode nonpeer_pm; | ||
823 | 838 | ||
824 | /* | 839 | /* |
825 | * Note: Add a new enum station_info_flags value for each new field and | 840 | * Note: Add a new enum station_info_flags value for each new field and |
@@ -995,6 +1010,10 @@ struct bss_parameters { | |||
995 | * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs) | 1010 | * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs) |
996 | * during which a mesh STA can send only one Action frame containing | 1011 | * during which a mesh STA can send only one Action frame containing |
997 | * a PREQ element for root path confirmation. | 1012 | * a PREQ element for root path confirmation. |
1013 | * @power_mode: The default mesh power save mode which will be the initial | ||
1014 | * setting for new peer links. | ||
1015 | * @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake | ||
1016 | * after transmitting its beacon. | ||
998 | */ | 1017 | */ |
999 | struct mesh_config { | 1018 | struct mesh_config { |
1000 | u16 dot11MeshRetryTimeout; | 1019 | u16 dot11MeshRetryTimeout; |
@@ -1022,6 +1041,8 @@ struct mesh_config { | |||
1022 | u32 dot11MeshHWMPactivePathToRootTimeout; | 1041 | u32 dot11MeshHWMPactivePathToRootTimeout; |
1023 | u16 dot11MeshHWMProotInterval; | 1042 | u16 dot11MeshHWMProotInterval; |
1024 | u16 dot11MeshHWMPconfirmationInterval; | 1043 | u16 dot11MeshHWMPconfirmationInterval; |
1044 | enum nl80211_mesh_power_mode power_mode; | ||
1045 | u16 dot11MeshAwakeWindowDuration; | ||
1025 | }; | 1046 | }; |
1026 | 1047 | ||
1027 | /** | 1048 | /** |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 547017100a30..6c4f703ae890 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
@@ -1310,6 +1310,9 @@ enum nl80211_commands { | |||
1310 | * if not given in START_AP 0 is assumed, if not given in SET_BSS | 1310 | * if not given in START_AP 0 is assumed, if not given in SET_BSS |
1311 | * no change is made. | 1311 | * no change is made. |
1312 | * | 1312 | * |
1313 | * @NL80211_ATTR_LOCAL_MESH_POWER_MODE: local mesh STA link-specific power mode | ||
1314 | * defined in &enum nl80211_mesh_power_mode. | ||
1315 | * | ||
1313 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 1316 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
1314 | * @__NL80211_ATTR_AFTER_LAST: internal use | 1317 | * @__NL80211_ATTR_AFTER_LAST: internal use |
1315 | */ | 1318 | */ |
@@ -1580,6 +1583,8 @@ enum nl80211_attrs { | |||
1580 | NL80211_ATTR_P2P_CTWINDOW, | 1583 | NL80211_ATTR_P2P_CTWINDOW, |
1581 | NL80211_ATTR_P2P_OPPPS, | 1584 | NL80211_ATTR_P2P_OPPPS, |
1582 | 1585 | ||
1586 | NL80211_ATTR_LOCAL_MESH_POWER_MODE, | ||
1587 | |||
1583 | /* add attributes here, update the policy in nl80211.c */ | 1588 | /* add attributes here, update the policy in nl80211.c */ |
1584 | 1589 | ||
1585 | __NL80211_ATTR_AFTER_LAST, | 1590 | __NL80211_ATTR_AFTER_LAST, |
@@ -1838,6 +1843,10 @@ enum nl80211_sta_bss_param { | |||
1838 | * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. | 1843 | * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. |
1839 | * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32) | 1844 | * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32) |
1840 | * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64) | 1845 | * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64) |
1846 | * @NL80211_STA_INFO_LOCAL_PM: local mesh STA link-specific power mode | ||
1847 | * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode | ||
1848 | * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards | ||
1849 | * non-peer STA | ||
1841 | * @__NL80211_STA_INFO_AFTER_LAST: internal | 1850 | * @__NL80211_STA_INFO_AFTER_LAST: internal |
1842 | * @NL80211_STA_INFO_MAX: highest possible station info attribute | 1851 | * @NL80211_STA_INFO_MAX: highest possible station info attribute |
1843 | */ | 1852 | */ |
@@ -1862,6 +1871,9 @@ enum nl80211_sta_info { | |||
1862 | NL80211_STA_INFO_STA_FLAGS, | 1871 | NL80211_STA_INFO_STA_FLAGS, |
1863 | NL80211_STA_INFO_BEACON_LOSS, | 1872 | NL80211_STA_INFO_BEACON_LOSS, |
1864 | NL80211_STA_INFO_T_OFFSET, | 1873 | NL80211_STA_INFO_T_OFFSET, |
1874 | NL80211_STA_INFO_LOCAL_PM, | ||
1875 | NL80211_STA_INFO_PEER_PM, | ||
1876 | NL80211_STA_INFO_NONPEER_PM, | ||
1865 | 1877 | ||
1866 | /* keep last */ | 1878 | /* keep last */ |
1867 | __NL80211_STA_INFO_AFTER_LAST, | 1879 | __NL80211_STA_INFO_AFTER_LAST, |
@@ -2253,6 +2265,34 @@ enum nl80211_mntr_flags { | |||
2253 | }; | 2265 | }; |
2254 | 2266 | ||
2255 | /** | 2267 | /** |
2268 | * enum nl80211_mesh_power_mode - mesh power save modes | ||
2269 | * | ||
2270 | * @NL80211_MESH_POWER_UNKNOWN: The mesh power mode of the mesh STA is | ||
2271 | * not known or has not been set yet. | ||
2272 | * @NL80211_MESH_POWER_ACTIVE: Active mesh power mode. The mesh STA is | ||
2273 | * in Awake state all the time. | ||
2274 | * @NL80211_MESH_POWER_LIGHT_SLEEP: Light sleep mode. The mesh STA will | ||
2275 | * alternate between Active and Doze states, but will wake up for | ||
2276 | * neighbor's beacons. | ||
2277 | * @NL80211_MESH_POWER_DEEP_SLEEP: Deep sleep mode. The mesh STA will | ||
2278 | * alternate between Active and Doze states, but may not wake up | ||
2279 | * for neighbor's beacons. | ||
2280 | * | ||
2281 | * @__NL80211_MESH_POWER_AFTER_LAST - internal use | ||
2282 | * @NL80211_MESH_POWER_MAX - highest possible power save level | ||
2283 | */ | ||
2284 | |||
2285 | enum nl80211_mesh_power_mode { | ||
2286 | NL80211_MESH_POWER_UNKNOWN, | ||
2287 | NL80211_MESH_POWER_ACTIVE, | ||
2288 | NL80211_MESH_POWER_LIGHT_SLEEP, | ||
2289 | NL80211_MESH_POWER_DEEP_SLEEP, | ||
2290 | |||
2291 | __NL80211_MESH_POWER_AFTER_LAST, | ||
2292 | NL80211_MESH_POWER_MAX = __NL80211_MESH_POWER_AFTER_LAST - 1 | ||
2293 | }; | ||
2294 | |||
2295 | /** | ||
2256 | * enum nl80211_meshconf_params - mesh configuration parameters | 2296 | * enum nl80211_meshconf_params - mesh configuration parameters |
2257 | * | 2297 | * |
2258 | * Mesh configuration parameters. These can be changed while the mesh is | 2298 | * Mesh configuration parameters. These can be changed while the mesh is |
@@ -2346,6 +2386,11 @@ enum nl80211_mntr_flags { | |||
2346 | * (in TUs) during which a mesh STA can send only one Action frame | 2386 | * (in TUs) during which a mesh STA can send only one Action frame |
2347 | * containing a PREQ element for root path confirmation. | 2387 | * containing a PREQ element for root path confirmation. |
2348 | * | 2388 | * |
2389 | * @NL80211_MESHCONF_POWER_MODE: Default mesh power mode for new peer links. | ||
2390 | * type &enum nl80211_mesh_power_mode (u32) | ||
2391 | * | ||
2392 | * @NL80211_MESHCONF_AWAKE_WINDOW: awake window duration (in TUs) | ||
2393 | * | ||
2349 | * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use | 2394 | * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use |
2350 | */ | 2395 | */ |
2351 | enum nl80211_meshconf_params { | 2396 | enum nl80211_meshconf_params { |
@@ -2375,6 +2420,8 @@ enum nl80211_meshconf_params { | |||
2375 | NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, | 2420 | NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, |
2376 | NL80211_MESHCONF_HWMP_ROOT_INTERVAL, | 2421 | NL80211_MESHCONF_HWMP_ROOT_INTERVAL, |
2377 | NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, | 2422 | NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, |
2423 | NL80211_MESHCONF_POWER_MODE, | ||
2424 | NL80211_MESHCONF_AWAKE_WINDOW, | ||
2378 | 2425 | ||
2379 | /* keep last */ | 2426 | /* keep last */ |
2380 | __NL80211_MESHCONF_ATTR_AFTER_LAST, | 2427 | __NL80211_MESHCONF_ATTR_AFTER_LAST, |
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c index 0fe8ceb5444e..55957a284f6c 100644 --- a/net/wireless/mesh.c +++ b/net/wireless/mesh.c | |||
@@ -46,6 +46,7 @@ | |||
46 | 46 | ||
47 | #define MESH_DEFAULT_BEACON_INTERVAL 1000 /* in 1024 us units (=TUs) */ | 47 | #define MESH_DEFAULT_BEACON_INTERVAL 1000 /* in 1024 us units (=TUs) */ |
48 | #define MESH_DEFAULT_DTIM_PERIOD 2 | 48 | #define MESH_DEFAULT_DTIM_PERIOD 2 |
49 | #define MESH_DEFAULT_AWAKE_WINDOW 10 /* in 1024 us units (=TUs) */ | ||
49 | 50 | ||
50 | const struct mesh_config default_mesh_config = { | 51 | const struct mesh_config default_mesh_config = { |
51 | .dot11MeshRetryTimeout = MESH_RET_T, | 52 | .dot11MeshRetryTimeout = MESH_RET_T, |
@@ -72,6 +73,8 @@ const struct mesh_config default_mesh_config = { | |||
72 | .dot11MeshHWMPactivePathToRootTimeout = MESH_PATH_TO_ROOT_TIMEOUT, | 73 | .dot11MeshHWMPactivePathToRootTimeout = MESH_PATH_TO_ROOT_TIMEOUT, |
73 | .dot11MeshHWMProotInterval = MESH_ROOT_INTERVAL, | 74 | .dot11MeshHWMProotInterval = MESH_ROOT_INTERVAL, |
74 | .dot11MeshHWMPconfirmationInterval = MESH_ROOT_CONFIRMATION_INTERVAL, | 75 | .dot11MeshHWMPconfirmationInterval = MESH_ROOT_CONFIRMATION_INTERVAL, |
76 | .power_mode = NL80211_MESH_POWER_ACTIVE, | ||
77 | .dot11MeshAwakeWindowDuration = MESH_DEFAULT_AWAKE_WINDOW, | ||
75 | }; | 78 | }; |
76 | 79 | ||
77 | const struct mesh_setup default_mesh_setup = { | 80 | const struct mesh_setup default_mesh_setup = { |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index d5842eb35aec..1a7a710fe9bf 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -3001,6 +3001,18 @@ static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq, | |||
3001 | nla_put_u32(msg, NL80211_STA_INFO_BEACON_LOSS, | 3001 | nla_put_u32(msg, NL80211_STA_INFO_BEACON_LOSS, |
3002 | sinfo->beacon_loss_count)) | 3002 | sinfo->beacon_loss_count)) |
3003 | goto nla_put_failure; | 3003 | goto nla_put_failure; |
3004 | if ((sinfo->filled & STATION_INFO_LOCAL_PM) && | ||
3005 | nla_put_u32(msg, NL80211_STA_INFO_LOCAL_PM, | ||
3006 | sinfo->local_pm)) | ||
3007 | goto nla_put_failure; | ||
3008 | if ((sinfo->filled & STATION_INFO_PEER_PM) && | ||
3009 | nla_put_u32(msg, NL80211_STA_INFO_PEER_PM, | ||
3010 | sinfo->peer_pm)) | ||
3011 | goto nla_put_failure; | ||
3012 | if ((sinfo->filled & STATION_INFO_NONPEER_PM) && | ||
3013 | nla_put_u32(msg, NL80211_STA_INFO_NONPEER_PM, | ||
3014 | sinfo->nonpeer_pm)) | ||
3015 | goto nla_put_failure; | ||
3004 | if (sinfo->filled & STATION_INFO_BSS_PARAM) { | 3016 | if (sinfo->filled & STATION_INFO_BSS_PARAM) { |
3005 | bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); | 3017 | bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); |
3006 | if (!bss_param) | 3018 | if (!bss_param) |
@@ -3206,6 +3218,17 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) | |||
3206 | params.plink_state = | 3218 | params.plink_state = |
3207 | nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); | 3219 | nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); |
3208 | 3220 | ||
3221 | if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) { | ||
3222 | enum nl80211_mesh_power_mode pm = nla_get_u32( | ||
3223 | info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); | ||
3224 | |||
3225 | if (pm <= NL80211_MESH_POWER_UNKNOWN || | ||
3226 | pm > NL80211_MESH_POWER_MAX) | ||
3227 | return -EINVAL; | ||
3228 | |||
3229 | params.local_pm = pm; | ||
3230 | } | ||
3231 | |||
3209 | switch (dev->ieee80211_ptr->iftype) { | 3232 | switch (dev->ieee80211_ptr->iftype) { |
3210 | case NL80211_IFTYPE_AP: | 3233 | case NL80211_IFTYPE_AP: |
3211 | case NL80211_IFTYPE_AP_VLAN: | 3234 | case NL80211_IFTYPE_AP_VLAN: |
@@ -3213,6 +3236,8 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) | |||
3213 | /* disallow mesh-specific things */ | 3236 | /* disallow mesh-specific things */ |
3214 | if (params.plink_action) | 3237 | if (params.plink_action) |
3215 | return -EINVAL; | 3238 | return -EINVAL; |
3239 | if (params.local_pm) | ||
3240 | return -EINVAL; | ||
3216 | 3241 | ||
3217 | /* TDLS can't be set, ... */ | 3242 | /* TDLS can't be set, ... */ |
3218 | if (params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) | 3243 | if (params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) |
@@ -3265,6 +3290,8 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) | |||
3265 | /* disallow things sta doesn't support */ | 3290 | /* disallow things sta doesn't support */ |
3266 | if (params.plink_action) | 3291 | if (params.plink_action) |
3267 | return -EINVAL; | 3292 | return -EINVAL; |
3293 | if (params.local_pm) | ||
3294 | return -EINVAL; | ||
3268 | /* reject any changes other than AUTHORIZED */ | 3295 | /* reject any changes other than AUTHORIZED */ |
3269 | if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) | 3296 | if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) |
3270 | return -EINVAL; | 3297 | return -EINVAL; |
@@ -3922,7 +3949,11 @@ static int nl80211_get_mesh_config(struct sk_buff *skb, | |||
3922 | nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, | 3949 | nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, |
3923 | cur_params.dot11MeshHWMProotInterval) || | 3950 | cur_params.dot11MeshHWMProotInterval) || |
3924 | nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, | 3951 | nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, |
3925 | cur_params.dot11MeshHWMPconfirmationInterval)) | 3952 | cur_params.dot11MeshHWMPconfirmationInterval) || |
3953 | nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, | ||
3954 | cur_params.power_mode) || | ||
3955 | nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, | ||
3956 | cur_params.dot11MeshAwakeWindowDuration)) | ||
3926 | goto nla_put_failure; | 3957 | goto nla_put_failure; |
3927 | nla_nest_end(msg, pinfoattr); | 3958 | nla_nest_end(msg, pinfoattr); |
3928 | genlmsg_end(msg, hdr); | 3959 | genlmsg_end(msg, hdr); |
@@ -3961,6 +3992,8 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A | |||
3961 | [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, | 3992 | [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, |
3962 | [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 }, | 3993 | [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 }, |
3963 | [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 }, | 3994 | [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 }, |
3995 | [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 }, | ||
3996 | [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, | ||
3964 | }; | 3997 | }; |
3965 | 3998 | ||
3966 | static const struct nla_policy | 3999 | static const struct nla_policy |
@@ -4088,6 +4121,14 @@ do { \ | |||
4088 | 1, 65535, mask, | 4121 | 1, 65535, mask, |
4089 | NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, | 4122 | NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, |
4090 | nla_get_u16); | 4123 | nla_get_u16); |
4124 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, | ||
4125 | NL80211_MESH_POWER_ACTIVE, | ||
4126 | NL80211_MESH_POWER_MAX, | ||
4127 | mask, NL80211_MESHCONF_POWER_MODE, | ||
4128 | nla_get_u32); | ||
4129 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, | ||
4130 | 0, 65535, mask, | ||
4131 | NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); | ||
4091 | if (mask_out) | 4132 | if (mask_out) |
4092 | *mask_out = mask; | 4133 | *mask_out = mask; |
4093 | 4134 | ||