Merge "IPACM: fix NAT-rules deleted before RT-rules when power-save"
diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h
index dac3ea8..43b33c4 100755
--- a/ipacm/inc/IPACM_ConntrackListener.h
+++ b/ipacm/inc/IPACM_ConntrackListener.h
@@ -65,8 +65,6 @@
 	 void TriggerWANDown(uint32_t wan_addr);
 	 int  CreateNatThreads(void);
 
-	 void HandlePowerSave(void *data);
-	 void HandleResetPower(void *data);
 	 void HandleNeighIpAddrEvt(void *data, bool);
 
 public:
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
old mode 100644
new mode 100755
index 7def2e9..18c349a
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -115,9 +115,7 @@
 	IPA_HANDLE_WAN_UP,                        /* 21 ipacm_event_iface_up  */
 	IPA_HANDLE_WAN_DOWN,                      /* 22 unsigned long  */
 	IPA_HANDLE_WLAN_UP,                       /* 23 ipacm_event_iface_up */
-	IPA_HANDLE_LAN_UP,                        /* 24 ipacm_event_iface_up */
-	IPA_HANDLE_POWER_SAVE,                    /* 25 ipacm_event_iface_up */
-	IPA_HANDLE_RESET_POWER_SAVE               /* 26 ipacm_event_iface_up */
+	IPA_HANDLE_LAN_UP                         /* 24 ipacm_event_iface_up */
 } ipa_cm_event_id;
 
 typedef enum
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
old mode 100644
new mode 100755
index fcab846..20eec98
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -47,6 +47,7 @@
 #include "IPACM_Filtering.h"
 #include "IPACM_Lan.h"
 #include "IPACM_Iface.h"
+#include "IPACM_Conntrack_NATApp.h"
 
 typedef struct _wlan_client_rt_hdl
 {
@@ -103,6 +104,8 @@
 	int num_wifi_client;
 	wlan_ampdu_flt_rules wlan_ampdu_flt_rule;
 
+	NatApp *Nat_App;
+
 	inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt)
 	{
 	    char *ret = ((char *)param) + (wlan_client_len * cnt);
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index 8d9a0e4..56eeb4d 100755
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -51,8 +51,6 @@
 	 IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, this);
 	 IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE, this);
 	 IPACM_EvtDispatcher::registr(IPA_HANDLE_WLAN_UP, this);
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_POWER_SAVE, this);
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_RESET_POWER_SAVE, this);
 	 IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, this);
 	 IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, this);
 }
@@ -118,17 +116,6 @@
 		 }
 		 break;
 
-
-	 case IPA_HANDLE_POWER_SAVE:
-		 IPACMDBG("Received IPA_HANDLE_POWER_SAVE event\n");
-		 HandlePowerSave(data);
-		 break;
-
-	 case IPA_HANDLE_RESET_POWER_SAVE:
-		 IPACMDBG("Received IPA_HANDLE_RESET_POWER_SAVE event\n");
-		 HandleResetPower(data);
-		 break;
-
 	 default:
 			IPACMDBG("Ignore cmd %d\n", evt);
 			break;
@@ -254,27 +241,10 @@
 
 }
 
