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:
Ashish Kumar Dhanotiya
2020-10-28 22:50:34 +05:30
committed by snandini
szülő 8491861767
commit 3faf318e8c
17 fájl változott, egészen pontosan 110 új sor hozzáadva és 82 régi sor törölve

Fájl megtekintése

@@ -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);
/**

Fájl megtekintése

@@ -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,

Fájl megtekintése

@@ -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 ||

Fájl megtekintése

@@ -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;
}

Fájl megtekintése

@@ -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 */

Fájl megtekintése

@@ -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;

Fájl megtekintése

@@ -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