diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-08-22 07:39:48 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2019-08-22 07:39:48 -0700 |
commit | 04428a8c35f757b3e04d6ca321af3e388b86e77a (patch) | |
tree | 2d82f2c57213e7397f815cc31c78258eccaa1da7 | |
parent | cb5f317d20934fdf8446ae732e21eb3904a00786 (diff) | |
parent | 7bb1ebc2928d869ab3fce3af6b92830a412dc793 (diff) | |
download | android_vendor_qcom_opensource_data-ipa-cfg-mgr-04428a8c35f757b3e04d6ca321af3e388b86e77a.tar.gz android_vendor_qcom_opensource_data-ipa-cfg-mgr-04428a8c35f757b3e04d6ca321af3e388b86e77a.tar.bz2 android_vendor_qcom_opensource_data-ipa-cfg-mgr-04428a8c35f757b3e04d6ca321af3e388b86e77a.zip |
Merge 7bb1ebc2928d869ab3fce3af6b92830a412dc793 on remote branch
Change-Id: I5e8f98d69911631fa5de4333c99c207c55ab7a66
-rw-r--r-- | ipacm/inc/IPACM_Defs.h | 4 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Filtering.h | 2 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Lan.h | 4 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Wan.h | 53 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Wlan.h | 2 | ||||
-rw-r--r-- | ipacm/src/Android.mk | 6 | ||||
-rw-r--r-- | ipacm/src/IPACM_Conntrack_NATApp.cpp | 2 | ||||
-rw-r--r-- | ipacm/src/IPACM_Filtering.cpp | 13 | ||||
-rw-r--r-- | ipacm/src/IPACM_IfaceManager.cpp | 1 | ||||
-rw-r--r-- | ipacm/src/IPACM_Lan.cpp | 6 | ||||
-rw-r--r-- | ipacm/src/IPACM_Main.cpp | 40 | ||||
-rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 38 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wan.cpp | 892 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 3 |
14 files changed, 1015 insertions, 51 deletions
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h index 6157d1f..65d5ce4 100644 --- a/ipacm/inc/IPACM_Defs.h +++ b/ipacm/inc/IPACM_Defs.h @@ -122,6 +122,7 @@ extern "C" #define IPA_MAX_NUM_ETH_CLIENTS 15 #define IPA_MAX_NUM_AMPDU_RULE 15 #define IPA_MAC_ADDR_SIZE 6 +#define IPA_MAX_NUM_SW_PDNS 15 /*=========================================================================== GLOBAL DEFINITIONS AND DECLARATIONS @@ -186,7 +187,8 @@ typedef enum IPA_ETH_BRIDGE_CLIENT_ADD, /* ipacm_event_eth_bridge */ IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/ IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/ - IPA_SSR_NOTICE, /* NULL*/ + IPA_SSR_NOTICE, /* NULL*/ + IPA_COALESCE_NOTICE, /* NULL*/ #ifdef FEATURE_L2TP IPA_ADD_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ IPA_DEL_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ diff --git a/ipacm/inc/IPACM_Filtering.h b/ipacm/inc/IPACM_Filtering.h index d216a00..5ceab75 100644 --- a/ipacm/inc/IPACM_Filtering.h +++ b/ipacm/inc/IPACM_Filtering.h @@ -65,7 +65,7 @@ public: uint8_t num_rules); bool AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *rule_table_v4, struct ipa_ioc_add_flt_rule const * rule_table_v6, uint8_t mux_id); - bool AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_rule_tbl, uint8_t mux_id); + bool AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_rule_tbl, uint8_t mux_id, uint8_t default_path); bool DelOffloadFilteringRule(struct ipa_ioc_del_flt_rule const *flt_rule_tbl); bool SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table); bool ModifyFilteringRule(struct ipa_ioc_mdfy_flt_rule* ruleTable); diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h index 83b2211..bf815c5 100644 --- a/ipacm/inc/IPACM_Lan.h +++ b/ipacm/inc/IPACM_Lan.h @@ -396,8 +396,8 @@ private: { for(num_v6 =0;num_v6 < get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++) { - /* send client-v6 delete to pcie modem only with global ipv6 with tx_index = 0 one time*/ - if(is_global_ipv6_addr(get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6]) && (IPACM_Wan::backhaul_mode == Q6_MHI_WAN) && (tx_index == 0) + /* send client-v6 delete to pcie modem only with global ipv6 with tx_index = 1 one time*/ + if(is_global_ipv6_addr(get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6]) && (IPACM_Wan::backhaul_mode == Q6_MHI_WAN) && (get_client_memptr(eth_client, clt_indx)->v6_rt_rule_id[num_v6] > 0)) { IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for rule-id:%d\n", clt_indx,num_v6, diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h index b9456c1..9acf175 100644 --- a/ipacm/inc/IPACM_Wan.h +++ b/ipacm/inc/IPACM_Wan.h @@ -89,6 +89,12 @@ typedef struct _ipa_wan_client wan_client_rt_hdl wan_rt_hdl[0]; /* depends on number of tx properties */ }ipa_wan_client; +typedef struct +{ + bool coalesce_tcp_enable; + bool coalesce_udp_enable; +}ipacm_coalesce; + /* wan iface */ class IPACM_Wan : public IPACM_Iface { @@ -215,6 +221,32 @@ public: return IPACM_SUCCESS; } #endif + static void coalesce_config(uint8_t qmap_id, bool tcp_enable, bool udp_enable) + { + if (qmap_id >= IPA_MAX_NUM_SW_PDNS) + { + IPACMERR("qmap_id (%d) beyond the Max range (%d), abort\n", + qmap_id, IPA_MAX_NUM_SW_PDNS); + return ; + } + + IPACM_Wan::coalesce_enable_info[qmap_id].coalesce_tcp_enable = tcp_enable; + IPACM_Wan::coalesce_enable_info[qmap_id].coalesce_udp_enable = udp_enable; + IPACMDBG_H(" Updated qmap(%d) coalesce enable TCP:%d UDP:%d\n", + qmap_id, + IPACM_Wan::coalesce_enable_info[qmap_id].coalesce_tcp_enable, + IPACM_Wan::coalesce_enable_info[qmap_id].coalesce_udp_enable); + return ; + } + + static void coalesce_config_reset() + { + int i; + /* reset coalesce settings on all modem interfaces */ + for (i = 0; i < IPA_MAX_NUM_SW_PDNS; i++) + IPACM_Wan::coalesce_config(i, false, false); + return ; + } static uint32_t getWANIP() { @@ -268,6 +300,9 @@ public: } #endif + /* indicate coalesce support on tcp or udp*/ + static ipacm_coalesce coalesce_enable_info[IPA_MAX_NUM_SW_PDNS]; + private: bool is_ipv6_frag_firewall_flt_rule_installed; @@ -298,6 +333,8 @@ private: bool header_partial_default_wan_v6; uint8_t ext_router_mac_addr[IPA_MAC_ADDR_SIZE]; uint8_t netdev_mac[IPA_MAC_ADDR_SIZE]; + /* create additional set of v4 Coalesce RT-rules: tcp udp */ + uint32_t dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES+ 2*MAX_DEFAULT_v6_ROUTE_RULES]; static int num_ipv4_modem_pdn; @@ -327,6 +364,12 @@ private: uint32_t hdr_hdl_dummy_v6; uint32_t hdr_proc_hdl_dummy_v6; + /* handle for UDP mhi frag rule */ + uint32_t mhi_dl_v4_frag_hdl; + + /* handle for icmpv6 exception rule */ + uint32_t icmpv6_exception_hdl; + inline ipa_wan_client* get_client_memptr(ipa_wan_client *param, int cnt) { char *ret = ((char *)param) + (wan_client_len * cnt); @@ -583,6 +626,16 @@ private: /* construct dummy ethernet header */ int add_dummy_rx_hdr(); + + int handle_coalesce_evt(); + + int add_offload_frag_rule(); + + int delete_offload_frag_rule(); + + int add_icmpv6_exception_rule(); + + int delete_icmpv6_exception_rule(); }; #endif /* IPACM_WAN_H */ diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h index f7508db..9c828ee 100644 --- a/ipacm/inc/IPACM_Wlan.h +++ b/ipacm/inc/IPACM_Wlan.h @@ -189,7 +189,7 @@ private: for(num_v6 =0;num_v6 < get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++) { /* send client-v6 delete to pcie modem only with global ipv6 with tx_index = 0 one time*/ - if(is_global_ipv6_addr(get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6]) && (IPACM_Wan::backhaul_mode == Q6_MHI_WAN) && (tx_index == 0) + if(is_global_ipv6_addr(get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6]) && (IPACM_Wan::backhaul_mode == Q6_MHI_WAN) && (get_client_memptr(wlan_client, clt_indx)->v6_rt_rule_id[num_v6] > 0)) { IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for rule-id:%d\n", clt_indx,num_v6, diff --git a/ipacm/src/Android.mk b/ipacm/src/Android.mk index 9cbe1e2..41e93f3 100644 --- a/ipacm/src/Android.mk +++ b/ipacm/src/Android.mk @@ -12,6 +12,9 @@ BOARD_IPAv3_LIST += $(MSMSTEPPE) BOARD_IPAv3_LIST += $(TRINKET) BOARD_IPAv3_LIST += lito BOARD_IPAv3_LIST += atoll +BOARD_IPAv3_LIST += bengal +BOARD_ETH_BRIDGE_LIST := msmnile +BOARD_ETH_BRIDGE_LIST += kona ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true) ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM))) @@ -30,7 +33,10 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr LOCAL_CFLAGS := -v LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID LOCAL_CFLAGS += -DFEATURE_IPACM_RESTART + +ifeq ($(call is-board-platform-in-list,$(BOARD_ETH_BRIDGE_LIST)),true) LOCAL_CFLAGS += -DFEATURE_ETH_BRIDGE_LE +endif LOCAL_CFLAGS += -DFEATURE_IPACM_HAL -Wall -Werror -Wno-error=macro-redefined ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp index 9828036..c1f47e1 100644 --- a/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -579,7 +579,7 @@ int NatApp::AddConnection(const nat_table_entry *rule) sizeof(flt_rule_entry.rule.eq_attrib)); memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if(false == IPACM_Iface::m_filtering.AddOffloadFilteringRule(pFilteringTable, pub_mux_id)) + if(false == IPACM_Iface::m_filtering.AddOffloadFilteringRule(pFilteringTable, pub_mux_id, 0)) { IPACMERR("Failed to install WAN DL filtering table.\n"); res = IPACM_FAILURE; diff --git a/ipacm/src/IPACM_Filtering.cpp b/ipacm/src/IPACM_Filtering.cpp index a65b769..a5c2bf5 100644 --- a/ipacm/src/IPACM_Filtering.cpp +++ b/ipacm/src/IPACM_Filtering.cpp @@ -463,7 +463,7 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r return true; } -bool IPACM_Filtering::AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_rule_tbl, uint8_t mux_id) +bool IPACM_Filtering::AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_rule_tbl, uint8_t mux_id, uint8_t default_path) { #ifdef WAN_IOCTL_ADD_OFFLOAD_CONNECTION int ret = 0, cnt, pos = 0; @@ -525,7 +525,14 @@ bool IPACM_Filtering::AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_r } qmi_add_msg.filter_spec_ex2_list_len = flt_rule_tbl->num_rules; - IPACMDBG_H("passing %d offload req to modem.\n", flt_rule_tbl->num_rules); + /* check if we want to take default MHI path */ + if (default_path) + { + qmi_add_msg.default_mhi_path_valid = true; + qmi_add_msg.default_mhi_path = true; + } + + IPACMDBG_H("passing %d offload req to modem. default %d\n", flt_rule_tbl->num_rules, qmi_add_msg.default_mhi_path); if(flt_rule_tbl != NULL) { @@ -581,7 +588,7 @@ bool IPACM_Filtering::AddOffloadFilteringRule(struct ipa_ioc_add_flt_rule *flt_r #else if(flt_rule_tbl != NULL) { - IPACMERR("Not support (%d) AddOffloadFilteringRule with mux-id (%d)\n", flt_rule_tbl->num_rules, mux_id); + IPACMERR("Not support (%d) AddOffloadFilteringRule with mux-id (%d) and default path = %d\n", flt_rule_tbl->num_rules, mux_id, default_path); } return false; #endif diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp index 1c7dfc4..3e825dd 100644 --- a/ipacm/src/IPACM_IfaceManager.cpp +++ b/ipacm/src/IPACM_IfaceManager.cpp @@ -484,6 +484,7 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) } else { + IPACM_EvtDispatcher::registr(IPA_COALESCE_NOTICE, w); IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, w); } diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp index 356cac8..9dfac2e 100644 --- a/ipacm/src/IPACM_Lan.cpp +++ b/ipacm/src/IPACM_Lan.cpp @@ -2425,7 +2425,7 @@ int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num], iptype); - /* send client-v6 info to pcie modem only with global ipv6 with tx_index = 0 one time*/ + /* send client-v6 info to pcie modem only with global ipv6 with tx_index = 1 one time*/ if(is_global_ipv6_addr(get_client_memptr(eth_client, eth_index)->v6_addr[v6_num]) && (IPACM_Wan::backhaul_mode == Q6_MHI_WAN)) { if (add_connection(eth_index, v6_num)) @@ -6124,7 +6124,7 @@ int IPACM_Lan::add_connection(int client_index, int v6_num) sizeof(flt_rule_entry.rule.eq_attrib)); memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id)) + if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id, 0)) { IPACMERR("Failed to install WAN DL filtering table.\n"); res = IPACM_FAILURE; @@ -6132,7 +6132,7 @@ int IPACM_Lan::add_connection(int client_index, int v6_num) } get_client_memptr(eth_client, client_index)->v6_rt_rule_id[v6_num] = pFilteringTable->rules[0].flt_rule_hdl; - + IPACMDBG_H("%d-st client v6_num %d: id handle 0x%x\n", client_index, v6_num, get_client_memptr(eth_client, client_index)->v6_rt_rule_id[v6_num]); fail: close(fd); if(pFilteringTable != NULL) diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp index 04f8a89..eef15d9 100644 --- a/ipacm/src/IPACM_Main.cpp +++ b/ipacm/src/IPACM_Main.cpp @@ -240,6 +240,10 @@ void* ipa_driver_msg_notifier(void *param) #endif struct ipa_get_data_stats_resp_msg_v01 event_data_stats; struct ipa_get_apn_data_stats_resp_msg_v01 event_network_stats; +#ifdef IPA_RT_SUPPORT_COAL + struct ipa_coalesce_info coalesce_info; +#endif + #ifdef FEATURE_IPACM_HAL IPACM_OffloadManager* OffloadMng; #endif @@ -821,6 +825,40 @@ void* ipa_driver_msg_notifier(void *param) evt_data.evt_data = mapping; break; #endif +#ifdef IPA_RT_SUPPORT_COAL + case IPA_COALESCE_ENABLE: + memcpy(&coalesce_info, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_coalesce_info)); + IPACMDBG_H("Received IPA_COALESCE_ENABLE qmap-id:%d tcp:%d, udp%d\n", + coalesce_info.qmap_id, coalesce_info.tcp_enable, coalesce_info.udp_enable); + if (coalesce_info.qmap_id >=IPA_MAX_NUM_SW_PDNS) + { + IPACMERR("qmap_id (%d) beyond the Max range (%d), abort\n", + coalesce_info.qmap_id, IPA_MAX_NUM_SW_PDNS); + return NULL; + } + IPACM_Wan::coalesce_config(coalesce_info.qmap_id, coalesce_info.tcp_enable, coalesce_info.udp_enable); + /* Notify all LTE instance to do RSC configuration */ + evt_data.event = IPA_COALESCE_NOTICE; + evt_data.evt_data = NULL; + break; + + case IPA_COALESCE_DISABLE: + memcpy(&coalesce_info, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_coalesce_info)); + IPACMDBG_H("Received IPA_COALESCE_DISABLE qmap-id:%d tcp:%d, udp%d\n", + coalesce_info.qmap_id, coalesce_info.tcp_enable, coalesce_info.udp_enable); + if (coalesce_info.qmap_id >=IPA_MAX_NUM_SW_PDNS) + { + IPACMERR("qmap_id (%d) beyond the Max range (%d), abort\n", + coalesce_info.qmap_id, IPA_MAX_NUM_SW_PDNS); + return NULL; + } + IPACM_Wan::coalesce_config(coalesce_info.qmap_id, false, false); + /* Notify all LTE instance to do RSC configuration */ + evt_data.event = IPA_COALESCE_NOTICE; + evt_data.evt_data = NULL; + break; +#endif + default: IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type); continue; @@ -912,6 +950,8 @@ int main(int argc, char **argv) IPACMDBG_H("Staring IPA main\n"); IPACMDBG_H("ipa_cmdq_successful\n"); + /* reset coalesce settings */ + IPACM_Wan::coalesce_config_reset(); RegisterForSignals(); diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index 0e6a53e..7919413 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -603,7 +603,7 @@ RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, ui return FAIL_INPUT_CHECK; } - IPACMDBG_H("SET_DATA_QUOTA %s %llu", quota.interface_name, (long long)mb); + IPACMDBG_H("SET_DATA_QUOTA %s %llu\n", quota.interface_name, (long long)mb); rc = ioctl(fd, WAN_IOC_SET_DATA_QUOTA, "a); @@ -778,12 +778,14 @@ IPACM_OffloadManager* IPACM_OffloadManager::GetInstance() bool IPACM_OffloadManager::search_framwork_cache(char * interface_name) { bool rel = false; + bool cache_need = false; /* IPACM needs to kee old FDs, can't clear */ IPACMDBG_H("check netdev(%s)\n", interface_name); for(int i = 0; i < MAX_EVENT_CACHE ;i++) { + cache_need = false; if(event_cache[i].valid == true) { //do the compare @@ -793,14 +795,40 @@ bool IPACM_OffloadManager::search_framwork_cache(char * interface_name) { IPACMDBG_H("found netdev (%s) in entry (%d) with event (%d)\n", interface_name, i, event_cache[i].event); /* post event again */ - if (event_cache[i].event == IPA_DOWNSTREAM_ADD) + if (event_cache[i].event == IPA_DOWNSTREAM_ADD) { + /* check if downsteam netdev driver finished its configuration on IPA-HW for ipv4 and ipv6 */ + if (event_cache[i].prefix_cache.fam == V4 && IPACM_Iface::ipacmcfg->CheckNatIfaces(event_cache[i].dev_name, IPA_IP_v4)) + cache_need = true; + if (event_cache[i].prefix_cache.fam == V6 && IPACM_Iface::ipacmcfg->CheckNatIfaces(event_cache[i].dev_name, IPA_IP_v6)) + cache_need = true; + if (cache_need) { + IPACMDBG_H("still need cache (%d), index (%d) ip-family (%d)\n", cache_need, i, event_cache[i].prefix_cache.fam); + break; + } else { + IPACMDBG_H("no need cache (%d), handling it event (%d)\n", cache_need, event_cache[i].event); addDownstream(interface_name, event_cache[i].prefix_cache); - else if (event_cache[i].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) + } + } else if (event_cache[i].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) { + /* check if upstream netdev driver finished its configuration on IPA-HW for ipv4 and ipv6 */ + if (event_cache[i].prefix_cache.fam == V4 && IPACM_Iface::ipacmcfg->CheckNatIfaces(event_cache[i].dev_name, IPA_IP_v4)) + cache_need = true; + if (event_cache[i].prefix_cache_v6.fam == V6 && IPACM_Iface::ipacmcfg->CheckNatIfaces(event_cache[i].dev_name, IPA_IP_v6)) + cache_need = true; + if (cache_need) { + IPACMDBG_H("still need cache (%d), index (%d)\n", cache_need, i); + break; + } else { + IPACMDBG_H("no need cache (%d), handling it event (%d)\n", cache_need, event_cache[i].event); setUpstream(interface_name, event_cache[i].prefix_cache, event_cache[i].prefix_cache_v6); - else - IPACMERR("wrong event cached (%d)", event_cache[i].event); + } + } else { + IPACMERR("wrong event cached (%d) index (%d)\n", event_cache[i].event, i); + } + + /* reset entry */ event_cache[i].valid = false; rel = true; + IPACMDBG_H("reset entry (%d)", i); } } } diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp index 3447207..498f3b6 100644 --- a/ipacm/src/IPACM_Wan.cpp +++ b/ipacm/src/IPACM_Wan.cpp @@ -79,6 +79,8 @@ bool IPACM_Wan::embms_is_on = false; bool IPACM_Wan::backhaul_is_wan_bridge = false; bool IPACM_Wan::is_xlat = false; +ipacm_coalesce IPACM_Wan::coalesce_enable_info[IPA_MAX_NUM_SW_PDNS]; + uint32_t IPACM_Wan::backhaul_ipv6_prefix[2]; #ifdef FEATURE_IPA_ANDROID @@ -270,29 +272,11 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) rt_rule->commit = 1; rt_rule->num_rules = NUM_RULES; rt_rule->ip = data->iptype; + /* setup RT rule for v6_lan table*/ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name)); rt_rule_entry = &rt_rule->rules[0]; - if(m_is_sta_mode == Q6_WAN) - { - strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); - hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(m_header.GetHeaderHandle(&hdr) == false) - { - IPACMERR("Failed to get QMAP header.\n"); - return IPACM_FAILURE; - } - rt_rule_entry->rule.hdr_hdl = hdr.hdl; - } rt_rule_entry->at_rear = false; - if(m_is_sta_mode == Q6_WAN) - { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; - } - else - { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; - } rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0]; rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1]; @@ -309,6 +293,90 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) #ifdef FEATURE_IPA_V3 rt_rule_entry->rule.hashable = false; #endif + if(m_is_sta_mode == Q6_WAN) + { + strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); + hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; + if(m_header.GetHeaderHandle(&hdr) == false) + { + IPACMERR("Failed to get QMAP header.\n"); + return IPACM_FAILURE; + } + rt_rule_entry->rule.hdr_hdl = hdr.hdl; + rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; + /* legacy default v4 rt-rule */ +#ifdef IPA_RT_SUPPORT_COAL + rt_rule_entry->rule.coalesce = false; +#endif + /* legacy default v6 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl; + + /* setup same rule for v6_wan table*/ + strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl; + + IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, entry: %d %d\n", + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6], + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1], + MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6, + MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1); + /* RSC TCP rule*/ + rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; + rt_rule_entry->rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsc tcp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv6 wan iface rsc tcp rt-rule hdll=0x%x\n enable(%d), entry %d", dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable, + 2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6); + /* RSB UDP rule*/ + rt_rule_entry->rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_UDP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif if (false == m_routing.AddRoutingRule(rt_rule)) { IPACMERR("Routing rule addition failed!\n"); @@ -317,6 +385,27 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) } else if (rt_rule_entry->status) { + IPACMERR("rsb udp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv6 wan iface rsb udp rt-rule hdll=0x%x\n enable(%d) entry %d", dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable, + 2*MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1); + } + else + { + rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; + /* legacy default v6 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); res = rt_rule_entry->status; goto fail; @@ -339,9 +428,12 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) } dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n", + IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, entry: %d %d\n", dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6], - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6); + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1], + MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6, + MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1); + } /* add default filtering rules when wan-iface get global v6-prefix */ if (num_dft_rt_v6 == 1) @@ -444,6 +536,21 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) else { IPACMDBG_H(" device (%s) ipv4 addr is changed\n", dev_name); + /* Delete default Coalese v4 RT rule */ + if (m_is_sta_mode == Q6_WAN) { + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[0], IPA_IP_v4) == false) + { + IPACMERR("Routing old RSC TCP RT rule deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[1], IPA_IP_v4) == false) + { + IPACMERR("Routing old RSB UDP RT rule deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + } /* Delete default v4 RT rule */ IPACMDBG_H("Delete default v4 routing rules\n"); if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) @@ -469,30 +576,80 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) rt_rule->num_rules = NUM_RULES; rt_rule->ip = data->iptype; rt_rule_entry = &rt_rule->rules[0]; + rt_rule_entry->at_rear = false; + rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; + /* still need setup v4 default routing rule to A5*/ + strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name)); + rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr; + rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; +#ifdef FEATURE_IPA_V3 + rt_rule_entry->rule.hashable = false; +#endif if(m_is_sta_mode == Q6_WAN) { + /* query qmap header*/ strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if(m_header.GetHeaderHandle(&hdr) == false) { IPACMERR("Failed to get QMAP header.\n"); - return IPACM_FAILURE; + res = IPACM_FAILURE; + goto fail; } rt_rule_entry->rule.hdr_hdl = hdr.hdl; rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; + /* legacy default v4 rt-rule */ +#ifdef IPA_RT_SUPPORT_COAL + rt_rule_entry->rule.coalesce = false; +#endif + /* legacy default v4 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; } + dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]); + /* RSC TCP rule*/ + rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; + rt_rule_entry->rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; + +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable) + rt_rule_entry->rule.coalesce = true; else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsc tcp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; } - rt_rule_entry->at_rear = false; - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - /* still need setup v4 default routing rule to A5*/ - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; + dft_coalesce_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rsc tcp rt-rule hdll=0x%x\n enable(%d)", dft_coalesce_rt_rule_hdl[0], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable); + + /* RSB UDP rule*/ + rt_rule_entry->rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_UDP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; #endif if (false == m_routing.AddRoutingRule(rt_rule)) { @@ -502,14 +659,35 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) } else if (rt_rule_entry->status) { + IPACMERR("rsb udp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_coalesce_rt_rule_hdl[1] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rsb udp rt-rule hdll=0x%x\n enable(%d)", dft_coalesce_rt_rule_hdl[1], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable); + } + else + { + rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; + /* legacy default v4 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); res = rt_rule_entry->status; goto fail; } dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; IPACMDBG_H("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]); - /* initial multicast/broadcast/fragment filter rule */ + } + /* initial multicast/broadcast/fragment filter rule */ /* only do one time */ if(!wan_v4_addr_set) { @@ -913,6 +1091,15 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) } break; + case IPA_COALESCE_NOTICE: + { + if (m_is_sta_mode == Q6_WAN) + { + IPACMDBG_H("Received IPA_COALESCE_NOTICE (wan_mode:%d)\n", m_is_sta_mode); + handle_coalesce_evt(); + } + } + break; case IPA_LINK_DOWN_EVENT: { ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; @@ -1158,6 +1345,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) else if(m_is_sta_mode == Q6_MHI_WAN) { /* only need cleanup rt-rule*/ + del_dft_firewall_rules(IPA_IP_v4); handle_route_del_evt(IPA_IP_v4); } else @@ -1192,6 +1380,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) else if(m_is_sta_mode == Q6_MHI_WAN) { /* only need cleanup rt-rule*/ + del_dft_firewall_rules(IPA_IP_v6); handle_route_del_evt(IPA_IP_v6); } @@ -1633,11 +1822,24 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) IPACMDBG_H("Setting up QMAP ID %d.\n", ext_prop->ext[0].mux_id); IPACM_Iface::ipacmcfg->SetQmapId(ext_prop->ext[0].mux_id); /* sending mux-id info to PCIE-modem for UL */ - if(false == m_filtering.AddOffloadFilteringRule(NULL, ext_prop->ext[0].mux_id)) + if(false == m_filtering.AddOffloadFilteringRule(NULL, ext_prop->ext[0].mux_id, 0)) { IPACMERR("Failed to send mux id info to modem.\n"); return IPACM_FAILURE; } + /* send UL UDP frag filtering rule */ + if(iptype==IPA_IP_v4 && add_offload_frag_rule()) + { + IPACMERR("Failed to send DL frag rule to modem.\n"); + return IPACM_FAILURE; + } + + /* send ipv6 ICMP filtering rule */ + if(iptype==IPA_IP_v6 && add_icmpv6_exception_rule()) + { + IPACMERR("Failed to send ICMPv6 ex rule to modem.\n"); + return IPACM_FAILURE; + } } else { @@ -4483,6 +4685,19 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype) { memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); } + + /* Delete MHI frag rule */ + if(delete_offload_frag_rule()) + { + IPACMERR("Failed to delete DL frag rule \n"); + return IPACM_FAILURE; + } + /* Delete MHI icmpv6 exception rule */ + if(delete_icmpv6_exception_rule()) + { + IPACMERR("Failed to delete icmpv6 rule \n"); + return IPACM_FAILURE; + } } else { @@ -4888,6 +5103,7 @@ int IPACM_Wan::handle_down_evt() /* Delete default v4 RT rule */ if (ip_type != IPA_IP_v6) { + /* no need delete v4 RSC routing rules */ IPACMDBG_H("Delete default v4 routing rules\n"); if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) { @@ -5149,6 +5365,21 @@ int IPACM_Wan::handle_down_evt_ex() install_wan_filtering_rule(false); } + IPACMDBG_H("Delete default v4 coalesce routing rules\n"); + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[0], IPA_IP_v4) == false) + { + IPACMERR("Routing rule RSC TCP deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[1], IPA_IP_v4) == false) + { + IPACMERR("Routing rule RSB UDP deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) { IPACMERR("Routing rule deletion failed!\n"); @@ -5207,6 +5438,13 @@ int IPACM_Wan::handle_down_evt_ex() for (i = 0; i < 2*num_dft_rt_v6; i++) { + /* delete v6 colasce rules */ + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) + { + IPACMERR("Colasce Routing rule deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) { IPACMERR("Routing rule deletion failed!\n"); @@ -5291,6 +5529,21 @@ int IPACM_Wan::handle_down_evt_ex() install_wan_filtering_rule(false); } + IPACMDBG_H("Delete default v4 coalesce routing rules\n"); + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[0], IPA_IP_v4) == false) + { + IPACMERR("Routing rule RSC TCP deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[1], IPA_IP_v4) == false) + { + IPACMERR("Routing rule RSB UDP deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) { IPACMERR("Routing rule deletion failed!\n"); @@ -5300,6 +5553,13 @@ int IPACM_Wan::handle_down_evt_ex() for (i = 0; i < 2*num_dft_rt_v6; i++) { + /* delete v6 colasce rules */ + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) + { + IPACMERR("Colasce Routing rule deletion failed!\n"); + res = IPACM_FAILURE; + goto fail; + } if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) { IPACMERR("Routing rule deletion failed!\n"); @@ -6683,3 +6943,569 @@ int IPACM_Wan::add_dummy_rx_hdr() } return IPACM_SUCCESS; } + +int IPACM_Wan::handle_coalesce_evt() +{ + struct ipa_ioc_add_rt_rule *rt_rule = NULL; + struct ipa_rt_rule_add *rt_rule_entry; + const int NUM_RULES = 1; + int res = IPACM_SUCCESS; + struct ipa_ioc_get_hdr hdr; + uint32_t i; + + if(wan_v4_addr_set) + { + /* Delete default RSC v4 RT rule */ + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[0], IPA_IP_v4) == false) + { + IPACMERR("Routing old RSC TCP RT rule deletion failed!\n"); + return IPACM_FAILURE; + } + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[1], IPA_IP_v4) == false) + { + IPACMERR("Routing old RSB UDP RT rule deletion failed!\n"); + return IPACM_FAILURE; + } + /* Delete default v4 RT rule */ + IPACMDBG_H("Delete default v4 routing rules\n"); + if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) + { + IPACMERR("Routing old RT rule deletion failed!\n"); + return IPACM_FAILURE; + } + + /* apply the new coalesce configuration */ + rt_rule = (struct ipa_ioc_add_rt_rule *) + calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + + NUM_RULES * sizeof(struct ipa_rt_rule_add)); + if (!rt_rule) + { + IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); + return IPACM_FAILURE; + } + rt_rule->commit = 1; + rt_rule->num_rules = NUM_RULES; + rt_rule->ip = IPA_IP_v4; + rt_rule_entry = &rt_rule->rules[0]; + rt_rule_entry->at_rear = false; + rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; + /* still need setup v4 default routing rule to APPs*/ + strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name)); + rt_rule_entry->rule.attrib.u.v4.dst_addr = wan_v4_addr; + rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; +#ifdef FEATURE_IPA_V3 + rt_rule_entry->rule.hashable = false; +#endif + /* query qmap header*/ + memset(&hdr, 0, sizeof(hdr)); + strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); + hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; + if(m_header.GetHeaderHandle(&hdr) == false) + { + IPACMERR("Failed to get QMAP header.\n"); + res = IPACM_FAILURE; + goto fail; + } + rt_rule_entry->rule.hdr_hdl = hdr.hdl; + rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; + /* default v4 rt-rule */ +#ifdef IPA_RT_SUPPORT_COAL + rt_rule_entry->rule.coalesce = false; +#endif + /* default v4 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]); + + /* RSC TCP rule*/ + rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; + rt_rule_entry->rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsc tcp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_coalesce_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rsc tcp rt-rule hdll=0x%x\n enable(%d)", dft_coalesce_rt_rule_hdl[0], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable); + + /* RSB UDP rule*/ + rt_rule_entry->rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_UDP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsb udp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail; + } + dft_coalesce_rt_rule_hdl[1] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv4 wan iface rsb udp rt-rule hdll=0x%x enable(%d)\n", dft_coalesce_rt_rule_hdl[1], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable); +fail: + free(rt_rule); + } + /* v6 */ + if (num_dft_rt_v6 !=0) + { + for (i = 0; i < 2*num_dft_rt_v6; i++) + { + /* delete v6 colasce rules */ + if (m_routing.DeleteRoutingHdl(dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) + { + IPACMERR("Colasce Routing rule deletion failed!\n"); + return IPACM_FAILURE; + } + /* delete v6 default rules */ + if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) + { + IPACMERR("Routing rule deletion failed!\n"); + return IPACM_FAILURE; + } + } + + rt_rule = (struct ipa_ioc_add_rt_rule *) + calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + + NUM_RULES * sizeof(struct ipa_rt_rule_add)); + if (!rt_rule) + { + IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); + return IPACM_FAILURE; + } + rt_rule->commit = 1; + rt_rule->num_rules = NUM_RULES; + rt_rule->ip = IPA_IP_v6; + + for (i = 0; i < num_dft_rt_v6; i++) + { + /* setup same rule for v6_wan table */ + strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name)); + rt_rule_entry = &rt_rule->rules[0]; + rt_rule_entry->at_rear = false; + rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; + rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = ipv6_addr[num_dft_rt_v6][0]; + rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = ipv6_addr[num_dft_rt_v6][1]; + rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = ipv6_addr[num_dft_rt_v6][2]; + rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = ipv6_addr[num_dft_rt_v6][3]; + rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; + rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; + rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; + rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; +#ifdef FEATURE_IPA_V3 + rt_rule_entry->rule.hashable = false; +#endif + strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); + hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; + if(m_header.GetHeaderHandle(&hdr) == false) + { + IPACMERR("Failed to get QMAP header.\n"); + return IPACM_FAILURE; + } + rt_rule_entry->rule.hdr_hdl = hdr.hdl; + rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; + /* legacy default v4 rt-rule */ +#ifdef IPA_RT_SUPPORT_COAL + rt_rule_entry->rule.coalesce = false; +#endif + /* legacy default v6 rt-rule */ + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail2; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail2; + } + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*i] = rt_rule_entry->rt_rule_hdl; + + /* setup same rule for v6_lan table*/ + strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail2; + } + else if (rt_rule_entry->status) + { + IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail2; + } + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*i+1] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, entry: %d %d\n", + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*i], + dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*i+1], + MAX_DEFAULT_v4_ROUTE_RULES + 2*i, + MAX_DEFAULT_v4_ROUTE_RULES + 2*i+1); + /* RSC TCP rule*/ + rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; + rt_rule_entry->rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail2; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsc tcp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail2; + } + dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*i] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv6 wan iface rsc tcp rt-rule hdll=0x%x\n enable(%d)", dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*i], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_tcp_enable); + /* RSB UDP rule*/ + rt_rule_entry->rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_UDP; +#ifdef IPA_RT_SUPPORT_COAL + if (IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable) + rt_rule_entry->rule.coalesce = true; + else + rt_rule_entry->rule.coalesce = false; +#endif + if (false == m_routing.AddRoutingRule(rt_rule)) + { + IPACMERR("Routing rule addition failed!\n"); + res = IPACM_FAILURE; + goto fail2; + } + else if (rt_rule_entry->status) + { + IPACMERR("rsb udp rt rule adding failed. Result=%d\n", rt_rule_entry->status); + res = rt_rule_entry->status; + goto fail2; + } + dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*i+1] = rt_rule_entry->rt_rule_hdl; + IPACMDBG_H("ipv6 wan iface rsb udp rt-rule hdll=0x%x\n enable(%d)", dft_coalesce_rt_rule_hdl[2*MAX_DEFAULT_v4_ROUTE_RULES + 2*i+1], + IPACM_Wan::coalesce_enable_info[ext_prop->ext[0].mux_id].coalesce_udp_enable); + } +fail2: + free(rt_rule); + } + return res; +} + +int IPACM_Wan::add_offload_frag_rule() +{ + int fd; + int len, res = IPACM_SUCCESS; + uint8_t mux_id; + ipa_ioc_add_flt_rule *pFilteringTable = NULL; + + mux_id = ext_prop->ext[0].mux_id; + /* contruct filter rules to pcie modem */ + struct ipa_flt_rule_add flt_rule_entry; + ipa_ioc_generate_flt_eq flt_eq; + + /* construct rule */ + IPACMDBG_H("adding MHi frag rule\n"); + len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); + pFilteringTable = (struct ipa_ioc_add_flt_rule*)malloc(len); + if (pFilteringTable == NULL) + { + IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); + return IPACM_FAILURE; + } + memset(pFilteringTable, 0, len); + + pFilteringTable->commit = 1; + pFilteringTable->global = false; + pFilteringTable->ip = IPA_IP_v4; + pFilteringTable->num_rules = (uint8_t)1; + + /* Configuring Fragment Filtering Rule */ + memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); + flt_rule_entry.at_rear = false; + flt_rule_entry.flt_rule_hdl = -1; + flt_rule_entry.status = -1; + + flt_rule_entry.rule.retain_hdr = 1; + flt_rule_entry.rule.to_uc = 0; + flt_rule_entry.rule.eq_attrib_type = 1; + flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; +#ifdef FEATURE_IPA_V3 + flt_rule_entry.rule.hashable = true; +#endif + IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask); + memcpy(&flt_rule_entry.rule.attrib, + &rx_prop->rx[0].attrib, + sizeof(flt_rule_entry.rule.attrib)); + + flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; + + /* generate eq */ + memset(&flt_eq, 0, sizeof(flt_eq)); + memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); + flt_eq.ip = IPA_IP_v4; + + fd = open(IPA_DEVICE_NAME, O_RDWR); + if (fd < 0) + { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + free(pFilteringTable); + return IPACM_FAILURE; + } + + if(0 != ioctl(fd, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) //define and cpy attribute to this struct + { + IPACMERR("Failed to get eq_attrib\n"); + goto fail; + } + memcpy(&flt_rule_entry.rule.eq_attrib, + &flt_eq.eq_attrib, + sizeof(flt_rule_entry.rule.eq_attrib)); + memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + + /* add rule */ + if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id, 1)) + { + IPACMERR("Failed to install WAN DL filtering table.\n"); + res = IPACM_FAILURE; + goto fail; + } + + /* save handle */ + mhi_dl_v4_frag_hdl = pFilteringTable->rules[0].flt_rule_hdl; + +fail: + close(fd); + if(pFilteringTable != NULL) + { + free(pFilteringTable); + } + return res; +} + +int IPACM_Wan::delete_offload_frag_rule() +{ + int res = IPACM_SUCCESS; + int len; + ipa_ioc_del_flt_rule *pFilteringTable = NULL; + + struct ipa_flt_rule_del flt_rule_entry; + + IPACMDBG_H("deleting MHI frag rule \n"); + len = sizeof(struct ipa_ioc_del_flt_rule) + sizeof(struct ipa_flt_rule_del); + pFilteringTable = (struct ipa_ioc_del_flt_rule*)malloc(len); + if (pFilteringTable == NULL) + { + IPACMERR("Error Locate ipa_ioc_del_flt_rule memory...\n"); + return false; + } + memset(pFilteringTable, 0, len); + + pFilteringTable->commit = 1; + pFilteringTable->ip = IPA_IP_v4; + pFilteringTable->num_hdls = (uint8_t)1; + + if (mhi_dl_v4_frag_hdl == 0) + { + IPACMERR("invalid dl_v4_frag_hdl.\n"); + res = false; + goto fail; + } + + /* Configuring Software-Routing Filtering Rule */ + memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_del)); + flt_rule_entry.hdl = mhi_dl_v4_frag_hdl; + + memcpy(&(pFilteringTable->hdl[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_del)); + + if(false == m_filtering.DelOffloadFilteringRule(pFilteringTable)) + { + IPACMERR("Failed to delete DL offload frag rule.\n"); + res = false; + goto fail; + } + mhi_dl_v4_frag_hdl = 0; + +fail: + if(pFilteringTable != NULL) + { + free(pFilteringTable); + } + return res; +} + +int IPACM_Wan::add_icmpv6_exception_rule() +{ + int fd; + int len, res = IPACM_SUCCESS; + uint8_t mux_id; + ipa_ioc_add_flt_rule *pFilteringTable = NULL; + + mux_id = ext_prop->ext[0].mux_id; + /* contruct filter rules to pcie modem */ + struct ipa_flt_rule_add flt_rule_entry; + ipa_ioc_generate_flt_eq flt_eq; + + /* construct rule */ + IPACMDBG_H("adding MHI icmpv6 rule\n"); + len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); + pFilteringTable = (struct ipa_ioc_add_flt_rule*)malloc(len); + if (pFilteringTable == NULL) + { + IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); + return IPACM_FAILURE; + } + memset(pFilteringTable, 0, len); + + pFilteringTable->commit = 1; + pFilteringTable->global = false; + pFilteringTable->ip = IPA_IP_v6; + pFilteringTable->num_rules = (uint8_t)1; + + /* Configuring ICMPv6 Filtering Rule */ + memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); + flt_rule_entry.rule.retain_hdr = 1; + flt_rule_entry.rule.to_uc = 0; + flt_rule_entry.rule.eq_attrib_type = 0; + flt_rule_entry.at_rear = true; + flt_rule_entry.flt_rule_hdl = -1; + flt_rule_entry.status = -1; + flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; +#ifdef FEATURE_IPA_V3 + flt_rule_entry.rule.hashable = true; +#endif + IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask); + memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); + flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; + flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6; + + /* generate eq */ + memset(&flt_eq, 0, sizeof(flt_eq)); + memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); + flt_eq.ip = IPA_IP_v6; + + fd = open(IPA_DEVICE_NAME, O_RDWR); + if (fd < 0) + { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + free(pFilteringTable); + return IPACM_FAILURE; + } + + if(0 != ioctl(fd, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) //define and cpy attribute to this struct + { + IPACMERR("Failed to get eq_attrib\n"); + res = IPACM_FAILURE; + goto fail; + } + memcpy(&flt_rule_entry.rule.eq_attrib, + &flt_eq.eq_attrib, + sizeof(flt_rule_entry.rule.eq_attrib)); + memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + + /* add rule */ + if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id, 1)) + { + IPACMERR("Failed to install WAN DL filtering table.\n"); + res = IPACM_FAILURE; + goto fail; + } + + /* save handle */ + icmpv6_exception_hdl = pFilteringTable->rules[0].flt_rule_hdl; + +fail: + close(fd); + if(pFilteringTable != NULL) + { + free(pFilteringTable); + } + return res; +} + +int IPACM_Wan::delete_icmpv6_exception_rule() +{ + int len, res = IPACM_SUCCESS; + ipa_ioc_del_flt_rule *pFilteringTable = NULL; + + struct ipa_flt_rule_del flt_rule_entry; + + IPACMDBG_H("deleting MHI icmpv6 rule \n"); + len = sizeof(struct ipa_ioc_del_flt_rule) + sizeof(struct ipa_flt_rule_del); + pFilteringTable = (struct ipa_ioc_del_flt_rule*)malloc(len); + if (pFilteringTable == NULL) + { + IPACMERR("Error Locate ipa_ioc_del_flt_rule memory...\n"); + return IPACM_FAILURE; + } + memset(pFilteringTable, 0, len); + + pFilteringTable->commit = 1; + pFilteringTable->ip = IPA_IP_v6; + pFilteringTable->num_hdls = (uint8_t)1; + + if (icmpv6_exception_hdl == 0) + { + IPACMERR("invalid icmpv6_exception_hdl.\n"); + res = IPACM_FAILURE; + goto fail; + } + + memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_del)); + flt_rule_entry.hdl = icmpv6_exception_hdl; + + memcpy(&(pFilteringTable->hdl[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_del)); + + if(false == m_filtering.DelOffloadFilteringRule(pFilteringTable)) + { + IPACMERR("Failed to delete MHI icmpv6 rule.\n"); + res = IPACM_FAILURE; + goto fail; + } + icmpv6_exception_hdl = 0; + +fail: + if(pFilteringTable != NULL) + { + free(pFilteringTable); + } + return res; +} diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index af74be4..b7fb9ff 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -2518,7 +2518,7 @@ int IPACM_Wlan::add_connection(int client_index, int v6_num) sizeof(flt_rule_entry.rule.eq_attrib)); memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id)) + if(false == m_filtering.AddOffloadFilteringRule(pFilteringTable, mux_id, 0)) { IPACMERR("Failed to install WAN DL filtering table.\n"); res = IPACM_FAILURE; @@ -2526,6 +2526,7 @@ int IPACM_Wlan::add_connection(int client_index, int v6_num) } get_client_memptr(wlan_client, client_index)->v6_rt_rule_id[v6_num] = pFilteringTable->rules[0].flt_rule_hdl; + IPACMDBG_H("%d-st client v6_num %d: id handle 0x%x\n", client_index, v6_num, get_client_memptr(wlan_client, client_index)->v6_rt_rule_id[v6_num]); fail: close(fd); |