Merge "Fix include path to point to sysroot"
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index 19ddbec..12887ce 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -57,6 +57,7 @@
 #define IPA_WLAN_PARTIAL_HDR_OFFSET  12 // dst mac first then src mac
 #define IPA_VIRTUAL_IFACE_NAME "bridge0"
 #define IPA_WLAN_PARTIAL_HDR_NAME  "IEEE802_3"
+#define IPA_WAN_PARTIAL_HDR_NAME  "IEEE802_3STA"
 #define IPA_MAX_IFACE_ENTRIES 15
 #define IPA_MAX_PRIVATE_SUBNET_ENTRIES 3
 #define IPA_MAX_ALG_ENTRIES 10
@@ -86,28 +87,30 @@
 ===========================================================================*/
 typedef enum
 {
-	IPA_LINK_UP_EVENT = 1,                    /* ipacm_event_data_fid */
+	IPA_LINK_UP_EVENT = 1,                    /* 1 ipacm_event_data_fid */
 	IPA_LINK_DOWN_EVENT,                      /* 2 ipacm_event_data_fid */
 	IPA_ADDR_ADD_EVENT,                       /* 3 ipacm_event_data_addr */
 	IPA_ADDR_DEL_EVENT,                       /* 4 no use */
 	IPA_ROUTE_ADD_EVENT,                      /* 5 ipacm_event_data_addr */
 	IPA_ROUTE_DEL_EVENT,                      /* 6 ipacm_event_data_addr */
 	IPA_FIREWALL_CHANGE_EVENT,                /* 7 NULL */
-	IPA_WLAN_CLIENT_ADD_EVENT,                /* 8 ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_DEL_EVENT,                /* 9 ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_POWER_SAVE_EVENT,         /* 10 ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_RECOVER_EVENT,            /* 11 ipacm_event_data_mac */
-	IPA_NEW_NEIGH_EVENT,                      /* 12 ipacm_event_data_all */
-	IPA_DEL_NEIGH_EVENT,                      /* 13 ipacm_event_data_all */
-	IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT,       /* 14 ipacm_event_data_all */
-	IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT,       /* 15 ipacm_event_data_all */
-	IPA_SW_ROUTING_ENABLE,                    /* 16 NULL */
-	IPA_SW_ROUTING_DISABLE,                   /* 17 NULL */
-	IPA_PROCESS_CT_MESSAGE,                   /* 18 ipacm_ct_evt_data */
-	IPA_HANDLE_WAN_UP,                        /* 19 unsigned long  */
-	IPA_HANDLE_WAN_DOWN,                      /* 20 unsigned long  */
-	IPA_HANDLE_WLAN_UP,                       /* 21 unsigned long  */
-	IPA_HANDLE_LAN_UP                         /* 22 unsigned long  */
+	IPA_WLAN_AP_LINK_UP_EVENT,                /* 8 ipacm_event_data_mac */
+	IPA_WLAN_STA_LINK_UP_EVENT,               /* 9 ipacm_event_data_mac */
+	IPA_WLAN_CLIENT_ADD_EVENT,                /* 10 ipacm_event_data_mac */
+	IPA_WLAN_CLIENT_DEL_EVENT,                /* 11 ipacm_event_data_mac */
+	IPA_WLAN_CLIENT_POWER_SAVE_EVENT,         /* 12 ipacm_event_data_mac */
+	IPA_WLAN_CLIENT_RECOVER_EVENT,            /* 13 ipacm_event_data_mac */
+	IPA_NEW_NEIGH_EVENT,                      /* 14 ipacm_event_data_all */
+	IPA_DEL_NEIGH_EVENT,                      /* 15 ipacm_event_data_all */
+	IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT,       /* 16 ipacm_event_data_all */
+	IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT,       /* 17 ipacm_event_data_all */
+	IPA_SW_ROUTING_ENABLE,                    /* 18 NULL */
+	IPA_SW_ROUTING_DISABLE,                   /* 19 NULL */
+	IPA_PROCESS_CT_MESSAGE,                   /* 20 ipacm_ct_evt_data */
+	IPA_HANDLE_WAN_UP,                        /* 21 unsigned long  */
+	IPA_HANDLE_WAN_DOWN,                      /* 22 unsigned long  */
+	IPA_HANDLE_WLAN_UP,                       /* 23 unsigned long  */
+	IPA_HANDLE_LAN_UP                         /* 24 unsigned long  */
 } ipa_cm_event_id;
 
 typedef enum
@@ -115,7 +118,8 @@
 	LAN_IF = 0,
 	WLAN_IF,
 	WAN_IF,
-	VIRTUAL_IF
+	VIRTUAL_IF,
+	UNKNOWN_IF
 } ipacm_iface_type;
 
 typedef struct
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index da7fd06..bedc75d 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -77,9 +77,12 @@
 	uint32_t firewall_hdl_v6[IPACM_MAX_FIREWALL_ENTRIES];
 	uint32_t dft_wan_fl_hdl[IPA_NUM_DEFAULT_WAN_FILTER_RULES];
 	int num_firewall_v4,num_firewall_v6;
+	uint32_t wan_v4_addr;
 	bool active_v4;
 	bool active_v6;
-	uint32_t wan_v4_addr;
+	bool header_set;
+	bool header_partial_default_wan_v4;
+	bool header_partial_default_wan_v6;
 
 	/* IPACM firewall Configuration file*/
 	IPACM_firewall_conf_t firewall_config;
@@ -88,7 +91,7 @@
 	int handle_addr_evt(ipacm_event_data_addr *data);
 
 	/* wan default route/filter rule configuration */
-	int handle_route_add_evt(ipacm_event_data_addr *data);
+	int handle_route_add_evt(ipa_ip_type iptype);
 
 	/* wan default route/filter rule delete */	
 	int handle_route_del_evt(ipa_ip_type iptype);
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
index 0535584..a720046 100644
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -64,6 +64,7 @@
 	bool route_rule_set_v6;
 	bool ipv4_set;
 	bool ipv6_set;
+	bool power_save_set;
 	wlan_client_rt_hdl wifi_rt_hdl[0]; /* depends on number of tx properties */
 }ipa_wlan_client;
 
diff --git a/ipacm/inc/IPACM_Xml.h b/ipacm/inc/IPACM_Xml.h
index 93e92a6..7079791 100644
--- a/ipacm/inc/IPACM_Xml.h
+++ b/ipacm/inc/IPACM_Xml.h
@@ -88,6 +88,7 @@
 #define LANIF_TAG                            "LAN"
 #define WLANIF_TAG                           "WLAN"
 #define VIRTUALIF_TAG                        "VIRTUAL"
+#define UNKNOWNIF_TAG                        "UNKNOWN"
 #define IPACMALG_TAG                         "IPACMALG"
 #define ALG_TAG                              "ALG"
 #define Protocol_TAG                         "Protocol"
diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp
index 7e48822..3ef2f5e 100644
--- a/ipacm/src/IPACM_ConntrackClient.cpp
+++ b/ipacm/src/IPACM_ConntrackClient.cpp
@@ -399,7 +399,7 @@
 	if(pClient == NULL)
 	{
 		IPACMERR("unable to get conntrack client instance\n");
-		return -1;
+		return NULL;
 	}
 
 	pClient->tcp_hdl = nfct_open(CONNTRACK, NF_NETLINK_CONNTRACK_UPDATE);
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index 391c20a..f11e9be 100644
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -65,13 +65,19 @@
 
 	 case IPA_HANDLE_WAN_UP:
 			IPACMDBG("Received IPA_HANDLE_WAN_UP event\n");
-			TriggerWANUp(data);
+			if(isWanUp == false)
+			{
+				TriggerWANUp(data);
+			}
 			break;
 
 	 case IPA_HANDLE_WAN_DOWN:
 			IPACMDBG("Received IPA_HANDLE_WAN_DOWN event\n");
 			pub_addr = (uint32_t *)data;
