Merge "Various fixes from bring-up:"
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h
index f0d356f..edc4483 100644
--- a/ipacm/inc/IPACM_Config.h
+++ b/ipacm/inc/IPACM_Config.h
@@ -67,7 +67,7 @@
 	int ipa_nat_max_entries;
 
 	/* IPACM routing table name for v4/v6 */
-	struct ipa_ioc_get_rt_tbl rt_tbl_lan_v4, rt_tbl_wan_v4, rt_tbl_v6;
+	struct ipa_ioc_get_rt_tbl rt_tbl_lan_v4, rt_tbl_wan_v4, rt_tbl_v6, rt_tbl_default_v4;
 
 	/* To return the instance */
 	static IPACM_Config* GetInstance();
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index 2b621c6..1726c61 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -64,6 +64,7 @@
 #define IPA_MAX_PRIVATE_SUBNET_ENTRIES 3
 #define IPA_MAX_ALG_ENTRIES 10
 
+#define V4_DEFAULT_ROUTE_TABLE_NAME  "ipa_dflt_rt"
 #define V4_LAN_ROUTE_TABLE_NAME  "COMRTBLLANv4"
 #define V4_WAN_ROUTE_TABLE_NAME  "WANRTBLv4"
 #define V6_COMMON_ROUTE_TABLE_NAME  "COMRTBLv6"
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index 0bc5811..36610a1 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -60,6 +60,7 @@
 #define IPV6_DEFAULT_FILTERTING_RULES 1
 #define IPV6_DEFAULT_LAN_FILTERTING_RULES 1
 #define MAX_SOFTWAREROUTING_FILTERTING_RULES 2
+#define INVALID_IFACE -1
 
 /* iface */
 class IPACM_Iface : public IPACM_Listener
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index d2c89f9..bdae73c 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -82,7 +82,8 @@
 	uint32_t wan_v4_addr;
 	bool active_v4;
 	bool active_v6;
-	bool header_set;
+	bool header_set_v4;
+	bool header_set_v6;
 	bool header_partial_default_wan_v4;
 	bool header_partial_default_wan_v6;
 
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
index dc5fccf..ef8b035 100644
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -65,6 +65,8 @@
 	bool route_rule_set_v6;
 	bool ipv4_set;
 	bool ipv6_set;
+	bool ipv4_header_set;
+	bool ipv6_header_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/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp
index 413d1ba..86fb488 100644
--- a/ipacm/src/IPACM_Config.cpp
+++ b/ipacm/src/IPACM_Config.cpp
@@ -54,6 +54,7 @@
 	ipa_num_alg_ports = 0;
 	ipa_nat_max_entries = 0;
 
+	memset(&rt_tbl_default_v4, 0, sizeof(rt_tbl_default_v4));
 	memset(&rt_tbl_lan_v4, 0, sizeof(rt_tbl_lan_v4));
 	memset(&rt_tbl_wan_v4, 0, sizeof(rt_tbl_wan_v4));
 	memset(&rt_tbl_v6, 0, sizeof(rt_tbl_v6));
