summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnav_s <arnav_s@codeaurora.org>2017-12-06 13:42:26 -0700
committerarnav_s <arnav_s@codeaurora.org>2017-12-06 13:42:26 -0700
commit0e38a37f4bc8809217b76be8d10fc3aded89320b (patch)
treeda34de5041d4017442d23e9468e1575f0a737e9c
parentbad4d1f535707a060d0bcb330c97e4a1bbbacfde (diff)
parentbb4759e1eb24372b823d15da74997121e224b1d3 (diff)
downloadipacfg-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.h1
-rw-r--r--hal/src/HAL.cpp8
-rw-r--r--hal/src/PrefixParser.cpp6
-rw-r--r--ipacm/inc/IPACM_Defs.h5
-rw-r--r--ipacm/inc/IPACM_Lan.h2
-rw-r--r--ipacm/src/IPACM_Config.cpp22
-rw-r--r--ipacm/src/IPACM_IfaceManager.cpp4
-rw-r--r--ipacm/src/IPACM_Lan.cpp62
-rw-r--r--ipacm/src/IPACM_Log.cpp2
-rw-r--r--ipacm/src/IPACM_Main.cpp5
-rw-r--r--ipacm/src/IPACM_Neighbor.cpp3
-rw-r--r--ipacm/src/IPACM_Netlink.cpp6
-rw-r--r--ipacm/src/IPACM_OffloadManager.cpp22
-rw-r--r--ipacm/src/IPACM_Wan.cpp11
-rw-r--r--ipacm/src/IPACM_Wlan.cpp9
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;
}