Previously, mesh power management functionality works only with kernel MPM. Because user space MPM did not report mesh peer AID to kernel, the kernel could not identify the bit in TIM element. So this patch adds mesh peer AID setting API.
Unified · Split
| @@ -780,6 +780,7 @@ enum station_parameters_apply_mask { · 779 unmodified lines | ||
| 780 | 780 | * (bitmask of BIT(NL80211_STA_FLAG_...)) |
| 781 | 781 | * @listen_interval: listen interval or -1 for no change |
| 782 | 782 | * @aid: AID or zero for no change |
| 783 | + * @peer_aid: mesh peer AID or zero for no change | |
| 783 | 784 | * @plink_action: plink action to take |
| 784 | 785 | * @plink_state: set the peer link state for a station |
| 785 | 786 | * @ht_capa: HT capabilities of station |
| @@ -811,6 +812,7 @@ struct station_parameters { · 25 unmodified lines | ||
| 811 | 812 | u32 sta_modify_mask; |
| 812 | 813 | int listen_interval; |
| 813 | 814 | u16 aid; |
| 815 | + u16 peer_aid; | |
| 814 | 816 | u8 supported_rates_len; |
| 815 | 817 | u8 plink_action; |
| 816 | 818 | u8 plink_state; |
| @@ -1864,6 +1864,9 @@ enum nl80211_commands { · 1863 unmodified lines | ||
| 1864 | 1864 | * mandatory. If this flag is not set, the duration is the maximum duration |
| 1865 | 1865 | * and the actual measurement duration may be shorter. |
| 1866 | 1866 | * |
| 1867 | + * @NL80211_ATTR_MESH_PEER_AID: Association ID for the mesh peer (u16). This is | |
| 1868 | + * used to pull the stored data for mesh peer in power save state. | |
| 1869 | + * | |
| 1867 | 1870 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available |
| 1868 | 1871 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| 1869 | 1872 | * @__NL80211_ATTR_AFTER_LAST: internal use |
| @@ -2256,6 +2259,8 @@ enum nl80211_attrs { · 386 unmodified lines | ||
| 2256 | 2259 | NL80211_ATTR_MEASUREMENT_DURATION, |
| 2257 | 2260 | NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY, |
| 2258 | 2261 | |
| 2262 | + NL80211_ATTR_MESH_PEER_AID, | |
| 2263 | + | |
| 2259 | 2264 | /* add attributes here, update the policy in nl80211.c */ |
| 2260 | 2265 | |
| 2261 | 2266 | __NL80211_ATTR_AFTER_LAST, |
| @@ -997,6 +997,7 @@ static void sta_apply_mesh_params(struct ieee80211_local *local, · 996 unmodified lines | ||
| 997 | 997 | if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) |
| 998 | 998 | changed = mesh_plink_inc_estab_count(sdata); |
| 999 | 999 | sta->mesh->plink_state = params->plink_state; |
| 1000 | + sta->mesh->aid = params->peer_aid; | |
| 1000 | 1001 | |
| 1001 | 1002 | ieee80211_mps_sta_status_update(sta); |
| 1002 | 1003 | changed |= ieee80211_mps_set_sta_local_pm(sta, |
| @@ -4446,6 +4446,12 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) · 4445 unmodified lines | ||
| 4446 | 4446 | nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); |
| 4447 | 4447 | if (params.plink_state >= NUM_NL80211_PLINK_STATES) |
| 4448 | 4448 | return -EINVAL; |
| 4449 | + if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) { | |
| 4450 | + params.peer_aid = nla_get_u16( | |
| 4451 | + info->attrs[NL80211_ATTR_MESH_PEER_AID]); | |
| 4452 | + if (params.peer_aid > IEEE80211_MAX_AID) | |
| 4453 | + return -EINVAL; | |
| 4454 | + } | |
| 4449 | 4455 | params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; |
| 4450 | 4456 | } |
| 4451 | 4457 | |