Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +53 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,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 @@ -299,6 +305,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 @@ -623,6 +633,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 +14 −0 Original line number Diff line number Diff line 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-2016, 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 +25 −0 Original line number Diff line number Diff line 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 +85 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016, 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 @@ -1543,6 +1544,84 @@ 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 @@ -1574,6 +1653,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 @@ -1612,6 +1693,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 @@ -111,6 +111,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 @@ -299,6 +305,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 @@ -623,6 +633,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 +14 −0 Original line number Diff line number Diff line 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-2016, 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 +25 −0 Original line number Diff line number Diff line 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 +85 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016, 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 @@ -1543,6 +1544,84 @@ 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 @@ -1574,6 +1653,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 @@ -1612,6 +1693,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 */