Fixed below issues found during IPA bring up:

1. Fix ipv6 ping fail
2. Fix ipv6 rule address-reverse order issue
3. Fix duplicate filter rule deletion issue
4. Fix Software-routing checking issue
5. fix wlan down first wan down next issue

Change-Id: I816ee5766f9e291f94a76a67efef6c5971ff9a18
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index 9e3cafd..0bc5811 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -54,6 +54,7 @@
 #include "IPACM_Defs.h"
 
 /* current support 2 ipv6-address*/
+#define MAX_DEFAULT_v4_ROUTE_RULES  1
 #define MAX_DEFAULT_v6_ROUTE_RULES  2
 #define IPV4_DEFAULT_FILTERTING_RULES 3
 #define IPV6_DEFAULT_FILTERTING_RULES 1
@@ -87,7 +88,7 @@
 
 		uint32_t dft_v4fl_rule_hdl[IPV4_DEFAULT_FILTERTING_RULES];
 		uint32_t dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES];
-		uint32_t dft_rt_rule_hdl[1+MAX_DEFAULT_v6_ROUTE_RULES]; /* 1 for ipv4 */
+		uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+MAX_DEFAULT_v6_ROUTE_RULES];
 
 		ipa_ioc_query_intf *iface_query;
 		ipa_ioc_query_intf_tx_props *tx_prop;
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 5177fe1..da7fd06 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -97,10 +97,10 @@
 	int handle_header_add_evt(uint8_t mac_addr[6]);
 
 	/* configure the initial firewall filter rules */
-	int config_dft_firewall_rules(ipa_ip_type ip_type);
+	int config_dft_firewall_rules(ipa_ip_type iptype);
 
 	/*clean firewall filter rules */
-	int del_dft_firewall_rules(ipa_ip_type ip_type);
+	int del_dft_firewall_rules(ipa_ip_type iptype);
 
 	/*handle wan-iface down event */
 	int handle_down_evt();
diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp
index 632ae5d..7e48546 100644
--- a/ipacm/src/IPACM_CmdQueue.cpp
+++ b/ipacm/src/IPACM_CmdQueue.cpp
@@ -108,7 +108,7 @@
 	MsgQueue = MessageQueue::getInstance();
 	if(MsgQueue == NULL)
 	{
-		IPACMDBG("unable to start cmd queue process\n");
+		IPACMERR("unable to start cmd queue process\n");
 		return NULL;
 	}
 
@@ -154,7 +154,7 @@
 				return NULL;
 			}
 
-			IPACMDBG("Processing item %p\n",item);
+			IPACMDBG("Processing item %p event ID: %d\n",item,item->evt.data.event);
 			item->evt.callback_ptr(&item->evt.data);
 			delete item;
 			item = NULL;
