Merge "This fix includes:"
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 381262e..a713679 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -226,6 +226,12 @@
 	ipa_ip_type ip;
 	uint32_t flt_hdl;
 
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}
+	
 	if (softwarerouting_act == false)
 	{
 		IPACMDBG("already delete AMPDU software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
@@ -446,12 +452,6 @@
 	struct ipa_flt_rule_add flt_rule_entry;
 	ipa_ioc_add_flt_rule *m_pFilteringTable;
 
-	if (rx_prop == NULL)
-	{
-		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
 	/* update the iface ip-type to be IPA_IP_v4, IPA_IP_v6 or both*/
 	if (iptype == IPA_IP_v4)
 	{
@@ -493,7 +493,12 @@
 
 		IPACMDBG(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
 	}
-
+	
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}
 
 	/* construct ipa_ioc_add_flt_rule with default filter rules */
 	if (iptype == IPA_IP_v4)
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 9845409..6934c13 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -1160,14 +1160,14 @@
 	}
 
 	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true)
+	if (softwarerouting_act == true && rx_prop != NULL)
 	{
 		handle_software_routing_disable();
 	}
 
 
 	/* delete default filter rules */
-	if (ip_type != IPA_IP_v6)
+	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
 	{
 		if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
 																				IPA_IP_v4,
@@ -1191,7 +1191,7 @@
 	}
 
 
-	if (ip_type != IPA_IP_v4)
+	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
 	{
 		if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
 																				IPA_IP_v6,
@@ -1204,7 +1204,7 @@
 	}
 
 	/* delete wan filter rule */
-	if (IPACM_Wan::isWanUP())
+	if (IPACM_Wan::isWanUP() && rx_prop != NULL)
 	{
 		handle_wan_down();
 	}
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index 896511d..c2536a3 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -1077,7 +1077,6 @@
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
 					/* finish command queue */
 				}
-#if 1				
 				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_GATEWAY)
 				{
 					IPACMDBG("Route ADD ::/0  Next Hop: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x, metric %d, dev %s\n",
@@ -1126,7 +1125,6 @@
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
 					/* finish command queue */
 				}
-#endif
 			}
 			break;
 
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 54be866..87c84ac 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -58,8 +58,8 @@
 
 	active_v4 = false;
 	active_v6 = false;
-  header_set_v4 = false;
-  header_set_v6 = 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;
@@ -118,21 +118,21 @@
 	    rt_rule_entry->at_rear = false;
 	    rt_rule_entry->rule.dst = IPA_CLIENT_A5_LAN_WAN_CONS;  //go to A5
 	    rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
-	    	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] = 0xFFFFFFFF;
-	    	rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
-	    	rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
-	    	rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
-	    	ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0];
-	    	ipv6_addr[num_dft_rt_v6][1] = data->ipv6_addr[1];
-	    	ipv6_addr[num_dft_rt_v6][2] = data->ipv6_addr[2];
-	    	ipv6_addr[num_dft_rt_v6][3] = data->ipv6_addr[3];
+	    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] = 0xFFFFFFFF;
+	    rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
+	    rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
+	    rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
+	    ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0];
+	    ipv6_addr[num_dft_rt_v6][1] = data->ipv6_addr[1];
+	    ipv6_addr[num_dft_rt_v6][2] = data->ipv6_addr[2];
+	    ipv6_addr[num_dft_rt_v6][3] = data->ipv6_addr[3];
         
-	        if (false == m_routing.AddRoutingRule(rt_rule))
-	        {
+	    if (false == m_routing.AddRoutingRule(rt_rule))
+	    {
 	        	IPACMERR("Routing rule addition failed!\n");
 	        	res = IPACM_FAILURE;
 	        	goto fail;
@@ -142,8 +142,8 @@
 	        	IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status);
 	        	res = rt_rule_entry->status;
 	        	goto fail;
-	        }
-	    	dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl;
+	    }
+	    dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl;
 	    	
             /* setup same rule for v6_wan table*/
 	    	strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name);
