qcacld-3.0: Deregister NL MSG handlers during hdd_wlan_exit
Currently the NL MSG handlers for WLAN_NL_MSG_OEM and WLAN_NL_MSG_SPECTRAL_SCAN are not deregistered during hdd_wlan_exit which can causes a page fault if NL issues cld80211_doit for these NL messages when the WLAN is not up. Add Deregister APIs for all the NL MSGs to call as part of hdd_exit_netlink_services during hdd_wlan_exit. Change-Id: I5811dcfc79eff4ea7281de5f7591e078c572e69c CRs-Fixed: 2232902
This commit is contained in:

committed by
nshrivas

parent
ad01577f26
commit
a1cb4b47ce
@@ -177,8 +177,27 @@ void hdd_send_peer_status_ind_to_oem_app(struct qdf_mac_addr *peerMac,
|
|||||||
int iw_get_oem_data_cap(struct net_device *dev, struct iw_request_info *info,
|
int iw_get_oem_data_cap(struct net_device *dev, struct iw_request_info *info,
|
||||||
union iwreq_data *wrqu, char *extra);
|
union iwreq_data *wrqu, char *extra);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* oem_activate_service() - API to register the oem command handler
|
||||||
|
* @hdd_ctx: Pointer to HDD Context
|
||||||
|
*
|
||||||
|
* This API is used to register the handler to receive netlink message
|
||||||
|
* from an OEM application process
|
||||||
|
*
|
||||||
|
* Return: 0 on success and errno on failure
|
||||||
|
*/
|
||||||
int oem_activate_service(struct hdd_context *hdd_ctx);
|
int oem_activate_service(struct hdd_context *hdd_ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* oem_deactivate_service() - API to unregister the oem command handler
|
||||||
|
*
|
||||||
|
* This API is used to deregister the handler to receive netlink message
|
||||||
|
* from an OEM application process
|
||||||
|
*
|
||||||
|
* Return: 0 on success and errno on failure
|
||||||
|
*/
|
||||||
|
int oem_deactivate_service(void);
|
||||||
|
|
||||||
void hdd_send_oem_data_rsp_msg(struct oem_data_rsp *oem_rsp);
|
void hdd_send_oem_data_rsp_msg(struct oem_data_rsp *oem_rsp);
|
||||||
void hdd_update_channel_bw_info(struct hdd_context *hdd_ctx,
|
void hdd_update_channel_bw_info(struct hdd_context *hdd_ctx,
|
||||||
uint16_t chan,
|
uint16_t chan,
|
||||||
@@ -189,6 +208,11 @@ static inline int oem_activate_service(struct hdd_context *hdd_ctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int oem_deactivate_service(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void hdd_send_oem_data_rsp_msg(void *oem_rsp) {}
|
static inline void hdd_send_oem_data_rsp_msg(void *oem_rsp) {}
|
||||||
|
|
||||||
static inline void hdd_update_channel_bw_info(struct hdd_context *hdd_ctx,
|
static inline void hdd_update_channel_bw_info(struct hdd_context *hdd_ctx,
|
||||||
|
@@ -194,16 +194,29 @@ int wlan_hdd_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
|
|||||||
/**
|
/**
|
||||||
* spectral_scan_activate_service() - Activate spectral scan message handler
|
* spectral_scan_activate_service() - Activate spectral scan message handler
|
||||||
*
|
*
|
||||||
* This function registers a handler to receive netlink message from
|
* This function registers a handler to receive netlink message from
|
||||||
* the spectral scan application process.
|
* the spectral scan application process.
|
||||||
*
|
*
|
||||||
* Return - 0 for success, non zero for failure
|
* Return: None
|
||||||
*/
|
*/
|
||||||
int spectral_scan_activate_service(void);
|
void spectral_scan_activate_service(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spectral_scan_deactivate_service() - Deactivate spectral scan message handler
|
||||||
|
*
|
||||||
|
* This function deregisters a handler to receive netlink message from
|
||||||
|
* the spectral scan application process.
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void spectral_scan_deactivate_service(void);
|
||||||
#else
|
#else
|
||||||
static inline int spectral_scan_activate_service(void)
|
static inline void spectral_scan_activate_service(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void spectral_scan_deactivate_service(void)
|
||||||
{
|
{
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -2962,7 +2962,7 @@ static int hdd_activate_wifi_pos(struct hdd_context *hdd_ctx)
|
|||||||
|
|
||||||
static int hdd_deactivate_wifi_pos(void)
|
static int hdd_deactivate_wifi_pos(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return oem_deactivate_service();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hdd_populate_wifi_pos_cfg(struct hdd_context *hdd_ctx)
|
static void hdd_populate_wifi_pos_cfg(struct hdd_context *hdd_ctx)
|
||||||
@@ -6640,9 +6640,11 @@ void hdd_unregister_notifiers(struct hdd_context *hdd_ctx)
|
|||||||
*/
|
*/
|
||||||
static void hdd_exit_netlink_services(struct hdd_context *hdd_ctx)
|
static void hdd_exit_netlink_services(struct hdd_context *hdd_ctx)
|
||||||
{
|
{
|
||||||
|
spectral_scan_deactivate_service();
|
||||||
|
cnss_diag_deactivate_service();
|
||||||
hdd_close_cesium_nl_sock();
|
hdd_close_cesium_nl_sock();
|
||||||
hdd_deactivate_wifi_pos();
|
|
||||||
ptt_sock_deactivate_svc();
|
ptt_sock_deactivate_svc();
|
||||||
|
hdd_deactivate_wifi_pos();
|
||||||
|
|
||||||
nl_srv_exit();
|
nl_srv_exit();
|
||||||
}
|
}
|
||||||
@@ -6673,11 +6675,7 @@ static int hdd_init_netlink_services(struct hdd_context *hdd_ctx)
|
|||||||
goto err_nl_srv;
|
goto err_nl_srv;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ptt_sock_activate_svc();
|
ptt_sock_activate_svc();
|
||||||
if (ret) {
|
|
||||||
hdd_err("ptt_sock_activate_svc failed: %d", ret);
|
|
||||||
goto err_nl_srv;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hdd_open_cesium_nl_sock();
|
ret = hdd_open_cesium_nl_sock();
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -6689,17 +6687,14 @@ static int hdd_init_netlink_services(struct hdd_context *hdd_ctx)
|
|||||||
goto err_close_cesium;
|
goto err_close_cesium;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = spectral_scan_activate_service();
|
spectral_scan_activate_service();
|
||||||
if (ret) {
|
|
||||||
hdd_err("spectral service initialization failed: %d", ret);
|
|
||||||
goto err_close_cesium;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_close_cesium:
|
err_close_cesium:
|
||||||
hdd_close_cesium_nl_sock();
|
hdd_close_cesium_nl_sock();
|
||||||
ptt_sock_deactivate_svc();
|
ptt_sock_deactivate_svc();
|
||||||
|
hdd_deactivate_wifi_pos();
|
||||||
err_nl_srv:
|
err_nl_srv:
|
||||||
nl_srv_exit();
|
nl_srv_exit();
|
||||||
out:
|
out:
|
||||||
|
@@ -1035,21 +1035,18 @@ static void oem_cmd_handler(const void *data, int data_len, void *ctx, int pid)
|
|||||||
oem_request_dispatcher(msg_hdr, pid);
|
oem_request_dispatcher(msg_hdr, pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* oem_activate_service() - API to register the oem command handler
|
|
||||||
* @hdd_ctx: Pointer to HDD Context
|
|
||||||
*
|
|
||||||
* This API is used to register the oem app command handler. Argument
|
|
||||||
* @adapter is given for prototype compatibility with legacy code.
|
|
||||||
*
|
|
||||||
* Return: 0
|
|
||||||
*/
|
|
||||||
int oem_activate_service(struct hdd_context *hdd_ctx)
|
int oem_activate_service(struct hdd_context *hdd_ctx)
|
||||||
{
|
{
|
||||||
p_hdd_ctx = hdd_ctx;
|
p_hdd_ctx = hdd_ctx;
|
||||||
register_cld_cmd_cb(WLAN_NL_MSG_OEM, oem_cmd_handler, NULL);
|
register_cld_cmd_cb(WLAN_NL_MSG_OEM, oem_cmd_handler, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oem_deactivate_service(void)
|
||||||
|
{
|
||||||
|
deregister_cld_cmd_cb(WLAN_NL_MSG_OEM);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1116,16 +1113,6 @@ static int __oem_msg_callback(struct sk_buff *skb)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* oem_activate_service() - Activate oem message handler
|
|
||||||
* @hdd_ctx: pointer to global HDD context
|
|
||||||
*
|
|
||||||
* This function registers a handler to receive netlink message from
|
|
||||||
* an OEM application process.
|
|
||||||
*
|
|
||||||
* Return: zero on success
|
|
||||||
* On error, error number will be returned.
|
|
||||||
*/
|
|
||||||
int oem_activate_service(struct hdd_context *hdd_ctx)
|
int oem_activate_service(struct hdd_context *hdd_ctx)
|
||||||
{
|
{
|
||||||
p_hdd_ctx = hdd_ctx;
|
p_hdd_ctx = hdd_ctx;
|
||||||
@@ -1133,5 +1120,12 @@ int oem_activate_service(struct hdd_context *hdd_ctx)
|
|||||||
/* Register the msg handler for msgs addressed to WLAN_NL_MSG_OEM */
|
/* Register the msg handler for msgs addressed to WLAN_NL_MSG_OEM */
|
||||||
return nl_srv_register(WLAN_NL_MSG_OEM, __oem_msg_callback);
|
return nl_srv_register(WLAN_NL_MSG_OEM, __oem_msg_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oem_deactivate_service(void)
|
||||||
|
{
|
||||||
|
/* Deregister the msg handler for msgs addressed to WLAN_NL_MSG_OEM */
|
||||||
|
return nl_srv_unregister(WLAN_NL_MSG_OEM, __oem_msg_callback);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -463,20 +463,14 @@ static void spectral_scan_msg_handler(const void *data, int data_len,
|
|||||||
cds_ssr_unprotect(__func__);
|
cds_ssr_unprotect(__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void spectral_scan_activate_service(void)
|
||||||
* spectral_scan_activate_service() - API to register spectral
|
|
||||||
* scan cmd handler
|
|
||||||
*
|
|
||||||
* API to register the spectral scan command handler using new
|
|
||||||
* genl infra. Return type is zero to match with legacy
|
|
||||||
* prototype
|
|
||||||
*
|
|
||||||
* Return: 0
|
|
||||||
*/
|
|
||||||
int spectral_scan_activate_service(void)
|
|
||||||
{
|
{
|
||||||
register_cld_cmd_cb(WLAN_NL_MSG_SPECTRAL_SCAN,
|
register_cld_cmd_cb(WLAN_NL_MSG_SPECTRAL_SCAN,
|
||||||
spectral_scan_msg_handler, NULL);
|
spectral_scan_msg_handler, NULL);
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
void spectral_scan_deactivate_service(void)
|
||||||
|
{
|
||||||
|
deregister_cld_cmd_cb(WLAN_NL_MSG_SPECTRAL_SCAN);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user