@@ -138,6 +139,9 @@
 	IPACMDBG("Nat Maximum Entries %d\n", ipa_nat_max_entries);
 
 	/* 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));
+
 	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));
 
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 3e39cc7..1ed86ab 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -98,7 +98,7 @@
 						);
 	if (!m_pFilteringTable)
 	{
-		PERROR("Error Locate ipa_flt_rule_add memory...\n");
+		IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
 		return IPACM_FAILURE;
 	}
 
@@ -128,7 +128,7 @@
 		m_pFilteringTable->ip = IPA_IP_v4;
 		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -148,7 +148,7 @@
 		m_pFilteringTable->ip = IPA_IP_v6;
 		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -177,7 +177,7 @@
 
 		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -226,7 +226,7 @@
 		if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[0],
 																				IPA_IP_v4, 1) == false)
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -235,7 +235,7 @@
 		if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[1],
 																				IPA_IP_v6, 1) == false)
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -264,7 +264,7 @@
 
 		if (m_filtering.DeleteFilteringHdls(&flt_hdl, ip, 1) == false)
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -282,7 +282,7 @@
 )
 {
 	int fd;
-	int link = -1;
+	int link = INVALID_IFACE;
 	int i = 0;
 	struct ifreq ifr;
 
@@ -475,7 +475,7 @@
 		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
 		if (!m_pFilteringTable)
 		{
-			PERROR("Error Locate ipa_flt_rule_add memory...\n");
+			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
 			return IPACM_FAILURE;
 		}
 
@@ -516,7 +516,7 @@
 
 		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -545,7 +545,7 @@
 		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
 		if (!m_pFilteringTable)
 		{
-			PERROR("Error Locate ipa_flt_rule_add memory...\n");
+			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
 			return IPACM_FAILURE;
 		}
 
@@ -580,7 +580,7 @@
 
 		if (m_filtering.AddFilteringRule(m_pFilteringTable) == false)
 		{
-			PERROR("Error Adding Filtering rule, aborting...\n");
+			IPACMERR("Error Adding Filtering rule, aborting...\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 655375a..26deb56 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -112,6 +112,12 @@
 	int ipa_interface_index;
 	ipa_interface_index = IPACM_Iface::iface_ipa_index_query(if_index);
 
+	if(ipa_interface_index == INVALID_IFACE)
+	{
+			IPACMDBG("Unhandled interface received, fid: %d\n",if_index);
+			return IPACM_SUCCESS;
+	}
+	
 	/* check if duplicate instance*/
 	if(SearchInstance(ipa_interface_index) == IPA_INSTANCE_NOT_FOUND)
 	{
@@ -177,7 +183,9 @@
 			break;
 
 		default:
-			IPACMERR("Unhandled interface received\n");
+			IPACMDBG("Unhandled interface category received iface name: %s, category: %d\n",
+			            IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,
+						       IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat);
 			return IPACM_SUCCESS;
 		}
 	}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 1fa8557..4a875b4 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -787,7 +787,14 @@
 			free(m_pFilteringTable);
 			return IPACM_FAILURE;
 		}
-
+#if 1
+		if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4))
+		{
+			IPACMERR("LAN m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_default_v4);
+			free(m_pFilteringTable);
+			return IPACM_FAILURE;
+		}
+#endif
 		for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++)
 		{
 			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
@@ -796,6 +803,10 @@
 			flt_rule_entry.status = -1;
 			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
 			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
+#if 1
+			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl;
+			IPACMDBG(" private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name);
+#endif			
 			memcpy(&flt_rule_entry.rule.attrib,
 						 &rx_prop->rx[0].attrib,
 						 sizeof(flt_rule_entry.rule.attrib));
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 6a11cc3..21badd6 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -208,7 +208,7 @@
 		data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
 		if (data == NULL)
 		{
-			PERROR("unable to allocate memory for event data\n");
+			IPACMERR("unable to allocate memory for event data\n");
 			return NULL;
 		}
 		
@@ -310,7 +310,7 @@
 			break;
 
 		default:
-			IPACMERR("Unhandled message type: %d\n", event_hdr->msg_type);
+			IPACMDBG("Unhandled message type: %d\n", event_hdr->msg_type);
       free(data);
 			continue;
 
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 6166fd5..7e27a32 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -58,8 +58,9 @@
 
 	active_v4 = false;
 	active_v6 = false;
-  header_set = false;
-  header_partial_default_wan_v4 = false;
+  header_set_v4 = false;
+  header_set_v6 = false;
+	header_partial_default_wan_v4 = false;
 	header_partial_default_wan_v6 = false;
 	hdr_hdl_sta_v4 = 0;
 	hdr_hdl_sta_v6 = 0;
@@ -193,7 +194,7 @@
 				handle_down_evt();
 				IPACMDBG("ipa_WAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
 	                        /* reset the STA-iface category to unknown */
-                                if(header_set == true)
+                                if((header_set_v4 == true) || (header_set_v6 == true))
                                 {
 	            	             IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat=UNKNOWN_IF;
                                 }
@@ -623,8 +624,8 @@
 					 mac_addr[0], mac_addr[1], mac_addr[2],
 					 mac_addr[3], mac_addr[4], mac_addr[5]);
 
-    if(header_set == true)
-    {
+        if((header_set_v4 == true) || (header_set_v6 == true))
+        {
 	   IPACMDBG("Already add STA full header\n");
        return IPACM_SUCCESS;
 	}					 
@@ -642,11 +643,9 @@
         for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
 		   if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-		   break; 
-	}	
-
-	memset(&sCopyHeader, 0, sizeof(sCopyHeader));
-	memcpy(sCopyHeader.name,
+		   {		   
+	               memset(&sCopyHeader, 0, sizeof(sCopyHeader));
+	               memcpy(sCopyHeader.name,
 				 tx_prop->tx[cnt].hdr_name,
 				 sizeof(sCopyHeader.name));
 
@@ -715,22 +714,25 @@
            {	  
 		  memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
 					 sizeof(tx_prop->tx[tx_index].hdr_name));
-		  IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
-           }
+		                 IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
+                           }
+	               }	
+		        break; 
+		   }
 	}	
 
