cfg80211: Add mesh peer AID setting API
authorMasashi Honma <masashi.honma@gmail.com>
Fri, 1 Jul 2016 01:19:34 +0000 (10:19 +0900)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 6 Jul 2016 13:04:52 +0000 (15:04 +0200)
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.

Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/cfg.c
net/wireless/nl80211.c

index e2658e392a1f82d37cd88ba8c935f9a092a5a238..9c23f4d33e06c1ad1dab246b822d5dcc76c854ac 100644 (file)
@@ -780,6 +780,7 @@ enum station_parameters_apply_mask {
  *     (bitmask of BIT(NL80211_STA_FLAG_...))
  * @listen_interval: listen interval or -1 for no change
  * @aid: AID or zero for no change
+ * @peer_aid: mesh peer AID or zero for no change
  * @plink_action: plink action to take
  * @plink_state: set the peer link state for a station
  * @ht_capa: HT capabilities of station
@@ -811,6 +812,7 @@ struct station_parameters {
        u32 sta_modify_mask;
        int listen_interval;
        u16 aid;
+       u16 peer_aid;
        u8 supported_rates_len;
        u8 plink_action;
        u8 plink_state;
index b39ccab45333d7ee860a98bb14d00f6b59e1345a..2206941514345345128a1a46819a337f4ce812ed 100644 (file)
@@ -1864,6 +1864,9 @@ enum nl80211_commands {
  *     mandatory. If this flag is not set, the duration is the maximum duration
  *     and the actual measurement duration may be shorter.
  *
+ * @NL80211_ATTR_MESH_PEER_AID: Association ID for the mesh peer (u16). This is
+ *     used to pull the stored data for mesh peer in power save state.
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2256,6 +2259,8 @@ enum nl80211_attrs {
        NL80211_ATTR_MEASUREMENT_DURATION,
        NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY,
 
+       NL80211_ATTR_MESH_PEER_AID,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
index 0c12e4001f192a329ca62e4260e21598c284dad1..47e99ab8d97a93697790a5de0c373af16869bad7 100644 (file)
@@ -997,6 +997,7 @@ static void sta_apply_mesh_params(struct ieee80211_local *local,
                        if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
                                changed = mesh_plink_inc_estab_count(sdata);
                        sta->mesh->plink_state = params->plink_state;
+                       sta->mesh->aid = params->peer_aid;
 
                        ieee80211_mps_sta_status_update(sta);
                        changed |= ieee80211_mps_set_sta_local_pm(sta,
index c53b5462ed001ccb2dd541301ce3398210b2fa4a..5782f718d567983486d0cdf10ee2e3cbf1fc8dbd 100644 (file)
@@ -4446,6 +4446,12 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
                        nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
                if (params.plink_state >= NUM_NL80211_PLINK_STATES)
                        return -EINVAL;
+               if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) {
+                       params.peer_aid = nla_get_u16(
+                               info->attrs[NL80211_ATTR_MESH_PEER_AID]);
+                       if (params.peer_aid > IEEE80211_MAX_AID)
+                               return -EINVAL;
+               }
                params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
        }