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