-void IPACM_ConntrackListener::HandlePowerSave(void *in_param)
-{
-	ipacm_event_iface_up *pwrsv_data = (ipacm_event_iface_up *)in_param;
-
-	IPACM_ConntrackClient::iptodot("power save ip address",
-																 pwrsv_data->ipv4_addr);
-	NatApp::GetInstance()->UpdatePwrSaveIf(pwrsv_data->ipv4_addr);
-}
-
-void IPACM_ConntrackListener::HandleResetPower(void *in_param)
-{
-	ipacm_event_iface_up *pwrsv_data = (ipacm_event_iface_up *)in_param;
-
-	IPACM_ConntrackClient::iptodot("Reset power save ip address", 
-																 pwrsv_data->ipv4_addr);
-	NatApp::GetInstance()->ResetPwrSaveIf(pwrsv_data->ipv4_addr);
-}
-
 void IPACM_ConntrackListener::TriggerWANUp(void *in_param)
 {
 	 ipacm_event_iface_up *wanup_data = (ipacm_event_iface_up *)in_param;
+	 NatApp *na;
 
 	 IPACMDBG("Recevied below informatoin during wanup:\n");
 	 IPACMDBG("if_name:%s, ipv4_address:0x%x\n",
@@ -286,12 +256,17 @@
 		 return;
 	 }
 
-	 isWanUp = true;
-	 wan_ipaddr = wanup_data->ipv4_addr;
 	 IPACM_ConntrackClient::iptodot("public ip address", wanup_data->ipv4_addr);
+	 isWanUp = true;
 
+	 wan_ipaddr = wanup_data->ipv4_addr;
 	 memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname));
-	 NatApp::GetInstance()->AddTable(wanup_data->ipv4_addr);
+
+	 na = NatApp::GetInstance();
+	 if(na != NULL)
+	 {
+		 na->AddTable(wanup_data->ipv4_addr);
+	 }
 
 	 IPACMDBG("creating nat threads\n");
 	 CreateNatThreads();
@@ -395,8 +370,13 @@
 	 IPACMDBG("Deleting ipv4 nat table with ");
 	 IPACM_ConntrackClient::iptodot("public ip address", wan_addr);
 	 isWanUp = false;
+	 NatApp *na;
 
-	 NatApp::GetInstance()->DeleteTable(wan_addr);
+	 na = NatApp::GetInstance();
+	 if(na != NULL)
+	 {
+		 na->DeleteTable(wan_addr);
+	 }
 }
 
 
@@ -493,6 +473,7 @@
 	 nat_table_entry rule;
 	 u_int8_t tcp_state;
 	 uint32_t status = 0;
+	 NatApp *na = NULL;
 
 	 status = nfct_get_attr_u32(ct, ATTR_STATUS);
 
@@ -612,16 +593,23 @@
 
 	 if(IPPROTO_TCP == rule.protocol)
 	 {
+		        na = NatApp::GetInstance();
+			if(na == NULL)
+			{
+				IPACMERR("unable to get nat app instance");
+				return;
+			}
+
 			tcp_state = nfct_get_attr_u8(ct, ATTR_TCP_STATE);
 			if(TCP_CONNTRACK_ESTABLISHED == tcp_state)
 			{
 				 IPACMDBG("TCP state TCP_CONNTRACK_ESTABLISHED(%d)\n", tcp_state);
-				 NatApp::GetInstance()->AddEntry(&rule);
+				 na->AddEntry(&rule);
 			}
 			else if(TCP_CONNTRACK_FIN_WAIT == tcp_state)
 			{
 				 IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d)\n", tcp_state);
-				 NatApp::GetInstance()->DeleteEntry(&rule);
+				 na->DeleteEntry(&rule);
 			}
 			else
 			{
@@ -631,15 +619,22 @@
 	 }
 	 else if(IPPROTO_UDP == rule.protocol)
 	 {
+		  na = NatApp::GetInstance();
+			if(na == NULL)
+			{
+				IPACMERR("unable to get nat app instance");
+				return;
+			}
+
 			if(NFCT_T_NEW == type)
 			{
 				 IPACMDBG("New UDP connection at time %ld\n", time(NULL));
-				 NatApp::GetInstance()->AddEntry(&rule);
+				 na->AddEntry(&rule);
 			}
 			else if(NFCT_T_DESTROY == type)
 			{
 				 IPACMDBG("UDP connection close at time %ld\n", time(NULL));
-				 NatApp::GetInstance()->DeleteEntry(&rule);
+				 na->DeleteEntry(&rule);
 			}
 	 }
 	 else
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 615d7b9..065f4b0 100755
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -79,6 +79,13 @@
 		return;
 	}
 
