1 #ifndef _UAPI_MSM_IPA_H_
2 #define _UAPI_MSM_IPA_H_
3 
4 #ifndef __KERNEL__
5 #include <stdint.h>
6 #include <stddef.h>
7 #include <sys/stat.h>
8 #endif
9 #include <linux/ioctl.h>
10 #include <linux/types.h>
11 #include <linux/if_ether.h>
12 
13 /**
14  * unique magic number of the IPA device
15  */
16 #define IPA_IOC_MAGIC 0xCF
17 
18 /**
19  * name of the default routing tables for v4 and v6
20  */
21 #define IPA_DFLT_RT_TBL_NAME "ipa_dflt_rt"
22 
23 /**
24  *   the commands supported by IPA driver
25  */
26 #define IPA_IOCTL_ADD_HDR            0
27 #define IPA_IOCTL_DEL_HDR            1
28 #define IPA_IOCTL_ADD_RT_RULE        2
29 #define IPA_IOCTL_DEL_RT_RULE        3
30 #define IPA_IOCTL_ADD_FLT_RULE       4
31 #define IPA_IOCTL_DEL_FLT_RULE       5
32 #define IPA_IOCTL_COMMIT_HDR         6
33 #define IPA_IOCTL_RESET_HDR          7
34 #define IPA_IOCTL_COMMIT_RT          8
35 #define IPA_IOCTL_RESET_RT           9
36 #define IPA_IOCTL_COMMIT_FLT        10
37 #define IPA_IOCTL_RESET_FLT         11
38 #define IPA_IOCTL_DUMP              12
39 #define IPA_IOCTL_GET_RT_TBL        13
40 #define IPA_IOCTL_PUT_RT_TBL        14
41 #define IPA_IOCTL_COPY_HDR          15
42 #define IPA_IOCTL_QUERY_INTF        16
43 #define IPA_IOCTL_QUERY_INTF_TX_PROPS 17
44 #define IPA_IOCTL_QUERY_INTF_RX_PROPS 18
45 #define IPA_IOCTL_GET_HDR           19
46 #define IPA_IOCTL_PUT_HDR           20
47 #define IPA_IOCTL_SET_FLT        21
48 #define IPA_IOCTL_ALLOC_NAT_MEM  22
49 #define IPA_IOCTL_V4_INIT_NAT    23
50 #define IPA_IOCTL_NAT_DMA        24
51 #define IPA_IOCTL_V4_DEL_NAT     26
52 #define IPA_IOCTL_PULL_MSG       27
53 #define IPA_IOCTL_GET_NAT_OFFSET 28
54 #define IPA_IOCTL_RM_ADD_DEPENDENCY 29
55 #define IPA_IOCTL_RM_DEL_DEPENDENCY 30
56 #define IPA_IOCTL_GENERATE_FLT_EQ 31
57 #define IPA_IOCTL_QUERY_INTF_EXT_PROPS 32
58 #define IPA_IOCTL_QUERY_EP_MAPPING 33
59 #define IPA_IOCTL_QUERY_RT_TBL_INDEX 34
60 #define IPA_IOCTL_WRITE_QMAPID 35
61 #define IPA_IOCTL_MDFY_FLT_RULE 36
62 #define IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_ADD	37
63 #define IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_DEL	38
64 #define IPA_IOCTL_NOTIFY_WAN_EMBMS_CONNECTED	39
65 #define IPA_IOCTL_ADD_HDR_PROC_CTX 40
66 #define IPA_IOCTL_DEL_HDR_PROC_CTX 41
67 #define IPA_IOCTL_MDFY_RT_RULE 42
68 #define IPA_IOCTL_ADD_RT_RULE_AFTER 43
69 #define IPA_IOCTL_ADD_FLT_RULE_AFTER 44
70 #define IPA_IOCTL_GET_HW_VERSION 45
71 #define IPA_IOCTL_MAX 46
72 
73 /**
74  * max size of the header to be inserted
75  */
76 #define IPA_HDR_MAX_SIZE 64
77 
78 /**
79  * max size of the name of the resource (routing table, header)
80  */
81 #define IPA_RESOURCE_NAME_MAX 32
82 
83 /**
84  * max number of interface properties
85  */
86 #define IPA_NUM_PROPS_MAX 35
87 
88 /**
89  * size of the mac address
90  */
91 #define IPA_MAC_ADDR_SIZE  6
92 
93 /**
94  * max number of mbim streams
95  */
96 #define IPA_MBIM_MAX_STREAM_NUM 8
97 
98 /**
99  * the attributes of the rule (routing or filtering)
100  */
101 #define IPA_FLT_TOS			(1ul << 0)
102 #define IPA_FLT_PROTOCOL		(1ul << 1)
103 #define IPA_FLT_SRC_ADDR		(1ul << 2)
104 #define IPA_FLT_DST_ADDR		(1ul << 3)
105 #define IPA_FLT_SRC_PORT_RANGE		(1ul << 4)
106 #define IPA_FLT_DST_PORT_RANGE		(1ul << 5)
107 #define IPA_FLT_TYPE			(1ul << 6)
108 #define IPA_FLT_CODE			(1ul << 7)
109 #define IPA_FLT_SPI			(1ul << 8)
110 #define IPA_FLT_SRC_PORT		(1ul << 9)
111 #define IPA_FLT_DST_PORT		(1ul << 10)
112 #define IPA_FLT_TC			(1ul << 11)
113 #define IPA_FLT_FLOW_LABEL		(1ul << 12)
114 #define IPA_FLT_NEXT_HDR		(1ul << 13)
115 #define IPA_FLT_META_DATA		(1ul << 14)
116 #define IPA_FLT_FRAGMENT		(1ul << 15)
117 #define IPA_FLT_TOS_MASKED		(1ul << 16)
118 #define IPA_FLT_MAC_SRC_ADDR_ETHER_II	(1ul << 17)
119 #define IPA_FLT_MAC_DST_ADDR_ETHER_II	(1ul << 18)
120 #define IPA_FLT_MAC_SRC_ADDR_802_3	(1ul << 19)
121 #define IPA_FLT_MAC_DST_ADDR_802_3	(1ul << 20)
122 #define IPA_FLT_MAC_ETHER_TYPE		(1ul << 21)
123 
124 /**
125  * enum ipa_client_type - names for the various IPA "clients"
126  * these are from the perspective of the clients, for e.g.
127  * HSIC1_PROD means HSIC client is the producer and IPA is the
128  * consumer
129  */
130 enum ipa_client_type {
131 	IPA_CLIENT_PROD,
132 	IPA_CLIENT_HSIC1_PROD = IPA_CLIENT_PROD,
133 	IPA_CLIENT_WLAN1_PROD,
134 	IPA_CLIENT_HSIC2_PROD,
135 	IPA_CLIENT_USB2_PROD,
136 	IPA_CLIENT_HSIC3_PROD,
137 	IPA_CLIENT_USB3_PROD,
138 	IPA_CLIENT_HSIC4_PROD,
139 	IPA_CLIENT_USB4_PROD,
140 	IPA_CLIENT_HSIC5_PROD,
141 	IPA_CLIENT_USB_PROD,
142 	IPA_CLIENT_A5_WLAN_AMPDU_PROD,
143 	IPA_CLIENT_A2_EMBEDDED_PROD,
144 	IPA_CLIENT_A2_TETHERED_PROD,
145 	IPA_CLIENT_APPS_LAN_WAN_PROD,
146 	IPA_CLIENT_APPS_CMD_PROD,
147 	IPA_CLIENT_ODU_PROD,
148 	IPA_CLIENT_MHI_PROD,
149 	IPA_CLIENT_Q6_LAN_PROD,
150 	IPA_CLIENT_Q6_WAN_PROD,
151 	IPA_CLIENT_Q6_CMD_PROD,
152 	IPA_CLIENT_MEMCPY_DMA_SYNC_PROD,
153 	IPA_CLIENT_MEMCPY_DMA_ASYNC_PROD,
154 	IPA_CLIENT_Q6_DECOMP_PROD,
155 	IPA_CLIENT_Q6_DECOMP2_PROD,
156 	IPA_CLIENT_UC_USB_PROD,
157 
158 	/* Below PROD client type is only for test purpose */
159 	IPA_CLIENT_TEST_PROD,
160 	IPA_CLIENT_TEST1_PROD,
161 	IPA_CLIENT_TEST2_PROD,
162 	IPA_CLIENT_TEST3_PROD,
163 	IPA_CLIENT_TEST4_PROD,
164 
165 	IPA_CLIENT_CONS,
166 	IPA_CLIENT_HSIC1_CONS = IPA_CLIENT_CONS,
167 	IPA_CLIENT_WLAN1_CONS,
168 	IPA_CLIENT_HSIC2_CONS,
169 	IPA_CLIENT_USB2_CONS,
170 	IPA_CLIENT_WLAN2_CONS,
171 	IPA_CLIENT_HSIC3_CONS,
172 	IPA_CLIENT_USB3_CONS,
173 	IPA_CLIENT_WLAN3_CONS,
174 	IPA_CLIENT_HSIC4_CONS,
175 	IPA_CLIENT_USB4_CONS,
176 	IPA_CLIENT_WLAN4_CONS,
177 	IPA_CLIENT_HSIC5_CONS,
178 	IPA_CLIENT_USB_CONS,
179 	IPA_CLIENT_USB_DPL_CONS,
180 	IPA_CLIENT_A2_EMBEDDED_CONS,
181 	IPA_CLIENT_A2_TETHERED_CONS,
182 	IPA_CLIENT_A5_LAN_WAN_CONS,
183 	IPA_CLIENT_APPS_LAN_CONS,
184 	IPA_CLIENT_APPS_WAN_CONS,
185 	IPA_CLIENT_ODU_EMB_CONS,
186 	IPA_CLIENT_ODU_TETH_CONS,
187 	IPA_CLIENT_MHI_CONS,
188 	IPA_CLIENT_Q6_LAN_CONS,
189 	IPA_CLIENT_Q6_WAN_CONS,
190 	IPA_CLIENT_Q6_DUN_CONS,
191 	IPA_CLIENT_MEMCPY_DMA_SYNC_CONS,
192 	IPA_CLIENT_MEMCPY_DMA_ASYNC_CONS,
193 	IPA_CLIENT_Q6_DECOMP_CONS,
194 	IPA_CLIENT_Q6_DECOMP2_CONS,
195 	IPA_CLIENT_Q6_LTE_WIFI_AGGR_CONS,
196 	/* Below CONS client type is only for test purpose */
197 	IPA_CLIENT_TEST_CONS,
198 	IPA_CLIENT_TEST1_CONS,
199 	IPA_CLIENT_TEST2_CONS,
200 	IPA_CLIENT_TEST3_CONS,
201 	IPA_CLIENT_TEST4_CONS,
202 
203 	IPA_CLIENT_MAX,
204 };
205 
206 #define IPA_CLIENT_IS_APPS_CONS(client) \
207 	((client) == IPA_CLIENT_APPS_LAN_CONS || \
208 	(client) == IPA_CLIENT_APPS_WAN_CONS)
209 
210 #define IPA_CLIENT_IS_USB_CONS(client) \
211 	((client) == IPA_CLIENT_USB_CONS || \
212 	(client) == IPA_CLIENT_USB2_CONS || \
213 	(client) == IPA_CLIENT_USB3_CONS || \
214 	(client) == IPA_CLIENT_USB_DPL_CONS || \
215 	(client) == IPA_CLIENT_USB4_CONS)
216 
217 #define IPA_CLIENT_IS_WLAN_CONS(client) \
218 	((client) == IPA_CLIENT_WLAN1_CONS || \
219 	(client) == IPA_CLIENT_WLAN2_CONS || \
220 	(client) == IPA_CLIENT_WLAN3_CONS || \
221 	(client) == IPA_CLIENT_WLAN4_CONS)
222 
223 #define IPA_CLIENT_IS_ODU_CONS(client) \
224 	((client) == IPA_CLIENT_ODU_EMB_CONS || \
225 	(client) == IPA_CLIENT_ODU_TETH_CONS)
226 
227 #define IPA_CLIENT_IS_Q6_CONS(client) \
228 	((client) == IPA_CLIENT_Q6_LAN_CONS || \
229 	(client) == IPA_CLIENT_Q6_WAN_CONS || \
230 	(client) == IPA_CLIENT_Q6_DUN_CONS || \
231 	(client) == IPA_CLIENT_Q6_DECOMP_CONS || \
232 	(client) == IPA_CLIENT_Q6_DECOMP2_CONS || \
233 	(client) == IPA_CLIENT_Q6_LTE_WIFI_AGGR_CONS)
234 
235 #define IPA_CLIENT_IS_Q6_PROD(client) \
236 	((client) == IPA_CLIENT_Q6_LAN_PROD || \
237 	(client) == IPA_CLIENT_Q6_WAN_PROD || \
238 	(client) == IPA_CLIENT_Q6_CMD_PROD || \
239 	(client) == IPA_CLIENT_Q6_DECOMP_PROD || \
240 	(client) == IPA_CLIENT_Q6_DECOMP2_PROD)
241 
242 #define IPA_CLIENT_IS_Q6_NON_ZIP_CONS(client) \
243 	((client) == IPA_CLIENT_Q6_LAN_CONS || \
244 	(client) == IPA_CLIENT_Q6_WAN_CONS || \
245 	(client) == IPA_CLIENT_Q6_DUN_CONS || \
246 	(client) == IPA_CLIENT_Q6_LTE_WIFI_AGGR_CONS)
247 
248 #define IPA_CLIENT_IS_Q6_ZIP_CONS(client) \
249 	((client) == IPA_CLIENT_Q6_DECOMP_CONS || \
250 	(client) == IPA_CLIENT_Q6_DECOMP2_CONS)
251 
252 #define IPA_CLIENT_IS_Q6_NON_ZIP_PROD(client) \
253 	((client) == IPA_CLIENT_Q6_LAN_PROD || \
254 	(client) == IPA_CLIENT_Q6_WAN_PROD || \
255 	(client) == IPA_CLIENT_Q6_CMD_PROD)
256 
257 #define IPA_CLIENT_IS_Q6_ZIP_PROD(client) \
258 	((client) == IPA_CLIENT_Q6_DECOMP_PROD || \
259 	(client) == IPA_CLIENT_Q6_DECOMP2_PROD)
260 
261 #define IPA_CLIENT_IS_MEMCPY_DMA_CONS(client) \
262 	((client) == IPA_CLIENT_MEMCPY_DMA_SYNC_CONS || \
263 	(client) == IPA_CLIENT_MEMCPY_DMA_ASYNC_CONS)
264 
265 #define IPA_CLIENT_IS_MEMCPY_DMA_PROD(client) \
266 	((client) == IPA_CLIENT_MEMCPY_DMA_SYNC_PROD || \
267 	(client) == IPA_CLIENT_MEMCPY_DMA_ASYNC_PROD)
268 
269 #define IPA_CLIENT_IS_MHI_CONS(client) \
270 	((client) == IPA_CLIENT_MHI_CONS)
271 
272 #define IPA_CLIENT_IS_MHI(client) \
273 	((client) == IPA_CLIENT_MHI_CONS || \
274 	(client) == IPA_CLIENT_MHI_PROD)
275 
276 #define IPA_CLIENT_IS_TEST_PROD(client) \
277 	((client) == IPA_CLIENT_TEST_PROD || \
278 	(client) == IPA_CLIENT_TEST1_PROD || \
279 	(client) == IPA_CLIENT_TEST2_PROD || \
280 	(client) == IPA_CLIENT_TEST3_PROD || \
281 	(client) == IPA_CLIENT_TEST4_PROD)
282 
283 #define IPA_CLIENT_IS_TEST_CONS(client) \
284 	((client) == IPA_CLIENT_TEST_CONS || \
285 	(client) == IPA_CLIENT_TEST1_CONS || \
286 	(client) == IPA_CLIENT_TEST2_CONS || \
287 	(client) == IPA_CLIENT_TEST3_CONS || \
288 	(client) == IPA_CLIENT_TEST4_CONS)
289 
290 #define IPA_CLIENT_IS_TEST(client) \
291 	(IPA_CLIENT_IS_TEST_PROD(client) || IPA_CLIENT_IS_TEST_CONS(client))
292 
293 /**
294  * enum ipa_ip_type - Address family: IPv4 or IPv6
295  */
296 enum ipa_ip_type {
297 	IPA_IP_v4,
298 	IPA_IP_v6,
299 	IPA_IP_MAX
300 };
301 
302 /**
303  * enum ipa_rule_type - Type of routing or filtering rule
304  * Hashable: Rule will be located at the hashable tables
305  * Non_Hashable: Rule will be located at the non-hashable tables
306  */
307 enum ipa_rule_type {
308 	IPA_RULE_HASHABLE,
309 	IPA_RULE_NON_HASHABLE,
310 	IPA_RULE_TYPE_MAX
311 };
312 
313 /**
314  * enum ipa_flt_action - action field of filtering rule
315  *
316  * Pass to routing: 5'd0
317  * Pass to source NAT: 5'd1
318  * Pass to destination NAT: 5'd2
319  * Pass to default output pipe (e.g., Apps or Modem): 5'd3
320  */
321 enum ipa_flt_action {
322 	IPA_PASS_TO_ROUTING,
323 	IPA_PASS_TO_SRC_NAT,
324 	IPA_PASS_TO_DST_NAT,
325 	IPA_PASS_TO_EXCEPTION
326 };
327 
328 /**
329  * enum ipa_wlan_event - Events for wlan client
330  *
331  * wlan client connect: New wlan client connected
332  * wlan client disconnect: wlan client disconnected
333  * wlan client power save: wlan client moved to power save
334  * wlan client normal: wlan client moved out of power save
335  * sw routing enable: ipa routing is disabled
336  * sw routing disable: ipa routing is enabled
337  * wlan ap connect: wlan AP(access point) is up
338  * wlan ap disconnect: wlan AP(access point) is down
339  * wlan sta connect: wlan STA(station) is up
340  * wlan sta disconnect: wlan STA(station) is down
341  * wlan client connect ex: new wlan client connected
342  * wlan scc switch: wlan interfaces in scc mode
343  * wlan mcc switch: wlan interfaces in mcc mode
344  * wlan wdi enable: wdi data path completed
345  * wlan wdi disable: wdi data path teardown
346  */
347 enum ipa_wlan_event {
348 	WLAN_CLIENT_CONNECT,
349 	WLAN_CLIENT_DISCONNECT,
350 	WLAN_CLIENT_POWER_SAVE_MODE,
351 	WLAN_CLIENT_NORMAL_MODE,
352 	SW_ROUTING_ENABLE,
353 	SW_ROUTING_DISABLE,
354 	WLAN_AP_CONNECT,
355 	WLAN_AP_DISCONNECT,
356 	WLAN_STA_CONNECT,
357 	WLAN_STA_DISCONNECT,
358 	WLAN_CLIENT_CONNECT_EX,
359 	WLAN_SWITCH_TO_SCC,
360 	WLAN_SWITCH_TO_MCC,
361 	WLAN_WDI_ENABLE,
362 	WLAN_WDI_DISABLE,
363 	IPA_WLAN_EVENT_MAX
364 };
365 
366 /**
367  * enum ipa_wan_event - Events for wan client
368  *
369  * wan default route add/del
370  * wan embms connect: New wan embms interface connected
371  */
372 enum ipa_wan_event {
373 	WAN_UPSTREAM_ROUTE_ADD = IPA_WLAN_EVENT_MAX,
374 	WAN_UPSTREAM_ROUTE_DEL,
375 	WAN_EMBMS_CONNECT,
376 	WAN_XLAT_CONNECT,
377 	IPA_WAN_EVENT_MAX
378 };
379 
380 enum ipa_ecm_event {
381 	ECM_CONNECT = IPA_WAN_EVENT_MAX,
382 	ECM_DISCONNECT,
383 	IPA_ECM_EVENT_MAX,
384 };
385 
386 enum ipa_tethering_stats_event {
387 	IPA_TETHERING_STATS_UPDATE_STATS = IPA_ECM_EVENT_MAX,
388 	IPA_TETHERING_STATS_UPDATE_NETWORK_STATS,
389 	IPA_TETHERING_STATS_EVENT_MAX,
390 	IPA_EVENT_MAX_NUM = IPA_TETHERING_STATS_EVENT_MAX
391 };
392 
393 #define IPA_EVENT_MAX ((int)IPA_EVENT_MAX_NUM)
394 
395 /**
396  * enum ipa_rm_resource_name - IPA RM clients identification names
397  *
398  * Add new mapping to ipa_rm_prod_index() / ipa_rm_cons_index()
399  * when adding new entry to this enum.
400  */
401 enum ipa_rm_resource_name {
402 	IPA_RM_RESOURCE_PROD = 0,
403 	IPA_RM_RESOURCE_Q6_PROD = IPA_RM_RESOURCE_PROD,
404 	IPA_RM_RESOURCE_USB_PROD,
405 	IPA_RM_RESOURCE_USB_DPL_DUMMY_PROD,
406 	IPA_RM_RESOURCE_HSIC_PROD,
407 	IPA_RM_RESOURCE_STD_ECM_PROD,
408 	IPA_RM_RESOURCE_RNDIS_PROD,
409 	IPA_RM_RESOURCE_WWAN_0_PROD,
410 	IPA_RM_RESOURCE_WLAN_PROD,
411 	IPA_RM_RESOURCE_ODU_ADAPT_PROD,
412 	IPA_RM_RESOURCE_MHI_PROD,
413 	IPA_RM_RESOURCE_PROD_MAX,
414 
415 	IPA_RM_RESOURCE_Q6_CONS = IPA_RM_RESOURCE_PROD_MAX,
416 	IPA_RM_RESOURCE_USB_CONS,
417 	IPA_RM_RESOURCE_USB_DPL_CONS,
418 	IPA_RM_RESOURCE_HSIC_CONS,
419 	IPA_RM_RESOURCE_WLAN_CONS,
420 	IPA_RM_RESOURCE_APPS_CONS,
421 	IPA_RM_RESOURCE_ODU_ADAPT_CONS,
422 	IPA_RM_RESOURCE_MHI_CONS,
423 	IPA_RM_RESOURCE_MAX
424 };
425 
426 /**
427  * enum ipa_hw_type - IPA hardware version type
428  * @IPA_HW_None: IPA hardware version not defined
429  * @IPA_HW_v1_0: IPA hardware version 1.0
430  * @IPA_HW_v1_1: IPA hardware version 1.1
431  * @IPA_HW_v2_0: IPA hardware version 2.0
432  * @IPA_HW_v2_1: IPA hardware version 2.1
433  * @IPA_HW_v2_5: IPA hardware version 2.5
434  * @IPA_HW_v2_6: IPA hardware version 2.6
435  * @IPA_HW_v2_6L: IPA hardware version 2.6L
436  * @IPA_HW_v3_0: IPA hardware version 3.0
437  */
438 enum ipa_hw_type {
439 	IPA_HW_None = 0,
440 	IPA_HW_v1_0 = 1,
441 	IPA_HW_v1_1 = 2,
442 	IPA_HW_v2_0 = 3,
443 	IPA_HW_v2_1 = 4,
444 	IPA_HW_v2_5 = 5,
445 	IPA_HW_v2_6 = IPA_HW_v2_5,
446 	IPA_HW_v2_6L = 6,
447 	IPA_HW_v3_0 = 10,
448 	IPA_HW_v3_1 = 11,
449 	IPA_HW_MAX
450 };
451 
452 /**
453  * struct ipa_rule_attrib - attributes of a routing/filtering
454  * rule, all in LE
455  * @attrib_mask: what attributes are valid
456  * @src_port_lo: low port of src port range
457  * @src_port_hi: high port of src port range
458  * @dst_port_lo: low port of dst port range
459  * @dst_port_hi: high port of dst port range
460  * @type: ICMP/IGMP type
461  * @code: ICMP/IGMP code
462  * @spi: IPSec SPI
463  * @src_port: exact src port
464  * @dst_port: exact dst port
465  * @meta_data: meta-data val
466  * @meta_data_mask: meta-data mask
467  * @u.v4.tos: type of service
468  * @u.v4.protocol: protocol
469  * @u.v4.src_addr: src address value
470  * @u.v4.src_addr_mask: src address mask
471  * @u.v4.dst_addr: dst address value
472  * @u.v4.dst_addr_mask: dst address mask
473  * @u.v6.tc: traffic class
474  * @u.v6.flow_label: flow label
475  * @u.v6.next_hdr: next header
476  * @u.v6.src_addr: src address val
477  * @u.v6.src_addr_mask: src address mask
478  * @u.v6.dst_addr: dst address val
479  * @u.v6.dst_addr_mask: dst address mask
480  */
481 struct ipa_rule_attrib {
482 	uint32_t attrib_mask;
483 	uint16_t src_port_lo;
484 	uint16_t src_port_hi;
485 	uint16_t dst_port_lo;
486 	uint16_t dst_port_hi;
487 	uint8_t type;
488 	uint8_t code;
489 	uint8_t tos_value;
490 	uint8_t tos_mask;
491 	uint32_t spi;
492 	uint16_t src_port;
493 	uint16_t dst_port;
494 	uint32_t meta_data;
495 	uint32_t meta_data_mask;
496 	uint8_t src_mac_addr[ETH_ALEN];
497 	uint8_t src_mac_addr_mask[ETH_ALEN];
498 	uint8_t dst_mac_addr[ETH_ALEN];
499 	uint8_t dst_mac_addr_mask[ETH_ALEN];
500 	uint16_t ether_type;
501 	union {
502 		struct {
503 			uint8_t tos;
504 			uint8_t protocol;
505 			uint32_t src_addr;
506 			uint32_t src_addr_mask;
507 			uint32_t dst_addr;
508 			uint32_t dst_addr_mask;
509 		} v4;
510 		struct {
511 			uint8_t tc;
512 			uint32_t flow_label;
513 			uint8_t next_hdr;
514 			uint32_t src_addr[4];
515 			uint32_t src_addr_mask[4];
516 			uint32_t dst_addr[4];
517 			uint32_t dst_addr_mask[4];
518 		} v6;
519 	} u;
520 };
521 
522 /*! @brief The maximum number of Mask Equal 32 Eqns */
523 #define IPA_IPFLTR_NUM_MEQ_32_EQNS 2
524 
525 /*! @brief The maximum number of IHL offset Mask Equal 32 Eqns */
526 #define IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS 2
527 
528 /*! @brief The maximum number of Mask Equal 128 Eqns */
529 #define IPA_IPFLTR_NUM_MEQ_128_EQNS 2
530 
531 /*! @brief The maximum number of IHL offset Range Check 16 Eqns */
532 #define IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS 2
533 
534 /*! @brief Offset and 16 bit comparison equation */
535 struct ipa_ipfltr_eq_16 {
536 	int8_t offset;
537 	uint16_t value;
538 };
539 
540 /*! @brief Offset and 32 bit comparison equation */
541 struct ipa_ipfltr_eq_32 {
542 	int8_t offset;
543 	uint32_t value;
544 };
545 
546 /*! @brief Offset and 128 bit masked comparison equation */
547 struct ipa_ipfltr_mask_eq_128 {
548 	int8_t offset;
549 	uint8_t mask[16];
550 	uint8_t value[16];
551 };
552 
553 /*! @brief Offset and 32 bit masked comparison equation */
554 struct ipa_ipfltr_mask_eq_32 {
555 	int8_t offset;
556 	uint32_t mask;
557 	uint32_t value;
558 };
559 
560 /*! @brief Equation for identifying a range. Ranges are inclusive */
561 struct ipa_ipfltr_range_eq_16 {
562 	int8_t offset;
563 	uint16_t range_low;
564 	uint16_t range_high;
565 };
566 
567 /*! @brief Rule equations which are set according to DS filter installation */
568 struct ipa_ipfltri_rule_eq {
569 	/*! 16-bit Bitmask to indicate how many eqs are valid in this rule  */
570 	uint16_t rule_eq_bitmap;
571 	/*! Specifies if a type of service check rule is present */
572 	uint8_t tos_eq_present;
573 	/*! The value to check against the type of service (ipv4) field */
574 	uint8_t tos_eq;
575 	/*! Specifies if a protocol check rule is present */
576 	uint8_t protocol_eq_present;
577 	/*! The value to check against the protocol (ipv6) field */
578 	uint8_t protocol_eq;
579 	/*! The number of ip header length offset 16 bit range check
580 	 * rules in this rule */
581 	uint8_t num_ihl_offset_range_16;
582 	/*! An array of the registered ip header length offset 16 bit
583 	 * range check rules */
584 	struct ipa_ipfltr_range_eq_16
585 		ihl_offset_range_16[IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS];
586 	/*! The number of mask equal 32 rules present in this rule */
587 	uint8_t num_offset_meq_32;
588 	/*! An array of all the possible mask equal 32 rules in this rule */
589 	struct ipa_ipfltr_mask_eq_32
590 		offset_meq_32[IPA_IPFLTR_NUM_MEQ_32_EQNS];
591 	/*! Specifies if the traffic class rule is present in this rule */
592 	uint8_t tc_eq_present;
593 	/*! The value to check the traffic class (ipv4) field against */
594 	uint8_t tc_eq;
595 	/*! Specifies if the flow equals rule is present in this rule */
596 	uint8_t fl_eq_present;
597 	/*! The value to check the flow (ipv6) field against */
598 	uint32_t fl_eq;
599 	/*! The number of ip header length offset 16 bit equations in this
600 	 * rule */
601 	uint8_t ihl_offset_eq_16_present;
602 	/*! The ip header length offset 16 bit equation */
603 	struct ipa_ipfltr_eq_16 ihl_offset_eq_16;
604 	/*! The number of ip header length offset 32 bit equations in this
605 	 * rule */
606 	uint8_t ihl_offset_eq_32_present;
607 	/*! The ip header length offset 32 bit equation */
608 	struct ipa_ipfltr_eq_32 ihl_offset_eq_32;
609 	/*! The number of ip header length offset 32 bit mask equations in
610 	 * this rule */
611 	uint8_t num_ihl_offset_meq_32;
612 	/*! The ip header length offset 32 bit mask equation */
613 	struct ipa_ipfltr_mask_eq_32
614 		ihl_offset_meq_32[IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS];
615 	/*! The number of ip header length offset 128 bit equations in this
616 	 * rule */
617 	uint8_t num_offset_meq_128;
618 	/*! The ip header length offset 128 bit equation */
619 	struct ipa_ipfltr_mask_eq_128
620 		offset_meq_128[IPA_IPFLTR_NUM_MEQ_128_EQNS];
621 	/*! The metadata 32 bit masked comparison equation present or not */
622 	/* Metadata based rules are added internally by IPA driver */
623 	uint8_t metadata_meq32_present;
624 	/*! The metadata 32 bit masked comparison equation */
625 	struct ipa_ipfltr_mask_eq_32 metadata_meq32;
626 	/*! Specifies if the Fragment equation is present in this rule */
627 	uint8_t ipv4_frag_eq_present;
628 };
629 
630 /**
631  * struct ipa_flt_rule - attributes of a filtering rule
632  * @retain_hdr: bool switch to instruct IPA core to add back to the packet
633  *  the header removed as part of header removal
634  * @to_uc: bool switch to pass packet to micro-controller
635  * @action: action field
636  * @rt_tbl_hdl: handle of table from "get"
637  * @attrib: attributes of the rule
638  * @eq_attrib: attributes of the rule in equation form (valid when
639  * eq_attrib_type is true)
640  * @rt_tbl_idx: index of RT table referred to by filter rule (valid when
641  * eq_attrib_type is true and non-exception action)
642  * @eq_attrib_type: true if equation level form used to specify attributes
643  * @max_prio: bool switch. is this rule with Max priority? meaning on rule hit,
644  *  IPA will use the rule and will not look for other rules that may have
645  *  higher priority
646  * @hashable: bool switch. is this rule hashable or not?
647  *  ipa uses hashable rules to cache their hit results to be used in
648  *  consecutive packets
649  * @rule_id: rule_id to be assigned to the filter rule. In case client specifies
650  *  rule_id as 0 the driver will assign a new rule_id
651  */
652 struct ipa_flt_rule {
653 	uint8_t retain_hdr;
654 	uint8_t to_uc;
655 	enum ipa_flt_action action;
656 	uint32_t rt_tbl_hdl;
657 	struct ipa_rule_attrib attrib;
658 	struct ipa_ipfltri_rule_eq eq_attrib;
659 	uint32_t rt_tbl_idx;
660 	uint8_t eq_attrib_type;
661 	uint8_t max_prio;
662 	uint8_t hashable;
663 	uint16_t rule_id;
664 };
665 
666 /**
667  * enum ipa_hdr_l2_type - L2 header type
668  * IPA_HDR_L2_NONE: L2 header which isn't Ethernet II and isn't 802_3
669  * IPA_HDR_L2_ETHERNET_II: L2 header of type Ethernet II
670  * IPA_HDR_L2_802_3: L2 header of type 802_3
671  */
672 enum ipa_hdr_l2_type {
673 	IPA_HDR_L2_NONE,
674 	IPA_HDR_L2_ETHERNET_II,
675 	IPA_HDR_L2_802_3,
676 	IPA_HDR_L2_MAX,
677 };
678 
679 /**
680  * enum ipa_hdr_l2_type - Processing context type
681  * IPA_HDR_PROC_NONE: No processing context
682  * IPA_HDR_PROC_ETHII_TO_ETHII: Process Ethernet II to Ethernet II
683  * IPA_HDR_PROC_ETHII_TO_802_3: Process Ethernet II to 802_3
684  * IPA_HDR_PROC_802_3_TO_ETHII: Process 802_3 to Ethernet II
685  * IPA_HDR_PROC_802_3_TO_802_3: Process 802_3 to 802_3
686  */
687 enum ipa_hdr_proc_type {
688 	IPA_HDR_PROC_NONE,
689 	IPA_HDR_PROC_ETHII_TO_ETHII,
690 	IPA_HDR_PROC_ETHII_TO_802_3,
691 	IPA_HDR_PROC_802_3_TO_ETHII,
692 	IPA_HDR_PROC_802_3_TO_802_3,
693 	IPA_HDR_PROC_MAX,
694 };
695 
696 /**
697  * struct ipa_rt_rule - attributes of a routing rule
698  * @dst: dst "client"
699  * @hdr_hdl: handle to the dynamic header
700 	it is not an index or an offset
701  * @hdr_proc_ctx_hdl: handle to header processing context. if it is provided
702 	hdr_hdl shall be 0
703  * @attrib: attributes of the rule
704  * @max_prio: bool switch. is this rule with Max priority? meaning on rule hit,
705  *  IPA will use the rule and will not look for other rules that may have
706  *  higher priority
707  * @hashable: bool switch. is this rule hashable or not?
708  *  ipa uses hashable rules to cache their hit results to be used in
709  *  consecutive packets
710  * @retain_hdr: bool switch to instruct IPA core to add back to the packet
711  *  the header removed as part of header removal
712  */
713 struct ipa_rt_rule {
714 	enum ipa_client_type dst;
715 	uint32_t hdr_hdl;
716 	uint32_t hdr_proc_ctx_hdl;
717 	struct ipa_rule_attrib attrib;
718 	uint8_t max_prio;
719 	uint8_t hashable;
720 	uint8_t retain_hdr;
721 };
722 
723 /**
724  * struct ipa_hdr_add - header descriptor includes in and out
725  * parameters
726  * @name: name of the header
727  * @hdr: actual header to be inserted
728  * @hdr_len: size of above header
729  * @type: l2 header type
730  * @is_partial: header not fully specified
731  * @hdr_hdl: out parameter, handle to header, valid when status is 0
732  * @status:	out parameter, status of header add operation,
733  *		0 for success,
734  *		-1 for failure
735  * @is_eth2_ofst_valid: is eth2_ofst field valid?
736  * @eth2_ofst: offset to start of Ethernet-II/802.3 header
737  */
738 struct ipa_hdr_add {
739 	char name[IPA_RESOURCE_NAME_MAX];
740 	uint8_t hdr[IPA_HDR_MAX_SIZE];
741 	uint8_t hdr_len;
742 	enum ipa_hdr_l2_type type;
743 	uint8_t is_partial;
744 	uint32_t hdr_hdl;
745 	int status;
746 	uint8_t is_eth2_ofst_valid;
747 	uint16_t eth2_ofst;
748 };
749 
750 /**
751  * struct ipa_ioc_add_hdr - header addition parameters (support
752  * multiple headers and commit)
753  * @commit: should headers be written to IPA HW also?
754  * @num_hdrs: num of headers that follow
755  * @ipa_hdr_add hdr:	all headers need to go here back to
756  *			back, no pointers
757  */
758 struct ipa_ioc_add_hdr {
759 	uint8_t commit;
760 	uint8_t num_hdrs;
761 	struct ipa_hdr_add hdr[0];
762 };
763 
764 /**
765  * struct ipa_hdr_proc_ctx_add - processing context descriptor includes
766  * in and out parameters
767  * @type: processing context type
768  * @hdr_hdl: in parameter, handle to header
769  * @proc_ctx_hdl: out parameter, handle to proc_ctx, valid when status is 0
770  * @status:	out parameter, status of header add operation,
771  *		0 for success,
772  *		-1 for failure
773  */
774 struct ipa_hdr_proc_ctx_add {
775 	enum ipa_hdr_proc_type type;
776 	uint32_t hdr_hdl;
777 	uint32_t proc_ctx_hdl;
778 	int status;
779 };
780 
781 /**
782  * struct ipa_ioc_add_hdr - processing context addition parameters (support
783  * multiple processing context and commit)
784  * @commit: should processing context be written to IPA HW also?
785  * @num_proc_ctxs: num of processing context that follow
786  * @proc_ctx:	all processing context need to go here back to
787  *			back, no pointers
788  */
789 struct ipa_ioc_add_hdr_proc_ctx {
790 	uint8_t commit;
791 	uint8_t num_proc_ctxs;
792 	struct ipa_hdr_proc_ctx_add proc_ctx[0];
793 };
794 
795 /**
796  * struct ipa_ioc_copy_hdr - retrieve a copy of the specified
797  * header - caller can then derive the complete header
798  * @name: name of the header resource
799  * @hdr:	out parameter, contents of specified header,
800  *	valid only when ioctl return val is non-negative
801  * @hdr_len: out parameter, size of above header
802  *	valid only when ioctl return val is non-negative
803  * @type: l2 header type
804  *	valid only when ioctl return val is non-negative
805  * @is_partial:	out parameter, indicates whether specified header is partial
806  *		valid only when ioctl return val is non-negative
807  * @is_eth2_ofst_valid: is eth2_ofst field valid?
808  * @eth2_ofst: offset to start of Ethernet-II/802.3 header
809  */
810 struct ipa_ioc_copy_hdr {
811 	char name[IPA_RESOURCE_NAME_MAX];
812 	uint8_t hdr[IPA_HDR_MAX_SIZE];
813 	uint8_t hdr_len;
814 	enum ipa_hdr_l2_type type;
815 	uint8_t is_partial;
816 	uint8_t is_eth2_ofst_valid;
817 	uint16_t eth2_ofst;
818 };
819 
820 /**
821  * struct ipa_ioc_get_hdr - header entry lookup parameters, if lookup was
822  * successful caller must call put to release the reference count when done
823  * @name: name of the header resource
824  * @hdl:	out parameter, handle of header entry
825  *		valid only when ioctl return val is non-negative
826  */
827 struct ipa_ioc_get_hdr {
828 	char name[IPA_RESOURCE_NAME_MAX];
829 	uint32_t hdl;
830 };
831 
832 /**
833  * struct ipa_hdr_del - header descriptor includes in and out
834  * parameters
835  *
836  * @hdl: handle returned from header add operation
837  * @status:	out parameter, status of header remove operation,
838  *		0 for success,
839  *		-1 for failure
840  */
841 struct ipa_hdr_del {
842 	uint32_t hdl;
843 	int status;
844 };
845 
846 /**
847  * struct ipa_ioc_del_hdr - header deletion parameters (support
848  * multiple headers and commit)
849  * @commit: should headers be removed from IPA HW also?
850  * @num_hdls: num of headers being removed
851  * @ipa_hdr_del hdl: all handles need to go here back to back, no pointers
852  */
853 struct ipa_ioc_del_hdr {
854 	uint8_t commit;
855 	uint8_t num_hdls;
856 	struct ipa_hdr_del hdl[0];
857 };
858 
859 /**
860  * struct ipa_hdr_proc_ctx_del - processing context descriptor includes
861  * in and out parameters
862  * @hdl: handle returned from processing context add operation
863  * @status:	out parameter, status of header remove operation,
864  *		0 for success,
865  *		-1 for failure
866  */
867 struct ipa_hdr_proc_ctx_del {
868 	uint32_t hdl;
869 	int status;
870 };
871 
872 /**
873  * ipa_ioc_del_hdr_proc_ctx - processing context deletion parameters (support
874  * multiple headers and commit)
875  * @commit: should processing contexts be removed from IPA HW also?
876  * @num_hdls: num of processing contexts being removed
877  * @ipa_hdr_proc_ctx_del hdl:	all handles need to go here back to back,
878   *				no pointers
879  */
880 struct ipa_ioc_del_hdr_proc_ctx {
881 	uint8_t commit;
882 	uint8_t num_hdls;
883 	struct ipa_hdr_proc_ctx_del hdl[0];
884 };
885 
886 /**
887  * struct ipa_rt_rule_add - routing rule descriptor includes in
888  * and out parameters
889  * @rule: actual rule to be added
890  * @at_rear:	add at back of routing table, it is NOT possible to add rules at
891  *		the rear of the "default" routing tables
892  * @rt_rule_hdl: output parameter, handle to rule, valid when status is 0
893  * @status:	output parameter, status of routing rule add operation,
894  *		0 for success,
895  *		-1 for failure
896  */
897 struct ipa_rt_rule_add {
898 	struct ipa_rt_rule rule;
899 	uint8_t at_rear;
900 	uint32_t rt_rule_hdl;
901 	int status;
902 };
903 
904 /**
905  * struct ipa_ioc_add_rt_rule - routing rule addition parameters (supports
906  * multiple rules and commit);
907  *
908  * all rules MUST be added to same table
909  * @commit: should rules be written to IPA HW also?
910  * @ip: IP family of rule
911  * @rt_tbl_name: name of routing table resource
912  * @num_rules: number of routing rules that follow
913  * @ipa_rt_rule_add rules: all rules need to go back to back here, no pointers
914  */
915 struct ipa_ioc_add_rt_rule {
916 	uint8_t commit;
917 	enum ipa_ip_type ip;
918 	char rt_tbl_name[IPA_RESOURCE_NAME_MAX];
919 	uint8_t num_rules;
920 	struct ipa_rt_rule_add rules[0];
921 };
922 
923 /**
924  * struct ipa_ioc_add_rt_rule_after - routing rule addition after a specific
925  * rule parameters(supports multiple rules and commit);
926  *
927  * all rules MUST be added to same table
928  * @commit: should rules be written to IPA HW also?
929  * @ip: IP family of rule
930  * @rt_tbl_name: name of routing table resource
931  * @num_rules: number of routing rules that follow
932  * @add_after_hdl: the rules will be added after this specific rule
933  * @ipa_rt_rule_add rules: all rules need to go back to back here, no pointers
934  *			   at_rear field will be ignored when using this IOCTL
935  */
936 struct ipa_ioc_add_rt_rule_after {
937 	uint8_t commit;
938 	enum ipa_ip_type ip;
939 	char rt_tbl_name[IPA_RESOURCE_NAME_MAX];
940 	uint8_t num_rules;
941 	uint32_t add_after_hdl;
942 	struct ipa_rt_rule_add rules[0];
943 };
944 
945 /**
946  * struct ipa_rt_rule_mdfy - routing rule descriptor includes
947  * in and out parameters
948  * @rule: actual rule to be added
949  * @rt_rule_hdl: handle to rule which supposed to modify
950  * @status:	output parameter, status of routing rule modify  operation,
951  *		0 for success,
952  *		-1 for failure
953  *
954  */
955 struct ipa_rt_rule_mdfy {
956 	struct ipa_rt_rule rule;
957 	uint32_t rt_rule_hdl;
958 	int status;
959 };
960 
961 /**
962  * struct ipa_ioc_mdfy_rt_rule - routing rule modify parameters (supports
963  * multiple rules and commit)
964  * @commit: should rules be written to IPA HW also?
965  * @ip: IP family of rule
966  * @num_rules: number of routing rules that follow
967  * @rules: all rules need to go back to back here, no pointers
968  */
969 struct ipa_ioc_mdfy_rt_rule {
970 	uint8_t commit;
971 	enum ipa_ip_type ip;
972 	uint8_t num_rules;
973 	struct ipa_rt_rule_mdfy rules[0];
974 };
975 
976 /**
977  * struct ipa_rt_rule_del - routing rule descriptor includes in
978  * and out parameters
979  * @hdl: handle returned from route rule add operation
980  * @status:	output parameter, status of route rule delete operation,
981  *		0 for success,
982  *		-1 for failure
983  */
984 struct ipa_rt_rule_del {
985 	uint32_t hdl;
986 	int status;
987 };
988 
989 /**
990  * struct ipa_ioc_del_rt_rule - routing rule deletion parameters (supports
991  * multiple headers and commit)
992  * @commit: should rules be removed from IPA HW also?
993  * @ip: IP family of rules
994  * @num_hdls: num of rules being removed
995  * @ipa_rt_rule_del hdl: all handles need to go back to back here, no pointers
996  */
997 struct ipa_ioc_del_rt_rule {
998 	uint8_t commit;
999 	enum ipa_ip_type ip;
1000 	uint8_t num_hdls;
1001 	struct ipa_rt_rule_del hdl[0];
1002 };
1003 
1004 /**
1005  * struct ipa_ioc_get_rt_tbl_indx - routing table index lookup parameters
1006  * @ip: IP family of table
1007  * @name: name of routing table resource
1008  * @index:	output parameter, routing table index, valid only when ioctl
1009  *		return val is non-negative
1010  */
1011 struct ipa_ioc_get_rt_tbl_indx {
1012 	enum ipa_ip_type ip;
1013 	char name[IPA_RESOURCE_NAME_MAX];
1014 	uint32_t idx;
1015 };
1016 
1017 /**
1018  * struct ipa_flt_rule_add - filtering rule descriptor includes
1019  * in and out parameters
1020  * @rule: actual rule to be added
1021  * @at_rear: add at back of filtering table?
1022  * @flt_rule_hdl: out parameter, handle to rule, valid when status is 0
1023  * @status:	output parameter, status of filtering rule add   operation,
1024  *		0 for success,
1025  *		-1 for failure
1026  *
1027  */
1028 struct ipa_flt_rule_add {
1029 	struct ipa_flt_rule rule;
1030 	uint8_t at_rear;
1031 	uint32_t flt_rule_hdl;
1032 	int status;
1033 };
1034 
1035 /**
1036  * struct ipa_ioc_add_flt_rule - filtering rule addition parameters (supports
1037  * multiple rules and commit)
1038  * all rules MUST be added to same table
1039  * @commit: should rules be written to IPA HW also?
1040  * @ip: IP family of rule
1041  * @ep:	which "clients" pipe does this rule apply to?
1042  *	valid only when global is 0
1043  * @global: does this apply to global filter table of specific IP family
1044  * @num_rules: number of filtering rules that follow
1045  * @rules: all rules need to go back to back here, no pointers
1046  */
1047 struct ipa_ioc_add_flt_rule {
1048 	uint8_t commit;
1049 	enum ipa_ip_type ip;
1050 	enum ipa_client_type ep;
1051 	uint8_t global;
1052 	uint8_t num_rules;
1053 	struct ipa_flt_rule_add rules[0];
1054 };
1055 
1056 /**
1057  * struct ipa_ioc_add_flt_rule_after - filtering rule addition after specific
1058  * rule parameters (supports multiple rules and commit)
1059  * all rules MUST be added to same table
1060  * @commit: should rules be written to IPA HW also?
1061  * @ip: IP family of rule
1062  * @ep:	which "clients" pipe does this rule apply to?
1063  * @num_rules: number of filtering rules that follow
1064  * @add_after_hdl: rules will be added after the rule with this handle
1065  * @rules: all rules need to go back to back here, no pointers. at rear field
1066  *	   is ignored when using this IOCTL
1067  */
1068 struct ipa_ioc_add_flt_rule_after {
1069 	uint8_t commit;
1070 	enum ipa_ip_type ip;
1071 	enum ipa_client_type ep;
1072 	uint8_t num_rules;
1073 	uint32_t add_after_hdl;
1074 	struct ipa_flt_rule_add rules[0];
1075 };
1076 
1077 /**
1078  * struct ipa_flt_rule_mdfy - filtering rule descriptor includes
1079  * in and out parameters
1080  * @rule: actual rule to be added
1081  * @flt_rule_hdl: handle to rule
1082  * @status:	output parameter, status of filtering rule modify  operation,
1083  *		0 for success,
1084  *		-1 for failure
1085  *
1086  */
1087 struct ipa_flt_rule_mdfy {
1088 	struct ipa_flt_rule rule;
1089 	uint32_t rule_hdl;
1090 	int status;
1091 };
1092 
1093 /**
1094  * struct ipa_ioc_mdfy_flt_rule - filtering rule modify parameters (supports
1095  * multiple rules and commit)
1096  * @commit: should rules be written to IPA HW also?
1097  * @ip: IP family of rule
1098  * @num_rules: number of filtering rules that follow
1099  * @rules: all rules need to go back to back here, no pointers
1100  */
1101 struct ipa_ioc_mdfy_flt_rule {
1102 	uint8_t commit;
1103 	enum ipa_ip_type ip;
1104 	uint8_t num_rules;
1105 	struct ipa_flt_rule_mdfy rules[0];
1106 };
1107 
1108 /**
1109  * struct ipa_flt_rule_del - filtering rule descriptor includes
1110  * in and out parameters
1111  *
1112  * @hdl: handle returned from filtering rule add operation
1113  * @status:	output parameter, status of filtering rule delete operation,
1114  *		0 for success,
1115  *		-1 for failure
1116  */
1117 struct ipa_flt_rule_del {
1118 	uint32_t hdl;
1119 	int status;
1120 };
1121 
1122 /**
1123  * struct ipa_ioc_del_flt_rule - filtering rule deletion parameters (supports
1124  * multiple headers and commit)
1125  * @commit: should rules be removed from IPA HW also?
1126  * @ip: IP family of rules
1127  * @num_hdls: num of rules being removed
1128  * @hdl: all handles need to go back to back here, no pointers
1129  */
1130 struct ipa_ioc_del_flt_rule {
1131 	uint8_t commit;
1132 	enum ipa_ip_type ip;
1133 	uint8_t num_hdls;
1134 	struct ipa_flt_rule_del hdl[0];
1135 };
1136 
1137 /**
1138  * struct ipa_ioc_get_rt_tbl - routing table lookup parameters, if lookup was
1139  * successful caller must call put to release the reference
1140  * count when done
1141  * @ip: IP family of table
1142  * @name: name of routing table resource
1143  * @htl:	output parameter, handle of routing table, valid only when ioctl
1144  *		return val is non-negative
1145  */
1146 struct ipa_ioc_get_rt_tbl {
1147 	enum ipa_ip_type ip;
1148 	char name[IPA_RESOURCE_NAME_MAX];
1149 	uint32_t hdl;
1150 };
1151 
1152 /**
1153  * struct ipa_ioc_query_intf - used to lookup number of tx and
1154  * rx properties of interface
1155  * @name: name of interface
1156  * @num_tx_props:	output parameter, number of tx properties
1157  *			valid only when ioctl return val is non-negative
1158  * @num_rx_props:	output parameter, number of rx properties
1159  *			valid only when ioctl return val is non-negative
1160  * @num_ext_props:	output parameter, number of ext properties
1161  *			valid only when ioctl return val is non-negative
1162  * @excp_pipe:		exception packets of this interface should be
1163  *			routed to this pipe
1164  */
1165 struct ipa_ioc_query_intf {
1166 	char name[IPA_RESOURCE_NAME_MAX];
1167 	uint32_t num_tx_props;
1168 	uint32_t num_rx_props;
1169 	uint32_t num_ext_props;
1170 	enum ipa_client_type excp_pipe;
1171 };
1172 
1173 /**
1174  * struct ipa_ioc_tx_intf_prop - interface tx property
1175  * @ip: IP family of routing rule
1176  * @attrib: routing rule
1177  * @dst_pipe: routing output pipe
1178  * @alt_dst_pipe: alternate routing output pipe
1179  * @hdr_name: name of associated header if any, empty string when no header
1180  * @hdr_l2_type: type of associated header if any, use NONE when no header
1181  */
1182 struct ipa_ioc_tx_intf_prop {
1183 	enum ipa_ip_type ip;
1184 	struct ipa_rule_attrib attrib;
1185 	enum ipa_client_type dst_pipe;
1186 	enum ipa_client_type alt_dst_pipe;
1187 	char hdr_name[IPA_RESOURCE_NAME_MAX];
1188 	enum ipa_hdr_l2_type hdr_l2_type;
1189 };
1190 
1191 /**
1192  * struct ipa_ioc_query_intf_tx_props - interface tx propertie
1193  * @name: name of interface
1194  * @num_tx_props: number of TX properties
1195  * @tx[0]: output parameter, the tx properties go here back to back
1196  */
1197 struct ipa_ioc_query_intf_tx_props {
1198 	char name[IPA_RESOURCE_NAME_MAX];
1199 	uint32_t num_tx_props;
1200 	struct ipa_ioc_tx_intf_prop tx[0];
1201 };
1202 
1203 /**
1204  * struct ipa_ioc_ext_intf_prop - interface extended property
1205  * @ip: IP family of routing rule
1206  * @eq_attrib: attributes of the rule in equation form
1207  * @action: action field
1208  * @rt_tbl_idx: index of RT table referred to by filter rule
1209  * @mux_id: MUX_ID
1210  * @filter_hdl: handle of filter (as specified by provider of filter rule)
1211  * @is_xlat_rule: it is xlat flt rule or not
1212  */
1213 struct ipa_ioc_ext_intf_prop {
1214 	enum ipa_ip_type ip;
1215 	struct ipa_ipfltri_rule_eq eq_attrib;
1216 	enum ipa_flt_action action;
1217 	uint32_t rt_tbl_idx;
1218 	uint8_t mux_id;
1219 	uint32_t filter_hdl;
1220 	uint8_t is_xlat_rule;
1221 	uint32_t rule_id;
1222 	uint8_t is_rule_hashable;
1223 };
1224 
1225 /**
1226  * struct ipa_ioc_query_intf_ext_props - interface ext propertie
1227  * @name: name of interface
1228  * @num_ext_props: number of EXT properties
1229  * @ext[0]: output parameter, the ext properties go here back to back
1230  */
1231 struct ipa_ioc_query_intf_ext_props {
1232 	char name[IPA_RESOURCE_NAME_MAX];
1233 	uint32_t num_ext_props;
1234 	struct ipa_ioc_ext_intf_prop ext[0];
1235 };
1236 
1237 /**
1238  * struct ipa_ioc_rx_intf_prop - interface rx property
1239  * @ip: IP family of filtering rule
1240  * @attrib: filtering rule
1241  * @src_pipe: input pipe
1242  * @hdr_l2_type: type of associated header if any, use NONE when no header
1243  */
1244 struct ipa_ioc_rx_intf_prop {
1245 	enum ipa_ip_type ip;
1246 	struct ipa_rule_attrib attrib;
1247 	enum ipa_client_type src_pipe;
1248 	enum ipa_hdr_l2_type hdr_l2_type;
1249 };
1250 
1251 /**
1252  * struct ipa_ioc_query_intf_rx_props - interface rx propertie
1253  * @name: name of interface
1254  * @num_rx_props: number of RX properties
1255  * @rx: output parameter, the rx properties go here back to back
1256  */
1257 struct ipa_ioc_query_intf_rx_props {
1258 	char name[IPA_RESOURCE_NAME_MAX];
1259 	uint32_t num_rx_props;
1260 	struct ipa_ioc_rx_intf_prop rx[0];
1261 };
1262 
1263 /**
1264  * struct ipa_ioc_nat_alloc_mem - nat table memory allocation
1265  * properties
1266  * @dev_name: input parameter, the name of table
1267  * @size: input parameter, size of table in bytes
1268  * @offset: output parameter, offset into page in case of system memory
1269  */
1270 struct ipa_ioc_nat_alloc_mem {
1271 	char dev_name[IPA_RESOURCE_NAME_MAX];
1272 	size_t size;
1273 	off_t offset;
1274 };
1275 
1276 /**
1277  * struct ipa_ioc_v4_nat_init - nat table initialization
1278  * parameters
1279  * @tbl_index: input parameter, index of the table
1280  * @ipv4_rules_offset: input parameter, ipv4 rules address offset
1281  * @expn_rules_offset: input parameter, ipv4 expansion rules address offset
1282  * @index_offset: input parameter, index rules offset
1283  * @index_expn_offset: input parameter, index expansion rules offset
1284  * @table_entries: input parameter, ipv4 rules table size in entries
1285  * @expn_table_entries: input parameter, ipv4 expansion rules table size
1286  * @ip_addr: input parameter, public ip address
1287  */
1288 struct ipa_ioc_v4_nat_init {
1289 	uint8_t tbl_index;
1290 	uint32_t ipv4_rules_offset;
1291 	uint32_t expn_rules_offset;
1292 
1293 	uint32_t index_offset;
1294 	uint32_t index_expn_offset;
1295 
1296 	uint16_t table_entries;
1297 	uint16_t expn_table_entries;
1298 	uint32_t ip_addr;
1299 };
1300 
1301 /**
1302  * struct ipa_ioc_v4_nat_del - nat table delete parameter
1303  * @table_index: input parameter, index of the table
1304  * @public_ip_addr: input parameter, public ip address
1305  */
1306 struct ipa_ioc_v4_nat_del {
1307 	uint8_t table_index;
1308 	uint32_t public_ip_addr;
1309 };
1310 
1311 /**
1312  * struct ipa_ioc_nat_dma_one - nat dma command parameter
1313  * @table_index: input parameter, index of the table
1314  * @base_addr:	type of table, from which the base address of the table
1315  *		can be inferred
1316  * @offset: destination offset within the NAT table
1317  * @data: data to be written.
1318  */
1319 struct ipa_ioc_nat_dma_one {
1320 	uint8_t table_index;
1321 	uint8_t base_addr;
1322 
1323 	uint32_t offset;
1324 	uint16_t data;
1325 
1326 };
1327 
1328 /**
1329  * struct ipa_ioc_nat_dma_cmd - To hold multiple nat dma commands
1330  * @entries: number of dma commands in use
1331  * @dma: data pointer to the dma commands
1332  */
1333 struct ipa_ioc_nat_dma_cmd {
1334 	uint8_t entries;
1335 	struct ipa_ioc_nat_dma_one dma[0];
1336 
1337 };
1338 
1339 /**
1340  * struct ipa_msg_meta - Format of the message meta-data.
1341  * @msg_type: the type of the message
1342  * @rsvd: reserved bits for future use.
1343  * @msg_len: the length of the message in bytes
1344  *
1345  * For push model:
1346  * Client in user-space should issue a read on the device (/dev/ipa) with a
1347  * sufficiently large buffer in a continuous loop, call will block when there is
1348  * no message to read. Upon return, client can read the ipa_msg_meta from start
1349  * of buffer to find out type and length of message
1350  * size of buffer supplied >= (size of largest message + size of metadata)
1351  *
1352  * For pull model:
1353  * Client in user-space can also issue a pull msg IOCTL to device (/dev/ipa)
1354  * with a payload containing space for the ipa_msg_meta and the message specific
1355  * payload length.
1356  * size of buffer supplied == (len of specific message  + size of metadata)
1357  */
1358 struct ipa_msg_meta {
1359 	uint8_t msg_type;
1360 	uint8_t rsvd;
1361 	uint16_t msg_len;
1362 };
1363 
1364 /**
1365  * struct ipa_wlan_msg - To hold information about wlan client
1366  * @name: name of the wlan interface
1367  * @mac_addr: mac address of wlan client
1368  *
1369  * wlan drivers need to pass name of wlan iface and mac address of
1370  * wlan client along with ipa_wlan_event, whenever a wlan client is
1371  * connected/disconnected/moved to power save/come out of power save
1372  */
1373 struct ipa_wlan_msg {
1374 	char name[IPA_RESOURCE_NAME_MAX];
1375 	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
1376 };
1377 
1378 /**
1379  * enum ipa_wlan_hdr_attrib_type - attribute type
1380  * in wlan client header
1381  *
1382  * WLAN_HDR_ATTRIB_MAC_ADDR: attrib type mac address
1383  * WLAN_HDR_ATTRIB_STA_ID: attrib type station id
1384  */
1385 enum ipa_wlan_hdr_attrib_type {
1386 	WLAN_HDR_ATTRIB_MAC_ADDR,
1387 	WLAN_HDR_ATTRIB_STA_ID
1388 };
1389 
1390 /**
1391  * struct ipa_wlan_hdr_attrib_val - header attribute value
1392  * @attrib_type: type of attribute
1393  * @offset: offset of attribute within header
1394  * @u.mac_addr: mac address
1395  * @u.sta_id: station id
1396  */
1397 struct ipa_wlan_hdr_attrib_val {
1398 	enum ipa_wlan_hdr_attrib_type attrib_type;
1399 	uint8_t offset;
1400 	union {
1401 		uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
1402 		uint8_t sta_id;
1403 	} u;
1404 };
1405 
1406 /**
1407  * struct ipa_wlan_msg_ex - To hold information about wlan client
1408  * @name: name of the wlan interface
1409  * @num_of_attribs: number of attributes
1410  * @attrib_val: holds attribute values
1411  *
1412  * wlan drivers need to pass name of wlan iface and mac address
1413  * of wlan client or station id along with ipa_wlan_event,
1414  * whenever a wlan client is connected/disconnected/moved to
1415  * power save/come out of power save
1416  */
1417 struct ipa_wlan_msg_ex {
1418 	char name[IPA_RESOURCE_NAME_MAX];
1419 	uint8_t num_of_attribs;
1420 	struct ipa_wlan_hdr_attrib_val attribs[0];
1421 };
1422 
1423 struct ipa_ecm_msg {
1424 	char name[IPA_RESOURCE_NAME_MAX];
1425 	int ifindex;
1426 };
1427 
1428 /**
1429  * struct ipa_wan_msg - To hold information about wan client
1430  * @name: name of the wan interface
1431  *
1432  * CnE need to pass the name of default wan iface when connected/disconnected.
1433  * netmgr need to pass the name of wan eMBMS iface when connected.
1434  */
1435 struct ipa_wan_msg {
1436 	char upstream_ifname[IPA_RESOURCE_NAME_MAX];
1437 	char tethered_ifname[IPA_RESOURCE_NAME_MAX];
1438 	enum ipa_ip_type ip;
1439 };
1440 
1441 /**
1442  * struct ipa_ioc_rm_dependency - parameters for add/delete dependency
1443  * @resource_name: name of dependent resource
1444  * @depends_on_name: name of its dependency
1445  */
1446 struct ipa_ioc_rm_dependency {
1447 	enum ipa_rm_resource_name resource_name;
1448 	enum ipa_rm_resource_name depends_on_name;
1449 };
1450 
1451 struct ipa_ioc_generate_flt_eq {
1452 	enum ipa_ip_type ip;
1453 	struct ipa_rule_attrib attrib;
1454 	struct ipa_ipfltri_rule_eq eq_attrib;
1455 };
1456 
1457 /**
1458  * struct ipa_ioc_write_qmapid - to write mux id to endpoint meta register
1459  * @mux_id: mux id of wan
1460  */
1461 struct ipa_ioc_write_qmapid {
1462 	enum ipa_client_type client;
1463 	uint8_t qmap_id;
1464 };
1465 
1466 enum ipacm_client_enum {
1467 	IPACM_CLIENT_USB = 1,
1468 	IPACM_CLIENT_WLAN,
1469 	IPACM_CLIENT_MAX
1470 };
1471 /**
1472  *   actual IOCTLs supported by IPA driver
1473  */
1474 #define IPA_IOC_ADD_HDR _IOWR(IPA_IOC_MAGIC, \
1475 					IPA_IOCTL_ADD_HDR, \
1476 					struct ipa_ioc_add_hdr *)
1477 #define IPA_IOC_DEL_HDR _IOWR(IPA_IOC_MAGIC, \
1478 					IPA_IOCTL_DEL_HDR, \
1479 					struct ipa_ioc_del_hdr *)
1480 #define IPA_IOC_ADD_RT_RULE _IOWR(IPA_IOC_MAGIC, \
1481 					IPA_IOCTL_ADD_RT_RULE, \
1482 					struct ipa_ioc_add_rt_rule *)
1483 #define IPA_IOC_ADD_RT_RULE_AFTER _IOWR(IPA_IOC_MAGIC, \
1484 					IPA_IOCTL_ADD_RT_RULE_AFTER, \
1485 					struct ipa_ioc_add_rt_rule_after *)
1486 #define IPA_IOC_DEL_RT_RULE _IOWR(IPA_IOC_MAGIC, \
1487 					IPA_IOCTL_DEL_RT_RULE, \
1488 					struct ipa_ioc_del_rt_rule *)
1489 #define IPA_IOC_ADD_FLT_RULE _IOWR(IPA_IOC_MAGIC, \
1490 					IPA_IOCTL_ADD_FLT_RULE, \
1491 					struct ipa_ioc_add_flt_rule *)
1492 #define IPA_IOC_ADD_FLT_RULE_AFTER _IOWR(IPA_IOC_MAGIC, \
1493 					IPA_IOCTL_ADD_FLT_RULE_AFTER, \
1494 					struct ipa_ioc_add_flt_rule_after *)
1495 #define IPA_IOC_DEL_FLT_RULE _IOWR(IPA_IOC_MAGIC, \
1496 					IPA_IOCTL_DEL_FLT_RULE, \
1497 					struct ipa_ioc_del_flt_rule *)
1498 #define IPA_IOC_COMMIT_HDR _IO(IPA_IOC_MAGIC,\
1499 					IPA_IOCTL_COMMIT_HDR)
1500 #define IPA_IOC_RESET_HDR _IO(IPA_IOC_MAGIC,\
1501 					IPA_IOCTL_RESET_HDR)
1502 #define IPA_IOC_COMMIT_RT _IOW(IPA_IOC_MAGIC, \
1503 					IPA_IOCTL_COMMIT_RT, \
1504 					enum ipa_ip_type)
1505 #define IPA_IOC_RESET_RT _IOW(IPA_IOC_MAGIC, \
1506 					IPA_IOCTL_RESET_RT, \
1507 					enum ipa_ip_type)
1508 #define IPA_IOC_COMMIT_FLT _IOW(IPA_IOC_MAGIC, \
1509 					IPA_IOCTL_COMMIT_FLT, \
1510 					enum ipa_ip_type)
1511 #define IPA_IOC_RESET_FLT _IOW(IPA_IOC_MAGIC, \
1512 			IPA_IOCTL_RESET_FLT, \
1513 			enum ipa_ip_type)
1514 #define IPA_IOC_DUMP _IO(IPA_IOC_MAGIC, \
1515 			IPA_IOCTL_DUMP)
1516 #define IPA_IOC_GET_RT_TBL _IOWR(IPA_IOC_MAGIC, \
1517 				IPA_IOCTL_GET_RT_TBL, \
1518 				struct ipa_ioc_get_rt_tbl *)
1519 #define IPA_IOC_PUT_RT_TBL _IOW(IPA_IOC_MAGIC, \
1520 				IPA_IOCTL_PUT_RT_TBL, \
1521 				uint32_t)
1522 #define IPA_IOC_COPY_HDR _IOWR(IPA_IOC_MAGIC, \
1523 				IPA_IOCTL_COPY_HDR, \
1524 				struct ipa_ioc_copy_hdr *)
1525 #define IPA_IOC_QUERY_INTF _IOWR(IPA_IOC_MAGIC, \
1526 				IPA_IOCTL_QUERY_INTF, \
1527 				struct ipa_ioc_query_intf *)
1528 #define IPA_IOC_QUERY_INTF_TX_PROPS _IOWR(IPA_IOC_MAGIC, \
1529 				IPA_IOCTL_QUERY_INTF_TX_PROPS, \
1530 				struct ipa_ioc_query_intf_tx_props *)
1531 #define IPA_IOC_QUERY_INTF_RX_PROPS _IOWR(IPA_IOC_MAGIC, \
1532 					IPA_IOCTL_QUERY_INTF_RX_PROPS, \
1533 					struct ipa_ioc_query_intf_rx_props *)
1534 #define IPA_IOC_QUERY_INTF_EXT_PROPS _IOWR(IPA_IOC_MAGIC, \
1535 					IPA_IOCTL_QUERY_INTF_EXT_PROPS, \
1536 					struct ipa_ioc_query_intf_ext_props *)
1537 #define IPA_IOC_GET_HDR _IOWR(IPA_IOC_MAGIC, \
1538 				IPA_IOCTL_GET_HDR, \
1539 				struct ipa_ioc_get_hdr *)
1540 #define IPA_IOC_PUT_HDR _IOW(IPA_IOC_MAGIC, \
1541 				IPA_IOCTL_PUT_HDR, \
1542 				uint32_t)
1543 #define IPA_IOC_ALLOC_NAT_MEM _IOWR(IPA_IOC_MAGIC, \
1544 				IPA_IOCTL_ALLOC_NAT_MEM, \
1545 				struct ipa_ioc_nat_alloc_mem *)
1546 #define IPA_IOC_V4_INIT_NAT _IOWR(IPA_IOC_MAGIC, \
1547 				IPA_IOCTL_V4_INIT_NAT, \
1548 				struct ipa_ioc_v4_nat_init *)
1549 #define IPA_IOC_NAT_DMA _IOWR(IPA_IOC_MAGIC, \
1550 				IPA_IOCTL_NAT_DMA, \
1551 				struct ipa_ioc_nat_dma_cmd *)
1552 #define IPA_IOC_V4_DEL_NAT _IOWR(IPA_IOC_MAGIC, \
1553 				IPA_IOCTL_V4_DEL_NAT, \
1554 				struct ipa_ioc_v4_nat_del *)
1555 #define IPA_IOC_GET_NAT_OFFSET _IOWR(IPA_IOC_MAGIC, \
1556 				IPA_IOCTL_GET_NAT_OFFSET, \
1557 				uint32_t *)
1558 #define IPA_IOC_SET_FLT _IOW(IPA_IOC_MAGIC, \
1559 			IPA_IOCTL_SET_FLT, \
1560 			uint32_t)
1561 #define IPA_IOC_PULL_MSG _IOWR(IPA_IOC_MAGIC, \
1562 				IPA_IOCTL_PULL_MSG, \
1563 				struct ipa_msg_meta *)
1564 #define IPA_IOC_RM_ADD_DEPENDENCY _IOWR(IPA_IOC_MAGIC, \
1565 				IPA_IOCTL_RM_ADD_DEPENDENCY, \
1566 				struct ipa_ioc_rm_dependency *)
1567 #define IPA_IOC_RM_DEL_DEPENDENCY _IOWR(IPA_IOC_MAGIC, \
1568 				IPA_IOCTL_RM_DEL_DEPENDENCY, \
1569 				struct ipa_ioc_rm_dependency *)
1570 #define IPA_IOC_GENERATE_FLT_EQ _IOWR(IPA_IOC_MAGIC, \
1571 				IPA_IOCTL_GENERATE_FLT_EQ, \
1572 				struct ipa_ioc_generate_flt_eq *)
1573 #define IPA_IOC_QUERY_EP_MAPPING _IOR(IPA_IOC_MAGIC, \
1574 				IPA_IOCTL_QUERY_EP_MAPPING, \
1575 				uint32_t)
1576 #define IPA_IOC_QUERY_RT_TBL_INDEX _IOWR(IPA_IOC_MAGIC, \
1577 				IPA_IOCTL_QUERY_RT_TBL_INDEX, \
1578 				struct ipa_ioc_get_rt_tbl_indx *)
1579 #define IPA_IOC_WRITE_QMAPID  _IOWR(IPA_IOC_MAGIC, \
1580 				IPA_IOCTL_WRITE_QMAPID, \
1581 				struct ipa_ioc_write_qmapid *)
1582 #define IPA_IOC_MDFY_FLT_RULE _IOWR(IPA_IOC_MAGIC, \
1583 					IPA_IOCTL_MDFY_FLT_RULE, \
1584 					struct ipa_ioc_mdfy_flt_rule *)
1585 #define IPA_IOC_MDFY_RT_RULE _IOWR(IPA_IOC_MAGIC, \
1586 					IPA_IOCTL_MDFY_RT_RULE, \
1587 					struct ipa_ioc_mdfy_rt_rule *)
1588 
1589 #define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD _IOWR(IPA_IOC_MAGIC, \
1590 				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_ADD, \
1591 				struct ipa_wan_msg *)
1592 
1593 #define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL _IOWR(IPA_IOC_MAGIC, \
1594 				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_DEL, \
1595 				struct ipa_wan_msg *)
1596 #define IPA_IOC_NOTIFY_WAN_EMBMS_CONNECTED _IOWR(IPA_IOC_MAGIC, \
1597 				IPA_IOCTL_NOTIFY_WAN_EMBMS_CONNECTED, \
1598 				struct ipa_wan_msg *)
1599 #define IPA_IOC_ADD_HDR_PROC_CTX _IOWR(IPA_IOC_MAGIC, \
1600 				IPA_IOCTL_ADD_HDR_PROC_CTX, \
1601 				struct ipa_ioc_add_hdr_proc_ctx *)
1602 #define IPA_IOC_DEL_HDR_PROC_CTX _IOWR(IPA_IOC_MAGIC, \
1603 				IPA_IOCTL_DEL_HDR_PROC_CTX, \
1604 				struct ipa_ioc_del_hdr_proc_ctx *)
1605 
1606 #define IPA_IOC_GET_HW_VERSION _IOWR(IPA_IOC_MAGIC, \
1607 				IPA_IOCTL_GET_HW_VERSION, \
1608 				enum ipa_hw_type *)
1609 
1610 /*
1611  * unique magic number of the Tethering bridge ioctls
1612  */
1613 #define TETH_BRIDGE_IOC_MAGIC 0xCE
1614 
1615 /*
1616  * Ioctls supported by Tethering bridge driver
1617  */
1618 #define TETH_BRIDGE_IOCTL_SET_BRIDGE_MODE	0
1619 #define TETH_BRIDGE_IOCTL_SET_AGGR_PARAMS	1
1620 #define TETH_BRIDGE_IOCTL_GET_AGGR_PARAMS	2
1621 #define TETH_BRIDGE_IOCTL_GET_AGGR_CAPABILITIES	3
1622 #define TETH_BRIDGE_IOCTL_MAX			4
1623 
1624 
1625 /**
1626  * enum teth_link_protocol_type - link protocol (IP / Ethernet)
1627  */
1628 enum teth_link_protocol_type {
1629 	TETH_LINK_PROTOCOL_IP,
1630 	TETH_LINK_PROTOCOL_ETHERNET,
1631 	TETH_LINK_PROTOCOL_MAX,
1632 };
1633 
1634 /**
1635  * enum teth_aggr_protocol_type - Aggregation protocol (MBIM / TLP)
1636  */
1637 enum teth_aggr_protocol_type {
1638 	TETH_AGGR_PROTOCOL_NONE,
1639 	TETH_AGGR_PROTOCOL_MBIM,
1640 	TETH_AGGR_PROTOCOL_TLP,
1641 	TETH_AGGR_PROTOCOL_MAX,
1642 };
1643 
1644 /**
1645  * struct teth_aggr_params_link - Aggregation parameters for uplink/downlink
1646  * @aggr_prot:			Aggregation protocol (MBIM / TLP)
1647  * @max_transfer_size_byte:	Maximal size of aggregated packet in bytes.
1648  *				Default value is 16*1024.
1649  * @max_datagrams:		Maximal number of IP packets in an aggregated
1650  *				packet. Default value is 16
1651  */
1652 struct teth_aggr_params_link {
1653 	enum teth_aggr_protocol_type aggr_prot;
1654 	uint32_t max_transfer_size_byte;
1655 	uint32_t max_datagrams;
1656 };
1657 
1658 
1659 /**
1660  * struct teth_aggr_params - Aggregation parmeters
1661  * @ul:	Uplink parameters
1662  * @dl: Downlink parmaeters
1663  */
1664 struct teth_aggr_params {
1665 	struct teth_aggr_params_link ul;
1666 	struct teth_aggr_params_link dl;
1667 };
1668 
1669 /**
1670  * struct teth_aggr_capabilities - Aggregation capabilities
1671  * @num_protocols:		Number of protocols described in the array
1672  * @prot_caps[]:		Array of aggregation capabilities per protocol
1673  */
1674 struct teth_aggr_capabilities {
1675 	uint16_t num_protocols;
1676 	struct teth_aggr_params_link prot_caps[0];
1677 };
1678 
1679 /**
1680  * struct teth_ioc_set_bridge_mode
1681  * @link_protocol: link protocol (IP / Ethernet)
1682  * @lcid: logical channel number
1683  */
1684 struct teth_ioc_set_bridge_mode {
1685 	enum teth_link_protocol_type link_protocol;
1686 	uint16_t lcid;
1687 };
1688 
1689 /**
1690  * struct teth_ioc_set_aggr_params
1691  * @aggr_params: Aggregation parmeters
1692  * @lcid: logical channel number
1693  */
1694 struct teth_ioc_aggr_params {
1695 	struct teth_aggr_params aggr_params;
1696 	uint16_t lcid;
1697 };
1698 
1699 
1700 #define TETH_BRIDGE_IOC_SET_BRIDGE_MODE _IOW(TETH_BRIDGE_IOC_MAGIC, \
1701 				TETH_BRIDGE_IOCTL_SET_BRIDGE_MODE, \
1702 				struct teth_ioc_set_bridge_mode *)
1703 #define TETH_BRIDGE_IOC_SET_AGGR_PARAMS _IOW(TETH_BRIDGE_IOC_MAGIC, \
1704 				TETH_BRIDGE_IOCTL_SET_AGGR_PARAMS, \
1705 				struct teth_ioc_aggr_params *)
1706 #define TETH_BRIDGE_IOC_GET_AGGR_PARAMS _IOR(TETH_BRIDGE_IOC_MAGIC, \
1707 				TETH_BRIDGE_IOCTL_GET_AGGR_PARAMS, \
1708 				struct teth_ioc_aggr_params *)
1709 #define TETH_BRIDGE_IOC_GET_AGGR_CAPABILITIES _IOWR(TETH_BRIDGE_IOC_MAGIC, \
1710 				TETH_BRIDGE_IOCTL_GET_AGGR_CAPABILITIES, \
1711 				struct teth_aggr_capabilities *)
1712 
1713 /*
1714  * unique magic number of the ODU bridge ioctls
1715  */
1716 #define ODU_BRIDGE_IOC_MAGIC 0xCD
1717 
1718 /*
1719  * Ioctls supported by ODU bridge driver
1720  */
1721 #define ODU_BRIDGE_IOCTL_SET_MODE	0
1722 #define ODU_BRIDGE_IOCTL_SET_LLV6_ADDR	1
1723 #define ODU_BRIDGE_IOCTL_MAX		2
1724 
1725 /**
1726  * enum odu_bridge_mode - bridge mode
1727  *			(ROUTER MODE / BRIDGE MODE)
1728  */
1729 enum odu_bridge_mode {
1730 	ODU_BRIDGE_MODE_ROUTER,
1731 	ODU_BRIDGE_MODE_BRIDGE,
1732 	ODU_BRIDGE_MODE_MAX,
1733 };
1734 
1735 #define ODU_BRIDGE_IOC_SET_MODE _IOW(ODU_BRIDGE_IOC_MAGIC, \
1736 				ODU_BRIDGE_IOCTL_SET_MODE, \
1737 				enum odu_bridge_mode)
1738 
1739 #define ODU_BRIDGE_IOC_SET_LLV6_ADDR _IOW(ODU_BRIDGE_IOC_MAGIC, \
1740 				ODU_BRIDGE_IOCTL_SET_LLV6_ADDR, \
1741 				struct in6_addr *)
1742 
1743 #endif /* _UAPI_MSM_IPA_H_ */
1744