diff options
author | Alexey Polyudov <apolyudov@google.com> | 2017-10-12 19:20:18 -0700 |
---|---|---|
committer | Alexey Polyudov <apolyudov@google.com> | 2017-10-12 19:20:18 -0700 |
commit | 7f6b7cd1fe9c82bf4264a71a5a17e5a95fed2440 (patch) | |
tree | 0ab10e97e0b7c5fcfb36df377907b1688ea6e1de | |
parent | 818100a64caea99f53c527eab32333169c2b22d1 (diff) | |
parent | ba5f484515413cf894259d79219398c049308744 (diff) | |
download | ipacfg-mgr-7f6b7cd1fe9c82bf4264a71a5a17e5a95fed2440.tar.gz |
Merge remote-tracking branch 'team/qcom/release/LA.UM.6.3.r1.00333.1a'
Change-Id: I5cc22176907807e7b76a7680cf11ba3f1d91c7ba
-rw-r--r-- | ipacm/inc/IPACM_Config.h | 2 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Defs.h | 2 | ||||
-rw-r--r-- | ipacm/inc/IPACM_OffloadManager.h | 18 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Wan.h | 12 | ||||
-rw-r--r-- | ipacm/src/IPACM_Config.cpp | 24 | ||||
-rw-r--r-- | ipacm/src/IPACM_Conntrack_NATApp.cpp | 9 | ||||
-rw-r--r-- | ipacm/src/IPACM_Iface.cpp | 8 | ||||
-rw-r--r-- | ipacm/src/IPACM_Lan.cpp | 110 | ||||
-rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 189 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wan.cpp | 100 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 11 |
11 files changed, 427 insertions, 58 deletions
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h index 1750310..1aeeec5 100644 --- a/ipacm/inc/IPACM_Config.h +++ b/ipacm/inc/IPACM_Config.h @@ -234,6 +234,8 @@ public: int DelNatIfaces(char *dev_name); + int CheckNatIfaces(const char *dev_name); + inline void SetQmapId(uint8_t id) { qmap_id = id; diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h index 31d8543..39c7298 100644 --- a/ipacm/inc/IPACM_Defs.h +++ b/ipacm/inc/IPACM_Defs.h @@ -166,6 +166,8 @@ typedef enum IPA_WAN_XLAT_CONNECT_EVENT, /* ipacm_event_data_fid */ IPA_TETHERING_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ IPA_NETWORK_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ + IPA_DOWNSTREAM_ADD, /* ipacm_event_ipahal_stream */ + IPA_DOWNSTREAM_DEL, /* ipacm_event_ipahal_stream */ IPA_EXTERNAL_EVENT_MAX, diff --git a/ipacm/inc/IPACM_OffloadManager.h b/ipacm/inc/IPACM_OffloadManager.h index 85a2063..9d94253 100644 --- a/ipacm/inc/IPACM_OffloadManager.h +++ b/ipacm/inc/IPACM_OffloadManager.h @@ -43,7 +43,17 @@ using natTimeoutUpdate_t = ::IOffloadManager::ConntrackTimeoutUpdater::natTimeou //using UDP = ::IOffloadManager::ConntrackTimeoutUpdater::UDP; //using TCP = ::IOffloadManager::ConntrackTimeoutUpdater::TCP; +#define MAX_EVENT_CACHE 10 +typedef struct _framework_event_cache +{ + /* IPACM interface name */ + ipa_cm_event_id event; + char dev_name[IF_NAME_LEN]; + Prefix prefix_cache; + Prefix prefix_cache_v6; //for setupstream use + bool valid; +}framework_event_cache; class IPACM_OffloadManager : public IOffloadManager { @@ -82,6 +92,8 @@ public: ConntrackTimeoutUpdater *touInstance; + bool search_framwork_cache(char * interface_name); + private: bool upstream_v4_up; @@ -98,6 +110,12 @@ private: static const char *DEVICE_NAME; + /* cache the add_downstream events if netdev is not ready */ + framework_event_cache event_cache[MAX_EVENT_CACHE]; + + /* latest update cache entry */ + int latest_cache_index; + }; /* IPACM_OffloadManager */ #endif /* _IPACM_OFFLOAD_MANAGER_H_ */ diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h index fde97f6..c60612c 100644 --- a/ipacm/inc/IPACM_Wan.h +++ b/ipacm/inc/IPACM_Wan.h @@ -54,6 +54,8 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef FEATURE_IPA_ANDROID #define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 6 +#define IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6 3 +#define IPA_V2_NUM_MULTICAST_WAN_FILTER_RULE_IPV6 3 #else #define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 3 #endif @@ -128,7 +130,12 @@ public: static bool isWanUP_V6(int ipa_if_num_tether) { #ifdef FEATURE_IPA_ANDROID - int i; +#ifdef FEATURE_IPACM_HAL + /*To avoid -Wall -Werror error */ + IPACMDBG_H("ipa_if_num_tether: %d\n",ipa_if_num_tether); + return wan_up_v6; +#else + uint32_t i; for (i=0; i < ipa_if_num_tether_v6_total;i++) { if (ipa_if_num_tether_v6[i] == ipa_if_num_tether) @@ -140,6 +147,7 @@ public: } } return false; +#endif #else return wan_up_v6; #endif @@ -539,6 +547,8 @@ private: int add_dft_filtering_rule(struct ipa_flt_rule_add* rules, int rule_offset, ipa_ip_type iptype); + int add_tcpv6_filtering_rule(struct ipa_flt_rule_add* rules, int rule_offset); + int install_wan_filtering_rule(bool is_sw_routing); void change_to_network_order(ipa_ip_type iptype, ipa_rule_attrib* attrib); diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp index 52cc985..b8cd382 100644 --- a/ipacm/src/IPACM_Config.cpp +++ b/ipacm/src/IPACM_Config.cpp @@ -88,6 +88,8 @@ const char *ipacm_event_name[] = { __stringify(IPA_WAN_XLAT_CONNECT_EVENT), /* ipacm_event_data_fid */ __stringify(IPA_TETHERING_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */ __stringify(IPA_NETWORK_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */ + __stringify(IPA_DOWNSTREAM_ADD), /* ipacm_event_ipahal_stream */ + __stringify(IPA_DOWNSTREAM_DEL), /* ipacm_event_ipahal_stream */ __stringify(IPA_EXTERNAL_EVENT_MAX), __stringify(IPA_HANDLE_WAN_UP), /* ipacm_event_iface_up */ __stringify(IPA_HANDLE_WAN_DOWN), /* ipacm_event_iface_up */ @@ -501,7 +503,7 @@ int IPACM_Config::DelNatIfaces(char *dev_name) { if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0) { - IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n", + IPACMDBG_H("Found Nat IfaceName: %s with nat-ifaces number: %d\n", pNatIfaces[i].iface_name, ipa_nat_iface_entries); /* Reset the matched entry */ @@ -526,6 +528,26 @@ int IPACM_Config::DelNatIfaces(char *dev_name) return 0; } +int IPACM_Config::CheckNatIfaces(const char *dev_name) +{ + int i = 0; + IPACMDBG_H("Check iface %s from NAT-ifaces, currently it has %d nat ifaces\n", + dev_name, ipa_nat_iface_entries); + + for (i = 0; i < ipa_nat_iface_entries; i++) + { + if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0) + { + IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n", + pNatIfaces[i].iface_name, ipa_nat_iface_entries); + return 0; + } + } + IPACMDBG_H("Can't find Nat IfaceName: %s with total nat-ifaces number: %d\n", + dev_name, ipa_nat_iface_entries); + return -1; +} + /* for IPACM resource manager dependency usage add either Tx or Rx ipa_rm_resource_name and also indicate that endpoint property if valid */ diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp index c020574..533fb53 100644 --- a/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -978,8 +978,13 @@ void NatApp::CacheEntry(const nat_table_entry *rule) } void NatApp::Read_TcpUdp_Timeout(void) { +#ifdef FEATURE_IPACM_HAL + tcp_timeout = 432000; + udp_timeout = 180; + IPACMDBG_H("udp timeout value: %d\n", udp_timeout); + IPACMDBG_H("tcp timeout value: %d\n", tcp_timeout); +#else FILE *udp_fd = NULL, *tcp_fd = NULL; - /* Read UDP timeout value */ udp_fd = fopen(IPACM_UDP_FULL_FILE_NAME, "r"); if (udp_fd == NULL) { @@ -1013,6 +1018,6 @@ fail: if (tcp_fd) { fclose(tcp_fd); } - +#endif return; } diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp index 717f6aa..7ff5e4c 100644 --- a/ipacm/src/IPACM_Iface.cpp +++ b/ipacm/src/IPACM_Iface.cpp @@ -874,7 +874,11 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA) { +#ifdef FEATURE_IPA_V3 + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9); +#else flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<14); +#endif flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1; flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0; flt_rule_entry.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data; @@ -885,7 +889,11 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1; flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP; +#ifdef FEATURE_IPA_V3 + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<7); +#else flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8); +#endif flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1; flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12; diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp index 33ee4e8..7d0f10c 100644 --- a/ipacm/src/IPACM_Lan.cpp +++ b/ipacm/src/IPACM_Lan.cpp @@ -52,7 +52,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IPACM_ConntrackListener.h" #include <sys/ioctl.h> #include <fcntl.h> - +#ifdef FEATURE_IPACM_HAL +#include "IPACM_OffloadManager.h" +#endif bool IPACM_Lan::odu_up = false; IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) @@ -186,6 +188,21 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) memset(is_downstream_set, 0, sizeof(is_downstream_set)); memset(is_upstream_set, 0, sizeof(is_upstream_set)); memset(&prefix, 0, sizeof(prefix)); + +#ifdef FEATURE_IPACM_HAL + /* check if Upstream was set before */ + if (IPACM_Wan::isWanUP(ipa_if_num)) + { + IPACMDBG_H("Upstream was set previously for ipv4, change is_upstream_set flag\n"); + is_upstream_set[IPA_IP_v4] = true; + } + + if (IPACM_Wan::isWanUP_V6(ipa_if_num)) + { + IPACMDBG_H("Upstream was set previously for ipv6, change is_upstream_set flag\n"); + is_upstream_set[IPA_IP_v6] = true; + } +#endif return; } @@ -378,6 +395,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) handle_private_subnet(data->iptype); #endif +#ifndef FEATURE_IPACM_HAL if (IPACM_Wan::isWanUP(ipa_if_num)) { if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX) @@ -418,7 +436,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) } else { IPACMDBG_H("Wan_V6 haven't up yet\n"); } - +#endif /* Post event to NAT */ if (data->iptype == IPA_IP_v4) { @@ -666,7 +684,13 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) 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); + { + /* Only offload clients has same prefix as Andorid gave */ + ipv6_prefix[0] = data->prefix.v6Addr[0]; + ipv6_prefix[1] = data->prefix.v6Addr[1]; + IPACMDBG_H("ipv6_prefix0x%x:%x\n", ipv6_prefix[0], ipv6_prefix[1]); + install_ipv6_prefix_flt_rule(ipv6_prefix); + } if (IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */ { @@ -1065,7 +1089,7 @@ int IPACM_Lan::handle_wan_down(bool is_sta_mode) return IPACM_FAILURE; } - if(is_sta_mode == false) + if(is_sta_mode == false && modem_ul_v4_set == true) { if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES) { @@ -1133,6 +1157,9 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) const int NUM_RULES = 1; int num_ipv6_addr; int res = IPACM_SUCCESS; +#ifdef FEATURE_IPACM_HAL + IPACM_OffloadManager* OffloadMng; +#endif IPACMDBG_H("set route/filter rule ip-type: %d \n", data->iptype); @@ -1298,6 +1325,17 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6); } +#ifdef FEATURE_IPACM_HAL + /* check if having pending add_downstream cache*/ + OffloadMng = IPACM_OffloadManager::GetInstance(); + if (OffloadMng == NULL) { + IPACMERR("failed to get IPACM_OffloadManager instance !\n"); + } else { + IPACMDBG_H(" check iface %s if having add_downstream cache events\n", dev_name); + OffloadMng->search_framwork_cache(dev_name); + } +#endif + IPACMDBG_H("finish route/filter rule ip-type: %d, res(%d)\n", data->iptype, res); fail: @@ -1554,14 +1592,14 @@ int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type) /* only offload UL traffic of certain clients */ #ifdef FEATURE_IPACM_HAL flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_SRC_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = prefix[IPA_IP_v6].v6Mask[0]; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = prefix[IPA_IP_v6].v6Mask[1]; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = prefix[IPA_IP_v6].v6Mask[2]; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = prefix[IPA_IP_v6].v6Mask[3]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = prefix[IPA_IP_v6].v6Addr[0]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = prefix[IPA_IP_v6].v6Addr[1]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = prefix[IPA_IP_v6].v6Addr[2]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = prefix[IPA_IP_v6].v6Addr[3]; + flt_rule_entry.rule.attrib.u.v6.src_addr_mask[0] = ntohl(prefix[IPA_IP_v6].v6Mask[0]); + flt_rule_entry.rule.attrib.u.v6.src_addr_mask[1] = ntohl(prefix[IPA_IP_v6].v6Mask[1]); + flt_rule_entry.rule.attrib.u.v6.src_addr_mask[2] = ntohl(prefix[IPA_IP_v6].v6Mask[2]); + flt_rule_entry.rule.attrib.u.v6.src_addr_mask[3] = ntohl(prefix[IPA_IP_v6].v6Mask[3]); + flt_rule_entry.rule.attrib.u.v6.src_addr[0] = ntohl(prefix[IPA_IP_v6].v6Addr[0]); + flt_rule_entry.rule.attrib.u.v6.src_addr[1] = ntohl(prefix[IPA_IP_v6].v6Addr[1]); + flt_rule_entry.rule.attrib.u.v6.src_addr[2] = ntohl(prefix[IPA_IP_v6].v6Addr[2]); + flt_rule_entry.rule.attrib.u.v6.src_addr[3] = ntohl(prefix[IPA_IP_v6].v6Addr[3]); #endif memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); @@ -1618,7 +1656,7 @@ int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, ui } /* check only add static UL filter rule once */ - if (num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6 && modem_ul_v6_set == false) + if (iptype ==IPA_IP_v6 && modem_ul_v6_set == false) { IPACMDBG_H("IPA_IP_v6 num_dft_rt_v6 %d xlat_mux_id: %d modem_ul_v6_set: %d\n", num_dft_rt_v6, xlat_mux_id, modem_ul_v6_set); ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id); @@ -3109,6 +3147,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp if(flt_rule_entry.rule.eq_attrib.num_offset_meq_32 <= IPA_IPFLTR_NUM_MEQ_32_EQNS) { eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_32 - 1; +#ifdef FEATURE_IPA_V3 if(eq_index == 0) { flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<5); @@ -3117,6 +3156,16 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp { flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<6); } +#else + if(eq_index == 0) + { + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<2); + } + else + { + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3); + } +#endif flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].offset = 12; flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].mask = prefix[IPA_IP_v4].v4Mask; flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].value = prefix[IPA_IP_v4].v4Addr; @@ -3133,6 +3182,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp if(flt_rule_entry.rule.eq_attrib.num_offset_meq_128 <= IPA_IPFLTR_NUM_MEQ_128_EQNS) { eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_128 - 1; +#ifdef FEATURE_IPA_V3 if(eq_index == 0) { flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3); @@ -3141,23 +3191,33 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp { flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<4); } +#else + if(eq_index == 0) + { + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9); + } + else + { + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<10); + } +#endif flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].offset = 8; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 0) - = prefix[IPA_IP_v6].v6Mask[0]; + = prefix[IPA_IP_v6].v6Mask[3]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4) - = prefix[IPA_IP_v6].v6Mask[1]; - *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8) = prefix[IPA_IP_v6].v6Mask[2]; + *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8) + = prefix[IPA_IP_v6].v6Mask[1]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 12) - = prefix[IPA_IP_v6].v6Mask[3]; + = prefix[IPA_IP_v6].v6Mask[0]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 0) - = prefix[IPA_IP_v6].v6Addr[0]; + = prefix[IPA_IP_v6].v6Addr[3]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 4) - = prefix[IPA_IP_v6].v6Addr[1]; - *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8) = prefix[IPA_IP_v6].v6Addr[2]; + *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8) + = prefix[IPA_IP_v6].v6Addr[1]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 12) - = prefix[IPA_IP_v6].v6Addr[3]; + = prefix[IPA_IP_v6].v6Addr[0]; } else { @@ -3253,7 +3313,7 @@ int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode) memset(ipv6_prefix, 0, sizeof(ipv6_prefix)); - if(is_sta_mode == false) + if(is_sta_mode == false && modem_ul_v6_set == true) { if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES) { @@ -5037,6 +5097,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); diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index 332abd5..cf32ff9 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -45,6 +45,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Z #include "IPACM_ConntrackListener.h" #include "IPACM_Iface.h" #include "IPACM_Config.h" +#include <unistd.h> const char *IPACM_OffloadManager::DEVICE_NAME = "/dev/wwan_ioctl"; @@ -56,16 +57,20 @@ IPACM_OffloadManager::IPACM_OffloadManager() 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 ; } RET IPACM_OffloadManager::registerEventListener(IpaEventListener* eventlistener) { RET result = SUCCESS; - if (elrInstance == NULL) + if (elrInstance == NULL) { + IPACMDBG_H("get registerEventListener \n"); + elrInstance = eventlistener; + } else { + IPACMDBG_H("already have EventListener previously, override \n"); elrInstance = eventlistener; - else { - IPACMDBG_H("already register EventListener previously \n"); result = FAIL_INPUT_CHECK; } return SUCCESS; @@ -87,9 +92,12 @@ RET IPACM_OffloadManager::registerCtTimeoutUpdater(ConntrackTimeoutUpdater* time { RET result = SUCCESS; if (touInstance == NULL) + { + IPACMDBG_H("get ConntrackTimeoutUpdater \n"); + touInstance = timeoutupdater; + } else { + IPACMDBG_H("already have ConntrackTimeoutUpdater previously, override \n"); touInstance = timeoutupdater; - else { - IPACMDBG_H("already register ConntrackTimeoutUpdater previously \n"); result = FAIL_INPUT_CHECK; } return SUCCESS; @@ -111,6 +119,8 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups) { IPACM_ConntrackClient *cc; int on = 1, rel; + struct sockaddr_nl local; + unsigned int addr_len; cc = IPACM_ConntrackClient::GetInstance(); @@ -120,8 +130,20 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups) return FAIL_HARDWARE; } + /* check socket name */ + memset(&local, 0, sizeof(struct sockaddr_nl)); + addr_len = sizeof(local); + getsockname(fd, (struct sockaddr *)&local, &addr_len); + IPACMDBG_H(" FD %d, nl_pad %d nl_pid %u\n", fd, local.nl_pad, local.nl_pid); + + /* add the check if getting FDs already or not */ + if(cc->fd_tcp > -1 && cc->fd_udp > -1) { + IPACMDBG_H("has valid FDs fd_tcp %d, fd_udp %d, ignore fd %d.\n", cc->fd_tcp, cc->fd_udp, fd); + return SUCCESS; + } + if (groups == cc->subscrips_tcp) { - cc->fd_tcp = fd; + cc->fd_tcp = dup(fd); IPACMDBG_H("Received fd %d with groups %d.\n", fd, groups); /* set netlink buf */ rel = setsockopt(cc->fd_tcp, SOL_NETLINK, NETLINK_NO_ENOBUFS, &on, sizeof(int) ); @@ -130,7 +152,7 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups) IPACMERR( "setsockopt returned error code %d ( %s )", errno, strerror( errno ) ); } } else if (groups == cc->subscrips_udp) { - cc->fd_udp = fd; + cc->fd_udp = dup(fd); IPACMDBG_H("Received fd %d with groups %d.\n", fd, groups); /* set netlink buf */ rel = setsockopt(cc->fd_tcp, SOL_NETLINK, NETLINK_NO_ENOBUFS, &on, sizeof(int) ); @@ -150,16 +172,9 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups) RET IPACM_OffloadManager::clearAllFds() { - IPACM_ConntrackClient *cc; - - cc = IPACM_ConntrackClient::GetInstance(); - if(!cc) - { - IPACMERR("Init clear: cc %p \n", cc); - return FAIL_HARDWARE; - } - cc->UNRegisterWithConnTrack(); + /* IPACM needs to kee old FDs, can't clear */ + IPACMDBG_H("Still use old Fds, can't clear \n"); return SUCCESS; } @@ -181,6 +196,7 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref ipacm_event_ipahal_stream *evt_data; IPACMDBG_H("addDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam); + if (prefix.fam == V4) { IPACMDBG_H("subnet info v4Addr (%x) v4Mask (%x)\n", prefix.v4Addr, prefix.v4Mask); } else { @@ -190,11 +206,62 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref prefix.v6Mask[0], prefix.v6Mask[1], prefix.v6Mask[2], prefix.v6Mask[3]); } + /* check if netdev valid on device */ if(ipa_get_if_index(downstream_name, &index)) { IPACMERR("fail to get iface index.\n"); + return FAIL_INPUT_CHECK; + } + + /* check if downstream netdev driver finished its configuration on IPA-HW */ + if (IPACM_Iface::ipacmcfg->CheckNatIfaces(downstream_name)) + { + IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name); + /* copy to the cache */ + 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, downstream_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.fam == 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; + 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); return FAIL_HARDWARE; } + } + + return SUCCESS; + } evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream)); if(evt_data == NULL) @@ -267,7 +334,6 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g IPACMERR("no previous upstream set before\n"); return FAIL_INPUT_CHECK; } - if (gw_addr_v4.fam == V4 && upstream_v4_up == true) { IPACMDBG_H("clean upstream(%s) for ipv4-fam(%d) upstream_v4_up(%d)\n", upstream_name, gw_addr_v4.fam, upstream_v4_up); post_route_evt(IPA_IP_v4, default_gw_index, IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, gw_addr_v4); @@ -282,12 +348,60 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g } else { + /* check if netdev valid on device */ if(ipa_get_if_index(upstream_name, &index)) { IPACMERR("fail to get iface index.\n"); return FAIL_INPUT_CHECK; } + /* check if downstream netdev driver finished its configuration on IPA-HW */ + if (IPACM_Iface::ipacmcfg->CheckNatIfaces(upstream_name)) + { + IPACMDBG_H("setUpstream name(%s) currently not support in ipa \n", upstream_name); + /* copy to the cache */ + 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_WAN_UPSTREAM_ROUTE_ADD_EVENT; + memcpy(event_cache[latest_cache_index].dev_name, upstream_name, sizeof(event_cache[latest_cache_index].dev_name)); + memcpy(&event_cache[latest_cache_index].prefix_cache, &gw_addr_v4, sizeof(event_cache[latest_cache_index].prefix_cache)); + memcpy(&event_cache[latest_cache_index].prefix_cache_v6, &gw_addr_v6, sizeof(event_cache[latest_cache_index].prefix_cache_v6)); + if (gw_addr_v4.fam == V4) { + IPACMDBG_H("cache event(%d) ipv4 fateway: (%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].dev_name, + latest_cache_index); + } + + if (gw_addr_v6.fam == V6) + { + IPACMDBG_H("cache event (%d) ipv6 gateway: %08x:%08x:%08x:%08x dev(%s) on entry(%d)\n", + event_cache[latest_cache_index].event, + event_cache[latest_cache_index].prefix_cache_v6.v6Addr[0], + event_cache[latest_cache_index].prefix_cache_v6.v6Addr[1], + event_cache[latest_cache_index].prefix_cache_v6.v6Addr[2], + event_cache[latest_cache_index].prefix_cache_v6.v6Addr[3], + event_cache[latest_cache_index].dev_name, + latest_cache_index); + } + latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE; + 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); + return FAIL_HARDWARE; + } + } + return SUCCESS; + } + /* reset the stats when switch from LTE->STA */ if (index != default_gw_index) { IPACMDBG_H(" interface switched to %s\n", upstream_name); @@ -362,7 +476,13 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g RET IPACM_OffloadManager::stopAllOffload() { - return SUCCESS; + Prefix v4gw, v6gw; + 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); } RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, uint64_t mb/* limit */) @@ -538,3 +658,36 @@ IPACM_OffloadManager* IPACM_OffloadManager::GetInstance() return pInstance; } + +bool IPACM_OffloadManager::search_framwork_cache(char * interface_name) +{ + bool rel = false; + + /* IPACM needs to kee old FDs, can't clear */ + IPACMDBG_H("check netdev(%s)\n", interface_name); + + for(int i = 0; i < MAX_EVENT_CACHE ;i++) + { + if(event_cache[i].valid == true) + { + //do the compare + if (strncmp(event_cache[i].dev_name, + interface_name, + sizeof(event_cache[i].dev_name)) == 0) + { + IPACMDBG_H("found netdev (%s) in entry (%d) with event (%d)\n", interface_name, i, event_cache[i].event); + /* post event again */ + if (event_cache[i].event == IPA_DOWNSTREAM_ADD) + addDownstream(interface_name, event_cache[i].prefix_cache); + else if (event_cache[i].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) + setUpstream(interface_name, event_cache[i].prefix_cache, event_cache[i].prefix_cache_v6); + else + IPACMERR("wrong event cached (%d)", event_cache[i].event); + event_cache[i].valid = false; + rel = true; + } + } + } + IPACMDBG_H(" not found netdev (%s) has cached event\n", interface_name); + return rel; +} diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp index d0a0ab5..5780f72 100644 --- a/ipacm/src/IPACM_Wan.cpp +++ b/ipacm/src/IPACM_Wan.cpp @@ -50,6 +50,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IPACM_Defs.h" #include <IPACM_ConntrackListener.h> #include "linux/ipa_qmi_service_v01.h" +#ifdef FEATURE_IPACM_HAL +#include "IPACM_OffloadManager.h" +#endif bool IPACM_Wan::wan_up = false; bool IPACM_Wan::wan_up_v6 = false; @@ -200,8 +203,11 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) struct ipa_ioc_get_hdr hdr; const int NUM_RULES = 1; - int num_ipv6_addr, len; - int res = IPACM_SUCCESS; + uint32_t num_ipv6_addr; + int res = IPACM_SUCCESS,len; +#ifdef FEATURE_IPACM_HAL + IPACM_OffloadManager* OffloadMng; +#endif memset(&hdr, 0, sizeof(hdr)); if(tx_prop == NULL || rx_prop == NULL) @@ -501,6 +507,16 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) IPACMDBG_H("Receved wan ipv4-addr:0x%x\n",wan_v4_addr); } +#ifdef FEATURE_IPACM_HAL + /* check if having pending add_downstream cache*/ + OffloadMng = IPACM_OffloadManager::GetInstance(); + if (OffloadMng == NULL) { + IPACMERR("failed to get IPACM_OffloadManager instance !\n"); + } else { + IPACMDBG_H(" check iface %s if having add_downstream cache events\n", dev_name); + OffloadMng->search_framwork_cache(dev_name); + } +#endif IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6); fail: @@ -3468,6 +3484,9 @@ int IPACM_Wan::config_wan_firewall_rule(ipa_ip_type iptype) } else if(iptype == IPA_IP_v6) { +#ifdef FEATURE_IPA_ANDROID + add_tcpv6_filtering_rule(flt_rule_v6, IPACM_Wan::num_v6_flt_rule); +#endif IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6; if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6)) { @@ -3715,8 +3734,44 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); -#ifdef FEATURE_IPA_ANDROID - IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6); + 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); + } + +fail: + return res; +} + +int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule_offset) +{ + struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx; + struct ipa_flt_rule_add flt_rule_entry; + struct ipa_ioc_generate_flt_eq flt_eq; + int res = IPACM_SUCCESS; + + if(rules == NULL) + { + IPACMERR("No filtering table available.\n"); + return IPACM_FAILURE; + } + if(rx_prop == NULL) + { + IPACMERR("No tx property.\n"); + return IPACM_FAILURE; + } + + memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); + strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); + rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; + rt_tbl_idx.ip = IPA_IP_v6; + if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) + { + IPACMERR("Failed to get routing table index from name\n"); + res = IPACM_FAILURE; + goto fail; + } + + IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); flt_rule_entry.at_rear = true; @@ -3725,39 +3780,58 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o 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_ROUTING; flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap = 0; + IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6); + + memcpy(&flt_rule_entry.rule.attrib, + &rx_prop->rx[0].attrib, + sizeof(flt_rule_entry.rule.attrib)); + memset(&flt_eq, 0, sizeof(flt_eq)); + memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); + flt_eq.ip = IPA_IP_v6; + if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) + { + IPACMERR("Failed to get eq_attrib\n"); + res = IPACM_FAILURE; + goto fail; + } + + memcpy(&flt_rule_entry.rule.eq_attrib, + &flt_eq.eq_attrib, + sizeof(flt_rule_entry.rule.eq_attrib)); 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; +#ifdef FEATURE_IPA_V3 + flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<7); +#else flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8); +#endif flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1; flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12; /* 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(&(rules[rule_offset + 3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + memcpy(&(rules[rule_offset]), &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(&(rules[rule_offset + 4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); + memcpy(&(rules[rule_offset + 1]), &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(&(rules[rule_offset + 5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); -#endif + memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - 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); - } + 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); fail: return res; diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index 4923199..03b5925 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -268,6 +268,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) handle_private_subnet(data->iptype); #endif +#ifndef FEATURE_IPACM_HAL if (IPACM_Wan::isWanUP(ipa_if_num)) { if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX) @@ -309,6 +310,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) } else { IPACMDBG_H("Wan_V6 haven't up yet \n"); } +#endif /* checking if SW-RT_enable */ if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true) { @@ -536,7 +538,13 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) 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); + { + /* Only offload clients has same prefix as Android gave */ + ipv6_prefix[0] = data->prefix.v6Addr[0]; + ipv6_prefix[1] = data->prefix.v6Addr[1]; + IPACMDBG_H("ipv6_prefix0x%x:%x\n", ipv6_prefix[0], ipv6_prefix[1]); + install_ipv6_prefix_flt_rule(ipv6_prefix); + } if (IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */ { @@ -1258,6 +1266,7 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data) memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0) { IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n"); + IPACMDBG_H("ipv6 address: 0x%x:%x ipv6_prefix0x%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], ipv6_prefix[0], ipv6_prefix[1]); return IPACM_FAILURE; } |