Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7700a154 authored by Sai Pavan Akhil Remella's avatar Sai Pavan Akhil Remella Committed by Madan Koyyalamudi
Browse files

qcacmn: Add mode based flags to channels in PNO request

Currently 6 GHz channel flags are not set for channels
present in the list from PNO scan request but are set for
all other 6 GHz channels which are added when either of the
two below conditions are satisfied
1. Userspace sets NL80211_SCAN_FLAG_COLOCATED_6GHZ flag
in PNO scan request.
2. At least one 6 GHz channel is present in the PNO scan req.

Add flags for channels in the PNO scan request based on the
scan_mode_6g ini configured similar to active scan request.

Add changes to remove the RNR flag for the channel if the
corresponding short SSID entry is present in the RNR db
Cache since if colocated SSID is different userspace doesn't
include corresponding 2.4/5 GHz channel information in PNO
request.

Change-Id: I22c4f7ecf65d4ab09dfbbe126aefe02f9145de42
CRs-Fixed: 3119113
parent e19169dc
Loading
Loading
Loading
Loading
+25 −19
Original line number Diff line number Diff line
@@ -529,36 +529,42 @@ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_vdev *vdev,

	/* Filling per profile  params */
	for (i = 0; i < req->networks_cnt; i++) {
		req->networks_list[i].ssid.length =
			request->match_sets[i].ssid.ssid_len;
		struct cfg80211_match_set *user_req = &request->match_sets[i];
		struct pno_nw_type *tgt_req = &req->networks_list[i];

		if ((!req->networks_list[i].ssid.length) ||
		    (req->networks_list[i].ssid.length > WLAN_SSID_MAX_LEN)) {
		tgt_req->ssid.length = user_req->ssid.ssid_len;

		if (!tgt_req->ssid.length ||
		    tgt_req->ssid.length > WLAN_SSID_MAX_LEN) {
			osif_err(" SSID Len %d is not correct for network %d",
				 req->networks_list[i].ssid.length, i);
				 tgt_req->ssid.length, i);
			ret = -EINVAL;
			goto error;
		}

		qdf_mem_copy(req->networks_list[i].ssid.ssid,
			request->match_sets[i].ssid.ssid,
			req->networks_list[i].ssid.length);
		req->networks_list[i].authentication = 0;   /*eAUTH_TYPE_ANY */
		req->networks_list[i].encryption = 0;       /*eED_ANY */
		req->networks_list[i].bc_new_type = 0;    /*eBCAST_UNKNOWN */
		qdf_mem_copy(tgt_req->ssid.ssid, user_req->ssid.ssid,
			     tgt_req->ssid.length);
		tgt_req->authentication = 0;   /*eAUTH_TYPE_ANY */
		tgt_req->encryption = 0;       /*eED_ANY */
		tgt_req->bc_new_type = 0;    /*eBCAST_UNKNOWN */


		/*Copying list of valid channel into request */
		for (j = 0; j < num_chan; j++)
			req->networks_list[i].pno_chan_list.chan[j].freq =
								valid_ch[j];
		req->networks_list[i].pno_chan_list.num_chan = num_chan;
			tgt_req->pno_chan_list.chan[j].freq = valid_ch[j];
		tgt_req->pno_chan_list.num_chan = num_chan;

		if (ucfg_is_6ghz_pno_scan_optimization_supported(psoc))
			ucfg_scan_pno_add_all_valid_6g_channels(vdev, req,
								&num_chan);
		if (ucfg_is_6ghz_pno_scan_optimization_supported(psoc)) {
			uint32_t short_ssid =
				wlan_construct_shortssid(tgt_req->ssid.ssid,
							 tgt_req->ssid.length);

			ucfg_scan_add_flags_to_pno_chan_list(vdev, req,
							     &num_chan,
							     short_ssid, i);
		}

		req->networks_list[i].rssi_thresh =
			request->match_sets[i].rssi_thold;
		tgt_req->rssi_thresh = user_req->rssi_thold;
	}

	/* set scan to passive if no SSIDs are specified in the request */
+11 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 above
@@ -52,6 +53,16 @@ struct wlan_op_mode_peer_count {
	uint16_t peer_count;
};

/**
 * wlan_construct_shortssid() - construct the short ssid with the help of
 * shortssid table
 * @ssid: pointer to ssid
 * @ssid_len: ssid length
 *
 * return: short ssid length
 */
uint32_t wlan_construct_shortssid(uint8_t *ssid, uint8_t ssid_len);

/**
 * wlan_chan_to_freq() - converts channel to frequency
 * @chan: channel number
+62 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 above
@@ -27,6 +28,67 @@
#include <wlan_vdev_mlme_api.h>
#include "cfg_ucfg_api.h"

/* CRC polynomial 0xedb88320 */
static unsigned long const wlan_shortssid_table[] = {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
	0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
	0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
	0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};

