aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Porsch <marco@cozybit.com>2013-01-07 10:04:52 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-01-16 16:48:04 -0500
commit3b1c5a5307fb5277f395efdcf330c064d79df07d (patch)
tree9aca9007c05a70a0bce2c18c3c60fcfda1b7923d
parent9bdbf04db099c11bbbaea9dcea7465c508531fb8 (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.h21
-rw-r--r--include/uapi/linux/nl80211.h47
-rw-r--r--net/wireless/mesh.c3
-rw-r--r--net/wireless/nl80211.c43
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 */
614struct station_parameters { 616struct 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 */
659enum station_info_flags { 665enum 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 */
795struct station_info { 807struct 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 */
999struct mesh_config { 1018struct 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
2285enum 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 */
2351enum nl80211_meshconf_params { 2396enum 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
50const struct mesh_config default_mesh_config = { 51const 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
77const struct mesh_setup default_mesh_setup = { 80const 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
3966static const struct nla_policy 3999static 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