Merge "IPACM: IPANAT changes for 9x35"
diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp
index 1f1fd5a..cff8e7a 100755
--- a/ipacm/src/IPACM_ConntrackClient.cpp
+++ b/ipacm/src/IPACM_ConntrackClient.cpp
@@ -474,7 +474,8 @@
 		return NULL;
 	}
 
-	pClient->tcp_hdl = nfct_open(CONNTRACK, NF_NETLINK_CONNTRACK_UPDATE);
+	pClient->tcp_hdl = nfct_open(CONNTRACK, 
+						(NF_NETLINK_CONNTRACK_UPDATE |NF_NETLINK_CONNTRACK_DESTROY));
 	if(pClient->tcp_hdl == NULL)
 	{
 		PERROR("nfct_open\n");
@@ -510,7 +511,9 @@
 
 	/* Register callback with netfilter handler */
 	IPACMDBG("tcp handle:%p, fd:%d\n", pClient->tcp_hdl, nfct_fd(pClient->tcp_hdl));
-	nfct_callback_register(pClient->tcp_hdl, NFCT_T_UPDATE, IPAConntrackEventCB, NULL);
+	nfct_callback_register(pClient->tcp_hdl, 
+				(NFCT_T_UPDATE | NFCT_T_DESTROY), 
+						IPAConntrackEventCB, NULL);
 
 	/* Block to catch events from net filter connection track */
 	/* nfct_catch() receives conntrack events from kernel-space, by default it 
@@ -556,7 +559,7 @@
 	}
 
 	pClient->udp_hdl = nfct_open(CONNTRACK,
-															 NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY);
+					(NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY));
 	if(pClient->udp_hdl == NULL)
 	{
 		PERROR("nfct_open\n");
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index 87b5ec4..bfa2f37 100755
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -476,6 +476,7 @@
 	 NatApp *na = NULL;
 	 uint32_t orig_src_ip, orig_dst_ip;
 
+	 IPACMDBG("Received type:%d with proto:%d", type, l4proto);
 	 status = nfct_get_attr_u32(ct, ATTR_STATUS);
 
 	 if(IPS_DST_NAT & status)
@@ -662,9 +663,11 @@
 				 IPACMDBG("TCP state TCP_CONNTRACK_ESTABLISHED(%d)\n", tcp_state);
 				 na->AddEntry(&rule);
 			}
-			else if(TCP_CONNTRACK_FIN_WAIT == tcp_state)
+			else if(TCP_CONNTRACK_FIN_WAIT == tcp_state ||
+			        type == NFCT_T_DESTROY)
 			{
-				 IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d)\n", tcp_state);
+				 IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d) "
+						"or type NFCT_T_DESTROY(%d)\n", tcp_state, type);
 				 na->DeleteEntry(&rule);
 			}
 			else
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 5ca7988..f7aae25 100755
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -294,6 +294,10 @@
 					return;
 				}
 				handle_wlan_client_route_rule(data->mac_addr, data->iptype);
+				if (data->iptype == IPA_IP_v4)
+				{
+					Nat_App->ResetPwrSaveIf(data->ipv4_addr);
+				}
 			}
 		}
 		break;