diff options
author | Skylar Chang <chiaweic@codeaurora.org> | 2017-03-31 16:41:17 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-12 17:06:24 -0700 |
commit | 5668c3c5e440d3fccc7b02694553217f3be14bd1 (patch) | |
tree | 3f81dbc96198ba37d603f1635b6b056d8efea9c0 /ipacm/src/IPACM_Wlan.cpp | |
parent | 506ef6dba85d740fa5f0da12f94e6b28975e0dfe (diff) | |
download | ipacfg-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.cpp | 228 |
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: |