diff --git a/ipacm/src/IPACM_Header.cpp b/ipacm/src/IPACM_Header.cpp
index 0ebb83d..3d3d162 100644
--- a/ipacm/src/IPACM_Header.cpp
+++ b/ipacm/src/IPACM_Header.cpp
@@ -47,7 +47,7 @@
 	m_fd = open(DEVICE_NAME, O_RDWR);
 	if (-1 == m_fd)
 	{
-		IPACMDBG("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME);
+		IPACMERR("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME);
 	}
 }
 
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index cc6ce13..5f4ca07 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -85,6 +85,11 @@
 	ipa_ioc_add_flt_rule *m_pFilteringTable;
 
 	IPACMDBG("\n");
+	if (softwarerouting_act == true)
+	{
+		IPACMDBG("already setup software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+		return IPACM_SUCCESS;
+	}
 
 	m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
 		 calloc(1,
@@ -209,7 +214,11 @@
 	ipa_ip_type ip;
 	uint32_t flt_hdl;
 
-	IPACMDBG("ip-type: %d\n", ip_type);
+	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);
+		return IPACM_SUCCESS;
+	}	
 
 	if (ip_type == IPA_IP_MAX)
 	{
@@ -389,11 +398,15 @@
 
 	if (res != IPACM_FAILURE)
 	{
-		IPACMDBG("Rx property attribute mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
-		for(uint32_t cnt=0; cnt<tx_prop->num_tx_props; cnt++)
+		for (uint32_t cnt=0; cnt<rx_prop->num_rx_props; cnt++)
 		{
-			IPACMDBG("Tx property:%d attribute mask:0x%x, ip-type: %d\n", 
-							    cnt, tx_prop->tx[0].attrib.attrib_mask,tx_prop->tx[0].ip);
+			IPACMDBG("Rx(%d):attrib-mask:0x%x, ip-type: %d, src_pipe: %d\n",
+							 cnt, rx_prop->rx[cnt].attrib.attrib_mask, rx_prop->rx[cnt].ip, rx_prop->rx[cnt].src_pipe);
+		}
+		for (uint32_t cnt=0; cnt<tx_prop->num_tx_props; cnt++)
+		{
+			IPACMDBG("Tx(%d):attrib-mask:0x%x, ip-type: %d, dst_pipe: %d, header: %s\n",
+							 cnt, tx_prop->tx[cnt].attrib.attrib_mask, tx_prop->tx[cnt].ip, tx_prop->tx[cnt].dst_pipe, tx_prop->tx[cnt].hdr_name);
 		}
 	}
 
@@ -518,7 +531,7 @@
 				}
 				else
 				{
-					IPACMDBG("Failed adding default v4 Filtering rule %d\n", i);
+					IPACMERR("Failed adding default v4 Filtering rule %d\n", i);
 				}
 			}
 		}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 747cbfe..36f44ca 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -60,7 +60,6 @@
 void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param) //skylar rename:event_callback
 {
 	ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param;
-	IPACMDBG("\n");
 	switch(event)
 	{
 
@@ -98,9 +97,9 @@
 				IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, lan);
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, lan);
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, lan);
-				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, lan);
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, lan);
+				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
 				IPACMDBG("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", lan->dev_name, lan->ipa_if_num);
 				registr(ipa_interface_index, lan);
 			}
@@ -119,9 +118,9 @@
 				IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, wl);
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, wl);
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, wl);
-				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, wl);
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl);
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, wl);
+				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, wl);
 				IPACMDBG("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num);
 				registr(ipa_interface_index, wl);
 			}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 8b47985..cc6eec1 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -103,10 +103,14 @@
 			{
 				IPACMDBG("Received IPA_ADDR_ADD_EVENT\n");
 
-				if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+				/* 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))) 
 				{
+				  IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt);
 					handle_addr_evt(data);
 					handle_private_subnet(data->iptype);
+				  
 					if (IPACM_Wan::isWanUP() && (data->iptype == IPA_IP_v4))
 					{
 						handle_wan_up();
@@ -320,7 +324,7 @@
 
 				if (false == m_header.GetHeaderHandle(&sRetHeader))
 				{
-					IPACMDBG(" ioctl failed\n");
+					IPACMERR(" ioctl failed\n");
 				}
 
 				rt_rule_entry->rule.hdr_hdl = sRetHeader.hdl;
@@ -396,7 +400,7 @@
 					if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index],
 																				 IPA_IP_v4) == false)
 					{
-						IPACMDBG("Routing rule deletion failed!\n");
+						IPACMERR("Routing rule deletion failed!\n");
 						return IPACM_FAILURE;
 					}
 				}
@@ -514,8 +518,7 @@
 	memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
 	if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 	{
-		IPACMDBG("Error Adding RuleTable(0) to Filtering, aborting...\n");
-		perror("Lan: Unable to add filter rule");
+		IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
 		free(m_pFilteringTable);
 		return IPACM_FAILURE;
 	}
@@ -542,7 +545,7 @@
 	if (m_filtering.DeleteFilteringHdls(&lan_wan_fl_rule_hdl[0],
 																			IPA_IP_v4, 1) == false)
 	{
-		IPACMDBG("Error Adding RuleTable(1) to Filtering, aborting...\n");
+		IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
 		return IPACM_FAILURE;
 	}
 
@@ -558,7 +561,7 @@
 	const int NUM_RULES = 1;
 	int res = IPACM_SUCCESS;
 
-	/* construct ipa_ioc_add_flt_rule with 1 rules */
+	/* construct ipa_ioc_add_flt_rule with v6 rules */
 	ipa_ioc_add_flt_rule *m_pFilteringTable;
 
 	IPACMDBG("set route/filter rule ip-type: %d \n", data->iptype);
@@ -652,7 +655,7 @@
 
 			if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6))
 			{
-				IPACMDBG("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_v6);
+				IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_v6);
 				free(m_pFilteringTable);
 				res = IPACM_FAILURE;
 				goto fail;
@@ -698,7 +701,7 @@
 			free(m_pFilteringTable);
 		}
 