+	  
+
 	/* copy partial header for v6 */
         for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
 		   if(tx_prop->tx[cnt].ip == IPA_IP_v6)
-		   break;
-	}	
-
-	IPACMDBG("Got partial v6-header name from %d tx props\n", cnt);
-	memset(&sCopyHeader, 0, sizeof(sCopyHeader));
-	memcpy(sCopyHeader.name,
-				 tx_prop->tx[cnt].hdr_name,
-				 sizeof(sCopyHeader.name));
+		   {
+	                 IPACMDBG("Got partial v6-header name from %d tx props\n", cnt);
+	                 memset(&sCopyHeader, 0, sizeof(sCopyHeader));
+	                 memcpy(sCopyHeader.name,
+				           tx_prop->tx[cnt].hdr_name,
+				                   sizeof(sCopyHeader.name));
 
 	IPACMDBG("header name: %s from tx: %d\n", sCopyHeader.name,cnt);
 	if (m_header.CopyHeader(&sCopyHeader) == false)
@@ -740,80 +742,83 @@
 		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_v6,
-					sizeof(IPA_WAN_PARTIAL_HDR_NAME_v6));
-
-	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
-	{
-	  hdr_hdl_sta_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
-	  IPACMDBG("add full header name: %s (%x)\n", pHeaderDescriptor->hdr[0].name, pHeaderDescriptor->hdr[0].hdr_hdl);
-	}
-	  
-	/* copy ipv6 full header to each TX endpoint property*/ 
-	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-	{
-	   if(tx_prop->tx[tx_index].ip==IPA_IP_v6)
-           {	  
-		  memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
-					 sizeof(tx_prop->tx[tx_index].hdr_name));
-		  IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
-           }
-        }	
-
+                     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_v6,
+	                 				sizeof(IPA_WAN_PARTIAL_HDR_NAME_v6));
+                     
+	                 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
+	                 {
+	                   hdr_hdl_sta_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
+	                   IPACMDBG("add full header name: %s (%x)\n", pHeaderDescriptor->hdr[0].name, pHeaderDescriptor->hdr[0].hdr_hdl);
+	                 }
+	                   
+	                 /* copy ipv6 full header to each TX endpoint property*/ 
+	                 for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
+	                 {
+	                    if(tx_prop->tx[tx_index].ip==IPA_IP_v6)
+                        {	  
+	                 	  memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
+	                 				 sizeof(tx_prop->tx[tx_index].hdr_name));
+	                 	  IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
+                        }
+                     }	
+	                 break;		   
+	        }
+	}	
+                     
+                     
     /* 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);	
-	  }
-
-    if( (header_partial_default_wan_v6== true) && (header_set == false))
-	  { 
-	    handle_route_add_evt(IPA_IP_v6);	
-	  }
+        if( (header_partial_default_wan_v4== true) && (header_set_v4 == false))
+	{ 
+	   handle_route_add_evt(IPA_IP_v4);	
+           header_set_v4 = true;
+	}
+    
+        if( (header_partial_default_wan_v6== true) && (header_set_v6 == false))
+	{ 
+	   handle_route_add_evt(IPA_IP_v6);	
+           header_set_v6 = true;
+	}
 	
-     header_set = true;
- 	 
 fail:
 	free(pHeaderDescriptor);
 
@@ -1499,14 +1504,17 @@
 
 	
 	/* delete the complete header for STA mode*/
-        if(header_set == true)
+        if(header_set_v4 == true)
         {
                 if (m_header.DeleteHeaderHdl(hdr_hdl_sta_v4) == false)
 		{
 			res = IPACM_FAILURE;
 			goto fail;
 		}
+	}
 
