diff options
Diffstat (limited to 'data-ipa-cfg-mgr/ipacm/src')
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/Android.mk | 17 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp | 26 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp | 3 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp | 24 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp | 8 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp | 105 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp | 28 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp | 279 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp | 5 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp | 45 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp | 8 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp | 188 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp | 179 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp | 114 | ||||
-rw-r--r-- | data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp | 23 |
15 files changed, 858 insertions, 194 deletions
diff --git a/data-ipa-cfg-mgr/ipacm/src/Android.mk b/data-ipa-cfg-mgr/ipacm/src/Android.mk index e6d993d..728dc7e 100644 --- a/data-ipa-cfg-mgr/ipacm/src/Android.mk +++ b/data-ipa-cfg-mgr/ipacm/src/Android.mk @@ -1,4 +1,6 @@ BOARD_IPAv3_LIST := msm8998 +BOARD_IPAv3_LIST += sdm845 +BOARD_IPAv3_LIST += sdm710 LOCAL_PATH := $(call my-dir) @@ -6,22 +8,12 @@ include $(CLEAR_VARS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src LOCAL_C_INCLUDES += $(LOCAL_PATH)/../inc -LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc -LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../hal/inc -ifeq ($(call is-platform-sdk-version-at-least,20),true) -LOCAL_C_INCLUDES += external/icu/icu4c/source/common -else -LOCAL_C_INCLUDES += external/icu4c/common -endif -#LOCAL_C_INCLUDES += external/dhcpcd -LOCAL_C_INCLUDES += external/libxml2/include -LOCAL_C_INCLUDES += external/libnetfilter_conntrack/include -LOCAL_C_INCLUDES += external/libnfnetlink/include LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include LOCAL_ADDITIONAL_DEPENDENCIES := INSTALLED_KERNEL_HEADERS -LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID +LOCAL_CFLAGS := -DFEATURE_IPA_ANDROID +LOCAL_CFLAGS += -DFEATURE_IPACM_RESTART LOCAL_CFLAGS += -DFEATURE_IPACM_HAL -Wall -Werror -Wno-error=macro-redefined ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) LOCAL_CFLAGS += -DDEBUG @@ -36,7 +28,6 @@ LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) filetoadd = bionic/libc/kernel/arch-arm/asm/byteorder.h LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;) - LOCAL_SRC_FILES := IPACM_Main.cpp \ IPACM_EvtDispatcher.cpp \ IPACM_Config.cpp \ diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp index c46bc71..90d3647 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -106,6 +106,7 @@ const char *ipacm_event_name[] = { __stringify(IPA_ETH_BRIDGE_CLIENT_ADD), /* ipacm_event_eth_bridge*/ __stringify(IPA_ETH_BRIDGE_CLIENT_DEL), /* ipacm_event_eth_bridge*/ __stringify(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH), /* ipacm_event_eth_bridge*/ + __stringify(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE), /* ipacm_event_iface*/ __stringify(IPA_LAN_DELETE_SELF), /* ipacm_event_data_fid */ #ifdef FEATURE_L2TP __stringify(IPA_ADD_VLAN_IFACE), /* ipa_ioc_vlan_iface_info */ @@ -183,6 +184,7 @@ int IPACM_Config::Init(void) { IPACMERR("Failed opening %s.\n", DEVICE_NAME); } + ver = GetIPAVer(true); #ifdef FEATURE_IPACM_HAL strlcpy(IPACM_config_file, "/vendor/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); #else @@ -574,8 +576,8 @@ int IPACM_Config::CheckNatIfaces(const char *dev_name, ipa_ip_type ip_type) if (ip_type == IPA_IP_v6 && pNatIfaces[i].v6_up == true) { IPACMDBG_H(" v6_up=%d\n", pNatIfaces[i].v6_up); - return 0; - } + return 0; + } return -1; } } @@ -878,3 +880,21 @@ const char* IPACM_Config::getEventName(ipa_cm_event_id event_id) return ipacm_event_name[event_id]; } + +enum ipa_hw_type IPACM_Config::GetIPAVer(bool get) +{ + int ret; + + if(!get) + return ver; + + ret = ioctl(m_fd, IPA_IOC_GET_HW_VERSION, &ver); + if(ret != 0) + { + IPACMERR("Failed to get IPA version with error %d.\n", ret); + ver = IPA_HW_None; + return IPA_HW_None; + } + IPACMDBG_H("IPA version is %d.\n", ver); + return ver; +} diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp index b7bb95d..29a70b9 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp @@ -1,7 +1,6 @@ /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -374,7 +373,7 @@ void IPACM_ConntrackListener::TriggerWANUp(void *in_param) if(nat_inst != NULL) { - nat_inst->AddTable(wanup_data->ipv4_addr); + nat_inst->AddTable(wanup_data->ipv4_addr, wanup_data->mux_id); } IPACMDBG("creating nat threads\n"); diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp index 04cdd16..4004597 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -31,9 +31,13 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef FEATURE_IPACM_HAL #include "IPACM_OffloadManager.h" #endif +#include "IPACM_Iface.h" #define INVALID_IP_ADDR 0x0 +#define HDR_METADATA_MUX_ID_BMASK 0x00FF0000 +#define HDR_METADATA_MUX_ID_SHFT 0x10 + /* NatApp class Implementation */ NatApp *NatApp::pInstance = NULL; NatApp::NatApp() @@ -134,9 +138,14 @@ NatApp* NatApp::GetInstance() return pInstance; } +uint32_t NatApp::GenerateMetdata(uint8_t mux_id) +{ + return (mux_id << HDR_METADATA_MUX_ID_SHFT) & HDR_METADATA_MUX_ID_BMASK; +} + /* NAT APP related object function definitions */ -int NatApp::AddTable(uint32_t pub_ip) +int NatApp::AddTable(uint32_t pub_ip, uint8_t mux_id) { int ret; int cnt = 0; @@ -158,6 +167,19 @@ int NatApp::AddTable(uint32_t pub_ip) IPACMERR("unable to create nat table Error:%d\n", ret); return ret; } + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0) { + /* modify PDN 0 so it will hold the mux ID in the src metadata field */ + ipa_nat_pdn_entry entry; + + entry.dst_metadata = 0; + entry.src_metadata = GenerateMetdata(mux_id); + entry.public_ip = pub_ip; + ret = ipa_nat_modify_pdn(nat_table_hdl, 0, &entry); + if(ret) + { + IPACMERR("unable to modify PDN 0 entry Error:%d INIT_HDR_METADATA register values will be used!\n", ret); + } + } /* Add back the cached NAT-entry */ if (pub_ip == pub_ip_addr_pre) diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp index 5b1f07a..f532c18 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp @@ -122,15 +122,15 @@ bool IPACM_Filtering::AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTa 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); -#ifdef FEATURE_IPA_V3 - int retval = 0; - retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable); for (int cnt = 0; cnt<ruleTable->num_rules; cnt++) @@ -150,7 +150,7 @@ bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after co IPACMDBG("Added Filtering rule %pK\n", ruleTable); #else if (ruleTable) - IPACMERR("Not support adding Filtering rule %pK\n", ruleTable); + IPACMERR("Not support adding Filtering rule %pK\n", ruleTable); #endif return true; } diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp index 53d6686..d05cefd 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp @@ -646,26 +646,29 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) } else { - if(rx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false); - } - else - { - /* only wlan may take software-path, not register Rx-property*/ - if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0) + if(rx_prop != NULL) { IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD); - IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false); } - if(strcmp(dev_name,dev_ecm0) == 0) + else { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD); - IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true); + /* only wlan may take software-path, not register Rx-property*/ + if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0) + { + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD); + IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true); + } + if(strcmp(dev_name,dev_ecm0) == 0) + { + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD); + IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true); + } } } } @@ -850,6 +853,36 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) memcpy(&(m_pFilteringTable->rules[3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); #ifdef FEATURE_IPA_ANDROID + /* Add the ipv6 tcp fragment filtering rule. */ + memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); + flt_rule_entry.at_rear = true; + 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 + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1); + flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1; + flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP; + flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; + + /* Configuring Fragment Filtering Rule */ + memcpy(&flt_rule_entry.rule.attrib, + &rx_prop->rx[0].attrib, + sizeof(flt_rule_entry.rule.attrib)); + /* remove meta data mask since we only install default flt rules once for all modem + PDN*/ + flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); + + flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; + + memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry, + sizeof(struct ipa_flt_rule_add)); + IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPV6_DEFAULT_FILTERTING_RULES); memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); @@ -891,47 +924,18 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) /* add TCP FIN rule*/ flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT); flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT); - memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); /* add TCP SYN rule*/ flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT); flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT); - memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + memcpy(&(m_pFilteringTable->rules[6]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); /* add TCP RST rule*/ flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT); flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT); - memcpy(&(m_pFilteringTable->rules[6]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Add the ipv6 tcp fragment filtering rule. */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; - 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 - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1); - flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1; - flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP; - flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP; - - /* Configuring Fragment Filtering Rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* remove meta data mask since we only install default flt rules once for all modem - PDN*/ - flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; + memcpy(&(m_pFilteringTable->rules[7]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - memcpy(&(m_pFilteringTable->rules[7]), &flt_rule_entry, - sizeof(struct ipa_flt_rule_add)); #endif if (m_filtering.AddFilteringRule(m_pFilteringTable) == false) { @@ -1056,3 +1060,10 @@ void IPACM_Iface::config_ip_type(ipa_ip_type iptype) return; } + +void IPACM_Iface::delete_iface(void) +{ + IPACMDBG_H("netdev (%s):ipa_index (%d) instance close \n", + IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); + delete this; +} diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp index 85033a3..248bb78 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -257,6 +257,12 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) { IPACMDBG_H("Creating Lan interface\n"); IPACM_Lan *lan = new IPACM_Lan(ipa_interface_index); + if (lan->rx_prop == NULL && lan->tx_prop == NULL) + { + /* close the netdev instance if IPA not support*/ + lan->delete_iface(); + return IPACM_FAILURE; + } IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, lan); //IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, lan); //IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, lan); @@ -365,6 +371,14 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) { IPACMDBG_H("Creating WLan interface\n"); IPACM_Wlan *wl = new IPACM_Wlan(ipa_interface_index); + if (wl->rx_prop == NULL && wl->tx_prop == NULL) + { + /* reset the AP-iface category to unknown */ + IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = UNKNOWN_IF; + /* close the netdev instance if IPA not support*/ + wl->delete_iface(); + return IPACM_FAILURE; + } IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, wl); IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, wl); IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT, wl); @@ -403,6 +417,9 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) #else IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, wl); #endif +#ifdef FEATURE_IPACM_HAL + IPACM_EvtDispatcher::registr(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE, wl); +#endif /* IPA_LAN_DELETE_SELF should be always last */ IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, wl); IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num); @@ -421,6 +438,14 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) if(is_sta_mode == WLAN_WAN) { w = new IPACM_Wan(ipa_interface_index, is_sta_mode, param->mac_addr); + if (w->rx_prop == NULL && w->tx_prop == NULL) + { + /* reset the AP-iface category to unknown */ + IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = UNKNOWN_IF; + /* close the netdev instance if IPA not support*/ + w->delete_iface(); + return IPACM_FAILURE; + } } else { @@ -452,6 +477,7 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w); #ifdef FEATURE_IPACM_HAL IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, w); + IPACM_EvtDispatcher::registr(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE, w); #endif #endif } diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp index 8d68d32..2369e64 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp @@ -195,9 +195,9 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) #ifdef FEATURE_IPACM_HAL /* check if Upstream was set before as WIFI with RNDIS case */ - if(ipa_if_cate == LAN_IF && IPACM_Wan::backhaul_is_sta_mode == true) /* STA */ + if(ipa_if_cate == LAN_IF && IPACM_Wan::backhaul_is_sta_mode == true) /* LTE */ { - IPACMDBG_H(" Skip the Upstream flag set on LAN instance (%d) with WIFI backhaul (%d)\n", ipa_if_cate, IPACM_Wan::backhaul_is_sta_mode ); /* RNDIS+WIFI not support on msm*/ + IPACMDBG_H(" Skip the Upstream falg set on LAN instance (%d) with WIFI backhaul (%d)\n", ipa_if_cate, IPACM_Wan::backhaul_is_sta_mode ); /* RNDIS+WIFI not support on msm*/ return; } @@ -341,6 +341,21 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) } } #endif + +#ifdef FEATURE_ETH_BRIDGE_LE + if(rx_prop != NULL) + { + free(rx_prop); + } + if(tx_prop != NULL) + { + free(tx_prop); + } + if(iface_query != NULL) + { + free(iface_query); + } +#endif delete this; } break; @@ -522,7 +537,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) IPACMERR("IPA_HANDLE_WAN_UP_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num); return; } -#else /* not offload rndis on WIFI mode on MSM targets sky*/ +#else /* not offload rndis on WIFI mode on MSM targets */ if (data_wan_tether->is_sta) { IPACMERR("Not support RNDIS offload on WIFI mode, dun install UL filter rules for WIFI mode\n"); @@ -556,7 +571,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) { if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v6) == false) - IPACMERR("unable to delete usb-client v6 header for index %d\n", i); + IPACMERR("unbale to delete usb-client v6 header for index %d\n", i); } } /* end of for loop */ return; @@ -934,9 +949,9 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) } } - if (ipa_interface_index == ipa_if_num + if (ipa_interface_index == ipa_if_num #ifdef FEATURE_L2TP - || is_vlan_event(data->iface_name) || + || is_vlan_event(data->iface_name) || (is_l2tp_event(data->iface_name) && ipa_if_cate == ODU_IF) #endif ) @@ -963,10 +978,16 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) #ifdef FEATURE_L2TP else if(is_l2tp_event(data->iface_name) && ipa_if_cate == ODU_IF) { - if(tx_prop != NULL) + + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("add rm dependency for L2TP interface.\n"); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + } } eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->mac_addr, NULL, data->iface_name); } @@ -1330,6 +1351,12 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) /* initial multicast/broadcast/fragment filter rule */ init_fl_rule(data->iptype); +#ifdef FEATURE_L2TP + if(ipa_if_cate == WLAN_IF) + { + add_tcp_syn_flt_rule(data->iptype); + } +#endif install_ipv4_icmp_flt_rule(); /* populate the flt rule offset for eth bridge */ @@ -1421,6 +1448,17 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) if (num_dft_rt_v6 == 0) { +#ifdef FEATURE_L2TP + if(ipa_if_cate == WLAN_IF) + { + add_tcp_syn_flt_rule(data->iptype); + } + else if(ipa_if_cate == ODU_IF) + { + add_tcp_syn_flt_rule_l2tp(IPA_IP_v4); + add_tcp_syn_flt_rule_l2tp(IPA_IP_v6); + } +#endif install_ipv6_icmp_flt_rule(); /* populate the flt rule offset for eth bridge */ @@ -1739,9 +1777,11 @@ int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, ui IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg; struct ipa_ioc_write_qmapid mux; + /* for newer versions metadata is overridden by NAT metadata replacement for IPAv4 and up */ + /* this is still needed for IPv6 traffic in case qmapid need to be used */ if(rx_prop != NULL) { - /* give mud ID to IPA-driver for WLAN/LAN pkts */ + /* give mux ID of the default PDN to IPA-driver for WLAN/LAN pkts */ fd = open(IPA_DEVICE_NAME, O_RDWR); if (0 == fd) { @@ -2210,13 +2250,15 @@ int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp && get_client_memptr(eth_client, eth_index)->route_rule_set_v6 < get_client_memptr(eth_client, eth_index)->ipv6_set )) { - - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + } } rt_rule = (struct ipa_ioc_add_rt_rule *) calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + @@ -2264,9 +2306,12 @@ int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v4; rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(eth_client, eth_index)->v4_addr; rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif + + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0) + { + rt_rule_entry->rule.hashable = true; + } + if (false == m_routing.AddRoutingRule(rt_rule)) { IPACMERR("Routing rule addition failed!\n"); @@ -2811,12 +2856,15 @@ int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr) /* Del RM dependency */ if(num_eth_client == 0) { - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + } } } @@ -2966,6 +3014,17 @@ int IPACM_Lan::handle_down_evt() } IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); } +#ifdef FEATURE_L2TP + if(ipa_if_cate == ODU_IF) + { + if(m_filtering.DeleteFilteringHdls(tcp_syn_flt_rule_hdl, IPA_IP_v6, IPA_IP_MAX) == false) + { + IPACMERR("Error Deleting TCP SYN L2TP Filtering Rule, aborting...\n"); + res = IPACM_FAILURE; + goto fail; + } + } +#endif } IPACMDBG_H("Finished delete default iface ipv6 filtering rules \n "); @@ -3002,14 +3061,16 @@ int IPACM_Lan::handle_down_evt() /* free the edm clients cache */ IPACMDBG_H("Free ecm clients cache\n"); - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */ - IPACMDBG_H("dev %s delete producer dependency\n", dev_name); - if (tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + } } - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL, NULL, NULL); /* Delete private subnet*/ @@ -3093,21 +3154,26 @@ fail: { free(odu_route_rule_v6_hdl); } - /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ if (rx_prop != NULL) { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACMDBG_H("Finished delete dependency \n "); + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + IPACMDBG_H("Finished delete dependency \n "); + } +#ifndef FEATURE_ETH_BRIDGE_LE free(rx_prop); +#endif } if (eth_client != NULL) { free(eth_client); } - +#ifndef FEATURE_ETH_BRIDGE_LE if (tx_prop != NULL) { free(tx_prop); @@ -3116,7 +3182,7 @@ fail: { free(iface_query); } - +#endif is_active = false; post_del_self_evt(); @@ -3237,6 +3303,10 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp else { flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT; + + /* NAT block will set the proper MUX ID in the metadata according to the relevant PDN */ + if (IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0) + flt_rule_entry.rule.set_metadata = true; } } else if(iptype == IPA_IP_v6) @@ -4413,7 +4483,7 @@ void IPACM_Lan::eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, u if(ipv6_addr) { IPACMDBG_H("IPv6 addr: %08x:%08x:%08x:%08x \n", ipv6_addr[0], - ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]); + ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]); } memset(ð_bridge_evt, 0, sizeof(ipacm_cmd_q_data)); eth_bridge_evt.event = evt; @@ -4792,6 +4862,9 @@ int IPACM_Lan::eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip end: free(pFilteringTable); +#else + IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + IPACMDBG_H("Not support rt_tbl_hdl %d flt_rule_hdl %p ip-type %d\n", rt_tbl_hdl, flt_rule_hdl, iptype); #endif return res; } @@ -5285,6 +5358,12 @@ int IPACM_Lan::add_l2tp_rt_rule(ipa_ip_type iptype, uint8_t *dst_mac, uint32_t * hdr_proc_ctx->hdr_hdl = hdr.hdl; hdr_proc_ctx->l2tp_params.hdr_remove_param.hdr_len_remove = 62; hdr_proc_ctx->l2tp_params.hdr_remove_param.eth_hdr_retained = 1; + hdr_proc_ctx->l2tp_params.is_dst_pipe_valid = 1; + hdr_proc_ctx->l2tp_params.dst_pipe = tx_prop->tx[0].dst_pipe; + IPACMDBG_H("Header_remove: hdr len %d, hdr retained %d, dst client: %d\n", + hdr_proc_ctx->l2tp_params.hdr_remove_param.hdr_len_remove, + hdr_proc_ctx->l2tp_params.hdr_remove_param.eth_hdr_retained, + hdr_proc_ctx->l2tp_params.dst_pipe); if(m_header.AddHeaderProcCtx(hdr_proc_ctx_table) == false) { IPACMERR("Failed to add hdr proc ctx with status: %d\n", hdr_proc_ctx_table->proc_ctx[0].status); @@ -5645,3 +5724,127 @@ bool IPACM_Lan::is_unique_local_ipv6_addr(uint32_t* ipv6_addr) return false; } #endif + +/* add tcp syn flt rule */ +int IPACM_Lan::add_tcp_syn_flt_rule(ipa_ip_type iptype) +{ + int len; + struct ipa_flt_rule_add flt_rule_entry; + ipa_ioc_add_flt_rule *m_pFilteringTable; + + if(rx_prop == NULL) + { + IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); + return IPACM_SUCCESS; + } + + len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); + m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len); + if(!m_pFilteringTable) + { + PERROR("Not enough memory.\n"); + return IPACM_FAILURE; + } + memset(m_pFilteringTable, 0, len); + + m_pFilteringTable->commit = 1; + m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; + m_pFilteringTable->global = false; + m_pFilteringTable->ip = iptype; + m_pFilteringTable->num_rules = 1; + + memset(&flt_rule_entry, 0, sizeof(flt_rule_entry)); + flt_rule_entry.at_rear = true; + flt_rule_entry.rule.retain_hdr = 1; + flt_rule_entry.flt_rule_hdl = -1; + flt_rule_entry.status = -1; + flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; + + 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_TCP_SYN; + if(iptype == IPA_IP_v4) + { + flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; + flt_rule_entry.rule.attrib.u.v4.protocol = 6; + } + else + { + flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; + flt_rule_entry.rule.attrib.u.v6.next_hdr = 6; + } + + memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry)); + + if(false == m_filtering.AddFilteringRule(m_pFilteringTable)) + { + IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); + free(m_pFilteringTable); + return IPACM_FAILURE; + } + + tcp_syn_flt_rule_hdl[iptype] = m_pFilteringTable->rules[0].flt_rule_hdl; + free(m_pFilteringTable); + return IPACM_SUCCESS; +} + +/* add tcp syn flt rule for l2tp interface*/ +int IPACM_Lan::add_tcp_syn_flt_rule_l2tp(ipa_ip_type inner_ip_type) +{ + int len; + struct ipa_flt_rule_add flt_rule_entry; + ipa_ioc_add_flt_rule *m_pFilteringTable; + + if(rx_prop == NULL) + { + IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); + return IPACM_SUCCESS; + } + + len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); + m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len); + if(!m_pFilteringTable) + { + PERROR("Not enough memory.\n"); + return IPACM_FAILURE; + } + memset(m_pFilteringTable, 0, len); + + m_pFilteringTable->commit = 1; + m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; + m_pFilteringTable->global = false; + m_pFilteringTable->ip = IPA_IP_v6; + m_pFilteringTable->num_rules = 1; + + memset(&flt_rule_entry, 0, sizeof(flt_rule_entry)); + flt_rule_entry.at_rear = true; + flt_rule_entry.rule.retain_hdr = 1; + flt_rule_entry.flt_rule_hdl = -1; + flt_rule_entry.status = -1; + flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; + + 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_TCP_SYN_L2TP; + if(inner_ip_type == IPA_IP_v4) + { + flt_rule_entry.rule.attrib.ether_type = 0x0800; + } + else + { + flt_rule_entry.rule.attrib.ether_type = 0x86dd; + } + + memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry)); + + if(false == m_filtering.AddFilteringRule(m_pFilteringTable)) + { + IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); + free(m_pFilteringTable); + return IPACM_FAILURE; + } + + tcp_syn_flt_rule_hdl[inner_ip_type] = m_pFilteringTable->rules[0].flt_rule_hdl; + free(m_pFilteringTable); + return IPACM_SUCCESS; +} diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp index 092af64..2902268 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp @@ -598,6 +598,7 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info list<l2tp_vlan_mapping_info>::iterator it_mapping; list<vlan_iface_info>::iterator it_vlan; list<IPACM_LanToLan_Iface>::iterator it_iface; + IPACM_LanToLan_Iface *l2tp_iface; l2tp_vlan_mapping_info new_mapping; bool has_l2tp_iface = false; @@ -641,6 +642,8 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info if(it_iface->set_l2tp_iface(data->vlan_iface_name) == true) { has_l2tp_iface = true; + l2tp_iface = &(*it_iface); + break; } } @@ -655,6 +658,7 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info it_iface->handle_l2tp_enable(); } } + l2tp_iface->switch_to_l2tp_iface(); } return; } @@ -1974,7 +1978,6 @@ bool IPACM_LanToLan_Iface::set_l2tp_iface(char *vlan_iface_name) { IPACMDBG_H("This interface is l2tp interface.\n"); m_is_l2tp_iface = true; - switch_to_l2tp_iface(); } } return m_is_l2tp_iface; diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp index 76f805c..036c061 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -109,6 +109,12 @@ int ipa_get_if_index(char *if_name, int *if_index); IPACM_Neighbor *neigh; IPACM_IfaceManager *ifacemgr; +#ifdef FEATURE_IPACM_RESTART +int ipa_reset(); +/* support ipacm restart */ +int ipa_query_wlan_client(); +#endif + #ifdef FEATURE_IPACM_HAL IPACM_OffloadManager* OffloadMng; HAL *hal; @@ -233,7 +239,9 @@ void* ipa_driver_msg_notifier(void *param) struct ipa_wlan_msg_ex *event_ex= NULL; struct ipa_get_data_stats_resp_msg_v01 event_data_stats; struct ipa_get_apn_data_stats_resp_msg_v01 event_network_stats; +#ifdef FEATURE_IPACM_HAL IPACM_OffloadManager* OffloadMng; +#endif ipacm_cmd_q_data evt_data; ipacm_event_data_mac *data = NULL; @@ -727,6 +735,13 @@ void* ipa_driver_msg_notifier(void *param) OffloadMng->elrInstance->onOffloadSupportAvailable(); } continue; +#ifdef IPA_WLAN_FW_SSR_EVENT_MAX + case WLAN_FWR_SSR_BEFORE_SHUTDOWN: + IPACMDBG_H("Received WLAN_FWR_SSR_BEFORE_SHUTDOWN\n"); + evt_data.event = IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE; + evt_data.evt_data = NULL; + break; +#endif #endif #ifdef FEATURE_L2TP case ADD_VLAN_IFACE: @@ -845,9 +860,13 @@ int main(int argc, char **argv) (void)argc; (void)argv; +#ifdef FEATURE_IPACM_RESTART + IPACMDBG_H("RESET IPA-HW rules\n"); + ipa_reset(); +#endif + neigh = new IPACM_Neighbor(); ifacemgr = new IPACM_IfaceManager(); - #ifdef FEATURE_IPACM_HAL OffloadMng = IPACM_OffloadManager::GetInstance(); hal = HAL::makeIPAHAL(1, OffloadMng); @@ -1049,3 +1068,25 @@ int ipa_get_if_index close(fd); return IPACM_SUCCESS; } + +#ifdef FEATURE_IPACM_RESTART +int ipa_reset() +{ + int fd = -1; + + if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + return IPACM_FAILURE; + } + + if (ioctl(fd, IPA_IOC_CLEANUP) < 0) { + IPACMERR("IOCTL IPA_IOC_CLEANUP call failed: %s \n", strerror(errno)); + close(fd); + return IPACM_FAILURE; + } + + IPACMDBG_H("send IPA_IOC_CLEANUP \n"); + close(fd); + return IPACM_SUCCESS; +} +#endif diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp index 4ddf4bf..5775ed2 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp @@ -711,7 +711,13 @@ static int ipa_nl_decode_nlmsg free(data_fid); return IPACM_FAILURE; } - IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); + IPACMDBG_H("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); + /* We don't expect change in iff_flags for rmnet_data interfaces. */ + if (!strncmp(dev_name,"rmnet_data",strlen("rmnet_data"))) + { + IPACMERR("Don't expect iff_flags change for rmnet_data interface. IGNORE\n"); + return IPACM_FAILURE; + } /*-------------------------------------------------------------------------- Post LAN iface (ECM) link up event diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp index 16d8072..a343b86 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp @@ -61,7 +61,6 @@ IPACM_OffloadManager::IPACM_OffloadManager() latest_cache_index = 0; elrInstance = NULL; touInstance = NULL; - is_cache = false; return ; } @@ -216,6 +215,7 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref IPACMERR("fail to get iface index.\n"); return FAIL_INPUT_CHECK; } + /* Iface is valid, add to list if not present */ if (std::find(valid_ifaces.begin(), valid_ifaces.end(), std::string(downstream_name)) == valid_ifaces.end()) { @@ -233,6 +233,12 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref if (cache_need) { IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name); + +#ifdef FEATURE_IPACM_RESTART + /* add ipacm restart support */ + push_iface_up(downstream_name, false); +#endif + /* copy to the cache */ for(int i = 0; i < MAX_EVENT_CACHE ;i++) { @@ -363,16 +369,16 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if(upstream_name == NULL) { if (default_gw_index == INVALID_IFACE) { + result = FAIL_INPUT_CHECK; for (index = 0; index < MAX_EVENT_CACHE; index++) { if (event_cache[index].valid == true && event_cache[index ].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) { event_cache[index].valid = false; - memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache)); - return SUCCESS; + result = SUCCESS; } } IPACMERR("no previous upstream set before\n"); - return FAIL_INPUT_CHECK; + return result; } if (gw_addr_v4.fam == V4 && upstream_v4_up == true) { IPACMDBG_H("clean upstream for ipv4-fam(%d) upstream_v4_up(%d)\n", gw_addr_v4.fam, upstream_v4_up); @@ -404,6 +410,10 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (cache_need) { IPACMDBG_H("setUpstream name(%s) currently not support in ipa \n", upstream_name); +#ifdef FEATURE_IPACM_RESTART + /* add ipacm restart support */ + push_iface_up(upstream_name, true); +#endif /* copy to the cache */ for(int i = 0; i < MAX_EVENT_CACHE ;i++) { @@ -444,7 +454,6 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g return FAIL_HARDWARE; } } - is_cache = true; return SUCCESS; } @@ -568,7 +577,7 @@ RET IPACM_OffloadManager::stopAllOffload() RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, uint64_t mb/* limit */) { wan_ioctl_set_data_quota quota; - int fd = -1,rc = 0; + int fd = -1, rc = 0, err_type = 0; if ((fd = open(DEVICE_NAME, O_RDWR)) < 0) { @@ -592,9 +601,10 @@ RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, ui if(rc != 0) { + err_type = errno; close(fd); - IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s rc: %d\n", strerror(errno),rc); - if (errno == ENODEV) { + IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s err_type: %d\n", strerror(err_type), err_type); + if (err_type == ENODEV) { IPACMDBG_H("Invalid argument.\n"); return FAIL_UNSUPPORTED; } @@ -670,15 +680,14 @@ int IPACM_OffloadManager::post_route_evt(enum ipa_ip_type iptype, int index, ipa IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", evt_data_route->ipv6_addr_gw[0], evt_data_route->ipv6_addr_gw[1], evt_data_route->ipv6_addr_gw[2], evt_data_route->ipv6_addr_gw[3]); #endif - if (event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) - { + if (event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) { IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD: fid(%d) tether_fid(%d) ip-type(%d)\n", evt_data_route->if_index, evt_data_route->if_index_tether, evt_data_route->iptype); } - else if (event == IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT) - { - IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) tether_fid(%d) ip-type(%d)\n", evt_data_route->if_index, - evt_data_route->if_index_tether, evt_data_route->iptype); + else if (event == IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT) { + IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) tether_fid(%d) ip-type(%d)\n", + evt_data_route->if_index, + evt_data_route->if_index_tether, evt_data_route->iptype); } memset(&evt, 0, sizeof(evt)); evt.evt_data = (void*)evt_data_route; @@ -729,11 +738,12 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea wan_ioctl_reset_tether_stats stats; if ((fd = open(DEVICE_NAME, O_RDWR)) < 0) { - IPACMERR("Failed opening %s.\n", DEVICE_NAME); - return FAIL_HARDWARE; - } - memset(stats.upstreamIface, 0, IFNAMSIZ); - if (strlcpy(stats.upstreamIface, upstream_name, IFNAMSIZ) >= IFNAMSIZ) { + IPACMERR("Failed opening %s.\n", DEVICE_NAME); + return FAIL_HARDWARE; + } + + memset(stats.upstreamIface, 0, IFNAMSIZ); + if (strlcpy(stats.upstreamIface, upstream_name, IFNAMSIZ) >= IFNAMSIZ) { IPACMERR("String truncation occurred on upstream\n"); close(fd); return FAIL_INPUT_CHECK; @@ -747,7 +757,7 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea IPACMDBG_H("Reset Interface %s stats\n", upstream_name); close(fd); return IPACM_SUCCESS; - } +} IPACM_OffloadManager* IPACM_OffloadManager::GetInstance() { @@ -789,3 +799,141 @@ bool IPACM_OffloadManager::search_framwork_cache(char * interface_name) IPACMDBG_H(" not found netdev (%s) has cached event\n", interface_name); return rel; } + +#ifdef FEATURE_IPACM_RESTART +int IPACM_OffloadManager::push_iface_up(const char * if_name, bool upstream) +{ + ipacm_cmd_q_data evt_data; + ipacm_event_data_fid *data_fid = NULL; + ipacm_event_data_mac *data = NULL; + int index; + + IPACMDBG_H("name %s, upstream %d\n", + if_name, upstream); + + if(ipa_get_if_index(if_name, &index)) + { + IPACMERR("netdev(%s) not registered ignored\n", if_name); + return SUCCESS; + } + + if(strncmp(if_name, "rmnet_data", 10) == 0 && upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting IPA_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if(strncmp(if_name, "rndis", 5) == 0 && !upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_USB_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if((strncmp(if_name, "softap", 6) == 0 || strncmp(if_name, "wlan", 4) == 0 ) && !upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting IPA_WLAN_AP_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if(strncmp(if_name, "wlan", 4) == 0 && upstream) + { + data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); + if(data == NULL) + { + IPACMERR("unable to allocate memory for event_wlan data\n"); + return FAIL_HARDWARE; + } + data->if_index = index; + evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT; + evt_data.evt_data = data; + IPACMDBG_H("Posting IPA_WLAN_STA_LINK_UP_EVENT with if index: %d\n", + data->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + return IPACM_SUCCESS; +} +#endif + + +bool IPACM_OffloadManager::push_framework_event(const char * if_name, _ipacm_offload_prefix prefix) +{ + bool ret = false; + + for(int i = 0; i < MAX_EVENT_CACHE ;i++) + { + if(event_cache[latest_cache_index].valid == false) + { + //do the copy + event_cache[latest_cache_index].valid = true; + event_cache[latest_cache_index].event = IPA_DOWNSTREAM_ADD; + memcpy(event_cache[latest_cache_index].dev_name, if_name, + sizeof(event_cache[latest_cache_index].dev_name)); + memcpy(&event_cache[latest_cache_index].prefix_cache, &prefix, + sizeof(event_cache[latest_cache_index].prefix_cache)); + + if (prefix.iptype == IPA_IP_v4) { + IPACMDBG_H("cache event(%d) subnet info v4Addr (%x) v4Mask (%x) dev(%s) on entry (%d)\n", + event_cache[latest_cache_index].event, + event_cache[latest_cache_index].prefix_cache.v4Addr, + event_cache[latest_cache_index].prefix_cache.v4Mask, + event_cache[latest_cache_index].dev_name, + latest_cache_index); + } else { + IPACMDBG_H("cache event (%d) v6Addr: %08x:%08x:%08x:%08x \n", + event_cache[latest_cache_index].event, + event_cache[latest_cache_index].prefix_cache.v6Addr[0], + event_cache[latest_cache_index].prefix_cache.v6Addr[1], + event_cache[latest_cache_index].prefix_cache.v6Addr[2], + event_cache[latest_cache_index].prefix_cache.v6Addr[3]); + IPACMDBG_H("subnet v6Mask: %08x:%08x:%08x:%08x dev(%s) on entry(%d),\n", + event_cache[latest_cache_index].prefix_cache.v6Mask[0], + event_cache[latest_cache_index].prefix_cache.v6Mask[1], + event_cache[latest_cache_index].prefix_cache.v6Mask[2], + event_cache[latest_cache_index].prefix_cache.v6Mask[3], + event_cache[latest_cache_index].dev_name, + latest_cache_index); + } + latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE; + ret = true; + break; + } + latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE; + if(i == MAX_EVENT_CACHE - 1) + { + IPACMDBG_H(" run out of event cache (%d)\n", i); + ret = false; + } + } + return ret; +} diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp index f04f45b..5d884fc 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. +Copyright (c) 2013, 2018 The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -62,6 +62,8 @@ uint32_t IPACM_Wan::curr_wan_ip = 0; int IPACM_Wan::num_v4_flt_rule = 0; int IPACM_Wan::num_v6_flt_rule = 0; +int IPACM_Wan::ipa_pm_q6_check = 0; + struct ipa_flt_rule_add IPACM_Wan::flt_rule_v4[IPA_MAX_FLT_RULE]; struct ipa_flt_rule_add IPACM_Wan::flt_rule_v6[IPA_MAX_FLT_RULE]; @@ -172,12 +174,15 @@ IPACM_Wan::IPACM_Wan(int iface_index, IPACMDBG(" IPACM->IPACM_Wan_eMBMS(%d)\n", ipa_if_num); embms_is_on = true; install_wan_filtering_rule(false); - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - if(tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ + if(tx_prop != NULL) + { + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + } } } else @@ -1263,6 +1268,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) #ifdef FEATURE_IPACM_HAL /* WA for WLAN to clean up NAT instance during SSR */ case IPA_SSR_NOTICE: //sky + case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE: IPACMDBG_H("Received IPA_SSR_NOTICE event.\n"); if(m_is_sta_mode == WLAN_WAN) { @@ -1288,7 +1294,11 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) const int NUM = 1; ipacm_cmd_q_data evt_data; struct ipa_ioc_get_hdr hdr; - +#ifdef WAN_IOC_NOTIFY_WAN_STATE //resolve compile issue on 4.9 kernel + struct wan_ioctl_notify_wan_state wan_state; + int fd_wwan_ioctl; + memset(&wan_state, 0, sizeof(wan_state)); +#endif IPACMDBG_H("ip-type:%d\n", iptype); /* copy header from tx-property, see if partial or not */ @@ -1619,7 +1629,11 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) { IPACM_Wan::xlat_mux_id = 0; wanup_data->xlat_mux_id = 0; - IPACMDBG_H("No xlat configuratio:\n"); + if(m_is_sta_mode == Q6_WAN) + wanup_data->mux_id = ext_prop->ext[0].mux_id; + else + wanup_data->mux_id = 0; + IPACMDBG_H("No xlat configuration\n"); } evt_data.event = IPA_HANDLE_WAN_UP; evt_data.evt_data = (void *)wanup_data; @@ -1664,12 +1678,37 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) evt_data.evt_data = (void *)wanup_data; IPACM_EvtDispatcher::PostEvt(&evt_data); } + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); +#ifdef WAN_IOC_NOTIFY_WAN_STATE + } else { + if (m_is_sta_mode == Q6_WAN && ipa_pm_q6_check == 0) + { + fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); + if(fd_wwan_ioctl < 0) + { + IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME); + return false; + } + IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE up to IPA_PM\n"); + wan_state.up = true; + if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state)) + { + IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up); + } + close(fd_wwan_ioctl); + } + ipa_pm_q6_check++; + IPACMDBG_H("update ipa_pm_q6_check to %d\n", ipa_pm_q6_check); - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - + } +#else +} +#endif if(rt_rule != NULL) { free(rt_rule); @@ -3216,6 +3255,7 @@ int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype) IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name); IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name, iptype); } + fail: return res; } @@ -3804,11 +3844,17 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o memcpy(&(rules[rule_offset + 3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - +#ifdef FEATURE_IPA_ANDROID IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_MULTICAST_WAN_FILTER_RULE_IPV6; IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_MULTICAST_WAN_FILTER_RULE_IPV6, iptype); +#else + IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6; + IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", + IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6, iptype); +#endif IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6; - IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6, iptype); + IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", + IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6, iptype); } fail: @@ -3857,8 +3903,9 @@ int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; +#ifdef FEATURE_IPA_ANDROID IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6); - +#endif memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); @@ -3903,8 +3950,10 @@ int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT); memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); +#ifdef FEATURE_IPA_ANDROID IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6; IPACMDBG_H("Constructed %d ICMP filtering rules for ip type %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6, IPA_IP_v6); +#endif fail: return res; @@ -4051,12 +4100,13 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype) if (((iptype == IPA_IP_v4) && (active_v4 == true)) || ((iptype == IPA_IP_v6) && (active_v6 == true))) { - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + } for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) { if(iptype != tx_prop->tx[tx_index].ip) @@ -4180,6 +4230,11 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype) int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype) { ipacm_cmd_q_data evt_data; +#ifdef WAN_IOC_NOTIFY_WAN_STATE + struct wan_ioctl_notify_wan_state wan_state; + int fd_wwan_ioctl; + memset(&wan_state, 0, sizeof(wan_state)); +#endif IPACMDBG_H("got handle_route_del_evt_ex with ip-family:%d \n", iptype); @@ -4195,12 +4250,38 @@ int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype) if (((iptype == IPA_IP_v4) && (active_v4 == true)) || ((iptype == IPA_IP_v6) && (active_v6 == true))) { - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); +#ifdef WAN_IOC_NOTIFY_WAN_STATE + } else { + IPACMDBG_H("ipa_pm_q6_check to %d\n", ipa_pm_q6_check); + if(ipa_pm_q6_check == 1) + { + fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); + if(fd_wwan_ioctl < 0) + { + IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME); + return false; + } + IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE down to IPA_PM\n"); + if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state)) + { + IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up); + } + close(fd_wwan_ioctl); + } + if (ipa_pm_q6_check > 0) + ipa_pm_q6_check--; + else + IPACMERR(" ipa_pm_q6_check becomes negative !!!\n"); + } +#else +} +#endif /* Delete the default route*/ if (iptype == IPA_IP_v6) { @@ -4426,15 +4507,16 @@ int IPACM_Wan::handle_down_evt() memset(ipa_if_num_tether_tmp, 0, IPA_MAX_IFACE_ENTRIES); IPACMDBG_H(" wan handle_down_evt \n"); - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + } } - /* no iface address up, directly close iface*/ if (ip_type == IPACM_IP_NULL) { @@ -4702,14 +4784,16 @@ int IPACM_Wan::handle_down_evt_ex() if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF) { embms_is_on = false; - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ + IPACMDBG_H("dev %s delete producer dependency\n", dev_name); + if (tx_prop != NULL) + { + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + } } - if (rx_prop != NULL) { install_wan_filtering_rule(false); @@ -5719,12 +5803,13 @@ int IPACM_Wan::handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp && get_client_memptr(wan_client, wan_index)->route_rule_set_v6 < get_client_memptr(wan_client, wan_index)->ipv6_set )) { - - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); + IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); + } rt_rule = (struct ipa_ioc_add_rt_rule *) calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + NUM * sizeof(struct ipa_rt_rule_add)); diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp index 3ba899a..d8a370c 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp @@ -49,7 +49,9 @@ Skylar Chang #include <IPACM_Lan.h> #include <IPACM_IfaceManager.h> #include <IPACM_ConntrackListener.h> - +#ifdef FEATURE_IPACM_HAL +#include "IPACM_OffloadManager.h" +#endif /* static member to store the number of total wifi clients within all APs*/ int IPACM_Wlan::total_num_wifi_clients = 0; @@ -133,6 +135,7 @@ IPACM_Wlan::~IPACM_Wlan() { IPACM_EvtDispatcher::deregistr(this); IPACM_IfaceManager::deregistr(this); + IPACM_Wlan::num_wlan_ap_iface--; return; } @@ -148,6 +151,9 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) int wlan_index; ipacm_ext_prop* ext_prop; ipacm_event_iface_up_tehter* data_wan_tether; +#ifdef FEATURE_IPACM_HAL + IPACM_OffloadManager* OffloadMng; +#endif switch (event) { @@ -196,11 +202,24 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; if(data->if_index == ipa_if_num) { - IPACM_Wlan::num_wlan_ap_iface--; IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface); IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n"); IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); +#ifdef FEATURE_ETH_BRIDGE_LE + if(rx_prop != NULL) + { + free(rx_prop); + } + if(tx_prop != NULL) + { + free(tx_prop); + } + if(iface_query != NULL) + { + free(iface_query); + } +#endif delete this; } break; @@ -253,6 +272,10 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n", info->ipv4_addr, info->addr_mask); IPACM_EvtDispatcher::PostEvt(&evt_data); +#ifdef FEATURE_IPACM_RESTART + /* Query wlan-clients */ + ipa_query_wlan_client(); +#endif } if(handle_addr_evt(data) == IPACM_FAILURE) @@ -544,7 +567,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) memcpy(&prefix[data->prefix.iptype], &data->prefix, sizeof(prefix[data->prefix.iptype])); - if(is_upstream_set[data->prefix.iptype] == true) + if (is_upstream_set[data->prefix.iptype] == true) { IPACMDBG_H("Upstream was set before, adding modem UL rules.\n"); if(ip_type == IPA_IP_MAX || ip_type == data->prefix.iptype) @@ -924,6 +947,28 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface } break; + case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE: + { + IPACMDBG_H("Received IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE.\n"); + + /* internal push add_downstream event in cache */ + OffloadMng = IPACM_OffloadManager::GetInstance(); + if (OffloadMng == NULL) { + IPACMERR("failed to get IPACM_OffloadManager instance !\n"); + } else { + IPACMDBG_H("Update iface %s add_downstream cache events\n", dev_name); + if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) + { + OffloadMng->push_framework_event(dev_name, prefix[IPA_IP_v4]); + } + else if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) + { + OffloadMng->push_framework_event(dev_name, prefix[IPA_IP_v6]); + } + } + IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface + } + break; #endif default: break; @@ -1451,9 +1496,12 @@ int IPACM_Wlan::handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type ipt rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4; rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr; rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif + + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0) + { + rt_rule_entry->rule.hashable = true; + } + if (false == m_routing.AddRoutingRule(rt_rule)) { IPACMERR("Routing rule addition failed!\n"); @@ -1803,6 +1851,15 @@ int IPACM_Wlan::handle_down_evt() IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_private_subnet_fl_rule); #endif IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n"); + +#ifdef FEATURE_L2TP + if(m_filtering.DeleteFilteringHdls(&tcp_syn_flt_rule_hdl[IPA_IP_v4], IPA_IP_v4, 1) == false) + { + IPACMERR("Error deleting tcp syn flt rule, aborting...\n"); + res = IPACM_FAILURE; + goto fail; + } +#endif } /* Delete v6 filtering rules */ @@ -1828,6 +1885,14 @@ int IPACM_Wlan::handle_down_evt() IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); IPACMDBG_H("Deleted default v6 filter rules successfully.\n"); } +#ifdef FEATURE_L2TP + if(m_filtering.DeleteFilteringHdls(&tcp_syn_flt_rule_hdl[IPA_IP_v6], IPA_IP_v6, 1) == false) + { + IPACMERR("Error deleting tcp syn flt rule, aborting...\n"); + res = IPACM_FAILURE; + goto fail; + } +#endif } IPACMDBG_H("finished delete filtering rules\n "); @@ -1940,13 +2005,18 @@ fail: } IPACMDBG_H("finished delete software-routing filtering rules\n "); - /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ if (rx_prop != NULL) { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0) + { + /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ + IPACMDBG_H("dev %s add producer dependency\n", dev_name); + IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); + } +#ifndef FEATURE_ETH_BRIDGE_LE free(rx_prop); +#endif } for (i = 0; i < num_wifi_client; i++) @@ -1960,6 +2030,7 @@ fail: { free(wlan_client); } +#ifndef FEATURE_ETH_BRIDGE_LE if (tx_prop != NULL) { free(tx_prop); @@ -1969,6 +2040,7 @@ fail: { free(iface_query); } +#endif is_active = false; post_del_self_evt(); @@ -2215,6 +2287,28 @@ void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype) return; } +#ifdef FEATURE_IPACM_RESTART +int IPACM_Wlan::ipa_query_wlan_client() +{ + int fd = -1; + + if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + return IPACM_FAILURE; + } + + if (ioctl(fd, IPA_IOC_QUERY_WLAN_CLIENT) < 0) { + IPACMERR("IOCTL IPA_IOC_QUERY_WLAN_CLIENT call failed: %s \n", strerror(errno)); + close(fd); + return IPACM_FAILURE; + } + + IPACMDBG_H("send IPA_IOC_QUERY_WLAN_CLIENT \n"); + close(fd); + return IPACM_SUCCESS; +} +#endif + void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch() { uint32_t i; diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp index b81856a..4451906 100644 --- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp +++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp @@ -665,6 +665,9 @@ static int IPACM_firewall_xml_parse_tree memcpy(content_buf, (void *)content, str_size); config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos = atoi(content_buf); + // Here we do not know if it is TOS with mask or not, so we put at both places + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_value + = atoi(content_buf); IPACMDBG_H("\n IPV4 TOS val is %d \n", config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos); } @@ -674,13 +677,25 @@ static int IPACM_firewall_xml_parse_tree content = IPACM_read_content_element(xml_node); if (content) { + uint8_t mask; + str_size = strlen(content); memset(content_buf, 0, sizeof(content_buf)); memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos - &= atoi(content_buf); - IPACMDBG_H("\n IPv4 TOS mask is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos); + mask = atoi(content_buf); + IPACMDBG_H("\n IPv4 TOS mask is %u \n", mask); + if (mask != 0xFF) { + // TOS attribute cannot be used + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos = 0; + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_mask = mask; + + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= + IPA_FLT_TOS_MASKED; + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask &= + ~IPA_FLT_TOS; + } else { + config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_value = 0; + } } } else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4NextHeaderProtocol_TAG)) |