-		dft_rt_rule_hdl[1 + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
+		dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
 		num_dft_rt++;
 	}
 
@@ -766,7 +769,7 @@
 
 		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
 		{
-			IPACMDBG("Error Adding RuleTable(0) to Filtering, aborting...\n");
+			IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
 			free(m_pFilteringTable);
 			return IPACM_FAILURE;
 		}
@@ -816,7 +819,7 @@
 		/* may have multiple ipv6 iface-RT rules*/
 		for (i = 0; i < num_dft_rt; i++)
 		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[1 + i], IPA_IP_v6)
+			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + i], IPA_IP_v6)
 					== false)
 			{
 				IPACMERR("Routing rule deletion failed!\n");
@@ -846,7 +849,7 @@
 	/* check software routing fl rule hdl */
 	if (softwarerouting_act == true)
 	{
-		IPACM_Iface::handle_software_routing_disable();
+		handle_software_routing_disable();
 	}
 
 
diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp
index 327b681..5c04087 100644
--- a/ipacm/src/IPACM_Neighbor.cpp
+++ b/ipacm/src/IPACM_Neighbor.cpp
@@ -240,7 +240,7 @@
 				}
 				else
 				{
-					IPACMDBG("error:  neighbor client oversize!");
+					IPACMERR("error:  neighbor client oversize!");
 					return;
 				}
 			};
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index eea98ea..d9a9098 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -92,7 +92,7 @@
 					(struct sockaddr *)p_sk_addr_loc,
 					sizeof(struct sockaddr_nl)) < 0)
 	{
-		IPACMDBG("Socket bind failed\n");
+		IPACMERR("Socket bind failed\n");
 		return IPACM_FAILURE;
 	}
 
@@ -163,7 +163,7 @@
 					}
 					else
 					{
-						IPACMDBG("No read function\n");
+						IPACMERR("No read function\n");
 					}
 				}
 
@@ -341,14 +341,13 @@
 	 ipa_nl_link_info_t      *link_info
 )
 {
-	struct rtattr *rtah = NULL;
+	struct rtattr;
 	/* NL message header */
 	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;
 
 	/* Extract the header data */
 	link_info->metainfo = *(struct ifinfomsg *)NLMSG_DATA(nlh);
 	buflen -= sizeof(struct nlmsghdr);
-	rtah = IFA_RTA(NLMSG_DATA(nlh));
 
 	return IPACM_SUCCESS;
 }
@@ -586,6 +585,15 @@
 				{
 					IPACMDBG("\n GOT useful newlink event\n");
 					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
+					
+					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+					if(data_fid == NULL)
+					{
+						IPACMERR("unable to allocate memory for event data_fid\n");
+						return IPACM_FAILURE;
+					}
+					data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
+					
 					if(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_UP)
 					{
 						IPACMDBG("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
@@ -603,15 +611,6 @@
 										 data_fid->if_index);
 					}
 
-					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-					if(data_fid == NULL)
-					{
-						IPACMDBG("unable to allocate memory for event data_fid\n");
-						return IPACM_FAILURE;
-					}
-					data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
-
-
 					evt_data.evt_data = data_fid;
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
 
@@ -643,7 +642,7 @@
 				data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
 				if(data_fid == NULL)
 				{
-					IPACMDBG("unable to allocate memory for event data_fid\n");
+					IPACMERR("unable to allocate memory for event data_fid\n");
 					return IPACM_FAILURE;
 				}
 
@@ -676,7 +675,7 @@
 				data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
 				if(data_addr == NULL)
 				{
-					IPACMDBG("unable to allocate memory for event data_addr\n");
+					IPACMERR("unable to allocate memory for event data_addr\n");
 					return IPACM_FAILURE;
 				}
 
@@ -696,6 +695,11 @@
 					memcpy(data_addr->ipv6_addr,
 								 msg_ptr->nl_addr_info.attr_info.prefix_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr));
