summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_Filtering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipacm/src/IPACM_Filtering.cpp')
-rw-r--r--ipacm/src/IPACM_Filtering.cpp498
1 files changed, 253 insertions, 245 deletions
diff --git a/ipacm/src/IPACM_Filtering.cpp b/ipacm/src/IPACM_Filtering.cpp
index a158d74..8aa25a6 100644
--- a/ipacm/src/IPACM_Filtering.cpp
+++ b/ipacm/src/IPACM_Filtering.cpp
@@ -46,6 +46,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "IPACM_Filtering.h"
#include <IPACM_Log.h>
#include "IPACM_Defs.h"
+#include "IPACM_Iface.h"
const char *IPACM_Filtering::DEVICE_NAME = "/dev/ipa";
@@ -234,156 +235,162 @@ fail_tbl:
bool IPACM_Filtering::AddFilteringRuleAfter_hw_index(struct ipa_ioc_add_flt_rule_after *ruleTable, int hw_counter_index)
{
bool ret = true;
-#ifdef FEATURE_IPA_V3
int retval=0, cnt = 0, len = 0;
struct ipa_ioc_add_flt_rule_after_v2 *ruleTable_v2;
struct ipa_flt_rule_add_v2 flt_rule_entry;
- IPACMDBG("Printing filter add attributes\n");
- IPACMDBG("ep: %d\n", ruleTable->ep);
- IPACMDBG("ip type: %d\n", ruleTable->ip);
- IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
- IPACMDBG("add_after_hdl: %d\n", ruleTable->add_after_hdl);
- IPACMDBG("commit value: %d\n", ruleTable->commit);
-
- /* change to v2 format*/
- len = sizeof(struct ipa_ioc_add_flt_rule_after_v2);
- ruleTable_v2 = (struct ipa_ioc_add_flt_rule_after_v2*)malloc(len);
- if (ruleTable_v2 == NULL)
+ if (IPACM_Iface::ipacmcfg->isIPAv3Supported())
{
- IPACMERR("Error Locate ipa_ioc_add_flt_rule_after_v2 memory...\n");
- return false;
- }
- memset(ruleTable_v2, 0, len);
- ruleTable_v2->rules = (uint64_t)calloc(ruleTable->num_rules, sizeof(struct ipa_flt_rule_add_v2));
- if (!ruleTable_v2->rules) {
- IPACMERR("Failed to allocate memory for filtering rules\n");
- ret = false;
- goto fail_tbl;
- }
-
- ruleTable_v2->commit = ruleTable->commit;
- ruleTable_v2->ep = ruleTable->ep;
- ruleTable_v2->ip = ruleTable->ip;
- ruleTable_v2->num_rules = ruleTable->num_rules;
- ruleTable_v2->add_after_hdl = ruleTable->add_after_hdl;
- ruleTable_v2->flt_rule_size = sizeof(struct ipa_flt_rule_add_v2);
+ IPACMDBG("Printing filter add attributes\n");
+ IPACMDBG("ep: %d\n", ruleTable->ep);
+ IPACMDBG("ip type: %d\n", ruleTable->ip);
+ IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
+ IPACMDBG("add_after_hdl: %d\n", ruleTable->add_after_hdl);
+ IPACMDBG("commit value: %d\n", ruleTable->commit);
- for (cnt=0; cnt < ruleTable->num_rules; cnt++)
- {
- memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add_v2));
- flt_rule_entry.at_rear = ruleTable->rules[cnt].at_rear;
- flt_rule_entry.rule.retain_hdr = ruleTable->rules[cnt].rule.retain_hdr;
- flt_rule_entry.rule.to_uc = ruleTable->rules[cnt].rule.to_uc;
- flt_rule_entry.rule.action = ruleTable->rules[cnt].rule.action;
- flt_rule_entry.rule.rt_tbl_hdl = ruleTable->rules[cnt].rule.rt_tbl_hdl;
- flt_rule_entry.rule.rt_tbl_idx = ruleTable->rules[cnt].rule.rt_tbl_idx;
- flt_rule_entry.rule.eq_attrib_type = ruleTable->rules[cnt].rule.eq_attrib_type;
- flt_rule_entry.rule.max_prio = ruleTable->rules[cnt].rule.max_prio;
- flt_rule_entry.rule.hashable = ruleTable->rules[cnt].rule.hashable;
- flt_rule_entry.rule.rule_id = ruleTable->rules[cnt].rule.rule_id;
- flt_rule_entry.rule.set_metadata = ruleTable->rules[cnt].rule.set_metadata;
- flt_rule_entry.rule.pdn_idx = ruleTable->rules[cnt].rule.pdn_idx;
- memcpy(&flt_rule_entry.rule.eq_attrib,
- &ruleTable->rules[cnt].rule.eq_attrib,
- sizeof(flt_rule_entry.rule.eq_attrib));
- memcpy(&flt_rule_entry.rule.attrib,
- &ruleTable->rules[cnt].rule.attrib,
- sizeof(flt_rule_entry.rule.attrib));
- IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", cnt,
- ruleTable->rules[cnt].rule.attrib.attrib_mask);
- /* 0 means disable hw-counter-sats */
- if (hw_counter_index != 0)
+ /* change to v2 format*/
+ len = sizeof(struct ipa_ioc_add_flt_rule_after_v2);
+ ruleTable_v2 = (struct ipa_ioc_add_flt_rule_after_v2*)malloc(len);
+ if (ruleTable_v2 == NULL)
{
- flt_rule_entry.rule.enable_stats = 1;
- flt_rule_entry.rule.cnt_idx = hw_counter_index;
+ IPACMERR("Error Locate ipa_ioc_add_flt_rule_after_v2 memory...\n");
+ return false;
+ }
+ memset(ruleTable_v2, 0, len);
+ ruleTable_v2->rules = (uint64_t)calloc(ruleTable->num_rules, sizeof(struct ipa_flt_rule_add_v2));
+ if (!ruleTable_v2->rules) {
+ IPACMERR("Failed to allocate memory for filtering rules\n");
+ ret = false;
+ goto fail_tbl;
}
- /* copy to v2 table*/
- memcpy((void *)(ruleTable_v2->rules + (cnt * sizeof(struct ipa_flt_rule_add_v2))),
- &flt_rule_entry, sizeof(flt_rule_entry));
- }
-
- retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER_V2, ruleTable_v2);
- if (retval != 0)
- {
- IPACMERR("Failed adding Filtering rule %pK\n", ruleTable_v2);
- PERROR("unable to add filter rule:");
+ ruleTable_v2->commit = ruleTable->commit;
+ ruleTable_v2->ep = ruleTable->ep;
+ ruleTable_v2->ip = ruleTable->ip;
+ ruleTable_v2->num_rules = ruleTable->num_rules;
+ ruleTable_v2->add_after_hdl = ruleTable->add_after_hdl;
+ ruleTable_v2->flt_rule_size = sizeof(struct ipa_flt_rule_add_v2);
- for (int cnt = 0; cnt < ruleTable_v2->num_rules; cnt++)
+ for (cnt=0; cnt < ruleTable->num_rules; cnt++)
{
- if (((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status != 0)
+ memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add_v2));
+ flt_rule_entry.at_rear = ruleTable->rules[cnt].at_rear;
+ flt_rule_entry.rule.retain_hdr = ruleTable->rules[cnt].rule.retain_hdr;
+ flt_rule_entry.rule.to_uc = ruleTable->rules[cnt].rule.to_uc;
+ flt_rule_entry.rule.action = ruleTable->rules[cnt].rule.action;
+ flt_rule_entry.rule.rt_tbl_hdl = ruleTable->rules[cnt].rule.rt_tbl_hdl;
+ flt_rule_entry.rule.rt_tbl_idx = ruleTable->rules[cnt].rule.rt_tbl_idx;
+ flt_rule_entry.rule.eq_attrib_type = ruleTable->rules[cnt].rule.eq_attrib_type;
+ flt_rule_entry.rule.max_prio = ruleTable->rules[cnt].rule.max_prio;
+ flt_rule_entry.rule.hashable = ruleTable->rules[cnt].rule.hashable;
+ flt_rule_entry.rule.rule_id = ruleTable->rules[cnt].rule.rule_id;
+ flt_rule_entry.rule.set_metadata = ruleTable->rules[cnt].rule.set_metadata;
+ flt_rule_entry.rule.pdn_idx = ruleTable->rules[cnt].rule.pdn_idx;
+ memcpy(&flt_rule_entry.rule.eq_attrib,
+ &ruleTable->rules[cnt].rule.eq_attrib,
+ sizeof(flt_rule_entry.rule.eq_attrib));
+ memcpy(&flt_rule_entry.rule.attrib,
+ &ruleTable->rules[cnt].rule.attrib,
+ sizeof(flt_rule_entry.rule.attrib));
+ IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", cnt,
+ ruleTable->rules[cnt].rule.attrib.attrib_mask);
+ /* 0 means disable hw-counter-sats */
+ if (hw_counter_index != 0)
{
- IPACMERR("Adding Filter rule:%d failed with status:%d\n",
- cnt, ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status);
+ flt_rule_entry.rule.enable_stats = 1;
+ flt_rule_entry.rule.cnt_idx = hw_counter_index;
}
+
+ /* copy to v2 table*/
+ memcpy((void *)(ruleTable_v2->rules + (cnt * sizeof(struct ipa_flt_rule_add_v2))),
+ &flt_rule_entry, sizeof(flt_rule_entry));
}
- ret = false;
- goto fail_rule;
- }
- /* copy results from v2 to v1 format */
- for (int cnt = 0; cnt < ruleTable->num_rules; cnt++)
- {
- /* copy status to v1 format */
- ruleTable->rules[cnt].status = ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status;
- ruleTable->rules[cnt].flt_rule_hdl = ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].flt_rule_hdl;
+ retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER_V2, ruleTable_v2);
+ if (retval != 0)
+ {
+ IPACMERR("Failed adding Filtering rule %pK\n", ruleTable_v2);
+ PERROR("unable to add filter rule:");
- if(((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status != 0)
+ for (int cnt = 0; cnt < ruleTable_v2->num_rules; cnt++)
+ {
+ if (((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status != 0)
+ {
+ IPACMERR("Adding Filter rule:%d failed with status:%d\n",
+ cnt, ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status);
+ }
+ }
+ ret = false;
+ goto fail_rule;
+ }
+
+ /* copy results from v2 to v1 format */
+ for (int cnt = 0; cnt < ruleTable->num_rules; cnt++)
{
- IPACMERR("Adding Filter rule:%d failed with status:%d\n",
- cnt, ((struct ipa_flt_rule_add_v2 *) ruleTable_v2->rules)[cnt].status);
+ /* copy status to v1 format */
+ ruleTable->rules[cnt].status = ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status;
+ ruleTable->rules[cnt].flt_rule_hdl = ((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].flt_rule_hdl;
+
+ if(((struct ipa_flt_rule_add_v2 *)ruleTable_v2->rules)[cnt].status != 0)
+ {
+ IPACMERR("Adding Filter rule:%d failed with status:%d\n",
+ cnt, ((struct ipa_flt_rule_add_v2 *) ruleTable_v2->rules)[cnt].status);
+ }
}
- }
- IPACMDBG("Added Filtering rule %pK\n", ruleTable_v2);
+ IPACMDBG("Added Filtering rule %pK\n", ruleTable_v2);
-fail_rule:
- if((void *)ruleTable_v2->rules != NULL)
- free((void *)ruleTable_v2->rules);
-fail_tbl:
- if (ruleTable_v2 != NULL)
- free(ruleTable_v2);
-#else
- if (ruleTable)
- IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
-#endif
+ fail_rule:
+ if((void *)ruleTable_v2->rules != NULL)
+ free((void *)ruleTable_v2->rules);
+ fail_tbl:
+ if (ruleTable_v2 != NULL)
+ free(ruleTable_v2);
+ }
+ else
+ {
+ if (ruleTable)
+ IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
+ }
return ret;
}
#endif //IPA_IOCTL_SET_FNR_COUNTER_INFO
bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable)
{
-#ifdef FEATURE_IPA_V3
int retval = 0;
- IPACMDBG("Printing filter add attributes\n");
- IPACMDBG("ip type: %d\n", ruleTable->ip);
- IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
- IPACMDBG("End point: %d\n", ruleTable->ep);
- IPACMDBG("commit value: %d\n", ruleTable->commit);
+ if (IPACM_Iface::ipacmcfg->isIPAv3Supported())
+ {
+ IPACMDBG("Printing filter add attributes\n");
+ IPACMDBG("ip type: %d\n", ruleTable->ip);
+ IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
+ IPACMDBG("End point: %d\n", ruleTable->ep);
+ IPACMDBG("commit value: %d\n", ruleTable->commit);
- retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable);
+ retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable);
- for (int cnt = 0; cnt<ruleTable->num_rules; cnt++)
- {
- if(ruleTable->rules[cnt].status != 0)
+ for (int cnt = 0; cnt<ruleTable->num_rules; cnt++)
{
- IPACMERR("Adding Filter rule:%d failed with status:%d\n",
- cnt, ruleTable->rules[cnt].status);
+ if(ruleTable->rules[cnt].status != 0)
+ {
+ IPACMERR("Adding Filter rule:%d failed with status:%d\n",
+ cnt, ruleTable->rules[cnt].status);
+ }
}
- }
- if (retval != 0)
+ if (retval != 0)
+ {
+ IPACMERR("Failed adding Filtering rule %pK\n", ruleTable);
+ return false;
+ }
+ IPACMDBG("Added Filtering rule %pK\n", ruleTable);
+ }
+ else
{
- IPACMERR("Failed adding Filtering rule %pK\n", ruleTable);
- return false;
+ if (ruleTable)
+ IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
}
- IPACMDBG("Added Filtering rule %pK\n", ruleTable);
-#else
- if (ruleTable)
- IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
-#endif
return true;
}
@@ -501,9 +508,7 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r
{
int ret = 0, cnt, num_rules = 0, pos = 0;
ipa_install_fltr_rule_req_msg_v01 qmi_rule_msg;
-#ifdef FEATURE_IPA_V3
ipa_install_fltr_rule_req_ex_msg_v01 qmi_rule_ex_msg;
-#endif
memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg));
int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
@@ -525,175 +530,178 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r
}
/* if it is not IPA v3, use old QMI format */
-#ifndef FEATURE_IPA_V3
- if(num_rules > QMI_IPA_MAX_FILTERS_V01)
- {
- IPACMERR("The number of filtering rules exceed limit.\n");
- close(fd_wwan_ioctl);
- return false;
- }
- else
+ if (!IPACM_Iface::ipacmcfg->isIPAv3Supported())
{
- if (num_rules > 0)
+ if(num_rules > QMI_IPA_MAX_FILTERS_V01)
{
- qmi_rule_msg.filter_spec_list_valid = true;
+ IPACMERR("The number of filtering rules exceed limit.\n");
+ close(fd_wwan_ioctl);
+ return false;
}
else
{
- qmi_rule_msg.filter_spec_list_valid = false;
- }
+ if (num_rules > 0)
+ {
+ qmi_rule_msg.filter_spec_list_valid = true;
+ }
+ else
+ {
+ qmi_rule_msg.filter_spec_list_valid = false;
+ }
- qmi_rule_msg.filter_spec_list_len = num_rules;
- qmi_rule_msg.source_pipe_index_valid = 0;
+ qmi_rule_msg.filter_spec_list_len = num_rules;
+ qmi_rule_msg.source_pipe_index_valid = 0;
- IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
+ IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
- if(rule_table_v4 != NULL)
- {
- for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
+ if(rule_table_v4 != NULL)
{
- if (pos < QMI_IPA_MAX_FILTERS_V01)
- {
- qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
- qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
- qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
- qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
- qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
- qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
- qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
- memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
- &rule_table_v4->rules[cnt].rule.eq_attrib,
- sizeof(struct ipa_filter_rule_type_v01));
- pos++;
- }
- else
+ for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
{
- IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
+ if (pos < QMI_IPA_MAX_FILTERS_V01)
+ {
+ qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
+ qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
+ qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
+ qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
+ qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
+ qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
+ qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
+ memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
+ &rule_table_v4->rules[cnt].rule.eq_attrib,
+ sizeof(struct ipa_filter_rule_type_v01));
+ pos++;
+ }
+ else
+ {
+ IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
+ }
}
}
- }
- if(rule_table_v6 != NULL)
- {
- for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
+ if(rule_table_v6 != NULL)
{
- if (pos < QMI_IPA_MAX_FILTERS_V01)
+ for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
{
- qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
- qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
- qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
- qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
- qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
- qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
- qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
- memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
- &rule_table_v6->rules[cnt].rule.eq_attrib,
- sizeof(struct ipa_filter_rule_type_v01));
- pos++;
- }
- else
- {
- IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
+ if (pos < QMI_IPA_MAX_FILTERS_V01)
+ {
+ qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
+ qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
+ qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
+ qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
+ qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
+ qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
+ qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
+ memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
+ &rule_table_v6->rules[cnt].rule.eq_attrib,
+ sizeof(struct ipa_filter_rule_type_v01));
+ pos++;
+ }
+ else
+ {
+ IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
+ }
}
}
- }
- ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE, &qmi_rule_msg);
- if (ret != 0)
- {
- IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_msg, ret);
- close(fd_wwan_ioctl);
- return false;
+ ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE, &qmi_rule_msg);
+ if (ret != 0)
+ {
+ IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_msg, ret);
+ close(fd_wwan_ioctl);
+ return false;
+ }
}
- }
/* if it is IPA v3, use new QMI format */
-#else
- if(num_rules > QMI_IPA_MAX_FILTERS_EX_V01)
- {
- IPACMERR("The number of filtering rules exceed limit.\n");
- close(fd_wwan_ioctl);
- return false;
}
else
{
- memset(&qmi_rule_ex_msg, 0, sizeof(qmi_rule_ex_msg));
-
- if (num_rules > 0)
+ if(num_rules > QMI_IPA_MAX_FILTERS_EX_V01)
{
- qmi_rule_ex_msg.filter_spec_ex_list_valid = true;
+ IPACMERR("The number of filtering rules exceed limit.\n");
+ close(fd_wwan_ioctl);
+ return false;
}
else
{
- qmi_rule_ex_msg.filter_spec_ex_list_valid = false;
- }
- qmi_rule_ex_msg.filter_spec_ex_list_len = num_rules;
- qmi_rule_ex_msg.source_pipe_index_valid = 0;
+ memset(&qmi_rule_ex_msg, 0, sizeof(qmi_rule_ex_msg));
- IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
-
- if(rule_table_v4 != NULL)
- {
- for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
+ if (num_rules > 0)
{
- if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
- {
- qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v4->rules[cnt].rule.rule_id;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v4->rules[cnt].rule.hashable;
- memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
- &rule_table_v4->rules[cnt].rule.eq_attrib,
- sizeof(struct ipa_filter_rule_type_v01));
+ qmi_rule_ex_msg.filter_spec_ex_list_valid = true;
+ }
+ else
+ {
+ qmi_rule_ex_msg.filter_spec_ex_list_valid = false;
+ }
+ qmi_rule_ex_msg.filter_spec_ex_list_len = num_rules;
+ qmi_rule_ex_msg.source_pipe_index_valid = 0;
- pos++;
- }
- else
+ IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
+
+ if(rule_table_v4 != NULL)
+ {
+ for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
{
- IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
+ if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
+ {
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v4->rules[cnt].rule.rule_id;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v4->rules[cnt].rule.hashable;
+ memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
+ &rule_table_v4->rules[cnt].rule.eq_attrib,
+ sizeof(struct ipa_filter_rule_type_v01));
+
+ pos++;
+ }
+ else
+ {
+ IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
+ }
}
}
- }
- if(rule_table_v6 != NULL)
- {
- for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
+ if(rule_table_v6 != NULL)
{
- if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
+ for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
{
- qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v6->rules[cnt].rule.rule_id;
- qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v6->rules[cnt].rule.hashable;
- memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
- &rule_table_v6->rules[cnt].rule.eq_attrib,
- sizeof(struct ipa_filter_rule_type_v01));
-
- pos++;
- }
- else
- {
- IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
+ if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
+ {
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v6->rules[cnt].rule.rule_id;
+ qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v6->rules[cnt].rule.hashable;
+ memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
+ &rule_table_v6->rules[cnt].rule.eq_attrib,
+ sizeof(struct ipa_filter_rule_type_v01));
+
+ pos++;
+ }
+ else
+ {
+ IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
+ }
}
}
- }
- ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_EX, &qmi_rule_ex_msg);
- if (ret != 0)
- {
- IPACMERR("Failed adding Filtering rule %pK with ret %d\n ", &qmi_rule_ex_msg, ret);
- close(fd_wwan_ioctl);
- return false;
+ ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_EX, &qmi_rule_ex_msg);
+ if (ret != 0)
+ {
+ IPACMERR("Failed adding Filtering rule %pK with ret %d\n ", &qmi_rule_ex_msg, ret);
+ close(fd_wwan_ioctl);
+ return false;
+ }
}
}
-#endif
close(fd_wwan_ioctl);
return true;