summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c20
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.h2
-rw-r--r--core/sme/inc/csr_api.h1
-rw-r--r--core/sme/inc/csr_internal.h7
-rw-r--r--core/sme/src/csr/csr_api_roam.c3
5 files changed, 32 insertions, 1 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 9f431ae95cd1..13c76610e60c 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -3012,7 +3012,7 @@ int wlan_hdd_send_roam_auth_event(hdd_context_t *hdd_ctx_ptr, uint8_t *bssid,
ETH_ALEN + req_rsn_len + rsp_rsn_len +
sizeof(uint8_t) + SIR_REPLAY_CTR_LEN +
SIR_KCK_KEY_LEN + SIR_KCK_KEY_LEN +
- (7 * NLMSG_HDRLEN),
+ sizeof(uint8_t) + (8 * NLMSG_HDRLEN),
QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX,
GFP_KERNEL);
@@ -3057,6 +3057,24 @@ int wlan_hdd_send_roam_auth_event(hdd_context_t *hdd_ctx_ptr, uint8_t *bssid,
}
}
+ hddLog(CDF_TRACE_LEVEL_DEBUG, FL("Subnet Change Status = %d"),
+ roam_info_ptr->subnet_change_status);
+
+ /*
+ * Add subnet change status if subnet has changed
+ * 0 = unchanged
+ * 1 = changed
+ * 2 = unknown
+ */
+ if (roam_info_ptr->subnet_change_status) {
+ if (nla_put_u8(skb,
+ QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS,
+ roam_info_ptr->subnet_change_status)) {
+ hddLog(CDF_TRACE_LEVEL_ERROR, FL("nla put fail"));
+ goto nla_put_failure;
+ }
+ }
+
cfg80211_vendor_event(skb, GFP_KERNEL);
return 0;
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index 34134d3b9ff4..f86e36b96b65 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -1554,6 +1554,7 @@ enum qca_wlan_vendor_attr_set_no_dfs_flag {
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR: Replay Counter
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK: KCK of the PTK
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK: KEK of the PTK
+ * @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS: subnet change status
*/
enum qca_wlan_vendor_attr_roam_auth {
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID = 0,
@@ -1564,6 +1565,7 @@ enum qca_wlan_vendor_attr_roam_auth {
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK,
+ QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX =
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST - 1
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index bf2162d5a098..0ba6b035acf7 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -1351,6 +1351,7 @@ typedef struct tagCsrRoamInfo {
uint8_t kck[SIR_KCK_KEY_LEN];
uint8_t kek[SIR_KEK_KEY_LEN];
uint8_t replay_ctr[SIR_REPLAY_CTR_LEN];
+ uint8_t subnet_change_status;
#endif
tSirSmeChanInfo chan_info;
uint8_t target_channel;
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index 830ff6b67a15..0dc1db38f7a8 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -1202,6 +1202,13 @@ typedef struct tagCsrRoamStruct {
(eCsrLostLink2 == (pCommand)->u.roamCmd.roamReason) || \
(eCsrLostLink3 == (pCommand)->u.roamCmd.roamReason))
+#ifdef FEATURE_LFR_SUBNET_DETECTION
+/* bit-4 and bit-5 indicate the subnet status */
+#define CSR_GET_SUBNET_STATUS(roam_reason) (((roam_reason) & 0x30) >> 4)
+#else
+#define CSR_GET_SUBNET_STATUS(roam_reason) (0)
+#endif
+
CDF_STATUS csr_get_channel_and_power_list(tpAniSirGlobal pMac);
CDF_STATUS csrScanFilter11dResult(tpAniSirGlobal pMac);
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 28062cb770d8..5ac222dabd40 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -6440,6 +6440,9 @@ static void csr_roam_process_join_res(tpAniSirGlobal mac_ctx,
FL
("LFR3: Copy KCK, KEK and Replay Ctr"));
}
+
+ roam_info.subnet_change_status =
+ CSR_GET_SUBNET_STATUS(roam_offload_params->roamReason);
#endif
csr_roam_call_callback(mac_ctx, session_id, &roam_info,
cmd->u.roamCmd.roamId,