@@ -274,7 +274,7 @@
 				if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) 
 				    || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES))) 
 				{
-				  IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
+				    IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
 					handle_addr_evt(data);
 				}
 			}
@@ -292,23 +292,18 @@
 				IPACMDBG("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask);
 
 				/* The special below condition is to handle default gateway */
-				if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask))
+				if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == false))
 				{
 					IPACMDBG("adding routing table\n");
 				  handle_route_add_evt(data->iptype);
-					IPACM_Wan::wan_up = true;
-					active_v4 = true;
-					config_dft_firewall_rules(IPA_IP_v4);
 				}
 				else if ((data->iptype == IPA_IP_v6) &&
-								 (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]))
+								 (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) && (active_v6 == false))
 				{
 					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->iptype);
-					active_v6 = true;
-					config_dft_firewall_rules(IPA_IP_v6);
 				}
 			}
 		}
@@ -436,6 +431,7 @@
 		   }
 		   return IPACM_SUCCESS;
 		}
+		else
 		{
            if(iptype==IPA_IP_v4)
 		   {
@@ -543,7 +539,7 @@
 		    	IPACMERR("Routing rule addition failed!\n");
 		    	free(rt_rule);
 		    	return IPACM_FAILURE;
-		}
+		    }
 			wan_route_rule_v6_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
 			IPACMDBG("Set ipv6 wan-route rule hdl for v6_lan_table:0x%x,tx:%d,ip-type: %d \n",
 		                 wan_route_rule_v6_hdl[tx_index],
@@ -585,8 +581,11 @@
 	{
 		ipacm_event_iface_up *wanup_data;
 
-		wanup_data =
-			 (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
+	    IPACM_Wan::wan_up = true;
+		active_v4 = true;
+		config_dft_firewall_rules(IPA_IP_v4);
+
+		wanup_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
 		if (wanup_data == NULL)
 		{
 			IPACMERR("Unable to allocate memory\n");
@@ -603,6 +602,11 @@
 		evt_data.evt_data = (void *)wanup_data;
 		IPACM_EvtDispatcher::PostEvt(&evt_data);
 	}
+	else
+	{
+		active_v6 = true;
+		config_dft_firewall_rules(IPA_IP_v6);
+	}
 
 	return IPACM_SUCCESS;
 }
@@ -632,6 +636,8 @@
 		
 			if (iptype == IPA_IP_v4)
 			{
+		    	IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", 
+		    					    tx_index, tx_prop->tx[tx_index].ip,iptype);		
 
 				if (m_routing.DeleteRoutingHdl(wan_route_rule_v4_hdl[tx_index], IPA_IP_v4)
 						== false)
@@ -643,6 +649,9 @@
 			}
 			else
 			{
+		    	IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", 
+		    					    tx_index, tx_prop->tx[tx_index].ip,iptype);		
+
 				if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl[tx_index], IPA_IP_v6)
 						== false)
 				{
@@ -920,6 +929,13 @@
 	int i, rule_v4 = 0, rule_v6 = 0;
 
 	IPACMDBG("ip-family: %d; \n", iptype);
+	
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}
+		
 	/* default firewall is disable and the rule action is drop */
 	memset(&firewall_config, 0, sizeof(firewall_config));
 	strncpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file));
@@ -1516,14 +1532,22 @@
 	/* make sure default routing rules and firewall rules are deleted*/
 	if (ip_type != IPA_IP_v6)
 	{
-		del_dft_firewall_rules(IPA_IP_v4);
+	   	if (rx_prop != NULL)
+	    {
+		   del_dft_firewall_rules(IPA_IP_v4);
+		}
 		handle_route_del_evt(IPA_IP_v4);
+		IPACMDBG("Delete default v4 routing rules\n");
 	}
 
 	if (ip_type != IPA_IP_v4)
 	{
-		del_dft_firewall_rules(IPA_IP_v6);
+	   	if (rx_prop != NULL)
+	    {
+		   del_dft_firewall_rules(IPA_IP_v6);
+		}
 		handle_route_del_evt(IPA_IP_v6);
+		IPACMDBG("Delete default v6 routing rules\n");
 	}
 
 	/* Delete default v4 RT rule */