-			TriggerWANDown(*pub_addr);
+			if(isWanUp == true)
+			{
+				TriggerWANDown(*pub_addr);
+			}
 			break;
 
 	/* if wlan or lan comes up after wan interface, modify
@@ -100,6 +106,12 @@
 	 IPACMDBG("if_name:%s, ipv4_address:0x%x\n",
 						wanup_data->ifname, wanup_data->ipv4_addr);
 
+	 if(wanup_data->ipv4_addr == 0)
+	 {
+		 IPACMERR("Invalid ipv4 address,ignoring IPA_HANDLE_WAN_UP event\n");
+		 return;
+	 }
+
 	 isWanUp = true;
 	 wan_ipaddr = wanup_data->ipv4_addr;
 	 IPACM_ConntrackClient::iptodot("public ip address", wanup_data->ipv4_addr);
@@ -125,7 +137,7 @@
 				 if(0 != ret)
 				 {
 						IPACMERR("unable to create TCP conntrack event listner thread\n");
-						PERROR("unable to create TCP conntrack");
+						PERROR("unable to create TCP conntrack\n");
 						return -1;
 				 }
 
@@ -138,7 +150,7 @@
 				 if(0 != ret)
 				 {
 						IPACMERR("unable to create UDP conntrack event listner thread\n");
-						PERROR("unable to create UDP conntrack");
+						PERROR("unable to create UDP conntrack\n");
 						goto error;
 				 }
 
@@ -151,7 +163,7 @@
 				 if(0 != ret)
 				 {
 						IPACMERR("unable to create udp conn timeout thread\n");
-						PERROR("unable to create udp conn timeout");
+						PERROR("unable to create udp conn timeout\n");
 						goto error;
 				 }
 
diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp
index 63b158c..8e5ee41 100644
--- a/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -53,6 +53,7 @@
 int NatApp::Init(void)
 {
 	IPACM_Config *pConfig;
+	int size = 0;
 
 	pConfig = IPACM_Config::GetInstance();
 	if(pConfig == NULL)
@@ -63,13 +64,15 @@
 
 	max_entries = pConfig->GetNatMaxEntries();
 
-	cache = (nat_table_entry *)malloc(sizeof(nat_table_entry) * max_entries);
+	size = (sizeof(nat_table_entry) * max_entries);
+	cache = (nat_table_entry *)malloc(size);
 	if(cache == NULL)
 	{
 		IPACMERR("Unable to allocate memory for cache\n");
 		goto fail;
 	}
-	memset(cache, 0, sizeof(nat_table_entry) * max_entries);
+	IPACMDBG("Allocated %d bytes for config manager nat cache\n", size);
+	memset(cache, 0, size);
 
 	nALGPort = pConfig->GetAlgPortCnt();
 	pALGPorts = (ipacm_alg *)malloc(sizeof(ipacm_alg) * nALGPort);
diff --git a/ipacm/src/IPACM_EvtDispatcher.cpp b/ipacm/src/IPACM_EvtDispatcher.cpp
index aa72dd6..60f0e8d 100644
--- a/ipacm/src/IPACM_EvtDispatcher.cpp
+++ b/ipacm/src/IPACM_EvtDispatcher.cpp
@@ -121,10 +121,13 @@
 		if(data->event == tmp->event)
 		{
 			tmp->obj->event_callback(data->event, data->evt_data);
+			IPACMDBG(" Find matched registered events\n");
 		}
 		tmp = tmp->next;
 	}
 
+	IPACMDBG(" Finished process events\n");
+			
 	if(data->evt_data != NULL)
 	{
 		IPACMDBG("free the event:%d data: %p\n", data->event, data->evt_data);
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 36f44ca..114c90c 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -53,12 +53,15 @@
 
 IPACM_IfaceManager::IPACM_IfaceManager() 
 {
-	IPACM_EvtDispatcher::registr(IPA_LINK_UP_EVENT, this); // skylar fix register name, class name
-	return; //skylar no interface_id
+	IPACM_EvtDispatcher::registr(IPA_LINK_UP_EVENT, this);         
+	IPACM_EvtDispatcher::registr(IPA_WLAN_AP_LINK_UP_EVENT, this);  // register for wlan AP-iface
+	IPACM_EvtDispatcher::registr(IPA_WLAN_STA_LINK_UP_EVENT, this); // register for wlan STA-iface
+	return;
 }
 
-void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param) //skylar rename:event_callback
+void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param)
 {
+  int ipa_interface_index;
 	ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param;
 	switch(event)
 	{
@@ -68,6 +71,39 @@
 		create_iface_instance(evt_data->if_index);
 		break;
 
+	case IPA_WLAN_AP_LINK_UP_EVENT:
+	    ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
+		/* change iface category from unknown to WLAN_IF */
+		if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == UNKNOWN_IF)
+		{  
+		  IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WLAN_IF; 
+		  IPACMDBG("WLAN AP (%s) link up, iface: %d: \n", 
+							     IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);		
+		  create_iface_instance(evt_data->if_index);
+		}
+		else
+		{
+		  IPACMDBG("iface %s already up and act as %d mode: \n",
+							 IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,
+							 IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat);		
+		}
+		break;
+
+	case IPA_WLAN_STA_LINK_UP_EVENT:
+	    ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
+		/* change iface category from unknown to WAN_IF */
+		if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat==UNKNOWN_IF)
+		{  
+		  IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WAN_IF; 
+		  IPACMDBG("WLAN STA (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);		
+		  create_iface_instance(evt_data->if_index);
+		}
+		else
+		{
+		  IPACMDBG("iface %s already up and act as %d mode: \n",IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat);		
+		}
+		break;
+		
 	default:
 		break;
 	}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index cc6eec1..b5f178c 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -99,6 +99,17 @@
 		{
 			ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
 			ipa_interface_index = iface_ipa_index_query(data->if_index);
+
+			if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) ||
+					 (data->iptype == IPA_IP_v6 && 
+						data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && 
+					  data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) )
+			{
+				IPACMDBG("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
+				return;
+			}
+
+
 			if (ipa_interface_index == ipa_if_num)
 			{
 				IPACMDBG("Received IPA_ADDR_ADD_EVENT\n");
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 446cd6a..42be223 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -12,7 +12,7 @@
 			with the distribution.
 		* Neither the name of The Linux Foundation nor the names of its
 			contributors may be used to endorse or promote products derived
-			from this software without specific prior written permission.																								from this software without specific prior written permission.
+			from this software without specific prior written permission.																								
 
 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
@@ -130,7 +130,7 @@
 
 		if (length < 0)
 		{
-			IPACMDBG("inotify read() error return length: %d and mask: 0x%x 0x%x\n", length, event->mask, mask);
+			IPACMERR("inotify read() error return length: %d and mask: 0x%x 0x%x\n", length, event->mask, mask);
 			return NULL;
 		}
 
@@ -218,21 +218,46 @@
 		case SW_ROUTING_ENABLE:
 			IPACMDBG("Received SW_ROUTING_ENABLE\n");
 			evt_data.event = IPA_SW_ROUTING_ENABLE;
-			evt_data.evt_data = NULL;
 			break;
 
 		case SW_ROUTING_DISABLE:
 			IPACMDBG("Received SW_ROUTING_DISABLE\n");
 			evt_data.event = IPA_SW_ROUTING_DISABLE;
-			evt_data.evt_data = NULL;
 			break;
 
+		case WLAN_AP_CONNECT:
+			IPACMDBG("Received WLAN_AP_CONNECT name: %s\n",event->name);
+			IPACMDBG("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
+							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
+							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
+
+			memcpy(data->mac_addr,
+						 event->mac_addr,
+						 sizeof(event->mac_addr));
+			ipa_get_if_index(event->name, &(data->if_index));
+			evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT;
+			evt_data.evt_data = data;
+			break;
+
+		case WLAN_STA_CONNECT:
+			IPACMDBG("Received WLAN_STA_CONNECT name: %s\n",event->name);
+			IPACMDBG("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
+							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
+							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
+			memcpy(data->mac_addr,
+						 event->mac_addr,
+						 sizeof(event->mac_addr));
+			ipa_get_if_index(event->name, &(data->if_index));
+
+			evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT;
+			evt_data.evt_data = data;
+			break;
+						
 		case WLAN_CLIENT_CONNECT:
 			IPACMDBG("Received WLAN_CLIENT_CONNECT\n");
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-
 		  evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT;
 			evt_data.evt_data = data;
 			ipa_get_if_index(event->name, &(data->if_index));
@@ -246,20 +271,19 @@
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-
 			memcpy(data->mac_addr,
 						 event->mac_addr,
 						 sizeof(event->mac_addr));
 			ipa_get_if_index(event->name, &(data->if_index));
 
 			evt_data.event = IPA_WLAN_CLIENT_DEL_EVENT;
-			evt_data.evt_data = data;
-			
+			evt_data.evt_data = data;			
 			break;
 
 		case WLAN_CLIENT_POWER_SAVE_MODE:
+#if 0
 			IPACMDBG("Received WLAN_CLIENT_POWER_SAVE_MODE\n");
-			IPACMDBG("Mac Address [0]:%2d [1]:%2d [2]:%2d [3]:%2d [4]:%2d [5]%2d\n",
+			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
 
@@ -269,13 +293,14 @@
 			evt_data.evt_data = data;
 			memcpy(data->mac_addr,
 						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			
+						 sizeof(event->mac_addr));			
+#endif
 			break;
 
 		case WLAN_CLIENT_NORMAL_MODE:
+#if 0
 			IPACMDBG("Received WLAN_CLIENT_NORMAL_MODE\n");
-			IPACMDBG("Mac Address [0]:%2d [1]:%2d [2]:%2d [3]:%2d [4]:%2d [5]%2d\n",
+			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
 
@@ -285,18 +310,27 @@
 			ipa_get_if_index(event->name, &(data->if_index));
 			evt_data.evt_data = data;
 			evt_data.event = IPA_WLAN_CLIENT_RECOVER_EVENT;
+#endif
+			break;
+
+		case WLAN_AP_DISCONNECT:
+			IPACMDBG("Ignoring WLAN_AP_DISCONNECT\n");
+			break;
+
+		case WLAN_STA_DISCONNECT:
+			IPACMDBG("Ignoring WLAN_STA_DISCONNET\n");
 			break;
 
 		default:
-			IPACMDBG("Invalid message\n");
-			free(data);
-			continue;
+			IPACMERR("Unhandled message type: %d\n", event_hdr->msg_type);
+			break;
 
 		}
 
 		/* finish command queue */
 		if (evt_data.evt_data == NULL)
 		{
+			IPACMDBG("free the event data memory as there is no data\n");
 			free(data);
 		}
 
@@ -416,6 +450,7 @@
 	if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0)
 	{
 		PERROR("call_ioctl_on_dev: ioctl failed:");
+    *if_index = -1;
 		close(fd);
 		return IPACM_FAILURE;
 	}
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 237c4d9..aae30ed 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -58,7 +58,10 @@
 
 	active_v4 = false;
 	active_v6 = false;
-
+  header_set = false;
+  header_partial_default_wan_v4 = false;
+	header_partial_default_wan_v6 = false;
+	
 	IPACMDBG(" IPACM->IPACM_Wan(%d) constructor: Tx:%d\n", ipa_if_num, iface_query->num_tx_props);
 	return;
 }
@@ -197,6 +200,16 @@
 		{
 			ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
 			ipa_interface_index = iface_ipa_index_query(data->if_index);
+
+			if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) ||
+					 (data->iptype == IPA_IP_v6 && 
+						data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && 
+					  data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) )
+			{
+				IPACMDBG("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
+				return;
+			}
+
 			if (ipa_interface_index == ipa_if_num)
 			{
 				/* check v4 not setup before, v6 can have 2 iface ip */
@@ -224,7 +237,7 @@
 				if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask))
 				{
 					IPACMDBG("adding routing table\n");
-					handle_route_add_evt(data);
+				  handle_route_add_evt(data->iptype);
 					IPACM_Wan::wan_up = true;
 					active_v4 = true;
 					config_dft_firewall_rules(IPA_IP_v4);
@@ -235,7 +248,7 @@
 					IPACMDBG("\n get default v6 route (dst:00.00.00.00)\n");
 					IPACMDBG(" IPV6 value: %08x:%08x:%08x:%08x \n",
 									 data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-					handle_route_add_evt(data);
+				  	handle_route_add_evt(data->iptype);
 					active_v6 = true;
 					config_dft_firewall_rules(IPA_IP_v6);
 				}
@@ -273,7 +286,7 @@
 			ipa_interface_index = iface_ipa_index_query(data->if_index);
 			if (ipa_interface_index == ipa_if_num)
 			{
-				IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT\n");
+				IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n");
 				handle_header_add_evt(data->mac_addr);
 			}
 		}
@@ -315,7 +328,7 @@
 }
 
 /* wan default route/filter rule configuration */
-int IPACM_Wan::handle_route_add_evt(ipacm_event_data_addr *data)
+int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
 {
 
 	/* add default WAN route */
@@ -325,8 +338,52 @@
 	uint32_t tx_index;
 	const int NUM = 1;
 	ipacm_cmd_q_data evt_data;
+	struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/
 
-	IPACMDBG(" ip-type:%d\n", data->iptype);
+	IPACMDBG(" ip-type:%d\n", iptype);
+
+	/* copy header from tx-property, see if partial or not */
+	/* assume all tx-property uses the same header name */
+
+	if(tx_prop->tx[0].hdr_name != NULL)
+	{
+	    memset(&sCopyHeader, 0, sizeof(sCopyHeader));
+	    memcpy(sCopyHeader.name,
+	    			 tx_prop->tx[0].hdr_name,
+	    			 sizeof(sCopyHeader.name));
+        
+	    IPACMDBG("header name: %s\n", sCopyHeader.name);
+	    if (m_header.CopyHeader(&sCopyHeader) == false)
+	    {
+	    	IPACMERR("ioctl copy header failed");
+	    	return IPACM_FAILURE;
+	    }        
+	    IPACMDBG("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
+		if(sCopyHeader.is_partial)
+		{
+ 	       IPACMDBG("Not setup default WAN routing rules cuz the header is not complete\n");
+           if(iptype==IPA_IP_v4)
+		   {
+		      header_partial_default_wan_v4 = true;
+           }
+		   else		   
+		   {
+		      header_partial_default_wan_v6 = true;
+		   }
+		   return IPACM_SUCCESS;
+		}
+		{
+           if(iptype==IPA_IP_v4)
+		   {
+		      header_partial_default_wan_v4 = false;
+           }
+		   else		   
+		   {
+		      header_partial_default_wan_v6 = false;
+		   }
+		   
+		}
+    }
 
 	rt_rule = (struct ipa_ioc_add_rt_rule *)
 		 calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
@@ -340,9 +397,9 @@
 
 	rt_rule->commit = 1;
 	rt_rule->num_rules = (uint8_t)NUM;
-	rt_rule->ip = data->iptype;
+	rt_rule->ip = iptype;
 
-	if (data->iptype == IPA_IP_v4) 
+	if (iptype == IPA_IP_v4) 
 	{
 		strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name);
 	}
@@ -357,10 +414,10 @@
 
 	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
 	{
-		if (data->iptype != tx_prop->tx[tx_index].ip)
+		if(iptype != tx_prop->tx[tx_index].ip)
 		{
 			IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n", 
-							    tx_index, tx_prop->tx[tx_index].ip,data->iptype);		
+							    tx_index, tx_prop->tx[tx_index].ip,iptype);		
 			continue;
 		}
 
@@ -387,21 +444,21 @@
 					 sizeof(rt_rule_entry->rule.attrib));
 
 		rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		if (data->iptype == IPA_IP_v4)
