summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_Wlan.cpp
diff options
context:
space:
mode:
authorSkylar Chang <chiaweic@codeaurora.org>2017-03-31 16:41:17 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-05-12 17:06:24 -0700
commit5668c3c5e440d3fccc7b02694553217f3be14bd1 (patch)
tree3f81dbc96198ba37d603f1635b6b056d8efea9c0 /ipacm/src/IPACM_Wlan.cpp
parent506ef6dba85d740fa5f0da12f94e6b28975e0dfe (diff)
downloadipacfg-mgr-5668c3c5e440d3fccc7b02694553217f3be14bd1.tar.gz
IPACM: Add support on IPACM-HAL for Android-O
Add API for IPACM_HAL to start tethered-traffic offload and get stats from modem and set quota. Change-Id: I7d07c4ce4e7b12c7e088dec94a3d54c7da3a4a8b
Diffstat (limited to 'ipacm/src/IPACM_Wlan.cpp')
-rw-r--r--ipacm/src/IPACM_Wlan.cpp228
1 files changed, 191 insertions, 37 deletions
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 2152c4d..b47c5ef 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -118,7 +118,11 @@ IPACM_Wlan::IPACM_Wlan(int iface_index) : IPACM_Lan(iface_index)
/* set the IPA-client pipe enum */
if(ipa_if_cate == WLAN_IF)
{
+#ifdef FEATURE_IPACM_HAL
+ handle_tethering_client(false, IPACM_CLIENT_MAX);
+#else
handle_tethering_client(false, IPACM_CLIENT_WLAN);
+#endif
}
#endif
return;
@@ -279,6 +283,9 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACM_Lan::handle_wan_up(IPA_IP_v4);
}
}
+ IPACMDBG_H("Finished checking wan_up\n");
+ } else {
+ IPACMDBG_H("Wan_V4 haven't up yet \n");
}
if(IPACM_Wan::isWanUP_V6(ipa_if_num))
@@ -298,9 +305,10 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACM_Lan::handle_wan_up(IPA_IP_v6);
}
}
+ IPACMDBG_H("Finished checking wan_up_v6\n");
+ } else {
+ IPACMDBG_H("Wan_V6 haven't up yet \n");
}
-
- IPACMDBG_H("posting IPA_HANDLE_WLAN_UP:Finished checking wan_up\n");
/* checking if SW-RT_enable */
if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true)
{
@@ -325,20 +333,41 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
data_wan_tether->if_index_tether,
IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
- if (data_wan_tether->if_index_tether == ipa_if_num)
+#ifndef FEATURE_IPACM_HAL
+ if (data_wan_tether->if_index_tether != ipa_if_num)
{
- if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ IPACMERR("IPA_HANDLE_WAN_UP_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num);
+ return;
+ }
+#endif
+ if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ {
+#ifdef FEATURE_IPACM_HAL
+ if(is_upstream_set[IPA_IP_v4] == false)
{
- if(data_wan_tether->is_sta == false)
- {
- ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
- IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, 0);
- }
- else
+ IPACMDBG_H("Add upstream for IPv4.\n");
+ is_upstream_set[IPA_IP_v4] = true;
+ if(is_downstream_set[IPA_IP_v4] == true)
{
- IPACM_Lan::handle_wan_up(IPA_IP_v4);
+ IPACMDBG_H("Downstream was set before, adding UL rules.\n");
+ if(data_wan_tether->is_sta == false)
+ {
+ ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
+ handle_wan_up_ex(ext_prop, IPA_IP_v4, 0);
+ } else {
+ handle_wan_up(IPA_IP_v4);
+ }
}
}
+#else
+ if(data_wan_tether->is_sta == false)
+ {
+ ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
+ handle_wan_up_ex(ext_prop, IPA_IP_v4, 0);
+ } else {
+ handle_wan_up(IPA_IP_v4);
+ }
+#endif
}
break;
@@ -354,23 +383,48 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
data_wan_tether->if_index_tether,
IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
- if (data_wan_tether->if_index_tether == ipa_if_num)
+#ifndef FEATURE_IPACM_HAL
+ if (data_wan_tether->if_index_tether != ipa_if_num)
{
- if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ IPACMERR("IPA_HANDLE_WAN_UP_V6_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num);
+ return;
+ }
+#endif
+ if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ {
+#ifdef FEATURE_IPACM_HAL
+ if(is_upstream_set[IPA_IP_v6] == false)
{
- memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
- install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
+ IPACMDBG_H("Add upstream for IPv6.\n");
+ is_upstream_set[IPA_IP_v6] = true;
- if(data_wan_tether->is_sta == false)
+ if(is_downstream_set[IPA_IP_v6] == true)
{
- ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
- IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
- }
- else
- {
- IPACM_Lan::handle_wan_up(IPA_IP_v6);
+ IPACMDBG_H("Downstream was set before, adding UL rules.\n");
+ memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
+ install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
+ if(data_wan_tether->is_sta == false)
+ {
+ ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
+ handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
+ }
+ else
+ {
+ handle_wan_up(IPA_IP_v6);
+ }
}
}
+#else
+ if(data_wan_tether->is_sta == false)
+ {
+ ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
+ handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
+ }
+ else
+ {
+ handle_wan_up(IPA_IP_v6);
+ }
+#endif
}
break;
@@ -382,23 +436,37 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMERR("No event data is found.\n");
return;
}
+ if(rx_prop == NULL)
+ {
+ IPACMERR("No rx prop.\n");
+ return;
+ }
IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
data_wan_tether->if_index_tether,
IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
- if (data_wan_tether->if_index_tether == ipa_if_num)
+#ifndef FEATURE_IPACM_HAL
+ if (data_wan_tether->if_index_tether != ipa_if_num)
{
- if(data_wan_tether->is_sta == false && wlan_ap_index > 0)
- {
- IPACMDBG_H("This is not the first AP instance and not STA mode, ignore WAN_DOWN event.\n");
- return;
- }
- if (rx_prop != NULL)
+ IPACMERR("IPA_HANDLE_WAN_DOWN_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num);
+ return;
+ }
+#endif
+ if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ {
+#ifdef FEATURE_IPACM_HAL
+ if(is_upstream_set[IPA_IP_v4] == true)
{
- if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ IPACMDBG_H("Del upstream for IPv4.\n");
+ is_upstream_set[IPA_IP_v4] = false;
+ if(is_downstream_set[IPA_IP_v4] == true)
{
+ IPACMDBG_H("Downstream was set before, deleting UL rules.\n");
handle_wan_down(data_wan_tether->is_sta);
}
}
+#else
+ handle_wan_down(data_wan_tether->is_sta);
+#endif
}
break;
@@ -410,25 +478,107 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMERR("No event data is found.\n");
return;
}
+ if(rx_prop == NULL)
+ {
+ IPACMERR("No rx prop.\n");
+ return;
+ }
IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
data_wan_tether->if_index_tether,
IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
- if (data_wan_tether->if_index_tether == ipa_if_num)
+#ifndef FEATURE_IPACM_HAL
+ if (data_wan_tether->if_index_tether != ipa_if_num)
+ {
+ IPACMERR("IPA_HANDLE_WAN_DOWN_V6_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num);
+ return;
+ }
+#endif
+ if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
- /* clean up v6 RT rules*/
- IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n");
- /* reset wifi-client ipv6 rt-rules */
+#ifdef FEATURE_IPACM_HAL
+ if(is_upstream_set[IPA_IP_v6] == true)
+ {
+ IPACMDBG_H("Del upstream for IPv6.\n");
+ is_upstream_set[IPA_IP_v6] = false;
+ if(is_downstream_set[IPA_IP_v6] == true)
+ {
+ IPACMDBG_H("Downstream was set before, deleting UL rules.\n");
+ /* reset usb-client ipv6 rt-rules */
+ handle_wlan_client_reset_rt(IPA_IP_v6);
+ handle_wan_down_v6(data_wan_tether->is_sta);
+ }
+ }
+#else
+ /* reset usb-client ipv6 rt-rules */
handle_wlan_client_reset_rt(IPA_IP_v6);
+ handle_wan_down_v6(data_wan_tether->is_sta);
+#endif
+ }
+ break;
+
+ case IPA_DOWNSTREAM_ADD:
+ {
+ ipacm_event_ipahal_stream *data = (ipacm_event_ipahal_stream *)param;
+ ipa_interface_index = iface_ipa_index_query(data->if_index);
+ if(ipa_interface_index == ipa_if_num)
+ {
+ IPACMDBG_H("Received IPA_DOWNSTREAM_ADD event.\n");
+ if(is_downstream_set[data->prefix.iptype] == false)
+ {
+ IPACMDBG_H("Add downstream for IP iptype %d.\n", data->prefix.iptype);
+ is_downstream_set[data->prefix.iptype] = true;
+ memcpy(&prefix[data->prefix.iptype], &data->prefix,
+ sizeof(prefix[data->prefix.iptype]));
+
+ 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)
+ {
+ if (data->prefix.iptype == IPA_IP_v6) /* ipv6 only */
+ install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
+
+ if (IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */
+ {
+ ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(data->prefix.iptype);
+ handle_wan_up_ex(ext_prop, data->prefix.iptype, 0);
+ } else {
+ handle_wan_up(data->prefix.iptype); /* STA */
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
- if (rx_prop != NULL)
+ case IPA_DOWNSTREAM_DEL:
+ {
+ ipacm_event_ipahal_stream *data = (ipacm_event_ipahal_stream *)param;
+ ipa_interface_index = iface_ipa_index_query(data->if_index);
+ if(ipa_interface_index == ipa_if_num)
+ {
+ IPACMDBG_H("Received IPA_DOWNSTREAM_DEL event.\n");
+ if(is_downstream_set[data->prefix.iptype] == true)
{
- if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ IPACMDBG_H("Del downstream for IP iptype %d.\n", data->prefix.iptype);
+ is_downstream_set[data->prefix.iptype] = false;
+
+ if(is_upstream_set[data->prefix.iptype] == true)
{
- handle_wan_down_v6(data_wan_tether->is_sta);
+ IPACMDBG_H("Upstream was set before, deleting UL rules.\n");
+ if (data->prefix.iptype == IPA_IP_v4)
+ {
+ handle_wan_down(IPACM_Wan::backhaul_is_sta_mode); /* LTE STA */
+ } else {
+ handle_wlan_client_reset_rt(IPA_IP_v6);
+ handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode); /* LTE STA */
+ }
}
}
}
break;
+ }
#else
case IPA_HANDLE_WAN_UP:
IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
@@ -1671,7 +1821,11 @@ int IPACM_Wlan::handle_down_evt()
}
}
/* reset the IPA-client pipe enum */
+#ifdef FEATURE_IPACM_HAL
+ handle_tethering_client(true, IPACM_CLIENT_MAX);
+#else
handle_tethering_client(true, IPACM_CLIENT_WLAN);
+#endif
#endif /* defined(FEATURE_IPA_ANDROID)*/
fail: