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