1 /*
2  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef _IOT_SIM_CMN_API_I_H_
19 #define _IOT_SIM_CMN_API_I_H_
20 
21 #include "iot_sim_defs_i.h"
22 #include <qdf_net_types.h>
23 
24 #define MAX_BUFFER_SIZE 2048
25 /*
26  *                   IOT SIM User Buf Format
27  *
28  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29  * | FrmType/subtype |  Seq  | Offset | Length | content | Mac Addr |
30  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31  * |     1Byte       | 2Byte | 2Bytes | 2Bytes | Length  | 6 Bytes  |
32  *
33  */
34 #define USER_BUF_LEN (1 + 2 + 2 + 2 + MAX_BUFFER_SIZE + 6)
35 /*
36  *		IOT SIM User Buf Format for Drop
37  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++
38  * |FrmType/subtype| Seq |category|action| drop |MacAddr|
39  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++
40  * |   2Characters |2char| 2chars |2chars| 1char|17chars|
41  *
42  */
43 #define USER_BUF_LEN_DROP (2 + 2 + 2 + 2 + 1 + 17)
44 /*
45  *		IOT SIM User Buf Format for Drop
46  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++
47  * |FrmType/subtype| Seq |category|action| delay |MacAddr|
48  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++
49  * |   2Characters |2char| 2chars |2chars| 4char|17chars|
50  *
51  */
52 #define USER_BUF_LEN_DELAY (2 + 2 + 2 + 2 + 4 + 17)
53 
54 /**
55  * wlan_iot_sim_pdev_obj_create_handler() - handler for pdev object create
56  * @pdev: reference to global pdev object
57  * @arg:  reference to argument provided during registration of handler
58  *
59  * This is a handler to indicate pdev object created. Hence iot_sim_context
60  * object can be created and attached to pdev component list.
61  *
62  * Return: QDF_STATUS_SUCCESS on success
63  *         QDF_STATUS_E_FAILURE if pdev is null
64  *         QDF_STATUS_E_NOMEM on failure of iot_sim object allocation
65  */
66 QDF_STATUS wlan_iot_sim_pdev_obj_create_handler(struct wlan_objmgr_pdev *pdev,
67 						void *arg);
68 
69 /**
70  * wlan_iot_sim_pdev_obj_destroy_handler() - handler for pdev object delete
71  * @pdev: reference to global pdev object
72  * @arg:  reference to argument provided during registration of handler
73  *
74  * This is a handler to indicate pdev object going to be deleted.
75  * Hence iot_sim_context object can be detached from pdev component list.
76  * Then iot_sim_context object can be deleted.
77  *
78  * Return: QDF_STATUS_SUCCESS on success
79  *         QDF_STATUS_E_FAILURE on failure
80  */
81 QDF_STATUS wlan_iot_sim_pdev_obj_destroy_handler(struct wlan_objmgr_pdev *pdev,
82 						 void *arg);
83 
84 /**
85  * iot_sim_get_index_for_action_frm - Provides the action frame index
86  * @frm: action frame
87  * @cat: action frame category
88  * @act: action frame details
89  * @rx: TRUE if its getting called in the rx path
90  *
91  * Provides the simulation database index for the action frame.
92  *
93  * Return: QDF_STATUS_SUCCESS on success
94  *         QDF_STATUS_E_FAILURE on failure
95  */
96 QDF_STATUS iot_sim_get_index_for_action_frm(uint8_t *frm, uint8_t *cat,
97 					    uint8_t *act, bool rx);
98 
99 /**
100  * iot_sim_find_peer_from_mac() - function to find the iot sim peer data
101  *                                based on the mac address provided
102  *
103  * @isc: iot_sim pdev private object
104  * @mac: mac address of the peer
105  *
106  * Return: iot_sim_rule_per_peer reference if exists else NULL
107  */
108 struct iot_sim_rule_per_peer *
109 iot_sim_find_peer_from_mac(struct iot_sim_context *isc,
110 			   struct qdf_mac_addr *mac);
111 
112 /**
113  * iot_sim_frame_update() - Management frame update
114  * @pdev: reference to global pdev object
115  * @nbuf: frame buffer
116  * @param: beacon template parameters
117  * @tx: TRUE in case of tx
118  * @rx_param: mgmt_rx_event_params
119  *
120  * This function updates the outgoing management frame with
121  * the content stored in iot_sim_context.
122  *
123  * Return: QDF_STATUS_SUCCESS on success
124  * QDF_STATUS_E_FAILURE on failure
125  */
126 QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev,
127 				qdf_nbuf_t nbuf,
128 				struct beacon_tmpl_params *param,
129 				bool tx,
130 				struct mgmt_rx_event_params *rx_param);
131 
132 /**
133  * iot_sim_get_ctx_from_pdev() - API to get iot_sim context object
134  *                               from pdev
135  * @pdev : Reference to psoc global object
136  *
137  * This API used to get iot sim context object from global psoc reference.
138  * Null check should be done before invoking this inline function.
139  *
140  * Return : Reference to iot_sim_context object
141  *
142  */
143 static inline struct iot_sim_context *
iot_sim_get_ctx_from_pdev(struct wlan_objmgr_pdev * pdev)144 iot_sim_get_ctx_from_pdev(struct wlan_objmgr_pdev *pdev)
145 {
146 	struct iot_sim_context *isc = NULL;
147 
148 	if (pdev) {
149 		isc = wlan_objmgr_pdev_get_comp_private_obj(pdev,
150 							    WLAN_IOT_SIM_COMP);
151 	}
152 
153 	return isc;
154 }
155 
156 /**
157  * iot_sim_delete_rule_for_mac() - function to delete content change rule
158  *                                 for given peer mac
159  * @isc: iot sim context
160  * @oper: iot sim operation
161  * @seq: authentication sequence number, mostly 0 for non-authentication frame
162  * @type: 802.11 frame type
163  * @subtype: 802.11 frame subtype
164  * @mac: peer mac address
165  * @action: action frame or not
166  *
167  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
168  */
169 QDF_STATUS
170 iot_sim_delete_rule_for_mac(struct iot_sim_context *isc,
171 			    enum iot_sim_operations oper,
172 			    uint16_t seq, uint8_t type,
173 			    uint8_t subtype,
174 			    struct qdf_mac_addr *mac,
175 			    bool action);
176 /**
177  * iot_sim_parse_user_input_content_change() - function to parse user input into
178  *					       predefined format for content
179  *					       change operation.
180  * @isc: iot sim context
181  * @userbuf: local copy of user input
182  * @count: length of userbuf
183  * @t_st: address of type variable
184  * @seq: address of seq variable
185  * @offset: address of offset variable
186  * @length: address of length variable
187  * @content: double pointer to storage to store frame content after processing
188  * @mac: pointer to mac address
189  *
190  * All arguments passed will be filled upon success
191  *
192  * Return: QDF_STATUS_SUCCESS on success
193  *	   QDF_STATUS_E_FAILURE otherwise
194  */
195 QDF_STATUS
196 iot_sim_parse_user_input_content_change(struct iot_sim_context *isc,
197 					char *userbuf, ssize_t count,
198 					uint8_t *t_st, uint16_t *seq,
199 					uint16_t *offset, uint16_t *length,
200 					uint8_t **content,
201 					struct qdf_mac_addr *mac);
202 #endif /* _IOT_SIM_CMN_API_I_H_ */
203