+
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
 				}
 				else
 				{
@@ -870,7 +874,7 @@
 					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
 					if(data_addr == NULL)
 					{
-						IPACMDBG("unable to allocate memory for event data_addr\n");
+						IPACMERR("unable to allocate memory for event data_addr\n");
 						return IPACM_FAILURE;
 					}
 
@@ -921,10 +925,20 @@
 									 msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 									 sizeof(data_addr->ipv6_addr));
 
-						memcpy(data_addr->ipv6_addr_mask,
+						data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+						data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+						data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+						data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
+						memcpy(data_addr->ipv6_addr_mask, 
 									 msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 									 sizeof(data_addr->ipv6_addr_mask));
 
+						data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+						data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+						data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
+
 						evt_data.event = IPA_ROUTE_ADD_EVENT;
 						data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 						data_addr->iptype = IPA_IP_v6;
@@ -1013,7 +1027,7 @@
 					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
 					if(data_addr == NULL)
 					{
-						IPACMDBG("unable to allocate memory for event data_addr\n");
+						IPACMERR("unable to allocate memory for event data_addr\n");
 						return IPACM_FAILURE;
 					}
 
@@ -1021,6 +1035,11 @@
 								 msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr));
 
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+
 					mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
 					for(mask_index = 0; mask_index < 4; mask_index++)
 					{
@@ -1043,6 +1062,11 @@
 									 data_addr->ipv6_addr_mask[2],
 									 data_addr->ipv6_addr_mask[3]);
 
+					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
+									 
 					evt_data.event = IPA_ROUTE_ADD_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1078,9 +1102,20 @@
 
 					memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr));
+
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+
 					memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr_mask));
 
+					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
+
 					evt_data.event = IPA_ROUTE_ADD_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1098,7 +1133,7 @@
 		case RTM_DELROUTE:
 			if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info)))
 			{
-				IPACMDBG("Failed to decode rtm route message\n");
+				IPACMERR("Failed to decode rtm route message\n");
 				return IPACM_FAILURE;
 			}
 
@@ -1255,8 +1290,19 @@
 						}
 						memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 									 sizeof(data_addr->ipv6_addr));
+
+						data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+						data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+						data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+						data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+
 						memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 									 sizeof(data_addr->ipv6_addr_mask));
+
+						data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+						data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+						data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);								
 						data_addr->iptype = IPA_IP_v6;
 					}
 					else
@@ -1331,6 +1377,11 @@
 					memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr));
 
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);	
+
 					mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
 					for(mask_index = 0; mask_index < 4; mask_index++)
 					{
@@ -1364,6 +1415,11 @@
 					IPACMDBG("3st: %08x \n",
 									 data_addr->ipv6_addr_mask[3]);
 
+					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); 
+						
 					evt_data.event = IPA_ROUTE_DEL_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1398,9 +1454,21 @@
 					}
 					memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr));
+
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);						
+																						 
+
 					memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
 								 sizeof(data_addr->ipv6_addr_mask));
 
+					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); 
+
 					evt_data.event = IPA_ROUTE_DEL_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1449,6 +1517,11 @@
 					memcpy(data_all->ipv6_addr, 
 								 msg_ptr->nl_neigh_info.attr_info.local_addr.__ss_padding,
 								 sizeof(data_all->ipv6_addr));
+
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);	
 					data_all->iptype = IPA_IP_v6;
 				}
 				else
