1 /**
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions vand
14  * limitations under the License.
15  */
16 #include <sys/types.h>
17 #ifndef IPA_QMI_SERVICE_V01_H
18 #define IPA_QMI_SERVICE_V01_H
19 
20 #define QMI_IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS_V01 2
21 #define QMI_IPA_IPFLTR_NUM_MEQ_32_EQNS_V01 2
22 #define QMI_IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS_V01 2
23 #define QMI_IPA_IPFLTR_NUM_MEQ_128_EQNS_V01 2
24 #define QMI_IPA_MAX_FILTERS_V01 64
25 
26 #define IPA_INT_MAX ((int)(~0U >> 1))
27 #define IPA_INT_MIN (-IPA_INT_MAX - 1)
28 
29 enum ipa_qmi_result_type_v01 {
30   IPA_QMI_RESULT_TYPE_MIN_ENUM_VAL_V01 = IPA_INT_MIN,
31   IPA_QMI_RESULT_SUCCESS_V01 = 0,
32   IPA_QMI_RESULT_FAILURE_V01 = 1,
33   IPA_QMI_RESULT_TYPE_MAX_ENUM_VAL_V01 = IPA_INT_MAX,
34 };
35 
36 enum ipa_qmi_error_type_v01 {
37   IPA_QMI_ERROR_TYPE_MIN_ENUM_VAL_V01 = IPA_INT_MIN,
38   IPA_QMI_ERR_NONE_V01 = 0x0000,
39   IPA_QMI_ERR_MALFORMED_MSG_V01 = 0x0001,
40   IPA_QMI_ERR_NO_MEMORY_V01 = 0x0002,
41   IPA_QMI_ERR_INTERNAL_V01 = 0x0003,
42   IPA_QMI_ERR_CLIENT_IDS_EXHAUSTED_V01 = 0x0005,
43   IPA_QMI_ERR_INVALID_ID_V01 = 0x0029,
44   IPA_QMI_ERR_ENCODING_V01 = 0x003A,
45   IPA_QMI_ERR_INCOMPATIBLE_STATE_V01 = 0x005A,
46   IPA_QMI_ERR_NOT_SUPPORTED_V01 = 0x005E,
47   IPA_QMI_ERROR_TYPE_MAX_ENUM_VAL_V01 = IPA_INT_MAX,
48 };
49 
50 struct ipa_qmi_response_type_v01 {
51   enum ipa_qmi_result_type_v01 result;
52   enum ipa_qmi_error_type_v01 error;
53 };
54 
55 enum ipa_platform_type_enum_v01 {
56   IPA_PLATFORM_TYPE_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
57   QMI_IPA_PLATFORM_TYPE_INVALID_V01 = 0,
58   QMI_IPA_PLATFORM_TYPE_TN_V01 = 1,
59   QMI_IPA_PLATFORM_TYPE_LE_V01 = 2,
60   QMI_IPA_PLATFORM_TYPE_MSM_ANDROID_V01 = 3,
61   QMI_IPA_PLATFORM_TYPE_MSM_WINDOWS_V01 = 4,
62   QMI_IPA_PLATFORM_TYPE_MSM_QNX_V01 = 5,
63   IPA_PLATFORM_TYPE_ENUM_MAX_ENUM_VAL_V01 = 2147483647
64 };
65 
66 struct ipa_hdr_tbl_info_type_v01 {
67   uint32_t modem_offset_start;
68   uint32_t modem_offset_end;
69 };
70 
71 struct ipa_route_tbl_info_type_v01 {
72   uint32_t route_tbl_start_addr;
73   uint32_t num_indices;
74 };
75 
76 struct ipa_modem_mem_info_type_v01 {
77   uint32_t block_start_addr;
78   uint32_t size;
79 };
80 
81 struct ipa_hdr_proc_ctx_tbl_info_type_v01 {
82   uint32_t modem_offset_start;
83   uint32_t modem_offset_end;
84 };
85 
86 struct ipa_zip_tbl_info_type_v01 {
87   uint32_t modem_offset_start;
88   uint32_t modem_offset_end;
89 };
90 
91 struct ipa_init_modem_driver_req_msg_v01 {
92   uint8_t platform_type_valid;
93   enum ipa_platform_type_enum_v01 platform_type;
94   uint8_t hdr_tbl_info_valid;
95   struct ipa_hdr_tbl_info_type_v01 hdr_tbl_info;
96   uint8_t v4_route_tbl_info_valid;
97   struct ipa_route_tbl_info_type_v01 v4_route_tbl_info;
98   uint8_t v6_route_tbl_info_valid;
99   struct ipa_route_tbl_info_type_v01 v6_route_tbl_info;
100   uint8_t v4_filter_tbl_start_addr_valid;
101   uint32_t v4_filter_tbl_start_addr;
102   uint8_t v6_filter_tbl_start_addr_valid;
103   uint32_t v6_filter_tbl_start_addr;
104   uint8_t modem_mem_info_valid;
105   struct ipa_modem_mem_info_type_v01 modem_mem_info;
106   uint8_t ctrl_comm_dest_end_pt_valid;
107   uint32_t ctrl_comm_dest_end_pt;
108   uint8_t is_ssr_bootup_valid;
109   uint8_t is_ssr_bootup;
110   uint8_t hdr_proc_ctx_tbl_info_valid;
111   struct ipa_hdr_proc_ctx_tbl_info_type_v01 hdr_proc_ctx_tbl_info;
112   uint8_t zip_tbl_info_valid;
113   struct ipa_zip_tbl_info_type_v01 zip_tbl_info;
114 };
115 
116 struct ipa_init_modem_driver_resp_msg_v01 {
117   struct ipa_qmi_response_type_v01 resp;
118   uint8_t ctrl_comm_dest_end_pt_valid;
119   uint32_t ctrl_comm_dest_end_pt;
120   uint8_t default_end_pt_valid;
121   uint32_t default_end_pt;
122 };
123 
124 struct ipa_indication_reg_req_msg_v01 {
125   uint8_t master_driver_init_complete_valid;
126   uint8_t master_driver_init_complete;
127 };
128 
129 struct ipa_indication_reg_resp_msg_v01 {
130   struct ipa_qmi_response_type_v01 resp;
131 };
132 
133 struct ipa_master_driver_init_complt_ind_msg_v01 {
134   struct ipa_qmi_response_type_v01 master_driver_init_status;
135 };
136 
137 struct ipa_ipfltr_range_eq_16_type_v01 {
138   uint8_t offset;
139   uint16_t range_low;
140   uint16_t range_high;
141 };
142 
143 struct ipa_ipfltr_mask_eq_32_type_v01 {
144   uint8_t offset;
145   uint32_t mask;
146   uint32_t value;
147 };
148 
149 struct ipa_ipfltr_eq_16_type_v01 {
150   uint8_t offset;
151   uint16_t value;
152 };
153 
154 struct ipa_ipfltr_eq_32_type_v01 {
155   uint8_t offset;
156   uint32_t value;
157 };
158 
159 struct ipa_ipfltr_mask_eq_128_type_v01 {
160   uint8_t offset;
161   uint8_t mask[16];
162   uint8_t value[16];
163 };
164 
165 struct ipa_filter_rule_type_v01 {
166   uint16_t rule_eq_bitmap;
167   uint8_t tos_eq_present;
168   uint8_t tos_eq;
169   uint8_t protocol_eq_present;
170   uint8_t protocol_eq;
171   uint8_t num_ihl_offset_range_16;
172 
173   struct ipa_ipfltr_range_eq_16_type_v01
174       ihl_offset_range_16[QMI_IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS_V01];
175 
176   uint8_t num_offset_meq_32;
177 
178   struct ipa_ipfltr_mask_eq_32_type_v01
179       offset_meq_32[QMI_IPA_IPFLTR_NUM_MEQ_32_EQNS_V01];
180 
181   uint8_t tc_eq_present;
182   uint8_t tc_eq;
183   uint8_t flow_eq_present;
184   uint32_t flow_eq;
185   uint8_t ihl_offset_eq_16_present;
186   struct ipa_ipfltr_eq_16_type_v01 ihl_offset_eq_16;
187   uint8_t ihl_offset_eq_32_present;
188   struct ipa_ipfltr_eq_32_type_v01 ihl_offset_eq_32;
189   uint8_t num_ihl_offset_meq_32;
190   struct ipa_ipfltr_mask_eq_32_type_v01
191       ihl_offset_meq_32[QMI_IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS_V01];
192   uint8_t num_offset_meq_128;
193   struct ipa_ipfltr_mask_eq_128_type_v01
194       offset_meq_128[QMI_IPA_IPFLTR_NUM_MEQ_128_EQNS_V01];
195 
196   uint8_t metadata_meq32_present;
197 
198   struct ipa_ipfltr_mask_eq_32_type_v01 metadata_meq32;
199   uint8_t ipv4_frag_eq_present;
200 };
201 
202 enum ipa_ip_type_enum_v01 {
203   IPA_IP_TYPE_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
204   QMI_IPA_IP_TYPE_INVALID_V01 = 0,
205   QMI_IPA_IP_TYPE_V4_V01 = 1,
206   QMI_IPA_IP_TYPE_V6_V01 = 2,
207   QMI_IPA_IP_TYPE_V4V6_V01 = 3,
208   IPA_IP_TYPE_ENUM_MAX_ENUM_VAL_V01 = 2147483647
209 };
210 
211 enum ipa_filter_action_enum_v01 {
212   IPA_FILTER_ACTION_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
213   QMI_IPA_FILTER_ACTION_INVALID_V01 = 0,
214   QMI_IPA_FILTER_ACTION_SRC_NAT_V01 = 1,
215   QMI_IPA_FILTER_ACTION_DST_NAT_V01 = 2,
216   QMI_IPA_FILTER_ACTION_ROUTING_V01 = 3,
217   QMI_IPA_FILTER_ACTION_EXCEPTION_V01 = 4,
218   IPA_FILTER_ACTION_ENUM_MAX_ENUM_VAL_V01 = 2147483647
219 };
220 
221 struct ipa_filter_spec_type_v01 {
222   uint32_t filter_spec_identifier;
223   enum ipa_ip_type_enum_v01 ip_type;
224   struct ipa_filter_rule_type_v01 filter_rule;
225   enum ipa_filter_action_enum_v01 filter_action;
226   uint8_t is_routing_table_index_valid;
227   uint32_t route_table_index;
228   uint8_t is_mux_id_valid;
229   uint32_t mux_id;
230 };
231 
232 struct ipa_install_fltr_rule_req_msg_v01 {
233   uint8_t filter_spec_list_valid;
234   uint32_t filter_spec_list_len;
235   struct ipa_filter_spec_type_v01 filter_spec_list[QMI_IPA_MAX_FILTERS_V01];
236   uint8_t source_pipe_index_valid;
237   uint32_t source_pipe_index;
238   uint8_t num_ipv4_filters_valid;
239   uint32_t num_ipv4_filters;
240   uint8_t num_ipv6_filters_valid;
241   uint32_t num_ipv6_filters;
242   uint8_t xlat_filter_indices_list_valid;
243   uint32_t xlat_filter_indices_list_len;
244   uint32_t xlat_filter_indices_list[QMI_IPA_MAX_FILTERS_V01];
245 };
246 
247 struct ipa_filter_rule_identifier_to_handle_map_v01 {
248   uint32_t filter_spec_identifier;
249   uint32_t filter_handle;
250 };
251 
252 struct ipa_install_fltr_rule_resp_msg_v01 {
253   struct ipa_qmi_response_type_v01 resp;
254   uint8_t filter_handle_list_valid;
255   uint32_t filter_handle_list_len;
256   struct ipa_filter_rule_identifier_to_handle_map_v01
257       filter_handle_list[QMI_IPA_MAX_FILTERS_V01];
258 };
259 
260 struct ipa_filter_handle_to_index_map_v01 {
261   uint32_t filter_handle;
262   uint32_t filter_index;
263 };
264 
265 struct ipa_fltr_installed_notif_req_msg_v01 {
266   uint32_t source_pipe_index;
267   enum ipa_qmi_result_type_v01 install_status;
268   uint32_t filter_index_list_len;
269   struct ipa_filter_handle_to_index_map_v01
270       filter_index_list[QMI_IPA_MAX_FILTERS_V01];
271 
272   uint8_t embedded_pipe_index_valid;
273   uint32_t embedded_pipe_index;
274   uint8_t retain_header_valid;
275   uint8_t retain_header;
276   uint8_t embedded_call_mux_id_valid;
277   uint32_t embedded_call_mux_id;
278   uint8_t num_ipv4_filters_valid;
279   uint32_t num_ipv4_filters;
280   uint8_t num_ipv6_filters_valid;
281   uint32_t num_ipv6_filters;
282   uint8_t start_ipv4_filter_idx_valid;
283   uint32_t start_ipv4_filter_idx;
284   uint8_t start_ipv6_filter_idx_valid;
285   uint32_t start_ipv6_filter_idx;
286 };
287 
288 struct ipa_fltr_installed_notif_resp_msg_v01 {
289   struct ipa_qmi_response_type_v01 resp;
290 };
291 
292 struct ipa_enable_force_clear_datapath_req_msg_v01 {
293   uint32_t source_pipe_bitmask;
294   uint32_t request_id;
295   uint8_t throttle_source_valid;
296   uint8_t throttle_source;
297 };
298 
299 struct ipa_enable_force_clear_datapath_resp_msg_v01 {
300   struct ipa_qmi_response_type_v01 resp;
301 };
302 
303 struct ipa_disable_force_clear_datapath_req_msg_v01 {
304   uint32_t request_id;
305 };
306 
307 struct ipa_disable_force_clear_datapath_resp_msg_v01 {
308   struct ipa_qmi_response_type_v01 resp;
309 };
310 
311 enum ipa_peripheral_speed_enum_v01 {
312   IPA_PERIPHERAL_SPEED_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
313   QMI_IPA_PER_USB_FS_V01 = 1,
314   QMI_IPA_PER_USB_HS_V01 = 2,
315   QMI_IPA_PER_USB_SS_V01 = 3,
316   IPA_PERIPHERAL_SPEED_ENUM_MAX_ENUM_VAL_V01 = 2147483647
317 };
318 
319 enum ipa_pipe_mode_enum_v01 {
320   IPA_PIPE_MODE_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
321   QMI_IPA_PIPE_MODE_HW_V01 = 1,
322   QMI_IPA_PIPE_MODE_SW_V01 = 2,
323   IPA_PIPE_MODE_ENUM_MAX_ENUM_VAL_V01 = 2147483647
324 };
325 
326 enum ipa_peripheral_type_enum_v01 {
327   IPA_PERIPHERAL_TYPE_ENUM_MIN_ENUM_VAL_V01 = -2147483647,
328   QMI_IPA_PERIPHERAL_USB_V01 = 1,
329   QMI_IPA_PERIPHERAL_HSIC_V01 = 2,
330   QMI_IPA_PERIPHERAL_PCIE_V01 = 3,
331   IPA_PERIPHERAL_TYPE_ENUM_MAX_ENUM_VAL_V01 = 2147483647
332 };
333 
334 struct ipa_config_req_msg_v01 {
335   uint8_t peripheral_type_valid;
336   enum ipa_peripheral_type_enum_v01 peripheral_type;
337   uint8_t hw_deaggr_supported_valid;
338   uint8_t hw_deaggr_supported;
339   uint8_t max_aggr_frame_size_valid;
340   uint32_t max_aggr_frame_size;
341   uint8_t ipa_ingress_pipe_mode_valid;
342   enum ipa_pipe_mode_enum_v01 ipa_ingress_pipe_mode;
343   uint8_t peripheral_speed_info_valid;
344   enum ipa_peripheral_speed_enum_v01 peripheral_speed_info;
345   uint8_t dl_accumulation_time_limit_valid;
346   uint32_t dl_accumulation_time_limit;
347   uint8_t dl_accumulation_pkt_limit_valid;
348   uint32_t dl_accumulation_pkt_limit;
349   uint8_t dl_accumulation_byte_limit_valid;
350   uint32_t dl_accumulation_byte_limit;
351   uint8_t ul_accumulation_time_limit_valid;
352   uint32_t ul_accumulation_time_limit;
353   uint8_t hw_control_flags_valid;
354   uint32_t hw_control_flags;
355   uint8_t ul_msi_event_threshold_valid;
356   uint32_t ul_msi_event_threshold;
357   uint8_t dl_msi_event_threshold_valid;
358   uint32_t dl_msi_event_threshold;
359 };
360 
361 struct ipa_config_resp_msg_v01 {
362   struct ipa_qmi_response_type_v01 resp;
363 };
364 
365 /*Service Message Definition*/
366 #define QMI_IPA_INDICATION_REGISTER_REQ_V01 0x0020
367 #define QMI_IPA_INDICATION_REGISTER_RESP_V01 0x0020
368 #define QMI_IPA_INIT_MODEM_DRIVER_REQ_V01 0x0021
369 #define QMI_IPA_INIT_MODEM_DRIVER_RESP_V01 0x0021
370 #define QMI_IPA_MASTER_DRIVER_INIT_COMPLETE_IND_V01 0x0022
371 #define QMI_IPA_INSTALL_FILTER_RULE_REQ_V01 0x0023
372 #define QMI_IPA_INSTALL_FILTER_RULE_RESP_V01 0x0023
373 #define QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01 0x0024
374 #define QMI_IPA_FILTER_INSTALLED_NOTIF_RESP_V01 0x0024
375 #define QMI_IPA_ENABLE_FORCE_CLEAR_DATAPATH_REQ_V01 0x0025
376 #define QMI_IPA_ENABLE_FORCE_CLEAR_DATAPATH_RESP_V01 0x0025
377 #define QMI_IPA_DISABLE_FORCE_CLEAR_DATAPATH_REQ_V01 0x0026
378 #define QMI_IPA_DISABLE_FORCE_CLEAR_DATAPATH_RESP_V01 0x0026
379 #define QMI_IPA_CONFIG_REQ_V01 0x0027
380 #define QMI_IPA_CONFIG_RESP_V01 0x0027
381 
382 /* add for max length*/
383 #define QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01 98
384 #define QMI_IPA_INIT_MODEM_DRIVER_RESP_MAX_MSG_LEN_V01 21
385 #define QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01 4
386 #define QMI_IPA_INDICATION_REGISTER_RESP_MAX_MSG_LEN_V01 7
387 #define QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01 11293
388 #define QMI_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01 523
389 #define QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01 574
390 #define QMI_IPA_FILTER_INSTALLED_NOTIF_RESP_MAX_MSG_LEN_V01 7
391 #define QMI_IPA_MASTER_DRIVER_INIT_COMPLETE_IND_MAX_MSG_LEN_V01 7
392 
393 #define QMI_IPA_ENABLE_FORCE_CLEAR_DATAPATH_REQ_MAX_MSG_LEN_V01 18
394 #define QMI_IPA_DISABLE_FORCE_CLEAR_DATAPATH_REQ_MAX_MSG_LEN_V01 7
395 #define QMI_IPA_ENABLE_FORCE_CLEAR_DATAPATH_RESP_MAX_MSG_LEN_V01 7
396 #define QMI_IPA_DISABLE_FORCE_CLEAR_DATAPATH_RESP_MAX_MSG_LEN_V01 7
397 
398 #define QMI_IPA_CONFIG_REQ_MAX_MSG_LEN_V01 81
399 #define QMI_IPA_CONFIG_RESP_MAX_MSG_LEN_V01 7
400 /* Service Object Accessor */
401 
402 #endif /* IPA_QMI_SERVICE_V01_H */
403 
404 #ifndef _UAPI_MSM_IPC_H_
405 #define _UAPI_MSM_IPC_H_
406 
407 #include <linux/ioctl.h>
408 #include <linux/types.h>
409 
410 struct msm_ipc_port_addr {
411   uint32_t node_id;
412   uint32_t port_id;
413 };
414 
415 struct msm_ipc_port_name {
416   uint32_t service;
417   uint32_t instance;
418 };
419 
420 struct msm_ipc_addr {
421   unsigned char addrtype;
422   union {
423     struct msm_ipc_port_addr port_addr;
424     struct msm_ipc_port_name port_name;
425   } addr;
426 };
427 
428 #define MSM_IPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */
429 
430 #ifndef AF_MSM_IPC
431 #define AF_MSM_IPC 27
432 #endif
433 
434 #ifndef PF_MSM_IPC
435 #define PF_MSM_IPC AF_MSM_IPC
436 #endif
437 
438 #define MSM_IPC_ADDR_NAME 1
439 #define MSM_IPC_ADDR_ID 2
440 
441 struct sockaddr_msm_ipc {
442   unsigned short family;
443   struct msm_ipc_addr address;
444   unsigned char reserved;
445 };
446 
447 struct config_sec_rules_args {
448   int num_group_info;
449   uint32_t service_id;
450   uint32_t instance_id;
451   unsigned reserved;
452   gid_t group_id[0];
453 };
454 
455 #define IPC_ROUTER_IOCTL_MAGIC (0xC3)
456 
457 #define IPC_ROUTER_IOCTL_GET_VERSION                                           \
458   _IOR(IPC_ROUTER_IOCTL_MAGIC, 0, unsigned int)
459 
460 #define IPC_ROUTER_IOCTL_GET_MTU _IOR(IPC_ROUTER_IOCTL_MAGIC, 1, unsigned int)
461 
462 #define IPC_ROUTER_IOCTL_LOOKUP_SERVER                                         \
463   _IOWR(IPC_ROUTER_IOCTL_MAGIC, 2, struct sockaddr_msm_ipc)
464 
465 #define IPC_ROUTER_IOCTL_GET_CURR_PKT_SIZE                                     \
466   _IOR(IPC_ROUTER_IOCTL_MAGIC, 3, unsigned int)
467 
468 #define IPC_ROUTER_IOCTL_BIND_CONTROL_PORT                                     \
469   _IOR(IPC_ROUTER_IOCTL_MAGIC, 4, unsigned int)
470 
471 #define IPC_ROUTER_IOCTL_CONFIG_SEC_RULES                                      \
472   _IOR(IPC_ROUTER_IOCTL_MAGIC, 5, struct config_sec_rules_args)
473 
474 struct msm_ipc_server_info {
475   uint32_t node_id;
476   uint32_t port_id;
477   uint32_t service;
478   uint32_t instance;
479 };
480 
481 struct server_lookup_args {
482   struct msm_ipc_port_name port_name;
483   int num_entries_in_array;
484   int num_entries_found;
485   uint32_t lookup_mask;
486   struct msm_ipc_server_info srv_info[0];
487 };
488 
489 #endif
490 
491 #ifndef _UAPI_MSM_RMNET_H_
492 #define _UAPI_MSM_RMNET_H_
493 
494 /* Bitmap macros for RmNET driver operation mode. */
495 #define RMNET_MODE_NONE (0x00)
496 #define RMNET_MODE_LLP_ETH (0x01)
497 #define RMNET_MODE_LLP_IP (0x02)
498 #define RMNET_MODE_QOS (0x04)
499 #define RMNET_MODE_MASK                                                        \
500   (RMNET_MODE_LLP_ETH | RMNET_MODE_LLP_IP | RMNET_MODE_QOS)
501 
502 #define RMNET_IS_MODE_QOS(mode) ((mode & RMNET_MODE_QOS) == RMNET_MODE_QOS)
503 #define RMNET_IS_MODE_IP(mode) ((mode & RMNET_MODE_LLP_IP) == RMNET_MODE_LLP_IP)
504 
505 enum rmnet_ioctl_cmds_e {
506   RMNET_IOCTL_SET_LLP_ETHERNET = 0x000089F1, /* Set Ethernet protocol  */
507   RMNET_IOCTL_SET_LLP_IP = 0x000089F2,       /* Set RAWIP protocol     */
508   RMNET_IOCTL_GET_LLP = 0x000089F3,          /* Get link protocol      */
509   RMNET_IOCTL_SET_QOS_ENABLE = 0x000089F4,   /* Set QoS header enabled */
510   RMNET_IOCTL_SET_QOS_DISABLE = 0x000089F5,  /* Set QoS header disabled*/
511   RMNET_IOCTL_GET_QOS = 0x000089F6,          /* Get QoS header state   */
512   RMNET_IOCTL_GET_OPMODE = 0x000089F7,       /* Get operation mode     */
513   RMNET_IOCTL_OPEN = 0x000089F8,             /* Open transport port    */
514   RMNET_IOCTL_CLOSE = 0x000089F9,            /* Close transport port   */
515   RMNET_IOCTL_FLOW_ENABLE = 0x000089FA,      /* Flow enable            */
516   RMNET_IOCTL_FLOW_DISABLE = 0x000089FB,     /* Flow disable           */
517   RMNET_IOCTL_FLOW_SET_HNDL = 0x000089FC,    /* Set flow handle        */
518   RMNET_IOCTL_EXTENDED = 0x000089FD,         /* Extended IOCTLs        */
519   RMNET_IOCTL_MAX
520 };
521 
522 enum rmnet_ioctl_extended_cmds_e {
523   /* RmNet Data Required IOCTLs */
524   RMNET_IOCTL_GET_SUPPORTED_FEATURES = 0x0000,   /* Get features    */
525   RMNET_IOCTL_SET_MRU = 0x0001,                  /* Set MRU         */
526   RMNET_IOCTL_GET_MRU = 0x0002,                  /* Get MRU         */
527   RMNET_IOCTL_GET_EPID = 0x0003,                 /* Get endpoint ID */
528   RMNET_IOCTL_GET_DRIVER_NAME = 0x0004,          /* Get driver name */
529   RMNET_IOCTL_ADD_MUX_CHANNEL = 0x0005,          /* Add MUX ID      */
530   RMNET_IOCTL_SET_EGRESS_DATA_FORMAT = 0x0006,   /* Set EDF         */
531   RMNET_IOCTL_SET_INGRESS_DATA_FORMAT = 0x0007,  /* Set IDF         */
532   RMNET_IOCTL_SET_AGGREGATION_COUNT = 0x0008,    /* Set agg count   */
533   RMNET_IOCTL_GET_AGGREGATION_COUNT = 0x0009,    /* Get agg count   */
534   RMNET_IOCTL_SET_AGGREGATION_SIZE = 0x000A,     /* Set agg size    */
535   RMNET_IOCTL_GET_AGGREGATION_SIZE = 0x000B,     /* Get agg size    */
536   RMNET_IOCTL_FLOW_CONTROL = 0x000C,             /* Do flow control */
537   RMNET_IOCTL_GET_DFLT_CONTROL_CHANNEL = 0x000D, /* For legacy use  */
538   RMNET_IOCTL_GET_HWSW_MAP = 0x000E,             /* Get HW/SW map   */
539   RMNET_IOCTL_SET_RX_HEADROOM = 0x000F,          /* RX Headroom     */
540   RMNET_IOCTL_GET_EP_PAIR = 0x0010,              /* Endpoint pair   */
541   RMNET_IOCTL_SET_QOS_VERSION = 0x0011,          /* 8/6 byte QoS hdr*/
542   RMNET_IOCTL_GET_QOS_VERSION = 0x0012,          /* 8/6 byte QoS hdr*/
543   RMNET_IOCTL_GET_SUPPORTED_QOS_MODES = 0x0013,  /* Get QoS modes   */
544   RMNET_IOCTL_SET_SLEEP_STATE = 0x0014,          /* Set sleep state */
545   RMNET_IOCTL_SET_XLAT_DEV_INFO = 0x0015,        /* xlat dev name   */
546   RMNET_IOCTL_EXTENDED_MAX = 0x0016
547 };
548 
549 /* Return values for the RMNET_IOCTL_GET_SUPPORTED_FEATURES IOCTL */
550 #define RMNET_IOCTL_FEAT_NOTIFY_MUX_CHANNEL (1 << 0)
551 #define RMNET_IOCTL_FEAT_SET_EGRESS_DATA_FORMAT (1 << 1)
552 #define RMNET_IOCTL_FEAT_SET_INGRESS_DATA_FORMAT (1 << 2)
553 #define RMNET_IOCTL_FEAT_SET_AGGREGATION_COUNT (1 << 3)
554 #define RMNET_IOCTL_FEAT_GET_AGGREGATION_COUNT (1 << 4)
555 #define RMNET_IOCTL_FEAT_SET_AGGREGATION_SIZE (1 << 5)
556 #define RMNET_IOCTL_FEAT_GET_AGGREGATION_SIZE (1 << 6)
557 #define RMNET_IOCTL_FEAT_FLOW_CONTROL (1 << 7)
558 #define RMNET_IOCTL_FEAT_GET_DFLT_CONTROL_CHANNEL (1 << 8)
559 #define RMNET_IOCTL_FEAT_GET_HWSW_MAP (1 << 9)
560 
561 /* Input values for the RMNET_IOCTL_SET_EGRESS_DATA_FORMAT IOCTL  */
562 #define RMNET_IOCTL_EGRESS_FORMAT_MAP (1 << 1)
563 #define RMNET_IOCTL_EGRESS_FORMAT_AGGREGATION (1 << 2)
564 #define RMNET_IOCTL_EGRESS_FORMAT_MUXING (1 << 3)
565 #define RMNET_IOCTL_EGRESS_FORMAT_CHECKSUM (1 << 4)
566 
567 /* Input values for the RMNET_IOCTL_SET_INGRESS_DATA_FORMAT IOCTL */
568 #define RMNET_IOCTL_INGRESS_FORMAT_MAP (1 << 1)
569 #define RMNET_IOCTL_INGRESS_FORMAT_DEAGGREGATION (1 << 2)
570 #define RMNET_IOCTL_INGRESS_FORMAT_DEMUXING (1 << 3)
571 #define RMNET_IOCTL_INGRESS_FORMAT_CHECKSUM (1 << 4)
572 
573 /* User space may not have this defined. */
574 #ifndef IFNAMSIZ
575 #define IFNAMSIZ 16
576 #endif
577 
578 struct rmnet_ioctl_extended_s {
579   uint32_t extended_ioctl;
580   union {
581     uint32_t data; /* Generic data field for most extended IOCTLs */
582     int8_t if_name[IFNAMSIZ];
583     struct {
584       uint32_t mux_id;
585       int8_t vchannel_name[IFNAMSIZ];
586     } rmnet_mux_val;
587     struct {
588       uint8_t flow_mode;
589       uint8_t mux_id;
590     } flow_control_prop;
591     struct {
592       uint32_t consumer_pipe_num;
593       uint32_t producer_pipe_num;
594     } ipa_ep_pair;
595   } u;
596 };
597 
598 struct rmnet_ioctl_data_s {
599   union {
600     uint32_t operation_mode;
601     uint32_t tcm_handle;
602   } u;
603 };
604 
605 #define RMNET_IOCTL_QOS_MODE_6 (1 << 0)
606 #define RMNET_IOCTL_QOS_MODE_8 (1 << 1)
607 
608 #define QMI_QOS_HDR_S __attribute((__packed__)) qmi_qos_hdr_s
609 struct QMI_QOS_HDR_S {
610   unsigned char version;
611   unsigned char flags;
612   uint32_t flow_id;
613 };
614 
615 struct qmi_qos_hdr8_s {
616   struct QMI_QOS_HDR_S hdr;
617   uint8_t reserved[2];
618 } __attribute((__packed__));
619 
620 #endif
621