diff options
| author | Ashish Kumar Dhanotiya <adhanoti@codeaurora.org> | 2018-01-16 10:55:16 +0530 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2018-01-17 06:30:07 -0800 |
| commit | 2dadad5d73daecec17ecfa6b1d813355be347ee6 (patch) | |
| tree | f63078146375c7f3b1aadcaa5445df043781ca77 | |
| parent | 4c49d0ef7c3be23fd3913095c0064394255121f6 (diff) | |
qcacld-3.0: Send STA authorized status to supplicant for AP
Currently there is no support from driver to send STA authorized
event to supplicant.
Use QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES vendor command to
send STA authorized event to supplicant.
Change-Id: I46416949f04dd28a1713cbebf1f7d0e84b5efda2
CRs-Fixed: 2172816
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 72 | ||||
| -rw-r--r-- | uapi/linux/qca_vendor.h | 3 |
2 files changed, 75 insertions, 0 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 0fa9f313d604..3a0a0287baa3 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -1252,6 +1252,10 @@ static const struct nl80211_vendor_cmd_info wlan_hdd_cfg80211_vendor_events[] = .vendor_id = QCA_NL80211_VENDOR_ID, .subcmd = QCA_NL80211_VENDOR_SUBCMD_HANG, }, + [QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX] = { + .vendor_id = QCA_NL80211_VENDOR_ID, + .subcmd = QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES, + }, }; /** @@ -14595,6 +14599,67 @@ static bool wlan_hdd_is_duplicate_channel(uint8_t *arr, } #endif +/* + *wlan_hdd_send_sta_authorized_event: Function to send station authorized + *event to user space in case of SAP + *pAdapter: Pointer to the adapter + *@pHddCtx: HDD Context + *@mac_addr: MAC address of the STA for whic the Authorized event needs to + *be sent + *This api is used to send station authorized event to user space + */ +static QDF_STATUS wlan_hdd_send_sta_authorized_event( + hdd_adapter_t *pAdapter, + hdd_context_t *pHddCtx, + struct qdf_mac_addr mac_addr) +{ + struct sk_buff *vendor_event; + uint32_t sta_flags = 0; + QDF_STATUS status; + + ENTER(); + + if (!pHddCtx) { + hdd_err("HDD context is null"); + return -EINVAL; + } + + vendor_event = + cfg80211_vendor_event_alloc( + pHddCtx->wiphy, &pAdapter->wdev, sizeof(sta_flags) + + QDF_MAC_ADDR_SIZE + NLMSG_HDRLEN, + QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX, + GFP_KERNEL); + if (!vendor_event) { + hdd_err("cfg80211_vendor_event_alloc failed"); + return -EINVAL; + } + + sta_flags |= BIT(NL80211_STA_FLAG_AUTHORIZED); + + status = nla_put_u32(vendor_event, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS, + sta_flags); + if (status) { + hdd_err("STA flag put fails"); + kfree_skb(vendor_event); + return QDF_STATUS_E_FAILURE; + } + status = nla_put(vendor_event, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_MAC, + QDF_MAC_ADDR_SIZE, mac_addr.bytes); + if (status) { + hdd_err("STA MAC put fails"); + kfree_skb(vendor_event); + return QDF_STATUS_E_FAILURE; + } + + cfg80211_vendor_event(vendor_event, GFP_KERNEL); + + EXIT(); + return 0; +} + /** * __wlan_hdd_change_station() - change station * @wiphy: Pointer to the wiphy structure @@ -14666,6 +14731,13 @@ static int __wlan_hdd_change_station(struct wiphy *wiphy, hdd_debug("Not able to change TL state to AUTHENTICATED"); return -EINVAL; } + status = wlan_hdd_send_sta_authorized_event( + pAdapter, + pHddCtx, + STAMacAddress); + if (status != QDF_STATUS_SUCCESS) { + return -EINVAL; + } } } else if ((pAdapter->device_mode == QDF_STA_MODE) || (pAdapter->device_mode == QDF_P2P_CLIENT_MODE)) { diff --git a/uapi/linux/qca_vendor.h b/uapi/linux/qca_vendor.h index ec460be881c3..80640fac266e 100644 --- a/uapi/linux/qca_vendor.h +++ b/uapi/linux/qca_vendor.h @@ -784,6 +784,7 @@ enum qca_nl80211_vendor_subcmds_index { QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX, QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX, QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX, + QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX, }; /** @@ -2860,6 +2861,8 @@ enum qca_wlan_vendor_attr_link_properties { QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_NSS = 1, QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS = 2, QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ = 3, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS = 4, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_MAC = 5, /* KEEP LAST */ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST, |
