wlan: Protect cfg80211 ops functions functions from SSR
Protect change_bss, set_wiphy_params and set_tx_power cfg80211
ops functions from accessing deallocated/unitialized data
structures while SSR is in progress.
Change-Id: Ie978df6aee727f6ab833ef318a08da9071a2eca2
CRs-Fixed: 674000
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index d98a7d1..827a2e4 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -4091,7 +4091,7 @@
#endif //(LINUX_VERSION_CODE > KERNEL_VERSION(3,3,0))
-static int wlan_hdd_cfg80211_change_bss (struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_change_bss (struct wiphy *wiphy,
struct net_device *dev,
struct bss_parameters *params)
{
@@ -4122,6 +4122,18 @@
return 0;
}
+static int wlan_hdd_cfg80211_change_bss (struct wiphy *wiphy,
+ struct net_device *dev,
+ struct bss_parameters *params)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_change_bss(wiphy, dev, params);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
/* FUNCTION: wlan_hdd_change_country_code_cd
* to wait for contry code completion
*/
@@ -8548,11 +8560,11 @@
}
/*
- * FUNCTION: wlan_hdd_cfg80211_set_wiphy_params
+ * FUNCTION: __wlan_hdd_cfg80211_set_wiphy_params
* This function is used to set the phy parameters
* (RTS Threshold/FRAG Threshold/Retry Count etc ...)
*/
-static int wlan_hdd_cfg80211_set_wiphy_params(struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_set_wiphy_params(struct wiphy *wiphy,
u32 changed)
{
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
@@ -8678,11 +8690,23 @@
return 0;
}
+static int wlan_hdd_cfg80211_set_wiphy_params(struct wiphy *wiphy,
+ u32 changed)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_set_wiphy_params(wiphy, changed);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
/*
- * FUNCTION: wlan_hdd_cfg80211_set_txpower
+ * FUNCTION: __wlan_hdd_cfg80211_set_txpower
* This function is used to set the txpower
*/
-static int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
+static int __wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
struct wireless_dev *wdev,
#endif
@@ -8752,6 +8776,34 @@
return 0;
}
+static int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
+ struct wireless_dev *wdev,
+#endif
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ enum tx_power_setting type,
+#else
+ enum nl80211_tx_power_setting type,
+#endif
+ int dbm)
+{
+ int ret;
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_set_txpower(wiphy,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
+ wdev,
+#endif
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ type,
+#else
+ type,
+#endif
+ dbm);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
/*
* FUNCTION: wlan_hdd_cfg80211_get_txpower
* This function is used to read the txpower