aboutsummaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-09-30 14:43:01 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-09-30 14:43:00 -0700
commite4b6902a42de5f015867363f670aaed825066118 (patch)
tree5edd47f8afff39678a88c2f1cb94f9d3db43a257 /net
parent23862142d6d6fd405e49c1552f5390d0b4d35be5 (diff)
parentc03321683c20f65ff5803b6459a7e3165233d613 (diff)
downloadqcom-msm-v3.10-e4b6902a42de5f015867363f670aaed825066118.tar.gz
Merge "cfg80211: Pass PTK as part of key management offload completion"
Diffstat (limited to 'net')
-rw-r--r--net/wireless/core.h5
-rw-r--r--net/wireless/nl80211.c55
-rw-r--r--net/wireless/util.c4
3 files changed, 60 insertions, 4 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 6126920e652..508a1fae008 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -244,6 +244,8 @@ struct cfg80211_event {
struct {
enum nl80211_authorization_status auth_status;
u8 key_replay_ctr[NL80211_KEY_REPLAY_CTR_LEN];
+ u8 ptk_kck[NL80211_KEY_LEN_PTK_KCK];
+ u8 ptk_kek[NL80211_KEY_LEN_PTK_KEK];
} au;
};
};
@@ -403,7 +405,8 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev);
void __cfg80211_authorization_event(struct net_device *dev,
enum nl80211_authorization_status auth_status,
- const u8 *key_replay_ctr);
+ const u8 *key_replay_ctr, const u8 *ptk_kck,
+ const u8 *ptk_kek);
void cfg80211_conn_work(struct work_struct *work);
void cfg80211_sme_failed_assoc(struct wireless_dev *wdev);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 17550dfa2a4..f8763737989 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -400,6 +400,10 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
[NL80211_ATTR_PMK] = { .type = NLA_BINARY,
.len = NL80211_KEY_LEN_PMK },
[NL80211_ATTR_PMK_LEN] = { .type = NLA_U32 },
+ [NL80211_ATTR_PTK_KCK] = { .type = NLA_BINARY,
+ .len = NL80211_KEY_LEN_PTK_KCK },
+ [NL80211_ATTR_PTK_KEK] = { .type = NLA_BINARY,
+ .len = NL80211_KEY_LEN_PTK_KEK },
};
/* policy for the key attributes */
@@ -11274,7 +11278,8 @@ EXPORT_SYMBOL(cfg80211_ap_stopped);
void __cfg80211_authorization_event(struct net_device *dev,
enum nl80211_authorization_status auth_status,
- const u8 *key_replay_ctr)
+ const u8 *key_replay_ctr, const u8 *ptk_kck,
+ const u8 *ptk_kek)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
@@ -11296,7 +11301,11 @@ void __cfg80211_authorization_event(struct net_device *dev,
nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
nla_put_u8(msg, NL80211_ATTR_AUTHORIZATION_STATUS, auth_status) ||
nla_put(msg, NL80211_ATTR_KEY_REPLAY_CTR,
- NL80211_KEY_REPLAY_CTR_LEN, key_replay_ctr))
+ NL80211_KEY_REPLAY_CTR_LEN, key_replay_ctr) ||
+ nla_put(msg, NL80211_ATTR_PTK_KCK, NL80211_KEY_LEN_PTK_KCK,
+ ptk_kck) ||
+ nla_put(msg, NL80211_ATTR_PTK_KEK, NL80211_KEY_LEN_PTK_KEK,
+ ptk_kek))
goto nla_put_failure;
err = genlmsg_end(msg, hdr);
@@ -11346,6 +11355,48 @@ void cfg80211_authorization_event(struct net_device *dev,
}
EXPORT_SYMBOL(cfg80211_authorization_event);
+void cfg80211_key_mgmt_auth(struct net_device *dev,
+ struct cfg80211_auth_params *auth_params,
+ gfp_t gfp)
+{
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
+ struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+ struct cfg80211_event *ev;
+ unsigned long flags;
+
+ /* Valid only in SME_CONNECTED state */
+ if (wdev->sme_state != CFG80211_SME_CONNECTED)
+ return;
+
+ ev = kzalloc(sizeof(*ev), gfp);
+ if (!ev)
+ return;
+
+ trace_cfg80211_authorization_event(wdev->wiphy, dev,
+ auth_params->status);
+
+ ev->type = EVENT_AUTHORIZATION;
+ ev->au.auth_status = auth_params->status;
+ if (auth_params->key_replay_ctr) {
+ memcpy(ev->au.key_replay_ctr, auth_params->key_replay_ctr,
+ NL80211_KEY_REPLAY_CTR_LEN);
+ }
+ if (auth_params->ptk_kck) {
+ memcpy(ev->au.ptk_kck, auth_params->ptk_kck,
+ NL80211_KEY_LEN_PTK_KCK);
+ }
+ if (auth_params->ptk_kek) {
+ memcpy(ev->au.ptk_kek, auth_params->ptk_kek,
+ NL80211_KEY_LEN_PTK_KEK);
+ }
+
+ spin_lock_irqsave(&wdev->event_lock, flags);
+ list_add_tail(&ev->list, &wdev->event_list);
+ spin_unlock_irqrestore(&wdev->event_lock, flags);
+ queue_work(cfg80211_wq, &rdev->event_work);
+}
+EXPORT_SYMBOL(cfg80211_key_mgmt_auth);
+
/* initialisation/exit functions */
int nl80211_init(void)
diff --git a/net/wireless/util.c b/net/wireless/util.c
index e674a6e5f06..1b6f49020e6 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -793,7 +793,9 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
case EVENT_AUTHORIZATION:
__cfg80211_authorization_event(wdev->netdev,
ev->au.auth_status,
- ev->au.key_replay_ctr);
+ ev->au.key_replay_ctr,
+ ev->au.ptk_kck,
+ ev->au.ptk_kek);
break;
}
wdev_unlock(wdev);