qcacmn: Add a check for vdev with bssid mac
There is a possibility that driver already has a vdev with the mac address same as bssid, in this case sta should not connect to this AP as it may lead to undefined behavior. To address above issue add a check to compare bssid with already existing vdevs before connect start. Along with above changes add few renaming changes also. Change-Id: Ia12be0b392a01bf935b5261e505290064de68805 CRs-Fixed: 2809147
This commit is contained in:

committed by
snandini

szülő
8491861767
commit
3faf318e8c
@@ -150,7 +150,7 @@ enum osif_cb_type {
|
||||
*/
|
||||
typedef QDF_STATUS
|
||||
(*osif_cm_connect_comp_cb)(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp,
|
||||
struct wlan_cm_connect_resp *rsp,
|
||||
enum osif_cb_type type);
|
||||
|
||||
/**
|
||||
@@ -243,7 +243,7 @@ struct osif_cm_ops {
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp,
|
||||
struct wlan_cm_connect_resp *rsp,
|
||||
enum osif_cb_type type);
|
||||
|
||||
/**
|
||||
|
@@ -136,7 +136,7 @@ osif_connect_timeout(struct net_device *dev, const u8 *bssid,
|
||||
*/
|
||||
static void __osif_connect_bss(struct net_device *dev,
|
||||
struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp,
|
||||
struct wlan_cm_connect_resp *rsp,
|
||||
enum ieee80211_statuscode status)
|
||||
{
|
||||
enum nl80211_timeout_reason nl_timeout_reason;
|
||||
@@ -168,7 +168,7 @@ static void osif_connect_timeout(
|
||||
|
||||
static void __osif_connect_bss(struct net_device *dev,
|
||||
struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp,
|
||||
struct wlan_cm_connect_resp *rsp,
|
||||
ieee80211_statuscode status)
|
||||
{
|
||||
cfg80211_connect_bss(dev, rsp->bssid.bytes, bss,
|
||||
@@ -194,7 +194,7 @@ static void __osif_connect_bss(struct net_device *dev,
|
||||
#if defined CFG80211_CONNECT_TIMEOUT || \
|
||||
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
|
||||
static void osif_connect_bss(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
enum ieee80211_statuscode status = WLAN_STATUS_SUCCESS;
|
||||
|
||||
@@ -213,7 +213,7 @@ static void osif_connect_bss(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
}
|
||||
#else /* CFG80211_CONNECT_TIMEOUT */
|
||||
static void osif_connect_bss(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
enum ieee80211_statuscode status = WLAN_STATUS_SUCCESS;
|
||||
|
||||
@@ -292,6 +292,13 @@ osif_populate_fils_params(struct cfg80211_connect_resp_params *rsp_params,
|
||||
|
||||
#if defined(CFG80211_CONNECT_DONE) || \
|
||||
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
|
||||
|
||||
static enum ieee80211_statuscode
|
||||
osif_get_statuscode(enum wlan_status_code status)
|
||||
{
|
||||
return (enum ieee80211_statuscode)status;
|
||||
}
|
||||
|
||||
/**
|
||||
* osif_connect_done() - Wrapper API to call cfg80211_connect_done
|
||||
* @dev: network device
|
||||
@@ -305,7 +312,7 @@ osif_populate_fils_params(struct cfg80211_connect_resp_params *rsp_params,
|
||||
* Return: None
|
||||
*/
|
||||
static void osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct cfg80211_connect_resp_params conn_rsp_params;
|
||||
enum ieee80211_statuscode status = WLAN_STATUS_SUCCESS;
|
||||
@@ -313,8 +320,8 @@ static void osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
osif_enter_dev(dev);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(rsp->connect_status)) {
|
||||
if (rsp->reason_code)
|
||||
status = rsp->reason_code;
|
||||
if (rsp->status_code)
|
||||
status = osif_get_statuscode(rsp->status_code);
|
||||
else
|
||||
status = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
}
|
||||
@@ -343,7 +350,7 @@ static void osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
#else /* CFG80211_CONNECT_DONE */
|
||||
static inline void
|
||||
osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{ }
|
||||
#endif /* CFG80211_CONNECT_DONE */
|
||||
#endif /* WLAN_FEATURE_FILS_SK */
|
||||
@@ -365,7 +372,7 @@ osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
*/
|
||||
static int osif_update_connect_results(struct net_device *dev,
|
||||
struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
if (!rsp->is_fils_connection) {
|
||||
osif_debug("fils IE is NULL");
|
||||
@@ -379,7 +386,7 @@ static int osif_update_connect_results(struct net_device *dev,
|
||||
|
||||
static inline int osif_update_connect_results(struct net_device *dev,
|
||||
struct cfg80211_bss *bss,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -387,7 +394,7 @@ static inline int osif_update_connect_results(struct net_device *dev,
|
||||
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
struct ieee80211_channel *chan;
|
||||
@@ -407,7 +414,7 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
#else /* CFG80211_CONNECT_BSS */
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
enum ieee80211_statuscode status = WLAN_STATUS_SUCCESS;
|
||||
|
||||
@@ -441,18 +448,18 @@ bool osif_cm_is_unlink_bss_required(enum wlan_cm_connect_fail_reason reason)
|
||||
}
|
||||
|
||||
QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
|
||||
QDF_STATUS status;
|
||||
|
||||
osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d reason_code %d",
|
||||
osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d status_code %d",
|
||||
osif_priv->wdev->netdev->name, rsp->vdev_id,
|
||||
QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
|
||||
QDF_MAC_ADDR_REF(rsp->bssid.bytes),
|
||||
rsp->ssid.length, rsp->ssid.ssid,
|
||||
rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
|
||||
rsp->reason, rsp->reason_code);
|
||||
rsp->reason, rsp->status_code);
|
||||
|
||||
if (osif_cm_is_unlink_bss_required(rsp->reason))
|
||||
osif_cm_unlink_bss(vdev, osif_priv, &rsp->bssid, rsp->ssid.ssid,
|
||||
@@ -472,7 +479,7 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
}
|
||||
|
||||
QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
|
||||
|
||||
@@ -481,7 +488,7 @@ QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev,
|
||||
QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
|
||||
QDF_MAC_ADDR_REF(rsp->bssid.bytes),
|
||||
rsp->ssid.length, rsp->ssid.ssid, rsp->cm_id,
|
||||
rsp->reason, rsp->reason_code);
|
||||
rsp->reason, rsp->status_code);
|
||||
|
||||
if (osif_cm_is_unlink_bss_required(rsp->reason))
|
||||
osif_cm_unlink_bss(vdev, osif_priv, &rsp->bssid, rsp->ssid.ssid,
|
||||
|
@@ -102,8 +102,6 @@ osif_cm_get_disconnect_reason(struct vdev_osif_priv *osif_priv, uint16_t reason)
|
||||
{
|
||||
enum ieee80211_reasoncode ieee80211_reason = WLAN_REASON_UNSPECIFIED;
|
||||
|
||||
osif_priv->cm_info.last_disconnect_reason =
|
||||
osif_cm_mac_to_qca_reason(reason);
|
||||
if (reason < REASON_PROP_START)
|
||||
ieee80211_reason = reason;
|
||||
/*
|
||||
@@ -123,7 +121,9 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
|
||||
bool locally_generated = true;
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
enum qca_disconnect_reason_codes qca_reason;
|
||||
|
||||
qca_reason = osif_cm_mac_to_qca_reason(rsp->req.req.reason_code);
|
||||
ieee80211_reason =
|
||||
osif_cm_get_disconnect_reason(osif_priv,
|
||||
rsp->req.req.reason_code);
|
||||
@@ -136,8 +136,8 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
QDF_MAC_ADDR_REF(rsp->req.req.bssid.bytes),
|
||||
rsp->req.cm_id, rsp->req.req.source, ieee80211_reason,
|
||||
ucfg_cm_reason_code_to_str(rsp->req.req.reason_code),
|
||||
osif_priv->cm_info.last_disconnect_reason,
|
||||
osif_cm_qca_reason_to_str(osif_priv->cm_info.last_disconnect_reason));
|
||||
qca_reason,
|
||||
osif_cm_qca_reason_to_str(qca_reason));
|
||||
|
||||
/* Unlink bss if disconnect is from peer or south bound */
|
||||
if (rsp->req.req.source == CM_PEER_DISCONNECT ||
|
||||
|
@@ -374,7 +374,28 @@ int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
|
||||
const u8 *bssid_hint = req->bssid_hint;
|
||||
uint8_t vdev_id = vdev->vdev_objmgr.vdev_id;
|
||||
QDF_STATUS status;
|
||||
struct qdf_mac_addr bssid = QDF_MAC_ADDR_BCAST_INIT;
|
||||
struct wlan_objmgr_vdev *temp_vdev;
|
||||
|
||||
if (req->bssid)
|
||||
qdf_mem_copy(bssid.bytes, req->bssid,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
else if (bssid_hint)
|
||||
qdf_mem_copy(bssid.bytes, req->bssid_hint,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
|
||||
temp_vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(
|
||||
wlan_vdev_get_pdev(vdev),
|
||||
bssid.bytes,
|
||||
WLAN_OSIF_CM_ID);
|
||||
|
||||
if (temp_vdev) {
|
||||
osif_err("vdev %d already exist with same mac address"
|
||||
QDF_MAC_ADDR_FMT, wlan_vdev_get_id(temp_vdev),
|
||||
QDF_MAC_ADDR_REF(bssid.bytes));
|
||||
wlan_objmgr_vdev_release_ref(temp_vdev, WLAN_OSIF_CM_ID);
|
||||
return -EINVAL;
|
||||
}
|
||||
osif_cm_dump_connect_req(dev, vdev_id, req);
|
||||
|
||||
status = osif_cm_reset_id_and_src(vdev);
|
||||
@@ -399,6 +420,7 @@ int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
|
||||
connect_req->ssid.length = req->ssid_len;
|
||||
if (connect_req->ssid.length > WLAN_SSID_MAX_LEN) {
|
||||
osif_err("Invalid ssid len %zu", req->ssid_len);
|
||||
osif_cm_free_connect_req(connect_req);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@@ -54,7 +54,7 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp);
|
||||
struct wlan_cm_connect_resp *rsp);
|
||||
|
||||
/**
|
||||
* osif_failed_candidate_handler() - API to indicate individual candidate
|
||||
@@ -70,7 +70,7 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp);
|
||||
struct wlan_cm_connect_resp *rsp);
|
||||
|
||||
#endif /* FEATURE_CM_ENABLE */
|
||||
#endif /* __OSIF_CM_RSP_H */
|
||||
|
@@ -193,7 +193,7 @@ QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev)
|
||||
*/
|
||||
static QDF_STATUS
|
||||
osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
return osif_connect_handler(vdev, rsp);
|
||||
}
|
||||
@@ -207,7 +207,7 @@ osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
|
||||
*/
|
||||
static QDF_STATUS
|
||||
osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp)
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
return osif_failed_candidate_handler(vdev, rsp);
|
||||
}
|
||||
@@ -369,7 +369,7 @@ QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
|
||||
}
|
||||
|
||||
QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_rsp *rsp,
|
||||
struct wlan_cm_connect_resp *rsp,
|
||||
enum osif_cb_type type)
|
||||
{
|
||||
osif_cm_connect_comp_cb cb = NULL;
|
||||
|
@@ -47,15 +47,12 @@ struct pdev_osif_priv {
|
||||
* @last_source: Last command request source
|
||||
* @last_id: Last command from connection manager
|
||||
* @cmd_id_lock: lock to update and read last command source
|
||||
* @last_disconnect_reason: last disconnect reason to be indicated in get
|
||||
* station
|
||||
* @ext_priv: legacy data pointer.
|
||||
*/
|
||||
struct osif_cm_info {
|
||||
enum wlan_cm_source last_source;
|
||||
wlan_cm_id last_id;
|
||||
struct qdf_spinlock cmd_id_lock;
|
||||
enum qca_disconnect_reason_codes last_disconnect_reason;
|
||||
void *ext_priv;
|
||||
};
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user