uint32_t wlan_construct_shortssid(uint8_t *ssid, uint8_t ssid_len)
{
	uint32_t shortssid = 0xffffffff;
	uint8_t i;

	if (!ssid || ssid_len > WLAN_SSID_MAX_LEN)
		return shortssid;

	for (i = 0; i < ssid_len; i++)
		shortssid = wlan_shortssid_table[(shortssid ^ ssid[i]) & 0xff] ^
						(shortssid >> 8);
	return (shortssid ^ 0xffffffff);
}

uint32_t wlan_chan_to_freq(uint8_t chan)
{
	if (chan == 0 )
+55 −0
Original line number Diff line number Diff line
@@ -156,6 +156,8 @@ static void scm_add_rnr_channel_db(struct wlan_objmgr_psoc *psoc,
				     QDF_MAC_ADDR_SIZE);
		if (rnr_bss->short_ssid)
			rnr_node->entry.short_ssid = rnr_bss->short_ssid;
		if (rnr_bss->bss_params)
			rnr_node->entry.bss_params = rnr_bss->bss_params;
		scm_debug("Add freq %d: "QDF_MAC_ADDR_FMT" short ssid %x", chan_freq,
			  QDF_MAC_ADDR_REF(rnr_bss->bssid.bytes),
			  rnr_bss->short_ssid);
@@ -163,6 +165,59 @@ static void scm_add_rnr_channel_db(struct wlan_objmgr_psoc *psoc,
				     &rnr_node->node);
	}
}

void scm_filter_rnr_flag_pno(struct wlan_objmgr_vdev *vdev,
			     uint32_t short_ssid,
			     struct chan_list *pno_chan_list)
{
	uint8_t i;
	uint32_t freq;
	struct meta_rnr_channel *chan;
	struct scan_rnr_node *rnr_node;
	enum scan_mode_6ghz scan_mode;
	struct wlan_scan_obj *scan_obj;
	struct wlan_objmgr_psoc *psoc;

	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc)
		return;

	scan_obj = wlan_vdev_get_scan_obj(vdev);
	if (!scan_obj) {
		scm_err("scan_obj is NULL");
		return;
	}

	scan_mode = scan_obj->scan_def.scan_mode_6g;
	/* No Filteration required for below scan modes since
	 * no RNR flag marked
	 */
	if (scan_mode == SCAN_MODE_6G_NO_CHANNEL ||
	    scan_mode == SCAN_MODE_6G_ALL_CHANNEL ||
	    scan_mode == SCAN_MODE_6G_ALL_DUTY_CYCLE)
		return;

	for (i = 0; i < pno_chan_list->num_chan; i++) {
		freq = pno_chan_list->chan[i].freq;

		chan = scm_get_chan_meta(psoc, freq);
		if (!chan || qdf_list_empty(&chan->rnr_list))
			continue;

		qdf_list_for_each(&chan->rnr_list, rnr_node, node) {
			if (rnr_node->entry.short_ssid) {
				if (rnr_node->entry.short_ssid == short_ssid) {
			/* If short ssid entry present in RNR db cache, remove
			 * FLAG_SCAN_ONLY_IF_RNR_FOUND flag from the channel.
			 */
					pno_chan_list->chan[i].flags &=
						~FLAG_SCAN_ONLY_IF_RNR_FOUND;
					break;
				}
			}
		}
	}
}
#endif

/**
+26 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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
@@ -248,6 +249,24 @@ QDF_STATUS scm_rnr_db_flush(struct wlan_objmgr_psoc *psoc);
 */
void scm_update_rnr_from_scan_cache(struct wlan_objmgr_pdev *pdev);

/**
 * scm_filter_rnr_flag_pno() - Remove FLAG_SCAN_ONLY_IF_RNR_FOUND flag
 *                             in channel if ssid is different for colocated AP,
 *                             during pno scan request
 * @vdev: vdev
 * @short_ssid: short ssid
 * @pno_chan_list: channel list
 *
 * Remove FLAG_SCAN_ONLY_IF_RNR_FOUND flag in channel if ssid is different for
 * colocated AP, in pno scan request
 *
 * Return: None
 */
void
scm_filter_rnr_flag_pno(struct wlan_objmgr_vdev *vdev,
			uint32_t short_ssid,
			struct chan_list *chan_list);

#else
static inline QDF_STATUS scm_channel_list_db_init(struct wlan_objmgr_psoc *psoc)
{
@@ -259,6 +278,13 @@ QDF_STATUS scm_channel_list_db_deinit(struct wlan_objmgr_psoc *psoc)
{
	return QDF_STATUS_SUCCESS;
}

static inline void
scm_filter_rnr_flag_pno(struct wlan_objmgr_vdev *vdev,
			uint32_t short_ssid,
			struct chan_list *chan_list)
{
}
#endif

/**
Loading