Merge "ipa-cfg-mgr: Add Android.mk files for IPACM and IPANAT"
diff --git a/ipacm/inc/IPACM_Filtering.h b/ipacm/inc/IPACM_Filtering.h
index 48a3d66..7554ba9 100644
--- a/ipacm/inc/IPACM_Filtering.h
+++ b/ipacm/inc/IPACM_Filtering.h
@@ -69,7 +69,6 @@
 private:
 	static const char *DEVICE_NAME;
 	int fd; /* File descriptor of the IPA device node /dev/ipa */
-	int fd_wwan_ioctl;
 };
 
 #endif //IPACM_FILTERING_H
diff --git a/ipacm/src/IPACM_Filtering.cpp b/ipacm/src/IPACM_Filtering.cpp
index fac26a2..4882ebb 100644
--- a/ipacm/src/IPACM_Filtering.cpp
+++ b/ipacm/src/IPACM_Filtering.cpp
@@ -57,18 +57,11 @@
 	{
 		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
 	}
-
-	fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
-	if(fd_wwan_ioctl < 0)
-	{
-		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
-	}
 }
 
 IPACM_Filtering::~IPACM_Filtering()
 {
 	close(fd);
-	close(fd_wwan_ioctl);
 }
 
 bool IPACM_Filtering::DeviceNodeIsOpened()
@@ -238,16 +231,12 @@
 	int ret = 0, cnt, num_rules = 0, pos = 0;
 	ipa_install_fltr_rule_req_msg_v01 qmi_rule_msg;
 
+	int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
 	if(fd_wwan_ioctl < 0)
 	{
-		IPACMERR("WWAN ioctl is not open.\n");
+		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
 		return false;
 	}
-	else
-	{
-		IPACMDBG("WWAN ioctl is open.\n");
-	}
-   
 
 	if(rule_table_v4 != NULL)
 	{
@@ -263,6 +252,7 @@
 	if(num_rules > QMI_IPA_MAX_FILTERS_V01)
 	{
 		IPACMERR("The number of filtering rules exceed limit.\n");
+		close(fd_wwan_ioctl);
 		return false;
 	}
 	else
@@ -329,20 +319,22 @@
 		if (ret != 0)
 		{
 			IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_msg, ret);
+			close(fd_wwan_ioctl);
 			return false;
 		}
 	}
 	IPACMDBG("Added Filtering rule %p\n", &qmi_rule_msg);
+	close(fd_wwan_ioctl);
 	return true;
 }
 
 bool IPACM_Filtering::SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table)
 {
 	int ret = 0;
-
+	int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
 	if(fd_wwan_ioctl < 0)
 	{
-		IPACMERR("WWAN ioctl is not open.\n");
+		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
 		return false;
 	}
 
@@ -350,10 +342,12 @@
 	if (ret != 0)
 	{
 		IPACMERR("Failed adding filtering rule index %p with ret %d\n", table, ret);
+		close(fd_wwan_ioctl);
 		return false;
 	}
 
 	IPACMDBG("Added Filtering rule index %p\n", table);
+	close(fd_wwan_ioctl);
 	return true;
 }
 
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 6fb2e5c..293c311 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -511,6 +511,7 @@
 	if(iface_query == NULL)
 	{
 		IPACMERR("Unable to allocate iface_query memory.\n");
+		close(fd);
 		return IPACM_FAILURE;
 	}
 	IPACMDBG("iface name %s\n", dev_name);
@@ -531,6 +532,7 @@
 		if(tx_prop == NULL)
 		{
 			IPACMERR("Unable to allocate tx_prop memory.\n");
+			close(fd);
 			return IPACM_FAILURE;
 		}
 	memcpy(tx_prop->name, dev_name, sizeof(tx_prop->name));
@@ -562,6 +564,7 @@
 		if(rx_prop == NULL)
 		{
 			IPACMERR("Unable to allocate rx_prop memory.\n");
+			close(fd);
 			return IPACM_FAILURE;
 		}
 	memcpy(rx_prop->name, dev_name,
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index d579952..9c616af 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -210,6 +210,11 @@
 
 	while(true)
 	{
+	    for(i = 0; i < sk_fd_set->num_fd; i++ )
+		{
+			FD_SET(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset));
+		}
+
 		if((ret = select(sk_fd_set->max_fd + 1, &(sk_fd_set->fdset), NULL, NULL, NULL)) < 0)
 		{
 			IPACMERR("ipa_nl select failed\n");
@@ -230,6 +235,7 @@
 											 i,
 											 sk_fd_set->sk_fds[i].sk_fd);
 						}
+						FD_CLR(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset));
 					}
 					else
 					{
@@ -1595,6 +1601,7 @@
 	if(ipa_nl_addfd_map(sk_fdset, sk_info.sk_fd, read_f) != IPACM_SUCCESS)
 	{
 		IPACMERR("cannot add nl routing sock for reading\n");
+		close(sk_info.sk_fd);
 		return IPACM_FAILURE;
 	}
 
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 7993ce5..aeda460 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -2462,6 +2462,7 @@
 			IPACMERR("ioctl IPA_IOC_QUERY_INTF_EXT_PROPS failed\n");
 			/* ext_prop memory will free when iface-down*/
 			free(ext_prop);
+			close(fd);
 			return ret;
 		}
 
@@ -2480,6 +2481,7 @@
 			IPACM_Wan::is_ext_prop_set = true;
 		}
 		free(ext_prop);
+		close(fd);
 	}
 	return IPACM_SUCCESS;
 }
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index e111bfd..68cf88b 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -959,6 +959,7 @@
 	if (pFilteringTable == NULL)
 	{
 		IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
+		close(fd);
 		return IPACM_FAILURE;
 	}
 	memset(pFilteringTable, 0, len);
@@ -2803,4 +2804,4 @@
 		}
 	}
 	return IPACM_SUCCESS;
-}
\ No newline at end of file
+}