ソースを参照

qcacmn: Add debug info if scan filter fails to match the BSS

In driver there is no debug info printed  in case a scan filter
fails to match the BSS even when SSID and BSSID match for the BSS.

Thus add debug info for the cases where the BSS is rejected due
to blacklist, security profile mismatch etc.

Change-Id: I8218f4fe1a64803dc4641be9b66e58301bd6b15b
CRs-Fixed: 2395356
Abhishek Singh 6 年 前
コミット
4122f5dd4c
1 ファイル変更97 行追加28 行削除
  1. 97 28
      umac/scan/core/src/wlan_scan_filter.c

+ 97 - 28
umac/scan/core/src/wlan_scan_filter.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -269,15 +269,18 @@ static bool scm_is_wep_security(struct scan_filter *filter,
 /**
  * scm_check_pmf_match() - Check PMF security of entry match filter
  * @filter: scan filter
+ * @db_entry: ap entry
  * @rsn: rsn IE of the scan entry
  *
  * Return: true if PMF security match else false
  */
 static bool
 scm_check_pmf_match(struct scan_filter *filter,
-	struct wlan_rsn_ie *rsn)
+		    struct scan_cache_entry *db_entry,
+		    struct wlan_rsn_ie *rsn)
 {
 	enum wlan_pmf_cap ap_pmf_cap = WLAN_PMF_DISABLED;
+	bool match = true;
 
 	if (rsn->cap & RSN_CAP_MFP_CAPABLE)
 		ap_pmf_cap = WLAN_PMF_CAPABLE;
@@ -286,12 +289,17 @@ scm_check_pmf_match(struct scan_filter *filter,
 
 	if ((filter->pmf_cap == WLAN_PMF_REQUIRED) &&
 		(ap_pmf_cap == WLAN_PMF_DISABLED))
-		return false;
+		match = false;
 	else if ((filter->pmf_cap == WLAN_PMF_DISABLED) &&
 		(ap_pmf_cap == WLAN_PMF_REQUIRED))
-		return false;
+		match = false;
 
-	return true;
+	if (!match)
+		scm_debug("%pM : PMF cap didn't match (filter %d AP %d)",
+			  db_entry->bssid.bytes, filter->pmf_cap,
+			  ap_pmf_cap);
+
+	return match;
 }
 
 /**
@@ -387,8 +395,10 @@ static bool scm_is_rsn_security(struct scan_filter *filter,
 
 	if (!security)
 		return false;
-	if (!util_scan_entry_rsn(db_entry))
+	if (!util_scan_entry_rsn(db_entry)) {
+		scm_debug("%pM : doesn't have RSN IE", db_entry->bssid.bytes);
 		return false;
+	}
 	status = wlan_parse_rsn_ie(util_scan_entry_rsn(db_entry), &rsn);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		scm_err("failed to parse RSN IE, status %d", status);
@@ -402,12 +412,18 @@ static bool scm_is_rsn_security(struct scan_filter *filter,
 		scm_get_cipher_suite_type(security->uc_enc);
 	match = scm_is_cipher_match(rsn.pwise_cipher_suites,
 		rsn.pwise_cipher_count, WLAN_RSN_SEL(cipher_type));
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : pairwise cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	match = scm_is_rsn_mcast_cipher_match(&rsn, filter, &neg_mccipher);
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : mcast cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	/* Initializing with false as it has true value already */
 	match = false;
@@ -604,11 +620,14 @@ static bool scm_is_rsn_security(struct scan_filter *filter,
 		}
 	}
 
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : akm suites didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	if (!filter->ignore_pmf_cap)
-		match = scm_check_pmf_match(filter, &rsn);
+		match = scm_check_pmf_match(filter, db_entry, &rsn);
 
 	if (match) {
 		security->auth_type = neg_auth;
@@ -696,8 +715,11 @@ static bool scm_is_wpa_security(struct scan_filter *filter,
 
 	if (!security)
 		return false;
-	if (!util_scan_entry_wpa(db_entry))
+	if (!util_scan_entry_wpa(db_entry)) {
+		scm_debug("%pM : AP doesn't have WPA IE",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	status = wlan_parse_wpa_ie(util_scan_entry_wpa(db_entry), &wpa);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -712,12 +734,18 @@ static bool scm_is_wpa_security(struct scan_filter *filter,
 		scm_get_cipher_suite_type(security->uc_enc);
 	match = scm_is_cipher_match(wpa.uc_ciphers,
 		wpa.uc_cipher_count, WLAN_WPA_SEL(cipher_type));
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : unicase cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	match = scm_is_wpa_mcast_cipher_match(&wpa, filter, &neg_mccipher);
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : mcast cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	/* Initializing with false as it has true value already */
 	match = false;
@@ -764,6 +792,9 @@ static bool scm_is_wpa_security(struct scan_filter *filter,
 		}
 	}
 
+	if (!match)
+		scm_debug("%pM : akm didn't match", db_entry->bssid.bytes);
+
 	if (match) {
 		security->auth_type = neg_auth;
 		security->mc_enc = neg_mccipher;
@@ -793,8 +824,11 @@ static bool scm_is_wapi_security(struct scan_filter *filter,
 
 	if (!security)
 		return false;
-	if (!util_scan_entry_wapi(db_entry))
+	if (!util_scan_entry_wapi(db_entry)) {
+		scm_debug("%pM : mcast cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	wlan_parse_wapi_ie(
 		   util_scan_entry_wapi(db_entry), &wapi);
@@ -803,8 +837,11 @@ static bool scm_is_wapi_security(struct scan_filter *filter,
 		scm_get_cipher_suite_type(security->uc_enc);
 	match = scm_is_cipher_match(wapi.uc_cipher_suites,
 		wapi.uc_cipher_count, WLAN_WAPI_SEL(cipher_type));
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : unicast cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	for (i = 0; i < filter->num_of_mc_enc_type; i++) {
 		cipher_type =
@@ -815,20 +852,26 @@ static bool scm_is_wapi_security(struct scan_filter *filter,
 		if (match)
 			break;
 	}
-	if (!match)
+	if (!match) {
+		scm_debug("%pM : mcast cipher didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 	neg_mccipher = filter->mc_enc_type[i];
 
 	if (scm_is_cipher_match(wapi.akm_suites,
 	   wapi.akm_suite_count,
-	   WLAN_WAPI_SEL(WLAN_WAI_CERT_OR_SMS4)))
+	   WLAN_WAPI_SEL(WLAN_WAI_CERT_OR_SMS4))) {
 		neg_auth =
 			WLAN_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
-	else if (scm_is_cipher_match(wapi.akm_suites,
-	   wapi.akm_suite_count, WLAN_WAPI_SEL(WLAN_WAI_PSK)))
+	} else if (scm_is_cipher_match(wapi.akm_suites,
+	   wapi.akm_suite_count, WLAN_WAPI_SEL(WLAN_WAI_PSK))) {
 		neg_auth = WLAN_AUTH_TYPE_WAPI_WAI_PSK;
-	else
+	} else {
+		scm_debug("%pM : akm is not supported",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	match = false;
 	for (i = 0; i < filter->num_of_auth; i++) {
@@ -838,6 +881,9 @@ static bool scm_is_wapi_security(struct scan_filter *filter,
 		}
 	}
 
+	if (!match)
+		scm_debug("%pM : akm suite didn't match",
+			  db_entry->bssid.bytes);
 	if (match) {
 		security->auth_type = neg_auth;
 		security->mc_enc = neg_mccipher;
@@ -1056,10 +1102,14 @@ bool scm_filter_match(struct wlan_objmgr_psoc *psoc,
 	if (filter->p2p_results && !db_entry->is_p2p)
 		return false;
 
-	for (i = 0; i < roam_params->num_bssid_avoid_list; i++)
+	for (i = 0; i < roam_params->num_bssid_avoid_list; i++) {
 		if (qdf_is_macaddr_equal(&roam_params->bssid_avoid_list[i],
-		   &db_entry->bssid))
+		   &db_entry->bssid)) {
+			scm_debug("%pM : Ignore as its blacklisted",
+				  db_entry->bssid.bytes);
 			return false;
+		}
+	}
 
 	match = false;
 	if (db_entry->ssid.length) {
@@ -1120,31 +1170,50 @@ bool scm_filter_match(struct wlan_objmgr_psoc *psoc,
 
 	if (!filter->ignore_auth_enc_type &&
 	   !scm_is_security_match(filter,
-	   db_entry, security))
+	   db_entry, security)) {
+		scm_debug("%pM : Ignore as security profile didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	if (!util_is_bss_type_match(filter->bss_type,
-	   db_entry->cap_info))
+	   db_entry->cap_info)) {
+		scm_debug("%pM : Ignore as bss type didn't match cap_info %x bss_type %d",
+			  db_entry->bssid.bytes, db_entry->cap_info.value,
+			  filter->bss_type);
 		return false;
+	}
 
 	/* TODO match rate set */
 
 	if (filter->only_wmm_ap &&
 	   !db_entry->ie_list.wmeinfo &&
-	   !db_entry->ie_list.wmeparam)
+	   !db_entry->ie_list.wmeparam) {
+		scm_debug("%pM : Ignore as required wmeinfo and wme params not present",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	/* Match realm */
-	if (!scm_is_fils_config_match(filter, db_entry))
+	if (!scm_is_fils_config_match(filter, db_entry)) {
+		scm_debug("%pM :Ignore as fils config didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	cc_ie = util_scan_entry_country(db_entry);
-	if (!util_country_code_match(filter->country, cc_ie))
+	if (!util_country_code_match(filter->country, cc_ie)) {
+		scm_debug("%pM : Ignore as country %.*s didn't match",
+			  db_entry->bssid.bytes, 2, filter->country);
 		return false;
+	}
 
 	if (!util_mdie_match(filter->mobility_domain,
-	   (struct rsn_mdie *)db_entry->ie_list.mdie))
+	   (struct rsn_mdie *)db_entry->ie_list.mdie)) {
+		scm_debug("%pM : Ignore as mdie didn't match",
+			  db_entry->bssid.bytes);
 		return false;
+	}
 
 	return true;
 }