diff options
| author | vamsi krishna <vamsin@qti.qualcomm.com> | 2016-12-06 18:06:40 +0530 |
|---|---|---|
| committer | Ashwini Patil <apati@codeaurora.org> | 2016-12-08 15:10:27 +0530 |
| commit | ad15e061fae0cd29943572fb68f8b375fd9ecacc (patch) | |
| tree | de2f25bc1aca8f28ea6891115c5be92db79eb036 /net | |
| parent | 5142c18bae30439decd1c139999b54197e2aae91 (diff) | |
cfg80211: Add support to update connection parameters
Add functionality to update the connection parameters when in connected
state, so that driver/firmware uses the updated parameters for
subsequent roaming. This is for drivers that support internal BSS
selection and roaming. The new command does not change the current
association state, i.e., it can be used to update IE contents for future
(re)associations without causing an immediate disassociation or
reassociation with the current BSS.
This commit implements the required functionality for updating IEs for
(Re)Association Request frame only. Other parameters can be added in
future when required.
Signed-off-by: vamsi krishna <vamsin@qti.qualcomm.com>
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Git-commit: 088e8df82f91a24728d49d9532cab7ebdee5117f
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git
Change-Id: I184b8e13bc5f7e2ed21e5337673c6ba82cd2f4fe
CRs-Fixed: 1097836
[apati@codeaurora.org: backport to 4.4-This commit includes the
changes from following commits in include/uapi/linux/nl80211.h to compile
for msm-4.4.
cb3b7d87652aeb37cfb5295a6157a3280dae10cb :
cfg80211: add start / stop NAN commands.
a442b761b24b6886f9a4e2ff5f8cb4824c96526b :
cfg80211: add add_nan_func / del_nan_func.
a5a9dcf291e1e541243878eed2d73a74006fa1f1 :
cfg80211: allow the user space to change current NAN configuration.
50bcd31d9992e99c231820f5276e70346cbfbc51 :
cfg80211: provide a function to report a match for NAN.
ce0ce13a1c89ff8b94b7f8fb32eb4c43e111c82e :
cfg80211: configure multicast to unicast for AP interfaces.
c6e6a0c8be575c830a97b1942dabeab70f423fe0 :
nl80211: Add API to support VHT MU-MIMO air sniffer.
1d76250bd34af86c6498fc51e50cab3bfbbeceaa :
nl80211: support beacon report scanning.
7d27a0ba7adc8ef30c2aae7592fce4c162aee4df :
cfg80211: Add mesh peer AID setting API.
348bd456699801920a309c66e382380809fbdf41 :
cfg80211: Add KEK/nonces for FILS association frames.]
Signed-off-by: Ashwini Patil<apati@codeaurora.org>
Diffstat (limited to 'net')
| -rw-r--r-- | net/wireless/nl80211.c | 40 | ||||
| -rw-r--r-- | net/wireless/rdev-ops.h | 12 | ||||
| -rw-r--r-- | net/wireless/trace.h | 18 |
3 files changed, 70 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 375d6c1732fa..858aef0775ea 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1551,6 +1551,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, if (rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) CMD(add_tx_ts, ADD_TX_TS); + CMD(update_connect_params, UPDATE_CONNECT_PARAMS); } /* add into the if now */ #undef CMD @@ -8329,6 +8330,37 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) return err; } +static int nl80211_update_connect_params(struct sk_buff *skb, + struct genl_info *info) +{ + struct cfg80211_connect_params connect = {}; + struct cfg80211_registered_device *rdev = info->user_ptr[0]; + struct net_device *dev = info->user_ptr[1]; + struct wireless_dev *wdev = dev->ieee80211_ptr; + u32 changed = 0; + int ret; + + if (!rdev->ops->update_connect_params) + return -EOPNOTSUPP; + + if (info->attrs[NL80211_ATTR_IE]) { + if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) + return -EINVAL; + connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); + connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); + changed |= UPDATE_ASSOC_IES; + } + + wdev_lock(dev->ieee80211_ptr); + if (!wdev->current_bss) + ret = -ENOLINK; + else + ret = rdev_update_connect_params(rdev, dev, &connect, changed); + wdev_unlock(dev->ieee80211_ptr); + + return ret; +} + static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) { struct cfg80211_registered_device *rdev = info->user_ptr[0]; @@ -11206,6 +11238,14 @@ static const struct genl_ops nl80211_ops[] = { NL80211_FLAG_NEED_RTNL, }, { + .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, + .doit = nl80211_update_connect_params, + .policy = nl80211_policy, + .flags = GENL_ADMIN_PERM, + .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | + NL80211_FLAG_NEED_RTNL, + }, + { .cmd = NL80211_CMD_DISCONNECT, .doit = nl80211_disconnect, .policy = nl80211_policy, diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index 966d15247030..b3675ce67a8b 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -489,6 +489,18 @@ static inline int rdev_connect(struct cfg80211_registered_device *rdev, return ret; } +static inline int +rdev_update_connect_params(struct cfg80211_registered_device *rdev, + struct net_device *dev, + struct cfg80211_connect_params *sme, u32 changed) +{ + int ret; + trace_rdev_update_connect_params(&rdev->wiphy, dev, sme, changed); + ret = rdev->ops->update_connect_params(&rdev->wiphy, dev, sme, changed); + trace_rdev_return_int(&rdev->wiphy, ret); + return ret; +} + static inline int rdev_disconnect(struct cfg80211_registered_device *rdev, struct net_device *dev, u16 reason_code) { diff --git a/net/wireless/trace.h b/net/wireless/trace.h index ca24294fe463..500d72ac719a 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h @@ -1243,6 +1243,24 @@ TRACE_EVENT(rdev_connect, __entry->wpa_versions, __entry->flags, MAC_PR_ARG(prev_bssid)) ); +TRACE_EVENT(rdev_update_connect_params, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, + struct cfg80211_connect_params *sme, u32 changed), + TP_ARGS(wiphy, netdev, sme, changed), + TP_STRUCT__entry( + WIPHY_ENTRY + NETDEV_ENTRY + __field(u32, changed) + ), + TP_fast_assign( + WIPHY_ASSIGN; + NETDEV_ASSIGN; + __entry->changed = changed; + ), + TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", parameters changed: %u", + WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->changed) +); + TRACE_EVENT(rdev_set_cqm_rssi_config, TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, s32 rssi_thold, |