+        if(header_set_v6 == true)
+        {
 		if (m_header.DeleteHeaderHdl(hdr_hdl_sta_v6) == false)
 		{
 			res = IPACM_FAILURE;
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 829e62a..ed7e2d1 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -347,62 +347,60 @@
         for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
 		   if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-		   break;  
-	}	
-	
-	IPACMDBG("Got partial v4-header name from %d tx props\n", cnt);
-	memset(&sCopyHeader, 0, sizeof(sCopyHeader));
-	memcpy(sCopyHeader.name,
-				 tx_prop->tx[cnt].hdr_name,
-				 sizeof(sCopyHeader.name));
+		   {		   
+	            IPACMDBG("Got partial v4-header name from %d tx props\n", cnt);
+	            memset(&sCopyHeader, 0, sizeof(sCopyHeader));
+	            memcpy(sCopyHeader.name,
+	            			 tx_prop->tx[cnt].hdr_name,
+	            			 sizeof(sCopyHeader.name));
+                       
+	            IPACMDBG("header name: %s in tx:%d\n", sCopyHeader.name,cnt);
+	            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);
+	            }
            
-	IPACMDBG("header name: %s in tx:%d\n", sCopyHeader.name,cnt);
-	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],
-				 get_client_memptr(wlan_client, num_wifi_client)->mac,
-				 IPA_MAC_ADDR_SIZE);
-
-	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_WLAN_PARTIAL_HDR_NAME_v4,
-					sizeof(IPA_WLAN_PARTIAL_HDR_NAME_v4));
-           
-	sprintf(index, "%d", header_name_count);
-	strncat(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
-
-	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;
+	            /* copy client mac_addr to partial header */
+	            memcpy(&pHeaderDescriptor->hdr[0].hdr[IPA_WLAN_PARTIAL_HDR_OFFSET],
+	            			 get_client_memptr(wlan_client, num_wifi_client)->mac,
+	            			 IPA_MAC_ADDR_SIZE);
+                       
+	            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_WLAN_PARTIAL_HDR_NAME_v4,
+	            				sizeof(IPA_WLAN_PARTIAL_HDR_NAME_v4));
+                       
+	            sprintf(index, "%d", header_name_count);
+	            strncat(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+                       
+	            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)
@@ -412,19 +410,22 @@
 	       	goto fail;
 	       }
            
-	       get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
-	       IPACMDBG("client(%d) v4 full header name:%s header handle:(0x%x)\n",
-	       				 num_wifi_client,
-	       				 pHeaderDescriptor->hdr[0].name,
-	       				 get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4);
+	            get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
+	            IPACMDBG("client(%d) v4 full header name:%s header handle:(0x%x)\n",
+	            				 num_wifi_client,
+	            				 pHeaderDescriptor->hdr[0].name,
+	            				 get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4);
+                get_client_memptr(wlan_client, num_wifi_client)->ipv4_header_set=true;	
+		        break;  
+		   }
+	}	
+	
 				 
 	/* copy partial header for v6*/
         for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
 		   if(tx_prop->tx[cnt].ip==IPA_IP_v6)
-		   break;  
-	
-	}	
+		   {
 	
 	IPACMDBG("Got partial v6-header name from %d tx props\n", cnt);
 	memset(&sCopyHeader, 0, sizeof(sCopyHeader));
@@ -494,6 +495,11 @@
 					 pHeaderDescriptor->hdr[0].name,
 	       				 get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v6);
 					 
+                get_client_memptr(wlan_client, num_wifi_client)->ipv6_header_set=true;			   
+		        break;  	
+		   }
+	}	
+	
 	/* initialize wifi client*/
 	get_client_memptr(wlan_client, num_wifi_client)->route_rule_set_v4 = false;
 	get_client_memptr(wlan_client, num_wifi_client)->route_rule_set_v6 = false;
@@ -776,21 +782,31 @@
 	}
 
 	/* Delete wlan client header */
+	if(get_client_memptr(wlan_client, clt_indx)->ipv4_header_set == true)
+	{
 	if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v4)
 			== false)
 	{
 		return IPACM_FAILURE;
 	}
+		get_client_memptr(wlan_client, clt_indx)->ipv4_header_set = false;
+	}
 
+	if(get_client_memptr(wlan_client, clt_indx)->ipv6_header_set == true)
+	{
 	if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v6)
 			== false)
 	{
 		return IPACM_FAILURE;
 	}