+		if (iptype == IPA_IP_v4)
 		{
-			rt_rule_entry->rule.attrib.u.v4.dst_addr      = data->ipv4_addr;
-			rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = data->ipv4_addr_mask;
+			rt_rule_entry->rule.attrib.u.v4.dst_addr      = 0;
+			rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0;
 		}
 		else
 		{
-			rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = data->ipv6_addr_mask[0];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = data->ipv6_addr_mask[1];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = data->ipv6_addr_mask[2];
-			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = data->ipv6_addr_mask[3];
+			rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0;
+			rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0;
 		}
 
 		if (false == m_routing.AddRoutingRule(rt_rule))
@@ -411,13 +468,13 @@
 			return IPACM_FAILURE;
 		}
 
-		if (data->iptype == IPA_IP_v4)
+		if (iptype == IPA_IP_v4)
 		{
 			wan_route_rule_v4_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
 			IPACMDBG("Got ipv4 wan-route rule hdl:0x%x,tx:%d,ip-type: %d \n",
 							 wan_route_rule_v4_hdl[tx_index],
 							 tx_index,
-							 data->iptype);
+						 iptype);
 		}
 		else
 		{
@@ -425,12 +482,12 @@
 			IPACMDBG("Got ipv6 wan-route rule hdl:0x%x,tx:%d,ip-type: %d \n",
 							 wan_route_rule_v6_hdl[tx_index],
 							 tx_index,
-							 data->iptype);
+		                 iptype);
 		}
 	}
 	free(rt_rule);
 
