|
@@ -930,19 +930,62 @@ hdd_is_qos_action_frame(uint8_t *pb_frames, uint32_t frame_len)
|
|
|
WLAN_HDD_QOS_MAP_CONFIGURE));
|
|
|
}
|
|
|
|
|
|
+#if defined(WLAN_FEATURE_SAE) && defined(CFG80211_EXTERNAL_AUTH_AP_SUPPORT)
|
|
|
+/**
|
|
|
+ * wlan_hdd_set_rxmgmt_external_auth_flag() - Set the EXTERNAL_AUTH flag
|
|
|
+ * @nl80211_flag: flags to be sent to nl80211 from enum nl80211_rxmgmt_flags
|
|
|
+ *
|
|
|
+ * Set the flag NL80211_RXMGMT_FLAG_EXTERNAL_AUTH if supported.
|
|
|
+ */
|
|
|
+static void
|
|
|
+wlan_hdd_set_rxmgmt_external_auth_flag(enum nl80211_rxmgmt_flags *nl80211_flag)
|
|
|
+{
|
|
|
+ *nl80211_flag |= NL80211_RXMGMT_FLAG_EXTERNAL_AUTH;
|
|
|
+}
|
|
|
+#else
|
|
|
+static void
|
|
|
+wlan_hdd_set_rxmgmt_external_auth_flag(enum nl80211_rxmgmt_flags *nl80211_flag)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/**
|
|
|
+ * wlan_hdd_cfg80211_convert_rxmgmt_flags() - Convert RXMGMT value
|
|
|
+ * @nl80211_flag: Flags to be sent to nl80211 from enum nl80211_rxmgmt_flags
|
|
|
+ * @flag: flags set by driver(SME/PE) from enum rxmgmt_flags
|
|
|
+ *
|
|
|
+ * Convert driver internal RXMGMT flag value to nl80211 defined RXMGMT flag
|
|
|
+ * Return: 0 on success, -EINVAL on invalid value
|
|
|
+ */
|
|
|
+static int
|
|
|
+wlan_hdd_cfg80211_convert_rxmgmt_flags(enum rxmgmt_flags flag,
|
|
|
+ enum nl80211_rxmgmt_flags *nl80211_flag)
|
|
|
+{
|
|
|
+ int ret = -EINVAL;
|
|
|
+
|
|
|
+ if (flag & RXMGMT_FLAG_EXTERNAL_AUTH) {
|
|
|
+ wlan_hdd_set_rxmgmt_external_auth_flag(nl80211_flag);
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
|
|
|
- uint32_t frm_len,
|
|
|
- uint8_t *pb_frames,
|
|
|
- uint8_t frameType, uint32_t rxChan, int8_t rxRssi)
|
|
|
+ uint32_t frm_len,
|
|
|
+ uint8_t *pb_frames,
|
|
|
+ uint8_t frame_type, uint32_t rx_chan,
|
|
|
+ int8_t rx_rssi, enum rxmgmt_flags rx_flags)
|
|
|
{
|
|
|
uint16_t freq;
|
|
|
uint8_t type = 0;
|
|
|
- uint8_t subType = 0;
|
|
|
+ uint8_t sub_type = 0;
|
|
|
struct hdd_context *hdd_ctx;
|
|
|
uint8_t *dest_addr;
|
|
|
+ enum nl80211_rxmgmt_flags nl80211_flag = 0;
|
|
|
|
|
|
hdd_debug("Frame Type = %d Frame Length = %d",
|
|
|
- frameType, frm_len);
|
|
|
+ frame_type, frm_len);
|
|
|
|
|
|
if (NULL == adapter) {
|
|
|
hdd_err("adapter is NULL");
|
|
@@ -961,11 +1004,11 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
|
|
|
}
|
|
|
|
|
|
type = WLAN_HDD_GET_TYPE_FRM_FC(pb_frames[0]);
|
|
|
- subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(pb_frames[0]);
|
|
|
+ sub_type = WLAN_HDD_GET_SUBTYPE_FRM_FC(pb_frames[0]);
|
|
|
|
|
|
/* Get adapter from Destination mac address of the frame */
|
|
|
if ((type == SIR_MAC_MGMT_FRAME) &&
|
|
|
- (subType != SIR_MAC_MGMT_PROBE_REQ) &&
|
|
|
+ (sub_type != SIR_MAC_MGMT_PROBE_REQ) &&
|
|
|
!qdf_is_macaddr_broadcast(
|
|
|
(struct qdf_mac_addr *)&pb_frames[WLAN_HDD_80211_FRM_DA_OFFSET])) {
|
|
|
dest_addr = &pb_frames[WLAN_HDD_80211_FRM_DA_OFFSET];
|
|
@@ -982,7 +1025,7 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
|
|
|
hdd_err("adapter for action frame is NULL Macaddr = "
|
|
|
MAC_ADDRESS_STR, MAC_ADDR_ARRAY(dest_addr));
|
|
|
hdd_debug("Frame Type = %d Frame Length = %d subType = %d",
|
|
|
- frameType, frm_len, subType);
|
|
|
+ frame_type, frm_len, sub_type);
|
|
|
/*
|
|
|
* We will receive broadcast management frames
|
|
|
* in OCB mode
|
|
@@ -1013,11 +1056,11 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
|
|
|
|
|
|
/* Channel indicated may be wrong. TODO */
|
|
|
/* Indicate an action frame. */
|
|
|
- if (rxChan <= MAX_NO_OF_2_4_CHANNELS)
|
|
|
- freq = ieee80211_channel_to_frequency(rxChan,
|
|
|
+ if (rx_chan <= MAX_NO_OF_2_4_CHANNELS)
|
|
|
+ freq = ieee80211_channel_to_frequency(rx_chan,
|
|
|
NL80211_BAND_2GHZ);
|
|
|
else
|
|
|
- freq = ieee80211_channel_to_frequency(rxChan,
|
|
|
+ freq = ieee80211_channel_to_frequency(rx_chan,
|
|
|
NL80211_BAND_5GHZ);
|
|
|
|
|
|
if (hdd_is_qos_action_frame(pb_frames, frm_len))
|
|
@@ -1029,18 +1072,22 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
|
|
|
hdd_debug("Indicate Frame over NL80211 sessionid : %d, idx :%d",
|
|
|
adapter->vdev_id, adapter->dev->ifindex);
|
|
|
|
|
|
+ if (wlan_hdd_cfg80211_convert_rxmgmt_flags(rx_flags, &nl80211_flag))
|
|
|
+ hdd_debug("Failed to convert RXMGMT flags :0x%x to nl80211 format",
|
|
|
+ rx_flags);
|
|
|
+
|
|
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
|
|
|
cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr,
|
|
|
- freq, rxRssi * 100, pb_frames,
|
|
|
- frm_len, NL80211_RXMGMT_FLAG_ANSWERED);
|
|
|
+ freq, rx_rssi * 100, pb_frames,
|
|
|
+ frm_len, NL80211_RXMGMT_FLAG_ANSWERED | nl80211_flag);
|
|
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0))
|
|
|
cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr,
|
|
|
- freq, rxRssi * 100, pb_frames,
|
|
|
+ freq, rx_rssi * 100, pb_frames,
|
|
|
frm_len, NL80211_RXMGMT_FLAG_ANSWERED,
|
|
|
GFP_ATOMIC);
|
|
|
#else
|
|
|
cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr, freq,
|
|
|
- rxRssi * 100,
|
|
|
+ rx_rssi * 100,
|
|
|
pb_frames, frm_len, GFP_ATOMIC);
|
|
|
#endif /* LINUX_VERSION_CODE */
|
|
|
}
|