msm: ipa: add support for new QMI IDL

Add support for new QMI IDL in IPA driver for new message
QMI_IPA_INSTALL_FILTER_RULE_EX_REQ_V01 which allows to send
at most 128 rules.

Change-Id: I886e40f597169939ce4598863fd80145743d8db7
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
This commit is contained in:
Skylar Chang 2016-09-01 16:38:02 -07:00 committed by Gerrit - the friendly Code Review server
parent 8a8abceb69
commit a1d527f88f
6 changed files with 363 additions and 3 deletions

View file

@ -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;
@ -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);
@ -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)

View file

@ -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];
@ -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
@ -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);
@ -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)

View file

@ -1,4 +1,4 @@
/* 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
@ -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,
},
};

View file

@ -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);

View file

@ -1,4 +1,4 @@
/* 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
@ -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
@ -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
@ -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
@ -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 */

View file

@ -1,4 +1,4 @@
/* 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
@ -31,6 +31,7 @@
#define WAN_IOCTL_QUERY_TETHER_STATS 6
#define WAN_IOCTL_RESET_TETHER_STATS 7
#define WAN_IOCTL_QUERY_DL_FILTER_STATS 8
#define WAN_IOCTL_ADD_FLT_RULE_EX 9
/* User space may not have this defined. */
#ifndef IFNAMSIZ
@ -150,4 +151,8 @@ struct wan_ioctl_query_dl_filter_stats {
WAN_IOCTL_QUERY_DL_FILTER_STATS, \
struct wan_ioctl_query_dl_filter_stats *)
#define WAN_IOC_ADD_FLT_RULE_EX _IOWR(WAN_IOC_MAGIC, \
WAN_IOCTL_ADD_FLT_RULE_EX, \
struct ipa_install_fltr_rule_req_ex_msg_v01 *)
#endif /* _RMNET_IPA_FD_IOCTL_H */