diff options
author | Alexey Polyudov <apolyudov@google.com> | 2017-11-01 16:15:32 -0700 |
---|---|---|
committer | Alexey Polyudov <apolyudov@google.com> | 2017-11-01 16:15:32 -0700 |
commit | 9e87c6ab0bceee8ede00cf0b204cdddc2cc11c82 (patch) | |
tree | bf3a42a4197e4939c0df39ff9e6f3220f41154a9 | |
parent | 9a73394da3b2ddaca165737a976991681a5f20e0 (diff) | |
parent | 9454bf155c2b3f92a4585ad45c318337613729b6 (diff) | |
download | ipacfg-mgr-9e87c6ab0bceee8ede00cf0b204cdddc2cc11c82.tar.gz |
Merge remote-tracking branch 'goog/qcom/release/LA.UM.6.3.R1.00355.2'
Change-Id: Iedfdc865b52a43c2aaead94bd3047e7f0a6c5fce
-rw-r--r-- | hal/src/HAL.cpp | 8 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Lan.h | 8 | ||||
-rw-r--r-- | ipacm/src/Android.mk | 2 | ||||
-rw-r--r-- | ipacm/src/IPACM_Config.cpp | 5 | ||||
-rw-r--r-- | ipacm/src/IPACM_Lan.cpp | 152 | ||||
-rw-r--r-- | ipacm/src/IPACM_Main.cpp | 10 | ||||
-rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 14 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wan.cpp | 11 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 17 |
9 files changed, 215 insertions, 12 deletions
diff --git a/hal/src/HAL.cpp b/hal/src/HAL.cpp index 0d25aa0..18249a5 100644 --- a/hal/src/HAL.cpp +++ b/hal/src/HAL.cpp @@ -86,16 +86,16 @@ HAL::HAL(IOffloadManager* mgr) : mLogs("HAL Function Calls", 50) { void HAL::registerAsSystemService(const char* name) { status_t ret = 0; - ret = IOffloadControl::registerAsService(name); + ret = IOffloadControl::registerAsService(); if (ret != 0) ALOGE("Failed to register IOffloadControl (%d)", ret); else if (DBG) { - ALOGI("Successfully registered IOffloadControl (%s)", name); + ALOGI("Successfully registered IOffloadControl"); } - IOffloadConfig::registerAsService(name); + IOffloadConfig::registerAsService(); if (ret != 0) ALOGE("Failed to register IOffloadConfig (%d)", ret); else if (DBG) { - ALOGI("Successfully registered IOffloadConfig (%s)", name); + ALOGI("Successfully registered IOffloadConfig"); } } /* registerAsSystemService */ diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h index 280c830..cb63e34 100644 --- a/ipacm/inc/IPACM_Lan.h +++ b/ipacm/inc/IPACM_Lan.h @@ -238,6 +238,12 @@ protected: /* handle tethering client */ int handle_tethering_client(bool reset, ipacm_client_enum ipa_client); + /* add tcp syn flt rule */ + int add_tcp_syn_flt_rule(ipa_ip_type iptype); + + /* add tcp syn flt rule for l2tp interface*/ + int add_tcp_syn_flt_rule_l2tp(ipa_ip_type inner_ip_type); + /* store ipv4 UL filter rule handlers from Q6*/ uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES]; @@ -267,6 +273,8 @@ protected: bool is_downstream_set[IPA_IP_MAX]; _ipacm_offload_prefix prefix[IPA_IP_MAX]; + uint32_t tcp_syn_flt_rule_hdl[IPA_IP_MAX]; + private: /* get hdr proc ctx type given source and destination l2 hdr type */ diff --git a/ipacm/src/Android.mk b/ipacm/src/Android.mk index bcb8332..262f8c4 100644 --- a/ipacm/src/Android.mk +++ b/ipacm/src/Android.mk @@ -107,7 +107,7 @@ endef include $(CLEAR_VARS) LOCAL_MODULE := IPACM_cfg.xml LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE) LOCAL_MODULE_OWNER := ipacm diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp index b8cd382..64534ee 100644 --- a/ipacm/src/IPACM_Config.cpp +++ b/ipacm/src/IPACM_Config.cpp @@ -181,8 +181,11 @@ int IPACM_Config::Init(void) { IPACMERR("Failed opening %s.\n", DEVICE_NAME); } +#ifdef FEATURE_IPACM_HAL + strncpy(IPACM_config_file, "/vendor/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); +#else strncpy(IPACM_config_file, "/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); - +#endif IPACMDBG_H("\n IPACM XML file is %s \n", IPACM_config_file); if (IPACM_SUCCESS == ipacm_read_cfg_xml(IPACM_config_file, cfg)) { diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp index 7d0f10c..b39c678 100644 --- a/ipacm/src/IPACM_Lan.cpp +++ b/ipacm/src/IPACM_Lan.cpp @@ -1222,6 +1222,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 */ @@ -1313,6 +1319,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 */ @@ -2851,6 +2868,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 "); @@ -5461,3 +5489,127 @@ bool IPACM_Lan::is_unique_local_ipv6_addr(uint32_t* ipv6_addr) } return false; } + +/* 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/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp index 6bd0cbd..562ff82 100644 --- a/ipacm/src/IPACM_Main.cpp +++ b/ipacm/src/IPACM_Main.cpp @@ -223,7 +223,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; @@ -689,7 +691,7 @@ void* ipa_driver_msg_notifier(void *param) } else { OffloadMng->elrInstance->onLimitReached(); } - break; + continue; case IPA_SSR_BEFORE_SHUTDOWN: IPACMDBG_H("Received IPA_SSR_BEFORE_SHUTDOWN\n"); OffloadMng = IPACM_OffloadManager::GetInstance(); @@ -698,7 +700,7 @@ void* ipa_driver_msg_notifier(void *param) } else { OffloadMng->elrInstance->onOffloadStopped(IpaEventRelay::ERROR); } - break; + continue; case IPA_SSR_AFTER_POWERUP: IPACMDBG_H("Received IPA_SSR_AFTER_POWERUP\n"); OffloadMng = IPACM_OffloadManager::GetInstance(); @@ -707,7 +709,7 @@ void* ipa_driver_msg_notifier(void *param) } else { OffloadMng->elrInstance->onOffloadSupportAvailable(); } - break; + continue; #endif #ifdef FEATURE_L2TP case ADD_VLAN_IFACE: @@ -819,7 +821,9 @@ int main(int argc, char **argv) int ret; pthread_t netlink_thread = 0, monitor_thread = 0, ipa_driver_thread = 0; pthread_t cmd_queue_thread = 0; +#ifdef FEATURE_IPACM_HAL IPACM_OffloadManager* OffloadMng; +#endif /* check if ipacm is already running or not */ ipa_is_ipacm_running(); diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index cf32ff9..762b56d 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -477,12 +477,22 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g RET IPACM_OffloadManager::stopAllOffload() { Prefix v4gw, v6gw; + RET result = SUCCESS; + memset(&v4gw, 0, sizeof(v4gw)); memset(&v6gw, 0, sizeof(v6gw)); v4gw.fam = V4; v6gw.fam = V6; IPACMDBG_H("posting setUpstream(NULL), ipv4-fam(%d) ipv6-fam(%d)\n", v4gw.fam, v6gw.fam); - return setUpstream(NULL, v4gw, v6gw); + result = setUpstream(NULL, v4gw, v6gw); + + /* reset the event cache */ + default_gw_index = INVALID_IFACE; + upstream_v4_up = false; + upstream_v6_up = false; + memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache)); + latest_cache_index = 0; + return result; } RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, uint64_t mb/* limit */) @@ -548,6 +558,7 @@ RET IPACM_OffloadManager::getStats(const char * upstream_name /* upstream */, offload_stats.rx = stats.rx_bytes; IPACMDBG_H("send getStats tx:%lld rx:%lld \n", offload_stats.tx, offload_stats.rx); + close(fd); return SUCCESS; } @@ -648,6 +659,7 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea return FAIL_HARDWARE; } IPACMDBG_H("Reset Interface %s stats\n", upstream_name); + close(fd); return IPACM_SUCCESS; } diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp index 5780f72..e0391cd 100644 --- a/ipacm/src/IPACM_Wan.cpp +++ b/ipacm/src/IPACM_Wan.cpp @@ -3733,9 +3733,13 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o sizeof(flt_rule_entry.rule.eq_attrib)); 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_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 } fail: @@ -3784,8 +3788,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)); @@ -3830,8 +3835,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; diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index 03b5925..ff8fcee 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -1766,6 +1766,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 */ @@ -1791,6 +1800,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 "); |