diff --git a/ipa/ipa_v3/ipa_qmi_service.c b/ipa/ipa_v3/ipa_qmi_service.c index 2db32453576e..bcd53a93e820 100644 --- a/ipa/ipa_v3/ipa_qmi_service.c +++ b/ipa/ipa_v3/ipa_qmi_service.c @@ -1324,13 +1324,25 @@ int ipa3_qmi_filter_notify_send( return -EINVAL; } + if (req->rule_id_ex_len == 0) { + IPAWANDBG(" delete UL filter rule for pipe %d\n", + req->source_pipe_index); + } else if (req->rule_id_ex_len > QMI_IPA_MAX_FILTERS_EX2_V01) { + IPAWANERR(" UL filter rule for pipe %d exceed max (%u)\n", + req->source_pipe_index, + req->rule_id_ex_len); + return -EINVAL; + } + if (req->install_status != IPA_QMI_RESULT_SUCCESS_V01) { IPAWANERR(" UL filter rule for pipe %d install_status = %d\n", req->source_pipe_index, req->install_status); return -EINVAL; - } else if (req->rule_id_valid != 1) { - IPAWANERR(" UL filter rule for pipe %d rule_id_valid = %d\n", - req->source_pipe_index, req->rule_id_valid); + } else if ((req->rule_id_valid != 1) && + (req->rule_id_ex_valid != 1)) { + IPAWANERR(" UL filter rule for pipe %d rule_id_valid = %d/%d\n", + req->source_pipe_index, req->rule_id_valid, + req->rule_id_ex_valid); return -EINVAL; } else if (req->source_pipe_index >= ipa3_ctx->ipa_num_pipes) { IPAWANDBG( diff --git a/ipa/ipa_v3/ipa_qmi_service.h b/ipa/ipa_v3/ipa_qmi_service.h index f5973439d6c8..8a102cf88a6d 100644 --- a/ipa/ipa_v3/ipa_qmi_service.h +++ b/ipa/ipa_v3/ipa_qmi_service.h @@ -109,6 +109,9 @@ struct ipa3_qmi_context { int num_ipa_offload_connection; struct ipa_offload_connection_val ipa_offload_cache[QMI_IPA_MAX_FILTERS_V01]; + uint8_t ul_firewall_indices_list_valid; + uint32_t ul_firewall_indices_list_len; + uint32_t ul_firewall_indices_list[QMI_IPA_MAX_FILTERS_V01]; }; struct ipa3_rmnet_mux_val { diff --git a/ipa/ipa_v3/ipa_qmi_service_v01.c b/ipa/ipa_v3/ipa_qmi_service_v01.c index e7fbac6f2931..6fbbfd7253c4 100644 --- a/ipa/ipa_v3/ipa_qmi_service_v01.c +++ b/ipa/ipa_v3/ipa_qmi_service_v01.c @@ -2296,7 +2296,7 @@ struct qmi_elem_info ipa3_fltr_installed_notif_req_msg_data_v01_ei[] = { { .data_type = QMI_DATA_LEN, .elem_len = 1, - .elem_size = sizeof(uint8_t), + .elem_size = sizeof(uint32_t), .array_type = NO_ARRAY, .tlv_type = 0x19, .offset = offsetof( diff --git a/ipa/ipa_v3/rmnet_ipa.c b/ipa/ipa_v3/rmnet_ipa.c index 44b52bc87d98..8e56e2d434af 100644 --- a/ipa/ipa_v3/rmnet_ipa.c +++ b/ipa/ipa_v3/rmnet_ipa.c @@ -679,6 +679,41 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01 } } } + + if (rule_req->ul_firewall_indices_list_valid) { + IPAWANDBG("Receive ul_firewall_indices_list_len = (%d)", + rule_req->ul_firewall_indices_list_len); + + if (rule_req->ul_firewall_indices_list_len > + rmnet_ipa3_ctx->num_q6_rules) { + IPAWANERR("UL rule indices are not valid: (%d/%d)\n", + rule_req->xlat_filter_indices_list_len, + rmnet_ipa3_ctx->num_q6_rules); + goto failure; + } + + ipa3_qmi_ctx->ul_firewall_indices_list_valid = 1; + ipa3_qmi_ctx->ul_firewall_indices_list_len = + rule_req->ul_firewall_indices_list_len; + + for (i = 0; i < rule_req->ul_firewall_indices_list_len; i++) { + ipa3_qmi_ctx->ul_firewall_indices_list[i] = + rule_req->ul_firewall_indices_list[i]; + } + + for (i = 0; i < rule_req->ul_firewall_indices_list_len; i++) { + if (rule_req->ul_firewall_indices_list[i] + >= rmnet_ipa3_ctx->num_q6_rules) { + IPAWANERR("UL rule idx is wrong: %d\n", + rule_req->ul_firewall_indices_list[i]); + goto failure; + } else { + ipa3_qmi_ctx->q6_ul_filter_rule + [rule_req->ul_firewall_indices_list[i]] + .replicate_needed = 1; + } + } + } goto success; failure: