summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Polyudov <apolyudov@google.com>2017-11-01 16:15:32 -0700
committerAlexey Polyudov <apolyudov@google.com>2017-11-01 16:15:32 -0700
commit9e87c6ab0bceee8ede00cf0b204cdddc2cc11c82 (patch)
treebf3a42a4197e4939c0df39ff9e6f3220f41154a9
parent9a73394da3b2ddaca165737a976991681a5f20e0 (diff)
parent9454bf155c2b3f92a4585ad45c318337613729b6 (diff)
downloadipacfg-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.cpp8
-rw-r--r--ipacm/inc/IPACM_Lan.h8
-rw-r--r--ipacm/src/Android.mk2
-rw-r--r--ipacm/src/IPACM_Config.cpp5
-rw-r--r--ipacm/src/IPACM_Lan.cpp152
-rw-r--r--ipacm/src/IPACM_Main.cpp10
-rw-r--r--ipacm/src/IPACM_OffloadManager.cpp14
-rw-r--r--ipacm/src/IPACM_Wan.cpp11
-rw-r--r--ipacm/src/IPACM_Wlan.cpp17
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 ");