-	if (data->iptype == IPA_IP_v4)
+	if (iptype == IPA_IP_v4)
 	{
 		ipacm_event_iface_up *wanup_data;
 
@@ -539,85 +596,124 @@
 /* construct complete ethernet header */
 int IPACM_Wan::handle_header_add_evt(uint8_t mac_addr[6])
 {
-	char index[2];
+  #define WAN_IFACE_INDEX_LEN 2
+    
+	uint32_t tx_index;
+	int res = IPACM_SUCCESS, len = 0;
+	char index[WAN_IFACE_INDEX_LEN];
 	struct ipa_ioc_copy_hdr sCopyHeader;
 	struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
-	uint32_t tx_index;
-	int len = 0;
 
-	IPACMDBG("construct header\n");
+	/* start of adding header */
+	
+	IPACMDBG("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+					 mac_addr[0], mac_addr[1], mac_addr[2],
+					 mac_addr[3], mac_addr[4], mac_addr[5]);
 
-	/* start of add header */
+    if(header_set == true)
+    {
+	   IPACMDBG("Already add STA full header\n");
+       return IPACM_SUCCESS;
+	}					 
+					 
+	/* add header to IPA */
+	len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add));
+	pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len);
+	if (pHeaderDescriptor == NULL)
+	{
+		IPACMERR("calloc failed to allocate pHeaderDescriptor\n");
+		return IPACM_FAILURE;
+	}
+
+	/* copy partial header */
+	memset(&sCopyHeader, 0, sizeof(sCopyHeader));
+	memcpy(sCopyHeader.name,
+				 tx_prop->tx[0].hdr_name,
+				 sizeof(sCopyHeader.name));
+
+	IPACMDBG("header name: %s\n", sCopyHeader.name);
+	if (m_header.CopyHeader(&sCopyHeader) == false)
+	{
+		PERROR("ioctl copy header failed");
+		res = IPACM_FAILURE;
+		goto fail;
+	}
+
+	IPACMDBG("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
+	if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE)
+	{
+		IPACMERR("header oversize\n");
+		res = IPACM_FAILURE;
+		goto fail;
+	}
+	else
+	{
+		memcpy(pHeaderDescriptor->hdr[0].hdr,
+					 sCopyHeader.hdr, 
+					 sCopyHeader.hdr_len);
+	}
+
+
+	/* copy client mac_addr to partial header */
+	memcpy(&pHeaderDescriptor->hdr[0].hdr[IPA_WLAN_PARTIAL_HDR_OFFSET], mac_addr,
+					 IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */				 
+				 
+	pHeaderDescriptor->commit = true;
+	pHeaderDescriptor->num_hdrs = 1;
+
+	memset(pHeaderDescriptor->hdr[0].name, 0,
+				 sizeof(pHeaderDescriptor->hdr[0].name));
+
+	sprintf(index, "%d", ipa_if_num);
+	strncpy(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+
+	strncat(pHeaderDescriptor->hdr[0].name,
+					IPA_WAN_PARTIAL_HDR_NAME,
+					sizeof(IPA_WAN_PARTIAL_HDR_NAME));
+
+	pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
+	pHeaderDescriptor->hdr[0].hdr_hdl = -1;
+	pHeaderDescriptor->hdr[0].is_partial = 0;
+	pHeaderDescriptor->hdr[0].status = -1;
+
+	if (m_header.AddHeader(pHeaderDescriptor) == false ||
+			pHeaderDescriptor->hdr[0].status != 0)
+	{
+		IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status);
+		res = IPACM_FAILURE;
+		goto fail;
+	}
+	else
+	{
+	  IPACMDBG("add full header name: %s (%x)\n", pHeaderDescriptor->hdr[0].name, pHeaderDescriptor->hdr[0].hdr_hdl);
+		}
+
+	/* copy full header to each TX endpoint property*/ 
 	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
 	{
-		/* add header to IPA */
-		len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add));
-		pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len);
-		if (!pHeaderDescriptor)
-		{
-			IPACMERR("calloc failed to allocate pHeaderDescriptor\n");
-			return IPACM_FAILURE;
-		}
-
-		/* copy partial header */
-		memset(&sCopyHeader, 0, sizeof(sCopyHeader));
-		memcpy(sCopyHeader.name, tx_prop->tx[tx_index].hdr_name,
-					 sizeof(tx_prop->tx[tx_index].hdr_name));
-
-		IPACMDBG("header name: %s\n", sCopyHeader.name);
-		if (false == m_header.CopyHeader(&sCopyHeader))
-		{
-			IPACMERR("ioctl copy header failed\n");
-			free(pHeaderDescriptor);
-			return IPACM_FAILURE;
-		};
-
-		if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE)
-		{
-			IPACMERR("header oversize\n");
-			free(pHeaderDescriptor);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			memcpy(pHeaderDescriptor->hdr[0].hdr, sCopyHeader.hdr,
-						 sCopyHeader.hdr_len);
-		}
-
-		/* copy client mac_addr to partial header */
-		memcpy(&pHeaderDescriptor->hdr[0].hdr[IPA_WLAN_PARTIAL_HDR_OFFSET], mac_addr,
-					 IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
-
-		pHeaderDescriptor->commit = true;
-		pHeaderDescriptor->num_hdrs = 1;
-		sprintf(index, "%d", ipa_if_num);
-		strncpy(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
-		strncat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME, sizeof(IPA_WLAN_PARTIAL_HDR_NAME));
-		strncat(pHeaderDescriptor->hdr[0].name, "tx", sizeof("tx"));
-		sprintf(index, "%d", tx_index);
-		strncat(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
-
-		pHeaderDescriptor->hdr[0].hdr_len = sizeof(sCopyHeader.hdr_len);
-		pHeaderDescriptor->hdr[0].hdr_hdl = -1;
-		pHeaderDescriptor->hdr[0].is_partial = false;
-		pHeaderDescriptor->hdr[0].status = -1;
-
-		if (false == m_header.AddHeader(pHeaderDescriptor))
-		{
-			IPACMERR("ioctl add header failed\n");
-			free(pHeaderDescriptor);
-			return IPACM_FAILURE;
-		}
-
+		
 		memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
 					 sizeof(tx_prop->tx[tx_index].hdr_name));
 		IPACMDBG("add full header name: %s (%x)\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl);
+   }	
 
+    /* see if default routes are setup before constructing full header */
+    if( (header_partial_default_wan_v4== true) && (header_set == false))
+	  { 
+	    handle_route_add_evt(IPA_IP_v4);	
+	  }
 
-		free(pHeaderDescriptor);
-	}
+    if( (header_partial_default_wan_v6== true) && (header_set == false))
+	  { 
+	    handle_route_add_evt(IPA_IP_v6);	
+	  }
+	
+     header_set = true;
+ 	 
+fail:
+	free(pHeaderDescriptor);
 
