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

Commit 50d04e6b authored by Mohammed Javid's avatar Mohammed Javid
Browse files

msm: ipa: Add support for UL Firewall



For UL firewall v6 rules are sent to IPA Q6 in case of
whitelisting to allow only specific connections and drop
the rest of the connections.
Add a support to handle UL firewall request, response and
indication in rmnet ipa driver.

Change-Id: I74a80dce2e16bd8a2c22f12ae3a3f50807c4784e
Acked-by: default avatarAbhishek Choubey <abchoube@qti.qualcomm.com>
Acked-by: default avatarPooja Kumari <kumarip@qti.qualcomm.com>
Acked-by: default avatarMohammed Javid <mjavid@qti.qualcomm.com>
Signed-off-by: default avatarMohammed Javid <mjavid@codeaurora.org>
Signed-off-by: default avatarUtkarsh Saxena <usaxena@codeaurora.org>
parent d0c2a1eb
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
@@ -758,6 +758,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)
{
@@ -967,6 +1018,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;

@@ -995,6 +1047,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)
+13 −0
Original line number Diff line number Diff line
@@ -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;
};

@@ -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);
@@ -290,6 +297,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)
{
+27 −0
Original line number Diff line number Diff line
@@ -137,6 +137,33 @@ 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);