Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +83 −1 Original line number Diff line number Diff line Loading @@ -695,6 +695,57 @@ int ipa3_qmi_filter_request_ex_send( resp.resp.error, "ipa_install_filter"); } /* sending ul-filter-install-request to modem*/ int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_msg_v01 *req) { struct ipa_configure_ul_firewall_rules_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; IPAWANDBG("IPACM pass %u rules to Q6\n", req->firewall_rules_list_len); mutex_lock(&ipa3_qmi_lock); if (ipa3_qmi_ctx != NULL) { /* cache the qmi_filter_request */ memcpy( &(ipa3_qmi_ctx->ipa_configure_ul_firewall_rules_req_msg_cache[ ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg]), req, sizeof(struct ipa_configure_ul_firewall_rules_req_msg_v01)); ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg++; ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg %= MAX_NUM_QMI_RULE_CACHE; } mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_V01; req_desc.ei_array = ipa3_configure_ul_firewall_rules_req_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_configure_ul_firewall_rules_resp_msg_v01)); resp_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_RESP_V01; resp_desc.ei_array = ipa3_configure_ul_firewall_rules_resp_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof( struct ipa_configure_ul_firewall_rules_req_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa3_check_qmi_response(rc, QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_V01, resp.resp.result, resp.resp.error, "ipa_received_ul_firewall_filter"); } int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) { Loading Loading @@ -880,6 +931,7 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, void *ind_cb_priv) { struct ipa_data_usage_quota_reached_ind_msg_v01 qmi_ind; struct ipa_configure_ul_firewall_rules_ind_msg_v01 qmi_ul_firewall_ind; struct msg_desc qmi_ind_desc; int rc = 0; Loading @@ -888,7 +940,7 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, return; } if (QMI_IPA_DATA_USAGE_QUOTA_REACHED_IND_V01 == msg_id) { if (msg_id == QMI_IPA_DATA_USAGE_QUOTA_REACHED_IND_V01) { memset(&qmi_ind, 0, sizeof( struct ipa_data_usage_quota_reached_ind_msg_v01)); qmi_ind_desc.max_msg_len = Loading @@ -908,6 +960,36 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, ipa3_broadcast_quota_reach_ind(qmi_ind.apn.mux_id, IPA_UPSTEAM_MODEM); } if (msg_id == QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_V01) { memset(&qmi_ul_firewall_ind, 0, sizeof( struct ipa_configure_ul_firewall_rules_ind_msg_v01)); qmi_ind_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_MAX_MSG_LEN_V01; qmi_ind_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_V01; qmi_ind_desc.ei_array = ipa3_configure_ul_firewall_rules_ind_msg_data_v01_ei; rc = qmi_kernel_decode( &qmi_ind_desc, &qmi_ul_firewall_ind, msg, msg_len); if (rc < 0) { IPAWANERR("Error decoding msg_id %d\n", msg_id); return; } IPAWANDBG("UL firewall rules install indication on Q6"); if (qmi_ul_firewall_ind.result.is_success == QMI_IPA_UL_FIREWALL_STATUS_SUCCESS_V01) { IPAWANDBG(" : Success\n"); IPAWANDBG ("Mux ID : %d\n", qmi_ul_firewall_ind.result.mux_id); } else if (qmi_ul_firewall_ind.result.is_success == QMI_IPA_UL_FIREWALL_STATUS_FAILURE_V01){ IPAWANERR(": Failure\n"); } else { IPAWANERR(": Unexpected Result"); } } } static void ipa3_q6_clnt_svc_arrive(struct work_struct *work) Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +13 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,10 @@ struct ipa3_qmi_context { 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]; int num_ipa_configure_ul_firewall_rules_req_msg; struct ipa_configure_ul_firewall_rules_req_msg_v01 ipa_configure_ul_firewall_rules_req_msg_cache [MAX_NUM_QMI_RULE_CACHE]; bool modem_cfg_emb_pipe_flt; }; Loading Loading @@ -190,6 +194,9 @@ int ipa3_qmi_filter_request_send( int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req); int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_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 @@ -287,6 +294,12 @@ static inline int ipa3_qmi_filter_request_send( return -EPERM; } static inline int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_msg_v01 *req) { return -EPERM; } static inline int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { Loading drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c +28 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,34 @@ static long ipa3_wan_ioctl(struct file *filp, } break; case WAN_IOC_ADD_UL_FLT_RULE: IPAWANDBG("device %s got WAN_IOC_UL_ADD_FLT_RULE :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_configure_ul_firewall_rules_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (const void __user *)arg, pyld_sz)) { retval = -EFAULT; break; } if (ipa3_qmi_ul_filter_request_send( (struct ipa_configure_ul_firewall_rules_req_msg_v01 *) param)) { IPAWANDBG("IPACM->Q6 add ul filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((void __user *)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 Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +83 −1 Original line number Diff line number Diff line Loading @@ -695,6 +695,57 @@ int ipa3_qmi_filter_request_ex_send( resp.resp.error, "ipa_install_filter"); } /* sending ul-filter-install-request to modem*/ int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_msg_v01 *req) { struct ipa_configure_ul_firewall_rules_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; IPAWANDBG("IPACM pass %u rules to Q6\n", req->firewall_rules_list_len); mutex_lock(&ipa3_qmi_lock); if (ipa3_qmi_ctx != NULL) { /* cache the qmi_filter_request */ memcpy( &(ipa3_qmi_ctx->ipa_configure_ul_firewall_rules_req_msg_cache[ ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg]), req, sizeof(struct ipa_configure_ul_firewall_rules_req_msg_v01)); ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg++; ipa3_qmi_ctx->num_ipa_configure_ul_firewall_rules_req_msg %= MAX_NUM_QMI_RULE_CACHE; } mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_V01; req_desc.ei_array = ipa3_configure_ul_firewall_rules_req_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_configure_ul_firewall_rules_resp_msg_v01)); resp_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_RESP_V01; resp_desc.ei_array = ipa3_configure_ul_firewall_rules_resp_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof( struct ipa_configure_ul_firewall_rules_req_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa3_check_qmi_response(rc, QMI_IPA_INSTALL_UL_FIREWALL_RULES_REQ_V01, resp.resp.result, resp.resp.error, "ipa_received_ul_firewall_filter"); } int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) { Loading Loading @@ -880,6 +931,7 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, void *ind_cb_priv) { struct ipa_data_usage_quota_reached_ind_msg_v01 qmi_ind; struct ipa_configure_ul_firewall_rules_ind_msg_v01 qmi_ul_firewall_ind; struct msg_desc qmi_ind_desc; int rc = 0; Loading @@ -888,7 +940,7 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, return; } if (QMI_IPA_DATA_USAGE_QUOTA_REACHED_IND_V01 == msg_id) { if (msg_id == QMI_IPA_DATA_USAGE_QUOTA_REACHED_IND_V01) { memset(&qmi_ind, 0, sizeof( struct ipa_data_usage_quota_reached_ind_msg_v01)); qmi_ind_desc.max_msg_len = Loading @@ -908,6 +960,36 @@ static void ipa3_q6_clnt_ind_cb(struct qmi_handle *handle, unsigned int msg_id, ipa3_broadcast_quota_reach_ind(qmi_ind.apn.mux_id, IPA_UPSTEAM_MODEM); } if (msg_id == QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_V01) { memset(&qmi_ul_firewall_ind, 0, sizeof( struct ipa_configure_ul_firewall_rules_ind_msg_v01)); qmi_ind_desc.max_msg_len = QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_MAX_MSG_LEN_V01; qmi_ind_desc.msg_id = QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_V01; qmi_ind_desc.ei_array = ipa3_configure_ul_firewall_rules_ind_msg_data_v01_ei; rc = qmi_kernel_decode( &qmi_ind_desc, &qmi_ul_firewall_ind, msg, msg_len); if (rc < 0) { IPAWANERR("Error decoding msg_id %d\n", msg_id); return; } IPAWANDBG("UL firewall rules install indication on Q6"); if (qmi_ul_firewall_ind.result.is_success == QMI_IPA_UL_FIREWALL_STATUS_SUCCESS_V01) { IPAWANDBG(" : Success\n"); IPAWANDBG ("Mux ID : %d\n", qmi_ul_firewall_ind.result.mux_id); } else if (qmi_ul_firewall_ind.result.is_success == QMI_IPA_UL_FIREWALL_STATUS_FAILURE_V01){ IPAWANERR(": Failure\n"); } else { IPAWANERR(": Unexpected Result"); } } } static void ipa3_q6_clnt_svc_arrive(struct work_struct *work) Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +13 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,10 @@ struct ipa3_qmi_context { 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]; int num_ipa_configure_ul_firewall_rules_req_msg; struct ipa_configure_ul_firewall_rules_req_msg_v01 ipa_configure_ul_firewall_rules_req_msg_cache [MAX_NUM_QMI_RULE_CACHE]; bool modem_cfg_emb_pipe_flt; }; Loading Loading @@ -190,6 +194,9 @@ int ipa3_qmi_filter_request_send( int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req); int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_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 @@ -287,6 +294,12 @@ static inline int ipa3_qmi_filter_request_send( return -EPERM; } static inline int ipa3_qmi_ul_filter_request_send( struct ipa_configure_ul_firewall_rules_req_msg_v01 *req) { return -EPERM; } static inline int ipa3_qmi_filter_request_ex_send( struct ipa_install_fltr_rule_req_ex_msg_v01 *req) { Loading
drivers/platform/msm/ipa/ipa_v3/rmnet_ipa_fd_ioctl.c +28 −0 Original line number Diff line number Diff line Loading @@ -134,6 +134,34 @@ static long ipa3_wan_ioctl(struct file *filp, } break; case WAN_IOC_ADD_UL_FLT_RULE: IPAWANDBG("device %s got WAN_IOC_UL_ADD_FLT_RULE :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_configure_ul_firewall_rules_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (const void __user *)arg, pyld_sz)) { retval = -EFAULT; break; } if (ipa3_qmi_ul_filter_request_send( (struct ipa_configure_ul_firewall_rules_req_msg_v01 *) param)) { IPAWANDBG("IPACM->Q6 add ul filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((void __user *)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