@@ -1565,7 +1589,7 @@
 	}
 
 	/* free filter rule handlers */
-	if (ip_type != IPA_IP_v6)
+	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
 	{
 		if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
 																				IPA_IP_v4,
@@ -1580,7 +1604,7 @@
 	}
 
 
-	if (ip_type != IPA_IP_v4)
+	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
 	{
 		if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
 																				IPA_IP_v6,
@@ -1626,6 +1650,13 @@
 int IPACM_Wan::del_dft_firewall_rules(ipa_ip_type iptype)
 {
 	/* free v4 firewall filter rule */
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}
+	
+	
 	if ((iptype == IPA_IP_v4) && (active_v4 == true))
 	{
 		if (num_firewall_v4 != 0)
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index cb73879..828ad15 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -1057,6 +1057,12 @@
 {
 	IPACMDBG("\n");
 
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}
+	
 	if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[0],
 																			IPA_IP_v4, 1) == false)
 	{
@@ -1209,6 +1215,11 @@
 		return IPACM_SUCCESS;
 	}
 
+	if (rx_prop == NULL)
+	{
+		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+		return IPACM_SUCCESS;
+	}	
 
 	if (ip_type == IPA_IP_MAX)
 	{
@@ -1633,7 +1644,7 @@
 	}
 
 	/* Delete v6 filtering rules */
-	if (ip_type != IPA_IP_v6)
+	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
 	{
 		IPACMDBG("Delete default v4 filter rules\n");
 		/* delete default filter rules */
@@ -1658,7 +1669,7 @@
 	}
 
 	/* Delete v4 filtering rules */
-	if (ip_type != IPA_IP_v4)
+	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
 	{
 		IPACMDBG("Delete default %d v6 filter rules\n", IPV6_DEFAULT_FILTERTING_RULES);
 		/* delete default filter rules */
@@ -1673,19 +1684,21 @@
 	}
 	IPACMDBG("finished delte default filtering rules\n ");
 
-	/* delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules*/
-	for (i = 3; i < wlan_ampdu_flt_rule.num_rules; i++)
+	if (rx_prop != NULL)
 	{
-		IPACMDBG("Delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules\n");
-		if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[i],
-																				wlan_ampdu_flt_rule.ip[i], 1) == false)
-		{
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-	IPACMDBG("finished delte AMPDU filtering rules\n ");
-
+	    /* delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules*/
+	    for (i = 3; i < wlan_ampdu_flt_rule.num_rules; i++)
+	    {
+	    	IPACMDBG("Delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules\n");
+	    	if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[i],
+	    																			wlan_ampdu_flt_rule.ip[i], 1) == false)
+	    	{
+	    		res = IPACM_FAILURE;
+	    		goto fail;
+	    	}
+	    }
+	    IPACMDBG("finished delte AMPDU filtering rules\n ");
+    }
 
 	/* Delete default v4 RT rule */
 	if (ip_type != IPA_IP_v6)
@@ -1720,7 +1733,7 @@
 
 
 	/* delete wan filter rule */
-	if (IPACM_Wan::isWanUP())
+	if (IPACM_Wan::isWanUP() && rx_prop != NULL)
 	{
 		IPACMDBG("Delete wan filtering rules\n");
 
@@ -1731,7 +1744,7 @@
 
 
 	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true)
+	if (softwarerouting_act == true && rx_prop != NULL )
 	{
 		IPACMDBG("Delete sw routing filtering rules\n");
 		IPACM_Iface::handle_software_routing_disable();