wlan: Protect cfg80211_ops functions from SSR
Protect cfg80211 ops functions from accessing deallocated
and unitialized data structures while SSR is in progress.
Change-Id: Icc05ce811aa1e04d8ae942889132c95ec8dbade6
CRs-Fixed: 681873
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 9f0a319..df94de7 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -10537,10 +10537,10 @@
}
/*
- * FUNCTION: wlan_hdd_cfg80211_join_ibss
+ * FUNCTION: __wlan_hdd_cfg80211_join_ibss
* This function is used to create/join an IBSS
*/
-static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_ibss_params *params
)
@@ -10717,11 +10717,25 @@
return 0;
}
+static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
+ struct net_device *dev,
+ struct cfg80211_ibss_params *params
+ )
+{
+ int ret = 0;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_join_ibss(wiphy, dev, params);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
/*
- * FUNCTION: wlan_hdd_cfg80211_leave_ibss
+ * FUNCTION: __wlan_hdd_cfg80211_leave_ibss
* This function is used to leave an IBSS
*/
-static int wlan_hdd_cfg80211_leave_ibss( struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_leave_ibss( struct wiphy *wiphy,
struct net_device *dev
)
{
@@ -10780,6 +10794,19 @@
return 0;
}
+static int wlan_hdd_cfg80211_leave_ibss( struct wiphy *wiphy,
+ struct net_device *dev
+ )
+{
+ int ret = 0;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_leave_ibss(wiphy, dev);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
/*
* FUNCTION: __wlan_hdd_cfg80211_set_wiphy_params
* This function is used to set the phy parameters
@@ -11066,7 +11093,7 @@
return 0;
}
-static int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
+static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
u8* mac, struct station_info *sinfo)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
@@ -11484,7 +11511,19 @@
return 0;
}
-static int wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,
+static int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
+ u8* mac, struct station_info *sinfo)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_get_station(wiphy, dev, mac, sinfo);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+static int __wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,
struct net_device *dev, bool mode, int timeout)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -11567,7 +11606,17 @@
return 0;
}
+static int wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,
+ struct net_device *dev, bool mode, int timeout)
+{
+ int ret;
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_set_power_mgmt(wiphy, dev, mode, timeout);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
static int wlan_hdd_set_default_mgmt_key(struct wiphy *wiphy,
struct net_device *netdev,
@@ -11595,7 +11644,7 @@
}
#endif //LINUX_VERSION_CODE
-static int wlan_hdd_cfg80211_del_station(struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_del_station(struct wiphy *wiphy,
struct net_device *dev, u8 *mac)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -11698,8 +11747,19 @@
return 0;
}
+static int wlan_hdd_cfg80211_del_station(struct wiphy *wiphy,
+ struct net_device *dev, u8 *mac)
+{
+ int ret;
-static int wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_del_station(wiphy, dev, mac);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+static int __wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
struct net_device *dev, u8 *mac, struct station_parameters *params)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -11735,7 +11795,17 @@
return status;
}
+static int wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
+ struct net_device *dev, u8 *mac, struct station_parameters *params)
+{
+ int ret;
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_add_station(wiphy, dev, mac, params);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
#ifdef FEATURE_WLAN_LFR
static int __wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *dev,
@@ -12033,8 +12103,9 @@
#endif
#if defined(WLAN_FEATURE_VOWIFI_11R) && defined(KERNEL_SUPPORT_11R_CFG80211)
-static int wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
- struct net_device *dev, struct cfg80211_update_ft_ies_params *ftie)
+static int __wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
+ struct net_device *dev,
+ struct cfg80211_update_ft_ies_params *ftie)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_station_ctx_t *pHddStaCtx;
@@ -12069,6 +12140,19 @@
ftie->ie_len);
return 0;
}
+
+static int wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
+ struct net_device *dev,
+ struct cfg80211_update_ft_ies_params *ftie)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_update_ft_ies(wiphy, dev, ftie);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
#endif
#ifdef FEATURE_WLAN_SCAN_PNO
@@ -12805,7 +12889,7 @@
return 0;
}
-static int wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
+static int __wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
u8 *peer, enum nl80211_tdls_operation oper)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -13075,6 +13159,18 @@
return 0;
}
+static int wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
+ u8 *peer, enum nl80211_tdls_operation oper)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_tdls_oper(wiphy, dev, peer, oper);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
int wlan_hdd_cfg80211_send_tdls_discover_req(struct wiphy *wiphy,
struct net_device *dev, u8 *peer)
{
@@ -13154,10 +13250,10 @@
}
/*
- * FUNCTION: wlan_hdd_cfg80211_set_rekey_data
+ * FUNCTION: __wlan_hdd_cfg80211_set_rekey_data
* This function is used to offload GTK rekeying job to the firmware.
*/
-int wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *dev,
+int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_gtk_rekey_data *data)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -13246,8 +13342,19 @@
return eHAL_STATUS_SUCCESS;
}
-#endif /*WLAN_FEATURE_GTK_OFFLOAD*/
+int wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *dev,
+ struct cfg80211_gtk_rekey_data *data)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_set_rekey_data(wiphy, dev, data);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+#endif /*WLAN_FEATURE_GTK_OFFLOAD*/
/*
* FUNCTION: wlan_hdd_cfg80211_set_mac_acl
* This function is used to set access control policy
@@ -13454,7 +13561,7 @@
}
#endif /* FEATURE_WLAN_LPHB */
-static int wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, void *data, int len)
+static int __wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, void *data, int len)
{
struct nlattr *tb[WLAN_HDD_TM_ATTR_MAX + 1];
int err = 0;
@@ -13533,9 +13640,20 @@
return err;
}
+
+static int wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, void *data, int len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_testmode(wiphy, data, len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
#endif /* CONFIG_NL80211_TESTMODE */
-static int wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy,
struct net_device *dev,
int idx, struct survey_info *survey)
{
@@ -13639,6 +13757,19 @@
return 0;
}
+static int wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy,
+ struct net_device *dev,
+ int idx, struct survey_info *survey)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_dump_survey(wiphy, dev, idx, survey);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
/*
* FUNCTION: __wlan_hdd_cfg80211_resume_wlan
* this is called when cfg80211 driver resume