xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/utf/src/wlan_cm_utf_scan.c (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /*
18  * DOC: Implements scan functinality for CM UTF
19  */
20 
21 #ifdef FEATURE_CM_UTF_ENABLE
22 #include <wlan_cm_utf.h>
23 #include <qdf_str.h>
24 
25 struct wlan_cm_utf_raw_bcn {
26 	uint32_t channel_number;
27 	int32_t rssi;
28 	uint8_t band;
29 	uint8_t bssid[QDF_MAC_ADDR_SIZE];
30 	uint8_t ssid[WLAN_SSID_MAX_LEN];
31 };
32 
33 static void wlan_cm_utf_scan_db_update(struct wlan_objmgr_vdev *vdev,
34 				       void *buffer)
35 {
36 	struct wlan_objmgr_pdev *pdev;
37 	struct wlan_cm_utf_raw_bcn *event = NULL;
38 	struct mgmt_rx_event_params *rx_param = NULL;
39 	struct wlan_objmgr_psoc *psoc;
40 	char *buff = (char *)buffer;
41 	char *token;
42 	uint32_t frame_len = 0;
43 	qdf_nbuf_t buf;
44 	struct ie_ssid ssid;
45 	struct ie_header *ie;
46 	struct wlan_frame_hdr *hdr;
47 
48 	pdev = wlan_vdev_get_pdev(vdev);
49 	if (!pdev) {
50 		mlme_err("Pdev is Null");
51 		return;
52 	}
53 
54 	psoc = wlan_pdev_get_psoc(pdev);
55 	if (!psoc) {
56 		mlme_err("Psoc is Null");
57 		return;
58 	}
59 
60 	while ((token = qdf_str_sep(&buff, "\n")) != NULL) {
61 		mlme_err("%s", token);
62 		event = qdf_mem_malloc(sizeof(struct wlan_cm_utf_raw_bcn));
63 		if (!event) {
64 			mlme_err("Failed to allocate event memory");
65 			return;
66 		}
67 		if (sscanf(token,
68 			   "%2x:%2x:%2x:%2x:%2x:%2x ,%u ,%u ,%u ,%s",
69 			   (unsigned int *)&event->bssid[0],
70 			   (unsigned int *)&event->bssid[1],
71 			   (unsigned int *)&event->bssid[2],
72 			   (unsigned int *)&event->bssid[3],
73 			   (unsigned int *)&event->bssid[4],
74 			   (unsigned int *)&event->bssid[5],
75 			   &event->channel_number,
76 			   (unsigned int *)&event->band,
77 			   &event->rssi,
78 			   event->ssid) != 10) {
79 			goto free_buf;
80 		}
81 		ssid.ssid_id = 0;	//Element id for ssid
82 		ssid.ssid_len = strlen(event->ssid);
83 		qdf_mem_copy(ssid.ssid, event->ssid, strlen(event->ssid));
84 
85 		rx_param = qdf_mem_malloc(sizeof(struct mgmt_rx_event_params));
86 		if (!rx_param) {
87 			mlme_err("Failed to allocate memory");
88 			goto free_buf;
89 		}
90 
91 		qdf_mem_zero(rx_param, sizeof(struct mgmt_rx_event_params));
92 		rx_param->snr = event->rssi;
93 		rx_param->channel = event->channel_number;
94 		rx_param->chan_freq = wlan_reg_chan_band_to_freq(
95 						pdev,
96 						event->channel_number,
97 						BIT(event->band));
98 
99 		rx_param->pdev_id = 0;
100 		frame_len = sizeof(struct wlan_frame_hdr) +
101 			    sizeof(struct wlan_bcn_frame) -
102 			    sizeof(struct ie_header) +
103 			    sizeof(struct ie_header) + ssid.ssid_len;
104 
105 		buf = qdf_nbuf_alloc(NULL, frame_len, 0, 0, FALSE);
106 		if (!buf) {
107 			mlme_err("Failed to allocate buffer");
108 			goto free_buf;
109 		}
110 
111 		qdf_nbuf_set_pktlen(buf, frame_len);
112 		qdf_mem_zero((uint8_t *)qdf_nbuf_data(buf), frame_len);
113 
114 		hdr = (struct wlan_frame_hdr *)qdf_nbuf_data(buf);
115 		qdf_mem_copy(hdr->i_addr3, event->bssid, QDF_MAC_ADDR_SIZE);
116 		qdf_mem_copy(hdr->i_addr2, event->bssid, QDF_MAC_ADDR_SIZE);
117 		ie = (struct ie_header *)(((uint8_t *)qdf_nbuf_data(buf))
118 				+ sizeof(struct wlan_frame_hdr)
119 				+ offsetof(struct wlan_bcn_frame, ie));
120 
121 		qdf_mem_copy(ie, &ssid, sizeof(struct ie_ssid));
122 		tgt_scan_bcn_probe_rx_callback(psoc, NULL, buf,
123 					       rx_param, MGMT_BEACON);
124 free_buf:
125 		if (event) {
126 			qdf_mem_free(event);
127 			event = NULL;
128 		}
129 		if (rx_param) {
130 			qdf_mem_free(rx_param);
131 			rx_param = NULL;
132 		}
133 	}
134 }
135 
136 int wlan_cm_utf_scan_db_update_show(qdf_debugfs_file_t m, void *v)
137 {
138 	return 0;
139 }
140 
141 ssize_t wlan_cm_utf_scan_db_update_write(struct file *file,
142 					 const char __user *buf,
143 					 size_t count, loff_t *ppos)
144 {
145 	struct wlan_cm_utf *cm_utf =
146 			((struct seq_file *)file->private_data)->private;
147 	char *locbuf;
148 
149 	if ((!buf) || (count <= 0))
150 		return -EFAULT;
151 
152 	locbuf = (char *)qdf_mem_malloc(count);
153 
154 	if (!locbuf)
155 		return -EFAULT;
156 
157 	qdf_mem_zero(locbuf, count);
158 
159 	if (copy_from_user(locbuf, buf, count))
160 		return -EFAULT;
161 
162 	wlan_cm_utf_scan_db_update(cm_utf->vdev, locbuf);
163 	qdf_mem_free(locbuf);
164 	return count;
165 }
166 #endif
167