|
@@ -932,6 +932,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
|
struct cfg80211_event *ev;
|
|
|
unsigned long flags;
|
|
|
+ u8 *next;
|
|
|
|
|
|
if (!info->bss) {
|
|
|
info->bss = cfg80211_get_bss(wdev->wiphy, info->channel,
|
|
@@ -944,19 +945,52 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
|
|
|
if (WARN_ON(!info->bss))
|
|
|
return;
|
|
|
|
|
|
- ev = kzalloc(sizeof(*ev) + info->req_ie_len + info->resp_ie_len, gfp);
|
|
|
+ ev = kzalloc(sizeof(*ev) + info->req_ie_len + info->resp_ie_len +
|
|
|
+ info->fils.kek_len + info->fils.pmk_len +
|
|
|
+ (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
|
|
|
if (!ev) {
|
|
|
cfg80211_put_bss(wdev->wiphy, info->bss);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
ev->type = EVENT_ROAMED;
|
|
|
- ev->rm.req_ie = ((u8 *)ev) + sizeof(*ev);
|
|
|
- ev->rm.req_ie_len = info->req_ie_len;
|
|
|
- memcpy((void *)ev->rm.req_ie, info->req_ie, info->req_ie_len);
|
|
|
- ev->rm.resp_ie = ((u8 *)ev) + sizeof(*ev) + info->req_ie_len;
|
|
|
- ev->rm.resp_ie_len = info->resp_ie_len;
|
|
|
- memcpy((void *)ev->rm.resp_ie, info->resp_ie, info->resp_ie_len);
|
|
|
+ next = ((u8 *)ev) + sizeof(*ev);
|
|
|
+ if (info->req_ie_len) {
|
|
|
+ ev->rm.req_ie = next;
|
|
|
+ ev->rm.req_ie_len = info->req_ie_len;
|
|
|
+ memcpy((void *)ev->rm.req_ie, info->req_ie, info->req_ie_len);
|
|
|
+ next += info->req_ie_len;
|
|
|
+ }
|
|
|
+ if (info->resp_ie_len) {
|
|
|
+ ev->rm.resp_ie = next;
|
|
|
+ ev->rm.resp_ie_len = info->resp_ie_len;
|
|
|
+ memcpy((void *)ev->rm.resp_ie, info->resp_ie,
|
|
|
+ info->resp_ie_len);
|
|
|
+ next += info->resp_ie_len;
|
|
|
+ }
|
|
|
+ if (info->fils.kek_len) {
|
|
|
+ ev->rm.fils.kek = next;
|
|
|
+ ev->rm.fils.kek_len = info->fils.kek_len;
|
|
|
+ memcpy((void *)ev->rm.fils.kek, info->fils.kek,
|
|
|
+ info->fils.kek_len);
|
|
|
+ next += info->fils.kek_len;
|
|
|
+ }
|
|
|
+ if (info->fils.pmk_len) {
|
|
|
+ ev->rm.fils.pmk = next;
|
|
|
+ ev->rm.fils.pmk_len = info->fils.pmk_len;
|
|
|
+ memcpy((void *)ev->rm.fils.pmk, info->fils.pmk,
|
|
|
+ info->fils.pmk_len);
|
|
|
+ next += info->fils.pmk_len;
|
|
|
+ }
|
|
|
+ if (info->fils.pmkid) {
|
|
|
+ ev->rm.fils.pmkid = next;
|
|
|
+ memcpy((void *)ev->rm.fils.pmkid, info->fils.pmkid,
|
|
|
+ WLAN_PMKID_LEN);
|
|
|
+ next += WLAN_PMKID_LEN;
|
|
|
+ }
|
|
|
+ ev->rm.fils.update_erp_next_seq_num = info->fils.update_erp_next_seq_num;
|
|
|
+ if (info->fils.update_erp_next_seq_num)
|
|
|
+ ev->rm.fils.erp_next_seq_num = info->fils.erp_next_seq_num;
|
|
|
ev->rm.bss = info->bss;
|
|
|
|
|
|
spin_lock_irqsave(&wdev->event_lock, flags);
|