@@ -1531,6 +1604,11 @@
 
 					memcpy(data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr.__ss_padding,
 								 sizeof(data_all->ipv6_addr));
+
+					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);	
 					data_all->iptype = IPA_IP_v6;
 				}
 				else
@@ -1686,7 +1764,7 @@
 	 ipa_sock_thrd_fd_read_f read_f
 	 )
 {
-	ipa_nl_sk_info_t sk_info, sk_info2;
+	ipa_nl_sk_info_t sk_info;
 	int ret_val;
 
 	memset(&sk_info, 0, sizeof(ipa_nl_sk_info_t));
diff --git a/ipacm/src/IPACM_Routing.cpp b/ipacm/src/IPACM_Routing.cpp
index 1351fbe..43f42bf 100644
--- a/ipacm/src/IPACM_Routing.cpp
+++ b/ipacm/src/IPACM_Routing.cpp
@@ -53,7 +53,7 @@
 	m_fd = open(DEVICE_NAME, O_RDWR);
 	if (0 == m_fd)
 	{
-		IPACMDBG("Failed opening %s.\n", DEVICE_NAME);
+		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
 	}
 }
 
@@ -77,7 +77,7 @@
 
 	if (!DeviceNodeIsOpened())
 	{
-		IPACMDBG("Device is not opened\n");
+		IPACMERR("Device is not opened\n");
 		return false;
 	}
 
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 1a45dc5..237c4d9 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -78,9 +78,6 @@
 	const int NUM_RULES = 1;
 	int res = IPACM_SUCCESS;
 
-	/* initial multicast/broadcast/fragment filter rule */
-	init_fl_rule(data->iptype);
-
 	rt_rule = (struct ipa_ioc_add_rt_rule *)
 		 calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
 						NUM_RULES * sizeof(struct ipa_rt_rule_add));
@@ -105,7 +102,7 @@
 	}
 
 	rt_rule_entry = &rt_rule->rules[0];
-	rt_rule_entry->at_rear = 1;
+	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;
 
