diff options
author | arnav_s <arnav_s@codeaurora.org> | 2017-12-06 13:42:26 -0700 |
---|---|---|
committer | arnav_s <arnav_s@codeaurora.org> | 2017-12-06 13:42:26 -0700 |
commit | 0e38a37f4bc8809217b76be8d10fc3aded89320b (patch) | |
tree | da34de5041d4017442d23e9468e1575f0a737e9c | |
parent | bad4d1f535707a060d0bcb330c97e4a1bbbacfde (diff) | |
parent | bb4759e1eb24372b823d15da74997121e224b1d3 (diff) | |
download | ipacfg-mgr-0e38a37f4bc8809217b76be8d10fc3aded89320b.tar.gz |
Fastforwarding data-ipa-cfg-mgr CRT:data.lnx.3.0-171203 to data.lnx.4.9
Change-Id: Ia8844805d90f0375d385f5c059547aa4dcdee351
-rw-r--r-- | hal/inc/PrefixParser.h | 1 | ||||
-rw-r--r-- | hal/src/HAL.cpp | 8 | ||||
-rw-r--r-- | hal/src/PrefixParser.cpp | 6 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Defs.h | 5 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Lan.h | 2 | ||||
-rw-r--r-- | ipacm/src/IPACM_Config.cpp | 22 | ||||
-rw-r--r-- | ipacm/src/IPACM_IfaceManager.cpp | 4 | ||||
-rw-r--r-- | ipacm/src/IPACM_Lan.cpp | 62 | ||||
-rw-r--r-- | ipacm/src/IPACM_Log.cpp | 2 | ||||
-rw-r--r-- | ipacm/src/IPACM_Main.cpp | 5 | ||||
-rw-r--r-- | ipacm/src/IPACM_Neighbor.cpp | 3 | ||||
-rw-r--r-- | ipacm/src/IPACM_Netlink.cpp | 6 | ||||
-rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 22 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wan.cpp | 11 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 9 |
15 files changed, 120 insertions, 48 deletions
diff --git a/hal/inc/PrefixParser.h b/hal/inc/PrefixParser.h index 4682aa5..99afbe0 100644 --- a/hal/inc/PrefixParser.h +++ b/hal/inc/PrefixParser.h @@ -57,6 +57,7 @@ public: int size(); bool allAreFullyQualified(); Prefix getFirstPrefix(); + Prefix getFirstPrefix(IP_FAM); string getLastErrAsStr(); private: bool add(string /* in */, IP_FAM /* famHint */); diff --git a/hal/src/HAL.cpp b/hal/src/HAL.cpp index c4d9722..d1d10fd 100644 --- a/hal/src/HAL.cpp +++ b/hal/src/HAL.cpp @@ -521,8 +521,8 @@ Return<void> HAL::setUpstreamParameters } else if (iface.size()>= 1) { RET ipaReturn = mIPA->setUpstream( iface.c_str(), - v4GwParser.getFirstPrefix(), - v6GwParser.getFirstPrefix()); + v4GwParser.getFirstPrefix(IP_FAM::V4), + v6GwParser.getFirstPrefix(IP_FAM::V6)); BoolResult res = ipaResultToBoolResult(ipaReturn); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg); @@ -530,8 +530,8 @@ Return<void> HAL::setUpstreamParameters /* send NULL iface string when upstream down */ RET ipaReturn = mIPA->setUpstream( NULL, - v4GwParser.getFirstPrefix(), - v6GwParser.getFirstPrefix()); + v4GwParser.getFirstPrefix(IP_FAM::V4), + v6GwParser.getFirstPrefix(IP_FAM::V6)); BoolResult res = ipaResultToBoolResult(ipaReturn); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg); diff --git a/hal/src/PrefixParser.cpp b/hal/src/PrefixParser.cpp index d38bec0..ff55147 100644 --- a/hal/src/PrefixParser.cpp +++ b/hal/src/PrefixParser.cpp @@ -111,6 +111,12 @@ Prefix PrefixParser::getFirstPrefix() { return makeBlankPrefix(IP_FAM::INVALID); } /* getFirstPrefix */ +Prefix PrefixParser::getFirstPrefix(IP_FAM famHint) { + if (size() >= 1) + return mPrefixes[0]; + return makeBlankPrefix(famHint); +} /* getFirstPrefix */ + string PrefixParser::getLastErrAsStr() { return mLastErr; } /* getLastErrAsStr */ diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h index 2031fc5..149c03a 100644 --- a/ipacm/inc/IPACM_Defs.h +++ b/ipacm/inc/IPACM_Defs.h @@ -173,7 +173,7 @@ typedef enum IPA_HANDLE_WAN_UP, /* ipacm_event_iface_up */ IPA_HANDLE_WAN_DOWN, /* ipacm_event_iface_up */ - IPA_HANDLE_WAN_UP_V6, /* NULL */ + IPA_HANDLE_WAN_UP_V6, /* ipacm_event_iface_up */ IPA_HANDLE_WAN_DOWN_V6, /* NULL */ IPA_HANDLE_WAN_UP_TETHER, /* ipacm_event_iface_up_tehter */ IPA_HANDLE_WAN_DOWN_TETHER, /* ipacm_event_iface_up_tehter */ @@ -186,7 +186,7 @@ typedef enum IPA_ETH_BRIDGE_CLIENT_ADD, /* ipacm_event_eth_bridge */ 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_SSR_NOTICE, /* NULL*/ #ifdef FEATURE_L2TP IPA_ADD_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ IPA_DEL_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ @@ -195,6 +195,7 @@ typedef enum IPA_HANDLE_VLAN_CLIENT_INFO, /* ipacm_event_data_all */ IPA_HANDLE_VLAN_IFACE_INFO, /* ipacm_event_data_all */ #endif + IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ IPACM_EVENT_MAX } ipa_cm_event_id; diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h index 0f50ae7..21a72c1 100644 --- a/ipacm/inc/IPACM_Lan.h +++ b/ipacm/inc/IPACM_Lan.h @@ -263,7 +263,9 @@ protected: bool is_active; bool modem_ul_v4_set; + uint8_t v4_mux_id; bool modem_ul_v6_set; + uint8_t v6_mux_id; bool sta_ul_v4_set; bool sta_ul_v6_set; diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp index 92f4880..78af72b 100644 --- a/ipacm/src/IPACM_Config.cpp +++ b/ipacm/src/IPACM_Config.cpp @@ -185,9 +185,9 @@ int IPACM_Config::Init(void) IPACMERR("Failed opening %s.\n", DEVICE_NAME); } #ifdef FEATURE_IPACM_HAL - strncpy(IPACM_config_file, "/vendor/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); + strlcpy(IPACM_config_file, "/vendor/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); #else - strncpy(IPACM_config_file, "/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); + strlcpy(IPACM_config_file, "/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); #endif IPACMDBG_H("\n IPACM XML file is %s \n", IPACM_config_file); if (IPACM_SUCCESS == ipacm_read_cfg_xml(IPACM_config_file, cfg)) @@ -220,7 +220,7 @@ int IPACM_Config::Init(void) for (i = 0; i < cfg->iface_config.num_iface_entries; i++) { - strncpy(iface_table[i].iface_name, cfg->iface_config.iface_entries[i].iface_name, sizeof(iface_table[i].iface_name)); + strlcpy(iface_table[i].iface_name, cfg->iface_config.iface_entries[i].iface_name, sizeof(iface_table[i].iface_name)); iface_table[i].if_cat = cfg->iface_config.iface_entries[i].if_cat; iface_table[i].if_mode = cfg->iface_config.iface_entries[i].if_mode; iface_table[i].wlan_mode = cfg->iface_config.iface_entries[i].wlan_mode; @@ -320,28 +320,28 @@ int IPACM_Config::Init(void) /* Construct the routing table ictol name in iface static member*/ rt_tbl_default_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_default_v4.name, V4_DEFAULT_ROUTE_TABLE_NAME, sizeof(rt_tbl_default_v4.name)); + strlcpy(rt_tbl_default_v4.name, V4_DEFAULT_ROUTE_TABLE_NAME, sizeof(rt_tbl_default_v4.name)); rt_tbl_lan_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_lan_v4.name, V4_LAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_lan_v4.name)); + strlcpy(rt_tbl_lan_v4.name, V4_LAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_lan_v4.name)); rt_tbl_wan_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_wan_v4.name, V4_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v4.name)); + strlcpy(rt_tbl_wan_v4.name, V4_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v4.name)); rt_tbl_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_v6.name, V6_COMMON_ROUTE_TABLE_NAME, sizeof(rt_tbl_v6.name)); + strlcpy(rt_tbl_v6.name, V6_COMMON_ROUTE_TABLE_NAME, sizeof(rt_tbl_v6.name)); rt_tbl_wan_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_wan_v6.name, V6_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v6.name)); + strlcpy(rt_tbl_wan_v6.name, V6_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v6.name)); rt_tbl_odu_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_odu_v4.name, V4_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v4.name)); + strlcpy(rt_tbl_odu_v4.name, V4_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v4.name)); rt_tbl_odu_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_odu_v6.name, V6_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v6.name)); + strlcpy(rt_tbl_odu_v6.name, V6_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v6.name)); rt_tbl_wan_dl.ip = IPA_IP_MAX; - strncpy(rt_tbl_wan_dl.name, WAN_DL_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_dl.name)); + strlcpy(rt_tbl_wan_dl.name, WAN_DL_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_dl.name)); /* Construct IPACM ipa_client map to rm_resource table */ ipa_client_rm_map_tbl[IPA_CLIENT_WLAN1_PROD]= IPA_RM_RESOURCE_WLAN_PROD; diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp index 17f546d..85033a3 100644 --- a/ipacm/src/IPACM_IfaceManager.cpp +++ b/ipacm/src/IPACM_IfaceManager.cpp @@ -383,6 +383,7 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) #ifdef FEATURE_IPACM_HAL IPACM_EvtDispatcher::registr(IPA_DOWNSTREAM_ADD, wl); IPACM_EvtDispatcher::registr(IPA_DOWNSTREAM_DEL, wl); + IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, wl); #endif #else IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl); @@ -449,6 +450,9 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) #ifndef FEATURE_IPA_ANDROID IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, w); IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w); +#ifdef FEATURE_IPACM_HAL + IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, w); +#endif #endif } else diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp index 2f18f38..21bf7c0 100644 --- a/ipacm/src/IPACM_Lan.cpp +++ b/ipacm/src/IPACM_Lan.cpp @@ -81,7 +81,9 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) num_wan_ul_fl_rule_v6 = 0; is_active = true; modem_ul_v4_set = false; + v4_mux_id = 0; modem_ul_v6_set = false; + v6_mux_id = 0; sta_ul_v4_set = false; sta_ul_v6_set = false; @@ -1124,6 +1126,12 @@ int IPACM_Lan::handle_wan_down(bool is_sta_mode) close(fd); return IPACM_FAILURE; } + if (num_wan_ul_fl_rule_v4 == 0) + { + IPACMERR("No modem UL rules were installed, return...\n"); + close(fd); + return IPACM_FAILURE; + } if (m_filtering.DeleteFilteringHdls(wan_ul_fl_rule_hdl_v4, IPA_IP_v4, num_wan_ul_fl_rule_v4) == false) { @@ -1163,8 +1171,8 @@ int IPACM_Lan::handle_wan_down(bool is_sta_mode) flt_index.retain_header_valid = 1; flt_index.retain_header = 0; flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); - + flt_index.embedded_call_mux_id = v4_mux_id; + v4_mux_id = 0; if(false == m_filtering.SendFilteringRuleIndex(&flt_index)) { IPACMERR("Error sending filtering rule index, aborting...\n"); @@ -3096,6 +3104,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp int fd; int i, index, eq_index; uint32_t value = 0; + uint8_t qmap_id; IPACMDBG_H("Set modem UL flt rules\n"); @@ -3151,8 +3160,9 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp flt_index.retain_header_valid = 1; flt_index.retain_header = 0; - flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); + flt_index.embedded_call_mux_id_valid = 1; + qmap_id = IPACM_Iface::ipacmcfg->GetQmapId(); + flt_index.embedded_call_mux_id = qmap_id; #ifndef FEATURE_IPA_V3 IPACMDBG_H("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n", flt_index.source_pipe_index, flt_index.filter_index_list_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id); @@ -3287,6 +3297,22 @@ 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); } + *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 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[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[0]; + *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 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[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[0]; #else if(eq_index == 0) { @@ -3296,25 +3322,25 @@ 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<<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[3]; + = prefix[IPA_IP_v6].v6Mask[0]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4) - = 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 + 8) + = prefix[IPA_IP_v6].v6Mask[2]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 12) - = 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].value + 0) - = prefix[IPA_IP_v6].v6Addr[3]; + = prefix[IPA_IP_v6].v6Addr[0]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 4) - = 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 + 8) + = prefix[IPA_IP_v6].v6Addr[2]; *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 12) - = prefix[IPA_IP_v6].v6Addr[0]; - } + = prefix[IPA_IP_v6].v6Addr[3]; +#endif + flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].offset = 8; + } else { IPACMERR("Run out of MEQ128 equation.\n"); @@ -3370,6 +3396,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp num_wan_ul_fl_rule_v4++; } IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules); + v4_mux_id = qmap_id; } else if(iptype == IPA_IP_v6) { @@ -3379,7 +3406,9 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp num_wan_ul_fl_rule_v6++; } IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules); + v6_mux_id = qmap_id; } + else { IPACMERR("IP type is not expected.\n"); @@ -3463,7 +3492,8 @@ int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode) flt_index.retain_header_valid = 1; flt_index.retain_header = 0; flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); + flt_index.embedded_call_mux_id = v6_mux_id; + v6_mux_id = 0; if(false == m_filtering.SendFilteringRuleIndex(&flt_index)) { IPACMERR("Error sending filtering rule index, aborting...\n"); diff --git a/ipacm/src/IPACM_Log.cpp b/ipacm/src/IPACM_Log.cpp index d0bd108..3e2e668 100644 --- a/ipacm/src/IPACM_Log.cpp +++ b/ipacm/src/IPACM_Log.cpp @@ -86,7 +86,7 @@ void ipacm_log_send( void * user_data) printf("create ipacm_log socket successfully\n"); } ipacmlog_socket.sun_family = AF_UNIX; - strcpy(ipacmlog_socket.sun_path, IPACMLOG_FILE); + strlcpy(ipacmlog_socket.sun_path, IPACMLOG_FILE,sizeof(ipacmlog_socket.sun_path)); len = strlen(ipacmlog_socket.sun_path) + sizeof(ipacmlog_socket.sun_family); memcpy(ipacm_log_buffer.user_data, user_data, MAX_BUF_LEN); diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp index 1f92bfa..55a3fd5 100644 --- a/ipacm/src/IPACM_Main.cpp +++ b/ipacm/src/IPACM_Main.cpp @@ -713,7 +713,10 @@ void* ipa_driver_msg_notifier(void *param) IPACMERR("calling OffloadMng->elrInstance->onOffloadStopped \n"); OffloadMng->elrInstance->onOffloadStopped(IpaEventRelay::ERROR); } - continue; + /* WA to clean up wlan instances during SSR */ + evt_data.event = IPA_SSR_NOTICE; + evt_data.evt_data = NULL; + break; case IPA_SSR_AFTER_POWERUP: IPACMDBG_H("Received IPA_SSR_AFTER_POWERUP\n"); OffloadMng = IPACM_OffloadManager::GetInstance(); diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp index 8d5a16f..5ed5453 100644 --- a/ipacm/src/IPACM_Neighbor.cpp +++ b/ipacm/src/IPACM_Neighbor.cpp @@ -127,16 +127,15 @@ void IPACM_Neighbor::event_callback(ipa_cm_event_id event, void *param) IPACMERR("Unable to allocate memory\n"); return; } + memset(data_all,0,sizeof(ipacm_event_data_all)); data_all->iptype = IPA_IP_v4; data_all->if_index = neighbor_client[i].iface_index; data_all->ipv4_addr = neighbor_client[i].v4_addr; //use previous ipv4 address memcpy(data_all->mac_addr, neighbor_client[i].mac_addr, sizeof(data_all->mac_addr)); -#ifdef FEATURE_L2TP memcpy(data_all->iface_name, neighbor_client[i].iface_name, sizeof(data_all->iface_name)); -#endif evt_data.evt_data = (void *)data_all; IPACM_EvtDispatcher::PostEvt(&evt_data); /* ask for replaced iface name*/ diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp index 587663b..e2ecd50 100644 --- a/ipacm/src/IPACM_Netlink.cpp +++ b/ipacm/src/IPACM_Netlink.cpp @@ -849,9 +849,7 @@ static int ipa_nl_decode_nlmsg evt_data.event = IPA_ADDR_ADD_EVENT; data_addr->if_index = msg_ptr->nl_addr_info.metainfo.ifa_index; -#ifdef FEATURE_L2TP strlcpy(data_addr->iface_name, dev_name, sizeof(data_addr->iface_name)); -#endif if(AF_INET6 == msg_ptr->nl_addr_info.attr_info.prefix_addr.ss_family) { IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv6 addr:0x%x:%x:%x:%x\n", @@ -1424,9 +1422,7 @@ static int ipa_nl_decode_nlmsg msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data, sizeof(data_all->mac_addr)); data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex; -#ifdef FEATURE_L2TP strlcpy(data_all->iface_name, dev_name, sizeof(data_all->iface_name)); -#endif /* Add support to replace src-mac as bridge0 mac */ if((msg_ptr->nl_neigh_info.metainfo.ndm_family == AF_BRIDGE) && (msg_ptr->nl_neigh_info.metainfo.ndm_state == NUD_PERMANENT)) @@ -1625,7 +1621,7 @@ int ipa_get_if_name return IPACM_FAILURE; } - (void)strncpy(if_name, ifr.ifr_name, sizeof(ifr.ifr_name)); + (void)strlcpy(if_name, ifr.ifr_name, sizeof(ifr.ifr_name)); IPACMDBG("interface name %s\n", ifr.ifr_name); close(fd); diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index 4b85c6e..d872222 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -445,8 +445,14 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (upstream_v6_up == false) { IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", gw_addr_v6.v6Addr[0], gw_addr_v6.v6Addr[1], gw_addr_v6.v6Addr[2], gw_addr_v6.v6Addr[3]); - post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); - upstream_v6_up = true; + /* check v6-address valid or not */ + if((gw_addr_v6.v6Addr[0] == 0) && (gw_addr_v6.v6Addr[1] ==0) && (gw_addr_v6.v6Addr[2] == 0) && (gw_addr_v6.v6Addr[3] == 0)) + { + IPACMDBG_H("Invliad ipv6-address, ignored v6-setupstream\n"); + } else { + post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); + upstream_v6_up = true; + } } else { IPACMDBG_H("already setupstream iface(%s) ipv6 previously\n", upstream_name); } @@ -480,8 +486,14 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (upstream_v6_up == false) { IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", gw_addr_v6.v6Addr[0], gw_addr_v6.v6Addr[1], gw_addr_v6.v6Addr[2], gw_addr_v6.v6Addr[3]); - post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); - upstream_v6_up = true; + /* check v6-address valid or not */ + if((gw_addr_v6.v6Addr[0] == 0) && (gw_addr_v6.v6Addr[1] ==0) && (gw_addr_v6.v6Addr[2] == 0) && (gw_addr_v6.v6Addr[3] == 0)) + { + IPACMDBG_H("Invliad ipv6-address, ignored v6-setupstream\n"); + } else { + post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); + upstream_v6_up = true; + } } else { IPACMDBG_H("already setupstream iface(%s) ipv6 previously\n", upstream_name); result = SUCCESS_DUPLICATE_CONFIG; @@ -639,7 +651,7 @@ int IPACM_OffloadManager::ipa_get_if_index(const char * if_name, int * if_index) } memset(&ifr, 0, sizeof(struct ifreq)); - (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); + (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) diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp index 6d57c39..cf16c71 100644 --- a/ipacm/src/IPACM_Wan.cpp +++ b/ipacm/src/IPACM_Wan.cpp @@ -1254,7 +1254,16 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) } } break; - +#ifdef FEATURE_IPACM_HAL + /* WA for WLAN to clean up NAT instance during SSR */ + case IPA_SSR_NOTICE: //sky + IPACMDBG_H("Received IPA_SSR_NOTICE event.\n"); + if(m_is_sta_mode == WLAN_WAN) + { + IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface + } + break; +#endif default: break; } diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index 14fe0b7..ec93233 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -910,6 +910,15 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) } } break; +#ifdef FEATURE_IPACM_HAL + /* WA for WLAN to clean up NAT instance during SSR */ + case IPA_SSR_NOTICE: + { + IPACMDBG_H("Received IPA_SSR_NOTICE event.\n"); + IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface + } + break; +#endif default: break; } |