+	Nat_App = NatApp::GetInstance();
+	if (Nat_App == NULL)
+	{
+		IPACMERR("unable to get Nat App instance \n");
+		return;
+	}
+
 	IPACMDBG("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
 	return;
 }
@@ -245,39 +252,30 @@
 				if ((wlan_index != IPACM_INVALID_INDEX) &&
 						(get_client_memptr(wlan_client, wlan_index)->power_save_set == true))
 				{
-				    if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true)
-				    {
-					ipacm_cmd_q_data evt_data;
-					ipacm_event_iface_up *data = NULL;
 
-					data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
-					if (data == NULL)
-					{
-						IPACMERR("unable to allocate memory\n");
-						return;
-					}
-
-					data->ipv4_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr;
-					evt_data.event = IPA_HANDLE_RESET_POWER_SAVE;
-					evt_data.evt_data = (void *)data;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					    IPACMDBG("recover client index(%d):ipv4 address: 0x%x\n", wlan_index, get_client_memptr(wlan_client, wlan_index)->v4_addr);
-				     }
 					IPACMDBG("change wlan client out of  power safe mode \n");
 					get_client_memptr(wlan_client, wlan_index)->power_save_set = false;
-				}
 				
-				
-                                if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */
-				{
-					handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
-				}				
+					/* First add route rules and then nat rules */
+                    if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */
+				    {
+						     IPACMDBG("recover client index(%d):ipv4 address: 0x%x\n",
+										 wlan_index,
+										 get_client_memptr(wlan_client, wlan_index)->v4_addr);
 
-				if(get_client_memptr(wlan_client, wlan_index)->ipv6_set == true) /* for ipv6 */
-				{
-					handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6);
-				}
-			}
+						IPACMDBG("Adding Route Rules\n");
+					    handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
+
+						IPACMDBG("Adding Nat Rules\n");
+						Nat_App->ResetPwrSaveIf(get_client_memptr(wlan_client, wlan_index)->v4_addr);
+				    }				
+
+				    if(get_client_memptr(wlan_client, wlan_index)->ipv6_set == true) /* for ipv6 */
+				    {
+					    handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6);
+				    }
+			    }
+		    }
 		}
 		break;
 
@@ -852,8 +850,6 @@
 int IPACM_Wlan::handle_wlan_client_pwrsave(uint8_t *mac_addr)
 {
 	int clt_indx;
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_iface_up *data;
 	IPACMDBG("wlan->handle_wlan_client_pwrsave();\n");
 
 	clt_indx = get_wlan_client_index(mac_addr);
@@ -865,24 +861,14 @@
 
         if (get_client_memptr(wlan_client, clt_indx)->power_save_set == false)
 	{
+		/* First reset nat rules and then route rules */
 	    if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true)
 	    {
-		data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
-		if (data == NULL)
-		{
-			IPACMERR("unable to allocate memory\n");
-			return IPACM_FAILURE;
-		}
-
-		data->ipv4_addr = get_client_memptr(wlan_client, clt_indx)->v4_addr ;
-		   IPACMDBG("power-save client index(%d):ipv4 address: 0x%x\n", clt_indx, get_client_memptr(wlan_client, clt_indx)->v4_addr);
-           
-           
-		evt_data.event = IPA_HANDLE_POWER_SAVE;
-		evt_data.evt_data = (void *)data;
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
+			IPACMDBG("Deleting Nat Rules\n");
+			Nat_App->UpdatePwrSaveIf(get_client_memptr(wlan_client, clt_indx)->v4_addr);
  	     }
  	  
+		IPACMDBG("Deleting default qos Route Rules\n");
 		delete_default_qos_rtrules(clt_indx, IPA_IP_v4);
 		delete_default_qos_rtrules(clt_indx, IPA_IP_v6);
                 get_client_memptr(wlan_client, clt_indx)->power_save_set = true;