1 /* 2 * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /*======================================================================== 20 21 \file epping_main.c 22 23 \brief WLAN End Point Ping test tool implementation 24 25 ========================================================================*/ 26 27 /*-------------------------------------------------------------------------- 28 Include Files 29 ------------------------------------------------------------------------*/ 30 #include <cds_api.h> 31 #include <cds_sched.h> 32 #include <linux/etherdevice.h> 33 #include <linux/firmware.h> 34 #include <linux/delay.h> 35 #include <wni_api.h> 36 #include <wlan_ptt_sock_svc.h> 37 #include <linux/wireless.h> 38 #include <net/cfg80211.h> 39 #include <linux/rtnetlink.h> 40 #include <linux/semaphore.h> 41 #include <linux/delay.h> 42 #include <linux/ctype.h> 43 #include "epping_main.h" 44 #include "epping_internal.h" 45 epping_cookie_init(epping_context_t * pEpping_ctx)46 int epping_cookie_init(epping_context_t *pEpping_ctx) 47 { 48 uint32_t i, j; 49 50 pEpping_ctx->cookie_list = NULL; 51 pEpping_ctx->cookie_count = 0; 52 for (i = 0; i < MAX_COOKIE_SLOTS_NUM; i++) { 53 pEpping_ctx->s_cookie_mem[i] = 54 qdf_mem_malloc(sizeof(struct epping_cookie) * 55 MAX_COOKIE_SLOT_SIZE); 56 if (!pEpping_ctx->s_cookie_mem[i]) 57 goto error; 58 } 59 qdf_spinlock_create(&pEpping_ctx->cookie_lock); 60 61 for (i = 0; i < MAX_COOKIE_SLOTS_NUM; i++) { 62 struct epping_cookie *cookie_mem = pEpping_ctx->s_cookie_mem[i]; 63 for (j = 0; j < MAX_COOKIE_SLOT_SIZE; j++) { 64 epping_free_cookie(pEpping_ctx, &cookie_mem[j]); 65 } 66 } 67 return 0; 68 error: 69 for (i = 0; i < MAX_COOKIE_SLOTS_NUM; i++) { 70 if (pEpping_ctx->s_cookie_mem[i]) { 71 qdf_mem_free(pEpping_ctx->s_cookie_mem[i]); 72 pEpping_ctx->s_cookie_mem[i] = NULL; 73 } 74 } 75 return -ENOMEM; 76 } 77 78 /* cleanup cookie queue */ epping_cookie_cleanup(epping_context_t * pEpping_ctx)79 void epping_cookie_cleanup(epping_context_t *pEpping_ctx) 80 { 81 int i; 82 qdf_spin_lock_bh(&pEpping_ctx->cookie_lock); 83 pEpping_ctx->cookie_list = NULL; 84 pEpping_ctx->cookie_count = 0; 85 qdf_spin_unlock_bh(&pEpping_ctx->cookie_lock); 86 for (i = 0; i < MAX_COOKIE_SLOTS_NUM; i++) { 87 if (pEpping_ctx->s_cookie_mem[i]) { 88 qdf_mem_free(pEpping_ctx->s_cookie_mem[i]); 89 pEpping_ctx->s_cookie_mem[i] = NULL; 90 } 91 } 92 } 93 epping_free_cookie(epping_context_t * pEpping_ctx,struct epping_cookie * cookie)94 void epping_free_cookie(epping_context_t *pEpping_ctx, 95 struct epping_cookie *cookie) 96 { 97 qdf_spin_lock_bh(&pEpping_ctx->cookie_lock); 98 cookie->next = pEpping_ctx->cookie_list; 99 pEpping_ctx->cookie_list = cookie; 100 pEpping_ctx->cookie_count++; 101 qdf_spin_unlock_bh(&pEpping_ctx->cookie_lock); 102 } 103 epping_alloc_cookie(epping_context_t * pEpping_ctx)104 struct epping_cookie *epping_alloc_cookie(epping_context_t *pEpping_ctx) 105 { 106 struct epping_cookie *cookie; 107 108 qdf_spin_lock_bh(&pEpping_ctx->cookie_lock); 109 cookie = pEpping_ctx->cookie_list; 110 if (cookie) { 111 pEpping_ctx->cookie_list = cookie->next; 112 pEpping_ctx->cookie_count--; 113 } 114 qdf_spin_unlock_bh(&pEpping_ctx->cookie_lock); 115 return cookie; 116 } 117 epping_get_dummy_mac_addr(tSirMacAddr macAddr)118 void epping_get_dummy_mac_addr(tSirMacAddr macAddr) 119 { 120 macAddr[0] = 69; /* E */ 121 macAddr[1] = 80; /* P */ 122 macAddr[2] = 80; /* P */ 123 macAddr[3] = 73; /* I */ 124 macAddr[4] = 78; /* N */ 125 macAddr[5] = 71; /* G */ 126 } 127 epping_hex_dump(void * data,int buf_len,const char * str)128 void epping_hex_dump(void *data, int buf_len, const char *str) 129 { 130 EPPING_LOG(QDF_TRACE_LEVEL_FATAL, "%s: E, %s", __func__, str); 131 132 EPPING_HEX_DUMP(QDF_TRACE_LEVEL_INFO, data, buf_len); 133 134 EPPING_LOG(QDF_TRACE_LEVEL_FATAL, "%s: X %s", __func__, str); 135 } 136 epping_get_qdf_ctx(void)137 void *epping_get_qdf_ctx(void) 138 { 139 qdf_device_t *qdf_ctx; 140 141 qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); 142 return qdf_ctx; 143 } 144 epping_log_packet(epping_adapter_t * adapter,EPPING_HEADER * eppingHdr,int ret,const char * str)145 void epping_log_packet(epping_adapter_t *adapter, 146 EPPING_HEADER *eppingHdr, int ret, const char *str) 147 { 148 if (eppingHdr->Cmd_h & EPPING_LOG_MASK) { 149 EPPING_LOG(QDF_TRACE_LEVEL_FATAL, 150 "%s: cmd = %d, seqNo = %u, flag = 0x%x, ret = %d, " 151 "txCount = %lu, txDrop = %lu, txBytes = %lu," 152 "rxCount = %lu, rxDrop = %lu, rxBytes = %lu\n", 153 str, eppingHdr->Cmd_h, eppingHdr->SeqNo, 154 eppingHdr->CmdFlags_h, ret, 155 adapter->stats.tx_packets, 156 adapter->stats.tx_dropped, 157 adapter->stats.tx_bytes, 158 adapter->stats.rx_packets, 159 adapter->stats.rx_dropped, 160 adapter->stats.rx_bytes); 161 } 162 } 163 epping_log_stats(epping_adapter_t * adapter,const char * str)164 void epping_log_stats(epping_adapter_t *adapter, const char *str) 165 { 166 EPPING_LOG(QDF_TRACE_LEVEL_FATAL, 167 "%s: txCount = %lu, txDrop = %lu, tx_bytes = %lu, " 168 "rxCount = %lu, rxDrop = %lu, rx_bytes = %lu, tx_acks = %u\n", 169 str, 170 adapter->stats.tx_packets, 171 adapter->stats.tx_dropped, 172 adapter->stats.tx_bytes, 173 adapter->stats.rx_packets, 174 adapter->stats.rx_dropped, 175 adapter->stats.rx_bytes, 176 adapter->pEpping_ctx->total_tx_acks); 177 } 178 epping_set_kperf_flag(epping_adapter_t * adapter,HTC_ENDPOINT_ID eid,uint8_t kperf_flag)179 void epping_set_kperf_flag(epping_adapter_t *adapter, 180 HTC_ENDPOINT_ID eid, uint8_t kperf_flag) 181 { 182 adapter->pEpping_ctx->kperf_num_rx_recv[eid] = 0; 183 adapter->pEpping_ctx->kperf_num_tx_acks[eid] = 0; 184 } 185