-	return IPACM_SUCCESS;
+	return res;
 }
 
 /* configure the initial firewall filter rules */
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 4ed66b4..9584733 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -94,6 +94,7 @@
 void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
 {
 	int ipa_interface_index;
+	int wlan_index;
 
 	switch (event)
 	{
@@ -108,6 +109,8 @@
 				handle_down_evt();
 				IPACMDBG("ipa_WLAN (%s):ipa_index (%d) instance close \n",
 								 IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
+				/* reset the iface category to unknown*/				 
+				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat=UNKNOWN_IF;
 				delete this;
 				return;
 			}
@@ -119,14 +122,22 @@
 			ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
 			ipa_interface_index = iface_ipa_index_query(data->if_index);
 
+			if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) ||
+					 (data->iptype == IPA_IP_v6 && 
+						data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && 
+					  data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) )
+			{
+				IPACMDBG("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
+				return;
+			}
+			
 			if (ipa_interface_index == ipa_if_num)
 			{
 				/* check v4 not setup before, v6 can have 2 iface ip */
-				if (((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
-						|| ((data->iptype == IPA_IP_v6) && (num_dft_rt != MAX_DEFAULT_v6_ROUTE_RULES)))
+				if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) 
+				    || ((data->iptype==IPA_IP_v6) && (num_dft_rt!=MAX_DEFAULT_v6_ROUTE_RULES))) 
 				{
-
-					IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n", data->iptype, num_dft_rt);
+				  IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt);
 					/* Post event to NAT */
 					if (data->iptype == IPA_IP_v4)
 					{
@@ -228,6 +239,14 @@
 			if (ipa_interface_index == ipa_if_num)
 			{
 				IPACMDBG("Received IPA_WLAN_CLIENT_RECOVER_EVENT\n");
+			  wlan_index = get_wlan_client_index(data->mac_addr);
+
+	      if ((wlan_index != IPACM_INVALID_INDEX) && (get_client_memptr(wlan_client, wlan_index)->power_save_set == true))
+	      {
+	        IPACMDBG("change wlan client out of  power safe mode \n");
+			    	get_client_memptr(wlan_client, wlan_index)->power_save_set = false;
+	       }
+				
 				if (ip_type != IPA_IP_v6) /* for ipv4 */
 				{
 					handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
@@ -395,7 +414,7 @@
 	get_client_memptr(wlan_client, num_wifi_client)->route_rule_set_v6 = false;
 	get_client_memptr(wlan_client, num_wifi_client)->ipv4_set = false;
 	get_client_memptr(wlan_client, num_wifi_client)->ipv6_set = false;
-
+  get_client_memptr(wlan_client, num_wifi_client)->power_save_set=false;
 	num_wifi_client++;
 	header_name_count++; //keep increasing header_name_count
 	IPACM_Wlan::total_num_wifi_clients++;
@@ -492,6 +511,12 @@
 		return IPACM_SUCCESS;
 	}
 
+	if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true)
+	{
+		IPACMDBG("wlan client is in power safe mode \n");
+		return IPACM_SUCCESS;
+	}
+
 	IPACMDBG("wlan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", wlan_index, iptype,
 					 get_client_memptr(wlan_client, wlan_index)->ipv4_set,
 					 get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4);
@@ -622,17 +647,16 @@
 		return IPACM_SUCCESS;
 	}
 
-	/*check if got duplicate power-save mode*/
-	if ((ip_type != IPA_IP_v6 && get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 == true)
-			|| (ip_type != IPA_IP_v4 && get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 == true))
+  if (get_client_memptr(wlan_client, clt_indx)->power_save_set == false)
 	{
-		return delete_default_qos_rtrules(clt_indx);
+ 	  delete_default_qos_rtrules(clt_indx);
+    get_client_memptr(wlan_client, clt_indx)->power_save_set = true;
 	}
 	else
 	{
 		IPACMDBG("wlan client already in power-save mode\n");
-		return IPACM_SUCCESS;
 	}
+    return IPACM_SUCCESS;
 }
 
 /*handle wifi client del mode*/
diff --git a/ipacm/src/IPACM_Xml.cpp b/ipacm/src/IPACM_Xml.cpp
index 8871b1d..6af108c 100644
--- a/ipacm/src/IPACM_Xml.cpp
+++ b/ipacm/src/IPACM_Xml.cpp
@@ -250,6 +250,11 @@
 							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = VIRTUAL_IF;
 							IPACMDBG("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
 						}
+			      else  if (0 == strncasecmp(content_buf, UNKNOWNIF_TAG, str_size))
+						{
+							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = UNKNOWN_IF;
+							IPACMDBG("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
+						}
 					}
 				}
 				else if (IPACM_util_icmp_string((char*)xml_node->name,
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
index 551c178..1dd0f28 100644
--- a/ipacm/src/IPACM_cfg.xml
+++ b/ipacm/src/IPACM_cfg.xml
@@ -8,11 +8,15 @@
 			</Iface>
 			<Iface>
 			   <Name>rmnet1</Name>
-			   <Category>LAN</Category>
+			   <Category>WAN</Category>
 			</Iface>			
 			<Iface>
 			   <Name>wlan0</Name>
-			   <Category>WLAN</Category>
+			   <Category>UNKNOWN</Category>
+			</Iface>			
+			<Iface>
+			   <Name>wlan1</Name>
+			   <Category>UNKNOWN</Category>
 			</Iface>			
 			<Iface>
 			   <Name>bridge0</Name>
@@ -21,7 +25,7 @@
 		</IPACMIface>
 		<IPACMPrivateSubnet>
 			<Subnet>
-  			   <SubnetAddress>192.168.1.0</SubnetAddress>
+  			   <SubnetAddress>192.168.225.0</SubnetAddress>
   			   <SubnetMask>255.255.255.0</SubnetMask>
 		    </Subnet>		
 		</IPACMPrivateSubnet>
diff --git a/ipanat/inc/ipa_nat_drvi.h b/ipanat/inc/ipa_nat_drvi.h
index 9b56cf1..25309e1 100644
--- a/ipanat/inc/ipa_nat_drvi.h
+++ b/ipanat/inc/ipa_nat_drvi.h
@@ -466,9 +466,8 @@
    ========================================================*/
 #ifdef NAT_DUMP
 void ipa_nati_print_rule(struct ipa_nat_rule *rule, uint32_t rule_id);
-void ipa_nati_dump_rule_buf(void *param1, uint8_t size, uint32_t rule_id);
 void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl);
-void ipa_nati_dump_index_rule_buf(void *param1, uint8_t size, uint32_t rule_id);
+void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule *param, uint32_t rule_id);
 #endif
 
 #endif /* #ifndef IPA_NAT_DRVI_H */
