Merge remote-tracking branch 'goog/qcom/release/LA.UM.7.3.9.00009.1'

Change-Id: I2c75ae7ed4c2d6bf446e1498b50e9da183bc126f
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 @@
     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 @@
     } 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 @@
 	/* 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 @@
     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_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 @@
 
 	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 @@
 		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 @@
 
 	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 @@
 
 	/* 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_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 @@
 	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 @@
 			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 @@
 		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 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 @@
 
 	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,17 +3297,6 @@
 				{
 					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[3];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4)
@@ -3314,7 +3313,34 @@
 					= 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)
+				{
+					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9);
+				}
+				else
+				{
+					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<10);
+				}
+				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 0)
+					= 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[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[3];
+				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 0)
+					= 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[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[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 @@
 				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 @@
 				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 @@
 		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 @@
 		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_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 @@
 								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 @@
 
 				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 @@
 		    			 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 @@
 		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 b13460a..d872222 100644
--- a/ipacm/src/IPACM_OffloadManager.cpp
+++ b/ipacm/src/IPACM_OffloadManager.cpp
@@ -651,7 +651,7 @@
 	}
 
 	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)