+		get_client_memptr(wlan_client, clt_indx)->ipv6_header_set = false;
+	}
 
 	/* Reset ip_set to 0*/
 	get_client_memptr(wlan_client, clt_indx)->ipv4_set = false;
 	get_client_memptr(wlan_client, clt_indx)->ipv6_set = false;
+	get_client_memptr(wlan_client, clt_indx)->ipv4_header_set = false;
+	get_client_memptr(wlan_client, clt_indx)->ipv6_header_set = false;
 	get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = false;
 	get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = false;
 
@@ -806,6 +822,8 @@
 
 		get_client_memptr(wlan_client, clt_indx)->ipv4_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv4_set;
 		get_client_memptr(wlan_client, clt_indx)->ipv6_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv6_set;
+		get_client_memptr(wlan_client, clt_indx)->ipv4_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv4_header_set;
+		get_client_memptr(wlan_client, clt_indx)->ipv6_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv6_header_set;
 		get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = get_client_memptr(wlan_client, (clt_indx + 1))->route_rule_set_v4;
 		get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = get_client_memptr(wlan_client, (clt_indx + 1))->route_rule_set_v6;
 
@@ -1346,6 +1364,14 @@
 			free(m_pFilteringTable);
 			return IPACM_FAILURE;
 		}
+#if 1
+		if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4))
+		{
+			IPACMERR("LAN m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_default_v4);
+			free(m_pFilteringTable);
+			return IPACM_FAILURE;
+		}
+#endif
 
 		for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_private_subnet; i++)
 		{
@@ -1355,6 +1381,10 @@
 			flt_rule_entry.status = -1;
 			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
 			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
+#if 1
+			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl;
+			IPACMDBG(" private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name);
+#endif			
 			memcpy(&flt_rule_entry.rule.attrib,
 						 &rx_prop->rx[0].attrib,
 						 sizeof(flt_rule_entry.rule.attrib));
@@ -1515,20 +1545,27 @@
 		delete_default_qos_rtrules(i);
 
 		IPACMDBG("Delete %d client header\n", num_wifi_client);
+
+
+        if(get_client_memptr(wlan_client, i)->ipv4_header_set == true)
+        {
 		if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, i)->hdr_hdl_v4)
 				== false)
 			{
 				res = IPACM_FAILURE;
 				goto fail;
 			}
+		}
 
+        if(get_client_memptr(wlan_client, i)->ipv6_header_set == true)
+        {
 		if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, i)->hdr_hdl_v6)
 				== false)
 		{
 			res = IPACM_FAILURE;
 			goto fail;
 		}
-
+		}		
 	} /* end of for loop */
 
 	/* free the wlan clients cache */
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
index 1dd0f28..e9e4147 100644
--- a/ipacm/src/IPACM_cfg.xml
+++ b/ipacm/src/IPACM_cfg.xml
@@ -3,6 +3,10 @@
 	<IPACM>
 		<IPACMIface>
 			<Iface>
+			   <Name>ecm0</Name>
+			   <Category>LAN</Category>
+			</Iface>
+			<Iface>
 			   <Name>rmnet0</Name>
 			   <Category>WAN</Category>
 			</Iface>
@@ -38,6 +42,22 @@
   			   <Protocol>TCP</Protocol>
   			   <Port>554</Port>
 		    </ALG>		
+		<ALG>
+  			   <Protocol>TCP</Protocol>
+  			   <Port>5060</Port>
+		    </ALG>		
+			<ALG>
+  			   <Protocol>UDP</Protocol>
+  			   <Port>5060</Port>
+		    </ALG>		
+			<ALG>
+  			   <Protocol>TCP</Protocol>
+  			   <Port>1723</Port>
+		    </ALG>		
+			<ALG>
+  			   <Protocol>UDP</Protocol>
+  			   <Port>69</Port>
+		    </ALG>		
 		</IPACMALG>
 		<IPACMNAT>		
  	        <MaxNatEntries>100</MaxNatEntries>
diff --git a/ipacm/src/mobileap_firewall.xml b/ipacm/src/mobileap_firewall.xml
index c722511..84da527 100644
--- a/ipacm/src/mobileap_firewall.xml
+++ b/ipacm/src/mobileap_firewall.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mobileap_firewall_cfg.xsd">
 	<MobileAPFirewallCfg>					
+	<FirewallEnabled>1</FirewallEnabled> 
+      <FirewallPktsAllowed>0</FirewallPktsAllowed> 
 	</MobileAPFirewallCfg>
 </system>