diff --git a/ipanat/inc/ipa_nat_logi.h b/ipanat/inc/ipa_nat_logi.h
index 0ffa672..e98445a 100644
--- a/ipanat/inc/ipa_nat_logi.h
+++ b/ipanat/inc/ipa_nat_logi.h
@@ -69,6 +69,12 @@
                              log_nat_message(nat_log_buf);\
 				  		             }
 
+#define IPADUMP(fmt, ...) {\
+                             int n =0; \
+                             snprintf((nat_log_buf+n), (sizeof(nat_log_buf)-1), fmt, ##__VA_ARGS__);\
+                             log_nat_message(nat_log_buf);\
+				  		             }
+
 extern void log_nat_message(char *msg);
 extern char nat_log_buf[NAT_LOG_SIZE];
 
diff --git a/ipanat/src/ipa_nat_drvi.c b/ipanat/src/ipa_nat_drvi.c
index d542a88..106abac 100644
--- a/ipanat/src/ipa_nat_drvi.c
+++ b/ipanat/src/ipa_nat_drvi.c
@@ -797,7 +797,9 @@
 
   /* Calclate the memory size for both table and index table entries */
   mem->size = (IPA_NAT_TABLE_ENTRY_SIZE * total_entries);
+	IPADBG("Nat Table size: %d\n", mem->size);
   mem->size += (IPA_NAT_INDEX_TABLE_ENTRY_SIZE * total_entries);
+	IPADBG("Nat Base and Index Table size: %d\n", mem->size);
   
   if (!ipv4_nat_cache.ipa_fd)
   {
@@ -2220,9 +2222,6 @@
     {
       atl_one = 1;
 			ipa_nati_print_rule(&tbl_ptr[cnt], cnt);
-      ipa_nati_dump_rule_buf(&tbl_ptr[cnt], 
-                             sizeof(struct ipa_nat_rule),
-                             cnt);
     }
   }
   if(!atl_one)