@@ -149,12 +146,21 @@
 	if (data->iptype == IPA_IP_v4)
 	{
 		dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
-		IPACMDBG("ipv4 wan rt rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
+		IPACMDBG("ipv4 wan iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
+		
+		/* initial multicast/broadcast/fragment filter rule */
+		init_fl_rule(data->iptype); 
 	}
 	else
 	{
-		dft_rt_rule_hdl[1 + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
-		IPACMDBG("ipv6 wan rt rule hdl1=0x%x\n", dft_rt_rule_hdl[1 + num_dft_rt]);
+		if (num_dft_rt == 0)
+		{
+			/* initial multicast/broadcast/fragment filter rule */
+			init_fl_rule(data->iptype);
+		}
+
+		dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
+		IPACMDBG("ipv6 wan iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt]);
 		num_dft_rt++;
 	}
 
@@ -193,9 +199,11 @@
 			ipa_interface_index = iface_ipa_index_query(data->if_index);
 			if (ipa_interface_index == ipa_if_num)
 			{
-				if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+				/* 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))) 
 				{
-					IPACMDBG("Received IPA_ADDR_ADD_EVENT\n");
+				        IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt);
 					handle_addr_evt(data);
 				}
 			}
@@ -266,7 +274,6 @@
 			if (ipa_interface_index == ipa_if_num)
 			{
 				IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT\n");
-				IPACMDBG("I'm in the WAN\n");
 				handle_header_add_evt(data->mac_addr);
 			}
 		}
@@ -346,12 +353,14 @@
 
 	IPACMDBG(" WAN table created %s \n", rt_rule->rt_tbl_name);
 	rt_rule_entry = &rt_rule->rules[0];
-	rt_rule_entry->at_rear = 1;
+	rt_rule_entry->at_rear = true;
 
 	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
 	{
 		if (data->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);		
 			continue;
 		}
 
@@ -447,6 +456,7 @@
 	return IPACM_SUCCESS;
 }
 
+
 /* wan default route/filter rule delete */
 int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
 {
@@ -461,6 +471,14 @@
 
 		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
 		{
+		
+		    if(iptype != tx_prop->tx[tx_index].ip)
+		    {
+		    	IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d, no RT-rule deleted\n", 
+		    					    tx_index, tx_prop->tx[tx_index].ip,iptype);		
+		    	continue;
+		    }		
+		
 			if (iptype == IPA_IP_v4)
 			{
 
@@ -477,7 +495,7 @@
 				if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl[tx_index], IPA_IP_v6)
 						== false)
 				{
-					IPACMERR("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index);
+					IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index);
 					return IPACM_FAILURE;
 				}
 			}
@@ -500,12 +518,14 @@
 			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
 			IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 \n");
 			IPACM_EvtDispatcher::PostEvt(&evt_data);
+			IPACMDBG("setup wan_up/active_v4= false \n"); 
 			IPACM_Wan::wan_up = false;
 			active_v4 = false;
 		}
 		else
 		{
-			active_v6 = false;
+			IPACMDBG("setup active_v6= false \n");
+			active_v6 = false; 
 		}
 	}
 	else
@@ -743,7 +763,7 @@
 				{
 					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
 
-					flt_rule_entry.at_rear = true;
+					flt_rule_entry.at_rear = false;
 					flt_rule_entry.flt_rule_hdl = -1;
 					flt_rule_entry.status = -1;
 					flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; //Matched the firewall rule, go exception
@@ -946,7 +966,7 @@
 
 			if (!m_pFilteringTable)
 			{
-				IPACMDBG("Error Locate ipa_flt_rule_add memory...\n");
+				IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
 				return IPACM_FAILURE;
 			}
 			m_pFilteringTable->commit = 1;
@@ -969,11 +989,11 @@
 				{
 					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
 
-					flt_rule_entry.at_rear = true;
+					flt_rule_entry.at_rear = false;
 					flt_rule_entry.flt_rule_hdl = -1;
 					flt_rule_entry.status = -1;
 
-					flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
+					flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
 					flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_v6.hdl;
 					memcpy(&flt_rule_entry.rule.attrib,
 								 &firewall_config.extd_firewall_entries[i].attrib,
@@ -1049,7 +1069,7 @@
 			flt_rule_entry.at_rear = true;
 			flt_rule_entry.flt_rule_hdl = -1;
 			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
 			memcpy(&flt_rule_entry.rule.attrib,
 						 &rx_prop->rx[0].attrib,
 						 sizeof(struct ipa_rule_attrib));
@@ -1119,7 +1139,7 @@
 		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4)
 				== false)
 		{
-			IPACMDBG("Routing rule deletion failed!\n");
+		   IPACMERR("Routing rule deletion failed!\n");
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -1132,7 +1152,7 @@
 		/* May have multiple ipv6 iface-routing rules*/
 		for (i = 0; i < num_dft_rt; i++)
 		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[1 + i], IPA_IP_v6)
+			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6)
 					== false)
 			{
 				IPACMERR("Routing rule deletion failed!\n");
@@ -1147,7 +1167,6 @@
 	/* check software routing fl rule hdl */
 	if (softwarerouting_act == true)
 	{
-		IPACM_Iface::handle_software_routing_disable();
 		handle_software_routing_disable();
 	}
 
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 0160406..4ed66b4 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -121,8 +121,12 @@
 
 			if (ipa_interface_index == ipa_if_num)
 			{
-				if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+				/* 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)))
 				{
+
+					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)
 					{
@@ -253,18 +257,18 @@
 		}
 		break;
 
-		/* handle software routing enable event*/
+		/* handle software routing enable event, iface will update softwarerouting_act to true*/
 	case IPA_SW_ROUTING_ENABLE:
 		IPACMDBG("Received IPA_SW_ROUTING_ENABLE\n");
-		IPACM_Iface::handle_software_routing_enable();
 		handle_software_routing_enable();
+		IPACM_Iface::handle_software_routing_enable();
 		break;
 
-		/* handle software routing disable event*/
+		/* handle software routing disable event, iface will update softwarerouting_act to false*/
 	case IPA_SW_ROUTING_DISABLE:
 		IPACMDBG("Received IPA_SW_ROUTING_DISABLE\n");
-		IPACM_Iface::handle_software_routing_disable();
 		handle_software_routing_disable();
+		IPACM_Iface::handle_software_routing_disable();
 		break;
 
 	default:
@@ -424,7 +428,7 @@
 	{
 		if (clnt_indx == IPACM_INVALID_INDEX)
 		{
-			IPACMDBG("wlan client not found/attached \n");
+			IPACMERR("wlan client not found/attached \n");
 			return IPACM_FAILURE;
 		}
 	}
@@ -649,7 +653,7 @@
 
 	if (delete_default_qos_rtrules(clt_indx))
 	{
-		IPACMDBG("unbale to delete default qos route rules\n");
+		IPACMERR("unbale to delete default qos route rules\n");
 		return IPACM_FAILURE;
 	}
 
@@ -729,7 +733,7 @@
 
 	if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4))
 	{
-		IPACMDBG("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4);
+		IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4);
 		return IPACM_FAILURE;
 	}
 
@@ -751,8 +755,7 @@
 	memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
 	if (m_filtering.AddFilteringRule(m_pFilteringTable) == false)
 	{
-		IPACMDBG("Error Adding Filtering Rule, aborting...\n");
-		perror("Wlan: Unable to add filtering table");
+		IPACMERR("Error Adding Filtering Rule, aborting...\n");
 		free(m_pFilteringTable);
 		return IPACM_FAILURE;
 	}
@@ -792,7 +795,12 @@
 	ipa_ioc_add_flt_rule *m_pFilteringTable;
 	int res = IPACM_SUCCESS;
 
-	IPACMDBG("\n");
+	if (softwarerouting_act == true)
+	{
+		IPACMDBG("already setup AMPDU software_routing rule for (%s)iface ip-family %d\n", 
+						      IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+		return IPACM_SUCCESS;
+	}
 
 	m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
 		 calloc(1,
@@ -839,7 +847,7 @@
 		}
 		else if (m_pFilteringTable->rules[0].status)
 		{
-			IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+			IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -860,7 +868,7 @@
 		}
 		else if (m_pFilteringTable->rules[0].status)
 		{
-			IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+			IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -883,7 +891,7 @@
 		}
 		else if (m_pFilteringTable->rules[0].status)
 		{
-			IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+			IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
 			res = IPACM_FAILURE;
 			goto fail;
 		}
@@ -904,6 +912,14 @@
 /*delete ampdu filter rules for disabling software_routing event*/
 int IPACM_Wlan::handle_software_routing_disable(void)
 {
+	
+	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);
+		return IPACM_SUCCESS;
+	}
+
 
 	if (ip_type == IPA_IP_MAX)
 	{
@@ -1260,7 +1276,7 @@
 	if (ip_type == IPACM_IP_NULL)
 	{
 		IPACMERR("Invalid iptype: 0x%x\n", ip_type);
-		return IPACM_FAILURE;
+		goto fail;
 	}
 
 	/* Delete v6 filtering rules */
@@ -1337,7 +1353,7 @@
 		/* May have multiple ipv6 iface-RT rules */
 		for (i = 0; i < num_dft_rt; i++)
 		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[i + 1], IPA_IP_v6)
+			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6)
 					== false)
 			{
 				IPACMERR("Routing rule deletion failed!\n");
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
index 06f20b6..551c178 100644
--- a/ipacm/src/IPACM_cfg.xml
+++ b/ipacm/src/IPACM_cfg.xml
@@ -28,11 +28,11 @@
 		<IPACMALG>
 			<ALG>
   			   <Protocol>TCP</Protocol>
-  			   <Port>23</Port>
+  			   <Port>21</Port>
 		    </ALG>		
 			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>250</Port>
+  			   <Protocol>TCP</Protocol>
+  			   <Port>554</Port>
 		    </ALG>		
 		</IPACMALG>
 		<IPACMNAT>