Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f88a5347 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa3: Send actual DL flt rule to Q6"

parents 39045a7a 880553e6
Loading
Loading
Loading
Loading
+41 −2
Original line number Diff line number Diff line
@@ -775,6 +775,44 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req)
		resp.resp.error, "ipa_install_filter");
}

static int ipa3_qmi_filter_request_ex_calc_length(
	struct ipa_install_fltr_rule_req_ex_msg_v01 *req)
{
	int len = 0;

	/* caller should validate and send the req */
	/* instead of sending max length,the approximate length is calculated */
	len += ((sizeof(struct ipa_install_fltr_rule_req_ex_msg_v01)) -
		(QMI_IPA_MAX_FILTERS_EX_V01 *
		sizeof(struct ipa_filter_spec_ex_type_v01) -
		QMI_IPA_MAX_FILTERS_EX_V01 * sizeof(uint32_t)) -
		(QMI_IPA_MAX_FILTERS_V01 *
		sizeof(struct ipa_filter_spec_ex2_type_v01)));

	if (req->filter_spec_ex_list_valid &&
		req->filter_spec_ex_list_len > 0) {
		len += sizeof(struct ipa_filter_spec_ex_type_v01)*
			req->filter_spec_ex_list_len;
	}
	if (req->xlat_filter_indices_list_valid &&
		req->xlat_filter_indices_list_len > 0) {
		len += sizeof(uint32_t)*req->xlat_filter_indices_list_len;
	}

	if (req->filter_spec_ex2_list_valid &&
		req->filter_spec_ex2_list_len > 0) {
		len += sizeof(struct ipa_filter_spec_ex2_type_v01)*
		req->filter_spec_ex2_list_len;
	}

	if (req->ul_firewall_indices_list_valid &&
		req->ul_firewall_indices_list_len > 0) {
		len += sizeof(uint32_t)*req->ul_firewall_indices_list_len;
	}

	return len;
}

/* sending filter-install-request to modem*/
int ipa3_qmi_filter_request_ex_send(
	struct ipa_install_fltr_rule_req_ex_msg_v01 *req)
@@ -840,8 +878,9 @@ int ipa3_qmi_filter_request_ex_send(
	}
	mutex_unlock(&ipa3_qmi_lock);

	req_desc.max_msg_len =
		QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_MAX_MSG_LEN_V01;
	req_desc.max_msg_len = ipa3_qmi_filter_request_ex_calc_length(req);
	IPAWANDBG("QMI send request length = %d\n", req_desc.max_msg_len);

	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;

+21 −21
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/init.h>
@@ -96,7 +96,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(struct ipa_install_fltr_rule_req_msg_v01);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -117,7 +117,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		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 = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -138,7 +138,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG("device %s got WAN_IOC_ADD_OFFLOAD_CONNECTION :>>>\n",
		DRIVER_NAME);
		pyld_sz = sizeof(struct ipa_add_offload_connection_req_msg_v01);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -160,7 +160,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG("device %s got WAN_IOC_RMV_OFFLOAD_CONNECTION :>>>\n",
		DRIVER_NAME);
		pyld_sz = rmv_offload_req__msg_size;
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -183,7 +183,7 @@ static long ipa3_wan_ioctl(struct file *filp,
			DRIVER_NAME);
		pyld_sz =
		sizeof(struct ipa_configure_ul_firewall_rules_req_msg_v01);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -205,7 +205,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_INDEX :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(struct ipa_fltr_installed_notif_req_msg_v01);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -226,7 +226,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG("device %s got WAN_IOC_VOTE_FOR_BW_MBPS :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(uint32_t);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -245,7 +245,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_POLL_TETHERING_STATS:
		IPAWANDBG_LOW("got WAN_IOCTL_POLL_TETHERING_STATS :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_poll_tethering_stats);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -266,7 +266,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG_LOW("device %s got WAN_IOCTL_SET_DATA_QUOTA :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(struct wan_ioctl_set_data_quota);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -290,7 +290,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_SET_TETHER_CLIENT_PIPE:
		IPAWANDBG_LOW("got WAN_IOC_SET_TETHER_CLIENT_PIPE :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_set_tether_client_pipe);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -306,7 +306,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_QUERY_TETHER_STATS:
		IPAWANDBG_LOW("got WAN_IOC_QUERY_TETHER_STATS :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_query_tether_stats);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -328,7 +328,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_QUERY_TETHER_STATS_ALL:
		IPAWANDBG_LOW("got WAN_IOC_QUERY_TETHER_STATS_ALL :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_query_tether_stats_all);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -351,7 +351,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG_LOW("device %s got WAN_IOC_RESET_TETHER_STATS :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(struct wan_ioctl_reset_tether_stats);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -369,7 +369,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		IPAWANDBG_LOW("device %s got WAN_IOC_NOTIFY_WAN_STATE :>>>\n",
			DRIVER_NAME);
		pyld_sz = sizeof(struct wan_ioctl_notify_wan_state);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -391,7 +391,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_ENABLE_PER_CLIENT_STATS:
		IPAWANDBG_LOW("got WAN_IOC_ENABLE_PER_CLIENT_STATS :>>>\n");
		pyld_sz = sizeof(bool);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -406,7 +406,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_QUERY_PER_CLIENT_STATS:
		IPAWANDBG_LOW("got WAN_IOC_QUERY_PER_CLIENT_STATS :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_query_per_client_stats);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -428,7 +428,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_SET_LAN_CLIENT_INFO:
		IPAWANDBG_LOW("got WAN_IOC_SET_LAN_CLIENT_INFO :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_lan_client_info);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -444,7 +444,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_CLEAR_LAN_CLIENT_INFO:
		IPAWANDBG_LOW("got WAN_IOC_CLEAR_LAN_CLIENT_INFO :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_lan_client_info);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -461,7 +461,7 @@ static long ipa3_wan_ioctl(struct file *filp,
	case WAN_IOC_SEND_LAN_CLIENT_MSG:
		IPAWANDBG_LOW("got WAN_IOC_SEND_LAN_CLIENT_MSG :>>>\n");
		pyld_sz = sizeof(struct wan_ioctl_send_lan_client_msg);
		param = memdup_user((const void __user *)arg, pyld_sz);
		param = vmemdup_user((const void __user *)arg, pyld_sz);
		if (IS_ERR(param)) {
			retval = PTR_ERR(param);
			break;
@@ -479,7 +479,7 @@ static long ipa3_wan_ioctl(struct file *filp,
		retval = -ENOTTY;
	}
	if (!IS_ERR(param))
		kfree(param);
		kvfree(param);
	return retval;
}