From 277ae9beedc3a0e98166fc5f3a67d801873df620 Mon Sep 17 00:00:00 2001 From: Ravi Joshi Date: Fri, 13 Nov 2015 11:30:43 -0800 Subject: qcacld-3.0: Add support to indicate subnet change status to user space LFR3 to indicate the change in IP subnet to user space (supplicant). This enables the DHCP refresh in case of IP subnet change during roaming. Change-Id: I9842a28461346fe97ab39f5a11ae504f2e32fa16 CRs-Fixed: 876335 --- core/hdd/src/wlan_hdd_cfg80211.c | 20 +++++++++++++++++++- core/hdd/src/wlan_hdd_cfg80211.h | 2 ++ core/sme/inc/csr_api.h | 1 + core/sme/inc/csr_internal.h | 7 +++++++ core/sme/src/csr/csr_api_roam.c | 3 +++ 5 files changed, 32 insertions(+), 1 deletion(-) 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, -- cgit v1.2.3