From 202589a3dab4221d8962895885fba801df0bc374 Mon Sep 17 00:00:00 2001 From: Thierry Strudel Date: Wed, 23 Aug 2017 15:18:48 -0700 Subject: msm8998: Update to 07.00.00.279.357 msm8998: from vendor/qcom/opensource/data-ipa-cfg-mgr c1e3b7f Promotion of data.lnx.6.4.9-00069. dc73d54 IPA HAL: Input Checks d863529 Promotion of data.lnx.6.4.9-00061. 030a953 ipacm: Add flag -Wall -Werror and fix warnings 5851418 Promotion of data.lnx.6.4.9-00055. d029272 Merge "ipacm: fix the heap-use-after-free issue on bootup" 19606a4 Merge "ipacm: ignore removeDownstream request if netdev down" 69e5c0f ipacm: fix the heap-use-after-free issue on bootup 26beced ipacm: ignore removeDownstream request if netdev down Test: build, boot, sanity checks Bug: 64986220 Change-Id: I95154ea39cbb9b8d6b00e32097c2de6c31368253 Signed-off-by: Thierry Strudel --- msm8998/ipacm/inc/IPACM_Iface.h | 2 +- msm8998/ipacm/inc/IPACM_Lan.h | 2 +- msm8998/ipacm/inc/IPACM_Wan.h | 12 +++--- msm8998/ipacm/inc/IPACM_Wlan.h | 2 +- msm8998/ipacm/src/Android.mk | 2 +- msm8998/ipacm/src/IPACM_CmdQueue.cpp | 2 + msm8998/ipacm/src/IPACM_ConntrackClient.cpp | 5 ++- msm8998/ipacm/src/IPACM_ConntrackListener.cpp | 2 +- msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp | 3 +- msm8998/ipacm/src/IPACM_Filtering.cpp | 3 +- msm8998/ipacm/src/IPACM_Iface.cpp | 2 - msm8998/ipacm/src/IPACM_IfaceManager.cpp | 4 +- msm8998/ipacm/src/IPACM_Lan.cpp | 58 +++++++++++++++++---------- msm8998/ipacm/src/IPACM_Log.cpp | 9 +---- msm8998/ipacm/src/IPACM_Main.cpp | 21 +++++++--- msm8998/ipacm/src/IPACM_Netlink.cpp | 30 +++++++------- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 12 +++--- msm8998/ipacm/src/IPACM_Wan.cpp | 55 ++++++++++++------------- msm8998/ipacm/src/IPACM_Wlan.cpp | 27 ++++++++----- 19 files changed, 142 insertions(+), 111 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/inc/IPACM_Iface.h b/msm8998/ipacm/inc/IPACM_Iface.h index 43b0da6..0d714c8 100644 --- a/msm8998/ipacm/inc/IPACM_Iface.h +++ b/msm8998/ipacm/inc/IPACM_Iface.h @@ -97,7 +97,7 @@ public: bool softwarerouting_act; /* IPACM number of default route rules for ipv6*/ - int num_dft_rt_v6; + uint32_t num_dft_rt_v6; uint32_t dft_v4fl_rule_hdl[IPV4_DEFAULT_FILTERTING_RULES]; uint32_t dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES]; diff --git a/msm8998/ipacm/inc/IPACM_Lan.h b/msm8998/ipacm/inc/IPACM_Lan.h index 85ea927..7957154 100644 --- a/msm8998/ipacm/inc/IPACM_Lan.h +++ b/msm8998/ipacm/inc/IPACM_Lan.h @@ -247,7 +247,7 @@ private: int header_name_count; - int num_eth_client; + uint32_t num_eth_client; NatApp *Nat_App; diff --git a/msm8998/ipacm/inc/IPACM_Wan.h b/msm8998/ipacm/inc/IPACM_Wan.h index 3ed58fe..fbfaba3 100644 --- a/msm8998/ipacm/inc/IPACM_Wan.h +++ b/msm8998/ipacm/inc/IPACM_Wan.h @@ -105,10 +105,12 @@ public: { #ifdef FEATURE_IPA_ANDROID #ifdef FEATURE_IPACM_HAL + /*To avoid -Wall -Werror error */ + IPACMDBG_H("ipa_if_num_tether: %d\n",ipa_if_num_tether); return wan_up; #else - int i; + uint32_t i; for (i=0; i < ipa_if_num_tether_v4_total;i++) { if (ipa_if_num_tether_v4[i] == ipa_if_num_tether) @@ -129,7 +131,7 @@ public: static bool isWanUP_V6(int ipa_if_num_tether) { #ifdef FEATURE_IPA_ANDROID - int i; + 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) @@ -179,9 +181,9 @@ public: } #ifdef FEATURE_IPA_ANDROID /* IPACM interface id */ - static int ipa_if_num_tether_v4_total; + static uint32_t ipa_if_num_tether_v4_total; static int ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES]; - static int ipa_if_num_tether_v6_total; + static uint32_t ipa_if_num_tether_v6_total; static int ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES]; #endif @@ -235,7 +237,7 @@ private: int wan_client_len; ipa_wan_client *wan_client; int header_name_count; - int num_wan_client; + uint32_t num_wan_client; uint8_t invalid_mac[IPA_MAC_ADDR_SIZE]; bool is_xlat; diff --git a/msm8998/ipacm/inc/IPACM_Wlan.h b/msm8998/ipacm/inc/IPACM_Wlan.h index eb911ac..5fee0fa 100644 --- a/msm8998/ipacm/inc/IPACM_Wlan.h +++ b/msm8998/ipacm/inc/IPACM_Wlan.h @@ -101,7 +101,7 @@ private: ipa_wlan_client *wlan_client; int header_name_count; - int num_wifi_client; + uint32_t num_wifi_client; int wlan_ap_index; diff --git a/msm8998/ipacm/src/Android.mk b/msm8998/ipacm/src/Android.mk index 3302564..d6bf34d 100644 --- a/msm8998/ipacm/src/Android.mk +++ b/msm8998/ipacm/src/Android.mk @@ -30,7 +30,7 @@ endif LOCAL_CFLAGS := -v LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID -LOCAL_CFLAGS += -DFEATURE_IPACM_HAL +LOCAL_CFLAGS += -DFEATURE_IPACM_HAL -Wall -Werror ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) LOCAL_CFLAGS += -DDEBUG endif diff --git a/msm8998/ipacm/src/IPACM_CmdQueue.cpp b/msm8998/ipacm/src/IPACM_CmdQueue.cpp index a17fb08..c612b7f 100644 --- a/msm8998/ipacm/src/IPACM_CmdQueue.cpp +++ b/msm8998/ipacm/src/IPACM_CmdQueue.cpp @@ -122,6 +122,8 @@ void* MessageQueue::Process(void *param) MessageQueue *MsgQueueInternal = NULL; MessageQueue *MsgQueueExternal = NULL; Message *item = NULL; + param = NULL; + IPACMDBG("MessageQueue::Process()\n"); MsgQueueInternal = MessageQueue::getInstanceInternal(); diff --git a/msm8998/ipacm/src/IPACM_ConntrackClient.cpp b/msm8998/ipacm/src/IPACM_ConntrackClient.cpp index ffb0088..d8f7f73 100644 --- a/msm8998/ipacm/src/IPACM_ConntrackClient.cpp +++ b/msm8998/ipacm/src/IPACM_ConntrackClient.cpp @@ -104,6 +104,7 @@ int IPACM_ConntrackClient::IPAConntrackEventCB ipacm_cmd_q_data evt_data; ipacm_ct_evt_data *ct_data; uint8_t ip_type = 0; + data = NULL; IPACMDBG("Event callback called with msgtype: %d\n",type); @@ -175,7 +176,7 @@ int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Bridge_Addrs if(strlen(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name) >= sizeof(ifr.ifr_name)) { - IPACMERR("interface name overflows: len %d\n", + IPACMERR("interface name overflows: len %zu\n", strlen(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name)); close(fd); return -1; @@ -388,6 +389,7 @@ void* IPACM_ConntrackClient::UDPConnTimeoutUpdate(void *ptr) { NatApp *nat_inst = NULL; + ptr = NULL; #ifdef IPACM_DEBUG IPACMDBG("\n"); #endif @@ -601,7 +603,6 @@ ctcatch: /* Thread to initialize TCP Conntrack Filters*/ void IPACM_ConntrackClient::UNRegisterWithConnTrack(void) { - int ret; IPACM_ConntrackClient *pClient = NULL; IPACMDBG("\n"); diff --git a/msm8998/ipacm/src/IPACM_ConntrackListener.cpp b/msm8998/ipacm/src/IPACM_ConntrackListener.cpp index de0e7e7..4f83b3d 100644 --- a/msm8998/ipacm/src/IPACM_ConntrackListener.cpp +++ b/msm8998/ipacm/src/IPACM_ConntrackListener.cpp @@ -142,7 +142,7 @@ void IPACM_ConntrackListener::event_callback(ipa_cm_event_id evt, int IPACM_ConntrackListener::CheckNatIface( ipacm_event_data_all *data, bool *NatIface) { - int fd = 0, len = 0, cnt, i, j; + int fd = 0, len = 0, cnt, i; struct ifreq ifr; *NatIface = false; diff --git a/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp index a831f8e..a22a026 100644 --- a/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -402,17 +402,16 @@ int NatApp::AddEntry(const nat_table_entry *rule) void NatApp::UpdateCTUdpTs(nat_table_entry *rule, uint32_t new_ts) { - int ret; #ifdef FEATURE_IPACM_HAL IOffloadManager::ConntrackTimeoutUpdater::natTimeoutUpdate_t entry; IPACM_OffloadManager* OffloadMng; #endif - iptodot("Private IP:", rule->private_ip); iptodot("Target IP:", rule->target_ip); IPACMDBG("Private Port: %d, Target Port: %d\n", rule->private_port, rule->target_port); #ifndef FEATURE_IPACM_HAL + int ret; if(!ct_hdl) { ct_hdl = nfct_open(CONNTRACK, 0); diff --git a/msm8998/ipacm/src/IPACM_Filtering.cpp b/msm8998/ipacm/src/IPACM_Filtering.cpp index 22eb19c..260871f 100644 --- a/msm8998/ipacm/src/IPACM_Filtering.cpp +++ b/msm8998/ipacm/src/IPACM_Filtering.cpp @@ -264,6 +264,7 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r ipa_install_fltr_rule_req_ex_msg_v01 qmi_rule_ex_msg; #endif + memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg)); int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); if(fd_wwan_ioctl < 0) { @@ -292,8 +293,6 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r } else { - memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg)); - if (num_rules > 0) { qmi_rule_msg.filter_spec_list_valid = true; diff --git a/msm8998/ipacm/src/IPACM_Iface.cpp b/msm8998/ipacm/src/IPACM_Iface.cpp index 84132c9..0582d67 100644 --- a/msm8998/ipacm/src/IPACM_Iface.cpp +++ b/msm8998/ipacm/src/IPACM_Iface.cpp @@ -237,8 +237,6 @@ fail: int IPACM_Iface::handle_software_routing_disable(void) { int res = IPACM_SUCCESS; - ipa_ip_type ip; - uint32_t flt_hdl; if (rx_prop == NULL) { diff --git a/msm8998/ipacm/src/IPACM_IfaceManager.cpp b/msm8998/ipacm/src/IPACM_IfaceManager.cpp index eab43fd..17f546d 100644 --- a/msm8998/ipacm/src/IPACM_IfaceManager.cpp +++ b/msm8998/ipacm/src/IPACM_IfaceManager.cpp @@ -72,7 +72,9 @@ void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param) ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param; ipacm_event_data_mac *StaData = (ipacm_event_data_mac *)param; ipacm_event_data_all *data_all = (ipacm_event_data_all *)param; - ipacm_ifacemgr_data ifmgr_data = {0}; + ipacm_ifacemgr_data ifmgr_data; + + memset(&ifmgr_data,0,sizeof(ifmgr_data)); switch(event) { diff --git a/msm8998/ipacm/src/IPACM_Lan.cpp b/msm8998/ipacm/src/IPACM_Lan.cpp index 8d853d2..36d4b74 100644 --- a/msm8998/ipacm/src/IPACM_Lan.cpp +++ b/msm8998/ipacm/src/IPACM_Lan.cpp @@ -65,7 +65,8 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) odu_route_rule_v4_hdl = NULL; odu_route_rule_v6_hdl = NULL; eth_client = NULL; - int i, m_fd_odu, ret = IPACM_SUCCESS; + int m_fd_odu, ret = IPACM_SUCCESS; + uint32_t i; Nat_App = NatApp::GetInstance(); if (Nat_App == NULL) @@ -204,7 +205,6 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) int ipa_interface_index; ipacm_ext_prop* ext_prop; - ipacm_event_iface_up* data_wan; ipacm_event_iface_up_tehter* data_wan_tether; switch (event) @@ -706,7 +706,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) case IPA_HANDLE_WAN_UP: IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n"); - data_wan = (ipacm_event_iface_up*)param; + ipacm_event_iface_up* data_wan = (ipacm_event_iface_up*)param; if (data_wan == NULL) { IPACMERR("No event data is found.\n"); @@ -955,7 +955,7 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data) if(data->iptype == IPA_IP_v6) { if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) + (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) { IPACMDBG_H("ipv6 address got: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); for(num_v6=0;num_v6 < get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++) @@ -970,6 +970,11 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data) } } } + else + { + IPACMDBG_H("Invalid ipv6 address\n"); + return IPACM_FAILURE; + } if (num_v6 == IPV6_NUM_ADDR) { IPACMDBG_H("ipv6 addr is not found. \n"); @@ -994,7 +999,7 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data) get_client_memptr(eth_client, clnt_indx)->ipv6_set--; get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6--; - for(num_v6;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++) + for(;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++) { get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] = get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][0]; @@ -1093,7 +1098,7 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) struct ipa_ioc_add_rt_rule *rt_rule; struct ipa_rt_rule_add *rt_rule_entry; const int NUM_RULES = 1; - int num_ipv6_addr; + uint32_t num_ipv6_addr; int res = IPACM_SUCCESS; IPACMDBG_H("set route/filter rule ip-type: %d \n", data->iptype); @@ -1539,7 +1544,8 @@ int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type) int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id) { - int fd, ret = IPACM_SUCCESS, cnt; + int fd, ret = IPACM_SUCCESS; + uint32_t cnt; IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg; struct ipa_ioc_write_qmapid mux; @@ -1703,7 +1709,7 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr) pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1711,7 +1717,7 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr) snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1803,14 +1809,14 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr) pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1923,7 +1929,7 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data) else { if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ + (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */ { IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) && @@ -1961,6 +1967,11 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data) return IPACM_FAILURE; /* not setup the RT rules*/ } } + else + { + IPACMDBG_H("Invalid IPV6 address\n"); + return IPACM_FAILURE; + } } return IPACM_SUCCESS; @@ -2626,7 +2637,7 @@ int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr) /*handle LAN iface down event*/ int IPACM_Lan::handle_down_evt() { - int i; + uint32_t i; int res = IPACM_SUCCESS; IPACMDBG_H("lan handle_down_evt\n "); @@ -3377,7 +3388,8 @@ void IPACM_Lan::post_del_self_evt() /*handle reset usb-client rt-rules */ int IPACM_Lan::handle_lan_client_reset_rt(ipa_ip_type iptype) { - int i, res = IPACM_SUCCESS; + uint32_t i; + int res = IPACM_SUCCESS; /* clean eth-client routing rules */ IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client); @@ -3943,7 +3955,8 @@ int IPACM_Lan::handle_cradle_wan_mode_switch(bool is_wan_bridge_mode) /*handle reset usb-client rt-rules */ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data) { - int cnt, pipe_len, fd; + int fd; + uint32_t pipe_len, cnt; uint64_t num_ul_packets, num_ul_bytes; uint64_t num_dl_packets, num_dl_bytes; bool ul_pipe_found, dl_pipe_found; @@ -3974,7 +3987,7 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat for (cnt=0; cntnum_tx_props; cnt++) { IPACMDBG_H("Check Tx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe)); - if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == data->dl_dst_pipe_stats_list[pipe_len].pipe_index) + if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == (int)data->dl_dst_pipe_stats_list[pipe_len].pipe_index) { /* update the DL stats */ dl_pipe_found = true; @@ -4001,7 +4014,8 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat for (cnt=0; cnt < rx_prop->num_rx_props; cnt++) { IPACMDBG_H("Check Rx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe)); - if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == data->ul_src_pipe_stats_list[pipe_len].pipe_index) + //Typecasting to avoid -Wall -Werror errors + if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == (int)data->ul_src_pipe_stats_list[pipe_len].pipe_index) { /* update the UL stats */ ul_pipe_found = true; @@ -4051,7 +4065,8 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat /*handle tether client */ int IPACM_Lan::handle_tethering_client(bool reset, ipacm_client_enum ipa_client) { - int cnt, fd, ret = IPACM_SUCCESS; + int fd, ret = IPACM_SUCCESS; + uint32_t cnt; int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); wan_ioctl_set_tether_client_pipe tether_client; @@ -4185,10 +4200,10 @@ end: int IPACM_Lan::eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl, ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count) { - int i, len, res = IPACM_SUCCESS; + int len, res = IPACM_SUCCESS; + uint32_t i, position, num_rt_rule; struct ipa_ioc_add_rt_rule* rt_rule_table = NULL; struct ipa_rt_rule_add rt_rule; - int position, num_rt_rule; IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); @@ -4281,7 +4296,8 @@ int IPACM_Lan::eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl { struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL; struct ipa_rt_rule_mdfy *rt_rule_entry; - int len, index, res = IPACM_SUCCESS; + int len, res = IPACM_SUCCESS; + uint32_t index; if(tx_prop == NULL) { diff --git a/msm8998/ipacm/src/IPACM_Log.cpp b/msm8998/ipacm/src/IPACM_Log.cpp index 20dd26c..d0bd108 100644 --- a/msm8998/ipacm/src/IPACM_Log.cpp +++ b/msm8998/ipacm/src/IPACM_Log.cpp @@ -50,13 +50,8 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -void logmessage(int log_level) -{ - return; -} - /* start IPACMDIAG socket*/ -int create_socket(unsigned int *sockfd) +int create_socket(int *sockfd) { if ((*sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == IPACM_FAILURE) @@ -78,7 +73,7 @@ void ipacm_log_send( void * user_data) ipacm_log_buffer_t ipacm_log_buffer; int numBytes=0, len; struct sockaddr_un ipacmlog_socket; - static unsigned int ipacm_log_sockfd = 0; + static int ipacm_log_sockfd = 0; if(ipacm_log_sockfd == 0) { diff --git a/msm8998/ipacm/src/IPACM_Main.cpp b/msm8998/ipacm/src/IPACM_Main.cpp index 16ec73a..8f98988 100644 --- a/msm8998/ipacm/src/IPACM_Main.cpp +++ b/msm8998/ipacm/src/IPACM_Main.cpp @@ -106,9 +106,17 @@ bool ipacm_logging = true; void ipa_is_ipacm_running(void); int ipa_get_if_index(char *if_name, int *if_index); +IPACM_Neighbor *neigh; +IPACM_IfaceManager *ifacemgr; +#ifdef FEATURE_IPACM_HAL + IPACM_OffloadManager* OffloadMng; + HAL *hal; +#endif + /* start netlink socket monitor*/ void* netlink_start(void *param) { + param = NULL; ipa_nl_sk_fd_set_info_t sk_fdset; int ret_val = 0; memset(&sk_fdset, 0, sizeof(ipa_nl_sk_fd_set_info_t)); @@ -137,6 +145,7 @@ void* firewall_monitor(void *param) ipacm_cmd_q_data evt_data; uint32_t mask = IN_MODIFY | IN_MOVE; + param = NULL; inotify_fd = inotify_init(); if (inotify_fd < 0) { @@ -236,6 +245,7 @@ void* ipa_driver_msg_notifier(void *param) ipacm_cmd_q_data new_neigh_evt; ipacm_event_data_all* new_neigh_data; + param = NULL; fd = open(IPA_DRIVER, O_RDWR); if (fd < 0) { @@ -728,7 +738,6 @@ void* ipa_driver_msg_notifier(void *param) void IPACM_Sig_Handler(int sig) { - int cnt; ipacm_cmd_q_data evt_data; printf("Received Signal: %d\n", sig); @@ -767,17 +776,19 @@ 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; - IPACM_OffloadManager* OffloadMng; /* check if ipacm is already running or not */ ipa_is_ipacm_running(); IPACMDBG_H("In main()\n"); - IPACM_Neighbor *neigh = new IPACM_Neighbor(); - IPACM_IfaceManager *ifacemgr = new IPACM_IfaceManager(); + (void)argc; + (void)argv; + + neigh = new IPACM_Neighbor(); + ifacemgr = new IPACM_IfaceManager(); #ifdef FEATURE_IPACM_HAL OffloadMng = IPACM_OffloadManager::GetInstance(); - HAL *hal = HAL::makeIPAHAL(1, OffloadMng); + hal = HAL::makeIPAHAL(1, OffloadMng); IPACMDBG_H(" START IPACM_OffloadManager and link to android framework\n"); #endif diff --git a/msm8998/ipacm/src/IPACM_Netlink.cpp b/msm8998/ipacm/src/IPACM_Netlink.cpp index a971b8e..b2b26db 100644 --- a/msm8998/ipacm/src/IPACM_Netlink.cpp +++ b/msm8998/ipacm/src/IPACM_Netlink.cpp @@ -607,7 +607,7 @@ static int ipa_nl_decode_nlmsg ) { char dev_name[IF_NAME_LEN]={0}; - int ret_val, mask_value, mask_index, mask_value_v6; + int ret_val, mask_index, mask_value_v6; struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; uint32_t if_ipv4_addr =0, if_ipipv4_addr_mask =0, temp =0, if_ipv4_addr_gw =0; @@ -689,12 +689,12 @@ static int ipa_nl_decode_nlmsg /* Add IPACM support for ECM plug-in/plug_out */ /*-------------------------------------------------------------------------- - Check if the interface is running.If its a RTM_NEWLINK and the interface - is running then it means that its a link up event - ---------------------------------------------------------------------------*/ - if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) && - (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) - { + Check if the interface is running.If its a RTM_NEWLINK and the interface + is running then it means that its a link up event + ---------------------------------------------------------------------------*/ + if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) && + (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) + { data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); if(data_fid == NULL) @@ -712,17 +712,17 @@ static int ipa_nl_decode_nlmsg } IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - /*-------------------------------------------------------------------------- - Post LAN iface (ECM) link up event - ---------------------------------------------------------------------------*/ - evt_data.event = IPA_USB_LINK_UP_EVENT; + /*-------------------------------------------------------------------------- + Post LAN iface (ECM) link up event + ---------------------------------------------------------------------------*/ + evt_data.event = IPA_USB_LINK_UP_EVENT; evt_data.evt_data = data_fid; IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n", data_fid->if_index); IPACM_EvtDispatcher::PostEvt(&evt_data); - } - else if(!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) - { + } + else if (!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) + { data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); if(data_fid == NULL) { @@ -747,7 +747,7 @@ static int ipa_nl_decode_nlmsg IPACMDBG_H("Posting usb IPA_LINK_DOWN_EVENT with if index: %d\n", data_fid->if_index); IPACM_EvtDispatcher::PostEvt(&evt_data); - } + } } break; diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index 332abd5..95e44bf 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -226,8 +226,8 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P IPACMDBG_H("removeDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam); if(ipa_get_if_index(downstream_name, &index)) { - IPACMERR("fail to get iface index.\n"); - return FAIL_HARDWARE; + IPACMERR("netdev(%s) already removed, ignored\n", downstream_name); + return SUCCESS; } evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream)); @@ -254,8 +254,6 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& gw_addr_v4 , const Prefix& gw_addr_v6) { int index; - ipacm_cmd_q_data evt; - ipacm_event_data_addr *evt_data_addr; RET result = SUCCESS; /* if interface name is NULL, default route is removed */ @@ -386,7 +384,7 @@ RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, ui return FAIL_INPUT_CHECK; } - IPACMDBG_H("SET_DATA_QUOTA %s %lld", quota.interface_name, mb); + IPACMDBG_H("SET_DATA_QUOTA %s %lu", quota.interface_name, mb); if (ioctl(fd, WAN_IOC_SET_DATA_QUOTA, "a) < 0) { IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s", strerror(errno)); @@ -427,7 +425,7 @@ RET IPACM_OffloadManager::getStats(const char * upstream_name /* upstream */, offload_stats.tx = stats.tx_bytes; offload_stats.rx = stats.rx_bytes; - IPACMDBG_H("send getStats tx:%lld rx:%lld \n", offload_stats.tx, offload_stats.rx); + IPACMDBG_H("send getStats tx:%lu rx:%lu \n", offload_stats.tx, offload_stats.rx); return SUCCESS; } @@ -482,7 +480,7 @@ int IPACM_OffloadManager::ipa_get_if_index(const char * if_name, int * if_index) } if(strnlen(if_name, sizeof(if_name)) >= sizeof(ifr.ifr_name)) { - IPACMERR("interface name overflows: len %d\n", strnlen(if_name, sizeof(if_name))); + IPACMERR("interface name overflows: len %zu\n", strnlen(if_name, sizeof(if_name))); close(fd); return IPACM_FAILURE; } diff --git a/msm8998/ipacm/src/IPACM_Wan.cpp b/msm8998/ipacm/src/IPACM_Wan.cpp index 0a52ad5..4c4ad69 100644 --- a/msm8998/ipacm/src/IPACM_Wan.cpp +++ b/msm8998/ipacm/src/IPACM_Wan.cpp @@ -76,8 +76,8 @@ bool IPACM_Wan::backhaul_is_wan_bridge = false; uint32_t IPACM_Wan::backhaul_ipv6_prefix[2]; #ifdef FEATURE_IPA_ANDROID -int IPACM_Wan::ipa_if_num_tether_v4_total = 0; -int IPACM_Wan::ipa_if_num_tether_v6_total = 0; +uint32_t IPACM_Wan::ipa_if_num_tether_v4_total = 0; +uint32_t IPACM_Wan::ipa_if_num_tether_v6_total = 0; int IPACM_Wan::ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES]; int IPACM_Wan::ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES]; @@ -93,6 +93,7 @@ IPACM_Wan::IPACM_Wan(int iface_index, wan_route_rule_v6_hdl = NULL; wan_route_rule_v6_hdl_a5 = NULL; wan_client = NULL; + mac_addr = NULL; if(iface_query != NULL) { @@ -193,15 +194,15 @@ IPACM_Wan::~IPACM_Wan() /* handle new_address event */ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) { - struct ipa_ioc_add_rt_rule *rt_rule; + struct ipa_ioc_add_rt_rule *rt_rule = NULL; struct ipa_rt_rule_add *rt_rule_entry; struct ipa_ioc_add_flt_rule *flt_rule; struct ipa_flt_rule_add flt_rule_entry; 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; memset(&hdr, 0, sizeof(hdr)); if(tx_prop == NULL || rx_prop == NULL) @@ -544,7 +545,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) if ((ipa_interface_index == ipa_if_num) && (m_is_sta_mode == Q6_WAN)) { is_xlat = true; - IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: \n", + IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,data->if_index, is_xlat); } break; @@ -1077,7 +1078,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) } else if (data->iptype == IPA_IP_v6) { - for (int num_ipv6_addr = 0; num_ipv6_addr < num_dft_rt_v6; num_ipv6_addr++) + for (uint32_t num_ipv6_addr = 0; num_ipv6_addr < num_dft_rt_v6; num_ipv6_addr++) { if ((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) && (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) && @@ -1252,11 +1253,9 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) /* add default WAN route */ struct ipa_ioc_add_rt_rule *rt_rule = NULL; struct ipa_rt_rule_add *rt_rule_entry; - struct ipa_ioc_get_hdr sRetHeader; - uint32_t cnt, tx_index = 0; + uint32_t tx_index = 0; const int NUM = 1; ipacm_cmd_q_data evt_data; - struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/ struct ipa_ioc_get_hdr hdr; IPACMDBG_H("ip-type:%d\n", iptype); @@ -1582,7 +1581,7 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) IPACM_Wan::xlat_mux_id = ext_prop->ext[0].mux_id; wanup_data->xlat_mux_id = IPACM_Wan::xlat_mux_id; IPACMDBG_H("Set xlat configuraiton with below information:\n"); - IPACMDBG_H("xlat_enabled: xlat_mux_id: %d \n", + IPACMDBG_H("xlat_enabled: %d xlat_mux_id: %d \n", is_xlat, xlat_mux_id); } else @@ -1710,7 +1709,7 @@ int IPACM_Wan::post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tethe { ipacm_cmd_q_data evt_data; ipacm_event_iface_up_tehter *wandown_data; - int i, j; + uint32_t i, j; wandown_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter)); if (wandown_data == NULL) @@ -3179,10 +3178,6 @@ int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype) { int res = IPACM_SUCCESS; - char *dev_wlan0="wlan0"; - char *dev_wlan1="wlan1"; - char *dev_ecm0="ecm0"; - /* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */ IPACMDBG_H(" dun add producer dependency from %s with registered rx-prop\n", dev_name); @@ -3417,7 +3412,8 @@ fail: int IPACM_Wan::query_ext_prop() { - int fd, ret = IPACM_SUCCESS, cnt; + int fd, ret = IPACM_SUCCESS; + uint32_t cnt; if (iface_query->num_ext_props > 0) { @@ -4310,7 +4306,7 @@ int IPACM_Wan::config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4, int IPACM_Wan::handle_down_evt() { int res = IPACM_SUCCESS; - int i; + uint32_t i; IPACMDBG_H(" wan handle_down_evt \n"); @@ -4533,7 +4529,7 @@ fail: int IPACM_Wan::handle_down_evt_ex() { int res = IPACM_SUCCESS; - int i, tether_total; + uint32_t i, tether_total; int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES]; IPACMDBG_H(" wan handle_down_evt \n"); @@ -5236,7 +5232,7 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr) pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -5244,7 +5240,7 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr) snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -5333,14 +5329,14 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr) pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -5456,7 +5452,7 @@ int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data) else { if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ + (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */ { IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); if(get_client_memptr(wan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR) @@ -5487,6 +5483,11 @@ int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data) return IPACM_FAILURE; /* not setup the RT rules*/ } } + else + { + IPACMDBG_H("Invalid IPV6 address\n"); + return IPACM_FAILURE; + } } return IPACM_SUCCESS; @@ -5831,7 +5832,7 @@ void IPACM_Wan::handle_wan_client_SCC_MCC_switch(bool isSCCMode, ipa_ip_type ipt int size = sizeof(struct ipa_ioc_mdfy_rt_rule) + NUM_RULES * sizeof(struct ipa_rt_rule_mdfy); - IPACMDBG("\n"); + IPACMDBG("isSCCMode: %d\n",isSCCMode); if (tx_prop == NULL || is_default_gateway == false) { @@ -6008,7 +6009,7 @@ int IPACM_Wan::handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 * { FILE *fp = NULL; - for (int apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++) + for (uint32_t apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++) { if(data->apn_data_stats_list[apn_index].mux_id == ext_prop->ext[0].mux_id) { @@ -6127,7 +6128,7 @@ int IPACM_Wan::add_dummy_rx_hdr() if (strlcat(ipv6_hdr->name, IPA_DUMMY_ETH_HDR_NAME_v6, sizeof(ipv6_hdr->name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(ipv6_hdr->name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(ipv6_hdr->name)); return IPACM_FAILURE; } diff --git a/msm8998/ipacm/src/IPACM_Wlan.cpp b/msm8998/ipacm/src/IPACM_Wlan.cpp index b47c5ef..887e9ee 100644 --- a/msm8998/ipacm/src/IPACM_Wlan.cpp +++ b/msm8998/ipacm/src/IPACM_Wlan.cpp @@ -147,7 +147,6 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) int ipa_interface_index; int wlan_index; ipacm_ext_prop* ext_prop; - ipacm_event_iface_up* data_wan; ipacm_event_iface_up_tehter* data_wan_tether; switch (event) @@ -583,7 +582,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) case IPA_HANDLE_WAN_UP: IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n"); - data_wan = (ipacm_event_iface_up*)param; + ipacm_event_iface_up* data_wan = (ipacm_event_iface_up*)param; if(data_wan == NULL) { IPACMERR("No event data is found.\n"); @@ -1014,14 +1013,14 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data) if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1128,7 +1127,7 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data) pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1136,7 +1135,7 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data) snprintf(index,sizeof(index), "%d", header_name_count); if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); + IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name)); res = IPACM_FAILURE; goto fail; } @@ -1251,7 +1250,7 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data) else { if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ + (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */ { IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) && @@ -1290,6 +1289,11 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data) return IPACM_FAILURE; /* not setup the RT rules*/ } } + else + { + IPACMDBG_H("IPV6 address is invalid\n"); + return IPACM_FAILURE; + } } return IPACM_SUCCESS; @@ -1682,7 +1686,9 @@ int IPACM_Wlan::handle_wlan_client_down_evt(uint8_t *mac_addr) /*handle wlan iface down event*/ int IPACM_Wlan::handle_down_evt() { - int res = IPACM_SUCCESS, i, num_private_subnet_fl_rule; + int res = IPACM_SUCCESS, num_private_subnet_fl_rule; + uint32_t i; + num_private_subnet_fl_rule = 0; IPACMDBG_H("WLAN ip-type: %d \n", ip_type); /* no iface address up, directly close iface*/ @@ -1921,7 +1927,8 @@ fail: /*handle reset wifi-client rt-rules */ int IPACM_Wlan::handle_wlan_client_reset_rt(ipa_ip_type iptype) { - int i, res = IPACM_SUCCESS; + uint32_t i; + int res = IPACM_SUCCESS; /* clean wifi-client routing rules */ IPACMDBG_H("left %d wifi clients to reset ip-type(%d) rules \n ", num_wifi_client, iptype); @@ -2158,7 +2165,7 @@ void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype) void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch() { - int i; + uint32_t i; /* ====== post events to mimic WLAN interface goes down/up when AP mode is changing ====== */ -- cgit v1.2.3 From cb31a1775075041d9f8c060ca606ae211bd67436 Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Fri, 1 Sep 2017 14:28:07 -0700 Subject: ipacm: fix the v6-offload issue on Android Remove the check on how many ipv6 addresses are received from modem interface, fix the client prefix comparison logic which contradicts with MDM requirement to only offload tethered-clients who has same prefix as modem interface. Test: as follows - built - flashed - booted - started tethering and watched for packets via: "adb shell tcpdump -n -i wlan0 -l" Bug: 34361337 Change-Id: Ib4b2f9e67f5c92021956c3ecb963cfed7f016959 Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit 4031d6a7e2dec3f13805f45b082790ac2e9a496c) --- msm8998/ipacm/inc/IPACM_Config.h | 2 + msm8998/ipacm/inc/IPACM_Defs.h | 4 +- msm8998/ipacm/inc/IPACM_Wan.h | 6 +++ msm8998/ipacm/src/IPACM_Config.cpp | 24 ++++++++- msm8998/ipacm/src/IPACM_Iface.cpp | 8 +++ msm8998/ipacm/src/IPACM_Lan.cpp | 86 ++++++++++++++++++++++-------- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 47 +++++++++++----- msm8998/ipacm/src/IPACM_Wan.cpp | 4 ++ msm8998/ipacm/src/IPACM_Wlan.cpp | 11 +++- 9 files changed, 154 insertions(+), 38 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/inc/IPACM_Config.h b/msm8998/ipacm/inc/IPACM_Config.h index 5bcb4eb..ae66c95 100644 --- a/msm8998/ipacm/inc/IPACM_Config.h +++ b/msm8998/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/msm8998/ipacm/inc/IPACM_Defs.h b/msm8998/ipacm/inc/IPACM_Defs.h index 74ed3bf..9ab0893 100644 --- a/msm8998/ipacm/inc/IPACM_Defs.h +++ b/msm8998/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, @@ -185,8 +187,6 @@ typedef enum IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/ IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/ IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ - IPA_DOWNSTREAM_ADD, /* ipacm_event_ipahal_stream */ - IPA_DOWNSTREAM_DEL, /* ipacm_event_ipahal_stream */ IPACM_EVENT_MAX } ipa_cm_event_id; diff --git a/msm8998/ipacm/inc/IPACM_Wan.h b/msm8998/ipacm/inc/IPACM_Wan.h index fbfaba3..fa4114b 100644 --- a/msm8998/ipacm/inc/IPACM_Wan.h +++ b/msm8998/ipacm/inc/IPACM_Wan.h @@ -131,6 +131,11 @@ public: static bool isWanUP_V6(int ipa_if_num_tether) { #ifdef FEATURE_IPA_ANDROID +#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++) { @@ -143,6 +148,7 @@ public: } } return false; +#endif #else return wan_up_v6; #endif diff --git a/msm8998/ipacm/src/IPACM_Config.cpp b/msm8998/ipacm/src/IPACM_Config.cpp index 6218fb6..895005f 100644 --- a/msm8998/ipacm/src/IPACM_Config.cpp +++ b/msm8998/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 */ @@ -499,7 +501,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 */ @@ -524,6 +526,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/msm8998/ipacm/src/IPACM_Iface.cpp b/msm8998/ipacm/src/IPACM_Iface.cpp index 0582d67..4e0dc9e 100644 --- a/msm8998/ipacm/src/IPACM_Iface.cpp +++ b/msm8998/ipacm/src/IPACM_Iface.cpp @@ -851,7 +851,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; @@ -862,7 +866,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/msm8998/ipacm/src/IPACM_Lan.cpp b/msm8998/ipacm/src/IPACM_Lan.cpp index 36d4b74..5a8f0e6 100644 --- a/msm8998/ipacm/src/IPACM_Lan.cpp +++ b/msm8998/ipacm/src/IPACM_Lan.cpp @@ -183,6 +183,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; } @@ -368,6 +383,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) @@ -408,7 +424,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) { @@ -656,7 +672,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 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 */ { @@ -1033,7 +1055,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) //sky { if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES) { @@ -1511,14 +1533,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)); @@ -1575,7 +1597,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); @@ -3056,6 +3078,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); @@ -3064,6 +3087,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; @@ -3080,6 +3113,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); @@ -3088,23 +3122,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 { @@ -3200,7 +3244,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) { diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index 95e44bf..3679669 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/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 const char *IPACM_OffloadManager::DEVICE_NAME = "/dev/wwan_ioctl"; @@ -120,8 +121,14 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups) return FAIL_HARDWARE; } + /* 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 +137,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 +157,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 +181,14 @@ 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); + + /* ideal behavior: ipacm should return try-again if downstream netdev driver not ready */ + if (IPACM_Iface::ipacmcfg->CheckNatIfaces(downstream_name)) + { + IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name); + return FAIL_TRY_AGAIN; + } + if (prefix.fam == V4) { IPACMDBG_H("subnet info v4Addr (%x) v4Mask (%x)\n", prefix.v4Addr, prefix.v4Mask); } else { @@ -265,7 +273,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); @@ -280,6 +287,14 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g } else { + + /* ideal behavior: ipacm should return try-again if upstream netdev driver not ready */ + if (IPACM_Iface::ipacmcfg->CheckNatIfaces(upstream_name)) + { + IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", upstream_name); + return FAIL_TRY_AGAIN; + } + if(ipa_get_if_index(upstream_name, &index)) { IPACMERR("fail to get iface index.\n"); @@ -360,7 +375,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 */) diff --git a/msm8998/ipacm/src/IPACM_Wan.cpp b/msm8998/ipacm/src/IPACM_Wan.cpp index 4c4ad69..968f562 100644 --- a/msm8998/ipacm/src/IPACM_Wan.cpp +++ b/msm8998/ipacm/src/IPACM_Wan.cpp @@ -3769,7 +3769,11 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o 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/msm8998/ipacm/src/IPACM_Wlan.cpp b/msm8998/ipacm/src/IPACM_Wlan.cpp index 887e9ee..53e56cf 100644 --- a/msm8998/ipacm/src/IPACM_Wlan.cpp +++ b/msm8998/ipacm/src/IPACM_Wlan.cpp @@ -267,6 +267,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) @@ -308,6 +309,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) { @@ -535,7 +537,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 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 */ { @@ -1257,6 +1265,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; } -- cgit v1.2.3 From 86a1a35809fc77ef327e812649d567ad619c7813 Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Mon, 4 Sep 2017 10:49:54 -0700 Subject: ipacm: buffer downstream and upstream events Add framework event cache in offload manager class to handle the timing issue between android framework and wlan-driver. Note framework starts to send set_upstream/add_downstream to IPACM when link property is set however wlan-driver is not completed the IPA-HW pipe configuration because it triggered by hostapd not link property. The fix is to add cache on offload manager to start offload after wlan-driver is ready. Bug: 34361337 Test: manual Change-Id: I1ec3ad30ba3beb8198bdee7a10779dcaf07c51cd Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit b1ae04ccb105ea03dcfc0e4a6a5fb9404eb79127) --- msm8998/ipacm/inc/IPACM_OffloadManager.h | 18 +++ msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp | 9 +- msm8998/ipacm/src/IPACM_Lan.cpp | 20 +++- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 168 ++++++++++++++++++++++++--- msm8998/ipacm/src/IPACM_Wan.cpp | 16 +++ 5 files changed, 209 insertions(+), 22 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/inc/IPACM_OffloadManager.h b/msm8998/ipacm/inc/IPACM_OffloadManager.h index 85a2063..9d94253 100644 --- a/msm8998/ipacm/inc/IPACM_OffloadManager.h +++ b/msm8998/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/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp index a22a026..f6dda67 100644 --- a/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -976,8 +976,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) { @@ -1011,6 +1016,6 @@ fail: if (tcp_fd) { fclose(tcp_fd); } - +#endif return; } diff --git a/msm8998/ipacm/src/IPACM_Lan.cpp b/msm8998/ipacm/src/IPACM_Lan.cpp index 5a8f0e6..cd0ff99 100644 --- a/msm8998/ipacm/src/IPACM_Lan.cpp +++ b/msm8998/ipacm/src/IPACM_Lan.cpp @@ -52,7 +52,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IPACM_ConntrackListener.h" #include #include - +#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) @@ -1055,7 +1057,7 @@ int IPACM_Lan::handle_wan_down(bool is_sta_mode) return IPACM_FAILURE; } - if(is_sta_mode == false && modem_ul_v4_set == true) //sky + if(is_sta_mode == false && modem_ul_v4_set == true) { if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES) { @@ -1122,6 +1124,9 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) const int NUM_RULES = 1; uint32_t 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); @@ -1287,6 +1292,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: diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index 3679669..f2cc16c 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -57,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; @@ -88,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; @@ -112,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(); @@ -121,6 +130,12 @@ 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); @@ -182,13 +197,6 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref IPACMDBG_H("addDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam); - /* ideal behavior: ipacm should return try-again if downstream netdev driver not ready */ - if (IPACM_Iface::ipacmcfg->CheckNatIfaces(downstream_name)) - { - IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name); - return FAIL_TRY_AGAIN; - } - if (prefix.fam == V4) { IPACMDBG_H("subnet info v4Addr (%x) v4Mask (%x)\n", prefix.v4Addr, prefix.v4Mask); } else { @@ -198,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) @@ -287,18 +346,58 @@ 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; + } - /* ideal behavior: ipacm should return try-again if upstream netdev driver not ready */ + /* check if downstream netdev driver finished its configuration on IPA-HW */ if (IPACM_Iface::ipacmcfg->CheckNatIfaces(upstream_name)) { - IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", upstream_name); - return FAIL_TRY_AGAIN; + 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(ipa_get_if_index(upstream_name, &index)) + if (gw_addr_v6.fam == V6) { - IPACMERR("fail to get iface index.\n"); - return FAIL_INPUT_CHECK; + 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 */ @@ -557,3 +656,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/msm8998/ipacm/src/IPACM_Wan.cpp b/msm8998/ipacm/src/IPACM_Wan.cpp index 968f562..2df9d80 100644 --- a/msm8998/ipacm/src/IPACM_Wan.cpp +++ b/msm8998/ipacm/src/IPACM_Wan.cpp @@ -50,6 +50,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IPACM_Defs.h" #include #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; @@ -203,6 +206,9 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) const int NUM_RULES = 1; 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) @@ -502,6 +508,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: -- cgit v1.2.3 From f7f77065b32563a6ed376a337638a7375d332fc4 Mon Sep 17 00:00:00 2001 From: Thierry Strudel Date: Fri, 15 Sep 2017 10:46:48 -0700 Subject: msm8998: Update to C1.07.00.00.375.020 msm8998: from vendor/qcom/opensource/data-ipa-cfg-mgr cd3f815 Promotion of data.lnx.6.4.9-00093. 60bc54b IPACM: fix security issue in querying if index 9712b61 Promotion of data.lnx.6.4.9-00072. de85c67 SetDataLimit: Init Check Test: build, boot, sanity checks Bug: 65735819 Change-Id: Ie0c42323bc1d83c9bce185a067120546dfc2d9d1 Signed-off-by: Thierry Strudel --- msm8998/ipacm/src/IPACM_Iface.cpp | 55 ++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 24 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/src/IPACM_Iface.cpp b/msm8998/ipacm/src/IPACM_Iface.cpp index 4e0dc9e..149e417 100644 --- a/msm8998/ipacm/src/IPACM_Iface.cpp +++ b/msm8998/ipacm/src/IPACM_Iface.cpp @@ -930,30 +930,37 @@ int IPACM_Iface::ipa_get_if_index int * if_index ) { - int fd; - struct ifreq ifr; - - if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - IPACMERR("get interface index socket create failed \n"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - IPACMDBG_H("interface name (%s)\n", if_name); - - if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0) - { - IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name); - close(fd); - return IPACM_FAILURE; - } - - *if_index = ifr.ifr_ifindex; - IPACMDBG_H("Interface index %d\n", *if_index); - close(fd); - return IPACM_SUCCESS; + int fd; + struct ifreq ifr; + + if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + IPACMERR("get interface index socket create failed \n"); + return IPACM_FAILURE; + } + + if(strlen(if_name) >= sizeof(ifr.ifr_name)) + { + IPACMERR("interface name overflows: len %zu\n", strlen(if_name)); + close(fd); + return IPACM_FAILURE; + } + + memset(&ifr, 0, sizeof(struct ifreq)); + (void)strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); + IPACMDBG_H("interface name (%s)\n", if_name); + + if(ioctl(fd,SIOCGIFINDEX , &ifr) < 0) + { + IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name); + close(fd); + return IPACM_FAILURE; + } + + *if_index = ifr.ifr_ifindex; + IPACMDBG_H("Interface index %d\n", *if_index); + close(fd); + return IPACM_SUCCESS; } void IPACM_Iface::config_ip_type(ipa_ip_type iptype) -- cgit v1.2.3 From 54c7bcf052d7a0cec20a2ecdaa64258ce1ffccbf Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Mon, 25 Sep 2017 09:10:27 -0700 Subject: IPA HAL: Remove Downstream Iface Empty iface and garbage iface names should return an error when passed to removeDownstream. Bug: 65612332 Test: compile Crs-fixed: 2105305 Change-Id: Ib4a99bd6cefe372ac4292b53842bd76e767449a1 Signed-off-by: Tyler Wear Signed-off-by: Niranjan Pendharkar (cherry picked from commit f4102a5c59f994d40d22bdb9f1806d6bcc120a79) --- msm8998/ipacm/inc/IPACM_OffloadManager.h | 4 +++- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/inc/IPACM_OffloadManager.h b/msm8998/ipacm/inc/IPACM_OffloadManager.h index 9d94253..72070dd 100644 --- a/msm8998/ipacm/inc/IPACM_OffloadManager.h +++ b/msm8998/ipacm/inc/IPACM_OffloadManager.h @@ -29,7 +29,7 @@ #ifndef _IPACM_OFFLOAD_MANAGER_H_ #define _IPACM_OFFLOAD_MANAGER_H_ - +#include #include #include #include "IPACM_Defs.h" @@ -96,6 +96,8 @@ public: private: + std::list valid_ifaces; + bool upstream_v4_up; bool upstream_v6_up; diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index f2cc16c..bc88024 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -263,6 +263,13 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref return SUCCESS; } + /* Iface is valid, add to list if not present */ + if (std::find(valid_ifaces.begin(), valid_ifaces.end(), downstream_name) == valid_ifaces.end()) + { + /* Iface is new, add it to the list */ + valid_ifaces.push_back(downstream_name); + } + evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream)); if(evt_data == NULL) { @@ -291,6 +298,17 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P ipacm_event_ipahal_stream *evt_data; IPACMDBG_H("removeDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam); + if(strnlen(downstream_name, sizeof(downstream_name)) == 0) + { + IPACMERR("iface length is 0.\n"); + return FAIL_HARDWARE; + } + if (std::find(valid_ifaces.begin(), valid_ifaces.end(), downstream_name) == valid_ifaces.end()) + { + IPACMERR("iface is not present in list.\n"); + return FAIL_HARDWARE; + } + if(ipa_get_if_index(downstream_name, &index)) { IPACMERR("netdev(%s) already removed, ignored\n", downstream_name); -- cgit v1.2.3 From 8747f81ed915d30edcd83caeda9ab1cf6ab68e59 Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Mon, 25 Sep 2017 08:53:41 -0700 Subject: ipacm: fix the crash when modem SSR Make ipacm offload manager continues to read msg from IPA-driver instead of posting dummy event to IPACM main thread. Test: Manual Bug: 65676825 Change-Id: Ic838762ba7a0a06dd1690f4198099428a988901a Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit 03f37382872e82322721c55452086b9ac15627e3) --- msm8998/ipacm/src/IPACM_Main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/src/IPACM_Main.cpp b/msm8998/ipacm/src/IPACM_Main.cpp index 8f98988..13cdb51 100644 --- a/msm8998/ipacm/src/IPACM_Main.cpp +++ b/msm8998/ipacm/src/IPACM_Main.cpp @@ -696,7 +696,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(); @@ -705,7 +705,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(); @@ -714,7 +714,7 @@ void* ipa_driver_msg_notifier(void *param) } else { OffloadMng->elrInstance->onOffloadSupportAvailable(); } - break; + continue; #endif default: IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type); -- cgit v1.2.3 From 67b2d096ba112493dff7a127e702f1e38e0c4794 Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Mon, 25 Sep 2017 09:00:24 -0700 Subject: IPACM: fix the fd leaking issue Fix the fd leaking issue on "resetTetherStats" and "getStats" APIs. Test: Manual Bug: 29337859 Bug: 32163131 Bug: 64976634 Bug: 65612126 Change-Id: I131c6ebe1ea1e14194fe4fe019eb21364032e154 Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit 42959c94d518dd6c5424040b0310dbb23d9dc158) --- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index bc88024..ca54ea6 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -564,6 +564,7 @@ RET IPACM_OffloadManager::getStats(const char * upstream_name /* upstream */, offload_stats.rx = stats.rx_bytes; IPACMDBG_H("send getStats tx:%lu rx:%lu \n", offload_stats.tx, offload_stats.rx); + close(fd); return SUCCESS; } @@ -664,6 +665,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; } -- cgit v1.2.3 From 28e7f824301c3d5724338f71bb2e5f83d7fcb79c Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Sat, 14 Oct 2017 20:06:30 -0700 Subject: ipacm: fix the VTS error On VTS IPACM_HAL unit-test, since wlan tethering devive won't up, therefore the addDownsream events are all cached in IPACM_HAL and keep accumulated until reaching IPACM's max cached and seeing test-case starts failing. The fix is to clean up the cache on Stopoffload. CRs-fixed:2118600 Bug:65612227 Test: compile Change-Id: I24f410f5c5ae3a6cad0e14293f266b067f643389 Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit 5cf0a7159b173f627128cf87877a3e559a558f81) --- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index ca54ea6..32606b9 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -493,12 +493,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 */) -- cgit v1.2.3 From f7f6aa6be49a5359bc3393fc574d8825d3f420a9 Mon Sep 17 00:00:00 2001 From: Niranjan Pendharkar Date: Sat, 14 Oct 2017 20:09:29 -0700 Subject: IPACM: fix downstream iface list add/del issue Use std string instead of memory comparison for vts test CRs-fixed:2125887 Bug:67396342 Test: compile Change-Id: I23ac0b27a1aedf340600b28f0b5d75e2e2b8b6f4 Signed-off-by: Skylar Chang Signed-off-by: Niranjan Pendharkar (cherry picked from commit 8caa3afcb5feaa8193639c9eedee1744e5968672) --- msm8998/ipacm/inc/IPACM_OffloadManager.h | 2 +- msm8998/ipacm/src/IPACM_OffloadManager.cpp | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) (limited to 'msm8998/ipacm') diff --git a/msm8998/ipacm/inc/IPACM_OffloadManager.h b/msm8998/ipacm/inc/IPACM_OffloadManager.h index 72070dd..bade0aa 100644 --- a/msm8998/ipacm/inc/IPACM_OffloadManager.h +++ b/msm8998/ipacm/inc/IPACM_OffloadManager.h @@ -96,7 +96,7 @@ public: private: - std::list valid_ifaces; + std::list valid_ifaces; bool upstream_v4_up; diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp index 32606b9..2061fd2 100644 --- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp +++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp @@ -212,6 +212,13 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref IPACMERR("fail to get iface index.\n"); return FAIL_INPUT_CHECK; } + /* Iface is valid, add to list if not present */ + if (std::find(valid_ifaces.begin(), valid_ifaces.end(), std::string(downstream_name)) == valid_ifaces.end()) + { + /* Iface is new, add it to the list */ + valid_ifaces.push_back(downstream_name); + IPACMDBG_H("add iface(%s) to list\n", downstream_name); + } /* check if downstream netdev driver finished its configuration on IPA-HW */ if (IPACM_Iface::ipacmcfg->CheckNatIfaces(downstream_name)) @@ -263,13 +270,6 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref return SUCCESS; } - /* Iface is valid, add to list if not present */ - if (std::find(valid_ifaces.begin(), valid_ifaces.end(), downstream_name) == valid_ifaces.end()) - { - /* Iface is new, add it to the list */ - valid_ifaces.push_back(downstream_name); - } - evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream)); if(evt_data == NULL) { @@ -303,7 +303,7 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P IPACMERR("iface length is 0.\n"); return FAIL_HARDWARE; } - if (std::find(valid_ifaces.begin(), valid_ifaces.end(), downstream_name) == valid_ifaces.end()) + if (std::find(valid_ifaces.begin(), valid_ifaces.end(), std::string(downstream_name)) == valid_ifaces.end()) { IPACMERR("iface is not present in list.\n"); return FAIL_HARDWARE; @@ -508,6 +508,7 @@ RET IPACM_OffloadManager::stopAllOffload() upstream_v6_up = false; memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache)); latest_cache_index = 0; + valid_ifaces.clear(); return result; } -- cgit v1.2.3