Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +53 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,12 @@ static struct msg_desc ipa3_init_modem_driver_cmplt_resp_desc = { .ei_array = ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei, }; static struct msg_desc ipa3_install_fltr_rule_req_ex_desc = { .max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01, .msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01, .ei_array = ipa3_install_fltr_rule_req_ex_msg_data_v01_ei, }; static int ipa3_handle_indication_req(void *req_h, void *req) { struct ipa_indication_reg_req_msg_v01 *indication_req; Loading Loading @@ -301,6 +307,10 @@ static int ipa3_a5_svc_req_desc_cb(unsigned int msg_id, *req_desc = &ipa3_install_fltr_rule_req_desc; rc = sizeof(struct ipa_install_fltr_rule_req_msg_v01); break; case QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01: *req_desc = &ipa3_install_fltr_rule_req_ex_desc; rc = sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01); break; case QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01: *req_desc = &ipa3_filter_installed_notif_req_desc; rc = sizeof(struct ipa_fltr_installed_notif_req_msg_v01); Loading Loading @@ -629,6 +639,49 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) resp.resp.error, "ipa_install_filter"); } /* sending filter-install-request to modem*/ int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { struct ipa_install_fltr_rule_resp_ex_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; /* check if the filter rules from IPACM is valid */ if (req->filter_spec_ex_list_len == 0) { IPAWANDBG("IPACM pass zero rules to Q6\n"); } else { IPAWANDBG("IPACM pass %u rules to Q6\n", req->filter_spec_ex_list_len); } /* cache the qmi_filter_request */ memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_ex_msg_cache[ ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg]), req, sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01)); ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg++; ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg %= 10; req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01; req_desc.ei_array = ipa3_install_fltr_rule_req_ex_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_install_fltr_rule_resp_ex_msg_v01)); resp_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_V01; resp_desc.ei_array = ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa3_check_qmi_response(rc, QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01, resp.resp.result, resp.resp.error, "ipa_install_filter"); } int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +15 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -73,6 +73,9 @@ u32 q6_ul_filter_rule_hdl[MAX_NUM_Q6_RULE]; int num_ipa_install_fltr_rule_req_msg; struct ipa_install_fltr_rule_req_msg_v01 ipa_install_fltr_rule_req_msg_cache[MAX_NUM_QMI_RULE_CACHE]; int num_ipa_install_fltr_rule_req_ex_msg; struct ipa_install_fltr_rule_req_ex_msg_v01 ipa_install_fltr_rule_req_ex_msg_cache[MAX_NUM_QMI_RULE_CACHE]; int num_ipa_fltr_installed_notif_req_msg; struct ipa_fltr_installed_notif_req_msg_v01 ipa_fltr_installed_notif_req_msg_cache[MAX_NUM_QMI_RULE_CACHE]; Loading Loading @@ -115,6 +118,8 @@ extern struct elem_info ipa3_stop_data_usage_quota_req_msg_data_v01_ei[]; extern struct elem_info ipa3_stop_data_usage_quota_resp_msg_data_v01_ei[]; extern struct elem_info ipa3_init_modem_driver_cmplt_req_msg_data_v01_ei[]; extern struct elem_info ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei[]; extern struct elem_info ipa3_install_fltr_rule_req_ex_msg_data_v01_ei[]; extern struct elem_info ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei[]; /** * struct ipa3_rmnet_context - IPA rmnet context Loading @@ -140,6 +145,9 @@ void ipa3_qmi_service_exit(void); int ipa3_qmi_filter_request_send( struct ipa_install_fltr_rule_req_msg_v01 *req); int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req); /* sending filter-installed-notify-request to modem*/ int ipa3_qmi_filter_notify_send(struct ipa_fltr_installed_notif_req_msg_v01 *req); Loading Loading @@ -209,6 +217,12 @@ static inline int ipa3_qmi_filter_request_send( return -EPERM; } static inline int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { return -EPERM; } /* sending filter-installed-notify-request to modem*/ static inline int ipa3_qmi_filter_notify_send( struct ipa_fltr_installed_notif_req_msg_v01 *req) Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service_v01.c +180 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2744,3 +2744,182 @@ struct elem_info ipa3_stop_data_usage_quota_resp_msg_data_v01_ei[] = { .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct elem_info ipa3_install_fltr_rule_req_ex_msg_data_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list_len), }, { .data_type = QMI_STRUCT, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(struct ipa_filter_spec_ex_type_v01), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list), .ei_array = ipa_filter_spec_ex_type_data_v01_ei, }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, source_pipe_index_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, source_pipe_index), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv4_filters_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv4_filters), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x13, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv6_filters_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x13, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv6_filters), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list_len), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(uint32_t), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list), }, { .data_type = QMI_EOTI, .is_array = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct elem_info ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei[] = { { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct qmi_response_type_v01), .is_array = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, resp), .ei_array = get_qmi_response_type_v01_ei(), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id_len), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(uint32_t), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id), }, { .data_type = QMI_EOTI, .is_array = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c +26 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -97,6 +97,31 @@ static long ipa3_wan_ioctl(struct file *filp, } break; case WAN_IOC_ADD_FLT_RULE_EX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_EX :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (ipa3_qmi_filter_request_ex_send( (struct ipa_install_fltr_rule_req_ex_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 add filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_ADD_FLT_RULE_INDEX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_INDEX :>>>\n", DRIVER_NAME); Loading include/uapi/linux/ipa_qmi_service_v01.h +83 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -44,6 +44,7 @@ #define QMI_IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS_V01 2 #define QMI_IPA_IPFLTR_NUM_MEQ_128_EQNS_V01 2 #define QMI_IPA_MAX_FILTERS_V01 64 #define QMI_IPA_MAX_FILTERS_EX_V01 128 #define QMI_IPA_MAX_PIPES_V01 20 #define QMI_IPA_MAX_APN_V01 8 Loading Loading @@ -1549,6 +1550,82 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { /**< Standard response type.*/ }; /* Message */ /* Request Message; Request from Modem IPA driver to set DPL peripheral pipe */ struct ipa_install_fltr_rule_req_ex_msg_v01 { /* Optional */ /* Extended Filter Specification */ uint8_t filter_spec_ex_list_valid; uint32_t filter_spec_ex_list_len; struct ipa_filter_spec_ex_type_v01 filter_spec_ex_list[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of filter specifications of filters that must be installed in * the IPAv3.x hardware. * The driver installing these rules must do so in the same order as * specified in this list. */ /* Optional */ /* Pipe Index to Install Rule */ uint8_t source_pipe_index_valid; uint32_t source_pipe_index; /* Pipe index to install the filter rule. * The requester may not always know the pipe indices. If not specified, * the receiver must install this rule on all pipes that it controls, * through which data may be fed into the IPA. */ /* Optional */ /* Total Number of IPv4 Filters in the Filter Spec List */ uint8_t num_ipv4_filters_valid; uint32_t num_ipv4_filters; /* Number of IPv4 rules included in the filter specification list. */ /* Optional */ /* Total Number of IPv6 Filters in the Filter Spec List */ uint8_t num_ipv6_filters_valid; uint32_t num_ipv6_filters; /* Number of IPv6 rules included in the filter specification list. */ /* Optional */ /* List of XLAT Filter Indices in the Filter Spec List */ uint8_t xlat_filter_indices_list_valid; uint32_t xlat_filter_indices_list_len; uint32_t xlat_filter_indices_list[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of XLAT filter indices. * Filter rules at specified indices must be modified by the * receiver if the PDN is XLAT before installing them on the associated * IPA consumer pipe. */ }; /* Message */ /* Response Message; Requests installation of filtering rules in the hardware * block on the remote side. */ struct ipa_install_fltr_rule_resp_ex_msg_v01 { /* Mandatory */ /* Result Code */ struct ipa_qmi_response_type_v01 resp; /* Standard response type. * Standard response type. Contains the following data members: * - qmi_result_type -- QMI_RESULT_SUCCESS or QMI_RESULT_FAILURE * - qmi_error_type -- Error code. Possible error code values are * described in the error codes * section of each message * definition. */ /* Optional */ /* Rule ID List */ uint8_t rule_id_valid; uint32_t rule_id_len; uint32_t rule_id[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of rule IDs returned to the control point. * Any further reference to the rule is done using the filter rule ID * specified in this list. */ }; /* Message */ /*Service Message Definition*/ #define QMI_IPA_INDICATION_REGISTER_REQ_V01 0x0020 #define QMI_IPA_INDICATION_REGISTER_RESP_V01 0x0020 Loading Loading @@ -1580,6 +1657,8 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { #define QMI_IPA_STOP_DATA_USAGE_QUOTA_RESP_V01 0x0034 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01 0x0035 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_V01 0x0035 #define QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01 0x0037 #define QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_V01 0x0037 /* add for max length*/ #define QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01 134 Loading Loading @@ -1618,6 +1697,9 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_MAX_MSG_LEN_V01 4 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_MAX_MSG_LEN_V01 7 #define QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01 22685 #define QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_MAX_MSG_LEN_V01 523 /* Service Object Accessor */ #endif/* IPA_QMI_SERVICE_V01_H */ Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +53 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,12 @@ static struct msg_desc ipa3_init_modem_driver_cmplt_resp_desc = { .ei_array = ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei, }; static struct msg_desc ipa3_install_fltr_rule_req_ex_desc = { .max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01, .msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01, .ei_array = ipa3_install_fltr_rule_req_ex_msg_data_v01_ei, }; static int ipa3_handle_indication_req(void *req_h, void *req) { struct ipa_indication_reg_req_msg_v01 *indication_req; Loading Loading @@ -301,6 +307,10 @@ static int ipa3_a5_svc_req_desc_cb(unsigned int msg_id, *req_desc = &ipa3_install_fltr_rule_req_desc; rc = sizeof(struct ipa_install_fltr_rule_req_msg_v01); break; case QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01: *req_desc = &ipa3_install_fltr_rule_req_ex_desc; rc = sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01); break; case QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01: *req_desc = &ipa3_filter_installed_notif_req_desc; rc = sizeof(struct ipa_fltr_installed_notif_req_msg_v01); Loading Loading @@ -629,6 +639,49 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) resp.resp.error, "ipa_install_filter"); } /* sending filter-install-request to modem*/ int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { struct ipa_install_fltr_rule_resp_ex_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; /* check if the filter rules from IPACM is valid */ if (req->filter_spec_ex_list_len == 0) { IPAWANDBG("IPACM pass zero rules to Q6\n"); } else { IPAWANDBG("IPACM pass %u rules to Q6\n", req->filter_spec_ex_list_len); } /* cache the qmi_filter_request */ memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_ex_msg_cache[ ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg]), req, sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01)); ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg++; ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_ex_msg %= 10; req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01; req_desc.ei_array = ipa3_install_fltr_rule_req_ex_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_install_fltr_rule_resp_ex_msg_v01)); resp_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_V01; resp_desc.ei_array = ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa3_check_qmi_response(rc, QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01, resp.resp.result, resp.resp.error, "ipa_install_filter"); } int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +15 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -73,6 +73,9 @@ u32 q6_ul_filter_rule_hdl[MAX_NUM_Q6_RULE]; int num_ipa_install_fltr_rule_req_msg; struct ipa_install_fltr_rule_req_msg_v01 ipa_install_fltr_rule_req_msg_cache[MAX_NUM_QMI_RULE_CACHE]; int num_ipa_install_fltr_rule_req_ex_msg; struct ipa_install_fltr_rule_req_ex_msg_v01 ipa_install_fltr_rule_req_ex_msg_cache[MAX_NUM_QMI_RULE_CACHE]; int num_ipa_fltr_installed_notif_req_msg; struct ipa_fltr_installed_notif_req_msg_v01 ipa_fltr_installed_notif_req_msg_cache[MAX_NUM_QMI_RULE_CACHE]; Loading Loading @@ -115,6 +118,8 @@ extern struct elem_info ipa3_stop_data_usage_quota_req_msg_data_v01_ei[]; extern struct elem_info ipa3_stop_data_usage_quota_resp_msg_data_v01_ei[]; extern struct elem_info ipa3_init_modem_driver_cmplt_req_msg_data_v01_ei[]; extern struct elem_info ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei[]; extern struct elem_info ipa3_install_fltr_rule_req_ex_msg_data_v01_ei[]; extern struct elem_info ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei[]; /** * struct ipa3_rmnet_context - IPA rmnet context Loading @@ -140,6 +145,9 @@ void ipa3_qmi_service_exit(void); int ipa3_qmi_filter_request_send( struct ipa_install_fltr_rule_req_msg_v01 *req); int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req); /* sending filter-installed-notify-request to modem*/ int ipa3_qmi_filter_notify_send(struct ipa_fltr_installed_notif_req_msg_v01 *req); Loading Loading @@ -209,6 +217,12 @@ static inline int ipa3_qmi_filter_request_send( return -EPERM; } static inline int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { return -EPERM; } /* sending filter-installed-notify-request to modem*/ static inline int ipa3_qmi_filter_notify_send( struct ipa_fltr_installed_notif_req_msg_v01 *req) Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service_v01.c +180 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2744,3 +2744,182 @@ struct elem_info ipa3_stop_data_usage_quota_resp_msg_data_v01_ei[] = { .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct elem_info ipa3_install_fltr_rule_req_ex_msg_data_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list_len), }, { .data_type = QMI_STRUCT, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(struct ipa_filter_spec_ex_type_v01), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, filter_spec_ex_list), .ei_array = ipa_filter_spec_ex_type_data_v01_ei, }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, source_pipe_index_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, source_pipe_index), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv4_filters_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv4_filters), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x13, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv6_filters_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x13, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, num_ipv6_filters), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list_len), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(uint32_t), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_install_fltr_rule_req_ex_msg_v01, xlat_filter_indices_list), }, { .data_type = QMI_EOTI, .is_array = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct elem_info ipa3_install_fltr_rule_resp_ex_msg_data_v01_ei[] = { { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct qmi_response_type_v01), .is_array = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, resp), .ei_array = get_qmi_response_type_v01_ei(), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id_valid), }, { .data_type = QMI_DATA_LEN, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id_len), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = QMI_IPA_MAX_FILTERS_EX_V01, .elem_size = sizeof(uint32_t), .is_array = VAR_LEN_ARRAY, .tlv_type = 0x10, .offset = offsetof( struct ipa_install_fltr_rule_resp_ex_msg_v01, rule_id), }, { .data_type = QMI_EOTI, .is_array = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, };
drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c +26 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -97,6 +97,31 @@ static long ipa3_wan_ioctl(struct file *filp, } break; case WAN_IOC_ADD_FLT_RULE_EX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_EX :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (ipa3_qmi_filter_request_ex_send( (struct ipa_install_fltr_rule_req_ex_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 add filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_ADD_FLT_RULE_INDEX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_INDEX :>>>\n", DRIVER_NAME); Loading
include/uapi/linux/ipa_qmi_service_v01.h +83 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -44,6 +44,7 @@ #define QMI_IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS_V01 2 #define QMI_IPA_IPFLTR_NUM_MEQ_128_EQNS_V01 2 #define QMI_IPA_MAX_FILTERS_V01 64 #define QMI_IPA_MAX_FILTERS_EX_V01 128 #define QMI_IPA_MAX_PIPES_V01 20 #define QMI_IPA_MAX_APN_V01 8 Loading Loading @@ -1549,6 +1550,82 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { /**< Standard response type.*/ }; /* Message */ /* Request Message; Request from Modem IPA driver to set DPL peripheral pipe */ struct ipa_install_fltr_rule_req_ex_msg_v01 { /* Optional */ /* Extended Filter Specification */ uint8_t filter_spec_ex_list_valid; uint32_t filter_spec_ex_list_len; struct ipa_filter_spec_ex_type_v01 filter_spec_ex_list[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of filter specifications of filters that must be installed in * the IPAv3.x hardware. * The driver installing these rules must do so in the same order as * specified in this list. */ /* Optional */ /* Pipe Index to Install Rule */ uint8_t source_pipe_index_valid; uint32_t source_pipe_index; /* Pipe index to install the filter rule. * The requester may not always know the pipe indices. If not specified, * the receiver must install this rule on all pipes that it controls, * through which data may be fed into the IPA. */ /* Optional */ /* Total Number of IPv4 Filters in the Filter Spec List */ uint8_t num_ipv4_filters_valid; uint32_t num_ipv4_filters; /* Number of IPv4 rules included in the filter specification list. */ /* Optional */ /* Total Number of IPv6 Filters in the Filter Spec List */ uint8_t num_ipv6_filters_valid; uint32_t num_ipv6_filters; /* Number of IPv6 rules included in the filter specification list. */ /* Optional */ /* List of XLAT Filter Indices in the Filter Spec List */ uint8_t xlat_filter_indices_list_valid; uint32_t xlat_filter_indices_list_len; uint32_t xlat_filter_indices_list[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of XLAT filter indices. * Filter rules at specified indices must be modified by the * receiver if the PDN is XLAT before installing them on the associated * IPA consumer pipe. */ }; /* Message */ /* Response Message; Requests installation of filtering rules in the hardware * block on the remote side. */ struct ipa_install_fltr_rule_resp_ex_msg_v01 { /* Mandatory */ /* Result Code */ struct ipa_qmi_response_type_v01 resp; /* Standard response type. * Standard response type. Contains the following data members: * - qmi_result_type -- QMI_RESULT_SUCCESS or QMI_RESULT_FAILURE * - qmi_error_type -- Error code. Possible error code values are * described in the error codes * section of each message * definition. */ /* Optional */ /* Rule ID List */ uint8_t rule_id_valid; uint32_t rule_id_len; uint32_t rule_id[QMI_IPA_MAX_FILTERS_EX_V01]; /* List of rule IDs returned to the control point. * Any further reference to the rule is done using the filter rule ID * specified in this list. */ }; /* Message */ /*Service Message Definition*/ #define QMI_IPA_INDICATION_REGISTER_REQ_V01 0x0020 #define QMI_IPA_INDICATION_REGISTER_RESP_V01 0x0020 Loading Loading @@ -1580,6 +1657,8 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { #define QMI_IPA_STOP_DATA_USAGE_QUOTA_RESP_V01 0x0034 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01 0x0035 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_V01 0x0035 #define QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01 0x0037 #define QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_V01 0x0037 /* add for max length*/ #define QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01 134 Loading Loading @@ -1618,6 +1697,9 @@ struct ipa_stop_data_usage_quota_resp_msg_v01 { #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_MAX_MSG_LEN_V01 4 #define QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_MAX_MSG_LEN_V01 7 #define QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01 22685 #define QMI_IPA_INSTALL_FILTER_RULE_EX_RESP_MAX_MSG_LEN_V01 523 /* Service Object Accessor */ #endif/* IPA_QMI_SERVICE_V01_H */