@@ -2243,9 +2242,6 @@
 														ENABLE_FIELD))
     {
 			ipa_nati_print_rule(&tbl_ptr[cnt], cnt);
-      ipa_nati_dump_rule_buf(&tbl_ptr[cnt], 
-                             sizeof(struct ipa_nat_rule),
-                             cnt);
     }
   }
   if(!atl_one)
@@ -2265,9 +2261,8 @@
     if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
 														INDX_TBL_TBL_ENTRY_FIELD))
     {
-      ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], 
-                                   sizeof(struct ipa_nat_indx_tbl_rule),
-                                   cnt);
+			ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt);
+      //ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], sizeof(struct ipa_nat_indx_tbl_rule), cnt);
     }
   }
   if(!atl_one)
@@ -2288,9 +2283,8 @@
     if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
 														INDX_TBL_TBL_ENTRY_FIELD))
     {
-      ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], 
-                                   sizeof(struct ipa_nat_indx_tbl_rule),
-                                   cnt);
+			ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt);
+      //ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], sizeof(struct ipa_nat_indx_tbl_rule), cnt);
     }
   }
   if(!atl_one)
@@ -2301,87 +2295,29 @@
 
 }
 
-
-void ipa_nati_dump_rule_buf(void *param1, uint8_t size, uint32_t rule_id)
-{
-  int cnt = 0;
-	uint8_t temp[IPA_NAT_TABLE_ENTRY_SIZE];
-  uint64_t *rule = NULL;
-
-	memcpy(&temp, param1, sizeof(temp));
-	rule = (uint64_t *)temp;
-
-  IPADBG("Address :%p, rule id: %d size: %d\n", 
-          rule, rule_id, size);
-  for(; cnt<size; )
-  {
-    uint8_t *byte = (uint8_t *)rule;
-
-    IPADBG("uint64[%d]: 0x%x:\n", cnt, (unsigned int)rule);
-    IPADBG("%02x\t%02x\t%02x\t%02x\n", byte[0], byte[1], byte[2], byte[3]);
-    IPADBG("%02x\t%02x\t%02x\t%02x\n", byte[4], byte[5], byte[6], byte[7]);
-
-    cnt += 8;
-    rule++;
-  }
-
-  return;
-}
-
-void ipa_nati_dump_index_rule_buf(void *param1, uint8_t size, uint32_t rule_id)
-{
-  int cnt = 0;
-	uint8_t temp[IPA_NAT_INDEX_TABLE_ENTRY_SIZE];
-  uint16_t *rule = NULL;
-
-	memcpy(&temp, param1, sizeof(temp));
-	rule = (uint16_t *)temp;
-
-  IPADBG("Address :%p, rule id: %d size: %d\n", 
-          rule, rule_id, size);
-
-  for(; cnt<size; )
-  {
-    uint8_t *byte = (uint8_t *)rule;
-
-    IPADBG("uint64[%d]: 0x%x:\n", cnt, (unsigned int)rule);
-    IPADBG("%02x\t%02x\n", byte[0], byte[1]);
-    IPADBG("\n");
-
-    cnt += 2;
-    rule++;
-  }
-
-  return;
-}
-
 void ipa_nati_print_rule(struct ipa_nat_rule *param, uint32_t rule_id)
 {
 	struct ipa_nat_sw_rule sw_rule;
 	memcpy(&sw_rule, param, sizeof(sw_rule));
 
-  IPADBG("Printing NAT Rule:%d at memory location:%p\n", rule_id, param);
+  IPADUMP("rule-id:%d  Trgt-IP:0x%x  Trgt-Port:0x%x  ",rule_id, sw_rule.target_ip, sw_rule.target_port);
+  IPADUMP("Priv-IP:0x%x Priv-Port:0x%x  ", sw_rule.private_ip, sw_rule.private_port);
+  IPADUMP("Pub-Port:0x%x  Nxt-indx:0x%x  ", sw_rule.public_port, sw_rule.next_index);
+  IPADUMP("IP-cksm:0x%x  En-bit:0x%x  ", sw_rule.ip_chksum, sw_rule.enable);
+  IPADUMP("TS:0x%x  Proto:0x%x  ", sw_rule.time_stamp, sw_rule.protocol);
+  IPADUMP("Prv-indx:0x%x  nxt-indx:0x%x  Tcp-udp-cksum:0x%x", sw_rule.prev_index, sw_rule.next_index, sw_rule.tcp_udp_chksum);
+  IPADUMP("\n");
+  return;
+}
 
-  IPADBG("Target IP: 0x%x Target Port: 0x%x\n", 
-         sw_rule.target_ip, sw_rule.target_port);
+void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule *param, uint32_t rule_id)
+{
+	struct ipa_nat_sw_indx_tbl_rule sw_rule;
+	memcpy(&sw_rule, param, sizeof(sw_rule));
 
-  IPADBG("Private IP: 0x%x Private Port: 0x%x\n", 
-         sw_rule.private_ip, sw_rule.private_port);
-
-  IPADBG("Public Port: 0x%x Next index: 0x%x\n", 
-         sw_rule.public_port, sw_rule.next_index);
-
-  IPADBG("IP ChkSum: 0x%x Enable bit: 0x%x\n", 
-         sw_rule.ip_chksum, sw_rule.enable);
-
-  IPADBG("Time Stamp: 0x%x Protocol: 0x%x\n", 
-         sw_rule.time_stamp, sw_rule.protocol);
-
-  IPADBG("Prev Index: 0x%x Next Index: 0x%x\n", 
-         sw_rule.prev_index, sw_rule.next_index);
-
-  IPADBG("TCP UDP Chksum: 0x%x\n", sw_rule.tcp_udp_chksum);
-
+  IPADUMP("rule-id:%d  Table_entry:0x%x  Next_index:0x%x",
+					        rule_id, sw_rule.tbl_entry, sw_rule.next_index);
+  IPADUMP("\n");
   return;
 }
 #endif