1 /*
2  * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * sys_entry_func.cc - This file has all the system level entry functions
22  *                   for all the defined threads at system level.
23  * Author:    V. K. Kandarpa
24  * Date:      01/16/2002
25  * History:-
26  * Date       Modified by            Modification Information
27  * --------------------------------------------------------------------------
28  *
29  */
30 /* Standard include files */
31 
32 /* Application Specific include files */
33 #include "sir_common.h"
34 #include "ani_global.h"
35 
36 #include "lim_api.h"
37 #include "sch_api.h"
38 #include "utils_api.h"
39 
40 #include "sys_def.h"
41 #include "sys_entry_func.h"
42 #include "sys_startup.h"
43 #include "lim_trace.h"
44 #include "wma_types.h"
45 #include "qdf_types.h"
46 #include "cds_packet.h"
47 
48 /**
49  * sys_init_globals
50  *
51  * FUNCTION:
52  *    Initializes system level global parameters
53  *
54  * LOGIC:
55  *
56  * ASSUMPTIONS:
57  *
58  * NOTE:
59  *
60  * @param struct mac_context *Sirius software parameter struct pointer
61  * @return None
62  */
63 
sys_init_globals(struct mac_context * mac)64 QDF_STATUS sys_init_globals(struct mac_context *mac)
65 {
66 
67 	qdf_mem_zero((uint8_t *) &mac->sys, sizeof(mac->sys));
68 
69 	mac->sys.gSysEnableLinkMonitorMode = 0;
70 
71 	return QDF_STATUS_SUCCESS;
72 }
73 
sys_bbt_process_message_core(struct mac_context * mac_ctx,struct scheduler_msg * msg,uint32_t type,uint32_t subtype)74 QDF_STATUS sys_bbt_process_message_core(struct mac_context *mac_ctx,
75 					struct scheduler_msg *msg,
76 					uint32_t type, uint32_t subtype)
77 {
78 	uint32_t framecount;
79 	QDF_STATUS ret;
80 	void *bd_ptr;
81 	tMgmtFrmDropReason dropreason;
82 	cds_pkt_t *vos_pkt = (cds_pkt_t *) msg->bodyptr;
83 	QDF_STATUS qdf_status = wma_ds_peek_rx_packet_info(vos_pkt, &bd_ptr);
84 
85 	mac_ctx->sys.gSysBbtReceived++;
86 
87 	if (!QDF_IS_STATUS_SUCCESS(qdf_status))
88 		goto fail;
89 
90 	mac_ctx->sys.gSysFrameCount[type][subtype]++;
91 	framecount = mac_ctx->sys.gSysFrameCount[type][subtype];
92 
93 	if (type == SIR_MAC_MGMT_FRAME) {
94 		tpSirMacMgmtHdr mac_hdr;
95 
96 		/*
97 		 * Drop beacon frames in deferred state to avoid VOSS run out of
98 		 * message wrappers.
99 		 */
100 		if ((subtype == SIR_MAC_MGMT_BEACON) &&
101 		     !GET_LIM_PROCESS_DEFD_MESGS(mac_ctx)) {
102 			pe_debug("dropping received beacon in deferred state");
103 			goto fail;
104 		}
105 
106 		dropreason = lim_is_pkt_candidate_for_drop(mac_ctx, bd_ptr,
107 				subtype);
108 		if (eMGMT_DROP_NO_DROP != dropreason) {
109 			pe_debug("Mgmt Frame %d being dropped, reason: %d\n",
110 				subtype, dropreason);
111 				MTRACE(mac_trace(mac_ctx,
112 					TRACE_CODE_RX_MGMT_DROP, NO_SESSION,
113 					dropreason));
114 			goto fail;
115 		}
116 
117 		mac_hdr = WMA_GET_RX_MAC_HEADER(bd_ptr);
118 		if (subtype == SIR_MAC_MGMT_ASSOC_REQ) {
119 			pe_debug("ASSOC REQ frame allowed: da: " QDF_MAC_ADDR_FMT ", sa: " QDF_MAC_ADDR_FMT ", bssid: " QDF_MAC_ADDR_FMT ", Assoc Req count so far: %d",
120 				 QDF_MAC_ADDR_REF(mac_hdr->da),
121 				 QDF_MAC_ADDR_REF(mac_hdr->sa),
122 				 QDF_MAC_ADDR_REF(mac_hdr->bssId),
123 				 mac_ctx->sys.gSysFrameCount[type][subtype]);
124 		}
125 		if (subtype == SIR_MAC_MGMT_DEAUTH) {
126 			pe_debug("DEAUTH frame allowed: da: " QDF_MAC_ADDR_FMT ", sa: " QDF_MAC_ADDR_FMT ", bssid: " QDF_MAC_ADDR_FMT ", DEAUTH count so far: %d",
127 				 QDF_MAC_ADDR_REF(mac_hdr->da),
128 				 QDF_MAC_ADDR_REF(mac_hdr->sa),
129 				 QDF_MAC_ADDR_REF(mac_hdr->bssId),
130 				 mac_ctx->sys.gSysFrameCount[type][subtype]);
131 		}
132 		if (subtype == SIR_MAC_MGMT_DISASSOC) {
133 			pe_debug("DISASSOC frame allowed: da: " QDF_MAC_ADDR_FMT ", sa: " QDF_MAC_ADDR_FMT ", bssid: " QDF_MAC_ADDR_FMT ", DISASSOC count so far: %d",
134 				 QDF_MAC_ADDR_REF(mac_hdr->da),
135 				 QDF_MAC_ADDR_REF(mac_hdr->sa),
136 				 QDF_MAC_ADDR_REF(mac_hdr->bssId),
137 				 mac_ctx->sys.gSysFrameCount[type][subtype]);
138 		}
139 
140 		/* Post the message to PE Queue */
141 		ret = lim_post_msg_api(mac_ctx, msg);
142 		if (ret != QDF_STATUS_SUCCESS) {
143 			pe_err("posting to LIM2 failed, ret %d\n", ret);
144 			goto fail;
145 		}
146 		mac_ctx->sys.gSysBbtPostedToLim++;
147 #ifdef FEATURE_WLAN_ESE
148 	} else if (type == SIR_MAC_DATA_FRAME) {
149 		pe_debug("IAPP Frame...");
150 		/* Post the message to PE Queue */
151 		ret = lim_post_msg_api(mac_ctx, msg);
152 		if (ret != QDF_STATUS_SUCCESS) {
153 			pe_err("posting to LIM2 failed, ret: %d", ret);
154 			goto fail;
155 		}
156 		mac_ctx->sys.gSysBbtPostedToLim++;
157 #endif
158 	} else {
159 		pe_debug("BBT received Invalid type: %d subtype: %d "
160 			"LIM state %X", type, subtype,
161 			lim_get_sme_state(mac_ctx));
162 		goto fail;
163 	}
164 	return QDF_STATUS_SUCCESS;
165 fail:
166 	mac_ctx->sys.gSysBbtDropped++;
167 	return QDF_STATUS_E_FAILURE;
168 }
169 
170