Emptying repository to get contribution from AOSP

Change-Id: Ia0d69a6e1aa0212b94d2e868bd819623cb854a34
Signed-off-by: Thierry Strudel <tstrudel@google.com>
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index cc1ba0e..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-ifneq ($(filter msm8998,$(TARGET_BOARD_PLATFORM)),)
-  include $(call first-makefiles-under,$(LOCAL_PATH))
-endif
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index fab2aff..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = foreign
-SUBDIRS = ipanat/src ipacm/src/
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 33164c0..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,57 +0,0 @@
-#                                               -*- Autoconf -*-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ([2.65])
-AC_INIT(data-ipa, 1.0.0)
-AM_INIT_AUTOMAKE(data-ipa, 1.0.0)
-AC_OUTPUT(Makefile ipanat/src/Makefile ipacm/src/Makefile)
-AC_CONFIG_SRCDIR([ipanat/src/ipa_nat_drv.c])
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_LIBTOOL
-AC_PROG_CXX
-
-PKG_CHECK_MODULES([LIBXML], [libxml-2.0])
-AC_SUBST([LIBXML_CFLAGS])
-AC_SUBST([LIBXML_LIBS])
-
-# Checks for libraries.
-
-AC_ARG_WITH(sanitized-headers,
-      AS_HELP_STRING([--with-sanitized-headers=DIR],
-         [Specify the location of the sanitized Linux headers]),
-      [CPPFLAGS="$CPPFLAGS -idirafter $withval"])
-
-AC_ARG_WITH([glib],
-      AC_HELP_STRING([--with-glib],
-         [enable glib, building HLOS systems which use glib]))
-
-if (test "x${with_glib}" = "xyes"); then
-        AC_DEFINE(ENABLE_USEGLIB, 1, [Define if HLOS systems uses glib])
-        PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
-                                AC_MSG_ERROR(GThread >= 2.16 is required))
-        PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
-                                AC_MSG_ERROR(GLib >= 2.16 is required))
-        GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
-        GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
-        AC_SUBST(GLIB_CFLAGS)
-        AC_SUBST(GLIB_LIBS)
-fi
-
-AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
-	  
-# Checks for header files.
-AC_CHECK_HEADERS([fcntl.h netinet/in.h sys/ioctl.h unistd.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_TYPE_OFF_T
-
-# Checks for library functions.
-AC_FUNC_MALLOC
-AC_FUNC_MMAP
-AC_CHECK_FUNCS([memset munmap])
-
-AC_OUTPUT
diff --git a/ipacm/inc/IPACM_CmdQueue.h b/ipacm/inc/IPACM_CmdQueue.h
deleted file mode 100644
index 27d7c8b..0000000
--- a/ipacm/inc/IPACM_CmdQueue.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_CmdQueue.h
-
-	@brief
-	This file implements the IPAM Comment Queue definitions
-
-	@Author
-
-*/
-#ifndef IPA_CONNTRACK_MESSAGE_H
-#define IPA_CONNTRACK_MESSAGE_H
-
-#include <pthread.h>
-#include "IPACM_Defs.h"
-
-
-
-/*---------------------------------------------------------------------------
-	 Event data required by IPA_CM
----------------------------------------------------------------------------*/
-
-
-typedef struct _ipacm_cmd_q_data {
-	ipa_cm_event_id event;
-	void *evt_data;
-}ipacm_cmd_q_data;
-
-typedef struct cmd_s
-{
-	void (*callback_ptr)(ipacm_cmd_q_data *);
-	ipacm_cmd_q_data data;
-}cmd_t;
-
-class Message
-{
-private:
-	Message *m_next;
-
-public:
-	cmd_t evt;
-
-	Message()
-	{
-		m_next = NULL;
-		evt.callback_ptr = NULL;
-	}
-	~Message() { }
-	void setnext(Message *item) { m_next = item; }
-	Message* getnext()       { return m_next; }
-};
-
-class MessageQueue
-{
-
-private:
-	Message *Head;
-	Message *Tail;
-	Message* dequeue(void);
-	static MessageQueue *inst_internal;
-	static MessageQueue *inst_external;
-
-	MessageQueue()
-	{
-		Head = NULL;
-		Tail = NULL;
-	}
-
-public:
-
-	~MessageQueue() { }
-	void enqueue(Message *item);
-
-	static void* Process(void *);
-	static MessageQueue* getInstanceInternal();
-	static MessageQueue* getInstanceExternal();
-
-};
-
-#endif  /* IPA_CONNTRACK_MESSAGE_H */
-
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h
deleted file mode 100644
index 5bcb4eb..0000000
--- a/ipacm/inc/IPACM_Config.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Config.h
-
-	@brief
-	This file implements the IPACM Configuration from XML file
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_CONFIG_H
-#define IPACM_CONFIG_H
-
-#include "IPACM_Defs.h"
-#include "IPACM_Xml.h"
-#include "IPACM_EvtDispatcher.h"
-
-typedef struct
-{
-  char iface_name[IPA_IFACE_NAME_LEN];
-}NatIfaces;
-
-/* for IPACM rm dependency use*/
-typedef struct _ipa_rm_client
-{
-    ipa_rm_resource_name producer_rm1;
-    ipa_rm_resource_name consumer_rm1;
-    ipa_rm_resource_name producer_rm2;
-    ipa_rm_resource_name consumer_rm2;
-    bool producer1_up;            /* only monitor producer_rm1, not monitor producer_rm2 */
-    bool consumer1_up;            /* only monitor consumer_rm1, not monitor consumer_rm2 */
-    bool rm_set;                  /* once producer1_up and consumer1_up, will add bi-directional dependency */
-    bool rx_bypass_ipa;          /* support WLAN may not register RX-property, should not add dependency */
-}ipa_rm_client;
-
-#define MAX_NUM_EXT_PROPS 25
-
-/* used to hold extended properties */
-typedef struct
-{
-	uint8_t num_ext_props;
-	ipa_ioc_ext_intf_prop prop[MAX_NUM_EXT_PROPS];
-} ipacm_ext_prop;
-
-/* iface */
-class IPACM_Config
-{
-public:
-
-	/* IPACM ipa_client map to rm_resource*/
-	ipa_rm_resource_name ipa_client_rm_map_tbl[IPA_CLIENT_MAX];
-
-	/* IPACM monitored rm_depency table */
-	ipa_rm_client ipa_rm_tbl[IPA_MAX_RM_ENTRY];
-
-	/* IPACM rm_depency a2 endpoint check*/
-	int ipa_rm_a2_check;
-
-	/* Store interested interface and their configuration from XML file */
-	ipa_ifi_dev_name_t *iface_table;
-
-	/* Store interested ALG port from XML file */
-	ipacm_alg *alg_table;
-
-	/* Store private subnet configuration from XML file */
-	ipa_private_subnet private_subnet_table[IPA_MAX_PRIVATE_SUBNET_ENTRIES];
-
-	/* Store the non nat iface names */
-	NatIfaces *pNatIfaces;
-
-	/* Store the bridge iface names */
-	char ipa_virtual_iface_name[IPA_IFACE_NAME_LEN];
-
-	/* Store the number of interface IPACM read from XML file */
-	int ipa_num_ipa_interfaces;
-
-	int ipa_num_private_subnet;
-
-	int ipa_num_alg_ports;
-
-	int ipa_nat_max_entries;
-
-	bool ipacm_odu_router_mode;
-
-	bool ipacm_odu_enable;
-
-	bool ipacm_odu_embms_enable;
-
-	bool ipacm_ip_passthrough_mode;
-
-	int ipa_nat_iface_entries;
-
-	/* Store the total number of wlan guest ap configured */
-	int ipa_num_wlan_guest_ap;
-
-	/* Max valid rm entry */
-	int ipa_max_valid_rm_entry;
-
-	/* Store SW-enable or not */
-	bool ipa_sw_rt_enable;
-
-	/* Store bridge mode or not */
-	bool ipa_bridge_enable;
-
-	/* Store bridge netdev mac */
-	uint8_t bridge_mac[IPA_MAC_ADDR_SIZE];
-
-	/* Store the flt rule count for each producer client*/
-	int flt_rule_count_v4[IPA_CLIENT_CONS - IPA_CLIENT_PROD];
-	int flt_rule_count_v6[IPA_CLIENT_CONS - IPA_CLIENT_PROD];
-
-	/* IPACM routing table name for v4/v6 */
-	struct ipa_ioc_get_rt_tbl rt_tbl_lan_v4, rt_tbl_wan_v4, rt_tbl_default_v4, rt_tbl_v6, rt_tbl_wan_v6;
-	struct ipa_ioc_get_rt_tbl rt_tbl_wan_dl;
-	struct ipa_ioc_get_rt_tbl rt_tbl_odu_v4, rt_tbl_odu_v6;
-
-	bool isMCC_Mode;
-
-	/* To return the instance */
-	static IPACM_Config* GetInstance();
-
-	const char* getEventName(ipa_cm_event_id event_id);
-
-	inline void increaseFltRuleCount(int index, ipa_ip_type iptype, int increment)
-	{
-		if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0))
-		{
-			IPACMERR("Index is out of range: %d.\n", index);
-			return;
-		}
-		if(iptype == IPA_IP_v4)
-		{
-			flt_rule_count_v4[index] += increment;
-			IPACMDBG_H("Now num of v4 flt rules on client %d is %d.\n", index, flt_rule_count_v4[index]);
-		}
-		else
-		{
-			flt_rule_count_v6[index] += increment;
-			IPACMDBG_H("Now num of v6 flt rules on client %d is %d.\n", index, flt_rule_count_v6[index]);
-		}
-		return;
-	}
-
-	inline void decreaseFltRuleCount(int index, ipa_ip_type iptype, int decrement)
-	{
-		if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0))
-		{
-			IPACMERR("Index is out of range: %d.\n", index);
-			return;
-		}
-		if(iptype == IPA_IP_v4)
-		{
-			flt_rule_count_v4[index] -= decrement;
-			IPACMDBG_H("Now num of v4 flt rules on client %d is %d.\n", index, flt_rule_count_v4[index]);
-		}
-		else
-		{
-			flt_rule_count_v6[index] -= decrement;
-			IPACMDBG_H("Now num of v6 flt rules on client %d is %d.\n", index, flt_rule_count_v6[index]);
-		}
-		return;
-	}
-
-	inline int getFltRuleCount(int index, ipa_ip_type iptype)
-	{
-		if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0))
-		{
-			IPACMERR("Index is out of range: %d.\n", index);
-			return -1;
-		}
-		if(iptype == IPA_IP_v4)
-		{
-			return flt_rule_count_v4[index];
-		}
-		else
-		{
-			return flt_rule_count_v6[index];
-		}
-	}
-
-	inline int GetAlgPortCnt()
-	{
-		return ipa_num_alg_ports;
-	}
-
-	int GetAlgPorts(int nPorts, ipacm_alg *pAlgPorts);
-
-	inline int GetNatMaxEntries(void)
-	{
-		return ipa_nat_max_entries;
-	}
-
-	inline int GetNatIfacesCnt()
-	{
-		return ipa_nat_iface_entries;
-	}
-	int GetNatIfaces(int nPorts, NatIfaces *ifaces);
-
-	/* for IPACM resource manager dependency usage */
-	void AddRmDepend(ipa_rm_resource_name rm1,bool rx_bypass_ipa);
-
-	void DelRmDepend(ipa_rm_resource_name rm1);
-
-	int AddNatIfaces(char *dev_name);
-
-	int DelNatIfaces(char *dev_name);
-
-	inline void SetQmapId(uint8_t id)
-	{
-		qmap_id = id;
-	}
-
-	inline uint8_t GetQmapId()
-	{
-		return qmap_id;
-	}
-
-	int SetExtProp(ipa_ioc_query_intf_ext_props *prop);
-
-	ipacm_ext_prop* GetExtProp(ipa_ip_type ip_type);
-
-	int DelExtProp(ipa_ip_type ip_type);
-
-	int Init(void);
-
-	inline bool isPrivateSubnet(uint32_t ip_addr)
-	{
-		for(int cnt=0; cnt<ipa_num_private_subnet; cnt++)
-		{
-			if(private_subnet_table[cnt].subnet_addr ==
-				 (private_subnet_table[cnt].subnet_mask & ip_addr))
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-#ifdef FEATURE_IPA_ANDROID
-	inline bool AddPrivateSubnet(uint32_t ip_addr, int ipa_if_index)
-	{
-		ipacm_cmd_q_data evt_data;
-		ipacm_event_data_fid *data_fid;
-		uint32_t subnet_mask = ~0;
-		for(int cnt=0; cnt<ipa_num_private_subnet; cnt++)
-		{
-			if(private_subnet_table[cnt].subnet_addr == ip_addr)
-			{
-				IPACMDBG("Already has private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, cnt);
-				return true;
-			}
-		}
-
-		if(ipa_num_private_subnet < IPA_MAX_PRIVATE_SUBNET_ENTRIES)
-		{
-			IPACMDBG("Add IPACM private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, ipa_num_private_subnet);
-			private_subnet_table[ipa_num_private_subnet].subnet_addr = ip_addr;
-			private_subnet_table[ipa_num_private_subnet].subnet_mask = (subnet_mask >> 8) << 8;
-			ipa_num_private_subnet++;
-
-			/* IPACM private subnet set changes */
-			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 = ipa_if_index; // already ipa index, not fid index
-			evt_data.event = IPA_PRIVATE_SUBNET_CHANGE_EVENT;
-			evt_data.evt_data = data_fid;
-
-			/* Insert IPA_PRIVATE_SUBNET_CHANGE_EVENT to command queue */
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-			return true;
-		}
-		IPACMERR("IPACM private subnet_addr overflow, total entry(%d)\n", ipa_num_private_subnet);
-		return false;
-	}
-
-	inline bool DelPrivateSubnet(uint32_t ip_addr, int ipa_if_index)
-	{
-		ipacm_cmd_q_data evt_data;
-		ipacm_event_data_fid *data_fid;
-		for(int cnt=0; cnt<ipa_num_private_subnet; cnt++)
-		{
-			if(private_subnet_table[cnt].subnet_addr == ip_addr)
-			{
-				IPACMDBG("Found private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, cnt);
-				for (; cnt < ipa_num_private_subnet - 1; cnt++)
-				{
-					private_subnet_table[cnt].subnet_addr = private_subnet_table[cnt+1].subnet_addr;
-				}
-				ipa_num_private_subnet = ipa_num_private_subnet - 1;
-
-				/* IPACM private subnet set changes */
-				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 = ipa_if_index; // already ipa index, not fid index
-				evt_data.event = IPA_PRIVATE_SUBNET_CHANGE_EVENT;
-				evt_data.evt_data = data_fid;
-
-				/* Insert IPA_PRIVATE_SUBNET_CHANGE_EVENT to command queue */
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-				return true;
-			}
-		}
-		IPACMDBG("can't find private subnet_addr as: 0x%x \n", ip_addr);
-		return false;
-	}
-#endif /* defined(FEATURE_IPA_ANDROID)*/
-
-	static const char *DEVICE_NAME_ODU;
-
-private:
-	static IPACM_Config *pInstance;
-	static const char *DEVICE_NAME;
-	IPACM_Config(void);
-	int m_fd; /* File descriptor of the IPA device node /dev/ipa */
-	uint8_t qmap_id;
-	ipacm_ext_prop ext_prop_v4;
-	ipacm_ext_prop ext_prop_v6;
-};
-
-#endif /* IPACM_CONFIG */
diff --git a/ipacm/inc/IPACM_ConntrackClient.h b/ipacm/inc/IPACM_ConntrackClient.h
deleted file mode 100644
index a6076cf..0000000
--- a/ipacm/inc/IPACM_ConntrackClient.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef IPACM_CONNTRACK_FILTER_H
-#define IPACM_CONNTRACK_FILTER_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <errno.h>
-
-#include "IPACM_ConntrackClient.h"
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Conntrack_NATApp.h"
-#include "IPACM_EvtDispatcher.h"
-#include "IPACM_Defs.h"
-
-#ifndef IPACM_DEBUG
-#define IPACM_DEBUG
-#endif
-
-extern "C"
-{
-#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
-#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
-#include <sys/inotify.h>
-}
-
-using namespace std;
-
-#define UDP_TIMEOUT_UPDATE 20
-#define BROADCAST_IPV4_ADDR 0xFFFFFFFF
-
-class IPACM_ConntrackClient
-{
-
-private:
-   static IPACM_ConntrackClient *pInstance;
-
-   struct nfct_handle *tcp_hdl;
-   struct nfct_handle *udp_hdl;
-   struct nfct_filter *tcp_filter;
-   struct nfct_filter *udp_filter;
-   static int IPA_Conntrack_Filters_Ignore_Local_Addrs(struct nfct_filter *filter);
-   static int IPA_Conntrack_Filters_Ignore_Bridge_Addrs(struct nfct_filter *filter);
-   static int IPA_Conntrack_Filters_Ignore_Local_Iface(struct nfct_filter *, ipacm_event_iface_up *);
-   IPACM_ConntrackClient();
-
-public:
-   static int IPAConntrackEventCB(enum nf_conntrack_msg_type type,
-                                  struct nf_conntrack *ct,
-                                  void *data);
-
-   static int IPA_Conntrack_UDP_Filter_Init(void);
-   static int IPA_Conntrack_TCP_Filter_Init(void);
-   static void* TCPRegisterWithConnTrack(void *);
-   static void* UDPRegisterWithConnTrack(void *);
-   static void* UDPConnTimeoutUpdate(void *);
-
-   static void UpdateUDPFilters(void *, bool);
-   static void UpdateTCPFilters(void *, bool);
-   static void Read_TcpUdp_Timeout(char *in, int len);
-
-   static IPACM_ConntrackClient* GetInstance();
-
-#ifdef IPACM_DEBUG
-#define iptodot(X,Y) \
-		 IPACMLOG(" %s(0x%x): %d.%d.%d.%d\n", X, Y, ((Y>>24) & 0xFF), ((Y>>16) & 0xFF), ((Y>>8) & 0xFF), (Y & 0xFF));
-#endif
-
-#define log_nat(A,B,C,D,E,F) \
-		IPACMDBG_H("protocol %d Private IP: %d.%d.%d.%d\t Target IP: %d.%d.%d.%d\t private port: %d public port: %d %s",A,((B>>24) & 0xFF), ((B>>16) & 0xFF), ((B>>8) & 0xFF), (B & 0xFF), ((C>>24) & 0xFF), ((C>>16) & 0xFF),((C>>8) & 0xFF),(C & 0xFF),D,E,F);
-
-};
-
-#endif  /* IPACM_CONNTRACK_FILTER_H */
diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h
deleted file mode 100644
index cdf3ef5..0000000
--- a/ipacm/inc/IPACM_ConntrackListener.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef IPACM_CONNTRACK_LISTENER
-#define IPACM_CONNTRACK_LISTENER
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <errno.h>
-
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Conntrack_NATApp.h"
-#include "IPACM_Listener.h"
-#ifdef CT_OPT
-#include "IPACM_LanToLan.h"
-#endif
-
-#define MAX_IFACE_ADDRESS 50
-#define MAX_STA_CLNT_IFACES 10
-#define STA_CLNT_SUBNET_MASK 0xFFFFFF00
-
-using namespace std;
-
-typedef struct _nat_entry_bundle
-{
-	struct nf_conntrack *ct;
-	enum nf_conntrack_msg_type type;
-	nat_table_entry *rule;
-	bool isTempEntry;
-
-}nat_entry_bundle;
-
-class IPACM_ConntrackListener : public IPACM_Listener
-{
-
-private:
-	bool isCTReg;
-	bool isNatThreadStart;
-	bool WanUp;
-	NatApp *nat_inst;
-
-	int NatIfaceCnt;
-	int StaClntCnt;
-	NatIfaces *pNatIfaces;
-	uint32_t nat_iface_ipv4_addr[MAX_IFACE_ADDRESS];
-	uint32_t nonnat_iface_ipv4_addr[MAX_IFACE_ADDRESS];
-	uint32_t sta_clnt_ipv4_addr[MAX_STA_CLNT_IFACES];
-	IPACM_Config *pConfig;
-#ifdef CT_OPT
-	IPACM_LanToLan *p_lan2lan;
-#endif
-
-	void ProcessCTMessage(void *);
-	void ProcessTCPorUDPMsg(struct nf_conntrack *,
-	enum nf_conntrack_msg_type, u_int8_t);
-	void TriggerWANUp(void *);
-	void TriggerWANDown(uint32_t);
-	int  CreateNatThreads(void);
-	int  CreateConnTrackThreads(void);
-	bool AddIface(nat_table_entry *, bool *);
-	void AddORDeleteNatEntry(const nat_entry_bundle *);
-	void PopulateTCPorUDPEntry(struct nf_conntrack *, uint32_t, nat_table_entry *);
-	void CheckSTAClient(const nat_table_entry *, bool *);
-	int CheckNatIface(ipacm_event_data_all *, bool *);
-	void HandleNonNatIPAddr(void *, bool);
-
-#ifdef CT_OPT
-	void ProcessCTV6Message(void *);
-	void HandleLan2Lan(struct nf_conntrack *,
-		enum nf_conntrack_msg_type, nat_table_entry* );
-#endif
-
-public:
-	char wan_ifname[IPA_IFACE_NAME_LEN];
-	uint32_t wan_ipaddr;
-	bool isStaMode;
-	IPACM_ConntrackListener();
-	void event_callback(ipa_cm_event_id, void *data);
-	inline bool isWanUp()
-	{
-		return WanUp;
-	}
-
-	void HandleNeighIpAddrAddEvt(ipacm_event_data_all *);
-	void HandleNeighIpAddrDelEvt(uint32_t);
-	void HandleSTAClientAddEvt(uint32_t);
-	void HandleSTAClientDelEvt(uint32_t);
-};
-
-extern IPACM_ConntrackListener *CtList;
-
-#endif /* IPACM_CONNTRACK_LISTENER */
diff --git a/ipacm/inc/IPACM_Conntrack_NATApp.h b/ipacm/inc/IPACM_Conntrack_NATApp.h
deleted file mode 100644
index e50b316..0000000
--- a/ipacm/inc/IPACM_Conntrack_NATApp.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef IPACM_CONNTRACK_NATAPP_H
-#define IPACM_CONNTRACK_NATAPP_H
-
-#include <string.h>  /* for stderror */
-#include <stdlib.h>
-#include <cstdio>  /* for perror */
-
-#include "IPACM_Config.h"
-#include "IPACM_Xml.h"
-
-extern "C"
-{
-#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
-#include <ipa_nat_drv.h>
-}
-
-#define MAX_TEMP_ENTRIES 25
-
-#define IPACM_TCP_FULL_FILE_NAME  "/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established"
-#define IPACM_UDP_FULL_FILE_NAME   "/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream"
-
-typedef struct _nat_table_entry
-{
-	uint32_t private_ip;
-	uint16_t private_port;
-
-	uint32_t target_ip;
-	uint16_t target_port;
-
-	uint32_t public_ip;
-	uint16_t public_port;
-
-	u_int8_t  protocol;
-	uint32_t timestamp;
-
-	bool dst_nat;
-	bool enabled;
-	uint32_t rule_hdl;
-
-}nat_table_entry;
-
-#define CHK_TBL_HDL()  if(nat_table_hdl == 0){ return -1; }
-
-class NatApp
-{
-private:
-
-	static NatApp *pInstance;
-
-	nat_table_entry *cache;
-	nat_table_entry temp[MAX_TEMP_ENTRIES];
-	uint32_t pub_ip_addr;
-	uint32_t pub_ip_addr_pre;
-	uint32_t nat_table_hdl;
-
-	int curCnt, max_entries;
-
-	ipacm_alg *pALGPorts;
-	uint16_t nALGPort;
-
-	uint32_t tcp_timeout;
-	uint32_t udp_timeout;
-
-	uint32_t PwrSaveIfs[IPA_MAX_NUM_WIFI_CLIENTS];
-
-	struct nf_conntrack *ct;
-	struct nfct_handle *ct_hdl;
-
-	NatApp();
-	int Init();
-
-	void UpdateCTUdpTs(nat_table_entry *, uint32_t);
-	bool ChkForDup(const nat_table_entry *);
-	bool isAlgPort(uint8_t, uint16_t);
-	void Reset();
-	bool isPwrSaveIf(uint32_t);
-
-public:
-	static NatApp* GetInstance();
-
-	int AddTable(uint32_t);
-	uint32_t GetTableHdl(uint32_t);
-	int DeleteTable(uint32_t);
-
-	int AddEntry(const nat_table_entry *);
-	int DeleteEntry(const nat_table_entry *);
-
-	void UpdateUDPTimeStamp();
-
-	int UpdatePwrSaveIf(uint32_t);
-	int ResetPwrSaveIf(uint32_t);
-	int DelEntriesOnClntDiscon(uint32_t);
-	int DelEntriesOnSTAClntDiscon(uint32_t);
-
-	void Read_TcpUdp_Timeout(void);
-
-	void AddTempEntry(const nat_table_entry *);
-	void CacheEntry(const nat_table_entry *);
-	void DeleteTempEntry(const nat_table_entry *);
-	void FlushTempEntries(uint32_t, bool, bool isDummy = false);
-};
-
-
-
-#endif /* IPACM_CONNTRACK_NATAPP_H */
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
deleted file mode 100644
index d2cc362..0000000
--- a/ipacm/inc/IPACM_Defs.h
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Defs.h
-
-	@brief
-	This file implements the common definitions amon all ifaces.
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPA_CM_DEFS_H
-#define IPA_CM_DEFS_H
-
-#include <unistd.h>
-#include <fcntl.h>
-#include <linux/msm_ipa.h>
-#include "IPACM_Log.h"
-
-#ifdef USE_GLIB
-#include <glib.h>
-#define strlcpy g_strlcpy
-#define strlcat g_strlcat
-#endif
-
-extern "C"
-{
-#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
-#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
-}
-
-#define IF_NAME_LEN 16
-#define IPA_MAX_FILE_LEN  64
-#define IPA_IFACE_NAME_LEN 16
-#define IPA_ALG_PROTOCOL_NAME_LEN  10
-
-#define IPA_WLAN_PARTIAL_HDR_OFFSET  0 // dst mac first then src mac
-#define IPA_ODU_PARTIAL_HDR_OFFSET  8 // dst mac first then src mac
-#define IPA_WLAN_PARTIAL_HDR_NAME_v4  "IEEE802_3_v4"
-#define IPA_WLAN_PARTIAL_HDR_NAME_v6  "IEEE802_3_v6"
-#define IPA_DUMMY_ETH_HDR_NAME_v6     "ETH_dummy_v6"
-#define IPA_WAN_PARTIAL_HDR_NAME_v4  "IEEE802_3_STA_v4"
-#define IPA_WAN_PARTIAL_HDR_NAME_v6  "IEEE802_3_STA_v6"
-#define IPA_ETH_HDR_NAME_v4  "IPACM_ETH_v4"
-#define IPA_ETH_HDR_NAME_v6  "IPACM_ETH_v6"
-#define IPA_ODU_HDR_NAME_v4  "IPACM_ODU_v4"
-#define IPA_ODU_HDR_NAME_v6  "IPACM_ODU_v6"
-
-
-#define IPA_MAX_IFACE_ENTRIES 20
-#define IPA_MAX_PRIVATE_SUBNET_ENTRIES 3
-#define IPA_MAX_ALG_ENTRIES 20
-#define IPA_MAX_RM_ENTRY 6
-
-#define IPV4_ADDR_LINKLOCAL 0xA9FE0000
-#define IPV4_ADDR_LINKLOCAL_MASK 0xFFFF0000
-
-#define V4_DEFAULT_ROUTE_TABLE_NAME  "ipa_dflt_rt"
-#define V4_LAN_ROUTE_TABLE_NAME  "COMRTBLLANv4"
-#define V4_WAN_ROUTE_TABLE_NAME  "WANRTBLv4"
-#define WAN_DL_ROUTE_TABLE_NAME "ipa_dflt_wan_rt"
-#define V6_COMMON_ROUTE_TABLE_NAME  "COMRTBLv6"
-#define V6_WAN_ROUTE_TABLE_NAME  "WANRTBLv6"
-#define V4_ODU_ROUTE_TABLE_NAME  "ODURTBLv4"
-#define V6_ODU_ROUTE_TABLE_NAME  "ODURTBLv6"
-
-#define WWAN_QMI_IOCTL_DEVICE_NAME "/dev/wwan_ioctl"
-#define IPA_DEVICE_NAME "/dev/ipa"
-#define MAX_NUM_PROP 2
-
-#ifndef FEATURE_IPA_V3
-#define IPA_MAX_FLT_RULE 50
-#else
-#define IPA_MAX_FLT_RULE 100
-#endif
-
-#define TCP_FIN_SHIFT 16
-#define TCP_SYN_SHIFT 17
-#define TCP_RST_SHIFT 18
-#define NUM_IPV6_PREFIX_FLT_RULE 1
-
-/*---------------------------------------------------------------------------
-										Return values indicating error status
----------------------------------------------------------------------------*/
-
-#define IPACM_SUCCESS                0         /* Successful operation   */
-#define IPACM_FAILURE               -1         /* Unsuccessful operation */
-
-#define IPACM_IP_NULL (ipa_ip_type)0xFF
-#define IPACM_INVALID_INDEX (ipa_ip_type)0xFF
-
-#define IPA_MAX_NUM_WIFI_CLIENTS  32
-#define IPA_MAX_NUM_WAN_CLIENTS  10
-#define IPA_MAX_NUM_ETH_CLIENTS  15
-#define IPA_MAX_NUM_AMPDU_RULE  15
-#define IPA_MAC_ADDR_SIZE  6
-
-/*===========================================================================
-										 GLOBAL DEFINITIONS AND DECLARATIONS
-===========================================================================*/
-typedef enum
-{
-	IPA_CFG_CHANGE_EVENT,                 /* NULL */
-	IPA_PRIVATE_SUBNET_CHANGE_EVENT,          /* ipacm_event_data_fid */
-	IPA_FIREWALL_CHANGE_EVENT,                /* NULL */
-	IPA_LINK_UP_EVENT,                        /* ipacm_event_data_fid */
-	IPA_LINK_DOWN_EVENT,                      /* ipacm_event_data_fid */
-	IPA_USB_LINK_UP_EVENT,                    /* ipacm_event_data_fid */
-	IPA_BRIDGE_LINK_UP_EVENT,                 /* ipacm_event_data_all */
-	IPA_WAN_EMBMS_LINK_UP_EVENT,              /* ipacm_event_data_mac */
-	IPA_ADDR_ADD_EVENT,                       /* ipacm_event_data_addr */
-	IPA_ADDR_DEL_EVENT,                       /* no use */
-	IPA_ROUTE_ADD_EVENT,                      /* ipacm_event_data_addr */
-	IPA_ROUTE_DEL_EVENT,                      /* ipacm_event_data_addr */
-	IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT,         /* ipacm_event_data_fid */
-	IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT,         /* ipacm_event_data_fid */
-	IPA_WLAN_AP_LINK_UP_EVENT,                /* ipacm_event_data_mac */
-	IPA_WLAN_STA_LINK_UP_EVENT,               /* ipacm_event_data_mac */
-	IPA_WLAN_LINK_DOWN_EVENT,                 /* ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_ADD_EVENT,                /* ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_ADD_EVENT_EX,             /* ipacm_event_data_wlan_ex */
-	IPA_WLAN_CLIENT_DEL_EVENT,                /* ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_POWER_SAVE_EVENT,         /* ipacm_event_data_mac */
-	IPA_WLAN_CLIENT_RECOVER_EVENT,            /* ipacm_event_data_mac */
-	IPA_NEW_NEIGH_EVENT,                      /* ipacm_event_data_all */
-	IPA_DEL_NEIGH_EVENT,                      /* ipacm_event_data_all */
-	IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT,       /* ipacm_event_data_all */
-	IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT,       /* ipacm_event_data_all */
-	IPA_SW_ROUTING_ENABLE,                    /* NULL */
-	IPA_SW_ROUTING_DISABLE,                   /* NULL */
-	IPA_PROCESS_CT_MESSAGE,                   /* ipacm_ct_evt_data */
-	IPA_PROCESS_CT_MESSAGE_V6,                /* ipacm_ct_evt_data */
-	IPA_LAN_TO_LAN_NEW_CONNECTION,            /* ipacm_event_connection */
-	IPA_LAN_TO_LAN_DEL_CONNECTION,            /* ipacm_event_connection */
-	IPA_WLAN_SWITCH_TO_SCC,                   /* No Data */
-	IPA_WLAN_SWITCH_TO_MCC,                   /* No Data */
-	IPA_CRADLE_WAN_MODE_SWITCH,               /* ipacm_event_cradle_wan_mode */
-	IPA_WAN_XLAT_CONNECT_EVENT,               /* ipacm_event_data_fid */
-	IPA_TETHERING_STATS_UPDATE_EVENT,         /* ipacm_event_data_fid */
-	IPA_NETWORK_STATS_UPDATE_EVENT,           /* ipacm_event_data_fid */
-
-	IPA_EXTERNAL_EVENT_MAX,
-
-	IPA_HANDLE_WAN_UP,                        /* ipacm_event_iface_up  */
-	IPA_HANDLE_WAN_DOWN,                      /* ipacm_event_iface_up  */
-	IPA_HANDLE_WAN_UP_V6,                     /* NULL */
-	IPA_HANDLE_WAN_DOWN_V6,                   /* NULL */
-	IPA_HANDLE_WAN_UP_TETHER,                 /* ipacm_event_iface_up_tehter */
-	IPA_HANDLE_WAN_DOWN_TETHER,               /* ipacm_event_iface_up_tehter */
-	IPA_HANDLE_WAN_UP_V6_TETHER,              /* ipacm_event_iface_up_tehter */
-	IPA_HANDLE_WAN_DOWN_V6_TETHER,            /* ipacm_event_iface_up_tehter */
-	IPA_HANDLE_WLAN_UP,                       /* ipacm_event_iface_up */
-	IPA_HANDLE_LAN_UP,                        /* ipacm_event_iface_up */
-	IPA_ETH_BRIDGE_IFACE_UP,                  /* ipacm_event_eth_bridge*/
-	IPA_ETH_BRIDGE_IFACE_DOWN,                /* ipacm_event_eth_bridge*/
-	IPA_ETH_BRIDGE_CLIENT_ADD,                /* ipacm_event_eth_bridge */
-	IPA_ETH_BRIDGE_CLIENT_DEL,                /* ipacm_event_eth_bridge*/
-	IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH,       /* ipacm_event_eth_bridge*/
-	IPA_LAN_DELETE_SELF,                      /* ipacm_event_data_fid */
-	IPACM_EVENT_MAX
-} ipa_cm_event_id;
-
-typedef struct
-{
-	uint8_t num_rule;
-	uint32_t rule_hdl[MAX_NUM_PROP];
-} lan_to_lan_rt_rule_hdl;
-
-typedef enum
-{
-	LAN_IF = 0,
-	WLAN_IF,
-	WAN_IF,
-	VIRTUAL_IF,
-	ETH_IF,
-	EMBMS_IF,
-	ODU_IF,
-	UNKNOWN_IF
-} ipacm_iface_type;
-
-typedef enum
-{
-	ROUTER = 0,
-	BRIDGE
-} ipacm_cradle_iface_mode;
-
-typedef enum
-{
-	FULL,
-	INTERNET
-} ipacm_wlan_access_mode;
-
-typedef struct
-{
-	struct nf_conntrack *ct;
-	enum nf_conntrack_msg_type type;
-}ipacm_ct_evt_data;
-
-typedef struct
-{
-	char iface_name[IPA_IFACE_NAME_LEN];
-	ipacm_iface_type if_cat;
-	ipacm_cradle_iface_mode if_mode;
-	ipacm_wlan_access_mode wlan_mode;
-	int netlink_interface_index;
-} ipa_ifi_dev_name_t;
-
-typedef struct
-{
-	uint32_t subnet_addr;
-	uint32_t subnet_mask;
-} ipa_private_subnet;
-
-
-typedef struct _ipacm_event_data_all
-{
-	enum ipa_ip_type iptype;
-	int if_index;
-	uint32_t  ipv4_addr;
-	uint32_t  ipv6_addr[4];
-	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
-} ipacm_event_data_all;
-
-class IPACM_Lan;
-
-typedef struct
-{
-	ipacm_cradle_iface_mode cradle_wan_mode;
-} ipacm_event_cradle_wan_mode;
-
-typedef struct
-{
-	IPACM_Lan *p_iface;
-	ipa_ip_type iptype;
-	uint8_t mac_addr[6];
-} ipacm_event_eth_bridge;
-
-typedef struct
-{
-	enum ipa_ip_type iptype;
-	uint32_t src_ipv4_addr;
-	uint32_t dst_ipv4_addr;
-	uint32_t src_ipv6_addr[4];
-	uint32_t dst_ipv6_addr[4];
-} ipacm_event_connection;
-
-typedef struct _ipacm_event_data_fid
-{
-	int if_index;
-} ipacm_event_data_fid;
-
-typedef struct
-{
-	ipacm_iface_type if_cat;
-} ipacm_event_data_if_cat;
-
-typedef struct _ipacm_event_data_iptype
-{
-	int if_index;
-	int if_index_tether;
-	enum ipa_ip_type iptype;
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-	uint32_t  ipv4_addr_gw;
-	uint32_t  ipv6_addr_gw[4];
-#endif
-} ipacm_event_data_iptype;
-
-
-typedef struct _ipacm_event_data_addr
-{
-	enum ipa_ip_type iptype;
-	int if_index;
-	uint32_t  ipv4_addr_gw;
-	uint32_t  ipv4_addr;
-	uint32_t  ipv4_addr_mask;
-	uint32_t  ipv6_addr[4];
-	uint32_t  ipv6_addr_mask[4];
-	uint32_t  ipv6_addr_gw[4];
-} ipacm_event_data_addr;
-
-typedef struct _ipacm_event_data_mac
-{
-	int if_index;
-	int ipa_if_cate;
-	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
-} ipacm_event_data_mac;
-
-typedef struct
-{
-	int if_index;
-	uint8_t num_of_attribs;
-	struct ipa_wlan_hdr_attrib_val attribs[0];
-} ipacm_event_data_wlan_ex;
-
-typedef struct _ipacm_event_iface_up
-{
-	char ifname[IPA_IFACE_NAME_LEN];
-	uint32_t ipv4_addr;
-	uint32_t addr_mask;
-	uint32_t ipv6_prefix[2];
-	bool is_sta;
-	uint8_t xlat_mux_id;
-}ipacm_event_iface_up;
-
-typedef struct _ipacm_event_iface_up_tether
-{
-	uint32_t if_index_tether;
-	uint32_t ipv6_prefix[2];
-	bool is_sta;
-}ipacm_event_iface_up_tehter;
-
-typedef enum
-{
-	Q6_WAN = 0,
-	WLAN_WAN,
-	ECM_WAN
-} ipacm_wan_iface_type;
-
-typedef struct _ipacm_ifacemgr_data
-{
-	int if_index;
-	ipacm_wan_iface_type if_type;
-	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
-}ipacm_ifacemgr_data;
-
-#endif /* IPA_CM_DEFS_H */
diff --git a/ipacm/inc/IPACM_EvtDispatcher.h b/ipacm/inc/IPACM_EvtDispatcher.h
deleted file mode 100644
index 550f4d4..0000000
--- a/ipacm/inc/IPACM_EvtDispatcher.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*!
-	@file
-	IPACM_EvtDispatcher.h
-
-	@brief
-	This file implements the IPAM event dispatcher definitions
-
-	@Author
-
-*/
-#ifndef IPACM_EvtDispatcher_H
-#define IPACM_EvtDispatcher_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-#include "IPACM_Defs.h"
-#include "IPACM_Listener.h"
-
-/* queue */
-typedef struct _cmd_evts
-{
-	ipa_cm_event_id event;
-	IPACM_Listener *obj;
-	//int ipa_interface_index;
-	_cmd_evts *next;
-}  cmd_evts;
-
-
-
-class IPACM_EvtDispatcher
-{
-public:
-
-	/* api for all iface instances to register events */
-	static int registr(ipa_cm_event_id event, IPACM_Listener *obj);
-
-	/* api for all iface instances to de-register events */
-	static int deregistr(IPACM_Listener *obj);
-
-	static int PostEvt(ipacm_cmd_q_data *);
-	static void ProcessEvt(ipacm_cmd_q_data *);
-
-private:
-	static cmd_evts *head;
-};
-
-#endif /* IPACM_EvtDispatcher_H */
diff --git a/ipacm/inc/IPACM_Filtering.h b/ipacm/inc/IPACM_Filtering.h
deleted file mode 100644
index 9bb8247..0000000
--- a/ipacm/inc/IPACM_Filtering.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*!
-	@file
-	IPACM_Filtering.h
-
-	@brief
-	This file implements the IPACM filtering definitions
-
-	@Author
-	Skylar Chang
-
-*/
-
-#ifndef IPACM_FILTERING_H
-#define IPACM_FILTERING_H
-
-#include <stdint.h>
-#include <linux/msm_ipa.h>
-#include <IPACM_Defs.h>
-#include <linux/rmnet_ipa_fd_ioctl.h>
-
-class IPACM_Filtering
-{
-public:
-	IPACM_Filtering();
-	~IPACM_Filtering();
-	bool AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTable);
-	bool AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable);
-	bool DeleteFilteringRule(struct ipa_ioc_del_flt_rule *ruleTable);
-	bool Commit(enum ipa_ip_type ip);
-	bool Reset(enum ipa_ip_type ip);
-	bool DeviceNodeIsOpened();
-	bool DeleteFilteringHdls(uint32_t *flt_rule_hdls,
-													 ipa_ip_type ip,
-													 uint8_t num_rules);
-
-	bool AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *rule_table_v4, struct ipa_ioc_add_flt_rule const * rule_table_v6, uint8_t mux_id);
-	bool SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table);
-	bool ModifyFilteringRule(struct ipa_ioc_mdfy_flt_rule* ruleTable);
-	ipa_filter_action_enum_v01 GetQmiFilterAction(ipa_flt_action action);
-
-private:
-	static const char *DEVICE_NAME;
-	int fd; /* File descriptor of the IPA device node /dev/ipa */
-};
-
-#endif //IPACM_FILTERING_H
-
diff --git a/ipacm/inc/IPACM_Header.h b/ipacm/inc/IPACM_Header.h
deleted file mode 100644
index 027c8ff..0000000
--- a/ipacm/inc/IPACM_Header.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
- * IPACM_Header.h
- *
- *  Created on: Jun 20, 2012
- *      Author: tatias
- */
-
-//////////////////////////////////////////////////////////////////////////////////
-
-#ifndef IPACM_HEADER_H
-#define IPACM_HEADER_H
-
-#include <stdint.h>
-#include "linux/msm_ipa.h"
-
-//////////////////////////////////////////////////////////////////////////////////
-
-class IPACM_Header
-{
-private:
-	int m_fd;
-public:
-	bool AddHeader(struct ipa_ioc_add_hdr   *pHeaderTable);
-	bool DeleteHeader(struct ipa_ioc_del_hdr *pHeaderTable);
-	bool GetHeaderHandle(struct ipa_ioc_get_hdr *pHeaderStruct);
-	bool CopyHeader(struct ipa_ioc_copy_hdr *pCopyHeaderStruct);
-	bool Commit();
-	bool Reset();
-	bool DeleteHeaderHdl(uint32_t hdr_hdl);
-	bool AddHeaderProcCtx(struct ipa_ioc_add_hdr_proc_ctx* pHeader);
-	bool DeleteHeaderProcCtx(uint32_t hdl);
-
-	IPACM_Header();
-	~IPACM_Header();
-	bool DeviceNodeIsOpened();
-};
-
-
-#endif
-
-
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
deleted file mode 100644
index 43b0da6..0000000
--- a/ipacm/inc/IPACM_Iface.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-		@file
-		IPACM_iface.h
-
-		@brief
-		This file implements the basis Iface definitions.
-
-		@Author
-		Skylar Chang
-
-*/
-#ifndef IPACM_IFACE_H
-#define IPACM_IFACE_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-#include <linux/msm_ipa.h>
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include "IPACM_Header.h"
-#include "IPACM_EvtDispatcher.h"
-#include "IPACM_Xml.h"
-#include "IPACM_Log.h"
-#include "IPACM_Config.h"
-#include "IPACM_Defs.h"
-#include <string.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
-
-#ifdef FEATURE_IPA_ANDROID
-#define IPV6_DEFAULT_FILTERTING_RULES 6
-#else
-#define IPV6_DEFAULT_FILTERTING_RULES 3
-#endif
-
-#define IPV6_DEFAULT_LAN_FILTERTING_RULES 1
-#define IPV6_NUM_ADDR 3
-#define MAX_SOFTWAREROUTING_FILTERTING_RULES 2
-#define INVALID_IFACE -1
-
-/* iface */
-class IPACM_Iface :public IPACM_Listener
-{
-public:
-
-	/* Static class for reading IPACM configuration from XML file*/
-	static IPACM_Config *ipacmcfg;
-
-	/* IPACM interface id */
-	int ipa_if_num;
-
-	/* IPACM interface category */
-	ipacm_iface_type ipa_if_cate;
-
-	/* IPACM interface name */
-	char dev_name[IF_NAME_LEN];
-
-	/* IPACM interface iptype v4, v6 or both */
-	ipa_ip_type ip_type;
-
-	/* IPACM interface v6 ip-address*/
-	uint32_t ipv6_addr[MAX_DEFAULT_v6_ROUTE_RULES][4];
-
-	uint32_t software_routing_fl_rule_hdl[MAX_SOFTWAREROUTING_FILTERTING_RULES];
-
-	bool softwarerouting_act;
-
-	/* IPACM number of default route rules for ipv6*/
-	int num_dft_rt_v6;
-
-	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];
-	/* create additional set of v6 RT-rules in Wanv6RT table*/
-	uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+2*MAX_DEFAULT_v6_ROUTE_RULES];
-
-	ipa_ioc_query_intf *iface_query;
-	ipa_ioc_query_intf_tx_props *tx_prop;
-	ipa_ioc_query_intf_rx_props *rx_prop;
-
-	virtual int handle_down_evt() = 0;
-
-	virtual int handle_addr_evt(ipacm_event_data_addr *data) = 0;
-
-	IPACM_Iface(int iface_index);
-
-	virtual void event_callback(ipa_cm_event_id event,
-															void *data) = 0;
-
-	/* Query ipa_interface_index by given linux interface_index */
-	static int iface_ipa_index_query(int interface_index);
-
-	/* Query ipa_interface ipv4_addr by given linux interface_index */
-	static void iface_addr_query(int interface_index);
-
-	/*Query the IPA endpoint property */
-	int query_iface_property(void);
-
-	/*Configure the initial filter rules */
-	virtual int init_fl_rule(ipa_ip_type iptype);
-
-	/* Change IP Type.*/
-	void config_ip_type(ipa_ip_type iptype);
-
-	/* Get interface index */
-	virtual int ipa_get_if_index(char * if_name, int * if_index);
-
-	static IPACM_Routing m_routing;
-	static IPACM_Filtering m_filtering;
-	static IPACM_Header m_header;
-
-	/* software routing enable */
-	virtual int handle_software_routing_enable(void);
-
-	/* software routing disable */
-	virtual int handle_software_routing_disable(void);
-
-private:
-
-	static const char *DEVICE_NAME;
-};
-
-#endif /* IPACM_IFACE_H */
diff --git a/ipacm/inc/IPACM_IfaceManager.h b/ipacm/inc/IPACM_IfaceManager.h
deleted file mode 100644
index c7184f2..0000000
--- a/ipacm/inc/IPACM_IfaceManager.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_IfaceManager.h
-
-	@brief
-	This file implements the IPAM iface_manager definitions
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_IFACEMANAGER_H
-#define IPACM_IFACEMANAGER_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include "IPACM_Listener.h"
-#include "IPACM_Iface.h"
-
-#define IPA_INSTANCE_NOT_FOUND  0
-#define IPA_INSTANCE_FOUND  1
-
-/* queue */
-typedef struct _iface_instances
-{
-    /* Linux interface id */
-	int ipa_if_index;
-	IPACM_Listener *obj;
-	_iface_instances *next;
-}  iface_instances;
-
-
-class IPACM_IfaceManager : public IPACM_Listener
-{
-
-public:
-
-  IPACM_IfaceManager();
-
-  void event_callback(ipa_cm_event_id event,
-                      void *data);
-
-  /* api for all iface instances to de-register instances */
-  static int deregistr(IPACM_Listener *param);
-
-
-private:
-	int create_iface_instance(ipacm_ifacemgr_data *);
-
-    /* api to register instances */
-	int registr(int ipa_if_index, IPACM_Listener *obj);
-
-	int SearchInstance(int ipa_if_index);
-
-	static iface_instances *head;
-
-};
-
-#endif /* IPACM_IFACEMANAGER_H */
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
deleted file mode 100644
index 6c54f5e..0000000
--- a/ipacm/inc/IPACM_Lan.h
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Lan.h
-
-	@brief
-	This file implements the LAN iface definitions
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_LAN_H
-#define IPACM_LAN_H
-
-#include <stdio.h>
-#include <linux/msm_ipa.h>
-
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Iface.h"
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include "IPACM_Config.h"
-#include "IPACM_Conntrack_NATApp.h"
-
-#define IPA_WAN_DEFAULT_FILTER_RULE_HANDLES  1
-#define IPA_PRIV_SUBNET_FILTER_RULE_HANDLES  3
-#define IPA_NUM_ODU_ROUTE_RULES 2
-#define MAX_WAN_UL_FILTER_RULES MAX_NUM_EXT_PROPS
-#define NUM_IPV4_ICMP_FLT_RULE 1
-#define NUM_IPV6_ICMP_FLT_RULE 1
-
-/* ndc bandwidth ipatetherstats <ifaceIn> <ifaceOut> */
-/* <in->out_bytes> <in->out_pkts> <out->in_bytes> <out->in_pkts */
-
-#define PIPE_STATS "%s %s %lu %lu %lu %lu"
-#define IPA_PIPE_STATS_FILE_NAME "/data/misc/ipa/tether_stats"
-
-/* store each lan-iface unicast routing rule and its handler*/
-struct ipa_lan_rt_rule
-{
-	ipa_ip_type ip;
-	uint32_t v4_addr;
-	uint32_t v4_addr_mask;
-	uint32_t v6_addr[4];
-	uint32_t rt_rule_hdl[0];
-};
-
-/* Support multiple eth client */
-typedef struct _eth_client_rt_hdl
-{
-	uint32_t eth_rt_rule_hdl_v4;
-	uint32_t eth_rt_rule_hdl_v6[IPV6_NUM_ADDR];
-	uint32_t eth_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR];
-}eth_client_rt_hdl;
-
-typedef struct _ipa_eth_client
-{
-	uint8_t mac[IPA_MAC_ADDR_SIZE];
-	uint32_t v4_addr;
-	uint32_t v6_addr[IPV6_NUM_ADDR][4];
-	uint32_t hdr_hdl_v4;
-	uint32_t hdr_hdl_v6;
-	bool route_rule_set_v4;
-	int route_rule_set_v6;
-	bool ipv4_set;
-	int ipv6_set;
-	bool ipv4_header_set;
-	bool ipv6_header_set;
-	eth_client_rt_hdl eth_rt_hdl[0]; /* depends on number of tx properties */
-}ipa_eth_client;
-
-
-/* lan iface */
-class IPACM_Lan : public IPACM_Iface
-{
-public:
-
-	IPACM_Lan(int iface_index);
-	~IPACM_Lan();
-
-	/* store lan's wan-up filter rule handlers */
-	uint32_t lan_wan_fl_rule_hdl[IPA_WAN_DEFAULT_FILTER_RULE_HANDLES];
-
-	/* store private-subnet filter rule handlers */
-	uint32_t private_fl_rule_hdl[IPA_MAX_PRIVATE_SUBNET_ENTRIES];
-
-	/* LAN-iface's callback function */
-	void event_callback(ipa_cm_event_id event, void *data);
-
-	virtual int handle_wan_up(ipa_ip_type ip_type);
-
-	/* configure filter rule for wan_up event*/
-	virtual int handle_wan_up_ex(ipacm_ext_prop* ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id);
-
-	/* delete filter rule for wan_down event*/
-	virtual int handle_wan_down(bool is_sta_mode);
-
-	/* delete filter rule for wan_down event*/
-	virtual int handle_wan_down_v6(bool is_sta_mode);
-
-	/* configure private subnet filter rules*/
-	virtual int handle_private_subnet(ipa_ip_type iptype);
-
-	/* handle new_address event*/
-	int handle_addr_evt(ipacm_event_data_addr *data);
-
-	int handle_addr_evt_odu_bridge(ipacm_event_data_addr* data);
-
-	int handle_del_ipv6_addr(ipacm_event_data_all *data);
-
-	static bool odu_up;
-
-	/* install UL filter rule from Q6 */
-	virtual int handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype, uint8_t xlat_mux_id);
-
-	int handle_cradle_wan_mode_switch(bool is_wan_bridge_mode);
-
-	int install_ipv4_icmp_flt_rule();
-
-
-	/* add header processing context and return handle to lan2lan controller */
-	int eth_bridge_add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_hdr_type, uint32_t *hdl);
-
-	/* add routing rule and return handle to lan2lan controller */
-	int eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl,
-		ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count);
-
-	/* modify routing rule*/
-	int eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl,
-		ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int rt_rule_count);
-
-	/* add filtering rule and return handle to lan2lan controller */
-	int eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip_type iptype, uint32_t *flt_rule_hdl);
-
-	/* delete filtering rule */
-	int eth_bridge_del_flt_rule(uint32_t flt_rule_hdl, ipa_ip_type iptype);
-
-	/* delete routing rule */
-	int eth_bridge_del_rt_rule(uint32_t rt_rule_hdl, ipa_ip_type iptype);
-
-	/* delete header processing context */
-	int eth_bridge_del_hdr_proc_ctx(uint32_t hdr_proc_ctx_hdl);
-
-
-
-protected:
-
-	int each_client_rt_rule_count[IPA_IP_MAX];
-
-	uint32_t eth_bridge_flt_rule_offset[IPA_IP_MAX];
-
-	/* mac address has to be provided for client related events */
-	void eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, uint8_t *mac);
-
-
-
-	virtual int add_dummy_private_subnet_flt_rule(ipa_ip_type iptype);
-
-	int handle_private_subnet_android(ipa_ip_type iptype);
-
-	int reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl);
-
-	virtual int install_ipv6_prefix_flt_rule(uint32_t* prefix);
-
-	virtual void delete_ipv6_prefix_flt_rule();
-
-	int install_ipv6_icmp_flt_rule();
-
-	void post_del_self_evt();
-
-	/* handle tethering stats */
-	int handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data);
-
-	/* handle tethering client */
-	int handle_tethering_client(bool reset, ipacm_client_enum ipa_client);
-
-	/* store ipv4 UL filter rule handlers from Q6*/
-	uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES];
-
-	/* store ipv6 UL filter rule handlers from Q6*/
-	uint32_t wan_ul_fl_rule_hdl_v6[MAX_WAN_UL_FILTER_RULES];
-
-	uint32_t ipv4_icmp_flt_rule_hdl[NUM_IPV4_ICMP_FLT_RULE];
-
-	uint32_t ipv6_prefix_flt_rule_hdl[NUM_IPV6_PREFIX_FLT_RULE];
-	uint32_t ipv6_icmp_flt_rule_hdl[NUM_IPV6_ICMP_FLT_RULE];
-
-	int num_wan_ul_fl_rule_v4;
-	int num_wan_ul_fl_rule_v6;
-
-	bool is_active;
-	bool modem_ul_v4_set;
-	bool modem_ul_v6_set;
-
-	uint32_t if_ipv4_subnet;
-
-	uint32_t ipv6_prefix[2];
-
-private:
-
-	/* get hdr proc ctx type given source and destination l2 hdr type */
-	ipa_hdr_proc_type eth_bridge_get_hdr_proc_type(ipa_hdr_l2_type t1, ipa_hdr_l2_type t2);
-
-	/* get partial header (header template of hdr proc ctx) */
-	int eth_bridge_get_hdr_template_hdl(uint32_t* hdr_hdl);
-
-
-	/* dynamically allocate lan iface's unicast routing rule structure */
-
-	bool is_mode_switch; /* indicate mode switch, need post internal up event */
-
-	int eth_client_len;
-
-	ipa_eth_client *eth_client;
-
-	int header_name_count;
-
-	int num_eth_client;
-
-	NatApp *Nat_App;
-
-	int ipv6_set;
-
-	uint32_t ODU_hdr_hdl_v4, ODU_hdr_hdl_v6;
-
-	uint32_t *odu_route_rule_v4_hdl;
-
-	uint32_t *odu_route_rule_v6_hdl;
-
-	bool ipv4_header_set;
-
-	bool ipv6_header_set;
-
-	inline ipa_eth_client* get_client_memptr(ipa_eth_client *param, int cnt)
-	{
-	    char *ret = ((char *)param) + (eth_client_len * cnt);
-		return (ipa_eth_client *)ret;
-	}
-
-	inline int get_eth_client_index(uint8_t *mac_addr)
-	{
-		int cnt;
-		int num_eth_client_tmp = num_eth_client;
-
-		IPACMDBG_H("Passed 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]);
-
-		for(cnt = 0; cnt < num_eth_client_tmp; cnt++)
-		{
-			IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 get_client_memptr(eth_client, cnt)->mac[0],
-							 get_client_memptr(eth_client, cnt)->mac[1],
-							 get_client_memptr(eth_client, cnt)->mac[2],
-							 get_client_memptr(eth_client, cnt)->mac[3],
-							 get_client_memptr(eth_client, cnt)->mac[4],
-							 get_client_memptr(eth_client, cnt)->mac[5]);
-
-			if(memcmp(get_client_memptr(eth_client, cnt)->mac,
-								mac_addr,
-								sizeof(get_client_memptr(eth_client, cnt)->mac)) == 0)
-			{
-				IPACMDBG_H("Matched client index: %d\n", cnt);
-				return cnt;
-			}
-		}
-
-		return IPACM_INVALID_INDEX;
-	}
-
-	inline int delete_eth_rtrules(int clt_indx, ipa_ip_type iptype)
-	{
-		uint32_t tx_index;
-		uint32_t rt_hdl;
-		int num_v6;
-
-		if(iptype == IPA_IP_v4)
-		{
-		    for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		    {
-		        if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
-				{
-					IPACMDBG_H("Delete client index %d ipv4 RT-rules for tx:%d\n",clt_indx,tx_index);
-					rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4;
-
-					if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
-					{
-						return IPACM_FAILURE;
-					}
-				}
-		    } /* end of for loop */
-
-		     /* clean the ipv4 RT rules for eth-client:clt_indx */
-		     if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */
-		     {
-				get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false;
-		     }
-		}
-
-		if(iptype == IPA_IP_v6)
-		{
-			for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-			{
-				if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */
-				{
-					for(num_v6 =0;num_v6 < get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++)
-					{
-						IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index);
-						rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6];
-						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-							{
-								return IPACM_FAILURE;
-							}
-
-							rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6];
-							if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-							{
-								return IPACM_FAILURE;
-							}
-						}
-                    }
-		    } /* end of for loop */
-
-		    /* clean the ipv6 RT rules for eth-client:clt_indx */
-		    if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */
-		    {
-		        get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0;
-            }
-		}
-
-		return IPACM_SUCCESS;
-	}
-
-	/* handle eth client initial, construct full headers (tx property) */
-	int handle_eth_hdr_init(uint8_t *mac_addr);
-
-	/* handle eth client ip-address */
-	int handle_eth_client_ipaddr(ipacm_event_data_all *data);
-
-	/* handle eth client routing rule*/
-	int handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype);
-
-	/*handle eth client del mode*/
-	int handle_eth_client_down_evt(uint8_t *mac_addr);
-
-	/* handle odu client initial, construct full headers (tx property) */
-	int handle_odu_hdr_init(uint8_t *mac_addr);
-
-	/* handle odu default route rule configuration */
-	int handle_odu_route_add();
-
-	/* handle odu default route rule deletion */
-	int handle_odu_route_del();
-
-	/*handle lan iface down event*/
-	int handle_down_evt();
-
-	/*handle reset usb-client rt-rules */
-	int handle_lan_client_reset_rt(ipa_ip_type iptype);
-};
-
-#endif /* IPACM_LAN_H */
diff --git a/ipacm/inc/IPACM_LanToLan.h b/ipacm/inc/IPACM_LanToLan.h
deleted file mode 100644
index a28631e..0000000
--- a/ipacm/inc/IPACM_LanToLan.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
-Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
- * IPACM_LanToLan.h
- *
- *  Created on: Mar 4th, 2014
- *      Author: Shihuan Liu
- */
-
-#ifndef IPACM_LANTOLAN_H
-#define IPACM_LANTOLAN_H
-
-#include <stdint.h>
-#include "linux/msm_ipa.h"
-#include "IPACM_Iface.h"
-#include "IPACM_Defs.h"
-#include "IPACM_Lan.h"
-
-#ifdef FEATURE_IPA_ANDROID
-#include <libxml/list.h>
-#else/* defined(FEATURE_IPA_ANDROID) */
-#include <list>
-#endif /* ndefined(FEATURE_IPA_ANDROID)*/
-
-#define MAX_NUM_CACHED_CLIENT_ADD_EVENT 10
-#define MAX_NUM_IFACE 10
-#define MAX_NUM_CLIENT 16
-
-struct rt_rule_info
-{
-	int num_hdl[IPA_IP_MAX];	/* one client may need more than one routing rules on the same routing table depending on tx_prop */
-	uint32_t  rule_hdl[IPA_IP_MAX][MAX_NUM_PROP];
-};
-
-struct client_info
-{
-	uint8_t mac_addr[6];
-	rt_rule_info inter_iface_rt_rule_hdl[IPA_HDR_L2_MAX];	/* routing rule handles of inter interface communication based on source l2 header type */
-	rt_rule_info intra_iface_rt_rule_hdl;	/* routing rule handles of inter interface communication */
-};
-
-struct flt_rule_info
-{
-	client_info *p_client;
-	uint32_t flt_rule_hdl[IPA_IP_MAX];
-};
-
-struct peer_iface_info
-{
-	class IPACM_LanToLan_Iface *peer;
-	char rt_tbl_name_for_rt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX];
-	char rt_tbl_name_for_flt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX];
-	list<flt_rule_info> flt_rule;
-};
-
-class IPACM_LanToLan_Iface
-{
-public:
-	IPACM_LanToLan_Iface(IPACM_Lan *p_iface);
-	~IPACM_LanToLan_Iface();
-
-	void add_client_rt_rule_for_new_iface();
-
-	void add_all_inter_interface_client_flt_rule(ipa_ip_type iptype);
-
-	void add_all_intra_interface_client_flt_rule(ipa_ip_type iptype);
-
-	void handle_down_event();
-
-	void handle_wlan_scc_mcc_switch();
-
-	void handle_intra_interface_info();
-
-	void handle_new_iface_up(char rt_tbl_name_for_flt[][IPA_RESOURCE_NAME_MAX], char rt_tbl_name_for_rt[][IPA_RESOURCE_NAME_MAX],
-		IPACM_LanToLan_Iface *peer_iface);
-
-	void handle_client_add(uint8_t *mac);
-
-	void handle_client_del(uint8_t *mac);
-
-	void print_data_structure_info();
-
-	IPACM_Lan* get_iface_pointer();
-
-	bool get_m_is_ip_addr_assigned(ipa_ip_type iptype);
-
-	void set_m_is_ip_addr_assigned(ipa_ip_type iptype, bool value);
-
-	bool get_m_support_inter_iface_offload();
-
-	bool get_m_support_intra_iface_offload();
-
-	void increment_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type);
-
-	void decrement_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type);
-
-private:
-
-	IPACM_Lan *m_p_iface;
-	bool m_is_ip_addr_assigned[IPA_IP_MAX];
-	bool m_support_inter_iface_offload;
-	bool m_support_intra_iface_offload;
-
-	int ref_cnt_peer_l2_hdr_type[IPA_HDR_L2_MAX];	/* reference count of l2 header type of peer interfaces */
-	uint32_t hdr_proc_ctx_for_inter_interface[IPA_HDR_L2_MAX];
-	uint32_t hdr_proc_ctx_for_intra_interface;
-
-	list<client_info> m_client_info;	/* client list */
-	list<peer_iface_info> m_peer_iface_info;	/* peer information list */
-
-	/* The following members are for intra-interface communication*/
-	peer_iface_info m_intra_interface_info;
-
-	void add_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client);
-
-	void add_client_flt_rule(peer_iface_info *peer, client_info *client, ipa_ip_type iptype);
-
-	void del_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client);
-
-	void del_client_flt_rule(peer_iface_info *peer, client_info *client);
-
-	void add_client_rt_rule(peer_iface_info *peer, client_info *client);
-
-	void del_client_rt_rule(peer_iface_info *peer, client_info *client);
-
-	void clear_all_flt_rule_for_one_peer_iface(peer_iface_info *peer);
-
-	void clear_all_rt_rule_for_one_peer_iface(peer_iface_info *peer);
-
-	void add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type);
-
-	void del_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type);
-
-	void print_peer_info(peer_iface_info *peer_info);
-
-};
-
-class IPACM_LanToLan : public IPACM_Listener
-{
-
-public:
-
-	IPACM_LanToLan();
-
-private:
-
-	~IPACM_LanToLan();
-
-	list<class IPACM_LanToLan_Iface> m_iface;
-
-	list<ipacm_event_eth_bridge> m_cached_client_add_event;
-
-	void handle_iface_up(ipacm_event_eth_bridge *data);
-
-	void handle_iface_down(ipacm_event_eth_bridge *data);
-
-	void handle_client_add(ipacm_event_eth_bridge *data);
-
-	void handle_client_del(ipacm_event_eth_bridge *data);
-
-	void handle_wlan_scc_mcc_switch(ipacm_event_eth_bridge *data);
-
-	void handle_new_iface_up(IPACM_LanToLan_Iface *new_iface, IPACM_LanToLan_Iface *exist_iface);
-
-	void event_callback(ipa_cm_event_id event, void* param);
-
-	void handle_cached_client_add_event(IPACM_Lan *p_iface);
-
-	void clear_cached_client_add_event(IPACM_Lan *p_iface);
-
-	void print_data_structure_info();
-
-};
-
-#endif
diff --git a/ipacm/inc/IPACM_Listener.h b/ipacm/inc/IPACM_Listener.h
deleted file mode 100644
index 9d774fe..0000000
--- a/ipacm/inc/IPACM_Listener.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Listener.h
-
-	@brief
-	This file implements the abstract class notifier.
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_LISTENER_H
-#define IPACM_LISTENER_H
-
-#include "IPACM_Defs.h"
-#include "IPACM_CmdQueue.h"
-
-/* abstract class notifier */
-class IPACM_Listener
-{
-public:
-	virtual void event_callback(ipa_cm_event_id event,															void *data) = 0;
-	virtual ~IPACM_Listener(void) {};
-};
-
-#endif /* IPACM_LISTENER_H */
diff --git a/ipacm/inc/IPACM_Log.h b/ipacm/inc/IPACM_Log.h
deleted file mode 100644
index dab0280..0000000
--- a/ipacm/inc/IPACM_Log.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_log.h
-
-	@brief
-	This file implements the IPAM log functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-
-#ifndef IPACM_LOG_H
-#define IPACM_LOG_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-
-#define MAX_BUF_LEN 256
-
-#ifdef FEATURE_IPA_ANDROID
-#define IPACMLOG_FILE "/dev/socket/ipacm_log_file"
-#else/* defined(FEATURE_IPA_ANDROID) */
-#define IPACMLOG_FILE "/etc/ipacm_log_file"
-#endif /* defined(NOT FEATURE_IPA_ANDROID)*/
-
-typedef struct ipacm_log_buffer_s {
-	char	user_data[MAX_BUF_LEN];
-} ipacm_log_buffer_t;
-
-void ipacm_log_send( void * user_data);
-
-static char buffer_send[MAX_BUF_LEN];
-static char dmesg_cmd[MAX_BUF_LEN];
-
-#define IPACMDBG_DMESG(fmt, ...) memset(buffer_send, 0, MAX_BUF_LEN);\
-								 snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s: " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);\
-								 ipacm_log_send (buffer_send);\
-								 printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__); \
-								 memset(dmesg_cmd, 0, MAX_BUF_LEN);\
-								 snprintf(dmesg_cmd, MAX_BUF_LEN, "echo %s > /dev/kmsg", buffer_send);\
-								 system(dmesg_cmd);
-#ifdef DEBUG
-#define PERROR(fmt)   memset(buffer_send, 0, MAX_BUF_LEN);\
-					  snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\
-					  ipacm_log_send (buffer_send); \
-                      perror(fmt);
-#define IPACMERR(fmt, ...)	memset(buffer_send, 0, MAX_BUF_LEN);\
-							snprintf(buffer_send,MAX_BUF_LEN,"ERROR: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);\
-							ipacm_log_send (buffer_send);\
-							printf("ERROR: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#define IPACMDBG_H(fmt, ...) memset(buffer_send, 0, MAX_BUF_LEN);\
-							 snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);\
-							 ipacm_log_send (buffer_send);\
-							 printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#else
-#define PERROR(fmt)   perror(fmt)
-#define IPACMERR(fmt, ...)   printf("ERR: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#define IPACMDBG_H(fmt, ...) printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#endif
-#define IPACMDBG(fmt, ...)	printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-#define IPACMLOG(fmt, ...)  printf(fmt, ##__VA_ARGS__);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* IPACM_LOG_H */
diff --git a/ipacm/inc/IPACM_Neighbor.h b/ipacm/inc/IPACM_Neighbor.h
deleted file mode 100644
index 14e86e5..0000000
--- a/ipacm/inc/IPACM_Neighbor.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Neighbor.h
-
-	@brief
-	This file implements the functionality of handling IPACM Neighbor events.
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_NEIGHBOR_H
-#define IPACM_NEIGHBOR_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-#include <linux/msm_ipa.h>
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include "IPACM_Listener.h"
-#include "IPACM_Iface.h"
-
-#define IPA_MAX_NUM_NEIGHBOR_CLIENTS  100
-
-struct ipa_neighbor_client
-{
-	uint8_t mac_addr[6];
-	int iface_index;
-	uint32_t v4_addr;
-	int ipa_if_num;
-};
-
-class IPACM_Neighbor : public IPACM_Listener
-{
-
-public:
-
-	IPACM_Neighbor();
-
-	void event_callback(ipa_cm_event_id event,
-											void *data);
-
-private:
-
-	int num_neighbor_client;
-
-	int circular_index;
-
-	ipa_neighbor_client neighbor_client[IPA_MAX_NUM_NEIGHBOR_CLIENTS];
-
-};
-
-#endif /* IPACM_NEIGHBOR_H */
diff --git a/ipacm/inc/IPACM_Netlink.h b/ipacm/inc/IPACM_Netlink.h
deleted file mode 100644
index b0bdeb8..0000000
--- a/ipacm/inc/IPACM_Netlink.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPA_Netlink.h
-
-	@brief
-	IPACM Netlink Messaging Implementation File
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_NETLINK_H
-#define IPACM_NETLINK_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <pthread.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <linux/if.h>
-#include <linux/if_addr.h>
-#include <linux/rtnetlink.h>
-#include <linux/netlink.h>
-#include <netinet/in.h>
-#include "IPACM_Defs.h"
-
-#define MAX_NUM_OF_FD 10
-#define IPA_NL_MSG_MAX_LEN (2048)
-
-/*--------------------------------------------------------------------------- 
-	 Type representing enumeration of NetLink event indication messages
----------------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------------- 
-	 Types representing parsed NetLink message
----------------------------------------------------------------------------*/
-#define IPA_NLA_PARAM_NONE        (0x0000)
-#define IPA_NLA_PARAM_PREFIXADDR  (0x0001)
-#define IPA_NLA_PARAM_LOCALADDR   (0x0002)
-#define IPA_NLA_PARAM_LABELNAME   (0x0004)
-#define IPA_NLA_PARAM_BCASTADDR   (0x0008)
-#define IPA_NLA_PARAM_ACASTADDR   (0x0010)
-#define IPA_NLA_PARAM_MCASTADDR   (0x0020)
-#define IPA_NLA_PARAM_CACHEINFO   (0x0080)
-#define IPA_NLA_PARAM_PROTOINFO   (0x0100)
-#define IPA_NLA_PARAM_FLAGS       (0x0200)
-
-#define IPA_RTA_PARAM_NONE        (0x0000)
-#define IPA_RTA_PARAM_DST         (0x0001)
-#define IPA_RTA_PARAM_SRC         (0x0002)
-#define IPA_RTA_PARAM_GATEWAY     (0x0004)
-#define IPA_RTA_PARAM_IIF         (0x0008)
-#define IPA_RTA_PARAM_OIF         (0x0010)
-#define IPA_RTA_PARAM_CACHEINFO   (0x0020)
-#define IPA_RTA_PARAM_PRIORITY    (0x0080)
-#define IPA_RTA_PARAM_METRICS     (0x0100)
-
-
-/*--------------------------------------------------------------------------- 
-	 Type representing function callback registered with a socket listener 
-	 thread for reading from a socket on receipt of an incoming message
----------------------------------------------------------------------------*/
-typedef int (*ipa_sock_thrd_fd_read_f)(int fd);
-
-typedef enum
-{
-	IPA_INIT = 0,
-	IPA_LINK_UP_WAIT,
-	IPA_LINK_UP,
-	IPA_LINK_DOWN_WAIT,
-	IPA_LINK_DOWN
-} ipa_nl_state_e;
-
-typedef struct
-{
-	int sk_fd;
-	ipa_sock_thrd_fd_read_f read_func;
-} ipa_nl_sk_fd_map_info_t;
-
-typedef struct
-{
-	ipa_nl_sk_fd_map_info_t sk_fds[MAX_NUM_OF_FD];
-	fd_set fdset;
-	int num_fd;
-	int max_fd;
-} ipa_nl_sk_fd_set_info_t;
-
-typedef struct
-{
-	int                 sk_fd;       /* socket descriptor */
-	struct sockaddr_nl  sk_addr_loc; /* local address of socket */
-} ipa_nl_sk_info_t;
-
-typedef struct ipa_nl_addr_s {
-	struct sockaddr_storage        ip_addr;
-	unsigned int                   mask;
-} ipa_nl_addr_t;
-
-typedef struct ipa_nl_proto_info_s {
-	unsigned int                    param_mask;
-	unsigned int                    flags;
-	struct ifla_cacheinfo           cache_info;
-} ipa_nl_proto_info_t;
-
-typedef struct
-{
-	struct ifinfomsg  metainfo;                   /* from header */
-} ipa_nl_link_info_t;
-
-
-
-typedef struct ipa_nl_addr_info_s {
-	struct ifaddrmsg                metainfo;     /* from header */
-	struct                                      /* attributes  */
-	{
-		unsigned int                  param_mask;
-		unsigned char                 label_name[IF_NAME_LEN];
-		struct sockaddr_storage       prefix_addr;
-		struct sockaddr_storage       local_addr;
-		struct sockaddr_storage       bcast_addr;
-		struct sockaddr_storage       acast_addr;
-		struct sockaddr_storage       mcast_addr;
-	} attr_info;
-} ipa_nl_addr_info_t;
-
-
-typedef struct ipa_nl_neigh_info_s {
-	struct ndmsg                metainfo;     /* from header */
-	struct                                  /* attributes  */
-	{
-		unsigned int                param_mask;
-		struct sockaddr_storage     local_addr;
-		struct  sockaddr            lladdr_hwaddr;
-	} attr_info;
-} ipa_nl_neigh_info_t;
-
-
-
-typedef struct ipa_nl_route_info_s {
-	struct rtmsg                    metainfo;     /* from header */
-	struct                                      /* attributes  */
-	{
-		unsigned int                  param_mask;
-		struct sockaddr_storage       dst_addr;
-		struct sockaddr_storage       src_addr;
-		struct sockaddr_storage       gateway_addr;
-		struct sockaddr_storage       mark_addr;
-		struct rta_cacheinfo          cache_info;
-		__u32		iif_index;                      /* Link index  */
-		__u32		oif_index;                      /* Link index  */
-		__u32       priority;
-		__u32       metrics;
-		ipa_nl_proto_info_t        proto_info;
-	} attr_info;
-} ipa_nl_route_info_t;
-
-#define IPA_FLOW_TYPE_INVALID      (-1)
-
-typedef struct
-{
-	unsigned int type;
-	bool link_event;
-	/* Optional parameters */
-	ipa_nl_link_info_t      nl_link_info;
-	ipa_nl_addr_info_t      nl_addr_info;
-	ipa_nl_neigh_info_t      nl_neigh_info;
-	ipa_nl_route_info_t      nl_route_info;
-} ipa_nl_msg_t;
-
-/* Initialization routine for listener on NetLink sockets interface */
-int ipa_nl_listener_init
-(
-	 unsigned int nl_type,
-	 unsigned int nl_groups,
-	 ipa_nl_sk_fd_set_info_t *sk_fdset,
-	 ipa_sock_thrd_fd_read_f read_f
-	 );
-
-/*  Virtual function registered to receive incoming messages over the NETLINK routing socket*/
-int ipa_nl_recv_msg(int fd);
-
-/* map mask value for ipv6 */
-int mask_v6(int index, uint32_t *mask);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* IPACM_NETLINK_H */
diff --git a/ipacm/inc/IPACM_Routing.h b/ipacm/inc/IPACM_Routing.h
deleted file mode 100644
index b5ffabc..0000000
--- a/ipacm/inc/IPACM_Routing.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Routing.cpp
-
-	@brief
-	This file implements the IPACM routing functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-
-
-#ifndef IPACM_ROUTING_H
-#define IPACM_ROUTING_H
-
-#include <stdint.h>
-#include <linux/msm_ipa.h>
-#include <IPACM_Defs.h>
-
-using namespace std;
-
-class IPACM_Routing
-{
-public:
-	IPACM_Routing();
-	~IPACM_Routing();
-
-	bool AddRoutingRule(struct ipa_ioc_add_rt_rule *ruleTable);
-	bool DeleteRoutingRule(struct ipa_ioc_del_rt_rule *ruleTable);
-
-	bool Commit(enum ipa_ip_type ip);
-	bool Reset(enum ipa_ip_type ip);
-
-	bool GetRoutingTable(struct ipa_ioc_get_rt_tbl *routingTable);
-
-	bool DeviceNodeIsOpened();
-	bool DeleteRoutingHdl(uint32_t rt_rule_hdl, ipa_ip_type ip);
-
-	bool ModifyRoutingRule(struct ipa_ioc_mdfy_rt_rule *);
-
-private:
-	static const char *DEVICE_NAME;
-	int m_fd; /* File descriptor of the IPA device node /dev/ipa */
-
-	bool PutRoutingTable(uint32_t routingTableHandle);
-};
-
-#endif //IPACM_ROUTING_H
-
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
deleted file mode 100644
index fe6d35e..0000000
--- a/ipacm/inc/IPACM_Wan.h
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Wan.cpp
-
-	@brief
-	This file implements the WAN iface functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#ifndef IPACM_WAN_H
-#define IPACM_WAN_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-#include <linux/msm_ipa.h>
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include <IPACM_Iface.h>
-#include <IPACM_Defs.h>
-#include <IPACM_Xml.h>
-
-#define IPA_NUM_DEFAULT_WAN_FILTER_RULES 3 /*1 for v4, 2 for v6*/
-#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4 2
-
-#ifdef FEATURE_IPA_ANDROID
-#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 6
-#else
-#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 3
-#endif
-
-#define NETWORK_STATS "%s %lu %lu %lu %lu"
-#define IPA_NETWORK_STATS_FILE_NAME "/data/misc/ipa/network_stats"
-
-typedef struct _wan_client_rt_hdl
-{
-	uint32_t wan_rt_rule_hdl_v4;
-	uint32_t wan_rt_rule_hdl_v6[IPV6_NUM_ADDR];
-	uint32_t wan_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR];
-}wan_client_rt_hdl;
-
-typedef struct _ipa_wan_client
-{
-	ipacm_event_data_wlan_ex* p_hdr_info;
-	uint8_t mac[IPA_MAC_ADDR_SIZE];
-	uint32_t v4_addr;
-	uint32_t v6_addr[IPV6_NUM_ADDR][4];
-	uint32_t hdr_hdl_v4;
-	uint32_t hdr_hdl_v6;
-	bool route_rule_set_v4;
-	int route_rule_set_v6;
-	bool ipv4_set;
-	int ipv6_set;
-	bool ipv4_header_set;
-	bool ipv6_header_set;
-	bool power_save_set;
-	wan_client_rt_hdl wan_rt_hdl[0]; /* depends on number of tx properties */
-}ipa_wan_client;
-
-/* wan iface */
-class IPACM_Wan : public IPACM_Iface
-{
-
-public:
-
-	static bool wan_up;
-	static bool wan_up_v6;
-	static uint8_t xlat_mux_id;
-	/* IPACM interface name */
-	static char wan_up_dev_name[IF_NAME_LEN];
-	static uint32_t curr_wan_ip;
-	IPACM_Wan(int, ipacm_wan_iface_type, uint8_t *);
-	virtual ~IPACM_Wan();
-
-	static bool isWanUP(int ipa_if_num_tether)
-	{
-#ifdef FEATURE_IPA_ANDROID
-		int i;
-		for (i=0; i < ipa_if_num_tether_v4_total;i++)
-		{
-			if (ipa_if_num_tether_v4[i] == ipa_if_num_tether)
-			{
-				IPACMDBG_H("support ipv4 tether_iface(%s)\n",
-					IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
-				return wan_up;
-				break;
-			}
-		}
-		return false;
-#else
-		return wan_up;
-#endif
-	}
-
-	static bool isWanUP_V6(int ipa_if_num_tether)
-	{
-#ifdef FEATURE_IPA_ANDROID
-		int i;
-		for (i=0; i < ipa_if_num_tether_v6_total;i++)
-		{
-			if (ipa_if_num_tether_v6[i] == ipa_if_num_tether)
-			{
-				IPACMDBG_H("support ipv6 tether_iface(%s)\n",
-					IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
-				return wan_up_v6;
-				break;
-			}
-		}
-		return false;
-#else
-		return wan_up_v6;
-#endif
-	}
-
-	static uint32_t getWANIP()
-	{
-		return curr_wan_ip;
-	}
-
-	static bool getXlat_Mux_Id()
-	{
-		return xlat_mux_id;
-	}
-
-	void event_callback(ipa_cm_event_id event,
-											void *data);
-
-	static struct ipa_flt_rule_add flt_rule_v4[IPA_MAX_FLT_RULE];
-	static struct ipa_flt_rule_add flt_rule_v6[IPA_MAX_FLT_RULE];
-
-	static int num_v4_flt_rule;
-	static int num_v6_flt_rule;
-
-	ipacm_wan_iface_type m_is_sta_mode;
-	static bool backhaul_is_sta_mode;
-	static bool is_ext_prop_set;
-	static uint32_t backhaul_ipv6_prefix[2];
-
-	static bool embms_is_on;
-	static bool backhaul_is_wan_bridge;
-
-	static bool isWan_Bridge_Mode()
-	{
-		return backhaul_is_wan_bridge;
-	}
-#ifdef FEATURE_IPA_ANDROID
-	/* IPACM interface id */
-	static int ipa_if_num_tether_v4_total;
-	static int ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES];
-	static int ipa_if_num_tether_v6_total;
-	static int ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES];
-#endif
-
-private:
-
-	bool is_ipv6_frag_firewall_flt_rule_installed;
-	uint32_t ipv6_frag_firewall_flt_rule_hdl;
-	uint32_t *wan_route_rule_v4_hdl;
-	uint32_t *wan_route_rule_v6_hdl;
-	uint32_t *wan_route_rule_v6_hdl_a5;
-	uint32_t hdr_hdl_sta_v4;
-	uint32_t hdr_hdl_sta_v6;
-	uint32_t firewall_hdl_v4[IPACM_MAX_FIREWALL_ENTRIES];
-	uint32_t firewall_hdl_v6[IPACM_MAX_FIREWALL_ENTRIES];
-	uint32_t dft_wan_fl_hdl[IPA_NUM_DEFAULT_WAN_FILTER_RULES];
-	uint32_t ipv6_dest_flt_rule_hdl[MAX_DEFAULT_v6_ROUTE_RULES];
-	int num_ipv6_dest_flt_rule;
-	uint32_t ODU_fl_hdl[IPA_NUM_DEFAULT_WAN_FILTER_RULES];
-	int num_firewall_v4,num_firewall_v6;
-	uint32_t wan_v4_addr;
-	uint32_t wan_v4_addr_gw;
-	uint32_t wan_v6_addr_gw[4];
-	bool wan_v4_addr_set;
-	bool wan_v4_addr_gw_set;
-	bool wan_v6_addr_gw_set;
-	bool active_v4;
-	bool active_v6;
-	bool header_set_v4;
-	bool header_set_v6;
-	bool header_partial_default_wan_v4;
-	bool header_partial_default_wan_v6;
-	uint8_t ext_router_mac_addr[IPA_MAC_ADDR_SIZE];
-	uint8_t netdev_mac[IPA_MAC_ADDR_SIZE];
-
-	static int num_ipv4_modem_pdn;
-
-	static int num_ipv6_modem_pdn;
-
-	int modem_ipv4_pdn_index;
-
-	int modem_ipv6_pdn_index;
-
-	bool is_default_gateway;
-
-	uint32_t ipv6_prefix[2];
-
-	/* IPACM firewall Configuration file*/
-	IPACM_firewall_conf_t firewall_config;
-
-	/* STA mode wan-client*/
-	int wan_client_len;
-	ipa_wan_client *wan_client;
-	int header_name_count;
-	int num_wan_client;
-	uint8_t invalid_mac[IPA_MAC_ADDR_SIZE];
-	bool is_xlat;
-
-	/* update network stats for CNE */
-	int ipa_network_stats_fd;
-	uint32_t hdr_hdl_dummy_v6;
-	uint32_t hdr_proc_hdl_dummy_v6;
-
-	inline ipa_wan_client* get_client_memptr(ipa_wan_client *param, int cnt)
-	{
-	    char *ret = ((char *)param) + (wan_client_len * cnt);
-		return (ipa_wan_client *)ret;
-	}
-
-	inline int get_wan_client_index(uint8_t *mac_addr)
-	{
-		int cnt;
-		int num_wan_client_tmp = num_wan_client;
-
-		IPACMDBG_H("Passed 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]);
-
-		for(cnt = 0; cnt < num_wan_client_tmp; cnt++)
-		{
-			IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 get_client_memptr(wan_client, cnt)->mac[0],
-							 get_client_memptr(wan_client, cnt)->mac[1],
-							 get_client_memptr(wan_client, cnt)->mac[2],
-							 get_client_memptr(wan_client, cnt)->mac[3],
-							 get_client_memptr(wan_client, cnt)->mac[4],
-							 get_client_memptr(wan_client, cnt)->mac[5]);
-
-			if(memcmp(get_client_memptr(wan_client, cnt)->mac,
-								mac_addr,
-								sizeof(get_client_memptr(wan_client, cnt)->mac)) == 0)
-			{
-				IPACMDBG_H("Matched client index: %d\n", cnt);
-				return cnt;
-			}
-		}
-
-		return IPACM_INVALID_INDEX;
-	}
-
-	inline int get_wan_client_index_ipv4(uint32_t ipv4_addr)
-	{
-		int cnt;
-		int num_wan_client_tmp = num_wan_client;
-
-		IPACMDBG_H("Passed IPv4 %x\n", ipv4_addr);
-
-		for(cnt = 0; cnt < num_wan_client_tmp; cnt++)
-		{
-			if (get_client_memptr(wan_client, cnt)->ipv4_set)
-			{
-				IPACMDBG_H("stored IPv4 %x\n", get_client_memptr(wan_client, cnt)->v4_addr);
-
-				if(ipv4_addr == get_client_memptr(wan_client, cnt)->v4_addr)
-				{
-					IPACMDBG_H("Matched client index: %d\n", cnt);
-					IPACMDBG_H("The MAC is %02x:%02x:%02x:%02x:%02x:%02x\n",
-							get_client_memptr(wan_client, cnt)->mac[0],
-							get_client_memptr(wan_client, cnt)->mac[1],
-							get_client_memptr(wan_client, cnt)->mac[2],
-							get_client_memptr(wan_client, cnt)->mac[3],
-							get_client_memptr(wan_client, cnt)->mac[4],
-							get_client_memptr(wan_client, cnt)->mac[5]);
-					IPACMDBG_H("header set ipv4(%d) ipv6(%d)\n",
-							get_client_memptr(wan_client, cnt)->ipv4_header_set,
-							get_client_memptr(wan_client, cnt)->ipv6_header_set);
-					return cnt;
-				}
-			}
-		}
-		return IPACM_INVALID_INDEX;
-	}
-
-	inline int get_wan_client_index_ipv6(uint32_t* ipv6_addr)
-	{
-		int cnt, v6_num;
-		int num_wan_client_tmp = num_wan_client;
-
-		IPACMDBG_H("Get ipv6 address 0x%08x.0x%08x.0x%08x.0x%08x\n", ipv6_addr[0], ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]);
-
-		for(cnt = 0; cnt < num_wan_client_tmp; cnt++)
-		{
-			if (get_client_memptr(wan_client, cnt)->ipv6_set)
-			{
-			    for(v6_num=0;v6_num < get_client_memptr(wan_client, cnt)->ipv6_set;v6_num++)
-	            {
-
-					IPACMDBG_H("stored IPv6 0x%08x.0x%08x.0x%08x.0x%08x\n", get_client_memptr(wan_client, cnt)->v6_addr[v6_num][0],
-						get_client_memptr(wan_client, cnt)->v6_addr[v6_num][1],
-						get_client_memptr(wan_client, cnt)->v6_addr[v6_num][2],
-						get_client_memptr(wan_client, cnt)->v6_addr[v6_num][3]);
-
-					if(ipv6_addr[0] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][0] &&
-					   ipv6_addr[1] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][1] &&
-					   ipv6_addr[2]== get_client_memptr(wan_client, cnt)->v6_addr[v6_num][2] &&
-					   ipv6_addr[3] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][3])
-					{
-						IPACMDBG_H("Matched client index: %d\n", cnt);
-						IPACMDBG_H("The MAC is %02x:%02x:%02x:%02x:%02x:%02x\n",
-								get_client_memptr(wan_client, cnt)->mac[0],
-								get_client_memptr(wan_client, cnt)->mac[1],
-								get_client_memptr(wan_client, cnt)->mac[2],
-								get_client_memptr(wan_client, cnt)->mac[3],
-								get_client_memptr(wan_client, cnt)->mac[4],
-								get_client_memptr(wan_client, cnt)->mac[5]);
-						IPACMDBG_H("header set ipv4(%d) ipv6(%d)\n",
-								get_client_memptr(wan_client, cnt)->ipv4_header_set,
-								get_client_memptr(wan_client, cnt)->ipv6_header_set);
-						return cnt;
-					}
-				}
-			}
-		}
-		return IPACM_INVALID_INDEX;
-	}
-
-	inline int delete_wan_rtrules(int clt_indx, ipa_ip_type iptype)
-	{
-		uint32_t tx_index;
-		uint32_t rt_hdl;
-		int num_v6;
-
-		if(iptype == IPA_IP_v4)
-		{
-		     for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		     {
-		        if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
-			{
-				IPACMDBG_H("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index);
-				rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4;
-
-				if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
-				{
-					return IPACM_FAILURE;
-				}
-			}
-		     } /* end of for loop */
-
-		     /* clean the 4 Qos ipv4 RT rules for client:clt_indx */
-		     if(get_client_memptr(wan_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */
-		     {
-				get_client_memptr(wan_client, clt_indx)->route_rule_set_v4 = false;
-		     }
-		}
-
-		if(iptype == IPA_IP_v6)
-		{
-		    for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		    {
-
-				if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */
-				{
-					for(num_v6 =0;num_v6 < get_client_memptr(wan_client, clt_indx)->route_rule_set_v6;num_v6++)
-					{
-						IPACMDBG_H("Delete client index %d ipv6 Qos rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index);
-						rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[num_v6];
-						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-						{
-							return IPACM_FAILURE;
-						}
-
-						rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[num_v6];
-						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-						{
-							return IPACM_FAILURE;
-						}
-					}
-
-				}
-			} /* end of for loop */
-
-		    /* clean the 4 Qos ipv6 RT rules for client:clt_indx */
-		    if(get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */
-		    {
-		                 get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 = 0;
-                    }
-		}
-
-		return IPACM_SUCCESS;
-	}
-
-	int handle_wan_hdr_init(uint8_t *mac_addr);
-	int handle_wan_client_ipaddr(ipacm_event_data_all *data);
-	int handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype);
-
-	/* handle new_address event */
-	int handle_addr_evt(ipacm_event_data_addr *data);
-
-	/* wan default route/filter rule configuration */
-	int handle_route_add_evt(ipa_ip_type iptype);
-
-	/* construct complete STA ethernet header */
-	int handle_sta_header_add_evt();
-
-	bool check_dft_firewall_rules_attr_mask(IPACM_firewall_conf_t *firewall_config);
-
-#ifdef FEATURE_IPA_ANDROID
-	/* wan posting supported tether_iface */
-	int post_wan_up_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether);
-
-	int post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether);
-#endif
-	int config_dft_firewall_rules(ipa_ip_type iptype);
-
-	/* configure the initial firewall filter rules */
-	int config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4, ipa_ioc_add_flt_rule *pFilteringTable_v6);
-
-	int handle_route_del_evt(ipa_ip_type iptype);
-
-	int del_dft_firewall_rules(ipa_ip_type iptype);
-
-	int handle_down_evt();
-
-	/*handle wan-iface down event */
-	int handle_down_evt_ex();
-
-	/* wan default route/filter rule delete */
-	int handle_route_del_evt_ex(ipa_ip_type iptype);
-
-	/* configure the initial firewall filter rules */
-	int config_dft_firewall_rules_ex(struct ipa_flt_rule_add* rules, int rule_offset,
-		ipa_ip_type iptype);
-
-	/* init filtering rule in wan dl filtering table */
-	int init_fl_rule_ex(ipa_ip_type iptype);
-
-	/* add ICMP and ALG rules in wan dl filtering table */
-	int add_icmp_alg_rules(struct ipa_flt_rule_add* rules, int rule_offset, ipa_ip_type iptype);
-
-	/* query extended property */
-	int query_ext_prop();
-
-	ipa_ioc_query_intf_ext_props *ext_prop;
-
-	int config_wan_firewall_rule(ipa_ip_type iptype);
-
-	int del_wan_firewall_rule(ipa_ip_type iptype);
-
-	int add_dft_filtering_rule(struct ipa_flt_rule_add* rules, int rule_offset, ipa_ip_type iptype);
-
-	int install_wan_filtering_rule(bool is_sw_routing);
-
-	void change_to_network_order(ipa_ip_type iptype, ipa_rule_attrib* attrib);
-
-	bool is_global_ipv6_addr(uint32_t* ipv6_addr);
-
-	void handle_wlan_SCC_MCC_switch(bool, ipa_ip_type);
-
-	void handle_wan_client_SCC_MCC_switch(bool, ipa_ip_type);
-
-	int handle_network_stats_evt();
-
-	int m_fd_ipa;
-
-	int handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 *data);
-
-	/* construct dummy ethernet header */
-	int add_dummy_rx_hdr();
-};
-
-#endif /* IPACM_WAN_H */
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
deleted file mode 100644
index eb911ac..0000000
--- a/ipacm/inc/IPACM_Wlan.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-		@file
-		IPACM_Wlan.h
-
-		@brief
-		This file implements the WLAN iface functionality.
-
-		@Author
-		Skylar Chang
-
-*/
-#ifndef IPACM_WLAN_H
-#define IPACM_WLAN_H
-
-#include <stdio.h>
-#include <IPACM_CmdQueue.h>
-#include <linux/msm_ipa.h>
-#include "IPACM_Routing.h"
-#include "IPACM_Filtering.h"
-#include "IPACM_Lan.h"
-#include "IPACM_Iface.h"
-#include "IPACM_Conntrack_NATApp.h"
-
-typedef struct _wlan_client_rt_hdl
-{
-	uint32_t wifi_rt_rule_hdl_v4;
-	uint32_t wifi_rt_rule_hdl_v6[IPV6_NUM_ADDR];
-	uint32_t wifi_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR];
-}wlan_client_rt_hdl;
-
-typedef struct _ipa_wlan_client
-{
-	ipacm_event_data_wlan_ex* p_hdr_info;
-	uint8_t mac[IPA_MAC_ADDR_SIZE];
-	uint32_t v4_addr;
-	uint32_t v6_addr[IPV6_NUM_ADDR][4];
-	uint32_t hdr_hdl_v4;
-	uint32_t hdr_hdl_v6;
-	bool route_rule_set_v4;
-	int route_rule_set_v6;
-	bool ipv4_set;
-	int 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;
-
-/* wlan iface */
-class IPACM_Wlan : public IPACM_Lan
-{
-
-public:
-
-	IPACM_Wlan(int iface_index);
-	virtual ~IPACM_Wlan(void);
-
-	static int total_num_wifi_clients;
-
-	void event_callback(ipa_cm_event_id event, void *data);
-
-	bool is_guest_ap();
-
-private:
-
-	bool m_is_guest_ap;
-
-	/* handle wlan access mode switch in ethernet bridging*/
-	void eth_bridge_handle_wlan_mode_switch();
-
-
-	int wlan_client_len;
-	ipa_wlan_client *wlan_client;
-
-	int header_name_count;
-	int num_wifi_client;
-
-	int wlan_ap_index;
-
-	static int num_wlan_ap_iface;
-
-	NatApp *Nat_App;
-
-	inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt)
-	{
-	    char *ret = ((char *)param) + (wlan_client_len * cnt);
-		return (ipa_wlan_client *)ret;
-	}
-
-	inline int get_wlan_client_index(uint8_t *mac_addr)
-	{
-		int cnt;
-		int num_wifi_client_tmp = num_wifi_client;
-
-		IPACMDBG_H("Passed 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]);
-
-		for(cnt = 0; cnt < num_wifi_client_tmp; cnt++)
-		{
-			IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 get_client_memptr(wlan_client, cnt)->mac[0],
-							 get_client_memptr(wlan_client, cnt)->mac[1],
-							 get_client_memptr(wlan_client, cnt)->mac[2],
-							 get_client_memptr(wlan_client, cnt)->mac[3],
-							 get_client_memptr(wlan_client, cnt)->mac[4],
-							 get_client_memptr(wlan_client, cnt)->mac[5]);
-
-			if(memcmp(get_client_memptr(wlan_client, cnt)->mac,
-								mac_addr,
-								sizeof(get_client_memptr(wlan_client, cnt)->mac)) == 0)
-			{
-				IPACMDBG_H("Matched client index: %d\n", cnt);
-				return cnt;
-			}
-		}
-
-		return IPACM_INVALID_INDEX;
-	}
-
-	inline int delete_default_qos_rtrules(int clt_indx, ipa_ip_type iptype)
-	{
-		uint32_t tx_index;
-		uint32_t rt_hdl;
-		int num_v6;
-
-		if(iptype == IPA_IP_v4)
-		{
-		     for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		     {
-		        if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
-			{
-				IPACMDBG_H("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index);
-				rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4;
-
-				if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
-				{
-					return IPACM_FAILURE;
-				}
-			}
-		     } /* end of for loop */
-
-		     /* clean the 4 Qos ipv4 RT rules for client:clt_indx */
-		     if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */
-		     {
-				get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = false;
-		     }
-		}
-
-		if(iptype == IPA_IP_v6)
-		{
-		    for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		    {
-
-				if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */
-				{
-					for(num_v6 =0;num_v6 < get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++)
-					{
-						IPACMDBG_H("Delete client index %d ipv6 Qos rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index);
-						rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6];
-						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-						{
-							return IPACM_FAILURE;
-						}
-
-						rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6];
-						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-						{
-							return IPACM_FAILURE;
-						}
-					}
-
-				}
-			} /* end of for loop */
-
-		    /* clean the 4 Qos ipv6 RT rules for client:clt_indx */
-		    if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */
-		    {
-		                 get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = 0;
-                    }
-		}
-
-		return IPACM_SUCCESS;
-	}
-
-	/* for handle wifi client initial,copy all partial headers (tx property) */
-	int handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data);
-
-	/*handle wifi client */
-	int handle_wlan_client_ipaddr(ipacm_event_data_all *data);
-
-	/*handle wifi client routing rule*/
-	int handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype);
-
-	/*handle wifi client power-save mode*/
-	int handle_wlan_client_pwrsave(uint8_t *mac_addr);
-
-	/*handle wifi client del mode*/
-	int handle_wlan_client_down_evt(uint8_t *mac_addr);
-
-	/*handle wlan iface down event*/
-	int handle_down_evt();
-
-	/*handle reset wifi-client rt-rules */
-	int handle_wlan_client_reset_rt(ipa_ip_type iptype);
-
-	void handle_SCC_MCC_switch(ipa_ip_type);
-
-};
-
-
-#endif /* IPACM_WLAN_H */
diff --git a/ipacm/inc/IPACM_Xml.h b/ipacm/inc/IPACM_Xml.h
deleted file mode 100644
index 64c00ed..0000000
--- a/ipacm/inc/IPACM_Xml.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-  @file
-  IPACM_Xml.h
-
-  @brief
-  This file implements the XML specific parsing functionality.
-
-  @Author
-  Skylar Chang/Shihuan Liu
-
-*/
-#ifndef IPACM_XML_H
-#define IPACM_XML_H
-
-#include <linux/msm_ipa.h>
-#include "IPACM_Defs.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <stdint.h>
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-  
-#define IPACM_ASSERT(a)                                     \
-if (!(a)) {                                                 \
-	fprintf(stderr, "%s, %d: assertion (a) failed!",    \
-	__FILE__,                                           \
-	__LINE__);                                          \
-	abort();                                            \
-}
-  
-/* Max allowed size of the XML file (2 MB) */
-#define IPACM_XML_MAX_FILESIZE               (2 << 20)
-#define IPACM_MAX_FIREWALL_ENTRIES            50
-#define IPACM_IPV6_ADDR_LEN                   16
-
-/* Defines for clipping space or space & quotes (single, double) */
-#define IPACM_XML_CLIP_SPACE         " "
-#define IPACM_XML_CLIP_SPACE_QUOTES  " '\""
-
-#define MAX_XML_STR_LEN                 120
-  
-/* IPA Config Entries */
-#define system_TAG                           "system"
-#define ODU_TAG                              "ODUCFG"
-#define ODUMODE_TAG                          "OduMode"
-#define ODUEMBMS_OFFLOAD_TAG                 "eMBMS_offload"
-#define ODU_ROUTER_TAG                       "router"
-#define ODU_BRIDGE_TAG                       "bridge"
-#define IPACMCFG_TAG                         "IPACM"
-#define IPACMIFACECFG_TAG                    "IPACMIface"
-#define IFACE_TAG                            "Iface"
-#define NAME_TAG                             "Name"
-#define CATEGORY_TAG                         "Category"
-#define MODE_TAG                             "Mode"
-#define IPACMPRIVATESUBNETCFG_TAG            "IPACMPrivateSubnet"
-#define SUBNET_TAG                           "Subnet"
-#define SUBNETADDRESS_TAG                    "SubnetAddress"
-#define SUBNETMASK_TAG                       "SubnetMask"
-#define WANIF_TAG                            "WAN"
-#define LANIF_TAG                            "LAN"
-#define WLANIF_TAG                           "WLAN"
-#define WLAN_FULL_MODE_TAG                   "full"
-#define WLAN_INTERNET_MODE_TAG               "internet"
-#define WLAN_MODE_TAG                        "WlanMode"
-#define VIRTUALIF_TAG                        "VIRTUAL"
-#define UNKNOWNIF_TAG                        "UNKNOWN"
-#define ODUIF_TAG                            "ODU"
-#define EMBMSIF_TAG                          "EMBMS"
-#define ETHIF_TAG                            "ETH"
-#define IFACE_ROUTER_MODE_TAG                "ROUTER"
-#define IFACE_BRIDGE_MODE_TAG                "BRIDGE"
-#define IPACMALG_TAG                         "IPACMALG"
-#define ALG_TAG                              "ALG"
-#define Protocol_TAG                         "Protocol"
-#define Port_TAG                             "Port"
-#define TCP_PROTOCOL_TAG                     "TCP"
-#define UDP_PROTOCOL_TAG                     "UDP"
-
-/* FIREWALL Config Entries */
-#define Firewall_TAG                         "Firewall"
-#define MobileAPFirewallCfg_TAG              "MobileAPFirewallCfg"
-#define FirewallEnabled_TAG                  "FirewallEnabled"
-#define FirewallPktsAllowed_TAG              "FirewallPktsAllowed"
-
-#define IPFamily_TAG                         "IPFamily"
-#define IPV4SourceAddress_TAG                "IPV4SourceAddress"
-#define IPV4SourceIPAddress_TAG              "IPV4SourceIPAddress"
-#define IPV4SourceSubnetMask_TAG             "IPV4SourceSubnetMask"
-
-#define IPV4DestinationAddress_TAG           "IPV4DestinationAddress"
-#define IPV4DestinationIPAddress_TAG         "IPV4DestinationIPAddress"
-#define IPV4DestinationSubnetMask_TAG        "IPV4DestinationSubnetMask"
-
-#define IPV4TypeOfService_TAG                "IPV4TypeOfService"
-#define TOSValue_TAG                         "TOSValue"
-#define TOSMask_TAG                          "TOSMask"
-
-#define IPV4NextHeaderProtocol_TAG           "IPV4NextHeaderProtocol"
-
-#define IPV6SourceAddress_TAG                "IPV6SourceAddress"
-#define IPV6SourceIPAddress_TAG              "IPV6SourceIPAddress"
-#define IPV6SourcePrefix_TAG                 "IPV6SourcePrefix"
-
-#define IPV6DestinationAddress_TAG           "IPV6DestinationAddress"
-#define IPV6DestinationIPAddress_TAG         "IPV6DestinationIPAddress"
-#define IPV6DestinationPrefix_TAG            "IPV6DestinationPrefix"
-
-#define IPV6TrafficClass_TAG                 "IPV6TrafficClass"
-#define TrfClsValue_TAG                      "TrfClsValue"
-#define TrfClsMask_TAG                       "TrfClsMask"
-
-#define IPV6NextHeaderProtocol_TAG           "IPV6NextHeaderProtocol"
-
-#define TCPSource_TAG                        "TCPSource"
-#define TCPSourcePort_TAG                    "TCPSourcePort"
-#define TCPSourceRange_TAG                   "TCPSourceRange"
-
-#define TCPDestination_TAG                   "TCPDestination"
-#define TCPDestinationPort_TAG               "TCPDestinationPort"
-#define TCPDestinationRange_TAG              "TCPDestinationRange"
-
-#define UDPSource_TAG                        "UDPSource"
-#define UDPSourcePort_TAG                    "UDPSourcePort"
-#define UDPSourceRange_TAG                   "UDPSourceRange"
-
-#define UDPDestination_TAG                   "UDPDestination"
-#define UDPDestinationPort_TAG               "UDPDestinationPort"
-#define UDPDestinationRange_TAG              "UDPDestinationRange"
-
-#define ICMPType_TAG                         "ICMPType"
-#define ICMPCode_TAG                         "ICMPCode"
-
-#define ESP_TAG                              "ESP"
-#define ESPSPI_TAG                           "ESPSPI"
-
-#define TCP_UDPSource_TAG                    "TCP_UDPSource"
-#define TCP_UDPSourcePort_TAG                "TCP_UDPSourcePort"
-#define TCP_UDPSourceRange_TAG               "TCP_UDPSourceRange"
-
-#define TCP_UDPDestination_TAG               "TCP_UDPDestination"
-#define TCP_UDPDestinationPort_TAG           "TCP_UDPDestinationPort"
-#define TCP_UDPDestinationRange_TAG          "TCP_UDPDestinationRange"
-
-#define IPACMNat_TAG                         "IPACMNAT"
-#define NAT_MaxEntries_TAG                   "MaxNatEntries"
-
-#define IP_PassthroughFlag_TAG               "IPPassthroughFlag"
-#define IP_PassthroughMode_TAG               "IPPassthroughMode"
-
-/*---------------------------------------------------------------------------
-      IP protocol numbers - use in dss_socket() to identify protocols.
-      Also contains the extension header types for IPv6.
----------------------------------------------------------------------------*/
-typedef enum
-{
-	IPACM_FIREWALL_IPV6_BASE_HDR        = 4,                               /* IPv6 Base Header           */
-	IPACM_FIREWALL_IPPROTO_HOP_BY_HOP_OPT_HDR = 0,                         /* Hop-by-hop Option Header   */
-	IPACM_FIREWALL_IPPROTO_ICMP         = 1,                               /* ICMP protocol */
-	IPACM_FIREWALL_IPPROTO_IGMP         = 2,                               /* IGMP protocol */
-	IPACM_FIREWALL_IPPROTO_IP           = IPACM_FIREWALL_IPV6_BASE_HDR,    /* IPv4          */
-	IPACM_FIREWALL_IPPROTO_TCP          = 6,                               /* TCP Protocol */
-	IPACM_FIREWALL_IPPROTO_UDP          = 17,                              /* UDP Protocol */
-	IPACM_FIREWALL_IPPROTO_IPV6         = 41,                              /* IPv6                       */
-	IPACM_FIREWALL_IPPROTO_ROUTING_HDR  = 43,                              /* Routing Header             */
-	IPACM_FIREWALL_IPPROTO_FRAG_HDR     = 44,                              /* Fragmentation Header       */
-	IPACM_FIREWALL_IPPROTO_GRE          = 47,                              /* GRE Protocol */
-	IPACM_FIREWALL_IPPROTO_ESP          = 50,                              /* ESP Protocol */
-	IPACM_FIREWALL_IPPROTO_AH           = 51,                              /* Authentication Header      */
-	IPACM_FIREWALL_IPPROTO_ICMP6        = 58,                              /* ICMPv6                     */
-	IPACM_FIREWALL_NO_NEXT_HDR          = 59,                              /* No Next Header for IPv6    */
-	IPACM_FIREWALL_IPPROTO_DEST_OPT_HDR = 60,                              /* Destination Options Header */
-	IPACM_FIREWALL_IPPROTO_MOBILITY_HDR = 135,                             /* Mobility Header            */
-	IPACM_FIREWALL_IPPROTO_TCP_UDP      = 253                              /* Unspecified protocol used for IPACM */
-} ipacm_firewall_ip_protocol_enum_type;
-
-/* define as mobileap firewall rule format*/
-typedef enum
-{
-	IP_V4 = 4,
-	IP_V6 = 6
-} firewall_ip_version_enum;
-  
-/*---------------------------------------------------------------------------
-           Extended FireWall Entry Configuration.
----------------------------------------------------------------------------*/
-typedef struct
-{
-	struct ipa_rule_attrib attrib;
-	firewall_ip_version_enum  ip_vsn;
-} IPACM_extd_firewall_entry_conf_t;
-
-
-/*---------------------------------------------------------------------------
-           Extended FireWall configuration.
----------------------------------------------------------------------------*/
-typedef union
-{
-	IPACM_extd_firewall_entry_conf_t extd_firewall_entry;
-} IPACM_extd_firewall_conf_t;
-
-
-typedef struct
-{
-	char firewall_config_file[IPA_MAX_FILE_LEN];
-	uint8_t  num_extd_firewall_entries;
-	IPACM_extd_firewall_entry_conf_t extd_firewall_entries[IPACM_MAX_FIREWALL_ENTRIES];
-	bool rule_action_accept;
-	bool firewall_enable;
-} IPACM_firewall_conf_t;
-  
-
-
-typedef struct
-{
-	uint8_t num_iface_entries;
-	ipa_ifi_dev_name_t iface_entries[IPA_MAX_IFACE_ENTRIES];
-} ipacm_iface_conf_t;
-
-typedef struct
-{
-	uint8_t num_subnet_entries;
-	ipa_private_subnet private_subnet_entries[IPA_MAX_PRIVATE_SUBNET_ENTRIES];
-} ipacm_private_subnet_conf_t;
-
-typedef struct
-{
-	uint8_t protocol;
-	uint16_t port;
-} ipacm_alg;
-
-typedef struct
-{
-	uint8_t num_alg_entries;
-	ipacm_alg alg_entries[IPA_MAX_ALG_ENTRIES];
-} ipacm_alg_conf_t;
-
- 
-typedef struct  _IPACM_conf_t
-{
-	ipacm_iface_conf_t iface_config;
-	ipacm_private_subnet_conf_t private_subnet_config;
-	ipacm_alg_conf_t alg_config;
-	int nat_max_entries;
-	bool odu_enable;
-	bool router_mode_enable;
-	bool odu_embms_enable;
-	int num_wlan_guest_ap;
-	bool ip_passthrough_mode;
-} IPACM_conf_t;  
-
-/* This function read IPACM XML configuration*/
-int ipacm_read_cfg_xml
-(
-	char *xml_file,                              /* Filename and path     */
-	IPACM_conf_t *config                         /* Mobile AP config data */
-);
-
-/* This function reads QCMAP Firewall XML and store in IPACM Firewall stucture */
-int IPACM_read_firewall_xml
-(
-	char *xml_file,                                 /* Filename and path     */
-	IPACM_firewall_conf_t *config                   /* Mobile AP config data */
-);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif //IPACM_XML
diff --git a/ipacm/src/Android.mk b/ipacm/src/Android.mk
deleted file mode 100644
index a59c7f4..0000000
--- a/ipacm/src/Android.mk
+++ /dev/null
@@ -1,102 +0,0 @@
-BOARD_PLATFORM_LIST := msm8916
-BOARD_PLATFORM_LIST += msm8909
-ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true)
-ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM)))
-ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH)))
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../inc
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc
-ifeq ($(call is-platform-sdk-version-at-least,20),true)
-LOCAL_C_INCLUDES += external/icu/icu4c/source/common
-else
-LOCAL_C_INCLUDES += external/icu4c/common
-endif
-LOCAL_C_INCLUDES += external/dhcpcd
-LOCAL_C_INCLUDES += external/libxml2/include
-LOCAL_C_INCLUDES += external/libnetfilter_conntrack/include
-LOCAL_C_INCLUDES += external/libnfnetlink/include
-
-ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
-LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
-LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-endif
-
-
-LOCAL_CFLAGS := -v
-LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID
-ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
-LOCAL_CFLAGS += -DDEBUG
-endif
-
-ifeq ($(TARGET_BOARD_PLATFORM),msmcobalt)
-LOCAL_CFLAGS += -DFEATURE_IPA_V3
-endif
-
-filetoadd = bionic/libc/kernel/arch-arm/asm/posix_types.h
-LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;)
-filetoadd = bionic/libc/kernel/arch-arm/asm/byteorder.h
-LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;)
-
-LOCAL_SRC_FILES := IPACM_Main.cpp \
-		IPACM_EvtDispatcher.cpp \
-		IPACM_Config.cpp \
-		IPACM_CmdQueue.cpp \
-		IPACM_Filtering.cpp \
-		IPACM_Routing.cpp \
-		IPACM_Header.cpp \
-		IPACM_Lan.cpp \
-		IPACM_Iface.cpp \
-		IPACM_Wlan.cpp \
-		IPACM_Wan.cpp \
-		IPACM_IfaceManager.cpp \
-		IPACM_Neighbor.cpp \
-		IPACM_Netlink.cpp \
-		IPACM_Xml.cpp \
-		IPACM_Conntrack_NATApp.cpp\
-		IPACM_ConntrackClient.cpp \
-		IPACM_ConntrackListener.cpp \
-                IPACM_Log.cpp
-
-LOCAL_MODULE := ipacm
-LOCAL_CLANG := false
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SHARED_LIBRARIES := libipanat
-LOCAL_SHARED_LIBRARIES += libxml2
-LOCAL_SHARED_LIBRARIES += libnfnetlink
-LOCAL_SHARED_LIBRARIES += libnetfilter_conntrack
-LOCAL_SHARED_LIBRARIES += libdhcpcd
-LOCAL_CLANG := true
-include $(BUILD_EXECUTABLE)
-
-################################################################################
-
-define ADD_TEST
-
-include $(CLEAR_VARS)
-LOCAL_MODULE       := $1
-LOCAL_SRC_FILES    := $1
-LOCAL_MODULE_CLASS := ipacm
-LOCAL_MODULE_TAGS  := debug
-LOCAL_MODULE_PATH  := $(TARGET_OUT_ETC)
-include $(BUILD_PREBUILT)
-
-endef
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := IPACM_cfg.xml
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
-LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_OWNER := ipacm
-include $(BUILD_PREBUILT)
-
-endif # $(TARGET_ARCH)
-endif
-endif
diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp
deleted file mode 100644
index a17fb08..0000000
--- a/ipacm/src/IPACM_CmdQueue.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-/* 
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_CmdQueue.cpp
-
-	@brief
-	This file implements the IPAM Comment Queue functionality
-
-	@Author 
-   Sunil
-
-*/
-#include <string.h>
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Log.h"
-#include "IPACM_Iface.h"
-
-pthread_mutex_t mutex    = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t  cond_var = PTHREAD_COND_INITIALIZER;
-
-MessageQueue* MessageQueue::inst_internal = NULL;
-MessageQueue* MessageQueue::inst_external = NULL;
-
-MessageQueue* MessageQueue::getInstanceInternal()
-{
-	if(inst_internal == NULL)
-	{
-		inst_internal = new MessageQueue();
-		if(inst_internal == NULL)
-		{
-			IPACMERR("unable to create internal Message Queue instance\n");
-			return NULL;
-		}
-	}
-
-	return inst_internal;
-}
-
-MessageQueue* MessageQueue::getInstanceExternal()
-{
-	if(inst_external == NULL)
-	{
-		inst_external = new MessageQueue();
-		if(inst_external == NULL)
-		{
-			IPACMERR("unable to create external Message Queue instance\n");
-			return NULL;
-		}
-	}
-
-	return inst_external;
-}
-
-void MessageQueue::enqueue(Message *item)
-{
-	if(!Head)
-	{
-		Tail = item;
-		Head = item;
-	}
-	else
-	{
-		if(Tail == NULL)
-		{
-			IPACMDBG("Tail is null\n");
-			Head->setnext(item);
-		}
-		else
-		{
-			Tail->setnext(item);
-		}
-		Tail = item;
-	}
-}
-
-
-Message* MessageQueue::dequeue(void)
-{
-	if(Head == NULL)
-	{
-		return NULL;
-	}
-	else
-	{
-		Message *tmp = Head;
-		Head = Head->getnext();
-
-		return tmp;
-	}
-}
-
-
-void* MessageQueue::Process(void *param)
-{
-	MessageQueue *MsgQueueInternal = NULL;
-	MessageQueue *MsgQueueExternal = NULL;
-	Message *item = NULL;
-	IPACMDBG("MessageQueue::Process()\n");
-
-	MsgQueueInternal = MessageQueue::getInstanceInternal();
-	if(MsgQueueInternal == NULL)
-	{
-		IPACMERR("unable to start internal cmd queue process\n");
-		return NULL;
-	}
-
-	MsgQueueExternal = MessageQueue::getInstanceExternal();
-	if(MsgQueueExternal == NULL)
-	{
-		IPACMERR("unable to start external cmd queue process\n");
-		return NULL;
-	}
-
-	while(1)
-	{
-		if(pthread_mutex_lock(&mutex) != 0)
-		{
-			IPACMERR("unable to lock the mutex\n");
-			return NULL;
-		}
-
-		item = MsgQueueInternal->dequeue();
-		if(item == NULL)
-		{
-			item = MsgQueueExternal->dequeue();
-			if(item)
-			{
-				IPACMDBG("Get event %s from external queue.\n",
-					IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event));
-			}
-		}
-		else
-		{
-			IPACMDBG("Get event %s from internal queue.\n",
-				IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event));
-		}
-
-		if(item == NULL)
-		{
-			IPACMDBG("Waiting for Message\n");
-
-			if(pthread_cond_wait(&cond_var, &mutex) != 0)
-			{
-				IPACMERR("unable to lock the mutex\n");
-
-				if(pthread_mutex_unlock(&mutex) != 0)
-				{
-					IPACMERR("unable to unlock the mutex\n");
-					return NULL;
-				}
-
-				return NULL;
-			}
-
-			if(pthread_mutex_unlock(&mutex) != 0)
-			{
-				IPACMERR("unable to unlock the mutex\n");
-				return NULL;
-			}
-
-		}
-		else
-		{
-			if(pthread_mutex_unlock(&mutex) != 0)
-			{
-				IPACMERR("unable to unlock the mutex\n");
-				return NULL;
-			}
-
-			IPACMDBG("Processing item %p event ID: %d\n",item,item->evt.data.event);
-			item->evt.callback_ptr(&item->evt.data);
-			delete item;
-			item = NULL;
-		}
-
-	} /* Go forever until a termination indication is received */
-
-}
diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp
deleted file mode 100644
index 4b02b57..0000000
--- a/ipacm/src/IPACM_Config.cpp
+++ /dev/null
@@ -1,816 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-				* Redistributions of source code must retain the above copyright
-						notice, this list of conditions and the following disclaimer.
-				* Redistributions in binary form must reproduce the above
-						copyright notice, this list of conditions and the following
-						disclaimer in the documentation and/or other materials provided
-						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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-		@file
-		IPACM_Config.cpp
-
-		@brief
-		This file implements the IPACM Configuration from XML file
-
-		@Author
-		Skylar Chang
-
-*/
-#include <IPACM_Config.h>
-#include <IPACM_Log.h>
-#include <IPACM_Iface.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-
-IPACM_Config *IPACM_Config::pInstance = NULL;
-const char *IPACM_Config::DEVICE_NAME = "/dev/ipa";
-const char *IPACM_Config::DEVICE_NAME_ODU = "/dev/odu_ipa_bridge";
-
-#define __stringify(x...) #x
-
-const char *ipacm_event_name[] = {
-	__stringify(IPA_CFG_CHANGE_EVENT),                     /* NULL */
-	__stringify(IPA_PRIVATE_SUBNET_CHANGE_EVENT),          /* ipacm_event_data_fid */
-	__stringify(IPA_FIREWALL_CHANGE_EVENT),                /* NULL */
-	__stringify(IPA_LINK_UP_EVENT),                        /* ipacm_event_data_fid */
-	__stringify(IPA_LINK_DOWN_EVENT),                      /* ipacm_event_data_fid */
-	__stringify(IPA_USB_LINK_UP_EVENT),                    /* ipacm_event_data_fid */
-	__stringify(IPA_BRIDGE_LINK_UP_EVENT),                 /* ipacm_event_data_all */
-	__stringify(IPA_WAN_EMBMS_LINK_UP_EVENT),              /* ipacm_event_data_mac */
-	__stringify(IPA_ADDR_ADD_EVENT),                       /* ipacm_event_data_addr */
-	__stringify(IPA_ADDR_DEL_EVENT),                       /* no use */
-	__stringify(IPA_ROUTE_ADD_EVENT),                      /* ipacm_event_data_addr */
-	__stringify(IPA_ROUTE_DEL_EVENT),                      /* ipacm_event_data_addr */
-	__stringify(IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT),         /* ipacm_event_data_fid */
-	__stringify(IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT),         /* ipacm_event_data_fid */
-	__stringify(IPA_WLAN_AP_LINK_UP_EVENT),                /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_STA_LINK_UP_EVENT),               /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_LINK_DOWN_EVENT),                 /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_CLIENT_ADD_EVENT),                /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_CLIENT_ADD_EVENT_EX),             /* ipacm_event_data_wlan_ex */
-	__stringify(IPA_WLAN_CLIENT_DEL_EVENT),                /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_CLIENT_POWER_SAVE_EVENT),         /* ipacm_event_data_mac */
-	__stringify(IPA_WLAN_CLIENT_RECOVER_EVENT),            /* ipacm_event_data_mac */
-	__stringify(IPA_NEW_NEIGH_EVENT),                      /* ipacm_event_data_all */
-	__stringify(IPA_DEL_NEIGH_EVENT),                      /* ipacm_event_data_all */
-	__stringify(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT),       /* ipacm_event_data_all */
-	__stringify(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT),       /* ipacm_event_data_all */
-	__stringify(IPA_SW_ROUTING_ENABLE),                    /* NULL */
-	__stringify(IPA_SW_ROUTING_DISABLE),                   /* NULL */
-	__stringify(IPA_PROCESS_CT_MESSAGE),                   /* ipacm_ct_evt_data */
-	__stringify(IPA_PROCESS_CT_MESSAGE_V6),                /* ipacm_ct_evt_data */
-	__stringify(IPA_LAN_TO_LAN_NEW_CONNECTION),            /* ipacm_event_connection */
-	__stringify(IPA_LAN_TO_LAN_DEL_CONNECTION),            /* ipacm_event_connection */
-	__stringify(IPA_WLAN_SWITCH_TO_SCC),                   /* No Data */
-	__stringify(IPA_WLAN_SWITCH_TO_MCC),                   /* No Data */
-	__stringify(IPA_CRADLE_WAN_MODE_SWITCH),               /* ipacm_event_cradle_wan_mode */
-	__stringify(IPA_WAN_XLAT_CONNECT_EVENT),               /* ipacm_event_data_fid */
-	__stringify(IPA_TETHERING_STATS_UPDATE_EVENT),         /* ipacm_event_data_fid */
-	__stringify(IPA_NETWORK_STATS_UPDATE_EVENT),           /* ipacm_event_data_fid */
-	__stringify(IPA_EXTERNAL_EVENT_MAX),
-	__stringify(IPA_HANDLE_WAN_UP),                        /* ipacm_event_iface_up  */
-	__stringify(IPA_HANDLE_WAN_DOWN),                      /* ipacm_event_iface_up  */
-	__stringify(IPA_HANDLE_WAN_UP_V6),                     /* NULL */
-	__stringify(IPA_HANDLE_WAN_DOWN_V6),                   /* NULL */
-	__stringify(IPA_HANDLE_WAN_UP_TETHER),                 /* ipacm_event_iface_up_tehter */
-	__stringify(IPA_HANDLE_WAN_DOWN_TETHER),               /* ipacm_event_iface_up_tehter */
-	__stringify(IPA_HANDLE_WAN_UP_V6_TETHER),              /* ipacm_event_iface_up_tehter */
-	__stringify(IPA_HANDLE_WAN_DOWN_V6_TETHER),            /* ipacm_event_iface_up_tehter */
-	__stringify(IPA_HANDLE_WLAN_UP),                       /* ipacm_event_iface_up */
-	__stringify(IPA_HANDLE_LAN_UP),                        /* ipacm_event_iface_up */
-	__stringify(IPA_ETH_BRIDGE_IFACE_UP),                  /* ipacm_event_eth_bridge*/
-	__stringify(IPA_ETH_BRIDGE_IFACE_DOWN),                /* ipacm_event_eth_bridge*/
-	__stringify(IPA_ETH_BRIDGE_CLIENT_ADD),                /* ipacm_event_eth_bridge*/
-	__stringify(IPA_ETH_BRIDGE_CLIENT_DEL),                /* ipacm_event_eth_bridge*/
-	__stringify(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH),       /* ipacm_event_eth_bridge*/
-	__stringify(IPA_LAN_DELETE_SELF),                      /* ipacm_event_data_fid */
-	__stringify(IPACM_EVENT_MAX),
-};
-
-IPACM_Config::IPACM_Config()
-{
-	iface_table = NULL;
-	alg_table = NULL;
-	pNatIfaces = NULL;
-	memset(&ipa_client_rm_map_tbl, 0, sizeof(ipa_client_rm_map_tbl));
-	memset(&ipa_rm_tbl, 0, sizeof(ipa_rm_tbl));
-	ipa_rm_a2_check=0;
-	ipacm_odu_enable = false;
-	ipacm_odu_router_mode = false;
-	ipa_num_wlan_guest_ap = 0;
-
-	ipa_num_ipa_interfaces = 0;
-	ipa_num_private_subnet = 0;
-	ipa_num_alg_ports = 0;
-	ipa_nat_max_entries = 0;
-	ipa_nat_iface_entries = 0;
-	ipa_sw_rt_enable = false;
-	ipa_bridge_enable = false;
-	isMCC_Mode = false;
-	ipa_max_valid_rm_entry = 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));
-	memset(&rt_tbl_wan_v6, 0, sizeof(rt_tbl_wan_v6));
-	memset(&rt_tbl_wan_dl, 0, sizeof(rt_tbl_wan_dl));
-	memset(&rt_tbl_odu_v4, 0, sizeof(rt_tbl_odu_v4));
-	memset(&rt_tbl_odu_v6, 0, sizeof(rt_tbl_odu_v6));
-
-	memset(&ext_prop_v4, 0, sizeof(ext_prop_v4));
-	memset(&ext_prop_v6, 0, sizeof(ext_prop_v6));
-
-	qmap_id = ~0;
-
-	memset(flt_rule_count_v4, 0, (IPA_CLIENT_CONS - IPA_CLIENT_PROD)*sizeof(int));
-	memset(flt_rule_count_v6, 0, (IPA_CLIENT_CONS - IPA_CLIENT_PROD)*sizeof(int));
-	memset(bridge_mac, 0, IPA_MAC_ADDR_SIZE*sizeof(uint8_t));
-
-	IPACMDBG_H(" create IPACM_Config constructor\n");
-	return;
-}
-
-int IPACM_Config::Init(void)
-{
-	/* Read IPACM Config file */
-	char	IPACM_config_file[IPA_MAX_FILE_LEN];
-	IPACM_conf_t	*cfg;
-	cfg = (IPACM_conf_t *)malloc(sizeof(IPACM_conf_t));
-	if(cfg == NULL)
-	{
-		IPACMERR("Unable to allocate cfg memory.\n");
-		return IPACM_FAILURE;
-	}
-	uint32_t subnet_addr;
-	uint32_t subnet_mask;
-	int i, ret = IPACM_SUCCESS;
-	struct in_addr in_addr_print;
-
-	m_fd = open(DEVICE_NAME, O_RDWR);
-	if (0 > m_fd)
-	{
-		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
-	}
-	strncpy(IPACM_config_file, "/etc/IPACM_cfg.xml", sizeof(IPACM_config_file));
-
-	IPACMDBG_H("\n IPACM XML file is %s \n", IPACM_config_file);
-	if (IPACM_SUCCESS == ipacm_read_cfg_xml(IPACM_config_file, cfg))
-	{
-		IPACMDBG_H("\n IPACM XML read OK \n");
-	}
-	else
-	{
-		IPACMERR("\n IPACM XML read failed \n");
-		ret = IPACM_FAILURE;
-		goto fail;
-	}
-
-	/* Construct IPACM Iface table */
-	ipa_num_ipa_interfaces = cfg->iface_config.num_iface_entries;
-	if (iface_table != NULL)
-	{
-		free(iface_table);
-		iface_table = NULL;
-		IPACMDBG_H("RESET IPACM_Config::iface_table\n");
-	}
-	iface_table = (ipa_ifi_dev_name_t *)calloc(ipa_num_ipa_interfaces,
-					sizeof(ipa_ifi_dev_name_t));
-	if(iface_table == NULL)
-	{
-		IPACMERR("Unable to allocate iface_table memory.\n");
-		ret = IPACM_FAILURE;
-		goto fail;
-	}
-
-	for (i = 0; i < cfg->iface_config.num_iface_entries; i++)
-	{
-		strncpy(iface_table[i].iface_name, cfg->iface_config.iface_entries[i].iface_name, sizeof(iface_table[i].iface_name));
-		iface_table[i].if_cat = cfg->iface_config.iface_entries[i].if_cat;
-		iface_table[i].if_mode = cfg->iface_config.iface_entries[i].if_mode;
-		iface_table[i].wlan_mode = cfg->iface_config.iface_entries[i].wlan_mode;
-		IPACMDBG_H("IPACM_Config::iface_table[%d] = %s, cat=%d, mode=%d wlan-mode=%d \n", i, iface_table[i].iface_name,
-				iface_table[i].if_cat, iface_table[i].if_mode, iface_table[i].wlan_mode);
-		/* copy bridge interface name to ipacmcfg */
-		if( iface_table[i].if_cat == VIRTUAL_IF)
-		{
-			strlcpy(ipa_virtual_iface_name, iface_table[i].iface_name, sizeof(ipa_virtual_iface_name));
-			IPACMDBG_H("ipa_virtual_iface_name(%s) \n", ipa_virtual_iface_name);
-		}
-	}
-
-	/* Construct IPACM Private_Subnet table */
-	memset(&private_subnet_table, 0, sizeof(private_subnet_table));
-	ipa_num_private_subnet = cfg->private_subnet_config.num_subnet_entries;
-
-	for (i = 0; i < cfg->private_subnet_config.num_subnet_entries; i++)
-	{
-		memcpy(&private_subnet_table[i].subnet_addr,
-					 &cfg->private_subnet_config.private_subnet_entries[i].subnet_addr,
-					 sizeof(cfg->private_subnet_config.private_subnet_entries[i].subnet_addr));
-
-		memcpy(&private_subnet_table[i].subnet_mask,
-					 &cfg->private_subnet_config.private_subnet_entries[i].subnet_mask,
-					 sizeof(cfg->private_subnet_config.private_subnet_entries[i].subnet_mask));
-
-		subnet_addr = htonl(private_subnet_table[i].subnet_addr);
-		memcpy(&in_addr_print,&subnet_addr,sizeof(in_addr_print));
-		IPACMDBG_H("%dst::private_subnet_table= %s \n ", i,
-						 inet_ntoa(in_addr_print));
-
-		subnet_mask =  htonl(private_subnet_table[i].subnet_mask);
-		memcpy(&in_addr_print,&subnet_mask,sizeof(in_addr_print));
-		IPACMDBG_H("%dst::private_subnet_table= %s \n ", i,
-						 inet_ntoa(in_addr_print));
-	}
-
-	/* Construct IPACM ALG table */
-	ipa_num_alg_ports = cfg->alg_config.num_alg_entries;
-	if (alg_table != NULL)
-	{
-		free(alg_table);
-		alg_table = NULL;
-		IPACMDBG_H("RESET IPACM_Config::alg_table \n");
-	}
-	alg_table = (ipacm_alg *)calloc(ipa_num_alg_ports,
-				sizeof(ipacm_alg));
-	if(alg_table == NULL)
-	{
-		IPACMERR("Unable to allocate alg_table memory.\n");
-		ret = IPACM_FAILURE;
-		free(iface_table);
-		goto fail;;
-	}
-	for (i = 0; i < cfg->alg_config.num_alg_entries; i++)
-	{
-		alg_table[i].protocol = cfg->alg_config.alg_entries[i].protocol;
-		alg_table[i].port = cfg->alg_config.alg_entries[i].port;
-		IPACMDBG_H("IPACM_Config::ipacm_alg[%d] = %d, port=%d\n", i, alg_table[i].protocol, alg_table[i].port);
-	}
-
-	ipa_nat_max_entries = cfg->nat_max_entries;
-	IPACMDBG_H("Nat Maximum Entries %d\n", ipa_nat_max_entries);
-
-	/* Find ODU is either router mode or bridge mode*/
-	ipacm_odu_enable = cfg->odu_enable;
-	ipacm_odu_router_mode = cfg->router_mode_enable;
-	ipacm_odu_embms_enable = cfg->odu_embms_enable;
-	IPACMDBG_H("ipacm_odu_enable %d\n", ipacm_odu_enable);
-	IPACMDBG_H("ipacm_odu_mode %d\n", ipacm_odu_router_mode);
-	IPACMDBG_H("ipacm_odu_embms_enable %d\n", ipacm_odu_embms_enable);
-
-	ipacm_ip_passthrough_mode = cfg->ip_passthrough_mode;
-	IPACMDBG_H("ipacm_ip_passthrough_mode %d. \n", ipacm_ip_passthrough_mode);
-
-	ipa_num_wlan_guest_ap = cfg->num_wlan_guest_ap;
-	IPACMDBG_H("ipa_num_wlan_guest_ap %d\n",ipa_num_wlan_guest_ap);
-
-	/* Allocate more non-nat entries if the monitored iface dun have Tx/Rx properties */
-	if (pNatIfaces != NULL)
-	{
-		free(pNatIfaces);
-		pNatIfaces = NULL;
-		IPACMDBG_H("RESET IPACM_Config::pNatIfaces \n");
-	}
-	ipa_nat_iface_entries = 0;
-	pNatIfaces = (NatIfaces *)calloc(ipa_num_ipa_interfaces, sizeof(NatIfaces));
-	if (pNatIfaces == NULL)
-	{
-		IPACMERR("unable to allocate nat ifaces\n");
-		ret = IPACM_FAILURE;
-		free(iface_table);
-		free(alg_table);
-		goto fail;
-	}
-
-	/* 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));
-
-	rt_tbl_wan_v4.ip = IPA_IP_v4;
-	strncpy(rt_tbl_wan_v4.name, V4_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v4.name));
-
-	rt_tbl_v6.ip = IPA_IP_v6;
-	strncpy(rt_tbl_v6.name, V6_COMMON_ROUTE_TABLE_NAME, sizeof(rt_tbl_v6.name));
-
-	rt_tbl_wan_v6.ip = IPA_IP_v6;
-	strncpy(rt_tbl_wan_v6.name, V6_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v6.name));
-
-	rt_tbl_odu_v4.ip = IPA_IP_v4;
-	strncpy(rt_tbl_odu_v4.name, V4_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v4.name));
-
-	rt_tbl_odu_v6.ip = IPA_IP_v6;
-	strncpy(rt_tbl_odu_v6.name, V6_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v6.name));
-
-	rt_tbl_wan_dl.ip = IPA_IP_MAX;
-	strncpy(rt_tbl_wan_dl.name, WAN_DL_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_dl.name));
-
-	/* Construct IPACM ipa_client map to rm_resource table */
-	ipa_client_rm_map_tbl[IPA_CLIENT_WLAN1_PROD]= IPA_RM_RESOURCE_WLAN_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_USB_PROD]= IPA_RM_RESOURCE_USB_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_A5_WLAN_AMPDU_PROD]= IPA_RM_RESOURCE_HSIC_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_A2_EMBEDDED_PROD]= IPA_RM_RESOURCE_Q6_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_A2_TETHERED_PROD]= IPA_RM_RESOURCE_Q6_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_APPS_LAN_WAN_PROD]= IPA_RM_RESOURCE_Q6_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_WLAN1_CONS]= IPA_RM_RESOURCE_WLAN_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_WLAN2_CONS]= IPA_RM_RESOURCE_WLAN_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_WLAN3_CONS]= IPA_RM_RESOURCE_WLAN_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_WLAN4_CONS]= IPA_RM_RESOURCE_WLAN_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_USB_CONS]= IPA_RM_RESOURCE_USB_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_A2_EMBEDDED_CONS]= IPA_RM_RESOURCE_Q6_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_A2_TETHERED_CONS]= IPA_RM_RESOURCE_Q6_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_APPS_WAN_CONS]= IPA_RM_RESOURCE_Q6_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_ODU_PROD]= IPA_RM_RESOURCE_ODU_ADAPT_PROD;
-	ipa_client_rm_map_tbl[IPA_CLIENT_ODU_EMB_CONS]= IPA_RM_RESOURCE_ODU_ADAPT_CONS;
-	ipa_client_rm_map_tbl[IPA_CLIENT_ODU_TETH_CONS]= IPA_RM_RESOURCE_ODU_ADAPT_CONS;
-
-	/* Create the entries which IPACM wants to add dependencies on */
-	ipa_rm_tbl[0].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD;
-	ipa_rm_tbl[0].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS;
-	ipa_rm_tbl[0].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD;
-	ipa_rm_tbl[0].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS;
-
-	ipa_rm_tbl[1].producer_rm1 = IPA_RM_RESOURCE_USB_PROD;
-	ipa_rm_tbl[1].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS;
-	ipa_rm_tbl[1].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD;
-	ipa_rm_tbl[1].consumer_rm2 = IPA_RM_RESOURCE_USB_CONS;
-
-	ipa_rm_tbl[2].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD;
-	ipa_rm_tbl[2].consumer_rm1 = IPA_RM_RESOURCE_USB_CONS;
-	ipa_rm_tbl[2].producer_rm2 = IPA_RM_RESOURCE_USB_PROD;
-	ipa_rm_tbl[2].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS;
-
-	ipa_rm_tbl[3].producer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_PROD;
-	ipa_rm_tbl[3].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS;
-	ipa_rm_tbl[3].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD;
-	ipa_rm_tbl[3].consumer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_CONS;
-
-	ipa_rm_tbl[4].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD;
-	ipa_rm_tbl[4].consumer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_CONS;
-	ipa_rm_tbl[4].producer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_PROD;
-	ipa_rm_tbl[4].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS;
-
-	ipa_rm_tbl[5].producer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_PROD;
-	ipa_rm_tbl[5].consumer_rm1 = IPA_RM_RESOURCE_USB_CONS;
-	ipa_rm_tbl[5].producer_rm2 = IPA_RM_RESOURCE_USB_PROD;
-	ipa_rm_tbl[5].consumer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_CONS;
-	ipa_max_valid_rm_entry = 6; /* max is IPA_MAX_RM_ENTRY (6)*/
-
-	IPACMDBG_H(" depend MAP-0 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_Q6_CONS);
-	IPACMDBG_H(" depend MAP-1 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_USB_PROD, IPA_RM_RESOURCE_Q6_CONS);
-	IPACMDBG_H(" depend MAP-2 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_USB_CONS);
-	IPACMDBG_H(" depend MAP-3 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_ODU_ADAPT_PROD, IPA_RM_RESOURCE_Q6_CONS);
-	IPACMDBG_H(" depend MAP-4 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_ODU_ADAPT_CONS);
-	IPACMDBG_H(" depend MAP-5 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_ODU_ADAPT_PROD, IPA_RM_RESOURCE_USB_CONS);
-
-fail:
-	if (cfg != NULL)
-	{
-		free(cfg);
-		cfg = NULL;
-	}
-
-	return ret;
-}
-
-IPACM_Config* IPACM_Config::GetInstance()
-{
-	int res = IPACM_SUCCESS;
-
-	if (pInstance == NULL)
-	{
-		pInstance = new IPACM_Config();
-
-		res = pInstance->Init();
-		if (res != IPACM_SUCCESS)
-		{
-			delete pInstance;
-			IPACMERR("unable to initialize config instance\n");
-			return NULL;
-		}
-	}
-
-	return pInstance;
-}
-
-int IPACM_Config::GetAlgPorts(int nPorts, ipacm_alg *pAlgPorts)
-{
-	if (nPorts <= 0 || pAlgPorts == NULL)
-	{
-		IPACMERR("Invalid input\n");
-		return -1;
-	}
-
-	for (int cnt = 0; cnt < nPorts; cnt++)
-	{
-		pAlgPorts[cnt].protocol = alg_table[cnt].protocol;
-		pAlgPorts[cnt].port = alg_table[cnt].port;
-	}
-
-	return 0;
-}
-
-int IPACM_Config::GetNatIfaces(int nIfaces, NatIfaces *pIfaces)
-{
-	if (nIfaces <= 0 || pIfaces == NULL)
-	{
-		IPACMERR("Invalid input\n");
-		return -1;
-	}
-
-	for (int cnt=0; cnt<nIfaces; cnt++)
-	{
-		memcpy(pIfaces[cnt].iface_name,
-					 pNatIfaces[cnt].iface_name,
-					 sizeof(pIfaces[cnt].iface_name));
-	}
-
-	return 0;
-}
-
-
-int IPACM_Config::AddNatIfaces(char *dev_name)
-{
-	int i;
-	/* Check if this iface already in NAT-iface*/
-	for(i = 0; i < ipa_nat_iface_entries; i++)
-	{
-		if(strncmp(dev_name,
-							 pNatIfaces[i].iface_name,
-							 sizeof(pNatIfaces[i].iface_name)) == 0)
-		{
-			IPACMDBG("Interface (%s) is add to nat iface already\n", dev_name);
-				return 0;
-		}
-	}
-
-	IPACMDBG_H("Add iface %s to NAT-ifaces, origin it has %d nat ifaces\n",
-					          dev_name, ipa_nat_iface_entries);
-	ipa_nat_iface_entries++;
-
-	if (ipa_nat_iface_entries < ipa_num_ipa_interfaces)
-	{
-		strlcpy(pNatIfaces[ipa_nat_iface_entries - 1].iface_name,
-					 dev_name, IPA_IFACE_NAME_LEN);
-
-		IPACMDBG_H("Add Nat IfaceName: %s ,update nat-ifaces number: %d\n",
-						 pNatIfaces[ipa_nat_iface_entries - 1].iface_name,
-						 ipa_nat_iface_entries);
-	}
-
-	return 0;
-}
-
-int IPACM_Config::DelNatIfaces(char *dev_name)
-{
-	int i = 0;
-	IPACMDBG_H("Del iface %s from NAT-ifaces, origin it has %d nat ifaces\n",
-					 dev_name, ipa_nat_iface_entries);
-
-	for (i = 0; i < ipa_nat_iface_entries; i++)
-	{
-		if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0)
-		{
-			IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n",
-							 pNatIfaces[i].iface_name, ipa_nat_iface_entries);
-
-			/* Reset the matched entry */
-			memset(pNatIfaces[i].iface_name, 0, IPA_IFACE_NAME_LEN);
-
-			for (; i < ipa_nat_iface_entries - 1; i++)
-			{
-				memcpy(pNatIfaces[i].iface_name,
-							 pNatIfaces[i + 1].iface_name, IPA_IFACE_NAME_LEN);
-
-				/* Reset the copied entry */
-				memset(pNatIfaces[i + 1].iface_name, 0, IPA_IFACE_NAME_LEN);
-			}
-			ipa_nat_iface_entries--;
-			IPACMDBG_H("Update nat-ifaces number: %d\n", ipa_nat_iface_entries);
-			return 0;
-		}
-	}
-
-	IPACMDBG_H("Can't find Nat IfaceName: %s with total nat-ifaces number: %d\n",
-					    dev_name, ipa_nat_iface_entries);
-	return 0;
-}
-
-/* for IPACM resource manager dependency usage
-   add either Tx or Rx ipa_rm_resource_name and
-   also indicate that endpoint property if valid */
-void IPACM_Config::AddRmDepend(ipa_rm_resource_name rm1,bool rx_bypass_ipa)
-{
-	int retval = 0;
-	struct ipa_ioc_rm_dependency dep;
-
-	IPACMDBG_H(" Got rm add-depend index : %d \n", rm1);
-	/* ipa_rm_a2_check: IPA_RM_RESOURCE_Q6_CONS*/
-	if(rm1 == IPA_RM_RESOURCE_Q6_CONS)
-	{
-		ipa_rm_a2_check+=1;
-		IPACMDBG_H("got %d times default RT routing from A2 \n", ipa_rm_a2_check);
-	}
-
-	for(int i=0;i<ipa_max_valid_rm_entry;i++)
-	{
-		if(rm1 == ipa_rm_tbl[i].producer_rm1)
-		{
-			ipa_rm_tbl[i].producer1_up = true;
-			/* entry1's producer actually dun have registered Rx-property */
-			ipa_rm_tbl[i].rx_bypass_ipa = rx_bypass_ipa;
-			IPACMDBG_H("Matched RM_table entry: %d's producer_rm1 with non_rx_prop: %d \n", i,ipa_rm_tbl[i].rx_bypass_ipa);
-
-			if(ipa_rm_tbl[i].consumer1_up == true && ipa_rm_tbl[i].rm_set == false)
-			{
-				IPACMDBG_H("SETUP RM_table entry %d's bi-direction dependency  \n", i);
-				/* add bi-directional dependency*/
-				if(ipa_rm_tbl[i].rx_bypass_ipa)
-				{
-					IPACMDBG_H("Skip ADD entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1);
-				}
-				else
-				{
-					memset(&dep, 0, sizeof(dep));
-					dep.resource_name = ipa_rm_tbl[i].producer_rm1;
-					dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1;
-					retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep);
-					IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-					if (retval)
-					{
-						IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval);
-					}
-				}
-				memset(&dep, 0, sizeof(dep));
-				dep.resource_name = ipa_rm_tbl[i].producer_rm2;
-				dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2;
-				retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep);
-				IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-				if (retval)
-				{
-					IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d)  \n", i,retval);
-				}
-				ipa_rm_tbl[i].rm_set = true;
-			}
-			else
-			{
-				IPACMDBG_H("Not SETUP RM_table entry %d: prod_up:%d, cons_up:%d, rm_set: %d \n", i,ipa_rm_tbl[i].producer1_up, ipa_rm_tbl[i].consumer1_up, ipa_rm_tbl[i].rm_set);
-			}
-		}
-
-		if(rm1 == ipa_rm_tbl[i].consumer_rm1)
-		{
-			ipa_rm_tbl[i].consumer1_up = true;
-			IPACMDBG_H("Matched RM_table entry: %d's consumer_rm1 \n", i);
-
-			if(ipa_rm_tbl[i].producer1_up == true && ipa_rm_tbl[i].rm_set == false)
-			{
-				IPACMDBG_H("SETUP RM_table entry %d's bi-direction dependency  \n", i);
-				/* add bi-directional dependency*/
-				if(ipa_rm_tbl[i].rx_bypass_ipa)
-				{
-					IPACMDBG_H("Skip ADD entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1);
-				}
-				else
-				{
-					memset(&dep, 0, sizeof(dep));
-					dep.resource_name = ipa_rm_tbl[i].producer_rm1;
-					dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1;
-					retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep);
-					IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-					if (retval)
-					{
-						IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d)  \n", i,retval);
-					}
-				}
-
-				memset(&dep, 0, sizeof(dep));
-				dep.resource_name = ipa_rm_tbl[i].producer_rm2;
-				dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2;
-				retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep);
-				IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-				if (retval)
-				{
-					IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d)  \n", i,retval);
-				}
-				ipa_rm_tbl[i].rm_set = true;
-			}
-			else
-			{
-				IPACMDBG_H("Not SETUP RM_table entry %d: prod_up:%d, cons_up:%d, rm_set: %d \n", i,ipa_rm_tbl[i].producer1_up, ipa_rm_tbl[i].consumer1_up, ipa_rm_tbl[i].rm_set);
-			}
-	   }
-   }
-   return ;
-}
-
-/* for IPACM resource manager dependency usage
-   delete either Tx or Rx ipa_rm_resource_name */
-
-void IPACM_Config::DelRmDepend(ipa_rm_resource_name rm1)
-{
-	int retval = 0;
-	struct ipa_ioc_rm_dependency dep;
-
-	IPACMDBG_H(" Got rm del-depend index : %d \n", rm1);
-	/* ipa_rm_a2_check: IPA_RM_RESOURCE_Q6_CONS*/
-	if(rm1 == IPA_RM_RESOURCE_Q6_CONS)
-	{
-		ipa_rm_a2_check-=1;
-		IPACMDBG_H("Left %d times default RT routing from A2 \n", ipa_rm_a2_check);
-	}
-
-	for(int i=0;i<ipa_max_valid_rm_entry;i++)
-	{
-
-		if(rm1 == ipa_rm_tbl[i].producer_rm1)
-		{
-			if(ipa_rm_tbl[i].rm_set == true)
-			{
-				IPACMDBG_H("Matched RM_table entry: %d's producer_rm1 and dependency is up \n", i);
-				ipa_rm_tbl[i].rm_set = false;
-
-				/* delete bi-directional dependency*/
-				if(ipa_rm_tbl[i].rx_bypass_ipa)
-				{
-					IPACMDBG_H("Skip DEL entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1);
-				}
-				else
-				{
-					memset(&dep, 0, sizeof(dep));
-					dep.resource_name = ipa_rm_tbl[i].producer_rm1;
-					dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1;
-					retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep);
-					IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-					if (retval)
-					{
-						IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval);
-					}
-				}
-				memset(&dep, 0, sizeof(dep));
-				dep.resource_name = ipa_rm_tbl[i].producer_rm2;
-				dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2;
-				retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep);
-				IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-				if (retval)
-				{
-					IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval);
-				}
-			}
-			ipa_rm_tbl[i].producer1_up = false;
-			ipa_rm_tbl[i].rx_bypass_ipa = false;
-		}
-		if(rm1 == ipa_rm_tbl[i].consumer_rm1)
-		{
-			/* ipa_rm_a2_check: IPA_RM_RESOURCE_!6_CONS*/
-			if(ipa_rm_tbl[i].consumer_rm1 == IPA_RM_RESOURCE_Q6_CONS && ipa_rm_a2_check == 1)
-			{
-				IPACMDBG_H(" still have %d default RT routing from A2 \n", ipa_rm_a2_check);
-				continue;
-			}
-
-			if(ipa_rm_tbl[i].rm_set == true)
-			{
-				IPACMDBG_H("Matched RM_table entry: %d's consumer_rm1 and dependency is up \n", i);
-				ipa_rm_tbl[i].rm_set = false;
-				/* delete bi-directional dependency*/
-				if(ipa_rm_tbl[i].rx_bypass_ipa)
-				{
-					IPACMDBG_H("Skip DEL entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1);
-				}
-				else
-				{
-					memset(&dep, 0, sizeof(dep));
-					dep.resource_name = ipa_rm_tbl[i].producer_rm1;
-					dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1;
-					retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep);
-					IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-					if (retval)
-					{
-						IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval);
-					}
-				}
-
-				memset(&dep, 0, sizeof(dep));
-				dep.resource_name = ipa_rm_tbl[i].producer_rm2;
-				dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2;
-				retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep);
-				IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name);
-				if (retval)
-				{
-					IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval);
-				}
-			}
-			ipa_rm_tbl[i].consumer1_up = false;
-		}
-	}
-	return ;
-}
-
-int IPACM_Config::SetExtProp(ipa_ioc_query_intf_ext_props *prop)
-{
-	int i, num;
-
-	if(prop == NULL || prop->num_ext_props <= 0)
-	{
-		IPACMERR("There is no extended property!\n");
-		return IPACM_FAILURE;
-	}
-
-	num = prop->num_ext_props;
-	for(i=0; i<num; i++)
-	{
-		if(prop->ext[i].ip == IPA_IP_v4)
-		{
-			if(ext_prop_v4.num_ext_props >= MAX_NUM_EXT_PROPS)
-			{
-				IPACMERR("IPv4 extended property table is full!\n");
-				continue;
-			}
-			memcpy(&ext_prop_v4.prop[ext_prop_v4.num_ext_props], &prop->ext[i], sizeof(struct ipa_ioc_ext_intf_prop));
-			ext_prop_v4.num_ext_props++;
-		}
-		else if(prop->ext[i].ip == IPA_IP_v6)
-		{
-			if(ext_prop_v6.num_ext_props >= MAX_NUM_EXT_PROPS)
-			{
-				IPACMERR("IPv6 extended property table is full!\n");
-				continue;
-			}
-			memcpy(&ext_prop_v6.prop[ext_prop_v6.num_ext_props], &prop->ext[i], sizeof(struct ipa_ioc_ext_intf_prop));
-			ext_prop_v6.num_ext_props++;
-		}
-		else
-		{
-			IPACMERR("The IP type is not expected!\n");
-			return IPACM_FAILURE;
-		}
-	}
-
-	IPACMDBG_H("Set extended property succeeded.\n");
-
-	return IPACM_SUCCESS;
-}
-
-ipacm_ext_prop* IPACM_Config::GetExtProp(ipa_ip_type ip_type)
-{
-	if(ip_type == IPA_IP_v4)
-		return &ext_prop_v4;
-	else if(ip_type == IPA_IP_v6)
-		return &ext_prop_v6;
-	else
-	{
-		IPACMERR("Failed to get extended property: the IP version is neither IPv4 nor IPv6!\n");
-		return NULL;
-	}
-}
-
-int IPACM_Config::DelExtProp(ipa_ip_type ip_type)
-{
-	if(ip_type != IPA_IP_v6)
-	{
-		memset(&ext_prop_v4, 0, sizeof(ext_prop_v4));
-	}
-
-	if(ip_type != IPA_IP_v4)
-	{
-		memset(&ext_prop_v6, 0, sizeof(ext_prop_v6));
-	}
-
-	return IPACM_SUCCESS;
-}
-
-const char* IPACM_Config::getEventName(ipa_cm_event_id event_id)
-{
-	if(event_id >= sizeof(ipacm_event_name)/sizeof(ipacm_event_name[0]))
-	{
-		IPACMERR("Event name array is not consistent with event array!\n");
-		return NULL;
-	}
-
-	return ipacm_event_name[event_id];
-}
diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp
deleted file mode 100644
index 146cedb..0000000
--- a/ipacm/src/IPACM_ConntrackClient.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include "IPACM_Iface.h"
-#include "IPACM_ConntrackListener.h"
-#include "IPACM_ConntrackClient.h"
-#include "IPACM_Log.h"
-
-#define LO_NAME "lo"
-
-extern IPACM_EvtDispatcher cm_dis;
-extern void ParseCTMessage(struct nf_conntrack *ct);
-
-IPACM_ConntrackClient *IPACM_ConntrackClient::pInstance = NULL;
-IPACM_ConntrackListener *CtList = NULL;
-
-/* ================================
-		 Local Function Definitions
-		 =================================
-*/
-IPACM_ConntrackClient::IPACM_ConntrackClient()
-{
-	IPACMDBG("\n");
-
-	tcp_hdl = NULL;
-	udp_hdl = NULL;
-	tcp_filter = NULL;
-	udp_filter = NULL;
-}
-
-IPACM_ConntrackClient* IPACM_ConntrackClient::GetInstance()
-{
-	if(pInstance == NULL)
-	{
-		pInstance = new IPACM_ConntrackClient();
-
-		pInstance->udp_filter = nfct_filter_create();
-		if(pInstance->udp_filter == NULL)
-		{
-			IPACMERR("unable to create UDP filter\n");
-			delete pInstance;
-			return NULL;
-		}
-		IPACMDBG("Created UDP filter\n");
-
-		pInstance->tcp_filter = nfct_filter_create();
-		if(pInstance->tcp_filter == NULL)
-		{
-			IPACMERR("unable to create TCP filter\n");
-			delete pInstance;
-			return NULL;
-		}
-		IPACMDBG("Created TCP filter\n");
-	}
-
-	return pInstance;
-}
-
-int IPACM_ConntrackClient::IPAConntrackEventCB
-(
-	 enum nf_conntrack_msg_type type,
-	 struct nf_conntrack *ct,
-	 void *data
-	 )
-{
-	ipacm_cmd_q_data evt_data;
-	ipacm_ct_evt_data *ct_data;
-	uint8_t ip_type = 0;
-
-	IPACMDBG("Event callback called with msgtype: %d\n",type);
-
-	/* Retrieve ip type */
-	ip_type = nfct_get_attr_u8(ct, ATTR_REPL_L3PROTO);
-
-#ifndef CT_OPT
-	if(AF_INET6 == ip_type)
-	{
-		IPACMDBG("Ignoring ipv6(%d) connections\n", ip_type);
-		goto IGNORE;
-	}
-
-#endif
-
-	ct_data = (ipacm_ct_evt_data *)malloc(sizeof(ipacm_ct_evt_data));
-	if(ct_data == NULL)
-	{
-		IPACMERR("unable to allocate memory \n");
-		goto IGNORE;
-	}
-
-	ct_data->ct = ct;
-	ct_data->type = type;
-
-	evt_data.event = IPA_PROCESS_CT_MESSAGE;
-	evt_data.evt_data = (void *)ct_data;
-
-#ifdef CT_OPT
-	if(AF_INET6 == ip_type)
-	{
-		evt_data.event = IPA_PROCESS_CT_MESSAGE_V6;
-	}
-#endif
-
-	if(0 != IPACM_EvtDispatcher::PostEvt(&evt_data))
-	{
-		IPACMERR("Error sending Conntrack message to processing thread!\n");
-		free(ct_data);
-		goto IGNORE;
-	}
-
-/* NFCT_CB_STOLEN means that the conntrack object is not released after the
-	 callback That must be manually done later when the object is no longer needed. */
-	return NFCT_CB_STOLEN;
-
-IGNORE:
-	nfct_destroy(ct);
-	return NFCT_CB_STOLEN;
-
-}
-
-int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Bridge_Addrs
-(
-	 struct nfct_filter *filter
-)
-{
-	int fd;
-	fd = socket(AF_INET, SOCK_DGRAM, 0);
-	if(fd < 0)
-	{
-		PERROR("unable to open socket");
-		return -1;
-	}
-
-	int ret;
-	uint32_t ipv4_addr;
-	struct ifreq ifr;
-
-	/* retrieve bridge interface ipv4 address */
-	memset(&ifr, 0, sizeof(struct ifreq));
-	ifr.ifr_addr.sa_family = AF_INET;
-	(void)strncpy(ifr.ifr_name, IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, sizeof(ifr.ifr_name));
-	IPACMDBG("bridge interface name (%s)\n", ifr.ifr_name);
-
-	ret = ioctl(fd, SIOCGIFADDR, &ifr);
-	if (ret < 0)
-	{
-		IPACMERR("unable to retrieve (%s) interface address\n",ifr.ifr_name);
-		close(fd);
-		return -1;
-	}
-	IPACMDBG("Interface (%s) address %s\n", ifr.ifr_name, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
-	ipv4_addr = ntohl(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr);
-	close(fd);
-
-	/* ignore whatever is destined to or originates from broadcast ip address */
-	struct nfct_filter_ipv4 filter_ipv4;
-
-	filter_ipv4.addr = ipv4_addr;
-	filter_ipv4.mask = 0xffffffff;
-
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_DST_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
-
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_SRC_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
-
-  return 0;
-}
-
-int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Local_Iface
-(
-	 struct nfct_filter *filter,
-	 ipacm_event_iface_up *param
-)
-{
-	struct nfct_filter_ipv4 filter_ipv4;
-
-	filter_ipv4.addr = param->ipv4_addr;
-	filter_ipv4.mask = 0xffffffff;
-
-	/* ignore whatever is destined to local interfaces */
-	IPACMDBG("Ignore connections destinated to interface %s", param->ifname);
-	iptodot("with ipv4 address", param->ipv4_addr);
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_DST_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
-
-	IPACMDBG("Ignore connections orignated from interface %s", param->ifname);
-	iptodot("with ipv4 address", filter_ipv4.addr);
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_SRC_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
-
-	/* Retrieve broadcast address */
-	/* Intialize with 255.255.255.255 */
-	uint32_t bc_ip_addr = 0xFFFFFFFF;
-
-	/* calculate broadcast address from addr and addr_mask */
-	bc_ip_addr = (bc_ip_addr & (~param->addr_mask));
-	bc_ip_addr = (bc_ip_addr | (param->ipv4_addr & param->addr_mask));
-
-	/* netfitler expecting in host-byte order */
-	filter_ipv4.addr = bc_ip_addr;
-	filter_ipv4.mask = 0xffffffff;
-
-	iptodot("with broadcast address", filter_ipv4.addr);
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_DST_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
-
-	return 0;
-}
-
-/* Function which sets up filters to ignore
-		 connections to and from local interfaces */
-int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Local_Addrs
-(
-	 struct nfct_filter *filter
-)
-{
-	struct nfct_filter_ipv4 filter_ipv4;
-
-	/* ignore whatever is destined to or originates from broadcast ip address */
-	filter_ipv4.addr = 0xffffffff;
-	filter_ipv4.mask = 0xffffffff;
-
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_DST_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
-
-	nfct_filter_set_logic(filter,
-												NFCT_FILTER_SRC_IPV4,
-												NFCT_FILTER_LOGIC_NEGATIVE);
-
-	nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
-
-	return 0;
-} /* IPA_Conntrack_Filters_Ignore_Local_Addrs() */
-
-/* Initialize TCP Filter */
-int IPACM_ConntrackClient::IPA_Conntrack_TCP_Filter_Init(void)
-{
-	int ret = 0;
-	IPACM_ConntrackClient *pClient;
-
-	IPACMDBG("\n");
-
-	pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to get conntrack client instance\n");
-		return -1;
-	}
-
-	ret = nfct_filter_set_logic(pClient->tcp_filter,
-															NFCT_FILTER_L4PROTO,
-															NFCT_FILTER_LOGIC_POSITIVE);
-	if(ret == -1)
-	{
-		IPACMERR("Unable to set filter logic\n");
-		return -1;
-	}
-
-	/* set protocol filters as tcp and udp */
-	nfct_filter_add_attr_u32(pClient->tcp_filter, NFCT_FILTER_L4PROTO, IPPROTO_TCP);
-
-
-	struct nfct_filter_proto tcp_proto_state;
-	tcp_proto_state.proto = IPPROTO_TCP;
-	tcp_proto_state.state = TCP_CONNTRACK_ESTABLISHED;
-
-	ret = nfct_filter_set_logic(pClient->tcp_filter,
-															NFCT_FILTER_L4PROTO_STATE,
-															NFCT_FILTER_LOGIC_POSITIVE);
-	if(ret == -1)
-	{
-		IPACMERR("unable to set filter logic\n");
-		return -1;
-	}
-	nfct_filter_add_attr(pClient->tcp_filter,
-											 NFCT_FILTER_L4PROTO_STATE,
-											 &tcp_proto_state);
-
-
-	tcp_proto_state.proto = IPPROTO_TCP;
-	tcp_proto_state.state = TCP_CONNTRACK_FIN_WAIT;
-	ret = nfct_filter_set_logic(pClient->tcp_filter,
-															NFCT_FILTER_L4PROTO_STATE,
-															NFCT_FILTER_LOGIC_POSITIVE);
-	if(ret == -1)
-	{
-		IPACMERR("unable to set filter logic\n");
-		return -1;
-	}
-
-	nfct_filter_add_attr(pClient->tcp_filter,
-											 NFCT_FILTER_L4PROTO_STATE,
-											 &tcp_proto_state);
-	return 0;
-}
-
-
-/* Initialize UDP Filter */
-int IPACM_ConntrackClient::IPA_Conntrack_UDP_Filter_Init(void)
-{
-	int ret = 0;
-	IPACM_ConntrackClient *pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to get conntrack client instance\n");
-		return -1;
-	}
-
-	ret = nfct_filter_set_logic(pClient->udp_filter,
-															NFCT_FILTER_L4PROTO,
-															NFCT_FILTER_LOGIC_POSITIVE);
-	if(ret == -1)
-	{
-		IPACMERR("unable to set filter logic\n");
-	}
-	/* set protocol filters as tcp and udp */
-	nfct_filter_add_attr_u32(pClient->udp_filter, NFCT_FILTER_L4PROTO, IPPROTO_UDP);
-
-	return 0;
-}
-
-void* IPACM_ConntrackClient::UDPConnTimeoutUpdate(void *ptr)
-{
-
-	NatApp *nat_inst = NULL;
-#ifdef IPACM_DEBUG
-	IPACMDBG("\n");
-#endif
-
-	nat_inst = NatApp::GetInstance();
-	if(nat_inst == NULL)
-	{
-		IPACMERR("unable to create nat instance\n");
-		return NULL;
-	}
-
-	while(1)
-	{
-		nat_inst->UpdateUDPTimeStamp();
-		sleep(UDP_TIMEOUT_UPDATE);
-	} /* end of while(1) loop */
-
-#ifdef IPACM_DEBUG
-	IPACMDBG("Returning from %s() %d\n", __FUNCTION__, __LINE__);
-#endif
-
-	return NULL;
-}
-
-/* Thread to initialize TCP Conntrack Filters*/
-void* IPACM_ConntrackClient::TCPRegisterWithConnTrack(void *)
-{
-	int ret;
-	IPACM_ConntrackClient *pClient;
-	unsigned subscrips = 0;
-
-	IPACMDBG("\n");
-
-	pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to get conntrack client instance\n");
-		return NULL;
-	}
-
-	subscrips = (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY);
-#ifdef CT_OPT
-	subscrips |= NF_NETLINK_CONNTRACK_NEW;
-#endif
-
-	pClient->tcp_hdl = nfct_open(CONNTRACK, subscrips);
-	if(pClient->tcp_hdl == NULL)
-	{
-		PERROR("nfct_open\n");
-		return NULL;
-	}
-
-	/* Initialize the filter */
-	ret = IPA_Conntrack_TCP_Filter_Init();
-	if(ret == -1)
-	{
-		IPACMERR("Unable to initliaze TCP Filter\n");
-		return NULL;
-	}
-
-	/* Attach the filter to net filter handler */
-	ret = nfct_filter_attach(nfct_fd(pClient->tcp_hdl), pClient->tcp_filter);
-	if(ret == -1)
-	{
-		IPACMDBG("unable to attach TCP filter\n");
-		return NULL;
-	}
-
-	/* Register callback with netfilter handler */
-	IPACMDBG_H("tcp handle:%p, fd:%d\n", pClient->tcp_hdl, nfct_fd(pClient->tcp_hdl));
-#ifndef CT_OPT
-	nfct_callback_register(pClient->tcp_hdl,
-			(nf_conntrack_msg_type)	(NFCT_T_UPDATE | NFCT_T_DESTROY | NFCT_T_NEW),
-						IPAConntrackEventCB, NULL);
-#else
-	nfct_callback_register(pClient->tcp_hdl, (nf_conntrack_msg_type) NFCT_T_ALL, IPAConntrackEventCB, NULL);
-#endif
-
-	/* Block to catch events from net filter connection track */
-	/* nfct_catch() receives conntrack events from kernel-space, by default it
-			 blocks waiting for events. */
-	IPACMDBG("Waiting for events\n");
-
-	ret = nfct_catch(pClient->tcp_hdl);
-	if(ret == -1)
-	{
-		IPACMERR("(%d)(%s)\n", ret, strerror(errno));
-		return NULL;
-	}
-
-	IPACMDBG("Exit from tcp thread\n");
-
-	/* destroy the filter.. this will not detach the filter */
-	nfct_filter_destroy(pClient->tcp_filter);
-	pClient->tcp_filter = NULL;
-
-	/* de-register the callback */
-	nfct_callback_unregister(pClient->tcp_hdl);
-	/* close the handle */
-	nfct_close(pClient->tcp_hdl);
-	pClient->tcp_hdl = NULL;
-
-	pthread_exit(NULL);
-	return NULL;
-}
-
-/* Thread to initialize UDP Conntrack Filters*/
-void* IPACM_ConntrackClient::UDPRegisterWithConnTrack(void *)
-{
-	int ret;
-	IPACM_ConntrackClient *pClient = NULL;
-
-	IPACMDBG("\n");
-
-	pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to retrieve instance of conntrack client\n");
-		return NULL;
-	}
-
-	pClient->udp_hdl = nfct_open(CONNTRACK,
-					(NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY));
-	if(pClient->udp_hdl == NULL)
-	{
-		PERROR("nfct_open\n");
-		return NULL;
-	}
-
-	/* Initialize Filter */
-	ret = IPA_Conntrack_UDP_Filter_Init();
-	if(-1 == ret)
-	{
-		IPACMDBG("Unable to initalize udp filters\n");
-		return NULL;
-	}
-
-	/* Attach the filter to net filter handler */
-	ret = nfct_filter_attach(nfct_fd(pClient->udp_hdl), pClient->udp_filter);
-	if(ret == -1)
-	{
-		IPACMDBG("unable to attach the filter\n");
-		return NULL;
-	}
-
-	/* Register callback with netfilter handler */
-	IPACMDBG_H("udp handle:%p, fd:%d\n", pClient->udp_hdl, nfct_fd(pClient->udp_hdl));
-	nfct_callback_register(pClient->udp_hdl,
-			(nf_conntrack_msg_type)(NFCT_T_NEW | NFCT_T_DESTROY),
-			IPAConntrackEventCB,
-			NULL);
-
-	/* Block to catch events from net filter connection track */
-ctcatch:
-	ret = nfct_catch(pClient->udp_hdl);
-	if(ret == -1)
-	{
-		IPACMDBG("(%d)(%s)\n", ret, strerror(errno));
-		return NULL;
-	}
-	else
-	{
-		IPACMDBG("ctcatch ret:%d\n", ret);
-		goto ctcatch;
-	}
-
-	IPACMDBG("Exit from udp thread with ret: %d\n", ret);
-
-	/* destroy the filter.. this will not detach the filter */
-	nfct_filter_destroy(pClient->udp_filter);
-	pClient->udp_filter = NULL;
-
-	/* de-register the callback */
-	nfct_callback_unregister(pClient->udp_hdl);
-	/* close the handle */
-	nfct_close(pClient->udp_hdl);
-	pClient->udp_hdl = NULL;
-
-	pthread_exit(NULL);
-	return NULL;
-}
-
-void IPACM_ConntrackClient::UpdateUDPFilters(void *param, bool isWan)
-{
-	static bool isIgnore = false;
-	int ret = 0;
-	IPACM_ConntrackClient *pClient = NULL;
-
-	pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to retrieve conntrack client instance\n");
-		return;
-	}
-
-	if(pClient->udp_filter == NULL)
-	{
-		 return;
-	}
-
-	if(!isWan)
-	{
-		IPA_Conntrack_Filters_Ignore_Local_Iface(pClient->udp_filter,
-																		 (ipacm_event_iface_up *)param);
-
-		if(!isIgnore)
-		{
-			IPA_Conntrack_Filters_Ignore_Bridge_Addrs(pClient->udp_filter);
-			IPA_Conntrack_Filters_Ignore_Local_Addrs(pClient->udp_filter);
-			isIgnore = true;
-		}
-	}
-
-	/* Attach the filter to udp handle */
-	if(pClient->udp_hdl != NULL)
-	{
-		IPACMDBG("attaching the filter to udp handle\n");
-		ret = nfct_filter_attach(nfct_fd(pClient->udp_hdl), pClient->udp_filter);
-		if(ret == -1)
-		{
-			PERROR("unable to attach the filter to udp handle\n");
-			IPACMERR("udp handle:%p, fd:%d Error: %d\n",pClient->udp_hdl, nfct_fd(pClient->udp_hdl), ret);
-			return;
-		}
-	}
-
-	return;
-}
-
-void IPACM_ConntrackClient::UpdateTCPFilters(void *param, bool isWan)
-{
-	static bool isIgnore = false;
-	int ret = 0;
-	IPACM_ConntrackClient *pClient = NULL;
-
-	pClient = IPACM_ConntrackClient::GetInstance();
-	if(pClient == NULL)
-	{
-		IPACMERR("unable to retrieve conntrack client instance\n");
-		return;
-	}
-
-	if(pClient->tcp_filter == NULL)
-		return;
-
-	if(!isWan)
-	{
-		IPA_Conntrack_Filters_Ignore_Local_Iface(pClient->tcp_filter,
-																	(ipacm_event_iface_up *)param);
-
-		if(!isIgnore)
-		{
-			IPA_Conntrack_Filters_Ignore_Bridge_Addrs(pClient->udp_filter);
-			IPA_Conntrack_Filters_Ignore_Local_Addrs(pClient->udp_filter);
-			isIgnore = true;
-		}
-	}
-
-	/* Attach the filter to tcp handle */
-	if(pClient->tcp_hdl != NULL)
-	{
-		IPACMDBG("attaching the filter to tcp handle\n");
-		ret = nfct_filter_attach(nfct_fd(pClient->tcp_hdl), pClient->tcp_filter);
-		if(ret == -1)
-		{
-			PERROR("unable to attach the filter to tcp handle\n");
-			IPACMERR("tcp handle:%p, fd:%d Error: %d\n",pClient->tcp_hdl, nfct_fd(pClient->tcp_hdl), ret);
-			return;
-		}
-	}
-
-  return;
-}
-
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
deleted file mode 100644
index ad3fa1e..0000000
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ /dev/null
@@ -1,1209 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <sys/ioctl.h>
-#include <net/if.h>
-
-#include "IPACM_ConntrackListener.h"
-#include "IPACM_ConntrackClient.h"
-#include "IPACM_EvtDispatcher.h"
-#include "IPACM_Iface.h"
-#include "IPACM_Wan.h"
-
-IPACM_ConntrackListener::IPACM_ConntrackListener()
-{
-	 IPACMDBG("\n");
-
-	 isNatThreadStart = false;
-	 isCTReg = false;
-	 WanUp = false;
-	 nat_inst = NatApp::GetInstance();
-
-	 NatIfaceCnt = 0;
-	 StaClntCnt = 0;
-	 pNatIfaces = NULL;
-	 pConfig = IPACM_Config::GetInstance();;
-
-	 memset(nat_iface_ipv4_addr, 0, sizeof(nat_iface_ipv4_addr));
-	 memset(nonnat_iface_ipv4_addr, 0, sizeof(nonnat_iface_ipv4_addr));
-	 memset(sta_clnt_ipv4_addr, 0, sizeof(sta_clnt_ipv4_addr));
-
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, this);
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, this);
-	 IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE, this);
-	 IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE_V6, this);
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_WLAN_UP, this);
-	 IPACM_EvtDispatcher::registr(IPA_HANDLE_LAN_UP, this);
-	 IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, this);
-	 IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, this);
-
-#ifdef CT_OPT
-	 p_lan2lan = IPACM_LanToLan::getLan2LanInstance();
-#endif
-}
-
-void IPACM_ConntrackListener::event_callback(ipa_cm_event_id evt,
-						void *data)
-{
-	 ipacm_event_iface_up *wan_down = NULL;
-
-	 if(data == NULL)
-	 {
-		 IPACMERR("Invalid Data\n");
-		 return;
-	 }
-
-	 switch(evt)
-	 {
-	 case IPA_PROCESS_CT_MESSAGE:
-			IPACMDBG("Received IPA_PROCESS_CT_MESSAGE event\n");
-			ProcessCTMessage(data);
-			break;
-
-#ifdef CT_OPT
-	 case IPA_PROCESS_CT_MESSAGE_V6:
-			IPACMDBG("Received IPA_PROCESS_CT_MESSAGE_V6 event\n");
-			ProcessCTV6Message(data);
-			break;
-#endif
-
-	 case IPA_HANDLE_WAN_UP:
-			IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
-			CreateConnTrackThreads();
-			TriggerWANUp(data);
-			break;
-
-	 case IPA_HANDLE_WAN_DOWN:
-			IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n");
-			wan_down = (ipacm_event_iface_up *)data;
-			if(isWanUp())
-			{
-				TriggerWANDown(wan_down->ipv4_addr);
-			}
-			break;
-
-	/* if wlan or lan comes up after wan interface, modify
-		 tcp/udp filters to ignore local wlan or lan connections */
-	 case IPA_HANDLE_WLAN_UP:
-	 case IPA_HANDLE_LAN_UP:
-			IPACMDBG_H("Received event: %d with ifname: %s and address: 0x%x\n",
-							 evt, ((ipacm_event_iface_up *)data)->ifname,
-							 ((ipacm_event_iface_up *)data)->ipv4_addr);
-			CreateConnTrackThreads();
-			IPACM_ConntrackClient::UpdateUDPFilters(data, false);
-			IPACM_ConntrackClient::UpdateTCPFilters(data, false);
-			break;
-
-	 case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT:
-		 IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT event\n");
-		 HandleNonNatIPAddr(data, true);
-		 break;
-
-	 case IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT:
-		 IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT event\n");
-		 HandleNonNatIPAddr(data, false);
-		 break;
-
-	 default:
-			IPACMDBG("Ignore cmd %d\n", evt);
-			break;
-	 }
-}
-
-int IPACM_ConntrackListener::CheckNatIface(
-   ipacm_event_data_all *data, bool *NatIface)
-{
-	int fd = 0, len = 0, cnt, i, j;
-	struct ifreq ifr;
-	*NatIface = false;
-
-	if (data->ipv4_addr == 0 || data->iptype != IPA_IP_v4)
-	{
-		IPACMDBG("Ignoring\n");
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG("Received interface index %d with ip type: %d", data->if_index, data->iptype);
-	iptodot(" and ipv4 address", data->ipv4_addr);
-
-	if (pConfig == NULL)
-	{
-		pConfig = IPACM_Config::GetInstance();
-		if (pConfig == NULL)
-		{
-			IPACMERR("Unable to get Config instance\n");
-			return IPACM_FAILURE;
-		}
-	}
-
-	cnt = pConfig->GetNatIfacesCnt();
-	NatIfaceCnt = cnt;
-	IPACMDBG("Total Nat ifaces: %d\n", NatIfaceCnt);
-	if (pNatIfaces != NULL)
-	{
-		free(pNatIfaces);
-		pNatIfaces = NULL;
-	}
-
-	len = (sizeof(NatIfaces) * NatIfaceCnt);
-	pNatIfaces = (NatIfaces *)malloc(len);
-	if (pNatIfaces == NULL)
-	{
-		IPACMERR("Unable to allocate memory for non nat ifaces\n");
-		return IPACM_FAILURE;
-	}
-
-	memset(pNatIfaces, 0, len);
-	if (pConfig->GetNatIfaces(NatIfaceCnt, pNatIfaces) != 0)
-	{
-		IPACMERR("Unable to retrieve non nat ifaces\n");
-		return IPACM_FAILURE;
-	}
-
-	/* Search/Configure linux interface-index and map it to IPA interface-index */
-	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-	{
-		PERROR("get interface name socket create failed");
-		return IPACM_FAILURE;
-	}
-
-	memset(&ifr, 0, sizeof(struct ifreq));
-	ifr.ifr_ifindex = data->if_index;
-	if (ioctl(fd, SIOCGIFNAME, &ifr) < 0)
-	{
-		PERROR("call_ioctl_on_dev: ioctl failed:");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-	close(fd);
-
-	for (i = 0; i < NatIfaceCnt; i++)
-	{
-		if (strncmp(ifr.ifr_name,
-					pNatIfaces[i].iface_name,
-					sizeof(pNatIfaces[i].iface_name)) == 0)
-		{
-			IPACMDBG_H("Nat iface (%s), entry (%d), dont cache",
-						pNatIfaces[i].iface_name, i);
-			iptodot("with ipv4 address: ", nat_iface_ipv4_addr[i]);
-			*NatIface = true;
-			return IPACM_SUCCESS;
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-void IPACM_ConntrackListener::HandleNonNatIPAddr(
-   void *inParam, bool AddOp)
-{
-	ipacm_event_data_all *data = (ipacm_event_data_all *)inParam;
-	bool NatIface = false;
-	int cnt, ret;
-
-	if (isStaMode)
-	{
-		IPACMDBG("In STA mode, don't add dummy rules for non nat ifaces\n");
-		return;
-	}
-
-	/* Handle only non nat ifaces, NAT iface should be handle
-	   separately to avoid race conditions between route/nat
-	   rules add/delete operations */
-	if (AddOp)
-	{
-		ret = CheckNatIface(data, &NatIface);
-		if (!NatIface && ret == IPACM_SUCCESS)
-		{
-			/* Cache the non nat iface ip address */
-			for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++)
-			{
-				if (nonnat_iface_ipv4_addr[cnt] == 0)
-				{
-					nonnat_iface_ipv4_addr[cnt] = data->ipv4_addr;
-					IPACMDBG("Add ip addr to non nat list (%d) ", cnt);
-					iptodot("with ipv4 address", nonnat_iface_ipv4_addr[cnt]);
-
-					/* Add dummy nat rule for non nat ifaces */
-					nat_inst->FlushTempEntries(data->ipv4_addr, true, true);
-					return;
-				}
-			}
-		}
-	}
-	else
-	{
-		/* for delete operation */
-		for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++)
-		{
-			if (nonnat_iface_ipv4_addr[cnt] == data->ipv4_addr)
-			{
-				IPACMDBG("Reseting ct filters, entry (%d) ", cnt);
-				iptodot("with ipv4 address", nonnat_iface_ipv4_addr[cnt]);
-				nonnat_iface_ipv4_addr[cnt] = 0;
-				nat_inst->FlushTempEntries(data->ipv4_addr, false);
-				nat_inst->DelEntriesOnClntDiscon(data->ipv4_addr);
-				return;
-			}
-		}
-
-	}
-
-	return;
-}
-
-void IPACM_ConntrackListener::HandleNeighIpAddrAddEvt(
-   ipacm_event_data_all *data)
-{
-	bool NatIface = false;
-	int j, ret;
-
-	ret = CheckNatIface(data, &NatIface);
-	if (NatIface && ret == IPACM_SUCCESS)
-	{
-		for (j = 0; j < MAX_IFACE_ADDRESS; j++)
-		{
-			/* check if duplicate NAT ip */
-			if (nat_iface_ipv4_addr[j] == data->ipv4_addr)
-				break;
-
-			/* Cache the new nat iface address */
-			if (nat_iface_ipv4_addr[j] == 0)
-			{
-				nat_iface_ipv4_addr[j] = data->ipv4_addr;
-				iptodot("Nating connections of addr: ", nat_iface_ipv4_addr[j]);
-				break;
-			}
-		}
-
-		/* Add the cached temp entries to NAT table */
-		if (j != MAX_IFACE_ADDRESS)
-		{
-			nat_inst->ResetPwrSaveIf(data->ipv4_addr);
-			nat_inst->FlushTempEntries(data->ipv4_addr, true);
-		}
-	}
-	return;
-}
-
-void IPACM_ConntrackListener::HandleNeighIpAddrDelEvt(
-   uint32_t ipv4_addr)
-{
-	int cnt;
-
-	if(ipv4_addr == 0)
-	{
-		IPACMDBG("Ignoring\n");
-		return;
-	}
-
-	iptodot("HandleNeighIpAddrDelEvt(): Received ip addr", ipv4_addr);
-	for(cnt = 0; cnt<MAX_IFACE_ADDRESS; cnt++)
-	{
-		if (nat_iface_ipv4_addr[cnt] == ipv4_addr)
-		{
-			IPACMDBG("Reseting ct nat iface, entry (%d) ", cnt);
-			iptodot("with ipv4 address", nat_iface_ipv4_addr[cnt]);
-			nat_iface_ipv4_addr[cnt] = 0;
-			nat_inst->FlushTempEntries(ipv4_addr, false);
-			nat_inst->DelEntriesOnClntDiscon(ipv4_addr);
-		}
-	}
-
-	return;
-}
-
-void IPACM_ConntrackListener::TriggerWANUp(void *in_param)
-{
-	 ipacm_event_iface_up *wanup_data = (ipacm_event_iface_up *)in_param;
-
-	 IPACMDBG_H("Recevied below information during wanup,\n");
-	 IPACMDBG_H("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;
-	 }
-
-	 if(isWanUp())
-	 {
-		 if (wan_ipaddr != wanup_data->ipv4_addr)
-			 TriggerWANDown(wan_ipaddr);
-		 else
-			 return;
-	 }
-
-	 WanUp = true;
-	 isStaMode = wanup_data->is_sta;
-	 IPACMDBG("isStaMode: %d\n", isStaMode);
-
-	 wan_ipaddr = wanup_data->ipv4_addr;
-	 memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname));
-
-	 if(nat_inst != NULL)
-	 {
-		 nat_inst->AddTable(wanup_data->ipv4_addr);
-	 }
-
-	 IPACMDBG("creating nat threads\n");
-	 CreateNatThreads();
-}
-
-int IPACM_ConntrackListener::CreateConnTrackThreads(void)
-{
-	int ret;
-	pthread_t tcp_thread = 0, udp_thread = 0;
-
-	if(isCTReg == false)
-	{
-		if(!tcp_thread)
-		{
-			ret = pthread_create(&tcp_thread, NULL, IPACM_ConntrackClient::TCPRegisterWithConnTrack, NULL);
-			if(0 != ret)
-			{
-				IPACMERR("unable to create TCP conntrack event listner thread\n");
-				PERROR("unable to create TCP conntrack\n");
-				return -1;
-			}
-
-			IPACMDBG("created TCP conntrack event listner thread\n");
-			if(pthread_setname_np(tcp_thread, "tcp ct listener") != 0)
-			{
-				IPACMERR("unable to set thread name\n");
-			}
-		}
-
-		if(!udp_thread)
-		{
-			ret = pthread_create(&udp_thread, NULL, IPACM_ConntrackClient::UDPRegisterWithConnTrack, NULL);
-			if(0 != ret)
-			{
-				IPACMERR("unable to create UDP conntrack event listner thread\n");
-				PERROR("unable to create UDP conntrack\n");
-				goto error;
-			}
-
-			IPACMDBG("created UDP conntrack event listner thread\n");
-			if(pthread_setname_np(udp_thread, "udp ct listener") != 0)
-			{
-				IPACMERR("unable to set thread name\n");
-			}
-		}
-
-		isCTReg = true;
-	}
-
-	return 0;
-
-error:
-	return -1;
-}
-int IPACM_ConntrackListener::CreateNatThreads(void)
-{
-	int ret;
-	pthread_t udpcto_thread = 0;
-
-	if(isNatThreadStart == false)
-	{
-		if(!udpcto_thread)
-		{
-			ret = pthread_create(&udpcto_thread, NULL, IPACM_ConntrackClient::UDPConnTimeoutUpdate, NULL);
-			if(0 != ret)
-			{
-				IPACMERR("unable to create udp conn timeout thread\n");
-				PERROR("unable to create udp conn timeout\n");
-				goto error;
-			}
-
-			IPACMDBG("created upd conn timeout thread\n");
-			if(pthread_setname_np(udpcto_thread, "udp conn timeout") != 0)
-			{
-				IPACMERR("unable to set thread name\n");
-			}
-		}
-
-		isNatThreadStart = true;
-	}
-	return 0;
-
-error:
-	return -1;
-}
-
-void IPACM_ConntrackListener::TriggerWANDown(uint32_t wan_addr)
-{
-	int ret = 0;
-	IPACMDBG_H("Deleting ipv4 nat table with");
-	IPACMDBG_H(" public ip address(0x%x): %d.%d.%d.%d\n", wan_addr,
-			((wan_addr>>24) & 0xFF), ((wan_addr>>16) & 0xFF),
-			((wan_addr>>8) & 0xFF), (wan_addr & 0xFF));
-
-	 if(nat_inst != NULL)
-	 {
-		 ret = nat_inst->DeleteTable(wan_addr);
-		 if (ret)
-			 return;
-
-		 WanUp = false;
-		 wan_ipaddr = 0;
-	 }
-}
-
-
-void ParseCTMessage(struct nf_conntrack *ct)
-{
-	 uint32_t status, timeout;
-	 IPACMDBG("Printing conntrack parameters\n");
-
-	 iptodot("ATTR_IPV4_SRC = ATTR_ORIG_IPV4_SRC:", nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC));
-	 iptodot("ATTR_IPV4_DST = ATTR_ORIG_IPV4_DST:", nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST));
-	 IPACMDBG("ATTR_PORT_SRC = ATTR_ORIG_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC));
-	 IPACMDBG("ATTR_PORT_DST = ATTR_ORIG_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST));
-
-	 iptodot("ATTR_REPL_IPV4_SRC:", nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC));
-	 iptodot("ATTR_REPL_IPV4_DST:", nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST));
-	 IPACMDBG("ATTR_REPL_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC));
-	 IPACMDBG("ATTR_REPL_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST));
-
-	 iptodot("ATTR_SNAT_IPV4:", nfct_get_attr_u32(ct, ATTR_SNAT_IPV4));
-	 iptodot("ATTR_DNAT_IPV4:", nfct_get_attr_u32(ct, ATTR_DNAT_IPV4));
-	 IPACMDBG("ATTR_SNAT_PORT: 0x%x\n", nfct_get_attr_u16(ct, ATTR_SNAT_PORT));
-	 IPACMDBG("ATTR_DNAT_PORT: 0x%x\n", nfct_get_attr_u16(ct, ATTR_DNAT_PORT));
-
-	 IPACMDBG("ATTR_MARK: 0x%x\n", nfct_get_attr_u32(ct, ATTR_MARK));
-	 IPACMDBG("ATTR_USE: 0x%x\n", nfct_get_attr_u32(ct, ATTR_USE));
-	 IPACMDBG("ATTR_ID: 0x%x\n", nfct_get_attr_u32(ct, ATTR_ID));
-
-	 status = nfct_get_attr_u32(ct, ATTR_STATUS);
-	 IPACMDBG("ATTR_STATUS: 0x%x\n", status);
-
-	 timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT);
-	 IPACMDBG("ATTR_TIMEOUT: 0x%x\n", timeout);
-
-	 if(IPS_SRC_NAT & status)
-	 {
-			IPACMDBG("IPS_SRC_NAT set\n");
-	 }
-
-	 if(IPS_DST_NAT & status)
-	 {
-			IPACMDBG("IPS_DST_NAT set\n");
-	 }
-
-	 if(IPS_SRC_NAT_DONE & status)
-	 {
-			IPACMDBG("IPS_SRC_NAT_DONE set\n");
-	 }
-
-	 if(IPS_DST_NAT_DONE & status)
-	 {
-			IPACMDBG(" IPS_DST_NAT_DONE set\n");
-	 }
-
-	 IPACMDBG("\n");
-	 return;
-}
-
-void ParseCTV6Message(struct nf_conntrack *ct)
-{
-	 uint32_t status, timeout;
-	 struct nfct_attr_grp_ipv6 orig_params;
-	 uint8_t l4proto, tcp_flags, tcp_state;
-
-	 IPACMDBG("Printing conntrack parameters\n");
-
-	 nfct_get_attr_grp(ct, ATTR_GRP_ORIG_IPV6, (void *)&orig_params);
-	 IPACMDBG("Orig src_v6_addr: 0x%08x%08x%08x%08x\n", orig_params.src[0], orig_params.src[1],
-                	orig_params.src[2], orig_params.src[3]);
-	IPACMDBG("Orig dst_v6_addr: 0x%08x%08x%08x%08x\n", orig_params.dst[0], orig_params.dst[1],
-                	orig_params.dst[2], orig_params.dst[3]);
-
-	 IPACMDBG("ATTR_PORT_SRC = ATTR_ORIG_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC));
-	 IPACMDBG("ATTR_PORT_DST = ATTR_ORIG_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST));
-
-	 IPACMDBG("ATTR_MARK: 0x%x\n", nfct_get_attr_u32(ct, ATTR_MARK));
-	 IPACMDBG("ATTR_USE: 0x%x\n", nfct_get_attr_u32(ct, ATTR_USE));
-	 IPACMDBG("ATTR_ID: 0x%x\n", nfct_get_attr_u32(ct, ATTR_ID));
-
-	 timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT);
-	 IPACMDBG("ATTR_TIMEOUT: 0x%x\n", timeout);
-
-	 status = nfct_get_attr_u32(ct, ATTR_STATUS);
-	 IPACMDBG("ATTR_STATUS: 0x%x\n", status);
-
-	 l4proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
-	 IPACMDBG("ATTR_ORIG_L4PROTO: 0x%x\n", l4proto);
-	 if(l4proto == IPPROTO_TCP)
-	 {
-		tcp_state = nfct_get_attr_u8(ct, ATTR_TCP_STATE);
-		IPACMDBG("ATTR_TCP_STATE: 0x%x\n", tcp_state);
-
-		tcp_flags =  nfct_get_attr_u8(ct, ATTR_TCP_FLAGS_ORIG);
-		IPACMDBG("ATTR_TCP_FLAGS_ORIG: 0x%x\n", tcp_flags);
-	 }
-
-	 IPACMDBG("\n");
-	 return;
-}
-
-#ifdef CT_OPT
-void IPACM_ConntrackListener::ProcessCTV6Message(void *param)
-{
-	ipacm_ct_evt_data *evt_data = (ipacm_ct_evt_data *)param;
-	u_int8_t l4proto = 0;
-	uint32_t status = 0;
-	struct nf_conntrack *ct = evt_data->ct;
-
-#ifdef IPACM_DEBUG
-	 char buf[1024];
-
-	 /* Process message and generate ioctl call to kernel thread */
-	 nfct_snprintf(buf, sizeof(buf), evt_data->ct,
-								 evt_data->type, NFCT_O_PLAIN, NFCT_OF_TIME);
-	 IPACMDBG("%s\n", buf);
-	 IPACMDBG("\n");
-	 ParseCTV6Message(ct);
-#endif
-
-	if(p_lan2lan == NULL)
-	{
-		IPACMERR("Lan2Lan Instance is null\n");
-		goto IGNORE;
-	}
-
-	status = nfct_get_attr_u32(ct, ATTR_STATUS);
-	if((IPS_DST_NAT & status) || (IPS_SRC_NAT & status))
-	{
-		IPACMDBG("Either Destination or Source nat flag Set\n");
-		goto IGNORE;
-	}
-
-	l4proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
-	if(IPPROTO_UDP != l4proto && IPPROTO_TCP != l4proto)
-	{
-		 IPACMDBG("Received unexpected protocl %d conntrack message\n", l4proto);
-		 goto IGNORE;
-	}
-
-	IPACMDBG("Neither Destination nor Source nat flag Set\n");
-	struct nfct_attr_grp_ipv6 orig_params;
-	nfct_get_attr_grp(ct, ATTR_GRP_ORIG_IPV6, (void *)&orig_params);
-
-	ipacm_event_connection lan2lan_conn;
-	lan2lan_conn.iptype = IPA_IP_v6;
-	memcpy(lan2lan_conn.src_ipv6_addr, orig_params.src,
-				 sizeof(lan2lan_conn.src_ipv6_addr));
-    IPACMDBG("Before convert, src_v6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.src_ipv6_addr[0], lan2lan_conn.src_ipv6_addr[1],
-                	lan2lan_conn.src_ipv6_addr[2], lan2lan_conn.src_ipv6_addr[3]);
-    for(int cnt=0; cnt<4; cnt++)
-	{
-	   lan2lan_conn.src_ipv6_addr[cnt] = ntohl(lan2lan_conn.src_ipv6_addr[cnt]);
-	}
-	IPACMDBG("After convert src_v6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.src_ipv6_addr[0], lan2lan_conn.src_ipv6_addr[1],
-                	lan2lan_conn.src_ipv6_addr[2], lan2lan_conn.src_ipv6_addr[3]);
-
-	memcpy(lan2lan_conn.dst_ipv6_addr, orig_params.dst,
-				 sizeof(lan2lan_conn.dst_ipv6_addr));
-	IPACMDBG("Before convert, dst_ipv6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.dst_ipv6_addr[0], lan2lan_conn.dst_ipv6_addr[1],
-                	lan2lan_conn.dst_ipv6_addr[2], lan2lan_conn.dst_ipv6_addr[3]);
-    for(int cnt=0; cnt<4; cnt++)
-	{
-	   lan2lan_conn.dst_ipv6_addr[cnt] = ntohl(lan2lan_conn.dst_ipv6_addr[cnt]);
-	}
-	IPACMDBG("After convert, dst_ipv6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.dst_ipv6_addr[0], lan2lan_conn.dst_ipv6_addr[1],
-                	lan2lan_conn.dst_ipv6_addr[2], lan2lan_conn.dst_ipv6_addr[3]);
-
-	if(((IPPROTO_UDP == l4proto) && (NFCT_T_NEW == evt_data->type)) ||
-		 ((IPPROTO_TCP == l4proto) &&
-			(nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_ESTABLISHED))
-		 )
-	{
-			p_lan2lan->handle_new_connection(&lan2lan_conn);
-	}
-	else if((IPPROTO_UDP == l4proto && NFCT_T_DESTROY == evt_data->type) ||
-					(IPPROTO_TCP == l4proto &&
-					 nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_FIN_WAIT))
-	{
-			p_lan2lan->handle_del_connection(&lan2lan_conn);
-	}
-
-IGNORE:
-	/* Cleanup item that was allocated during the original CT callback */
-	nfct_destroy(ct);
-	return;
-}
-#endif
-
-void IPACM_ConntrackListener::ProcessCTMessage(void *param)
-{
-	 ipacm_ct_evt_data *evt_data = (ipacm_ct_evt_data *)param;
-	 u_int8_t l4proto = 0;
-
-#ifdef IPACM_DEBUG
-	 char buf[1024];
-	 unsigned int out_flags;
-
-	 /* Process message and generate ioctl call to kernel thread */
-	 out_flags = (NFCT_OF_SHOW_LAYER3 | NFCT_OF_TIME | NFCT_OF_ID);
-	 nfct_snprintf(buf, sizeof(buf), evt_data->ct,
-								 evt_data->type, NFCT_O_PLAIN, out_flags);
-	 IPACMDBG_H("%s\n", buf);
-
-	 ParseCTMessage(evt_data->ct);
-#endif
-
-	 l4proto = nfct_get_attr_u8(evt_data->ct, ATTR_ORIG_L4PROTO);
-	 if(IPPROTO_UDP != l4proto && IPPROTO_TCP != l4proto)
-	 {
-			IPACMDBG("Received unexpected protocl %d conntrack message\n", l4proto);
-	 }
-	 else
-	 {
-			ProcessTCPorUDPMsg(evt_data->ct, evt_data->type, l4proto);
-	 }
-
-	 /* Cleanup item that was allocated during the original CT callback */
-	 nfct_destroy(evt_data->ct);
-	 return;
-}
-
-bool IPACM_ConntrackListener::AddIface(
-   nat_table_entry *rule, bool *isTempEntry)
-{
-	int cnt;
-
-	*isTempEntry = false;
-
-	/* Special handling for Passthrough IP. */
-	if (IPACM_Iface::ipacmcfg->ipacm_ip_passthrough_mode)
-	{
-		if (rule->private_ip == IPACM_Wan::getWANIP())
-		{
-			IPACMDBG("In Passthrough mode and entry matched with Wan IP (0x%x)\n",
-				rule->private_ip);
-			return true;
-		}
-	}
-
-	/* check whether nat iface or not */
-	for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++)
-	{
-		if (nat_iface_ipv4_addr[cnt] != 0)
-		{
-			if (rule->private_ip == nat_iface_ipv4_addr[cnt] ||
-				rule->target_ip == nat_iface_ipv4_addr[cnt])
-			{
-				IPACMDBG("matched nat_iface_ipv4_addr entry(%d)\n", cnt);
-				iptodot("AddIface(): Nat entry match with ip addr",
-						nat_iface_ipv4_addr[cnt]);
-				return true;
-			}
-		}
-	}
-
-	if (!isStaMode)
-	{
-		/* check whether non nat iface or not, on Non Nat iface
-		   add dummy rule by copying public ip to private ip */
-		for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++)
-		{
-			if (nonnat_iface_ipv4_addr[cnt] != 0)
-			{
-				if (rule->private_ip == nonnat_iface_ipv4_addr[cnt] ||
-					rule->target_ip == nonnat_iface_ipv4_addr[cnt])
-				{
-					IPACMDBG("matched non_nat_iface_ipv4_addr entry(%d)\n", cnt);
-					iptodot("AddIface(): Non Nat entry match with ip addr",
-							nonnat_iface_ipv4_addr[cnt]);
-
-					rule->private_ip = rule->public_ip;
-					rule->private_port = rule->public_port;
-					return true;
-				}
-			}
-		}
-		IPACMDBG_H("Not mtaching with non-nat ifaces\n");
-	}
-	else
-		IPACMDBG("In STA mode, don't compare against non nat ifaces\n");
-
-	if(pConfig == NULL)
-	{
-		pConfig = IPACM_Config::GetInstance();
-		if(pConfig == NULL)
-		{
-			IPACMERR("Unable to get Config instance\n");
-			return false;
-		}
-	}
-
-	if (pConfig->isPrivateSubnet(rule->private_ip) ||
-		pConfig->isPrivateSubnet(rule->target_ip))
-	{
-		IPACMDBG("Matching with Private subnet\n");
-		*isTempEntry = true;
-		return true;
-	}
-
-	return false;
-}
-
-void IPACM_ConntrackListener::AddORDeleteNatEntry(const nat_entry_bundle *input)
-{
-	u_int8_t tcp_state;
-
-	if (nat_inst == NULL)
-	{
-		IPACMERR("Nat instance is NULL, unable to add or delete\n");
-		return;
-	}
-
-	IPACMDBG_H("Below Nat Entry will either be added or deleted\n");
-	iptodot("AddORDeleteNatEntry(): target ip or dst ip",
-			input->rule->target_ip);
-	IPACMDBG("target port or dst port: 0x%x Decimal:%d\n",
-			 input->rule->target_port, input->rule->target_port);
-	iptodot("AddORDeleteNatEntry(): private ip or src ip",
-			input->rule->private_ip);
-	IPACMDBG("private port or src port: 0x%x, Decimal:%d\n",
-			 input->rule->private_port, input->rule->private_port);
-	IPACMDBG("public port or reply dst port: 0x%x, Decimal:%d\n",
-			 input->rule->public_port, input->rule->public_port);
-	IPACMDBG("Protocol: %d, destination nat flag: %d\n",
-			 input->rule->protocol, input->rule->dst_nat);
-
-	if (IPPROTO_TCP == input->rule->protocol)
-	{
-		tcp_state = nfct_get_attr_u8(input->ct, ATTR_TCP_STATE);
-		if (TCP_CONNTRACK_ESTABLISHED == tcp_state)
-		{
-			IPACMDBG("TCP state TCP_CONNTRACK_ESTABLISHED(%d)\n", tcp_state);
-			if (!CtList->isWanUp())
-			{
-				IPACMDBG("Wan is not up, cache connections\n");
-				nat_inst->CacheEntry(input->rule);
-			}
-			else if (input->isTempEntry)
-			{
-				nat_inst->AddTempEntry(input->rule);
-			}
-			else
-			{
-				nat_inst->AddEntry(input->rule);
-			}
-		}
-		else if (TCP_CONNTRACK_FIN_WAIT == tcp_state ||
-				   input->type == NFCT_T_DESTROY)
-		{
-			IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d) "
-					 "or type NFCT_T_DESTROY(%d)\n", tcp_state, input->type);
-
-			nat_inst->DeleteEntry(input->rule);
-			nat_inst->DeleteTempEntry(input->rule);
-		}
-		else
-		{
-			IPACMDBG("Ignore tcp state: %d and type: %d\n",
-					 tcp_state, input->type);
-		}
-
-	}
-	else if (IPPROTO_UDP == input->rule->protocol)
-	{
-		if (NFCT_T_NEW == input->type)
-		{
-			IPACMDBG("New UDP connection at time %ld\n", time(NULL));
-			if (!CtList->isWanUp())
-			{
-				IPACMDBG("Wan is not up, cache connections\n");
-				nat_inst->CacheEntry(input->rule);
-			}
-			else if (input->isTempEntry)
-			{
-				nat_inst->AddTempEntry(input->rule);
-			}
-			else
-			{
-				nat_inst->AddEntry(input->rule);
-			}
-		}
-		else if (NFCT_T_DESTROY == input->type)
-		{
-			IPACMDBG("UDP connection close at time %ld\n", time(NULL));
-			nat_inst->DeleteEntry(input->rule);
-			nat_inst->DeleteTempEntry(input->rule);
-		}
-	}
-
-	return;
-}
-
-void IPACM_ConntrackListener::PopulateTCPorUDPEntry(
-	 struct nf_conntrack *ct,
-	 uint32_t status,
-	 nat_table_entry *rule)
-{
-	if (IPS_DST_NAT == status)
-	{
-		IPACMDBG("Destination NAT\n");
-		rule->dst_nat = true;
-
-		IPACMDBG("Parse reply tuple\n");
-		rule->target_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
-		rule->target_ip = ntohl(rule->target_ip);
-		iptodot("PopulateTCPorUDPEntry(): target ip", rule->target_ip);
-
-		/* Retriev target/dst port */
-		rule->target_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
-		rule->target_port = ntohs(rule->target_port);
-		if (0 == rule->target_port)
-		{
-			IPACMDBG("unable to retrieve target port\n");
-		}
-
-		rule->public_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
-		rule->public_port = ntohs(rule->public_port);
-
-		/* Retriev src/private ip address */
-		rule->private_ip = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC);
-		rule->private_ip = ntohl(rule->private_ip);
-		iptodot("PopulateTCPorUDPEntry(): private ip", rule->private_ip);
-		if (0 == rule->private_ip)
-		{
-			IPACMDBG("unable to retrieve private ip address\n");
-		}
-
-		/* Retriev src/private port */
-		rule->private_port = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
-		rule->private_port = ntohs(rule->private_port);
-		if (0 == rule->private_port)
-		{
-			IPACMDBG("unable to retrieve private port\n");
-		}
-	}
-	else if (IPS_SRC_NAT == status)
-	{
-		IPACMDBG("Source NAT\n");
-		rule->dst_nat = false;
-
-		/* Retriev target/dst ip address */
-		IPACMDBG("Parse source tuple\n");
-		rule->target_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST);
-		rule->target_ip = ntohl(rule->target_ip);
-		iptodot("PopulateTCPorUDPEntry(): target ip", rule->target_ip);
-		if (0 == rule->target_ip)
-		{
-			IPACMDBG("unable to retrieve target ip address\n");
-		}
-		/* Retriev target/dst port */
-		rule->target_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
-		rule->target_port = ntohs(rule->target_port);
-		if (0 == rule->target_port)
-		{
-			IPACMDBG("unable to retrieve target port\n");
-		}
-
-		/* Retriev public port */
-		rule->public_port = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
-		rule->public_port = ntohs(rule->public_port);
-		if (0 == rule->public_port)
-		{
-			IPACMDBG("unable to retrieve public port\n");
-		}
-
-		/* Retriev src/private ip address */
-		rule->private_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
-		rule->private_ip = ntohl(rule->private_ip);
-		iptodot("PopulateTCPorUDPEntry(): private ip", rule->private_ip);
-		if (0 == rule->private_ip)
-		{
-			IPACMDBG("unable to retrieve private ip address\n");
-		}
-
-		/* Retriev src/private port */
-		rule->private_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
-		rule->private_port = ntohs(rule->private_port);
-		if (0 == rule->private_port)
-		{
-			IPACMDBG("unable to retrieve private port\n");
-		}
-	}
-
-	return;
-}
-
-#ifdef CT_OPT
-void IPACM_ConntrackListener::HandleLan2Lan(struct nf_conntrack *ct,
-	enum nf_conntrack_msg_type type,
-	 nat_table_entry *rule)
-{
-	ipacm_event_connection lan2lan_conn = { 0 };
-
-	if (p_lan2lan == NULL)
-	{
-		IPACMERR("Lan2Lan Instance is null\n");
-		return;
-	}
-
-	lan2lan_conn.iptype = IPA_IP_v4;
-	lan2lan_conn.src_ipv4_addr = orig_src_ip;
-	lan2lan_conn.dst_ipv4_addr = orig_dst_ip;
-
-	if (((IPPROTO_UDP == rule->protocol) && (NFCT_T_NEW == type)) ||
-		((IPPROTO_TCP == rule->protocol) && (nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_ESTABLISHED)))
-	{
-		p_lan2lan->handle_new_connection(&lan2lan_conn);
-	}
-	else if ((IPPROTO_UDP == rule->protocol && NFCT_T_DESTROY == type) ||
-			   (IPPROTO_TCP == rule->protocol &&
-				nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_FIN_WAIT))
-	{
-		p_lan2lan->handle_del_connection(&lan2lan_conn);
-	}
-}
-#endif
-
-void IPACM_ConntrackListener::CheckSTAClient(
-   const nat_table_entry *rule, bool *isTempEntry)
-{
-	int nCnt;
-
-	/* Check whether target is in STA client list or not
-      if not ignore the connection */
-	 if(!isStaMode || (StaClntCnt == 0))
-	 {
-		return;
-	 }
-
-	 if((sta_clnt_ipv4_addr[0] & STA_CLNT_SUBNET_MASK) !=
-		 (rule->target_ip & STA_CLNT_SUBNET_MASK))
-	 {
-		IPACMDBG("STA client subnet mask not matching\n");
-		return;
-	 }
-
-	 IPACMDBG("StaClntCnt %d\n", StaClntCnt);
-	 for(nCnt = 0; nCnt < StaClntCnt; nCnt++)
-	 {
-		IPACMDBG("Comparing trgt_ip 0x%x with sta clnt ip: 0x%x\n",
-			 rule->target_ip, sta_clnt_ipv4_addr[nCnt]);
-		if(rule->target_ip == sta_clnt_ipv4_addr[nCnt])
-		{
-			IPACMDBG("Match index %d\n", nCnt);
-			return;
-		}
-	 }
-
-	IPACMDBG_H("Not matching with STA Clnt Ip Addrs 0x%x\n",
-		rule->target_ip);
-	*isTempEntry = true;
-}
-
-/* conntrack send in host order and ipa expects in host order */
-void IPACM_ConntrackListener::ProcessTCPorUDPMsg(
-	 struct nf_conntrack *ct,
-	 enum nf_conntrack_msg_type type,
-	 u_int8_t l4proto)
-{
-	 nat_table_entry rule;
-	 uint32_t status = 0;
-	 uint32_t orig_src_ip, orig_dst_ip;
-	 bool isAdd = false;
-
-	 nat_entry_bundle nat_entry;
-	 nat_entry.isTempEntry = false;
-	 nat_entry.ct = ct;
-	 nat_entry.type = type;
-
- 	 memset(&rule, 0, sizeof(rule));
-	 IPACMDBG("Received type:%d with proto:%d\n", type, l4proto);
-	 status = nfct_get_attr_u32(ct, ATTR_STATUS);
-
-	 /* Retrieve Protocol */
-	 rule.protocol = nfct_get_attr_u8(ct, ATTR_REPL_L4PROTO);
-
-	 if(IPS_DST_NAT & status)
-	 {
-		 status = IPS_DST_NAT;
-	 }
-	 else if(IPS_SRC_NAT & status)
-	 {
-		 status = IPS_SRC_NAT;
-	 }
-	 else
-	 {
-		 IPACMDBG("Neither Destination nor Source nat flag Set\n");
-		 orig_src_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
-		 orig_src_ip = ntohl(orig_src_ip);
-		 if(orig_src_ip == 0)
-		 {
-			 IPACMERR("unable to retrieve orig src ip address\n");
-			 return;
-		 }
-
-		 orig_dst_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST);
-		 orig_dst_ip = ntohl(orig_dst_ip);
-		 if(orig_dst_ip == 0)
-		 {
-			 IPACMERR("unable to retrieve orig dst ip address\n");
-			 return;
-		 }
-
-		if(orig_src_ip == wan_ipaddr)
-		{
-			IPACMDBG("orig src ip:0x%x equal to wan ip\n",orig_src_ip);
-			status = IPS_SRC_NAT;
-		}
-		else if(orig_dst_ip == wan_ipaddr)
-		{
-			IPACMDBG("orig Dst IP:0x%x equal to wan ip\n",orig_dst_ip);
-			status = IPS_DST_NAT;
-		}
-		else
-		{
-			IPACMDBG_H("Neither orig src ip:0x%x Nor orig Dst IP:0x%x equal to wan ip:0x%x\n",
-					   orig_src_ip, orig_dst_ip, wan_ipaddr);
-
-#ifdef CT_OPT
-			HandleLan2Lan(ct, type, &rule);
-#endif
-			return;
-		}
-	 }
-
-	 if(IPS_DST_NAT == status || IPS_SRC_NAT == status)
-	 {
-		 PopulateTCPorUDPEntry(ct, status, &rule);
-		 rule.public_ip = wan_ipaddr;
-	 }
-	 else
-	 {
-		 IPACMDBG("Neither source Nor destination nat\n");
-		 goto IGNORE;
-	 }
-
-	 if (rule.private_ip != wan_ipaddr)
-	 {
-		 isAdd = AddIface(&rule, &nat_entry.isTempEntry);
-		 if (!isAdd)
-		 {
-			 goto IGNORE;
-		 }
-	 }
-	 else
-	 {
-		 if (isStaMode)
-		 {
-			 IPACMDBG("In STA mode, ignore connections destinated to STA interface\n");
-			 goto IGNORE;
-		 }
-
-		 IPACMDBG("For embedded connections add dummy nat rule\n");
-		 IPACMDBG("Change private port %d to %d\n",
-				  rule.private_port, rule.public_port);
-		 rule.private_port = rule.public_port;
-	 }
-
-	 CheckSTAClient(&rule, &nat_entry.isTempEntry);
-	 nat_entry.rule = &rule;
-	 AddORDeleteNatEntry(&nat_entry);
-	 return;
-
-IGNORE:
-	IPACMDBG_H("ignoring below Nat Entry\n");
-	iptodot("ProcessTCPorUDPMsg(): target ip or dst ip", rule.target_ip);
-	IPACMDBG("target port or dst port: 0x%x Decimal:%d\n", rule.target_port, rule.target_port);
-	iptodot("ProcessTCPorUDPMsg(): private ip or src ip", rule.private_ip);
-	IPACMDBG("private port or src port: 0x%x, Decimal:%d\n", rule.private_port, rule.private_port);
-	IPACMDBG("public port or reply dst port: 0x%x, Decimal:%d\n", rule.public_port, rule.public_port);
-	IPACMDBG("Protocol: %d, destination nat flag: %d\n", rule.protocol, rule.dst_nat);
-	return;
-}
-
-void IPACM_ConntrackListener::HandleSTAClientAddEvt(uint32_t clnt_ip_addr)
-{
-	 int cnt;
-	 IPACMDBG_H("Received STA client 0x%x\n", clnt_ip_addr);
-
-	 if(StaClntCnt >= MAX_STA_CLNT_IFACES)
-	 {
-		IPACMDBG("Max STA client reached, ignore 0x%x\n", clnt_ip_addr);
-		return;
-	 }
-
-	 for(cnt=0; cnt<MAX_STA_CLNT_IFACES; cnt++)
-	 {
-		if(sta_clnt_ipv4_addr[cnt] != 0 &&
-		 sta_clnt_ipv4_addr[cnt] == clnt_ip_addr)
-		{
-			IPACMDBG("Ignoring duplicate one 0x%x\n", clnt_ip_addr);
-			break;
-		}
-
-		if(sta_clnt_ipv4_addr[cnt] == 0)
-		{
-			IPACMDBG("Adding STA client 0x%x at Index: %d\n",
-					clnt_ip_addr, cnt);
-			sta_clnt_ipv4_addr[cnt] = clnt_ip_addr;
-			StaClntCnt++;
-			IPACMDBG("STA client cnt %d\n", StaClntCnt);
-			break;
-		}
-
-	 }
-
-	 nat_inst->FlushTempEntries(clnt_ip_addr, true);
-	 return;
-}
-
-void IPACM_ConntrackListener::HandleSTAClientDelEvt(uint32_t clnt_ip_addr)
-{
-	 int cnt;
-	 IPACMDBG_H("Received STA client 0x%x\n", clnt_ip_addr);
-
-	 for(cnt=0; cnt<MAX_STA_CLNT_IFACES; cnt++)
-	 {
-		if(sta_clnt_ipv4_addr[cnt] != 0 &&
-		 sta_clnt_ipv4_addr[cnt] == clnt_ip_addr)
-		{
-			IPACMDBG("Deleting STA client 0x%x at index: %d\n",
-					clnt_ip_addr, cnt);
-			sta_clnt_ipv4_addr[cnt] = 0;
-			nat_inst->DelEntriesOnSTAClntDiscon(clnt_ip_addr);
-			StaClntCnt--;
-			IPACMDBG("STA client cnt %d\n", StaClntCnt);
-			break;
-		}
-	 }
-
-	 nat_inst->FlushTempEntries(clnt_ip_addr, false);
-   return;
-}
diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp
deleted file mode 100644
index f0bdd99..0000000
--- a/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ /dev/null
@@ -1,969 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#include "IPACM_Conntrack_NATApp.h"
-#include "IPACM_ConntrackClient.h"
-
-#define INVALID_IP_ADDR 0x0
-
-/* NatApp class Implementation */
-NatApp *NatApp::pInstance = NULL;
-NatApp::NatApp()
-{
-	max_entries = 0;
-	cache = NULL;
-
-	nat_table_hdl = 0;
-	pub_ip_addr = 0;
-
-	curCnt = 0;
-
-	pALGPorts = NULL;
-	nALGPort = 0;
-
-	ct = NULL;
-	ct_hdl = NULL;
-
-	memset(temp, 0, sizeof(temp));
-}
-
-int NatApp::Init(void)
-{
-	IPACM_Config *pConfig;
-	int size = 0;
-
-	pConfig = IPACM_Config::GetInstance();
-	if(pConfig == NULL)
-	{
-		IPACMERR("Unable to get Config instance\n");
-		return -1;
-	}
-
-	max_entries = pConfig->GetNatMaxEntries();
-
-	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;
-	}
-	IPACMDBG("Allocated %d bytes for config manager nat cache\n", size);
-	memset(cache, 0, size);
-
-	nALGPort = pConfig->GetAlgPortCnt();
-	if(nALGPort > 0)
-	{
-		pALGPorts = (ipacm_alg *)malloc(sizeof(ipacm_alg) * nALGPort);
-		if(pALGPorts == NULL)
-		{
-			IPACMERR("Unable to allocate memory for alg prots\n");
-			goto fail;
-		}
-		memset(pALGPorts, 0, sizeof(ipacm_alg) * nALGPort);
-
-		if(pConfig->GetAlgPorts(nALGPort, pALGPorts) != 0)
-		{
-			IPACMERR("Unable to retrieve ALG prots\n");
-			goto fail;
-		}
-
-		IPACMDBG("Printing %d alg ports information\n", nALGPort);
-		for(int cnt=0; cnt<nALGPort; cnt++)
-		{
-			IPACMDBG("%d: Proto[%d], port[%d]\n", cnt, pALGPorts[cnt].protocol, pALGPorts[cnt].port);
-		}
-	}
-
-	return 0;
-
-fail:
-	free(cache);
-	free(pALGPorts);
-	return -1;
-}
-
-NatApp* NatApp::GetInstance()
-{
-	if(pInstance == NULL)
-	{
-		pInstance = new NatApp();
-
-		if(pInstance->Init())
-		{
-			delete pInstance;
-			return NULL;
-		}
-	}
-
-	return pInstance;
-}
-
-/* NAT APP related object function definitions */
-
-int NatApp::AddTable(uint32_t pub_ip)
-{
-	int ret;
-	int cnt = 0;
-	ipa_nat_ipv4_rule nat_rule;
-	IPACMDBG_H("%s() %d\n", __FUNCTION__, __LINE__);
-
-	/* Not reset the cache wait it timeout by destroy event */
-#if 0
-	if (pub_ip != pub_ip_addr_pre)
-	{
-		IPACMDBG("Reset the cache because NAT-ipv4 different\n");
-		memset(cache, 0, sizeof(nat_table_entry) * max_entries);
-		curCnt = 0;
-	}
-#endif
-	ret = ipa_nat_add_ipv4_tbl(pub_ip, max_entries, &nat_table_hdl);
-	if(ret)
-	{
-		IPACMERR("unable to create nat table Error:%d\n", ret);
-		return ret;
-	}
-
-	/* Add back the cached NAT-entry */
-	if (pub_ip == pub_ip_addr_pre)
-	{
-		IPACMDBG("Restore the cache to ipa NAT-table\n");
-		for(cnt = 0; cnt < max_entries; cnt++)
-		{
-			if(cache[cnt].private_ip !=0)
-			{
-				memset(&nat_rule, 0 , sizeof(nat_rule));
-				nat_rule.private_ip = cache[cnt].private_ip;
-				nat_rule.target_ip = cache[cnt].target_ip;
-				nat_rule.target_port = cache[cnt].target_port;
-				nat_rule.private_port = cache[cnt].private_port;
-				nat_rule.public_port = cache[cnt].public_port;
-				nat_rule.protocol = cache[cnt].protocol;
-
-				if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0)
-				{
-					IPACMERR("unable to add the rule delete from cache\n");
-					memset(&cache[cnt], 0, sizeof(cache[cnt]));
-					curCnt--;
-					continue;
-				}
-				cache[cnt].enabled = true;
-
-				IPACMDBG("On wan-iface reset added below rule successfully\n");
-				iptodot("Private IP", nat_rule.private_ip);
-				iptodot("Target IP", nat_rule.target_ip);
-				IPACMDBG("Private Port:%d \t Target Port: %d\t", nat_rule.private_port, nat_rule.target_port);
-				IPACMDBG("Public Port:%d\n", nat_rule.public_port);
-				IPACMDBG("protocol: %d\n", nat_rule.protocol);
-			}
-		}
-	}
-
-	pub_ip_addr = pub_ip;
-	return 0;
-}
-
-void NatApp::Reset()
-{
-	int cnt = 0;
-
-	nat_table_hdl = 0;
-	pub_ip_addr = 0;
-	/* NAT tbl deleted, reset enabled bit */
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		cache[cnt].enabled = false;
-	}
-}
-
-int NatApp::DeleteTable(uint32_t pub_ip)
-{
-	int ret;
-	IPACMDBG_H("%s() %d\n", __FUNCTION__, __LINE__);
-
-	CHK_TBL_HDL();
-
-	if(pub_ip_addr != pub_ip)
-	{
-		IPACMDBG("Public ip address is not matching\n");
-		IPACMERR("unable to delete the nat table\n");
-		return -1;
-	}
-
-	ret = ipa_nat_del_ipv4_tbl(nat_table_hdl);
-	if(ret)
-	{
-		IPACMERR("unable to delete nat table Error: %d\n", ret);;
-		return ret;
-	}
-
-	pub_ip_addr_pre = pub_ip_addr;
-	Reset();
-	return 0;
-}
-
-/* Check for duplicate entries */
-bool NatApp::ChkForDup(const nat_table_entry *rule)
-{
-	int cnt = 0;
-	IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__);
-
-	for(; cnt < max_entries; cnt++)
-	{
-		if(cache[cnt].private_ip == rule->private_ip &&
-			 cache[cnt].target_ip == rule->target_ip &&
-			 cache[cnt].private_port ==  rule->private_port  &&
-			 cache[cnt].target_port == rule->target_port &&
-			 cache[cnt].protocol == rule->protocol)
-		{
-			log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\
-			rule->target_port,"Duplicate Rule\n");
-			return true;
-		}
-	}
-
-	return false;
-}
-
-/* Delete the entry from Nat table on connection close */
-int NatApp::DeleteEntry(const nat_table_entry *rule)
-{
-	int cnt = 0;
-	IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__);
-
-	log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\
-	rule->target_port,"for deletion\n");
-
-
-	for(; cnt < max_entries; cnt++)
-	{
-		if(cache[cnt].private_ip == rule->private_ip &&
-			 cache[cnt].target_ip == rule->target_ip &&
-			 cache[cnt].private_port ==  rule->private_port  &&
-			 cache[cnt].target_port == rule->target_port &&
-			 cache[cnt].protocol == rule->protocol)
-		{
-
-			if(cache[cnt].enabled == true)
-			{
-				if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0)
-				{
-					IPACMERR("%s() %d deletion failed\n", __FUNCTION__, __LINE__);
-				}
-
-				IPACMDBG_H("Deleted Nat entry(%d) Successfully\n", cnt);
-			}
-			else
-			{
-				IPACMDBG_H("Deleted Nat entry(%d) only from cache\n", cnt);
-			}
-
-			memset(&cache[cnt], 0, sizeof(cache[cnt]));
-			curCnt--;
-			break;
-		}
-	}
-
-	return 0;
-}
-
-/* Add new entry to the nat table on new connection */
-int NatApp::AddEntry(const nat_table_entry *rule)
-{
-	int cnt = 0;
-	ipa_nat_ipv4_rule nat_rule;
-
-	IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__);
-
-	CHK_TBL_HDL();
-	log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\
-	rule->target_port,"for addition\n");
-	if(isAlgPort(rule->protocol, rule->private_port) ||
-		 isAlgPort(rule->protocol, rule->target_port))
-	{
-		IPACMERR("connection using ALG Port, ignore\n");
-		return -1;
-	}
-
-	if(rule->private_ip == 0 ||
-		 rule->target_ip == 0 ||
-		 rule->private_port == 0  ||
-		 rule->target_port == 0 ||
-		 rule->protocol == 0)
-	{
-		IPACMERR("Invalid Connection, ignoring it\n");
-		return 0;
-	}
-
-	if(!ChkForDup(rule))
-	{
-		for(; cnt < max_entries; cnt++)
-		{
-			if(cache[cnt].private_ip == 0 &&
-				 cache[cnt].target_ip == 0 &&
-				 cache[cnt].private_port == 0  &&
-				 cache[cnt].target_port == 0 &&
-				 cache[cnt].protocol == 0)
-			{
-				break;
-			}
-		}
-
-		if(max_entries == cnt)
-		{
-			IPACMERR("Error: Unable to add, reached maximum rules\n");
-			return -1;
-		}
-		else
-		{
-			nat_rule.private_ip = rule->private_ip;
-			nat_rule.target_ip = rule->target_ip;
-			nat_rule.target_port = rule->target_port;
-			nat_rule.private_port = rule->private_port;
-			nat_rule.public_port = rule->public_port;
-			nat_rule.protocol = rule->protocol;
-
-			if(isPwrSaveIf(rule->private_ip) ||
-				 isPwrSaveIf(rule->target_ip))
-			{
-				IPACMDBG("Device is Power Save mode: Dont insert into nat table but cache\n");
-				cache[cnt].enabled = false;
-				cache[cnt].rule_hdl = 0;
-			}
-			else
-			{
-
-				if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0)
-				{
-					IPACMERR("unable to add the rule\n");
-					return -1;
-				}
-
-				cache[cnt].enabled = true;
-			}
-
-			cache[cnt].private_ip = rule->private_ip;
-			cache[cnt].target_ip = rule->target_ip;
-			cache[cnt].target_port = rule->target_port;
-			cache[cnt].private_port = rule->private_port;
-			cache[cnt].protocol = rule->protocol;
-			cache[cnt].timestamp = 0;
-			cache[cnt].public_port = rule->public_port;
-			cache[cnt].dst_nat = rule->dst_nat;
-			curCnt++;
-		}
-
-	}
-	else
-	{
-		IPACMERR("Duplicate rule. Ignore it\n");
-		return -1;
-	}
-
-	if(cache[cnt].enabled == true)
-	{
-		IPACMDBG_H("Added rule(%d) successfully\n", cnt);
-	}
-  else
-  {
-    IPACMDBG_H("Cached rule(%d) successfully\n", cnt);
-  }
-
-	return 0;
-}
-
-void NatApp::UpdateCTUdpTs(nat_table_entry *rule, uint32_t new_ts)
-{
-	int ret;
-
-	iptodot("Private IP:", rule->private_ip);
-	iptodot("Target IP:",  rule->target_ip);
-	IPACMDBG("Private Port: %d, Target Port: %d\n", rule->private_port, rule->target_port);
-
-	if(!ct_hdl)
-	{
-		ct_hdl = nfct_open(CONNTRACK, 0);
-		if(!ct_hdl)
-		{
-			PERROR("nfct_open");
-			return;
-		}
-	}
-
-	if(!ct)
-	{
-		ct = nfct_new();
-		if(!ct)
-		{
-			PERROR("nfct_new");
-			return;
-		}
-	}
-
-	nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET);
-	if(rule->protocol == IPPROTO_UDP)
-	{
-		nfct_set_attr_u8(ct, ATTR_L4PROTO, rule->protocol);
-		nfct_set_attr_u32(ct, ATTR_TIMEOUT, udp_timeout);
-	}
-	else
-	{
-		nfct_set_attr_u8(ct, ATTR_L4PROTO, rule->protocol);
-		nfct_set_attr_u32(ct, ATTR_TIMEOUT, tcp_timeout);
-	}
-
-	if(rule->dst_nat == false)
-	{
-		nfct_set_attr_u32(ct, ATTR_IPV4_SRC, htonl(rule->private_ip));
-		nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(rule->private_port));
-
-		nfct_set_attr_u32(ct, ATTR_IPV4_DST, htonl(rule->target_ip));
-		nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(rule->target_port));
-
-		IPACMDBG("dst nat is not set\n");
-	}
-	else
-	{
-		nfct_set_attr_u32(ct, ATTR_IPV4_SRC, htonl(rule->target_ip));
-		nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(rule->target_port));
-
-		nfct_set_attr_u32(ct, ATTR_IPV4_DST, htonl(pub_ip_addr));
-		nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(rule->public_port));
-
-		IPACMDBG("dst nat is set\n");
-	}
-
-	iptodot("Source IP:", nfct_get_attr_u32(ct, ATTR_IPV4_SRC));
-	iptodot("Destination IP:",  nfct_get_attr_u32(ct, ATTR_IPV4_DST));
-	IPACMDBG("Source Port: %d, Destination Port: %d\n",
-					 nfct_get_attr_u16(ct, ATTR_PORT_SRC), nfct_get_attr_u16(ct, ATTR_PORT_DST));
-
-	IPACMDBG("updating %d connection with time: %d\n",
-					 rule->protocol, nfct_get_attr_u32(ct, ATTR_TIMEOUT));
-
-	ret = nfct_query(ct_hdl, NFCT_Q_UPDATE, ct);
-	if(ret == -1)
-	{
-		IPACMERR("unable to update time stamp");
-		DeleteEntry(rule);
-	}
-	else
-	{
-		rule->timestamp = new_ts;
-		IPACMDBG("Updated time stamp successfully\n");
-	}
-
-	return;
-}
-
-void NatApp::UpdateUDPTimeStamp()
-{
-	int cnt;
-	uint32_t ts;
-	bool read_to = false;
-
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		ts = 0;
-		if(cache[cnt].enabled == true &&
-		   (cache[cnt].private_ip != cache[cnt].public_ip))
-		{
-			IPACMDBG("\n");
-			if(ipa_nat_query_timestamp(nat_table_hdl, cache[cnt].rule_hdl, &ts) < 0)
-			{
-				IPACMERR("unable to retrieve timeout for rule hanle: %d\n", cache[cnt].rule_hdl);
-				continue;
-			}
-
-			if(cache[cnt].timestamp == ts)
-			{
-				IPACMDBG("No Change in Time Stamp: cahce:%d, ipahw:%d\n",
-								                  cache[cnt].timestamp, ts);
-				continue;
-			}
-
-			if (read_to == false) {
-				read_to = true;
-				Read_TcpUdp_Timeout();
-			}
-
-			UpdateCTUdpTs(&cache[cnt], ts);
-		} /* end of outer if */
-
-	} /* end of for loop */
-
-}
-
-bool NatApp::isAlgPort(uint8_t proto, uint16_t port)
-{
-	int cnt;
-	for(cnt = 0; cnt < nALGPort; cnt++)
-	{
-		if(proto == pALGPorts[cnt].protocol &&
-			 port == pALGPorts[cnt].port)
-		{
-			return true;
-		}
-	}
-
-	return false;
-}
-
-bool NatApp::isPwrSaveIf(uint32_t ip_addr)
-{
-	int cnt;
-
-	for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++)
-	{
-		if(0 != PwrSaveIfs[cnt] &&
-			 ip_addr == PwrSaveIfs[cnt])
-		{
-			return true;
-		}
-	}
-
-	return false;
-}
-
-int NatApp::UpdatePwrSaveIf(uint32_t client_lan_ip)
-{
-	int cnt;
-	IPACMDBG_H("Received IP address: 0x%x\n", client_lan_ip);
-
-	if(client_lan_ip == INVALID_IP_ADDR)
-	{
-		IPACMERR("Invalid ip address received\n");
-		return -1;
-	}
-
-	/* check for duplicate events */
-	for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++)
-	{
-		if(PwrSaveIfs[cnt] == client_lan_ip)
-		{
-			IPACMDBG("The client 0x%x is already in power save\n", client_lan_ip);
-			return 0;
-		}
-	}
-
-	for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++)
-	{
-		if(PwrSaveIfs[cnt] == 0)
-		{
-			PwrSaveIfs[cnt] = client_lan_ip;
-			break;
-		}
-	}
-
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		if(cache[cnt].private_ip == client_lan_ip &&
-			 cache[cnt].enabled == true)
-		{
-			if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0)
-			{
-				IPACMERR("unable to delete the rule\n");
-				continue;
-			}
-
-			cache[cnt].enabled = false;
-			cache[cnt].rule_hdl = 0;
-		}
-	}
-
-	return 0;
-}
-
-int NatApp::ResetPwrSaveIf(uint32_t client_lan_ip)
-{
-	int cnt;
-	ipa_nat_ipv4_rule nat_rule;
-
-	IPACMDBG_H("Received ip address: 0x%x\n", client_lan_ip);
-
-	if(client_lan_ip == INVALID_IP_ADDR)
-	{
-		IPACMERR("Invalid ip address received\n");
-		return -1;
-	}
-
-	for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++)
-	{
-		if(PwrSaveIfs[cnt] == client_lan_ip)
-		{
-			PwrSaveIfs[cnt] = 0;
-			break;
-		}
-	}
-
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		IPACMDBG("cache (%d): enable %d, ip 0x%x\n", cnt, cache[cnt].enabled, cache[cnt].private_ip);
-
-		if(cache[cnt].private_ip == client_lan_ip &&
-			 cache[cnt].enabled == false)
-		{
-			memset(&nat_rule, 0 , sizeof(nat_rule));
-			nat_rule.private_ip = cache[cnt].private_ip;
-			nat_rule.target_ip = cache[cnt].target_ip;
-			nat_rule.target_port = cache[cnt].target_port;
-			nat_rule.private_port = cache[cnt].private_port;
-			nat_rule.public_port = cache[cnt].public_port;
-			nat_rule.protocol = cache[cnt].protocol;
-
-			if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0)
-			{
-				IPACMERR("unable to add the rule delete from cache\n");
-				memset(&cache[cnt], 0, sizeof(cache[cnt]));
-				curCnt--;
-				continue;
-			}
-			cache[cnt].enabled = true;
-
-			IPACMDBG("On power reset added below rule successfully\n");
-			iptodot("Private IP", nat_rule.private_ip);
-			iptodot("Target IP", nat_rule.target_ip);
-			IPACMDBG("Private Port:%d \t Target Port: %d\t", nat_rule.private_port, nat_rule.target_port);
-			IPACMDBG("Public Port:%d\n", nat_rule.public_port);
-			IPACMDBG("protocol: %d\n", nat_rule.protocol);
-
-		}
-	}
-
-	return -1;
-}
-
-uint32_t NatApp::GetTableHdl(uint32_t in_ip_addr)
-{
-	if(in_ip_addr == pub_ip_addr)
-	{
-		return nat_table_hdl;
-	}
-
-	return -1;
-}
-
-void NatApp::AddTempEntry(const nat_table_entry *new_entry)
-{
-	int cnt;
-
-	IPACMDBG("Received below Temp Nat entry\n");
-	iptodot("Private IP", new_entry->private_ip);
-	iptodot("Target IP", new_entry->target_ip);
-	IPACMDBG("Private Port: %d\t Target Port: %d\t", new_entry->private_port, new_entry->target_port);
-	IPACMDBG("protocolcol: %d\n", new_entry->protocol);
-
-	if(isAlgPort(new_entry->protocol, new_entry->private_port) ||
-		 isAlgPort(new_entry->protocol, new_entry->target_port))
-	{
-		IPACMDBG("connection using ALG Port. Dont insert into nat cache\n");
-		return;
-	}
-
-	if(ChkForDup(new_entry))
-	{
-		return;
-	}
-
-	for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++)
-	{
-		if(temp[cnt].private_ip == new_entry->private_ip &&
-			 temp[cnt].target_ip == new_entry->target_ip &&
-			 temp[cnt].private_port ==  new_entry->private_port  &&
-			 temp[cnt].target_port == new_entry->target_port &&
-			 temp[cnt].protocol == new_entry->protocol)
-		{
-			IPACMDBG("Received duplicate Temp entry\n");
-			return;
-		}
-	}
-
-	for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++)
-	{
-		if(temp[cnt].private_ip == 0 &&
-			 temp[cnt].target_ip == 0)
-		{
-			memcpy(&temp[cnt], new_entry, sizeof(nat_table_entry));
-			IPACMDBG("Added Temp Entry\n");
-			return;
-		}
-	}
-
-	IPACMDBG("Unable to add temp entry, cache full\n");
-	return;
-}
-
-void NatApp::DeleteTempEntry(const nat_table_entry *entry)
-{
-	int cnt;
-
-	IPACMDBG("Received below nat entry\n");
-	iptodot("Private IP", entry->private_ip);
-	iptodot("Target IP", entry->target_ip);
-	IPACMDBG("Private Port: %d\t Target Port: %d\n", entry->private_port, entry->target_port);
-	IPACMDBG("protocol: %d\n", entry->protocol);
-
-	for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++)
-	{
-		if(temp[cnt].private_ip == entry->private_ip &&
-			 temp[cnt].target_ip == entry->target_ip &&
-			 temp[cnt].private_port ==  entry->private_port  &&
-			 temp[cnt].target_port == entry->target_port &&
-			 temp[cnt].protocol == entry->protocol)
-		{
-			memset(&temp[cnt], 0, sizeof(nat_table_entry));
-			IPACMDBG("Delete Temp Entry\n");
-			return;
-		}
-	}
-
-	IPACMDBG("No Such Temp Entry exists\n");
-	return;
-}
-
-void NatApp::FlushTempEntries(uint32_t ip_addr, bool isAdd,
-		bool isDummy)
-{
-	int cnt;
-	int ret;
-
-	IPACMDBG_H("Received below with isAdd:%d ", isAdd);
-	iptodot("IP Address: ", ip_addr);
-
-	for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++)
-	{
-		if(temp[cnt].private_ip == ip_addr ||
-			 temp[cnt].target_ip == ip_addr)
-		{
-			if(isAdd)
-			{
-				if(temp[cnt].public_ip == pub_ip_addr)
-				{
-					if (isDummy) {
-						/* To avoild DL expections for non IPA path */
-						temp[cnt].private_ip = temp[cnt].public_ip;
-						temp[cnt].private_port = temp[cnt].public_port;
-						IPACMDBG("Flushing dummy temp rule");
-						iptodot("Private IP", temp[cnt].private_ip);
-					}
-
-					ret = AddEntry(&temp[cnt]);
-					if(ret)
-					{
-						IPACMERR("unable to add temp entry: %d\n", ret);
-						continue;
-					}
-				}
-			}
-			memset(&temp[cnt], 0, sizeof(nat_table_entry));
-		}
-	}
-
-	return;
-}
-
-int NatApp::DelEntriesOnClntDiscon(uint32_t ip_addr)
-{
-	int cnt, tmp = 0;
-	IPACMDBG_H("Received IP address: 0x%x\n", ip_addr);
-
-	if(ip_addr == INVALID_IP_ADDR)
-	{
-		IPACMERR("Invalid ip address received\n");
-		return -1;
-	}
-
-	for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++)
-	{
-		if(PwrSaveIfs[cnt] == ip_addr)
-		{
-			PwrSaveIfs[cnt] = 0;
-			IPACMDBG("Remove %d power save entry\n", cnt);
-			break;
-		}
-	}
-
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		if(cache[cnt].private_ip == ip_addr)
-		{
-			if(cache[cnt].enabled == true)
-			{
-				if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0)
-				{
-					IPACMERR("unable to delete the rule\n");
-					continue;
-				}
-				else
-				{
-					IPACMDBG("won't delete the rule\n");
-					cache[cnt].enabled = false;
-					tmp++;
-				}
-			}
-			IPACMDBG("won't delete the rule for entry %d, enabled %d\n",cnt, cache[cnt].enabled);
-		}
-	}
-
-	IPACMDBG("Deleted (but cached) %d entries\n", tmp);
-	return 0;
-}
-
-int NatApp::DelEntriesOnSTAClntDiscon(uint32_t ip_addr)
-{
-	int cnt, tmp = curCnt;
-	IPACMDBG_H("Received IP address: 0x%x\n", ip_addr);
-
-	if(ip_addr == INVALID_IP_ADDR)
-	{
-		IPACMERR("Invalid ip address received\n");
-		return -1;
-	}
-
-
-	for(cnt = 0; cnt < max_entries; cnt++)
-	{
-		if(cache[cnt].target_ip == ip_addr)
-		{
-			if(cache[cnt].enabled == true)
-			{
-				if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0)
-				{
-					IPACMERR("unable to delete the rule\n");
-					continue;
-				}
-			}
-
-			memset(&cache[cnt], 0, sizeof(cache[cnt]));
-			curCnt--;
-		}
-	}
-
-	IPACMDBG("Deleted %d entries\n", (tmp - curCnt));
-	return 0;
-}
-
-void NatApp::CacheEntry(const nat_table_entry *rule)
-{
-	int cnt;
-
-	if(rule->private_ip == 0 ||
-		 rule->target_ip == 0 ||
-		 rule->private_port == 0  ||
-		 rule->target_port == 0 ||
-		 rule->protocol == 0)
-	{
-		IPACMERR("Invalid Connection, ignoring it\n");
-		return;
-	}
-
-	if(!ChkForDup(rule))
-	{
-		for(cnt=0; cnt < max_entries; cnt++)
-		{
-			if(cache[cnt].private_ip == 0 &&
-				 cache[cnt].target_ip == 0 &&
-				 cache[cnt].private_port == 0  &&
-				 cache[cnt].target_port == 0 &&
-				 cache[cnt].protocol == 0)
-			{
-				break;
-			}
-		}
-
-		if(max_entries == cnt)
-		{
-			IPACMERR("Error: Unable to add, reached maximum rules\n");
-			return;
-		}
-		else
-		{
-			cache[cnt].enabled = false;
-			cache[cnt].rule_hdl = 0;
-			cache[cnt].private_ip = rule->private_ip;
-			cache[cnt].target_ip = rule->target_ip;
-			cache[cnt].target_port = rule->target_port;
-			cache[cnt].private_port = rule->private_port;
-			cache[cnt].protocol = rule->protocol;
-			cache[cnt].timestamp = 0;
-			cache[cnt].public_port = rule->public_port;
-			cache[cnt].public_ip = rule->public_ip;
-			cache[cnt].dst_nat = rule->dst_nat;
-			curCnt++;
-		}
-
-	}
-	else
-	{
-		IPACMERR("Duplicate rule. Ignore it\n");
-		return;
-	}
-
-	IPACMDBG("Cached rule(%d) successfully\n", cnt);
-	return;
-}
-
-void NatApp::Read_TcpUdp_Timeout(void) {
-	FILE *udp_fd = NULL, *tcp_fd = NULL;
-
-	/* Read UDP timeout value */
-	udp_fd = fopen(IPACM_UDP_FULL_FILE_NAME, "r");
-	if (udp_fd == NULL) {
-		IPACMERR("unable to open %s\n", IPACM_UDP_FULL_FILE_NAME);
-		goto fail;
-	}
-
-	if (fscanf(udp_fd, "%d", &udp_timeout) != 1) {
-		IPACMERR("Error reading udp timeout\n");
-	}
-	IPACMDBG_H("udp timeout value: %d\n", udp_timeout);
-
-
-	/* Read TCP timeout value */
-	tcp_fd = fopen(IPACM_TCP_FULL_FILE_NAME, "r");
-	if (tcp_fd == NULL) {
-		IPACMERR("unable to open %s\n", IPACM_TCP_FULL_FILE_NAME);
-		goto fail;
-	}
-
-
-	if (fscanf(tcp_fd, "%d", &tcp_timeout) != 1) {
-		IPACMERR("Error reading tcp timeout\n");
-	}
-	IPACMDBG_H("tcp timeout value: %d\n", tcp_timeout);
-
-fail:
-	if (udp_fd) {
-		fclose(udp_fd);
-	}
-	if (tcp_fd) {
-		fclose(tcp_fd);
-	}
-
-	return;
-}
diff --git a/ipacm/src/IPACM_EvtDispatcher.cpp b/ipacm/src/IPACM_EvtDispatcher.cpp
deleted file mode 100644
index edb5901..0000000
--- a/ipacm/src/IPACM_EvtDispatcher.cpp
+++ /dev/null
@@ -1,214 +0,0 @@
-/* 
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_EvtDispatcher.cpp
-
-	@brief
-	This file implements the IPAM event dispatcher functionality
-
-	@Author
-
-*/
-#include <string.h>
-#include <pthread.h>
-#include <IPACM_EvtDispatcher.h>
-#include <IPACM_Neighbor.h>
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Defs.h"
-
-
-extern pthread_mutex_t mutex;
-extern pthread_cond_t  cond_var;
-
-cmd_evts *IPACM_EvtDispatcher::head = NULL;
-extern uint32_t ipacm_event_stats[IPACM_EVENT_MAX];
-
-int IPACM_EvtDispatcher::PostEvt
-(
-	 ipacm_cmd_q_data *data
-)
-{
-	Message *item = NULL;
-	MessageQueue *MsgQueue = NULL;
-
-	if(data->event < IPA_EXTERNAL_EVENT_MAX)
-	{
-		IPACMDBG("Insert event into external queue.\n");
-		MsgQueue = MessageQueue::getInstanceExternal();
-	}
-	else
-	{
-		IPACMDBG("Insert event into internal queue.\n");
-		MsgQueue = MessageQueue::getInstanceInternal();
-	}
-	if(MsgQueue == NULL)
-	{
-		IPACMERR("unable to retrieve MsgQueue instance\n");
-		return IPACM_FAILURE;
-	}
-
-	item = new Message();
-	if(item == NULL)
-	{
-		IPACMERR("unable to create new message item\n");
-		return IPACM_FAILURE;
-	}
-
-	item->evt.callback_ptr = IPACM_EvtDispatcher::ProcessEvt;
-	memcpy(&item->evt.data, data, sizeof(ipacm_cmd_q_data));
-
-	if(pthread_mutex_lock(&mutex) != 0)
-	{
-		IPACMERR("unable to lock the mutex\n");
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG("Enqueing item\n");
-	MsgQueue->enqueue(item);
-	IPACMDBG("Enqueued item %p\n", item);
-
-	if(pthread_cond_signal(&cond_var) != 0)
-	{
-		IPACMDBG("unable to lock the mutex\n");
-		/* Release the mutex before you return failure */
-		if(pthread_mutex_unlock(&mutex) != 0)
-		{
-			IPACMERR("unable to unlock the mutex\n");
-			return IPACM_FAILURE;
-		}
-		return IPACM_FAILURE;
-	}
-
-	if(pthread_mutex_unlock(&mutex) != 0)
-	{
-		IPACMERR("unable to unlock the mutex\n");
-		return IPACM_FAILURE;
-	}
-
-	return IPACM_SUCCESS;
-}
-
-void IPACM_EvtDispatcher::ProcessEvt(ipacm_cmd_q_data *data)
-{
-
-	cmd_evts *tmp = head, tmp1;
-
-	if(head == NULL)
-	{
-		IPACMDBG("Queue is empty\n");
-	}
-
-	while(tmp != NULL)
-	{
-	        memcpy(&tmp1, tmp, sizeof(tmp1));
-		if(data->event == tmp1.event)
-		{
-			ipacm_event_stats[data->event]++;
-			tmp1.obj->event_callback(data->event, data->evt_data);
-			IPACMDBG(" Find matched registered events\n");
-		}
-	        tmp = tmp1.next;
-	}
-
-	IPACMDBG(" Finished process events\n");
-			
-	if(data->evt_data != NULL)
-	{
-		IPACMDBG("free the event:%d data: %p\n", data->event, data->evt_data);
-		free(data->evt_data);
-	}
-	return;
-}
-
-int IPACM_EvtDispatcher::registr(ipa_cm_event_id event, IPACM_Listener *obj)
-{
-	cmd_evts *tmp = head,*nw;
-
-	nw = (cmd_evts *)malloc(sizeof(cmd_evts));
-	if(nw != NULL)
-	{
-		nw->event = event;
-		nw->obj = obj;
-		nw->next = NULL;
-	}
-	else
-	{
-		return IPACM_FAILURE;
-	}
-
-	if(head == NULL)
-	{
-		head = nw;
-	}
-	else
-	{
-		while(tmp->next)
-		{
-			tmp = tmp->next;
-		}
-		tmp->next = nw;
-	}
-	return IPACM_SUCCESS;
-}
-
-
-int IPACM_EvtDispatcher::deregistr(IPACM_Listener *param)
-{
-	cmd_evts *tmp = head,*tmp1,*prev = head;
-
-	while(tmp != NULL)
-	{
-		if(tmp->obj == param)
-		{
-			tmp1 = tmp;
-			if(tmp == head)
-			{
-				head = head->next;
-			}
-			else if(tmp->next == NULL)
-			{
-				prev->next = NULL;
-			}
-			else
-			{
-				prev->next = tmp->next;
-			}
-
-			tmp = tmp->next;
-			free(tmp1);
-		}
-		else
-		{
-			prev = tmp;
-			tmp = tmp->next;
-		}
-	}
-	return IPACM_SUCCESS;
-}
diff --git a/ipacm/src/IPACM_Filtering.cpp b/ipacm/src/IPACM_Filtering.cpp
deleted file mode 100644
index 22eb19c..0000000
--- a/ipacm/src/IPACM_Filtering.cpp
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Filtering.cpp
-
-	@brief
-	This file implements the IPACM filtering functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "IPACM_Filtering.h"
-#include <IPACM_Log.h>
-#include "IPACM_Defs.h"
-
-
-const char *IPACM_Filtering::DEVICE_NAME = "/dev/ipa";
-
-IPACM_Filtering::IPACM_Filtering()
-{
-	fd = open(DEVICE_NAME, O_RDWR);
-	if (fd < 0)
-	{
-		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
-	}
-}
-
-IPACM_Filtering::~IPACM_Filtering()
-{
-	close(fd);
-}
-
-bool IPACM_Filtering::DeviceNodeIsOpened()
-{
-	return fd;
-}
-
-bool IPACM_Filtering::AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTable)
-{
-	int retval = 0;
-
-	IPACMDBG("Printing filter add attributes\n");
-	IPACMDBG("ip type: %d\n", ruleTable->ip);
-	IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
-	IPACMDBG("End point: %d and global value: %d\n", ruleTable->ep, ruleTable->global);
-	IPACMDBG("commit value: %d\n", ruleTable->commit);
-	for (int cnt=0; cnt<ruleTable->num_rules; cnt++)
-	{
-		IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", cnt,
-				ruleTable->rules[cnt].rule.attrib.attrib_mask);
-	}
-
-	retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE, ruleTable);
-	if (retval != 0)
-	{
-		IPACMERR("Failed adding Filtering rule %p\n", ruleTable);
-		PERROR("unable to add filter rule:");
-
-		for (int cnt = 0; cnt < ruleTable->num_rules; cnt++)
-		{
-			if (ruleTable->rules[cnt].status != 0)
-			{
-				IPACMERR("Adding Filter rule:%d failed with status:%d\n",
-								 cnt, ruleTable->rules[cnt].status);
-			}
-		}
-		return false;
-	}
-
-	for (int cnt = 0; cnt<ruleTable->num_rules; cnt++)
-	{
-		if(ruleTable->rules[cnt].status != 0)
-		{
-			IPACMERR("Adding Filter rule:%d failed with status:%d\n",
-							 cnt, ruleTable->rules[cnt].status);
-		}
-	}
-
-	IPACMDBG("Added Filtering rule %p\n", ruleTable);
-	return true;
-}
-
-bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable)
-{
-#ifdef FEATURE_IPA_V3
-	int retval = 0;
-
-	IPACMDBG("Printing filter add attributes\n");
-	IPACMDBG("ip type: %d\n", ruleTable->ip);
-	IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
-	IPACMDBG("End point: %d\n", ruleTable->ep);
-	IPACMDBG("commit value: %d\n", ruleTable->commit);
-
-	retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable);
-
-	for (int cnt = 0; cnt<ruleTable->num_rules; cnt++)
-	{
-		if(ruleTable->rules[cnt].status != 0)
-		{
-			IPACMERR("Adding Filter rule:%d failed with status:%d\n",
-							 cnt, ruleTable->rules[cnt].status);
-		}
-	}
-
-	if (retval != 0)
-	{
-		IPACMERR("Failed adding Filtering rule %p\n", ruleTable);
-		return false;
-	}
-	IPACMDBG("Added Filtering rule %p\n", ruleTable);
-#endif
-	return true;
-}
-
-bool IPACM_Filtering::DeleteFilteringRule(struct ipa_ioc_del_flt_rule *ruleTable)
-{
-	int retval = 0;
-
-	retval = ioctl(fd, IPA_IOC_DEL_FLT_RULE, ruleTable);
-	if (retval != 0)
-	{
-		IPACMERR("Failed deleting Filtering rule %p\n", ruleTable);
-		return false;
-	}
-
-	IPACMDBG("Deleted Filtering rule %p\n", ruleTable);
-	return true;
-}
-
-bool IPACM_Filtering::Commit(enum ipa_ip_type ip)
-{
-	int retval = 0;
-
-	retval = ioctl(fd, IPA_IOC_COMMIT_FLT, ip);
-	if (retval != 0)
-	{
-		IPACMERR("failed committing Filtering rules.\n");
-		return false;
-	}
-
-	IPACMDBG("Committed Filtering rules to IPA HW.\n");
-	return true;
-}
-
-bool IPACM_Filtering::Reset(enum ipa_ip_type ip)
-{
-	int retval = 0;
-
-	retval = ioctl(fd, IPA_IOC_RESET_FLT, ip);
-	retval |= ioctl(fd, IPA_IOC_COMMIT_FLT, ip);
-	if (retval)
-	{
-		IPACMERR("failed resetting Filtering block.\n");
-		return false;
-	}
-
-	IPACMDBG("Reset command issued to IPA Filtering block.\n");
-	return true;
-}
-
-bool IPACM_Filtering::DeleteFilteringHdls
-(
-	 uint32_t *flt_rule_hdls,
-	 ipa_ip_type ip,
-	 uint8_t num_rules
-)
-{
-	struct ipa_ioc_del_flt_rule *flt_rule;
-	bool res = true;
-	int len = 0, cnt = 0;
-        const uint8_t UNIT_RULES = 1;
-
-	len = (sizeof(struct ipa_ioc_del_flt_rule)) + (UNIT_RULES * sizeof(struct ipa_flt_rule_del));
-	flt_rule = (struct ipa_ioc_del_flt_rule *)malloc(len);
-	if (flt_rule == NULL)
-	{
-		IPACMERR("unable to allocate memory for del filter rule\n");
-		return false;
-	}
-
-	for (cnt = 0; cnt < num_rules; cnt++)
-	{
-	    memset(flt_rule, 0, len);
-	    flt_rule->commit = 1;
-	    flt_rule->num_hdls = UNIT_RULES;
-	    flt_rule->ip = ip;
-
-	    if (flt_rule_hdls[cnt] == 0)
-	    {
-		   IPACMERR("invalid filter handle passed, ignoring it: %d\n", cnt)
-	    }
-            else
-	    {
-
-		   flt_rule->hdl[0].status = -1;
-		   flt_rule->hdl[0].hdl = flt_rule_hdls[cnt];
-		   IPACMDBG("Deleting filter hdl:(0x%x) with ip type: %d\n", flt_rule_hdls[cnt], ip);
-
-	           if (DeleteFilteringRule(flt_rule) == false)
-	           {
-		        PERROR("Filter rule deletion failed!\n");
-		        res = false;
-		        goto fail;
-	           }
-		   else
-	           {
-
-		        if (flt_rule->hdl[0].status != 0)
-		        {
-			     IPACMERR("Filter rule hdl 0x%x deletion failed with error:%d\n",
-		        					 flt_rule->hdl[0].hdl, flt_rule->hdl[0].status);
-			     res = false;
-			     goto fail;
-		        }
-		   }
-	    }
-	}
-
-fail:
-	free(flt_rule);
-
-	return res;
-}
-
-bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *rule_table_v4, struct ipa_ioc_add_flt_rule const * rule_table_v6, uint8_t mux_id)
-{
-	int ret = 0, cnt, num_rules = 0, pos = 0;
-	ipa_install_fltr_rule_req_msg_v01 qmi_rule_msg;
-#ifdef FEATURE_IPA_V3
-	ipa_install_fltr_rule_req_ex_msg_v01 qmi_rule_ex_msg;
-#endif
-
-	int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
-	if(fd_wwan_ioctl < 0)
-	{
-		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
-		return false;
-	}
-
-	if(rule_table_v4 != NULL)
-	{
-		num_rules += rule_table_v4->num_rules;
-		IPACMDBG_H("Get %d WAN DL IPv4 filtering rules.\n", rule_table_v4->num_rules);
-	}
-	if(rule_table_v6 != NULL)
-	{
-		num_rules += rule_table_v6->num_rules;
-		IPACMDBG_H("Get %d WAN DL IPv6 filtering rules.\n", rule_table_v6->num_rules);
-	}
-
-	/* if it is not IPA v3, use old QMI format */
-#ifndef FEATURE_IPA_V3
-	if(num_rules > QMI_IPA_MAX_FILTERS_V01)
-	{
-		IPACMERR("The number of filtering rules exceed limit.\n");
-		close(fd_wwan_ioctl);
-		return false;
-	}
-	else
-	{
-		memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg));
-
-		if (num_rules > 0)
-		{
-			qmi_rule_msg.filter_spec_list_valid = true;
-		}
-		else
-		{
-			qmi_rule_msg.filter_spec_list_valid = false;
-		}
-
-		qmi_rule_msg.filter_spec_list_len = num_rules;
-		qmi_rule_msg.source_pipe_index_valid = 0;
-
-		IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
-
-		if(rule_table_v4 != NULL)
-		{
-			for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
-			{
-				if (pos < QMI_IPA_MAX_FILTERS_V01)
-				{
-					qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
-					qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
-					qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
-					qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
-					qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
-					qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
-					qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
-					memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
-						&rule_table_v4->rules[cnt].rule.eq_attrib,
-						sizeof(struct ipa_filter_rule_type_v01));
-					pos++;
-				}
-				else
-				{
-					IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
-				}
-			}
-		}
-
-		if(rule_table_v6 != NULL)
-		{
-			for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
-			{
-				if (pos < QMI_IPA_MAX_FILTERS_V01)
-				{
-					qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos;
-					qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
-					qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
-					qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1;
-					qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
-					qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1;
-					qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id;
-					memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule,
-						&rule_table_v6->rules[cnt].rule.eq_attrib,
-						sizeof(struct ipa_filter_rule_type_v01));
-					pos++;
-				}
-				else
-				{
-					IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos);
-				}
-			}
-		}
-
-		ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE, &qmi_rule_msg);
-		if (ret != 0)
-		{
-			IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_msg, ret);
-			close(fd_wwan_ioctl);
-			return false;
-		}
-	}
-	/* if it is IPA v3, use new QMI format */
-#else
-	if(num_rules > QMI_IPA_MAX_FILTERS_EX_V01)
-	{
-		IPACMERR("The number of filtering rules exceed limit.\n");
-		close(fd_wwan_ioctl);
-		return false;
-	}
-	else
-	{
-		memset(&qmi_rule_ex_msg, 0, sizeof(qmi_rule_ex_msg));
-
-		if (num_rules > 0)
-		{
-			qmi_rule_ex_msg.filter_spec_ex_list_valid = true;
-		}
-		else
-		{
-			qmi_rule_ex_msg.filter_spec_ex_list_valid = false;
-		}
-		qmi_rule_ex_msg.filter_spec_ex_list_len = num_rules;
-		qmi_rule_ex_msg.source_pipe_index_valid = 0;
-
-		IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules);
-
-		if(rule_table_v4 != NULL)
-		{
-			for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--)
-			{
-				if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
-				{
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action);
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v4->rules[cnt].rule.rule_id;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v4->rules[cnt].rule.hashable;
-					memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
-						&rule_table_v4->rules[cnt].rule.eq_attrib,
-						sizeof(struct ipa_filter_rule_type_v01));
-
-					pos++;
-				}
-				else
-				{
-					IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
-				}
-			}
-		}
-
-		if(rule_table_v6 != NULL)
-		{
-			for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--)
-			{
-				if (pos < QMI_IPA_MAX_FILTERS_EX_V01)
-				{
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action);
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v6->rules[cnt].rule.rule_id;
-					qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v6->rules[cnt].rule.hashable;
-					memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule,
-						&rule_table_v6->rules[cnt].rule.eq_attrib,
-						sizeof(struct ipa_filter_rule_type_v01));
-
-					pos++;
-				}
-				else
-				{
-					IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos);
-				}
-			}
-		}
-
-		ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_EX, &qmi_rule_ex_msg);
-		if (ret != 0)
-		{
-			IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_ex_msg, ret);
-			close(fd_wwan_ioctl);
-			return false;
-		}
-	}
-#endif
-
-	close(fd_wwan_ioctl);
-	return true;
-}
-
-bool IPACM_Filtering::SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table)
-{
-	int ret = 0;
-	int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
-	if(fd_wwan_ioctl < 0)
-	{
-		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
-		return false;
-	}
-
-	ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_INDEX, table);
-	if (ret != 0)
-	{
-		IPACMERR("Failed adding filtering rule index %p with ret %d\n", table, ret);
-		close(fd_wwan_ioctl);
-		return false;
-	}
-
-	IPACMDBG("Added Filtering rule index %p\n", table);
-	close(fd_wwan_ioctl);
-	return true;
-}
-
-ipa_filter_action_enum_v01 IPACM_Filtering::GetQmiFilterAction(ipa_flt_action action)
-{
-	switch(action)
-	{
-	case IPA_PASS_TO_ROUTING:
-		return QMI_IPA_FILTER_ACTION_ROUTING_V01;
-
-	case IPA_PASS_TO_SRC_NAT:
-		return QMI_IPA_FILTER_ACTION_SRC_NAT_V01;
-
-	case IPA_PASS_TO_DST_NAT:
-		return QMI_IPA_FILTER_ACTION_DST_NAT_V01;
-
-	case IPA_PASS_TO_EXCEPTION:
-		return QMI_IPA_FILTER_ACTION_EXCEPTION_V01;
-
-	default:
-		return IPA_FILTER_ACTION_ENUM_MAX_ENUM_VAL_V01;
-	}
-}
-
-bool IPACM_Filtering::ModifyFilteringRule(struct ipa_ioc_mdfy_flt_rule* ruleTable)
-{
-	int i, ret = 0;
-
-	IPACMDBG("Printing filtering add attributes\n");
-	IPACMDBG("IP type: %d Number of rules: %d commit value: %d\n", ruleTable->ip, ruleTable->num_rules, ruleTable->commit);
-
-	for (i=0; i<ruleTable->num_rules; i++)
-	{
-		IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", i, ruleTable->rules[i].rule.attrib.attrib_mask);
-	}
-
-	ret = ioctl(fd, IPA_IOC_MDFY_FLT_RULE, ruleTable);
-	if (ret != 0)
-	{
-		IPACMERR("Failed modifying filtering rule %p\n", ruleTable);
-
-		for (i = 0; i < ruleTable->num_rules; i++)
-		{
-			if (ruleTable->rules[i].status != 0)
-			{
-				IPACMERR("Modifying filter rule %d failed\n", i);
-			}
-		}
-		return false;
-	}
-
-	IPACMDBG("Modified filtering rule %p\n", ruleTable);
-	return true;
-}
-
diff --git a/ipacm/src/IPACM_Header.cpp b/ipacm/src/IPACM_Header.cpp
deleted file mode 100644
index c77c69c..0000000
--- a/ipacm/src/IPACM_Header.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "IPACM_Header.h"
-#include "IPACM_Log.h"
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-//All interaction through the driver are made through this inode.
-static const char *DEVICE_NAME = "/dev/ipa";
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-IPACM_Header::IPACM_Header()
-{
-	m_fd = open(DEVICE_NAME, O_RDWR);
-	if (-1 == m_fd)
-	{
-		IPACMERR("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME);
-	}
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-IPACM_Header::~IPACM_Header()
-{
-	if (-1 != m_fd)
-	{
-		close(m_fd);
-	}
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::DeviceNodeIsOpened()
-{
-	return (-1 != m_fd);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::AddHeader(struct ipa_ioc_add_hdr *pHeaderTableToAdd)
-{
-	int nRetVal = 0;
-	//call the Driver ioctl in order to add header
-	nRetVal = ioctl(m_fd, IPA_IOC_ADD_HDR, pHeaderTableToAdd);
-	IPACMDBG("return value: %d\n", nRetVal);
-	return (-1 != nRetVal);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::DeleteHeader(struct ipa_ioc_del_hdr *pHeaderTableToDelete)
-{
-	int nRetVal = 0;
-	//call the Driver ioctl in order to remove header
-	nRetVal = ioctl(m_fd, IPA_IOC_DEL_HDR, pHeaderTableToDelete);
-	IPACMDBG("return value: %d\n", nRetVal);
-	return (-1 != nRetVal);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::Commit()
-{
-	int nRetVal = 0;
-	nRetVal = ioctl(m_fd, IPA_IOC_COMMIT_HDR);
-	IPACMDBG("return value: %d\n", nRetVal);
-	return true;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::Reset()
-{
-	int nRetVal = 0;
-
-	nRetVal = ioctl(m_fd, IPA_IOC_RESET_HDR);
-	nRetVal |= ioctl(m_fd, IPA_IOC_COMMIT_HDR);
-	IPACMDBG("return value: %d\n", nRetVal);
-	return true;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::GetHeaderHandle(struct ipa_ioc_get_hdr *pHeaderStruct)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_GET_HDR, pHeaderStruct);
-	if (retval)
-	{
-		IPACMERR("IPA_IOC_GET_HDR ioctl failed, routingTable =0x%p, retval=0x%x.\n", pHeaderStruct, retval);
-		return false;
-	}
-
-	IPACMDBG("IPA_IOC_GET_HDR ioctl issued to IPA header insertion block.\n");
-	return true;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-bool IPACM_Header::CopyHeader(struct ipa_ioc_copy_hdr *pCopyHeaderStruct)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_COPY_HDR, pCopyHeaderStruct);
-	if (retval)
-	{
-		IPACMERR("IPA_IOC_COPY_HDR ioctl failed, retval=0x%x.\n", retval);
-		return false;
-	}
-
-	IPACMDBG("IPA_IOC_COPY_HDR ioctl issued to IPA header insertion block.\n");
-	return true;
-}
-
-bool IPACM_Header::DeleteHeaderHdl(uint32_t hdr_hdl)
-{
-	const uint8_t NUM_HDLS = 1;
-	struct ipa_ioc_del_hdr *pHeaderDescriptor = NULL;
-	struct ipa_hdr_del *hd_rule_entry;
-	int len = 0;
-	bool res = true;
-
-	if (hdr_hdl == 0)
-	{
-		IPACMERR("Invalid header handle passed. Ignoring it\n");
-		return false;
-	}
-
-	len = (sizeof(struct ipa_ioc_del_hdr)) + (NUM_HDLS * sizeof(struct ipa_hdr_del));
-	pHeaderDescriptor = (struct ipa_ioc_del_hdr *)malloc(len);
-	if (pHeaderDescriptor == NULL)
-	{
-		IPACMERR("Unable to allocate memory for del header\n");
-		return false;
-	}
-
-	memset(pHeaderDescriptor, 0, len);
-	pHeaderDescriptor->commit = true;
-	pHeaderDescriptor->num_hdls = NUM_HDLS;
-	hd_rule_entry = &pHeaderDescriptor->hdl[0];
-
-	hd_rule_entry->hdl = hdr_hdl;
-	hd_rule_entry->status = -1;
-
-	IPACMDBG("Deleting Header hdl:(%x)\n", hd_rule_entry->hdl);
-	if ((false == DeleteHeader(pHeaderDescriptor)) ||
-			(hd_rule_entry->status))
-	{
-	    IPACMERR("Header hdl:(%x) deletion failed!  status: %d\n", hd_rule_entry->hdl,hd_rule_entry->status);
-		res = false;
-		goto fail;
-	}
-
-	IPACMDBG_H("Deleted Header hdl:(%x) successfully\n", hd_rule_entry->hdl);
-
-fail:
-	free(pHeaderDescriptor);
-
-	return res;
-
-}
-
-bool IPACM_Header::AddHeaderProcCtx(struct ipa_ioc_add_hdr_proc_ctx* pHeader)
-{
-	int ret = 0;
-	//call the Driver ioctl to add header processing context
-	ret = ioctl(m_fd, IPA_IOC_ADD_HDR_PROC_CTX, pHeader);
-	return (ret == 0);
-}
-
-bool IPACM_Header::DeleteHeaderProcCtx(uint32_t hdl)
-{
-	int len, ret;
-	struct ipa_ioc_del_hdr_proc_ctx* pHeaderTable = NULL;
-
-	len = sizeof(struct ipa_ioc_del_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_del);
-	pHeaderTable = (struct ipa_ioc_del_hdr_proc_ctx*)malloc(len);
-	if(pHeaderTable == NULL)
-	{
-		IPACMERR("Failed to allocate buffer.\n");
-		return false;
-	}
-	memset(pHeaderTable, 0, len);
-
-	pHeaderTable->commit = 1;
-	pHeaderTable->num_hdls = 1;
-	pHeaderTable->hdl[0].hdl = hdl;
-
-	ret = ioctl(m_fd, IPA_IOC_DEL_HDR_PROC_CTX, pHeaderTable);
-	if(ret != 0)
-	{
-		IPACMERR("Failed to delete hdr proc ctx: return value %d, status %d\n",
-			ret, pHeaderTable->hdl[0].status);
-	}
-	free(pHeaderTable);
-	return (ret == 0);
-}
-
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
deleted file mode 100644
index 84132c9..0000000
--- a/ipacm/src/IPACM_Iface.cpp
+++ /dev/null
@@ -1,995 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the following
-  disclaimer in the documentation and/or other materials provided
-  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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Z
-*/
-/*!
-  @file
-  IPACM_Iface.cpp
-
-  @brief
-  This file implements the basis Iface functionality.
-
-  @Author
-  Skylar Chang
-
-*/
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <IPACM_Netlink.h>
-#include <IPACM_Iface.h>
-#include <IPACM_Lan.h>
-#include <IPACM_Wan.h>
-#include <IPACM_Wlan.h>
-#include <string.h>
-
-extern "C"
-{
-#include <ifaddrs.h>
-}
-
-
-const char *IPACM_Iface::DEVICE_NAME = "/dev/ipa";
-IPACM_Routing IPACM_Iface::m_routing;
-IPACM_Filtering IPACM_Iface::m_filtering;
-IPACM_Header IPACM_Iface::m_header;
-
-IPACM_Config *IPACM_Iface::ipacmcfg = IPACM_Config::GetInstance();
-
-IPACM_Iface::IPACM_Iface(int iface_index)
-{
-	ip_type = IPACM_IP_NULL; /* initially set invalid */
-	num_dft_rt_v6 = 0;
-	softwarerouting_act = false;
-	ipa_if_num = iface_index;
-	ipa_if_cate = IPACM_Iface::ipacmcfg->iface_table[iface_index].if_cat;
-
-	iface_query = NULL;
-	tx_prop = NULL;
-	rx_prop = NULL;
-
-	memcpy(dev_name,
-				 IPACM_Iface::ipacmcfg->iface_table[iface_index].iface_name,
-				 sizeof(IPACM_Iface::ipacmcfg->iface_table[iface_index].iface_name));
-
-	memset(dft_v4fl_rule_hdl, 0, sizeof(dft_v4fl_rule_hdl));
-	memset(dft_v6fl_rule_hdl, 0, sizeof(dft_v6fl_rule_hdl));
-
-	memset(dft_rt_rule_hdl, 0, sizeof(dft_rt_rule_hdl));
-	memset(software_routing_fl_rule_hdl, 0, sizeof(software_routing_fl_rule_hdl));
-	memset(ipv6_addr, 0, sizeof(ipv6_addr));
-
-	query_iface_property();
-	IPACMDBG_H(" create iface-index(%d) constructor\n", ipa_if_num);
-	return;
-}
-
-/* software routing enable */
-int IPACM_Iface::handle_software_routing_enable(void)
-{
-
-	int res = IPACM_SUCCESS;
-	struct ipa_flt_rule_add flt_rule_entry;
-	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;
-	}
-
-	if(rx_prop == NULL)
-	{
-		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
-		 calloc(1,
-						sizeof(struct ipa_ioc_add_flt_rule) +
-						1 * sizeof(struct ipa_flt_rule_add)
-						);
-	if (!m_pFilteringTable)
-	{
-		IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-		return IPACM_FAILURE;
-	}
-
-	m_pFilteringTable->commit = 1;
-	m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-	m_pFilteringTable->global = false;
-	m_pFilteringTable->num_rules = (uint8_t)1;
-
-
-	/* Configuring Software-Routing Filtering Rule */
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-	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;
-#ifdef FEATURE_IPA_V3
-	flt_rule_entry.rule.hashable = true;
-#endif
-	memcpy(&flt_rule_entry.rule.attrib,
-				 &rx_prop->rx[0].attrib,
-				 sizeof(flt_rule_entry.rule.attrib));
-
-	memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-	/* check iface is v4 or v6 or both*/
-//	if (ip_type == IPA_IP_MAX)
-//	{
-		/* handle v4 */
-		m_pFilteringTable->ip = IPA_IP_v4;
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (m_pFilteringTable->rules[0].status)
-		{
-			IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-		IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl);
-		/* copy filter hdls */
-		software_routing_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl;
-
-
-		/* handle v6*/
-		m_pFilteringTable->ip = IPA_IP_v6;
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (m_pFilteringTable->rules[0].status)
-		{
-			IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-		IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl);
-		/* copy filter hdls */
-		software_routing_fl_rule_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		softwarerouting_act = true;
-#if 0
-	}
-	else
-	{
-		if (ip_type == IPA_IP_v4)
-		{
-			m_pFilteringTable->ip = IPA_IP_v4;
-		}
-		else
-		{
-			m_pFilteringTable->ip = IPA_IP_v6;
-		}
-
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (m_pFilteringTable->rules[0].status)
-		{
-			IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, ip_type, 1);
-		IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl);
-		/* copy filter hdls */
-		if (ip_type == IPA_IP_v4)
-		{
-			software_routing_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-		else
-		{
-			software_routing_fl_rule_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-		softwarerouting_act = true;
-	}
-#endif
-
-fail:
-	free(m_pFilteringTable);
-
-	return res;
-}
-
-/* software routing disable */
-int IPACM_Iface::handle_software_routing_disable(void)
-{
-	int res = IPACM_SUCCESS;
-	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 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)
-//	{
-		/* ipv4 case */
-		if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[0],
-																				IPA_IP_v4, 1) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-
-		/* ipv6 case */
-		if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[1],
-																				IPA_IP_v6, 1) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-		softwarerouting_act = false;
-#if 0
-	}
-	else
-	{
-		if (ip_type == IPA_IP_v4)
-		{
-			ip = IPA_IP_v4;
-		}
-		else
-		{
-			ip = IPA_IP_v6;
-		}
-
-
-		if (ip_type == IPA_IP_v4)
-		{
-			flt_hdl = software_routing_fl_rule_hdl[0];
-		}
-		else
-		{
-			flt_hdl = software_routing_fl_rule_hdl[1];
-		}
-
-		if (m_filtering.DeleteFilteringHdls(&flt_hdl, ip, 1) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, ip, 1);
-		softwarerouting_act = false;
-	}
-#endif
-
-fail:
-	return res;
-}
-
-/* Query ipa_interface_index by given linux interface_index */
-int IPACM_Iface::iface_ipa_index_query
-(
-	 int interface_index
-)
-{
-	int fd;
-	int link = INVALID_IFACE;
-	int i = 0;
-	struct ifreq ifr;
-
-
-	if(IPACM_Iface::ipacmcfg->iface_table == NULL)
-	{
-		IPACMERR("Iface table in IPACM_Config is not available.\n");
-		return link;
-	}
-
-	/* Search known linux interface-index and map to IPA interface-index*/
-	for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_ipa_interfaces; i++)
-	{
-		if (interface_index == IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index)
-		{
-			link = i;
-			IPACMDBG("Interface (%s) found: linux(%d) ipa(%d) \n",
-							 IPACM_Iface::ipacmcfg->iface_table[i].iface_name,
-							 IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index,
-							 link);
-			return link;
-			break;
-		}
-	}
-
-	/* Search/Configure linux interface-index and map it to IPA interface-index */
-	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-	{
-		PERROR("get interface name socket create failed");
-		return IPACM_FAILURE;
-	}
-
-	memset(&ifr, 0, sizeof(struct ifreq));
-
-	ifr.ifr_ifindex = interface_index;
-	IPACMDBG_H("Interface index %d\n", interface_index);
-
-	if (ioctl(fd, SIOCGIFNAME, &ifr) < 0)
-	{
-		PERROR("call_ioctl_on_dev: ioctl failed:");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-	close(fd);
-
-	IPACMDBG_H("Received interface name %s\n", ifr.ifr_name);
-	for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_ipa_interfaces; i++)
-	{
-		if (strncmp(ifr.ifr_name,
-								IPACM_Iface::ipacmcfg->iface_table[i].iface_name,
-								sizeof(IPACM_Iface::ipacmcfg->iface_table[i].iface_name)) == 0)
-		{
-			IPACMDBG_H("Interface (%s) linux(%d) mapped to ipa(%d) \n", ifr.ifr_name,
-							 IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index, i);
-
-			link = i;
-			IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index = interface_index;
-			break;
-		}
-	}
-
-	return link;
-}
-
-/* Query ipa_interface ipv4_addr by given linux interface_index */
-void IPACM_Iface::iface_addr_query
-(
-	 int interface_index
-)
-{
-	int fd;
-	struct ifreq ifr;
-	struct ifaddrs *myaddrs, *ifa;
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_data_addr *data_addr;
-	struct in_addr iface_ipv4;
-
-	/* use linux interface-index to find interface name */
-	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-	{
-		PERROR("get interface name socket create failed");
-		return ;
-	}
-
-	memset(&ifr, 0, sizeof(struct ifreq));
-
-	ifr.ifr_ifindex = interface_index;
-	IPACMDBG_H("Interface index %d\n", interface_index);
-
-	if (ioctl(fd, SIOCGIFNAME, &ifr) < 0)
-	{
-		PERROR("call_ioctl_on_dev: ioctl failed:");
-		close(fd);
-		return ;
-	}
-	IPACMDBG_H("Interface index %d name: %s\n", interface_index,ifr.ifr_name);
-	close(fd);
-
-	/* query ipv4/v6 address */
-    if(getifaddrs(&myaddrs) != 0)
-	{
-        IPACMERR("getifaddrs");
-		return ;
-	}
-
-    for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
-    {
-        if (ifa->ifa_addr == NULL)
-            continue;
-        if (!(ifa->ifa_flags & IFF_UP))
-            continue;
-
-		if(strcmp(ifr.ifr_name,ifa->ifa_name) == 0) // find current iface
-		{
-			IPACMDBG_H("Internal post new_addr event for iface %s\n", ifa->ifa_name);
-			switch (ifa->ifa_addr->sa_family)
-			{
-				case AF_INET:
-				{
-					struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
-					IPACMDBG_H("ipv4 address %s\n",inet_ntoa(s4->sin_addr));
-					iface_ipv4 = s4->sin_addr;
-					/* post new_addr event to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						freeifaddrs(myaddrs);
-						return ;
-					}
-					data_addr->iptype = IPA_IP_v4;
-					data_addr->if_index = interface_index;
-					data_addr->ipv4_addr = 	iface_ipv4.s_addr;
-					data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr);
-					IPACMDBG_H("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv4 addr:0x%x\n",
-						data_addr->if_index,
-						data_addr->ipv4_addr);
-
-					evt_data.event = IPA_ADDR_ADD_EVENT;
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					break;
-				}
-
-				case AF_INET6:
-				{
-					struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
-					/* post new_addr event to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						freeifaddrs(myaddrs);
-						return ;
-					}
-					data_addr->iptype = IPA_IP_v6;
-					data_addr->if_index = interface_index;
-					memcpy(data_addr->ipv6_addr,
-									&s6->sin6_addr,
-									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]);
-					IPACMDBG_H("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv6 addr:0x%x:%x:%x:%x\n",
-							data_addr->if_index,
-							data_addr->ipv6_addr[0], data_addr->ipv6_addr[1], data_addr->ipv6_addr[2], data_addr->ipv6_addr[3]);
-
-					evt_data.event = IPA_ADDR_ADD_EVENT;
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					break;
-				}
-
-				default:
-					continue;
-			}
-		}
-	}
-    freeifaddrs(myaddrs);
-	return ;
-}
-
-/*Query the IPA endpoint property */
-int IPACM_Iface::query_iface_property(void)
-{
-	int res = IPACM_SUCCESS, fd = 0;
-	uint32_t cnt=0;
-
-	fd = open(DEVICE_NAME, O_RDWR);
-	IPACMDBG("iface query-property \n");
-	if (0 == fd)
-	{
-		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-
-	iface_query = (struct ipa_ioc_query_intf *)
-		 calloc(1, sizeof(struct ipa_ioc_query_intf));
-	if(iface_query == NULL)
-	{
-		IPACMERR("Unable to allocate iface_query memory.\n");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-	IPACMDBG_H("iface name %s\n", dev_name);
-	memcpy(iface_query->name, dev_name, sizeof(dev_name));
-
-	if (ioctl(fd, IPA_IOC_QUERY_INTF, iface_query) < 0)
-	{
-		PERROR("ioctl IPA_IOC_QUERY_INTF failed\n");
-		/* iface_query memory will free when iface-down*/
-		res = IPACM_FAILURE;
-	}
-
-	if(iface_query->num_tx_props > 0)
-	{
-		tx_prop = (struct ipa_ioc_query_intf_tx_props *)
-			 calloc(1, sizeof(struct ipa_ioc_query_intf_tx_props) +
-							iface_query->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop));
-		if(tx_prop == NULL)
-		{
-			IPACMERR("Unable to allocate tx_prop memory.\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		memcpy(tx_prop->name, dev_name, sizeof(tx_prop->name));
-		tx_prop->num_tx_props = iface_query->num_tx_props;
-
-		if (ioctl(fd, IPA_IOC_QUERY_INTF_TX_PROPS, tx_prop) < 0)
-		{
-			PERROR("ioctl IPA_IOC_QUERY_INTF_TX_PROPS failed\n");
-			/* tx_prop memory will free when iface-down*/
-			res = IPACM_FAILURE;
-		}
-
-		if (res != IPACM_FAILURE)
-		{
-			for (cnt = 0; cnt < tx_prop->num_tx_props; cnt++)
-			{
-				IPACMDBG_H("Tx(%d):attrib-mask:0x%x, ip-type: %d, dst_pipe: %d, alt_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].alt_dst_pipe,
-						tx_prop->tx[cnt].hdr_name);
-
-				if (tx_prop->tx[cnt].dst_pipe == 0)
-				{
-					IPACMERR("Tx(%d): wrong tx property: dst_pipe: 0.\n", cnt);
-					close(fd);
-					return IPACM_FAILURE;
-				}
-				if (tx_prop->tx[cnt].alt_dst_pipe == 0 &&
-					((memcmp(dev_name, "wlan0", sizeof("wlan0")) == 0) ||
-					(memcmp(dev_name, "wlan1", sizeof("wlan1")) == 0)))
-				{
-					IPACMERR("Tx(%d): wrong tx property: alt_dst_pipe: 0. \n", cnt);
-					close(fd);
-					return IPACM_FAILURE;
-				}
-
-			}
-		}
-
-	}
-
-	if (iface_query->num_rx_props > 0)
-	{
-		rx_prop = (struct ipa_ioc_query_intf_rx_props *)
-			 calloc(1, sizeof(struct ipa_ioc_query_intf_rx_props) +
-							iface_query->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop));
-		if(rx_prop == NULL)
-		{
-			IPACMERR("Unable to allocate rx_prop memory.\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		memcpy(rx_prop->name, dev_name,
-				 sizeof(rx_prop->name));
-		rx_prop->num_rx_props = iface_query->num_rx_props;
-
-		if (ioctl(fd, IPA_IOC_QUERY_INTF_RX_PROPS, rx_prop) < 0)
-		{
-			PERROR("ioctl IPA_IOC_QUERY_INTF_RX_PROPS failed\n");
-			/* rx_prop memory will free when iface-down*/
-			res = IPACM_FAILURE;
-		}
-
-		if (res != IPACM_FAILURE)
-		{
-			for (cnt = 0; cnt < rx_prop->num_rx_props; cnt++)
-			{
-				IPACMDBG_H("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);
-			}
-		}
-	}
-
-	/* Add Natting iface to IPACM_Config if there is  Rx/Tx property */
-	if (rx_prop != NULL || tx_prop != NULL)
-	{
-		IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name);
-        IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name);
-	}
-
-	close(fd);
-	return res;
-}
-
-/*Configure the initial filter rules */
-int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
-{
-
-	int res = IPACM_SUCCESS, len = 0;
-	struct ipa_flt_rule_add flt_rule_entry;
-	ipa_ioc_add_flt_rule *m_pFilteringTable;
-
-  /* Adding this hack because WLAN may not registered for Rx-endpoint, other ifaces will always have*/
-	const char *dev_wlan0="wlan0";
-	const char *dev_wlan1="wlan1";
-	const char *dev_ecm0="ecm0";
-
-    /* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */
-	if((IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat== WAN_IF) || (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat== EMBMS_IF))
-	{
-		IPACMDBG_H(" NOT add producer dependency on dev %s with registered rx-prop cat:%d \n", dev_name, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat);
-	}
-	else
-	{
-		if(rx_prop != NULL)
-		{
-			IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-			IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
-			IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false);
-		}
-		else
-		{
-			/* only wlan may take software-path, not register Rx-property*/
-			if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0)
-			{
-				IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-				IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD);
-				IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true);
-			}
-			if(strcmp(dev_name,dev_ecm0) == 0)
-			{
-				IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-				IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD);
-				IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true);
-			}
-		}
-	}
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("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)
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) +
-			 (IPV4_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_add));
-
-		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (!m_pFilteringTable)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = iptype;
-		m_pFilteringTable->num_rules = (uint8_t)IPV4_DEFAULT_FILTERTING_RULES;
-
-		/* Configuring Fragment Filtering Rule */
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		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;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = false;
-		flt_rule_entry.rule.hashable = false;
-#endif
-		IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
-		memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring Multicast Filtering Rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xF0000000;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xE0000000;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&(m_pFilteringTable->rules[1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring Broadcast Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&(m_pFilteringTable->rules[2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES);
-			/* copy filter hdls */
-			for (int i = 0; i < IPV4_DEFAULT_FILTERTING_RULES; i++)
-			{
-				if (m_pFilteringTable->rules[i].status == 0)
-				{
-					dft_v4fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl;
-					IPACMDBG_H("Default v4 filter Rule %d HDL:0x%x\n", i, dft_v4fl_rule_hdl[i]);
-				}
-				else
-				{
-					IPACMERR("Failed adding default v4 Filtering rule %d\n", i);
-				}
-			}
-		}
-	}
-	else
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) +
-			 (IPV6_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_add));
-
-		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (!m_pFilteringTable)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = iptype;
-		m_pFilteringTable->num_rules = (uint8_t)IPV6_DEFAULT_FILTERTING_RULES;
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		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;
-		/* Configuring Multicast Filtering Rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFF000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0XFF000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring fe80::/10 Link-Scoped Unicast Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFE800000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&(m_pFilteringTable->rules[1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring fec0::/10 Reserved by IETF Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFEC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&(m_pFilteringTable->rules[2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-#ifdef FEATURE_IPA_ANDROID
-		IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPV6_DEFAULT_FILTERTING_RULES);
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap = 0;
-
-		if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA)
-		{
-			flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
-			flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask;
-		}
-
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
-		flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
-		flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
-
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8);
-		flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1;
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12;
-
-		/* add TCP FIN rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT);
-		memcpy(&(m_pFilteringTable->rules[3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* add TCP SYN rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT);
-		memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* add TCP RST rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT);
-		memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-#endif
-		if (m_filtering.AddFilteringRule(m_pFilteringTable) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
-			/* copy filter hdls */
-			for (int i = 0;
-					 i < IPV6_DEFAULT_FILTERTING_RULES;
-					 i++)
-			{
-				if (m_pFilteringTable->rules[i].status == 0)
-				{
-					dft_v6fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl;
-					IPACMDBG_H("Default v6 Filter Rule %d HDL:0x%x\n", i, dft_v6fl_rule_hdl[i]);
-				}
-				else
-				{
-					IPACMERR("Failing adding v6 default IPV6 rule %d\n", i);
-				}
-			}
-		}
-	}
-
-
-fail:
-	free(m_pFilteringTable);
-
-	return res;
-}
-
-/*  get ipa interface name */
-int IPACM_Iface::ipa_get_if_index
-(
-  char * if_name,
-  int * if_index
-)
-{
-  int fd;
-  struct ifreq ifr;
-
-  if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-  {
-    IPACMERR("get interface index socket create failed \n");
-    return IPACM_FAILURE;
-  }
-
-  memset(&ifr, 0, sizeof(struct ifreq));
-  (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
-  IPACMDBG_H("interface name (%s)\n", if_name);
-
-  if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0)
-  {
-    IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name);
-    close(fd);
-    return IPACM_FAILURE;
-  }
-
-  *if_index = ifr.ifr_ifindex;
-  IPACMDBG_H("Interface index %d\n", *if_index);
-  close(fd);
-  return IPACM_SUCCESS;
-}
-
-void IPACM_Iface::config_ip_type(ipa_ip_type iptype)
-{
-	/* update the iface ip-type to be IPA_IP_v4, IPA_IP_v6 or both*/
-	if (iptype == IPA_IP_v4)
-	{
-		if ((ip_type == IPA_IP_v4) || (ip_type == IPA_IP_MAX))
-		{
-			IPACMDBG_H(" interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type);
-			return;
-		}
-
-		if (ip_type == IPA_IP_v6)
-		{
-			ip_type = IPA_IP_MAX;
-		}
-		else
-		{
-			ip_type = IPA_IP_v4;
-		}
-		IPACMDBG_H(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
-	}
-	else
-	{
-		if ((ip_type == IPA_IP_v6) || (ip_type == IPA_IP_MAX))
-		{
-			IPACMDBG_H(" interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type);
-			return;
-		}
-
-		if (ip_type == IPA_IP_v4)
-		{
-			ip_type = IPA_IP_MAX;
-		}
-		else
-		{
-			ip_type = IPA_IP_v6;
-		}
-
-		IPACMDBG_H(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
-	}
-
-	return;
-}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
deleted file mode 100644
index a142553..0000000
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_IfaceManager.cpp
-
-	@brief
-	This file implements the IPAM iface_manager functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include <string.h>
-#include <sys/ioctl.h>
-
-#include <IPACM_IfaceManager.h>
-#include <IPACM_EvtDispatcher.h>
-#include <IPACM_Defs.h>
-#include <IPACM_Wlan.h>
-#include <IPACM_Lan.h>
-#include <IPACM_Wan.h>
-#include <IPACM_Iface.h>
-#include <IPACM_Log.h>
-
-iface_instances *IPACM_IfaceManager::head = NULL;
-
-IPACM_IfaceManager::IPACM_IfaceManager()
-{
-	IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, this); 		// register for IPA_CFG_CHANGE event
-	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
-#ifndef FEATURE_IPA_ANDROID
-	/* only MDM targets support device on bridge mode */
-	IPACM_EvtDispatcher::registr(IPA_BRIDGE_LINK_UP_EVENT, this); 	// register for IPA_BRIDGE_LINK_UP_EVENT event
-#endif /* not defined(FEATURE_IPA_ANDROID)*/
-	IPACM_EvtDispatcher::registr(IPA_USB_LINK_UP_EVENT, this); // register for USB-iface
-	IPACM_EvtDispatcher::registr(IPA_WAN_EMBMS_LINK_UP_EVENT, this);  // register for wan eMBMS-iface
-	return;
-}
-
-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;
-	ipacm_event_data_mac *StaData = (ipacm_event_data_mac *)param;
-	ipacm_event_data_all *data_all = (ipacm_event_data_all *)param;
-	ipacm_ifacemgr_data ifmgr_data = {0};
-
-	switch(event)
-	{
-		case IPA_CFG_CHANGE_EVENT:
-				IPACMDBG_H(" RESET IPACM_cfg \n");
-				IPACM_Iface::ipacmcfg->Init();
-			break;
-		case IPA_BRIDGE_LINK_UP_EVENT:
-			IPACMDBG_H(" Save the bridge0 mac info in IPACM_cfg \n");
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_BRIDGE_LINK_UP_EVENT: not supported iface id: %d\n", data_all->if_index);
-				break;
-			}
-			/* check if iface is bridge interface*/
-			if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0)
-			{
-				IPACM_Iface::ipacmcfg->ipa_bridge_enable = true;
-				memcpy(IPACM_Iface::ipacmcfg->bridge_mac,
-								data_all->mac_addr,
-								sizeof(IPACM_Iface::ipacmcfg->bridge_mac));
-				IPACMDBG_H("cached bridge0 MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-						 IPACM_Iface::ipacmcfg->bridge_mac[0], IPACM_Iface::ipacmcfg->bridge_mac[1], IPACM_Iface::ipacmcfg->bridge_mac[2],
-						 IPACM_Iface::ipacmcfg->bridge_mac[3], IPACM_Iface::ipacmcfg->bridge_mac[4], IPACM_Iface::ipacmcfg->bridge_mac[5]);
-			}
-			break;
-		case IPA_LINK_UP_EVENT:
-			IPACMDBG_H("Recieved IPA_LINK_UP_EVENT event: link up %d: \n", evt_data->if_index);
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index);
-				break;
-			}
-			/* LTE-backhaul */
-			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == EMBMS_IF)
-			{
-				IPACMDBG("WAN-EMBMS (%s) link already up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			}
-			else if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF)
-			{
-				IPACMDBG_H("WAN-LTE (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-				ifmgr_data.if_index = evt_data->if_index;
-				ifmgr_data.if_type = Q6_WAN;
-				create_iface_instance(&ifmgr_data);
-			}
-			break;
-
-		case IPA_USB_LINK_UP_EVENT:
-			IPACMDBG_H("Recieved IPA_USB_LINK_UP_EVENT event: link up %d: \n", evt_data->if_index);
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_USB_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index);
-				break;
-			}
-			/* check if it's WAN_IF */
-			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF)
-			{
-				/* usb-backhaul using sta_mode ECM_WAN*/
-				IPACMDBG_H("WAN-usb (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, evt_data->if_index);
-				ifmgr_data.if_index = evt_data->if_index;
-				ifmgr_data.if_type = ECM_WAN;
-				create_iface_instance(&ifmgr_data);
-			}
-			else
-			{
-				ifmgr_data.if_index = evt_data->if_index;
-				ifmgr_data.if_type = Q6_WAN;
-				create_iface_instance(&ifmgr_data);
-			}
-			break;
-
-		case IPA_WLAN_AP_LINK_UP_EVENT:
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_WLAN_AP_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index);
-				break;
-			}
-			/* 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_H("WLAN AP (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-				ifmgr_data.if_index = evt_data->if_index;
-				ifmgr_data.if_type = Q6_WAN;
-				create_iface_instance(&ifmgr_data);
-			}
-			else
-			{
-				IPACMDBG_H("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(StaData->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_WLAN_STA_LINK_UP_EVENT: not supported iface id: %d\n", StaData->if_index);
-				break;
-			}
-			/* change iface category from unknown to WAN_IF */
-			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == UNKNOWN_IF)
-			{
-				/* wlan-backhaul using sta_mode WLAN_WAN */
-				IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = WAN_IF;
-				IPACMDBG_H("WLAN STA (%s) link up, iface: %d: \n",
-				IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, StaData->if_index);
-
-				ifmgr_data.if_index = StaData->if_index;
-				ifmgr_data.if_type = WLAN_WAN;
-				memcpy(ifmgr_data.mac_addr, StaData->mac_addr, sizeof(ifmgr_data.mac_addr));
-				create_iface_instance(&ifmgr_data);
-			}
-			else
-			{
-				IPACMDBG_H("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;
-
-		/* Add new instance open for eMBMS iface and wan iface */
-		case IPA_WAN_EMBMS_LINK_UP_EVENT:
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_WAN_EMBMS_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index);
-				break;
-			}
-			/* change iface category from unknown to EMBMS_IF */
-			if ((IPACM_Iface::ipacmcfg->ipacm_odu_enable == true) && (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true))
-			{
-				IPACMDBG(" ODU-mode enable or not (%d) \n",IPACM_Iface::ipacmcfg->ipacm_odu_enable);
-				if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF)
-				{
-					IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=EMBMS_IF;
-					IPACMDBG("WAN eMBMS (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-					ifmgr_data.if_index = StaData->if_index;
-					ifmgr_data.if_type = Q6_WAN;
-					create_iface_instance(&ifmgr_data);
-				}
-				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;
-	}
-	return;
-}
-
-int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
-{
-	int if_index = param->if_index;
-	ipacm_wan_iface_type is_sta_mode = param->if_type;
-
-	int ipa_interface_index;
-	ipa_interface_index = IPACM_Iface::iface_ipa_index_query(if_index);
-
-	if(ipa_interface_index == INVALID_IFACE)
-	{
-			IPACMDBG_H("Unhandled interface received, fid: %d\n",if_index);
-			return IPACM_SUCCESS;
-	}
-
-	/* check if duplicate instance*/
-	if(SearchInstance(ipa_interface_index) == IPA_INSTANCE_NOT_FOUND)
-	{
-		/* IPA_INSTANCE_NOT_FOUND */
-		switch(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat)
-		{
-
-		case LAN_IF:
-			{
-				IPACMDBG_H("Creating Lan interface\n");
-				IPACM_Lan *lan = new IPACM_Lan(ipa_interface_index);
-				IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, lan);
-				//IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, lan);
-				//IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, lan);
-				IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, lan);
-				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);
-#ifdef FEATURE_IPA_ANDROID
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_TETHER, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6_TETHER, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_TETHER, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6_TETHER, lan);
-#else
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, lan);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, lan);
-#endif
-				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, lan); 				// register for IPA_CFG_CHANGE event
-				IPACM_EvtDispatcher::registr(IPA_PRIVATE_SUBNET_CHANGE_EVENT, lan); 	// register for IPA_PRIVATE_SUBNET_CHANGE_EVENT event
-#ifdef FEATURE_IPA_ANDROID
-				IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, lan);
-#endif
-				IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, lan);
-				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
-				/* IPA_LAN_DELETE_SELF should be always last */
-				IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, lan);
-				IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", lan->dev_name, lan->ipa_if_num);
-				registr(ipa_interface_index, lan);
-				/* solve the new_addr comes earlier issue */
-                                IPACM_Iface::iface_addr_query(if_index);
-			}
-			break;
-
-		case ETH_IF:
-			{
-				IPACMDBG_H("Creating ETH interface in router mode\n");
-				IPACM_Lan *ETH = new IPACM_Lan(ipa_interface_index);
-				IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, ETH);
-				IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, ETH);
-				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, ETH);
-				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, ETH);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, ETH);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, ETH);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, ETH);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, ETH);
-				IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, ETH);
-				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, ETH);
-				/* IPA_LAN_DELETE_SELF should be always last */
-				IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, ETH);
-				IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", ETH->dev_name, ETH->ipa_if_num);
-				registr(ipa_interface_index, ETH);
-				/* solve the new_addr comes earlier issue */
-				IPACM_Iface::iface_addr_query(if_index);
-			}
-			break;
-
-		case ODU_IF:
-			{
-				if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true)
-				{
-					IPACMDBG_H("Creating ODU interface in router mode\n");
-					IPACM_Lan *odu = new IPACM_Lan(ipa_interface_index);
-					IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, odu);
-					IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, odu);
-					IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, odu);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, odu);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, odu);
-					IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, odu);
-					IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, odu);
-					IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, odu);
-					IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, odu);
-					IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, odu);
-					IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, odu);
-					/* IPA_LAN_DELETE_SELF should be always last */
-					IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, odu);
-					IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", odu->dev_name, odu->ipa_if_num);
-					registr(ipa_interface_index, odu);
-					/* solve the new_addr comes earlier issue */
-					IPACM_Iface::iface_addr_query(if_index);
-				}
-				else
-				{
-					IPACMDBG_H("Creating ODU interface in bridge mode\n");
-					IPACM_Lan *odu = new IPACM_Lan(ipa_interface_index);
-					IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, odu);
-					IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, odu);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, odu);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, odu);
-					IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, odu);
-					/* IPA_LAN_DELETE_SELF should be always last */
-					IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, odu);
-					IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", odu->dev_name, odu->ipa_if_num);
-					registr(ipa_interface_index, odu);
-					/* solve the new_addr comes earlier issue */
-					IPACM_Iface::iface_addr_query(if_index);
-				}
-			}
-			break;
-
-		case WLAN_IF:
-			{
-				IPACMDBG_H("Creating WLan interface\n");
-				IPACM_Wlan *wl = new IPACM_Wlan(ipa_interface_index);
-				IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, wl);
-				IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT_EX, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_DEL_EVENT, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_POWER_SAVE_EVENT, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_RECOVER_EVENT, wl);
-				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);
-#ifdef FEATURE_IPA_ANDROID
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_TETHER, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6_TETHER, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_TETHER, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6_TETHER, wl);
-#else
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, wl);
-				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, wl);
-#endif
-				IPACM_EvtDispatcher::registr(IPA_PRIVATE_SUBNET_CHANGE_EVENT, wl); 	// register for IPA_PRIVATE_SUBNET_CHANGE_EVENT event
-#ifdef FEATURE_ETH_BRIDGE_LE
-				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, wl);
-#endif
-				IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, wl);
-#ifndef FEATURE_IPA_ANDROID
-				IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, wl);
-				IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, wl);
-#else
-				IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, wl);
-#endif
-				/* IPA_LAN_DELETE_SELF should be always last */
-				IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, wl);
-				IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num);
-				registr(ipa_interface_index, wl);
-				/* solve the new_addr comes earlier issue */
-	            IPACM_Iface::iface_addr_query(if_index);
-			}
-			break;
-
-		case WAN_IF:
-			{
-				if((IPACM_Iface::ipacmcfg->ipacm_odu_enable == false) || (IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true))
-				{
-					IPACMDBG_H("Creating Wan interface\n");
-					IPACM_Wan *w;
-					if(is_sta_mode == WLAN_WAN)
-					{
-						w = new IPACM_Wan(ipa_interface_index, is_sta_mode, param->mac_addr);
-					}
-					else
-					{
-						w = new IPACM_Wan(ipa_interface_index, is_sta_mode, NULL);
-					}
-					IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, w);
-#ifdef FEATURE_IPA_ANDROID
-					IPACM_EvtDispatcher::registr(IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, w);
-					IPACM_EvtDispatcher::registr(IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, w);
-					if(is_sta_mode == Q6_WAN)
-					{
-						IPACM_EvtDispatcher::registr(IPA_NETWORK_STATS_UPDATE_EVENT, w);
-					};
-#else/* defined(FEATURE_IPA_ANDROID) */
-					IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, w);
-					IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, w);
-#endif /* not defined(FEATURE_IPA_ANDROID)*/
-					IPACM_EvtDispatcher::registr(IPA_FIREWALL_CHANGE_EVENT, w);
-					IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, w);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, w);
-					IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, w);
-					IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, w); 		// register for IPA_CFG_CHANGE event
-					IPACM_EvtDispatcher::registr(IPA_WAN_XLAT_CONNECT_EVENT, w);
-					if(is_sta_mode == WLAN_WAN)
-					{
-						IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, w); // for STA mode
-#ifndef FEATURE_IPA_ANDROID
-						IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, w);
-						IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w);
-#endif
-					}
-					else
-					{
-						IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, w);
-					}
-
-					IPACMDBG_H("ipa_WAN (%s):ipa_index (%d) instance open/registr ok\n", w->dev_name, w->ipa_if_num);
-					registr(ipa_interface_index, w);
-					/* solve the new_addr comes earlier issue */
-					IPACM_Iface::iface_addr_query(if_index);
-				}
-			}
-			break;
-
-	    /* WAN-eMBMS instance */
-		case EMBMS_IF:
-			{
-				IPACMDBG("Creating Wan-eMBSM interface\n");
-				IPACM_Wan *embms = new IPACM_Wan(ipa_interface_index, is_sta_mode, NULL);
-				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, embms);
-				IPACMDBG("ipa_WAN (%s):ipa_index (%d) instance open/registr ok\n", embms->dev_name, embms->ipa_if_num);
-				registr(ipa_interface_index, embms);
-			}
-			break;
-
-		default:
-			IPACMDBG_H("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;
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-
-int IPACM_IfaceManager::registr(int ipa_if_index, IPACM_Listener *obj)
-{
-	iface_instances *tmp = head,*nw;
-
-	nw = (iface_instances *)malloc(sizeof(iface_instances));
-	if(nw != NULL)
-	{
-		nw->ipa_if_index = ipa_if_index;
-		nw->obj = obj;
-		nw->next = NULL;
-	}
-	else
-	{
-		return IPACM_FAILURE;
-	}
-
-	if(head == NULL)
-	{
-		head = nw;
-	}
-	else
-	{
-		while(tmp->next)
-		{
-			tmp = tmp->next;
-		}
-		tmp->next = nw;
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_IfaceManager::deregistr(IPACM_Listener *param)
-{
-	iface_instances *tmp = head,*tmp1,*prev = head;
-
-	while(tmp != NULL)
-	{
-		if(tmp->obj == param)
-		{
-			tmp1 = tmp;
-			if(tmp == head)
-			{
-				head = head->next;
-			}
-			else if(tmp->next == NULL)
-			{
-				prev->next = NULL;
-			}
-			else
-			{
-				prev->next = tmp->next;
-			}
-
-			tmp = tmp->next;
-			free(tmp1);
-		}
-		else
-		{
-			prev = tmp;
-			tmp = tmp->next;
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-
-int IPACM_IfaceManager::SearchInstance(int ipa_if_index)
-{
-
-	iface_instances *tmp = head;
-
-	while(tmp != NULL)
-	{
-		if(ipa_if_index == tmp->ipa_if_index)
-		{
-			IPACMDBG_H("Find existed iface-instance name: %s\n",
-							 IPACM_Iface::ipacmcfg->iface_table[ipa_if_index].iface_name);
-			return IPA_INSTANCE_FOUND;
-		}
-		tmp = tmp->next;
-	}
-
-	IPACMDBG_H("No existed iface-instance name: %s,\n",
-					 IPACM_Iface::ipacmcfg->iface_table[ipa_if_index].iface_name);
-
-	return IPA_INSTANCE_NOT_FOUND;
-}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
deleted file mode 100644
index 991e451..0000000
--- a/ipacm/src/IPACM_Lan.cpp
+++ /dev/null
@@ -1,4261 +0,0 @@
-/*
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials provided
-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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Lan.cpp
-
-	@brief
-	This file implements the LAN iface functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include "IPACM_Netlink.h"
-#include "IPACM_Lan.h"
-#include "IPACM_Wan.h"
-#include "IPACM_IfaceManager.h"
-#include "linux/rmnet_ipa_fd_ioctl.h"
-#include "linux/ipa_qmi_service_v01.h"
-#include "linux/msm_ipa.h"
-#include "IPACM_ConntrackListener.h"
-#include <sys/ioctl.h>
-#include <fcntl.h>
-
-bool IPACM_Lan::odu_up = false;
-
-IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
-{
-	num_eth_client = 0;
-	header_name_count = 0;
-	ipv6_set = 0;
-	ipv4_header_set = false;
-	ipv6_header_set = false;
-	odu_route_rule_v4_hdl = NULL;
-	odu_route_rule_v6_hdl = NULL;
-	eth_client = NULL;
-	int i, m_fd_odu, ret = IPACM_SUCCESS;
-
-	Nat_App = NatApp::GetInstance();
-	if (Nat_App == NULL)
-	{
-		IPACMERR("unable to get Nat App instance \n");
-		return;
-	}
-
-	num_wan_ul_fl_rule_v4 = 0;
-	num_wan_ul_fl_rule_v6 = 0;
-	is_active = true;
-	modem_ul_v4_set = false;
-	modem_ul_v6_set = false;
-	is_mode_switch = false;
-	if_ipv4_subnet =0;
-	each_client_rt_rule_count[IPA_IP_v4] = 0;
-	each_client_rt_rule_count[IPA_IP_v6] = 0;
-	eth_client_len = 0;
-
-	/* support eth multiple clients */
-	if(iface_query != NULL)
-	{
-		if(ipa_if_cate != WLAN_IF)
-		{
-			eth_client_len = (sizeof(ipa_eth_client)) + (iface_query->num_tx_props * sizeof(eth_client_rt_hdl));
-			eth_client = (ipa_eth_client *)calloc(IPA_MAX_NUM_ETH_CLIENTS, eth_client_len);
-			if (eth_client == NULL)
-			{
-				IPACMERR("unable to allocate memory\n");
-				return;
-			}
-		}
-
-		IPACMDBG_H(" IPACM->IPACM_Lan(%d) constructor: Tx:%d Rx:%d \n", ipa_if_num,
-					 iface_query->num_tx_props, iface_query->num_rx_props);
-
-		/* ODU routing table initilization */
-		if(ipa_if_cate == ODU_IF)
-		{
-			odu_route_rule_v4_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-			odu_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-			if ((odu_route_rule_v4_hdl == NULL) || (odu_route_rule_v6_hdl == NULL))
-			{
-				IPACMERR("unable to allocate memory\n");
-				return;
-			}
-		}
-	}
-
-	memset(wan_ul_fl_rule_hdl_v4, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
-	memset(wan_ul_fl_rule_hdl_v6, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
-
-	memset(ipv4_icmp_flt_rule_hdl, 0, NUM_IPV4_ICMP_FLT_RULE * sizeof(uint32_t));
-
-	memset(private_fl_rule_hdl, 0, IPA_MAX_PRIVATE_SUBNET_ENTRIES * sizeof(uint32_t));
-	memset(ipv6_prefix_flt_rule_hdl, 0, NUM_IPV6_PREFIX_FLT_RULE * sizeof(uint32_t));
-	memset(ipv6_icmp_flt_rule_hdl, 0, NUM_IPV6_ICMP_FLT_RULE * sizeof(uint32_t));
-	memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
-
-	/* ODU routing table initilization */
-	if(ipa_if_cate == ODU_IF)
-	{
-		/* only do one time ioctl to odu-driver to infrom in router or bridge mode*/
-		if (IPACM_Lan::odu_up != true)
-		{
-				m_fd_odu = open(IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU, O_RDWR);
-				if (0 == m_fd_odu)
-				{
-					IPACMERR("Failed opening %s.\n", IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU);
-					return ;
-				}
-
-				if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true)
-				{
-					ret = ioctl(m_fd_odu, ODU_BRIDGE_IOC_SET_MODE, ODU_BRIDGE_MODE_ROUTER);
-					IPACM_Iface::ipacmcfg->ipacm_odu_enable = true;
-				}
-				else
-				{
-					ret = ioctl(m_fd_odu, ODU_BRIDGE_IOC_SET_MODE, ODU_BRIDGE_MODE_BRIDGE);
-					IPACM_Iface::ipacmcfg->ipacm_odu_enable = true;
-				}
-
-				if (ret)
-				{
-					IPACMERR("Failed tell odu-driver the mode\n");
-				}
-				IPACMDBG("Tell odu-driver in router-mode(%d)\n", IPACM_Iface::ipacmcfg->ipacm_odu_router_mode);
-				IPACMDBG_H("odu is up: odu-driver in router-mode(%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_router_mode);
-				close(m_fd_odu);
-				IPACM_Lan::odu_up = true;
-		}
-	}
-
-	if(iface_query != NULL && tx_prop != NULL)
-	{
-		for(i=0; i<iface_query->num_tx_props; i++)
-			each_client_rt_rule_count[tx_prop->tx[i].ip]++;
-	}
-	IPACMDBG_H("Need to add %d IPv4 and %d IPv6 routing rules for eth bridge for each client.\n", each_client_rt_rule_count[IPA_IP_v4], each_client_rt_rule_count[IPA_IP_v6]);
-
-#ifdef FEATURE_IPA_ANDROID
-	/* set the IPA-client pipe enum */
-	if(ipa_if_cate == LAN_IF)
-	{
-		handle_tethering_client(false, IPACM_CLIENT_USB);
-	}
-#endif
-	return;
-}
-
-IPACM_Lan::~IPACM_Lan()
-{
-	IPACM_EvtDispatcher::deregistr(this);
-	IPACM_IfaceManager::deregistr(this);
-	return;
-}
-
-
-/* LAN-iface's callback function */
-void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
-{
-	if(is_active == false && event != IPA_LAN_DELETE_SELF)
-	{
-		IPACMDBG_H("The interface is no longer active, return.\n");
-		return;
-	}
-
-	int ipa_interface_index;
-	ipacm_ext_prop* ext_prop;
-	ipacm_event_iface_up* data_wan;
-	ipacm_event_iface_up_tehter* data_wan_tether;
-
-	switch (event)
-	{
-	case IPA_LINK_DOWN_EVENT:
-		{
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_LINK_DOWN_EVENT\n");
-				handle_down_evt();
-				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-				return;
-			}
-		}
-		break;
-
-	case IPA_CFG_CHANGE_EVENT:
-		{
-			if ( IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate)
-			{
-				IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category changed\n");
-				/* delete previous instance */
-				handle_down_evt();
-				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-				is_mode_switch = true; // need post internal usb-link up event
-				return;
-			}
-			/* Add Natting iface to IPACM_Config if there is  Rx/Tx property */
-			if (rx_prop != NULL || tx_prop != NULL)
-			{
-				IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name);
-				IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name);
-			}
-		}
-		break;
-
-	case IPA_PRIVATE_SUBNET_CHANGE_EVENT:
-		{
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			/* internel event: data->if_index is ipa_if_index */
-			if (data->if_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from itself posting, ignore\n");
-				return;
-			}
-			else
-			{
-				IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from other LAN iface \n");
-#ifdef FEATURE_IPA_ANDROID
-				handle_private_subnet_android(IPA_IP_v4);
-#endif
-				IPACMDBG_H(" delete old private subnet rules, use new sets \n");
-				return;
-			}
-		}
-		break;
-
-	case IPA_LAN_DELETE_SELF:
-	{
-		ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-		if(data->if_index == ipa_if_num)
-		{
-			IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n");
-			IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
-			/* posting link-up event for cradle use-case */
-			if(is_mode_switch)
-			{
-				IPACMDBG_H("Posting IPA_USB_LINK_UP_EVENT event for (%s)\n", dev_name);
-				ipacm_cmd_q_data evt_data;
-				memset(&evt_data, 0, sizeof(evt_data));
-
-				ipacm_event_data_fid *data_fid = NULL;
-				data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-				if(data_fid == NULL)
-				{
-					IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n");
-					return;
-				}
-				if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index)))
-				{
-					IPACMERR("Error while getting interface index for %s device", dev_name);
-				}
-				evt_data.event = IPA_USB_LINK_UP_EVENT;
-				evt_data.evt_data = data_fid;
-				//IPACMDBG_H("Posting event:%d\n", evt_data.event);
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-			}
-#ifndef FEATURE_IPA_ANDROID
-			if(rx_prop != NULL)
-			{
-				if(IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4) != 0)
-				{
-					IPACMDBG_DMESG("### WARNING ### num ipv4 flt rules on client %d is not expected: %d expected value: 0",
-						rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4));
-				}
-				if(IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6) != 0)
-				{
-					IPACMDBG_DMESG("### WARNING ### num ipv6 flt rules on client %d is not expected: %d expected value: 0",
-						rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6));
-				}
-			}
-#endif
-			delete this;
-		}
-		break;
-	}
-
-	case IPA_ADDR_ADD_EVENT:
-		{
-			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_H("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
-				return;
-			}
-
-
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_ADDR_ADD_EVENT\n");
-
-				/* only call ioctl for ODU iface with bridge mode */
-				if(IPACM_Iface::ipacmcfg->ipacm_odu_enable == true && IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false
-						&& ipa_if_cate == ODU_IF)
-				{
-					if((data->iptype == IPA_IP_v6) && (num_dft_rt_v6 == 0))
-					{
-						handle_addr_evt_odu_bridge(data);
-					}
-#ifdef FEATURE_IPA_ANDROID
-					add_dummy_private_subnet_flt_rule(data->iptype);
-					handle_private_subnet_android(data->iptype);
-#else
-					handle_private_subnet(data->iptype);
-#endif
-				}
-				else
-				{
-
-					/* 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_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
-					{
-						IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
-						if(handle_addr_evt(data) == IPACM_FAILURE)
-						{
-							return;
-						}
-
-#ifdef FEATURE_IPA_ANDROID
-						add_dummy_private_subnet_flt_rule(data->iptype);
-						handle_private_subnet_android(data->iptype);
-#else
-						handle_private_subnet(data->iptype);
-#endif
-
-						if (IPACM_Wan::isWanUP(ipa_if_num))
-						{
-							if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
-							{
-								if(IPACM_Wan::backhaul_is_sta_mode == false)
-								{
-									ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-									handle_wan_up_ex(ext_prop, IPA_IP_v4,
-												IPACM_Wan::getXlat_Mux_Id());
-								}
-								else
-								{
-									handle_wan_up(IPA_IP_v4);
-								}
-							}
-						}
-
-						if(IPACM_Wan::isWanUP_V6(ipa_if_num))
-						{
-							if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
-							{
-								memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix));
-								install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
-								if(IPACM_Wan::backhaul_is_sta_mode == false)
-								{
-									ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-									handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-								}
-								else
-								{
-									handle_wan_up(IPA_IP_v6);
-								}
-							}
-						}
-
-						/* Post event to NAT */
-						if (data->iptype == IPA_IP_v4)
-						{
-							ipacm_cmd_q_data evt_data;
-							ipacm_event_iface_up *info;
-
-							info = (ipacm_event_iface_up *)
-								malloc(sizeof(ipacm_event_iface_up));
-							if (info == NULL)
-							{
-								IPACMERR("Unable to allocate memory\n");
-								return;
-							}
-
-							memcpy(info->ifname, dev_name, IF_NAME_LEN);
-							info->ipv4_addr = data->ipv4_addr;
-							info->addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[0].subnet_mask;
-
-							evt_data.event = IPA_HANDLE_LAN_UP;
-							evt_data.evt_data = (void *)info;
-
-							/* Insert IPA_HANDLE_LAN_UP to command queue */
-							IPACMDBG_H("posting IPA_HANDLE_LAN_UP for IPv4 with below information\n");
-							IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n",
-											info->ipv4_addr, info->addr_mask);
-							IPACM_EvtDispatcher::PostEvt(&evt_data);
-						}
-						IPACMDBG_H("Finish handling IPA_ADDR_ADD_EVENT for ip-family(%d)\n", data->iptype);
-					}
-
-					IPACMDBG_H("Finish handling IPA_ADDR_ADD_EVENT for ip-family(%d)\n", data->iptype);
-					/* checking if SW-RT_enable */
-					if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true)
-					{
-						/* handle software routing enable event*/
-						IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-						handle_software_routing_enable();
-					}
-
-				}
-			}
-		}
-		break;
-#ifdef FEATURE_IPA_ANDROID
-	case IPA_HANDLE_WAN_UP_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_TETHER event\n");
-
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-			{
-				if(data_wan_tether->is_sta == false)
-				{
-					ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-					handle_wan_up_ex(ext_prop, IPA_IP_v4, 0);
-				}
-				else
-				{
-					handle_wan_up(IPA_IP_v4);
-				}
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_UP_V6_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6_TETHER event\n");
-
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-			{
-					memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
-					install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
-					if(data_wan_tether->is_sta == false)
-					{
-						ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-						handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-					}
-					else
-					{
-						handle_wan_up(IPA_IP_v6);
-					}
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_TETHER event\n");
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-			{
-				handle_wan_down(data_wan_tether->is_sta);
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_V6_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER event\n");
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			/* clean up v6 RT rules*/
-			IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER in LAN-instance and need clean up client IPv6 address \n");
-			/* reset usb-client ipv6 rt-rules */
-			handle_lan_client_reset_rt(IPA_IP_v6);
-
-			if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-			{
-				handle_wan_down_v6(data_wan_tether->is_sta);
-			}
-		}
-		break;
-#else
-	case IPA_HANDLE_WAN_UP:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
-
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-		{
-		if(data_wan->is_sta == false)
-		{
-				ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-				handle_wan_up_ex(ext_prop, IPA_IP_v4, data_wan->xlat_mux_id);
-		}
-		else
-		{
-			handle_wan_up(IPA_IP_v4);
-		}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_UP_V6:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6 event\n");
-
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-		{
-			memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix));
-			install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix);
-			if(data_wan->is_sta == false)
-			{
-				ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-				handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-			}
-			else
-			{
-				handle_wan_up(IPA_IP_v6);
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n");
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-		{
-			handle_wan_down(data_wan->is_sta);
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_V6:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6 event\n");
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		/* clean up v6 RT rules*/
-		IPACMDBG_H("Received IPA_WAN_V6_DOWN in LAN-instance and need clean up client IPv6 address \n");
-		/* reset usb-client ipv6 rt-rules */
-		handle_lan_client_reset_rt(IPA_IP_v6);
-
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-		{
-			handle_wan_down_v6(data_wan->is_sta);
-		}
-		break;
-#endif
-
-	case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT:
-		{
-			ipacm_event_data_all *data = (ipacm_event_data_all *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			IPACMDBG_H("Recieved IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT event \n");
-			IPACMDBG_H("check iface %s category: %d\n", dev_name, ipa_if_cate);
-
-			if (ipa_interface_index == ipa_if_num && ipa_if_cate == ODU_IF)
-			{
-				IPACMDBG_H("ODU iface got v4-ip \n");
-				/* first construc ODU full header */
-				if ((ipv4_header_set == false) && (ipv6_header_set == false))
-				{
-					/* construct ODU RT tbl */
-					handle_odu_hdr_init(data->mac_addr);
-					if (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true)
-					{
-						handle_odu_route_add();
-						IPACMDBG_H("construct ODU header and route rules, embms_flag (%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable);
-					}
-					else
-					{
-						IPACMDBG_H("construct ODU header only, embms_flag (%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable);
-					}
-				}
-				/* if ODU in bridge mode, directly return */
-				if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false)
-				{
-					IPACMDBG_H("ODU is in bridge mode, no action \n");
-					return;
-				}
-			}
-
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("ETH iface got client \n");
-				/* first construc ETH full header */
-				handle_eth_hdr_init(data->mac_addr);
-				IPACMDBG_H("construct ETH header and route rules \n");
-				/* Associate with IP and construct RT-rule */
-				if (handle_eth_client_ipaddr(data) == IPACM_FAILURE)
-				{
-					return;
-				}
-				handle_eth_client_route_rule(data->mac_addr, data->iptype);
-				if (data->iptype == IPA_IP_v4)
-				{
-					/* Add NAT rules after ipv4 RT rules are set */
-					CtList->HandleNeighIpAddrAddEvt(data);
-				}
-				eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->mac_addr);
-				return;
-			}
-		}
-		break;
-
-	case IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT:
-		{
-			ipacm_event_data_all *data = (ipacm_event_data_all *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-
-			IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT event. \n");
-			IPACMDBG_H("check iface %s category: %d\n", dev_name, ipa_if_cate);
-			/* if ODU in bridge mode, directly return */
-			if (ipa_if_cate == ODU_IF && IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false)
-			{
-				IPACMDBG_H("ODU is in bridge mode, no action \n");
-				return;
-			}
-
-			if (ipa_interface_index == ipa_if_num)
-			{
-				if (data->iptype == IPA_IP_v6)
-				{
-					handle_del_ipv6_addr(data);
-					return;
-				}
-
-				eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_DEL, IPA_IP_MAX, data->mac_addr);
-
-				IPACMDBG_H("LAN iface delete client \n");
-				handle_eth_client_down_evt(data->mac_addr);
-				return;
-			}
-		}
-		break;
-
-	case IPA_SW_ROUTING_ENABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n");
-		/* handle software routing enable event*/
-		handle_software_routing_enable();
-		break;
-
-	case IPA_SW_ROUTING_DISABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n");
-		/* handle software routing disable event*/
-		handle_software_routing_disable();
-		break;
-
-	case IPA_CRADLE_WAN_MODE_SWITCH:
-	{
-		IPACMDBG_H("Received IPA_CRADLE_WAN_MODE_SWITCH event.\n");
-		ipacm_event_cradle_wan_mode* wan_mode = (ipacm_event_cradle_wan_mode*)param;
-		if(wan_mode == NULL)
-		{
-			IPACMERR("Event data is empty.\n");
-			return;
-		}
-
-		if(wan_mode->cradle_wan_mode == BRIDGE)
-		{
-			handle_cradle_wan_mode_switch(true);
-		}
-		else
-		{
-			handle_cradle_wan_mode_switch(false);
-		}
-	}
-	break;
-
-	case IPA_TETHERING_STATS_UPDATE_EVENT:
-	{
-		IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_EVENT event.\n");
-		if (IPACM_Wan::isWanUP(ipa_if_num) || IPACM_Wan::isWanUP_V6(ipa_if_num))
-		{
-			if(IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */
-			{
-				ipa_get_data_stats_resp_msg_v01 *data = (ipa_get_data_stats_resp_msg_v01 *)param;
-				IPACMDBG("Received IPA_TETHERING_STATS_UPDATE_STATS ipa_stats_type: %d\n",data->ipa_stats_type);
-				IPACMDBG("Received %d UL, %d DL pipe stats\n",data->ul_src_pipe_stats_list_len,
-					data->dl_dst_pipe_stats_list_len);
-				if (data->ipa_stats_type != QMI_IPA_STATS_TYPE_PIPE_V01)
-				{
-					IPACMERR("not valid pipe stats enum(%d)\n", data->ipa_stats_type);
-					return;
-				}
-				handle_tethering_stats_event(data);
-			}
-		}
-	}
-	break;
-
-	default:
-		break;
-	}
-
-	return;
-}
-
-
-int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data)
-{
-	uint32_t tx_index;
-	uint32_t rt_hdl;
-	int num_v6 =0, clnt_indx;
-
-	clnt_indx = get_eth_client_index(data->mac_addr);
-	if (clnt_indx == IPACM_INVALID_INDEX)
-	{
-		IPACMERR("eth client not found/attached \n");
-		return IPACM_FAILURE;
-	}
-
-	if(data->iptype == IPA_IP_v6)
-	{
-		if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
-				(data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0))
-		{
-			IPACMDBG_H("ipv6 address got: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-			for(num_v6=0;num_v6 < get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++)
-			{
-				if( data->ipv6_addr[0] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] &&
-					data->ipv6_addr[1] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][1] &&
-					data->ipv6_addr[2]== get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][2] &&
-					data->ipv6_addr[3] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][3])
-				{
-					IPACMDBG_H("ipv6 addr is found at position:%d for client:%d\n", num_v6, clnt_indx);
-					break;
-				}
-			}
-		}
-		if (num_v6 == IPV6_NUM_ADDR)
-		{
-			IPACMDBG_H("ipv6 addr is not found. \n");
-			return IPACM_FAILURE;
-		}
-
-		for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6 != 0))
-			{
-				IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for tx:%d\n", clnt_indx, num_v6, tx_index);
-				rt_hdl = get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6];
-				if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-				{
-					return IPACM_FAILURE;
-				}
-				rt_hdl = get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6];
-				if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
-				{
-					return IPACM_FAILURE;
-				}
-				get_client_memptr(eth_client, clnt_indx)->ipv6_set--;
-				get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6--;
-
-				for(num_v6;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++)
-				{
-					get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] =
-						get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][0];
-					get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][1] =
-						get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][1];
-					get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][2] =
-						get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][2];
-					get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][3] =
-						get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][3];
-					get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6] =
-						get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6+1];
-					get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6] =
-						get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6+1];
-				}
-			}
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-/* delete filter rule for wan_down event for IPv4*/
-int IPACM_Lan::handle_wan_down(bool is_sta_mode)
-{
-	ipa_fltr_installed_notif_req_msg_v01 flt_index;
-	int fd;
-
-	fd = open(IPA_DEVICE_NAME, O_RDWR);
-	if (0 == fd)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-
-	if(is_sta_mode == false)
-	{
-		if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES)
-		{
-			IPACMERR("number of wan_ul_fl_rule_v4 (%d) > MAX_WAN_UL_FILTER_RULES (%d), aborting...\n", num_wan_ul_fl_rule_v4, MAX_WAN_UL_FILTER_RULES);
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		if (m_filtering.DeleteFilteringHdls(wan_ul_fl_rule_hdl_v4,
-			IPA_IP_v4, num_wan_ul_fl_rule_v4) == false)
-		{
-			IPACMERR("Error Deleting RuleTable(1) to Filtering, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_wan_ul_fl_rule_v4);
-
-		memset(wan_ul_fl_rule_hdl_v4, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
-		num_wan_ul_fl_rule_v4 = 0;
-		modem_ul_v4_set = false;
-
-		memset(&flt_index, 0, sizeof(flt_index));
-		flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
-		flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01;
-#ifndef FEATURE_IPA_V3
-		flt_index.filter_index_list_len = 0;
-#else /* defined (FEATURE_IPA_V3) */
-		flt_index.rule_id_valid = 1;
-		flt_index.rule_id_len = 0;
-#endif
-		flt_index.embedded_pipe_index_valid = 1;
-		flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD);
-		flt_index.retain_header_valid = 1;
-		flt_index.retain_header = 0;
-		flt_index.embedded_call_mux_id_valid = 1;
-		flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId();
-
-		if(false == m_filtering.SendFilteringRuleIndex(&flt_index))
-		{
-			IPACMERR("Error sending filtering rule index, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-	}
-	else
-	{
-		if (m_filtering.DeleteFilteringHdls(&lan_wan_fl_rule_hdl[0], IPA_IP_v4, 1) == false)
-		{
-			IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-	}
-
-	close(fd);
-	return IPACM_SUCCESS;
-}
-
-/* handle new_address event*/
-int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
-{
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	const int NUM_RULES = 1;
-	int num_ipv6_addr;
-	int res = IPACM_SUCCESS;
-
-	IPACMDBG_H("set route/filter rule ip-type: %d \n", data->iptype);
-
-/* Add private subnet*/
-#ifdef FEATURE_IPA_ANDROID
-	if (data->iptype == IPA_IP_v4)
-	{
-		IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
-		if_ipv4_subnet = (data->ipv4_addr >> 8) << 8;
-		IPACMDBG_H(" Add IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		if(IPACM_Iface::ipacmcfg->AddPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false)
-		{
-			IPACMERR(" can't Add IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		}
-	}
-#endif /* defined(FEATURE_IPA_ANDROID)*/
-
-	/* Update the IP Type. */
-	config_ip_type(data->iptype);
-
-	if (data->iptype == IPA_IP_v4)
-	{
-		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));
-
-		if (!rt_rule)
-		{
-			IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = NUM_RULES;
-		rt_rule->ip = data->iptype;
-		rt_rule_entry = &rt_rule->rules[0];
-		rt_rule_entry->at_rear = false;
-		rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS;  //go to A5
-		rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name));
-		rt_rule_entry->rule.attrib.u.v4.dst_addr      = data->ipv4_addr;
-		rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-		rt_rule_entry->rule.hashable = true;
-#endif
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status);
-			res = rt_rule_entry->status;
-			goto fail;
-		}
-		dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
-		IPACMDBG_H("ipv4 iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
-		/* initial multicast/broadcast/fragment filter rule */
-
-		init_fl_rule(data->iptype);
-		install_ipv4_icmp_flt_rule();
-
-		/* populate the flt rule offset for eth bridge */
-		eth_bridge_flt_rule_offset[data->iptype] = ipv4_icmp_flt_rule_hdl[0];
-		eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v4, NULL);
-	}
-	else
-	{
-	    /* check if see that v6-addr already or not*/
-	    for(num_ipv6_addr=0;num_ipv6_addr<num_dft_rt_v6;num_ipv6_addr++)
-	    {
-            if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) &&
-	           (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) &&
-	           (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) &&
-	           (ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3]))
-            {
-				return IPACM_FAILURE;
-				break;
-	        }
-	    }
-
-		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));
-
-		if (!rt_rule)
-		{
-			IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = NUM_RULES;
-		rt_rule->ip = data->iptype;
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name));
-
-		rt_rule_entry = &rt_rule->rules[0];
-		rt_rule_entry->at_rear = false;
-		rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_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];
-#ifdef FEATURE_IPA_V3
-		rt_rule_entry->rule.hashable = true;
-#endif
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			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;
-
-		/* setup same rule for v6_wan table*/
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name));
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			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+1] = rt_rule_entry->rt_rule_hdl;
-
-		IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n",
-		          dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6],
-		          dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6);
-
-		if (num_dft_rt_v6 == 0)
-		{
-			install_ipv6_icmp_flt_rule();
-
-			/* populate the flt rule offset for eth bridge */
-			eth_bridge_flt_rule_offset[data->iptype] = ipv6_icmp_flt_rule_hdl[0];
-			eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v6, NULL);
-
-			init_fl_rule(data->iptype);
-		}
-		num_dft_rt_v6++;
-		IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6);
-	}
-
-	IPACMDBG_H("finish route/filter rule ip-type: %d, res(%d)\n", data->iptype, res);
-
-fail:
-	free(rt_rule);
-	return res;
-}
-
-/* configure private subnet filter rules*/
-int IPACM_Lan::handle_private_subnet(ipa_ip_type iptype)
-{
-	struct ipa_flt_rule_add flt_rule_entry;
-	int i;
-
-	ipa_ioc_add_flt_rule *m_pFilteringTable;
-
-	IPACMDBG_H("lan->handle_private_subnet(); set route/filter rule \n");
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if (iptype == IPA_IP_v4)
-	{
-
-		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
-			 calloc(1,
-							sizeof(struct ipa_ioc_add_flt_rule) +
-							(IPACM_Iface::ipacmcfg->ipa_num_private_subnet) * sizeof(struct ipa_flt_rule_add)
-							);
-		if (!m_pFilteringTable)
-		{
-			PERROR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = IPA_IP_v4;
-		m_pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet;
-
-		/* Make LAN-traffic always go A5, use default IPA-RT table */
-		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;
-		}
-
-		for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++)
-		{
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-			flt_rule_entry.at_rear = true;
-			flt_rule_entry.rule.retain_hdr = 1;
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-                        /* Support private subnet feature including guest-AP can't talk to primary AP etc */
-			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl;
-			IPACMDBG_H(" private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name);
-
-			memcpy(&flt_rule_entry.rule.attrib,
-						 &rx_prop->rx[0].attrib,
-						 sizeof(flt_rule_entry.rule.attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_mask;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_addr;
-			memcpy(&(m_pFilteringTable->rules[i]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-			IPACMDBG_H("Loop %d  5\n", i);
-		}
-
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-			free(m_pFilteringTable);
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
-
-		/* copy filter rule hdls */
-		for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_private_subnet; i++)
-		{
-			private_fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl;
-		}
-		free(m_pFilteringTable);
-	}
-	else
-	{
-		IPACMDBG_H("No private subnet rules for ipv6 iface %s\n", dev_name);
-	}
-	return IPACM_SUCCESS;
-}
-
-
-/* for STA mode wan up:  configure filter rule for wan_up event*/
-int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type)
-{
-	struct ipa_flt_rule_add flt_rule_entry;
-	int len = 0;
-	ipa_ioc_add_flt_rule *m_pFilteringTable;
-
-	IPACMDBG_H("set WAN interface as default filter rule\n");
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if(ip_type == IPA_IP_v4)
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) + (1 * sizeof(struct ipa_flt_rule_add));
-		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (m_pFilteringTable == NULL)
-		{
-			PERROR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = IPA_IP_v4;
-		m_pFilteringTable->num_rules = (uint8_t)1;
-
-		IPACMDBG_H("Retrieving routing hanle for table: %s\n",
-						 IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name);
-		if (false == m_routing.GetRoutingTable(&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);
-			free(m_pFilteringTable);
-			return IPACM_FAILURE;
-		}
-		IPACMDBG_H("Routing hanle for table: %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl);
-
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); // Zero All Fields
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-		if(IPACM_Wan::isWan_Bridge_Mode())
-		{
-			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-		}
-		else
-		{
-			flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT; //IPA_PASS_TO_ROUTING
-		}
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl;
-
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x0;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x0;
-
-		memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-			free(m_pFilteringTable);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-			IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n",
-							 m_pFilteringTable->rules[0].flt_rule_hdl,
-							 m_pFilteringTable->rules[0].status);
-		}
-
-
-		/* copy filter hdls  */
-		lan_wan_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		free(m_pFilteringTable);
-	}
-	else if(ip_type == IPA_IP_v6)
-	{
-		/* add default v6 filter rule */
-		m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
-			 calloc(1, sizeof(struct ipa_ioc_add_flt_rule) +
-					1 * sizeof(struct ipa_flt_rule_add));
-
-		if (!m_pFilteringTable)
-		{
-			PERROR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = IPA_IP_v6;
-		m_pFilteringTable->num_rules = (uint8_t)1;
-
-		if (false == m_routing.GetRoutingTable(&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);
-			return IPACM_FAILURE;
-		}
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		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_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_v6.hdl;
-
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-
-		memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			free(m_pFilteringTable);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-			IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-		}
-
-		/* copy filter hdls */
-		dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		free(m_pFilteringTable);
-	}
-
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id)
-{
-	int fd, ret = IPACM_SUCCESS, cnt;
-	IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg;
-	struct ipa_ioc_write_qmapid mux;
-
-	if(rx_prop != NULL)
-	{
-		/* give mud ID to IPA-driver for WLAN/LAN pkts */
-		fd = open(IPA_DEVICE_NAME, O_RDWR);
-		if (0 == fd)
-		{
-			IPACMDBG_H("Failed opening %s.\n", IPA_DEVICE_NAME);
-			return IPACM_FAILURE;
-		}
-
-		mux.qmap_id = ipacm_config->GetQmapId();
-		for(cnt=0; cnt<rx_prop->num_rx_props; cnt++)
-		{
-			mux.client = rx_prop->rx[cnt].src_pipe;
-			ret = ioctl(fd, IPA_IOC_WRITE_QMAPID, &mux);
-			if (ret)
-			{
-				IPACMERR("Failed to write mux id %d\n", mux.qmap_id);
-				close(fd);
-				return IPACM_FAILURE;
-			}
-		}
-		close(fd);
-	}
-
-	/* check only add static UL filter rule once */
-	if (num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6 && modem_ul_v6_set == false)
-	{
-		IPACMDBG_H("IPA_IP_v6 num_dft_rt_v6 %d xlat_mux_id: %d modem_ul_v6_set: %d\n", num_dft_rt_v6, xlat_mux_id, modem_ul_v6_set);
-		ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id);
-		modem_ul_v6_set = true;
-	} else if (iptype ==IPA_IP_v4 && modem_ul_v4_set == false) {
-		IPACMDBG_H("IPA_IP_v4 xlat_mux_id: %d, modem_ul_v4_set %d\n", xlat_mux_id, modem_ul_v4_set);
-		ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id);
-		modem_ul_v4_set = true;
-	} else {
-		IPACMDBG_H("ip-type: %d modem_ul_v4_set: %d, modem_ul_v6_set %d\n", iptype, modem_ul_v4_set, modem_ul_v6_set);
-	}
-	return ret;
-}
-
-/* handle ETH client initial, construct full headers (tx property) */
-int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr)
-{
-
-#define ETH_IFACE_INDEX_LEN 2
-
-	int res = IPACM_SUCCESS, len = 0;
-	char index[ETH_IFACE_INDEX_LEN];
-	struct ipa_ioc_copy_hdr sCopyHeader;
-	struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
-	uint32_t cnt;
-	int clnt_indx;
-
-	clnt_indx = get_eth_client_index(mac_addr);
-
-	if (clnt_indx != IPACM_INVALID_INDEX)
-	{
-		IPACMERR("eth client is found/attached already with index %d \n", clnt_indx);
-		return IPACM_FAILURE;
-	}
-
-	/* add header to IPA */
-	if (num_eth_client >= IPA_MAX_NUM_ETH_CLIENTS)
-	{
-		IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_ETH_CLIENTS);
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG_H("ETH client number: %d\n", num_eth_client);
-
-	memcpy(get_client_memptr(eth_client, num_eth_client)->mac,
-				 mac_addr,
-				 sizeof(get_client_memptr(eth_client, num_eth_client)->mac));
-
-
-	IPACMDBG_H("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]);
-
-	IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 get_client_memptr(eth_client, num_eth_client)->mac[0],
-					 get_client_memptr(eth_client, num_eth_client)->mac[1],
-					 get_client_memptr(eth_client, num_eth_client)->mac[2],
-					 get_client_memptr(eth_client, num_eth_client)->mac[3],
-					 get_client_memptr(eth_client, num_eth_client)->mac[4],
-					 get_client_memptr(eth_client, num_eth_client)->mac[5]);
-
-	/* add header to IPA */
-	if(tx_prop != NULL)
-	{
-		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 for v4*/
-		for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-		{
-				 if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-				 {
-								IPACMDBG_H("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_H("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_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-								IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-								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 */
-								if (sCopyHeader.is_eth2_ofst_valid)
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-											 mac_addr,
-											 IPA_MAC_ADDR_SIZE);
-								}
-								/* replace src mac to bridge mac_addr if any  */
-								if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE],
-											IPACM_Iface::ipacmcfg->bridge_mac,
-											IPA_MAC_ADDR_SIZE);
-									IPACMDBG_H("device is in bridge mode \n");
-								}
-
-								pHeaderDescriptor->commit = true;
-								pHeaderDescriptor->num_hdrs = 1;
-
-								memset(pHeaderDescriptor->hdr[0].name, 0,
-											 sizeof(pHeaderDescriptor->hdr[0].name));
-
-								snprintf(index,sizeof(index), "%d", ipa_if_num);
-								strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-								pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-								if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-								{
-									IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-									res = IPACM_FAILURE;
-									goto fail;
-								}
-
-								snprintf(index,sizeof(index), "%d", header_name_count);
-								if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-								{
-									IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-									res = IPACM_FAILURE;
-									goto fail;
-								}
-
-								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;
-					 }
-
-					get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
-					IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
-												 num_eth_client,
-												 pHeaderDescriptor->hdr[0].name,
-												 get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4);
-									get_client_memptr(eth_client, num_eth_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)
-			{
-
-				IPACMDBG_H("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_H("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_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-				IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-				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 */
-				if (sCopyHeader.is_eth2_ofst_valid)
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-						mac_addr,
-						IPA_MAC_ADDR_SIZE);
-				}
-				/* replace src mac to bridge mac_addr if any  */
-				if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE],
-							IPACM_Iface::ipacmcfg->bridge_mac,
-							IPA_MAC_ADDR_SIZE);
-					IPACMDBG_H("device is in bridge mode \n");
-				}
-
-				pHeaderDescriptor->commit = true;
-				pHeaderDescriptor->num_hdrs = 1;
-
-				memset(pHeaderDescriptor->hdr[0].name, 0,
-					 sizeof(pHeaderDescriptor->hdr[0].name));
-
-				snprintf(index,sizeof(index), "%d", ipa_if_num);
-				strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-				pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-				if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-				snprintf(index,sizeof(index), "%d", header_name_count);
-				if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-
-				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;
-				}
-
-				get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
-				IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
-						 num_eth_client,
-						 pHeaderDescriptor->hdr[0].name,
-									 get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6);
-
-									get_client_memptr(eth_client, num_eth_client)->ipv6_header_set=true;
-
-				break;
-
-			}
-		}
-		/* initialize wifi client*/
-		get_client_memptr(eth_client, num_eth_client)->route_rule_set_v4 = false;
-		get_client_memptr(eth_client, num_eth_client)->route_rule_set_v6 = 0;
-		get_client_memptr(eth_client, num_eth_client)->ipv4_set = false;
-		get_client_memptr(eth_client, num_eth_client)->ipv6_set = 0;
-		num_eth_client++;
-		header_name_count++; //keep increasing header_name_count
-		res = IPACM_SUCCESS;
-		IPACMDBG_H("eth client number: %d\n", num_eth_client);
-	}
-	else
-	{
-		return res;
-	}
-fail:
-	free(pHeaderDescriptor);
-	return res;
-}
-
-/*handle eth client */
-int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
-{
-	int clnt_indx;
-	int v6_num;
-	uint32_t ipv6_link_local_prefix = 0xFE800000;
-	uint32_t ipv6_link_local_prefix_mask = 0xFFC00000;
-
-	IPACMDBG_H("number of eth clients: %d\n", num_eth_client);
-	IPACMDBG_H("event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 data->mac_addr[0],
-					 data->mac_addr[1],
-					 data->mac_addr[2],
-					 data->mac_addr[3],
-					 data->mac_addr[4],
-					 data->mac_addr[5]);
-
-	clnt_indx = get_eth_client_index(data->mac_addr);
-
-		if (clnt_indx == IPACM_INVALID_INDEX)
-		{
-			IPACMERR("eth client not found/attached \n");
-			return IPACM_FAILURE;
-		}
-
-	IPACMDBG_H("Ip-type received %d\n", data->iptype);
-	if (data->iptype == IPA_IP_v4)
-	{
-		IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr);
-		if (data->ipv4_addr != 0) /* not 0.0.0.0 */
-		{
-			if (get_client_memptr(eth_client, clnt_indx)->ipv4_set == false)
-			{
-				get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr;
-				get_client_memptr(eth_client, clnt_indx)->ipv4_set = true;
-			}
-			else
-			{
-			   /* check if client got new IPv4 address*/
-			   if(data->ipv4_addr == get_client_memptr(eth_client, clnt_indx)->v4_addr)
-			   {
-				IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx);
-				 return IPACM_FAILURE;
-			   }
-			   else
-			   {
-					IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx);
-					/* delete NAT rules first */
-					CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, clnt_indx)->v4_addr);
-					delete_eth_rtrules(clnt_indx,IPA_IP_v4);
-					get_client_memptr(eth_client, clnt_indx)->route_rule_set_v4 = false;
-					get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr;
-				}
-			}
-		}
-		else
-		{
-		    IPACMDBG_H("Invalid client IPv4 address \n");
-		    return IPACM_FAILURE;
-		}
-	}
-	else
-	{
-		if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
-				(data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
-		{
-			IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-			if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
-				memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0)
-			{
-				IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n");
-				return IPACM_FAILURE;
-			}
-
-            if(get_client_memptr(eth_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
-			{
-
-		       for(v6_num=0;v6_num < get_client_memptr(eth_client, clnt_indx)->ipv6_set;v6_num++)
-				{
-					if( data->ipv6_addr[0] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][0] &&
-			           data->ipv6_addr[1] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][1] &&
-			  	        data->ipv6_addr[2]== get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][2] &&
-			  	         data->ipv6_addr[3] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][3])
-					{
-						IPACMDBG_H("Already see this ipv6 addr at position: %d for client:%d\n", v6_num, clnt_indx);
-						return IPACM_FAILURE; /* not setup the RT rules*/
-					}
-				}
-
-		       /* not see this ipv6 before for wifi client*/
-			   get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0];
-			   get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1];
-			   get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2];
-			   get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3];
-			   get_client_memptr(eth_client, clnt_indx)->ipv6_set++;
-		    }
-		    else
-		    {
-		        IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx);
-				return IPACM_FAILURE; /* not setup the RT rules*/
-		    }
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle eth client routing rule*/
-int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype)
-{
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	uint32_t tx_index;
-	int eth_index,v6_num;
-	const int NUM = 1;
-	char cmd[200] = {0};
-	uint32_t ipv4_addr;
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	IPACMDBG_H("Received mac_addr 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]);
-
-	eth_index = get_eth_client_index(mac_addr);
-	if (eth_index == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("eth client not found/attached \n");
-		return IPACM_SUCCESS;
-	}
-
-	if (iptype==IPA_IP_v4) {
-		IPACMDBG_H("eth client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", eth_index, iptype,
-					 get_client_memptr(eth_client, eth_index)->ipv4_set,
-					 get_client_memptr(eth_client, eth_index)->route_rule_set_v4);
-	} else {
-		IPACMDBG_H("eth client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", eth_index, iptype,
-					 get_client_memptr(eth_client, eth_index)->ipv6_set,
-					 get_client_memptr(eth_client, eth_index)->route_rule_set_v6);
-	}
-	/* Add default routing rules if not set yet */
-	if ((iptype == IPA_IP_v4
-			 && get_client_memptr(eth_client, eth_index)->route_rule_set_v4 == false
-			 && get_client_memptr(eth_client, eth_index)->ipv4_set == true)
-			|| (iptype == IPA_IP_v6
-		            && get_client_memptr(eth_client, eth_index)->route_rule_set_v6 < get_client_memptr(eth_client, eth_index)->ipv6_set
-					))
-	{
-
-        /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		if (tx_prop != NULL)
-		{
-			IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-			IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-		}
-		rt_rule = (struct ipa_ioc_add_rt_rule *)
-			 calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
-						NUM * sizeof(struct ipa_rt_rule_add));
-
-		if (rt_rule == NULL)
-		{
-			PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = (uint8_t)NUM;
-		rt_rule->ip = iptype;
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			if(iptype != tx_prop->tx[tx_index].ip)
-		    {
-				IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
-						tx_index, tx_prop->tx[tx_index].ip,iptype);
-		   	        continue;
-		    }
-
-  	   	    rt_rule_entry = &rt_rule->rules[0];
-			rt_rule_entry->at_rear = 0;
-
-			if (iptype == IPA_IP_v4)
-			{
-		        IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", eth_index,
-		  		        get_client_memptr(eth_client, eth_index)->v4_addr);
-
-                IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
-		  				 eth_index,
-		  				 get_client_memptr(eth_client, eth_index)->hdr_hdl_v4);
-
-				/* add static arp entry */
-				ipv4_addr = get_client_memptr(eth_client, eth_index)->v4_addr;
-				snprintf(cmd, sizeof(cmd), "ip neighbor change %d.%d.%d.%d lladdr %02x:%02x:%02x:%02x:%02x:%02x dev %s nud permanent",
-					(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
-					(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr,
-					mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5],
-					dev_name);
-				IPACMDBG_H("%s\n", cmd);
-				system(cmd);
-
-				strlcpy(rt_rule->rt_tbl_name,
-								IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
-								sizeof(rt_rule->rt_tbl_name));
-				rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-			    rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-			    memcpy(&rt_rule_entry->rule.attrib,
-						 &tx_prop->tx[tx_index].attrib,
-						 sizeof(rt_rule_entry->rule.attrib));
-			    rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		   	    rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v4;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(eth_client, eth_index)->v4_addr;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-				rt_rule_entry->rule.hashable = false;
-#endif
-			    if (false == m_routing.AddRoutingRule(rt_rule))
-  	            {
-  	          	            IPACMERR("Routing rule addition failed!\n");
-  	          	            free(rt_rule);
-  	          	            return IPACM_FAILURE;
-			    }
-
-			    /* copy ipv4 RT hdl */
-		        get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 =
-  	   	        rt_rule->rules[0].rt_rule_hdl;
-		        IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-		      	get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4, iptype);
-
-  	   	    } else {
-
-		        for(v6_num = get_client_memptr(eth_client, eth_index)->route_rule_set_v6;v6_num < get_client_memptr(eth_client, eth_index)->ipv6_set;v6_num++)
-			    {
-                    IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n",
-		  	    			 eth_index,
-		  	    			 get_client_memptr(eth_client, eth_index)->hdr_hdl_v6);
-
-		            /* v6 LAN_RT_TBL */
-				strlcpy(rt_rule->rt_tbl_name,
-			    					IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
-			    					sizeof(rt_rule->rt_tbl_name));
-				rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		            /* Support QCMAP LAN traffic feature, send to A5 */
-					rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS;
-			        memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib));
-		   	        rt_rule_entry->rule.hdr_hdl = 0;
-			        rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][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;
-#ifdef FEATURE_IPA_V3
-					rt_rule_entry->rule.hashable = true;
-#endif
-   	                if (false == m_routing.AddRoutingRule(rt_rule))
-  	                {
-  	                	    IPACMERR("Routing rule addition failed!\n");
-  	                	    free(rt_rule);
-  	                	    return IPACM_FAILURE;
-			        }
-
-		            get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-		            IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-		            				 get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num], iptype);
-
-			        /*Copy same rule to v6 WAN RT TBL*/
-				strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name));
-				rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-				/* Downlink traffic from Wan iface, directly through IPA */
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-			        memcpy(&rt_rule_entry->rule.attrib,
-						 &tx_prop->tx[tx_index].attrib,
-						 sizeof(rt_rule_entry->rule.attrib));
-		   	        rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v6;
-			        rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2];
-		   	        rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][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;
-#ifdef FEATURE_IPA_V3
-					rt_rule_entry->rule.hashable = true;
-#endif
-		            if (false == m_routing.AddRoutingRule(rt_rule))
-		            {
-							IPACMERR("Routing rule addition failed!\n");
-							free(rt_rule);
-							return IPACM_FAILURE;
-		            }
-
-		            get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-					IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-		            				 get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num], iptype);
-			    }
-			}
-
-  	    } /* end of for loop */
-
-		free(rt_rule);
-
-		if (iptype == IPA_IP_v4)
-		{
-			get_client_memptr(eth_client, eth_index)->route_rule_set_v4 = true;
-		}
-		else
-		{
-			get_client_memptr(eth_client, eth_index)->route_rule_set_v6 = get_client_memptr(eth_client, eth_index)->ipv6_set;
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-/* handle odu client initial, construct full headers (tx property) */
-int IPACM_Lan::handle_odu_hdr_init(uint8_t *mac_addr)
-{
-	int res = IPACM_SUCCESS, len = 0;
-	struct ipa_ioc_copy_hdr sCopyHeader;
-	struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
-	uint32_t cnt;
-
-	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]);
-
-	/* add header to IPA */
-	if(tx_prop != NULL)
-	{
-		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 for v4*/
-		for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-		{
-				 if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-				 {
-								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);
-								}
-								/* copy client mac_addr to partial header */
-								if (sCopyHeader.is_eth2_ofst_valid)
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-											 mac_addr,
-											 IPA_MAC_ADDR_SIZE);
-								}
-								/* replace src mac to bridge mac_addr if any  */
-								if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE],
-											IPACM_Iface::ipacmcfg->bridge_mac,
-											IPA_MAC_ADDR_SIZE);
-									IPACMDBG_H("device is in bridge mode \n");
-								}
-
-								pHeaderDescriptor->commit = true;
-								pHeaderDescriptor->num_hdrs = 1;
-
-								memset(pHeaderDescriptor->hdr[0].name, 0,
-											 sizeof(pHeaderDescriptor->hdr[0].name));
-								strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].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;
-					 }
-
-					ODU_hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
-					ipv4_header_set = true ;
-					IPACMDBG(" ODU v4 full header name:%s header handle:(0x%x)\n",
-										 pHeaderDescriptor->hdr[0].name,
-												 ODU_hdr_hdl_v4);
-					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)
-			{
-
-				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 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 */
-				if (sCopyHeader.is_eth2_ofst_valid)
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-					 mac_addr,
-					 IPA_MAC_ADDR_SIZE);
-				}
-				/* replace src mac to bridge mac_addr if any  */
-				if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE],
-							IPACM_Iface::ipacmcfg->bridge_mac,
-							IPA_MAC_ADDR_SIZE);
-					IPACMDBG_H("device is in bridge mode \n");
-				}
-
-				pHeaderDescriptor->commit = true;
-				pHeaderDescriptor->num_hdrs = 1;
-
-				memset(pHeaderDescriptor->hdr[0].name, 0,
-					 sizeof(pHeaderDescriptor->hdr[0].name));
-
-				strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].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;
-				}
-
-				ODU_hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
-				ipv6_header_set = true ;
-				IPACMDBG(" ODU v4 full header name:%s header handle:(0x%x)\n",
-									 pHeaderDescriptor->hdr[0].name,
-											 ODU_hdr_hdl_v6);
-				break;
-			}
-		}
-	}
-fail:
-	free(pHeaderDescriptor);
-	return res;
-}
-
-
-/* handle odu default route rule configuration */
-int IPACM_Lan::handle_odu_route_add()
-{
-	/* add default WAN route */
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	uint32_t tx_index;
-	const int NUM = 1;
-
-	if(tx_prop == NULL)
-	{
-	  IPACMDBG_H("No tx properties, ignore default route setting\n");
-	  return IPACM_SUCCESS;
-	}
-
-	rt_rule = (struct ipa_ioc_add_rt_rule *)
-		 calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
-						NUM * sizeof(struct ipa_rt_rule_add));
-
-	if (!rt_rule)
-	{
-		IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-		return IPACM_FAILURE;
-	}
-
-	rt_rule->commit = 1;
-	rt_rule->num_rules = (uint8_t)NUM;
-
-
-	IPACMDBG_H("WAN table created %s \n", rt_rule->rt_tbl_name);
-	rt_rule_entry = &rt_rule->rules[0];
-	rt_rule_entry->at_rear = true;
-
-	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-	{
-
-		if (IPA_IP_v4 == tx_prop->tx[tx_index].ip)
-		{
-			strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name, sizeof(rt_rule->rt_tbl_name));
-			rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v4;
-			rt_rule->ip = IPA_IP_v4;
-		}
-		else
-		{
-			strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name, sizeof(rt_rule->rt_tbl_name));
-			rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v6;
-			rt_rule->ip = IPA_IP_v6;
-		}
-
-		rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-		memcpy(&rt_rule_entry->rule.attrib,
-					 &tx_prop->tx[tx_index].attrib,
-					 sizeof(rt_rule_entry->rule.attrib));
-
-		rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		if (IPA_IP_v4 == tx_prop->tx[tx_index].ip)
-		{
-			rt_rule_entry->rule.attrib.u.v4.dst_addr      = 0;
-			rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0;
-#ifdef FEATURE_IPA_V3
-			rt_rule_entry->rule.hashable = true;
-#endif
-			if (false == m_routing.AddRoutingRule(rt_rule))
-			{
-				IPACMERR("Routing rule addition failed!\n");
-				free(rt_rule);
-				return IPACM_FAILURE;
-			}
-			odu_route_rule_v4_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
-			IPACMDBG_H("Got ipv4 ODU-route rule hdl:0x%x,tx:%d,ip-type: %d \n",
-						 odu_route_rule_v4_hdl[tx_index],
-						 tx_index,
-						 IPA_IP_v4);
-		}
-		else
-		{
-			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;
-#ifdef FEATURE_IPA_V3
-			rt_rule_entry->rule.hashable = true;
-#endif
-			if (false == m_routing.AddRoutingRule(rt_rule))
-			{
-				IPACMERR("Routing rule addition failed!\n");
-				free(rt_rule);
-				return IPACM_FAILURE;
-			}
-			odu_route_rule_v6_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
-			IPACMDBG_H("Set ipv6 ODU-route rule hdl for v6_lan_table:0x%x,tx:%d,ip-type: %d \n",
-					odu_route_rule_v6_hdl[tx_index],
-					tx_index,
-					IPA_IP_v6);
-		}
-	}
-	free(rt_rule);
-	return IPACM_SUCCESS;
-}
-
-/* handle odu default route rule deletion */
-int IPACM_Lan::handle_odu_route_del()
-{
-	uint32_t tx_index;
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No tx properties, ignore delete default route setting\n");
-		return IPACM_SUCCESS;
-	}
-
-	for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-	{
-		if (tx_prop->tx[tx_index].ip == IPA_IP_v4)
-		{
-			IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n",
-					tx_index, tx_prop->tx[tx_index].ip,IPA_IP_v4);
-
-			if (m_routing.DeleteRoutingHdl(odu_route_rule_v4_hdl[tx_index], IPA_IP_v4)
-					== false)
-			{
-				IPACMERR("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v4, odu_route_rule_v4_hdl[tx_index], tx_index);
-				return IPACM_FAILURE;
-			}
-		}
-		else
-		{
-			IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n",
-					tx_index, tx_prop->tx[tx_index].ip,IPA_IP_v6);
-
-			if (m_routing.DeleteRoutingHdl(odu_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, odu_route_rule_v6_hdl[tx_index], tx_index);
-				return IPACM_FAILURE;
-			}
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle eth client del mode*/
-int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr)
-{
-	int clt_indx;
-	uint32_t tx_index;
-	int num_eth_client_tmp = num_eth_client;
-	int num_v6;
-	char cmd[200] = {0};
-	uint32_t ipv4_addr;
-
-	IPACMDBG_H("total client: %d\n", num_eth_client_tmp);
-
-	clt_indx = get_eth_client_index(mac_addr);
-	if (clt_indx == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("eth client not attached\n");
-		return IPACM_SUCCESS;
-	}
-
-	/* First reset nat rules and then route rules */
-	if(get_client_memptr(eth_client, clt_indx)->ipv4_set == true)
-	{
-			IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, clt_indx)->v4_addr);
-			CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, clt_indx)->v4_addr);
- 	}
-
-	if (delete_eth_rtrules(clt_indx, IPA_IP_v4))
-	{
-		IPACMERR("unbale to delete ecm-client v4 route rules for index: %d\n", clt_indx);
-		return IPACM_FAILURE;
-	}
-
-	if (delete_eth_rtrules(clt_indx, IPA_IP_v6))
-	{
-		IPACMERR("unbale to delete ecm-client v6 route rules for index: %d\n", clt_indx);
-		return IPACM_FAILURE;
-	}
-
-	/* Delete eth client header */
-	if(get_client_memptr(eth_client, clt_indx)->ipv4_header_set == true)
-	{
-		if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4)
-				== false)
-		{
-			return IPACM_FAILURE;
-		}
-		get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false;
-	}
-
-	if(get_client_memptr(eth_client, clt_indx)->ipv6_header_set == true)
-	{
-		if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6)
-				== false)
-		{
-			return IPACM_FAILURE;
-		}
-		get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false;
-	}
-
-	/* Reset ip_set to 0*/
-	get_client_memptr(eth_client, clt_indx)->ipv4_set = false;
-	get_client_memptr(eth_client, clt_indx)->ipv6_set = 0;
-	get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false;
-	get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false;
-	get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false;
-	get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0;
-
-	ipv4_addr = get_client_memptr(eth_client, clt_indx)->v4_addr;
-	snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s",
-		(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
-		(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name);
-	system(cmd);
-	IPACMDBG_H("%s\n", cmd);
-
-	for (; clt_indx < num_eth_client_tmp - 1; clt_indx++)
-	{
-		memcpy(get_client_memptr(eth_client, clt_indx)->mac,
-					 get_client_memptr(eth_client, (clt_indx + 1))->mac,
-					 sizeof(get_client_memptr(eth_client, clt_indx)->mac));
-
-		get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v4;
-		get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v6;
-		get_client_memptr(eth_client, clt_indx)->v4_addr = get_client_memptr(eth_client, (clt_indx + 1))->v4_addr;
-
-		get_client_memptr(eth_client, clt_indx)->ipv4_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_set;
-		get_client_memptr(eth_client, clt_indx)->ipv6_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_set;
-		get_client_memptr(eth_client, clt_indx)->ipv4_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_header_set;
-		get_client_memptr(eth_client, clt_indx)->ipv6_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_header_set;
-
-		get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v4;
-		get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v6;
-
-        for (num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->ipv6_set;num_v6++)
-	    {
-		    get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][0] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][0];
-		    get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][1] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][1];
-		    get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][2] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][2];
-		    get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][3] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][3];
-        }
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 =
-				 get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4;
-
-			for(num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++)
-			{
-			  get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6] =
-			   	 get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6];
-			  get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6] =
-			   	 get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6];
-		    }
-		}
-	}
-
-	IPACMDBG_H(" %d eth client deleted successfully \n", num_eth_client);
-	num_eth_client = num_eth_client - 1;
-	IPACMDBG_H(" Number of eth client: %d\n", num_eth_client);
-
-	/* Del RM dependency */
-	if(num_eth_client == 0)
-	{
-		/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		if (tx_prop != NULL)
-		{
-			IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-			IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle LAN iface down event*/
-int IPACM_Lan::handle_down_evt()
-{
-	int i;
-	int res = IPACM_SUCCESS;
-	char cmd[200] = {0};
-	uint32_t ipv4_addr;
-
-	IPACMDBG_H("lan handle_down_evt\n ");
-	if (ipa_if_cate == ODU_IF)
-	{
-		/* delete ODU default RT rules */
-		if (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true)
-		{
-			IPACMDBG_H("eMBMS enable, delete eMBMS DL RT rule\n");
-			handle_odu_route_del();
-		}
-
-		/* delete full header */
-		if (ipv4_header_set)
-		{
-			if (m_header.DeleteHeaderHdl(ODU_hdr_hdl_v4)
-					== false)
-			{
-					IPACMERR("ODU ipv4 header delete fail\n");
-					res = IPACM_FAILURE;
-					goto fail;
-			}
-			IPACMDBG_H("ODU ipv4 header delete success\n");
-		}
-
-		if (ipv6_header_set)
-		{
-			if (m_header.DeleteHeaderHdl(ODU_hdr_hdl_v6)
-					== false)
-			{
-				IPACMERR("ODU ipv6 header delete fail\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-			IPACMERR("ODU ipv6 header delete success\n");
-		}
-	}
-
-	/* no iface address up, directly close iface*/
-	if (ip_type == IPACM_IP_NULL)
-	{
-		goto fail;
-	}
-
-	/* delete wan filter rule */
-	if (IPACM_Wan::isWanUP(ipa_if_num) && rx_prop != NULL)
-	{
-		IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode);
-		handle_wan_down(IPACM_Wan::backhaul_is_sta_mode);
-	}
-
-	if (IPACM_Wan::isWanUP_V6(ipa_if_num) && rx_prop != NULL)
-	{
-		IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode);
-		handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode);
-	}
-
-	/* delete default filter rules */
-	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
-	{
-		if(m_filtering.DeleteFilteringHdls(ipv4_icmp_flt_rule_hdl, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE) == false)
-		{
-			IPACMERR("Error Deleting ICMPv4 Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE);
-
-		if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("Error Deleting Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES);
-
-		/* free private-subnet ipv4 filter rules */
-		if (IPACM_Iface::ipacmcfg->ipa_num_private_subnet > IPA_PRIV_SUBNET_FILTER_RULE_HANDLES)
-		{
-			IPACMERR(" the number of rules are bigger than array, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-#ifdef FEATURE_IPA_ANDROID
-		if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES) == false)
-		{
-			IPACMERR("Error deleting private subnet IPv4 flt rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES);
-#else
-		if (m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet) == false)
-		{
-			IPACMERR("Error deleting private subnet IPv4 flt rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
-#endif
-		IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n");
-	}
-	IPACMDBG_H("Finished delete default iface ipv4 filtering rules \n ");
-
-	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
-	{
-		if(m_filtering.DeleteFilteringHdls(ipv6_icmp_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE) == false)
-		{
-			IPACMERR("Error Deleting ICMPv6 Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE);
-
-		if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
-	}
-	IPACMDBG_H("Finished delete default iface ipv6 filtering rules \n ");
-
-	if (ip_type != IPA_IP_v6)
-	{
-		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4)
-				== false)
-		{
-			IPACMERR("Routing rule deletion failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-	IPACMDBG_H("Finished delete default iface ipv4 rules \n ");
-
-	/* delete default v6 routing rule */
-	if (ip_type != IPA_IP_v4)
-	{
-		/* may have multiple ipv6 iface-RT rules*/
-		for (i = 0; i < 2*num_dft_rt_v6; i++)
-		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + i], IPA_IP_v6)
-					== false)
-			{
-				IPACMERR("Routing rule deletion failed!\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-		}
-	}
-
-	IPACMDBG_H("Finished delete default iface ipv6 rules \n ");
-
-	/* free the edm clients cache */
-	IPACMDBG_H("Free ecm clients cache\n");
-
-	/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */
-	IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
-	if (tx_prop != NULL)
-	{
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-	}
-
-	eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
-
-/* Delete private subnet*/
-#ifdef FEATURE_IPA_ANDROID
-	if (ip_type != IPA_IP_v6)
-	{
-		IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
-		IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false)
-		{
-			IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		}
-	}
-
-	/* reset the IPA-client pipe enum */
-	if(ipa_if_cate != WAN_IF)
-	{
-		handle_tethering_client(true, IPACM_CLIENT_USB);
-	}
-#endif /* defined(FEATURE_IPA_ANDROID)*/
-fail:
-	/* clean eth-client header, routing rules */
-	IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
-	for (i = 0; i < num_eth_client; i++)
-	{
-		ipv4_addr = get_client_memptr(eth_client, i)->v4_addr;
-		snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s",
-			(unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16),
-			(unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name);
-		system(cmd);
-		IPACMDBG_H("%s\n", cmd);
-
-		/* First reset nat rules and then route rules */
-		if(get_client_memptr(eth_client, i)->ipv4_set == true)
-		{
-			IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, i)->v4_addr);
-			CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, i)->v4_addr);
-		}
-
-		if (delete_eth_rtrules(i, IPA_IP_v4))
-		{
-			IPACMERR("unbale to delete ecm-client v4 route rules for index %d\n", i);
-			res = IPACM_FAILURE;
-		}
-
-		if (delete_eth_rtrules(i, IPA_IP_v6))
-		{
-			IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i);
-			res = IPACM_FAILURE;
-		}
-
-		IPACMDBG_H("Delete %d client header\n", num_eth_client);
-
-		if(get_client_memptr(eth_client, i)->ipv4_header_set == true)
-		{
-			if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v4)
-				== false)
-			{
-				res = IPACM_FAILURE;
-			}
-		}
-
-		if(get_client_memptr(eth_client, i)->ipv6_header_set == true)
-		{
-			if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v6)
-					== false)
-			{
-				res = IPACM_FAILURE;
-			}
-		}
-	} /* end of for loop */
-
-	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true && rx_prop != NULL)
-	{
-		handle_software_routing_disable();
-	}
-
-	if (odu_route_rule_v4_hdl != NULL)
-	{
-		free(odu_route_rule_v4_hdl);
-	}
-	if (odu_route_rule_v6_hdl != NULL)
-	{
-		free(odu_route_rule_v6_hdl);
-	}
-	/* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
-	if (rx_prop != NULL)
-	{
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
-		IPACMDBG_H("Finished delete dependency \n ");
-		free(rx_prop);
-	}
-
-	if (eth_client != NULL)
-	{
-		free(eth_client);
-	}
-
-	if (tx_prop != NULL)
-	{
-		free(tx_prop);
-	}
-	if (iface_query != NULL)
-	{
-		free(iface_query);
-	}
-
-	is_active = false;
-	post_del_self_evt();
-
-	return res;
-}
-
-/* install UL filter rule from Q6 */
-int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptype, uint8_t xlat_mux_id)
-{
-	ipa_flt_rule_add flt_rule_entry;
-	int len = 0, cnt, ret = IPACM_SUCCESS;
-	ipa_ioc_add_flt_rule *pFilteringTable;
-	ipa_fltr_installed_notif_req_msg_v01 flt_index;
-	int fd;
-	int i, index;
-	uint32_t value = 0;
-
-	IPACMDBG_H("Set modem UL flt rules\n");
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if(prop == NULL || prop->num_ext_props <= 0)
-	{
-		IPACMDBG_H("No extended property.\n");
-		return IPACM_SUCCESS;
-	}
-
-	fd = open(IPA_DEVICE_NAME, O_RDWR);
-	if (0 == fd)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-	if (prop->num_ext_props > MAX_WAN_UL_FILTER_RULES)
-	{
-		IPACMERR("number of modem UL rules > MAX_WAN_UL_FILTER_RULES, aborting...\n");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-
-	memset(&flt_index, 0, sizeof(flt_index));
-	flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
-	flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01;
-#ifndef FEATURE_IPA_V3
-	flt_index.filter_index_list_len = prop->num_ext_props;
-#else /* defined (FEATURE_IPA_V3) */
-	flt_index.rule_id_valid = 1;
-	flt_index.rule_id_len = prop->num_ext_props;
-#endif
-	flt_index.embedded_pipe_index_valid = 1;
-	flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD);
-	flt_index.retain_header_valid = 1;
-	flt_index.retain_header = 0;
-	flt_index.embedded_call_mux_id_valid = 1;
-	flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId();
-#ifndef FEATURE_IPA_V3
-	IPACMDBG_H("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n",
-		flt_index.source_pipe_index, flt_index.filter_index_list_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id);
-#else /* defined (FEATURE_IPA_V3) */
-	IPACMDBG_H("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n",
-		flt_index.source_pipe_index, flt_index.rule_id_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id);
-#endif
-	len = sizeof(struct ipa_ioc_add_flt_rule) + prop->num_ext_props * sizeof(struct ipa_flt_rule_add);
-	pFilteringTable = (struct ipa_ioc_add_flt_rule*)malloc(len);
-	if (pFilteringTable == NULL)
-	{
-		IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-	memset(pFilteringTable, 0, len);
-
-	pFilteringTable->commit = 1;
-	pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-	pFilteringTable->global = false;
-	pFilteringTable->ip = iptype;
-	pFilteringTable->num_rules = prop->num_ext_props;
-
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); // Zero All Fields
-	flt_rule_entry.at_rear = 1;
-#ifdef FEATURE_IPA_V3
-	if (flt_rule_entry.rule.eq_attrib.ipv4_frag_eq_present)
-		flt_rule_entry.at_rear = 0;
-#endif
-	flt_rule_entry.flt_rule_hdl = -1;
-	flt_rule_entry.status = -1;
-
-	flt_rule_entry.rule.retain_hdr = 0;
-	flt_rule_entry.rule.to_uc = 0;
-	flt_rule_entry.rule.eq_attrib_type = 1;
-	if(iptype == IPA_IP_v4)
-	{
-		if (ipa_if_cate == ODU_IF && IPACM_Wan::isWan_Bridge_Mode())
-		{
-			IPACMDBG_H("WAN, ODU are in bridge mode \n");
-			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-		}
-		else
-		{
-			flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
-		}
-	}
-	else if(iptype == IPA_IP_v6)
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-	else
-	{
-		IPACMERR("IP type is not expected.\n");
-		ret = IPACM_FAILURE;
-		goto fail;
-	}
-
-	index = IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, iptype);
-
-	for(cnt=0; cnt<prop->num_ext_props; cnt++)
-	{
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &prop->prop[cnt].eq_attrib,
-					 sizeof(prop->prop[cnt].eq_attrib));
-		flt_rule_entry.rule.rt_tbl_idx = prop->prop[cnt].rt_tbl_idx;
-
-		/* Handle XLAT configuration */
-		if ((iptype == IPA_IP_v4) && prop->prop[cnt].is_xlat_rule && (xlat_mux_id != 0))
-		{
-			/* fill the value of meta-data */
-			value = xlat_mux_id;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.value = (value & 0xFF) << 16;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.mask = 0x00FF0000;
-			IPACMDBG_H("xlat meta-data is modified for rule: %d has index %d with xlat_mux_id: %d\n",
-					cnt, index, xlat_mux_id);
-		}
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = prop->prop[cnt].is_rule_hashable;
-		flt_rule_entry.rule.rule_id = prop->prop[cnt].rule_id;
-		if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA)	//turn on meta-data equation
-		{
-			flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9);
-			flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.value |= rx_prop->rx[0].attrib.meta_data;
-			flt_rule_entry.rule.eq_attrib.metadata_meq32.mask |= rx_prop->rx[0].attrib.meta_data_mask;
-		}
-#endif
-		memcpy(&pFilteringTable->rules[cnt], &flt_rule_entry, sizeof(flt_rule_entry));
-
-		IPACMDBG_H("Modem UL filtering rule %d has index %d\n", cnt, index);
-#ifndef FEATURE_IPA_V3
-		flt_index.filter_index_list[cnt].filter_index = index;
-		flt_index.filter_index_list[cnt].filter_handle = prop->prop[cnt].filter_hdl;
-#else /* defined (FEATURE_IPA_V3) */
-		flt_index.rule_id[cnt] = prop->prop[cnt].rule_id;
-#endif
-		index++;
-	}
-
-	if(false == m_filtering.SendFilteringRuleIndex(&flt_index))
-	{
-		IPACMERR("Error sending filtering rule index, aborting...\n");
-		ret = IPACM_FAILURE;
-		goto fail;
-	}
-
-	if(false == m_filtering.AddFilteringRule(pFilteringTable))
-	{
-		IPACMERR("Error Adding RuleTable to Filtering, aborting...\n");
-		ret = IPACM_FAILURE;
-		goto fail;
-	}
-	else
-	{
-		if(iptype == IPA_IP_v4)
-		{
-			for(i=0; i<pFilteringTable->num_rules; i++)
-			{
-				wan_ul_fl_rule_hdl_v4[num_wan_ul_fl_rule_v4] = pFilteringTable->rules[i].flt_rule_hdl;
-				num_wan_ul_fl_rule_v4++;
-			}
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules);
-		}
-		else if(iptype == IPA_IP_v6)
-		{
-			for(i=0; i<pFilteringTable->num_rules; i++)
-			{
-				wan_ul_fl_rule_hdl_v6[num_wan_ul_fl_rule_v6] = pFilteringTable->rules[i].flt_rule_hdl;
-				num_wan_ul_fl_rule_v6++;
-			}
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules);
-		}
-		else
-		{
-			IPACMERR("IP type is not expected.\n");
-			goto fail;
-		}
-	}
-
-fail:
-	free(pFilteringTable);
-	close(fd);
-	return ret;
-}
-
-int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode)
-{
-	ipa_fltr_installed_notif_req_msg_v01 flt_index;
-	int fd;
-
-	fd = open(IPA_DEVICE_NAME, O_RDWR);
-	if (0 == fd)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-
-	delete_ipv6_prefix_flt_rule();
-
-	memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
-
-	if(is_sta_mode == false)
-	{
-		if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES)
-		{
-			IPACMERR(" the number of rules (%d) are bigger than array (%d), aborting...\n", num_wan_ul_fl_rule_v6, MAX_WAN_UL_FILTER_RULES);
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		if (num_wan_ul_fl_rule_v6 == 0)
-		{
-			IPACMERR("No modem UL rules were installed, return...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-
-		if (m_filtering.DeleteFilteringHdls(wan_ul_fl_rule_hdl_v6,
-			IPA_IP_v6, num_wan_ul_fl_rule_v6) == false)
-		{
-			IPACMERR("Error Deleting RuleTable(1) to Filtering, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_wan_ul_fl_rule_v6);
-		memset(wan_ul_fl_rule_hdl_v6, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
-		num_wan_ul_fl_rule_v6 = 0;
-		modem_ul_v6_set = false;
-
-		memset(&flt_index, 0, sizeof(flt_index));
-		flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
-		flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01;
-#ifndef FEATURE_IPA_V3
-		flt_index.filter_index_list_len = 0;
-#else /* defined (FEATURE_IPA_V3) */
-		flt_index.rule_id_valid = 1;
-		flt_index.rule_id_len = 0;
-#endif
-		flt_index.embedded_pipe_index_valid = 1;
-		flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD);
-		flt_index.retain_header_valid = 1;
-		flt_index.retain_header = 0;
-		flt_index.embedded_call_mux_id_valid = 1;
-		flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId();
-		if(false == m_filtering.SendFilteringRuleIndex(&flt_index))
-		{
-			IPACMERR("Error sending filtering rule index, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-	}
-	else
-	{
-		if (m_filtering.DeleteFilteringHdls(&dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES],
-																				IPA_IP_v6, 1) == false)
-		{
-			IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
-			close(fd);
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-	}
-	close(fd);
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl)
-{
-	int len, res = IPACM_SUCCESS;
-	struct ipa_flt_rule_mdfy flt_rule;
-	struct ipa_ioc_mdfy_flt_rule* pFilteringTable;
-
-	IPACMDBG_H("Reset flt rule to dummy, IP type: %d, hdl: %d\n", iptype, rule_hdl);
-	len = sizeof(struct ipa_ioc_mdfy_flt_rule) + sizeof(struct ipa_flt_rule_mdfy);
-	pFilteringTable = (struct ipa_ioc_mdfy_flt_rule*)malloc(len);
-
-	if (pFilteringTable == NULL)
-	{
-		IPACMERR("Error allocate flt rule memory...\n");
-		return IPACM_FAILURE;
-	}
-	memset(pFilteringTable, 0, len);
-
-	pFilteringTable->commit = 1;
-	pFilteringTable->ip = iptype;
-	pFilteringTable->num_rules = 1;
-
-	memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy));
-	flt_rule.status = -1;
-	flt_rule.rule_hdl = rule_hdl;
-
-	flt_rule.rule.retain_hdr = 0;
-	flt_rule.rule.action = IPA_PASS_TO_EXCEPTION;
-
-	if(iptype == IPA_IP_v4)
-	{
-		IPACMDBG_H("Reset IPv4 flt rule to dummy\n");
-
-		flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
-		flt_rule.rule.attrib.u.v4.dst_addr = ~0;
-		flt_rule.rule.attrib.u.v4.dst_addr_mask = ~0;
-		flt_rule.rule.attrib.u.v4.src_addr = ~0;
-		flt_rule.rule.attrib.u.v4.src_addr_mask = ~0;
-
-		memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
-		if (false == m_filtering.ModifyFilteringRule(pFilteringTable))
-		{
-			IPACMERR("Error modifying filtering rule.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else
-		{
-			IPACMDBG_H("Flt rule reset to dummy, hdl: 0x%x, status: %d\n", pFilteringTable->rules[0].rule_hdl,
-						pFilteringTable->rules[0].status);
-		}
-	}
-	else if(iptype == IPA_IP_v6)
-	{
-		IPACMDBG_H("Reset IPv6 flt rule to dummy\n");
-
-		flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
-		flt_rule.rule.attrib.u.v6.src_addr[0] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr[1] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr[2] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr[3] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr_mask[0] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr_mask[1] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr_mask[2] = ~0;
-		flt_rule.rule.attrib.u.v6.src_addr_mask[3] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr[0] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr[1] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr[2] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr[3] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = ~0;
-		flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = ~0;
-
-
-		memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
-		if (false == m_filtering.ModifyFilteringRule(pFilteringTable))
-		{
-			IPACMERR("Error modifying filtering rule.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else
-		{
-			IPACMDBG_H("Flt rule reset to dummy, hdl: 0x%x, status: %d\n", pFilteringTable->rules[0].rule_hdl,
-						pFilteringTable->rules[0].status);
-		}
-	}
-	else
-	{
-		IPACMERR("IP type is not expected.\n");
-		res = IPACM_FAILURE;
-		goto fail;
-	}
-
-fail:
-	free(pFilteringTable);
-	return res;
-}
-
-void IPACM_Lan::post_del_self_evt()
-{
-	ipacm_cmd_q_data evt;
-	ipacm_event_data_fid* fid;
-	fid = (ipacm_event_data_fid*)malloc(sizeof(ipacm_event_data_fid));
-	if(fid == NULL)
-	{
-		IPACMERR("Failed to allocate fid memory.\n");
-		return;
-	}
-	memset(fid, 0, sizeof(ipacm_event_data_fid));
-	memset(&evt, 0, sizeof(ipacm_cmd_q_data));
-
-	fid->if_index = ipa_if_num;
-
-	evt.evt_data = (void*)fid;
-	evt.event = IPA_LAN_DELETE_SELF;
-
-	IPACMDBG_H("Posting event IPA_LAN_DELETE_SELF\n");
-	IPACM_EvtDispatcher::PostEvt(&evt);
-}
-
-/*handle reset usb-client rt-rules */
-int IPACM_Lan::handle_lan_client_reset_rt(ipa_ip_type iptype)
-{
-	int i, res = IPACM_SUCCESS;
-
-	/* clean eth-client routing rules */
-	IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
-	for (i = 0; i < num_eth_client; i++)
-	{
-		res = delete_eth_rtrules(i, iptype);
-		if (res != IPACM_SUCCESS)
-		{
-			IPACMERR("Failed to delete old iptype(%d) rules.\n", iptype);
-			return res;
-		}
-	} /* end of for loop */
-
-	/* Reset ip-address */
-	for (i = 0; i < num_eth_client; i++)
-	{
-		if(iptype == IPA_IP_v4)
-		{
-			get_client_memptr(eth_client, i)->ipv4_set = false;
-		}
-		else
-		{
-			get_client_memptr(eth_client, i)->ipv6_set = 0;
-		}
-	} /* end of for loop */
-	return res;
-}
-
-int IPACM_Lan::install_ipv4_icmp_flt_rule()
-{
-	int len;
-	struct ipa_ioc_add_flt_rule* flt_rule;
-	struct ipa_flt_rule_add flt_rule_entry;
-
-	if(rx_prop != NULL)
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-
-		flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (!flt_rule)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		flt_rule->commit = 1;
-		flt_rule->ep = rx_prop->rx[0].src_pipe;
-		flt_rule->global = false;
-		flt_rule->ip = IPA_IP_v4;
-		flt_rule->num_rules = 1;
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 0;
-		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;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
-
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL;
-		flt_rule_entry.rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP;
-		memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		if (m_filtering.AddFilteringRule(flt_rule) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			free(flt_rule);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-			ipv4_icmp_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl;
-			IPACMDBG_H("IPv4 icmp filter rule HDL:0x%x\n", ipv4_icmp_flt_rule_hdl[0]);
-                        free(flt_rule);
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::install_ipv6_icmp_flt_rule()
-{
-
-	int len;
-	struct ipa_ioc_add_flt_rule* flt_rule;
-	struct ipa_flt_rule_add flt_rule_entry;
-
-	if(rx_prop != NULL)
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-
-		flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (!flt_rule)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		flt_rule->commit = 1;
-		flt_rule->ep = rx_prop->rx[0].src_pipe;
-		flt_rule->global = false;
-		flt_rule->ip = IPA_IP_v6;
-		flt_rule->num_rules = 1;
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 0;
-		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;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = false;
-#endif
-		memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
-		flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6;
-		memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		if (m_filtering.AddFilteringRule(flt_rule) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			free(flt_rule);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-			ipv6_icmp_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl;
-			IPACMDBG_H("IPv6 icmp filter rule HDL:0x%x\n", ipv6_icmp_flt_rule_hdl[0]);
-			free(flt_rule);
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::add_dummy_private_subnet_flt_rule(ipa_ip_type iptype)
-{
-	if(rx_prop == NULL)
-	{
-		IPACMDBG_H("There is no rx_prop for iface %s, not able to add dummy private subnet filtering rule.\n", dev_name);
-		return 0;
-	}
-
-	if(iptype == IPA_IP_v6)
-	{
-		IPACMDBG_H("There is no ipv6 dummy filter rules needed for iface %s\n", dev_name);
-		return 0;
-	}
-	int i, len, res = IPACM_SUCCESS;
-	struct ipa_flt_rule_add flt_rule;
-	ipa_ioc_add_flt_rule* pFilteringTable;
-
-	len = sizeof(struct ipa_ioc_add_flt_rule) +	IPA_MAX_PRIVATE_SUBNET_ENTRIES * sizeof(struct ipa_flt_rule_add);
-
-	pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len);
-	if (pFilteringTable == NULL)
-	{
-		IPACMERR("Error allocate flt table memory...\n");
-		return IPACM_FAILURE;
-	}
-	memset(pFilteringTable, 0, len);
-
-	pFilteringTable->commit = 1;
-	pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-	pFilteringTable->global = false;
-	pFilteringTable->ip = iptype;
-	pFilteringTable->num_rules = IPA_MAX_PRIVATE_SUBNET_ENTRIES;
-
-	memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_add));
-
-	flt_rule.rule.retain_hdr = 0;
-	flt_rule.at_rear = true;
-	flt_rule.flt_rule_hdl = -1;
-	flt_rule.status = -1;
-	flt_rule.rule.action = IPA_PASS_TO_EXCEPTION;
-#ifdef FEATURE_IPA_V3
-	flt_rule.rule.hashable = true;
-#endif
-	memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib,
-			sizeof(flt_rule.rule.attrib));
-
-	if(iptype == IPA_IP_v4)
-	{
-		flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
-		flt_rule.rule.attrib.u.v4.src_addr_mask = ~0;
-		flt_rule.rule.attrib.u.v4.src_addr = ~0;
-		flt_rule.rule.attrib.u.v4.dst_addr_mask = ~0;
-		flt_rule.rule.attrib.u.v4.dst_addr = ~0;
-
-		for(i=0; i<IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++)
-		{
-			memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_add));
-		}
-
-		if (false == m_filtering.AddFilteringRule(pFilteringTable))
-		{
-			IPACMERR("Error adding dummy private subnet v4 flt rule\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES);
-			/* copy filter rule hdls */
-			for (int i = 0; i < IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++)
-			{
-				if (pFilteringTable->rules[i].status == 0)
-				{
-					private_fl_rule_hdl[i] = pFilteringTable->rules[i].flt_rule_hdl;
-					IPACMDBG_H("Private subnet v4 flt rule %d hdl:0x%x\n", i, private_fl_rule_hdl[i]);
-				}
-				else
-				{
-					IPACMERR("Failed adding lan2lan v4 flt rule %d\n", i);
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-			}
-		}
-	}
-fail:
-	free(pFilteringTable);
-	return res;
-}
-
-int IPACM_Lan::handle_private_subnet_android(ipa_ip_type iptype)
-{
-	int i, len, res = IPACM_SUCCESS;
-	struct ipa_flt_rule_mdfy flt_rule;
-	struct ipa_ioc_mdfy_flt_rule* pFilteringTable;
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if(iptype == IPA_IP_v6)
-	{
-		IPACMDBG_H("There is no ipv6 dummy filter rules needed for iface %s\n", dev_name);
-		return 0;
-	}
-	else
-	{
-		for(i=0; i<IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++)
-		{
-			reset_to_dummy_flt_rule(IPA_IP_v4, private_fl_rule_hdl[i]);
-		}
-
-		len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (IPACM_Iface::ipacmcfg->ipa_num_private_subnet) * sizeof(struct ipa_flt_rule_mdfy);
-		pFilteringTable = (struct ipa_ioc_mdfy_flt_rule*)malloc(len);
-		if (!pFilteringTable)
-		{
-			IPACMERR("Failed to allocate ipa_ioc_mdfy_flt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-		memset(pFilteringTable, 0, len);
-
-		pFilteringTable->commit = 1;
-		pFilteringTable->ip = iptype;
-		pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet;
-
-		/* Make LAN-traffic always go A5, use default IPA-RT table */
-		if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4))
-		{
-			IPACMERR("Failed to get routing table handle.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy));
-		flt_rule.status = -1;
-
-		flt_rule.rule.retain_hdr = 1;
-		flt_rule.rule.to_uc = 0;
-		flt_rule.rule.action = IPA_PASS_TO_ROUTING;
-		flt_rule.rule.eq_attrib_type = 0;
-		flt_rule.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl;
-		IPACMDBG_H("Private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name);
-
-		memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib));
-		flt_rule.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-
-		for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++)
-		{
-			flt_rule.rule_hdl = private_fl_rule_hdl[i];
-			flt_rule.rule.attrib.u.v4.dst_addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_mask;
-			flt_rule.rule.attrib.u.v4.dst_addr = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_addr;
-			memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
-			IPACMDBG_H(" IPACM private subnet_addr as: 0x%x entry(%d)\n", flt_rule.rule.attrib.u.v4.dst_addr, i);
-		}
-
-		if (false == m_filtering.ModifyFilteringRule(pFilteringTable))
-		{
-			IPACMERR("Failed to modify private subnet filtering rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-fail:
-	if(pFilteringTable != NULL)
-	{
-		free(pFilteringTable);
-	}
-	return res;
-}
-
-int IPACM_Lan::install_ipv6_prefix_flt_rule(uint32_t* prefix)
-{
-	if(prefix == NULL)
-	{
-		IPACMERR("IPv6 prefix is empty.\n");
-		return IPACM_FAILURE;
-	}
-	IPACMDBG_H("Receive IPv6 prefix: 0x%08x%08x.\n", prefix[0], prefix[1]);
-
-	int len;
-	struct ipa_ioc_add_flt_rule* flt_rule;
-	struct ipa_flt_rule_add flt_rule_entry;
-
-	if(rx_prop != NULL)
-	{
-		len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-
-		flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-		if (!flt_rule)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		flt_rule->commit = 1;
-		flt_rule->ep = rx_prop->rx[0].src_pipe;
-		flt_rule->global = false;
-		flt_rule->ip = IPA_IP_v6;
-		flt_rule->num_rules = 1;
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 0;
-		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;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = prefix[0];
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = prefix[1];
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x0;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x0;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x0;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x0;
-		memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		if (m_filtering.AddFilteringRule(flt_rule) == false)
-		{
-			IPACMERR("Error Adding Filtering rule, aborting...\n");
-			free(flt_rule);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-			ipv6_prefix_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl;
-			IPACMDBG_H("IPv6 prefix filter rule HDL:0x%x\n", ipv6_prefix_flt_rule_hdl[0]);
-			free(flt_rule);
-		}
-	}
-	return IPACM_SUCCESS;
-}
-
-void IPACM_Lan::delete_ipv6_prefix_flt_rule()
-{
-	if(m_filtering.DeleteFilteringHdls(ipv6_prefix_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_PREFIX_FLT_RULE) == false)
-	{
-		IPACMERR("Failed to delete ipv6 prefix flt rule.\n");
-		return;
-	}
-	IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_PREFIX_FLT_RULE);
-	return;
-}
-
-int IPACM_Lan::handle_addr_evt_odu_bridge(ipacm_event_data_addr* data)
-{
-	int fd, res = IPACM_SUCCESS;
-	struct in6_addr ipv6_addr;
-	if(data == NULL)
-	{
-		IPACMERR("Failed to get interface IP address.\n");
-		return IPACM_FAILURE;
-	}
-
-	if(data->iptype == IPA_IP_v6)
-	{
-		fd = open(IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU, O_RDWR);
-		if(fd == 0)
-		{
-			IPACMERR("Failed to open %s.\n", IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU);
-			return IPACM_FAILURE;
-		}
-
-		memcpy(&ipv6_addr, data->ipv6_addr, sizeof(struct in6_addr));
-
-		if( ioctl(fd, ODU_BRIDGE_IOC_SET_LLV6_ADDR, &ipv6_addr) )
-		{
-			IPACMERR("Failed to write IPv6 address to odu driver.\n");
-			res = IPACM_FAILURE;
-		}
-		num_dft_rt_v6++;
-		close(fd);
-	}
-
-	return res;
-}
-
-ipa_hdr_proc_type IPACM_Lan::eth_bridge_get_hdr_proc_type(ipa_hdr_l2_type t1, ipa_hdr_l2_type t2)
-{
-	if(t1 == IPA_HDR_L2_ETHERNET_II)
-	{
-		if(t2 == IPA_HDR_L2_ETHERNET_II)
-		{
-			return IPA_HDR_PROC_ETHII_TO_ETHII;
-		}
-		if(t2 == IPA_HDR_L2_802_3)
-		{
-			return IPA_HDR_PROC_ETHII_TO_802_3;
-		}
-	}
-
-	if(t1 == IPA_HDR_L2_802_3)
-	{
-		if(t2 == IPA_HDR_L2_ETHERNET_II)
-		{
-			return IPA_HDR_PROC_802_3_TO_ETHII;
-		}
-		if(t2 == IPA_HDR_L2_802_3)
-		{
-			return IPA_HDR_PROC_802_3_TO_802_3;
-		}
-	}
-
-	return IPA_HDR_PROC_NONE;
-}
-
-int IPACM_Lan::eth_bridge_get_hdr_template_hdl(uint32_t* hdr_hdl)
-{
-	if(hdr_hdl == NULL)
-	{
-		IPACMDBG_H("Hdr handle pointer is empty.\n");
-		return IPACM_FAILURE;
-	}
-
-	struct ipa_ioc_get_hdr hdr;
-	memset(&hdr, 0, sizeof(hdr));
-
-	memcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name));
-	if(m_header.GetHeaderHandle(&hdr) == false)
-	{
-		IPACMERR("Failed to get template hdr hdl.\n");
-		return IPACM_FAILURE;
-	}
-
-	*hdr_hdl = hdr.hdl;
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::handle_cradle_wan_mode_switch(bool is_wan_bridge_mode)
-{
-	struct ipa_flt_rule_mdfy flt_rule_entry;
-	int len = 0;
-	ipa_ioc_mdfy_flt_rule *m_pFilteringTable;
-
-	IPACMDBG_H("Handle wan mode swtich: is wan bridge mode?%d\n", is_wan_bridge_mode);
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (1 * sizeof(struct ipa_flt_rule_mdfy));
-	m_pFilteringTable = (struct ipa_ioc_mdfy_flt_rule *)calloc(1, len);
-	if (m_pFilteringTable == NULL)
-	{
-		PERROR("Error Locate ipa_ioc_mdfy_flt_rule memory...\n");
-		return IPACM_FAILURE;
-	}
-
-	m_pFilteringTable->commit = 1;
-	m_pFilteringTable->ip = IPA_IP_v4;
-	m_pFilteringTable->num_rules = (uint8_t)1;
-
-	IPACMDBG_H("Retrieving routing hanle for table: %s\n",
-					 IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name);
-	if (false == m_routing.GetRoutingTable(&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);
-		free(m_pFilteringTable);
-		return IPACM_FAILURE;
-	}
-	IPACMDBG_H("Routing handle for table: %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl);
-
-
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_mdfy)); // Zero All Fields
-	flt_rule_entry.status = -1;
-	flt_rule_entry.rule_hdl = lan_wan_fl_rule_hdl[0];
-
-	flt_rule_entry.rule.retain_hdr = 0;
-	flt_rule_entry.rule.to_uc = 0;
-	flt_rule_entry.rule.eq_attrib_type = 0;
-	if(is_wan_bridge_mode)
-	{
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-	}
-	else
-	{
-		flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
-	}
-	flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl;
-
-	memcpy(&flt_rule_entry.rule.attrib,
-				 &rx_prop->rx[0].attrib,
-				 sizeof(flt_rule_entry.rule.attrib));
-
-	flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-	flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x0;
-	flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x0;
-
-	memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
-	if (false == m_filtering.ModifyFilteringRule(m_pFilteringTable))
-	{
-		IPACMERR("Error Modifying RuleTable(0) to Filtering, aborting...\n");
-		free(m_pFilteringTable);
-		return IPACM_FAILURE;
-	}
-	else
-	{
-		IPACMDBG_H("flt rule hdl = %d, status = %d\n",
-						 m_pFilteringTable->rules[0].rule_hdl,
-						 m_pFilteringTable->rules[0].status);
-	}
-	free(m_pFilteringTable);
-	return IPACM_SUCCESS;
-}
-
-/*handle reset usb-client rt-rules */
-int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data)
-{
-	int cnt, pipe_len, fd;
-	uint64_t num_ul_packets, num_ul_bytes;
-	uint64_t num_dl_packets, num_dl_bytes;
-	bool ul_pipe_found, dl_pipe_found;
-	FILE *fp = NULL;
-
-	fd = open(IPA_DEVICE_NAME, O_RDWR);
-	if (fd < 0)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-
-
-	ul_pipe_found = false;
-	dl_pipe_found = false;
-	num_ul_packets = 0;
-	num_dl_packets = 0;
-	num_ul_bytes = 0;
-	num_dl_bytes = 0;
-
-	if (data->dl_dst_pipe_stats_list_valid)
-	{
-		if(tx_prop != NULL)
-		{
-			for (pipe_len = 0; pipe_len < data->dl_dst_pipe_stats_list_len; pipe_len++)
-			{
-				IPACMDBG_H("Check entry(%d) dl_dst_pipe(%d)\n", pipe_len, data->dl_dst_pipe_stats_list[pipe_len].pipe_index);
-				for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-				{
-					IPACMDBG_H("Check Tx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe));
-					if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == data->dl_dst_pipe_stats_list[pipe_len].pipe_index)
-					{
-						/* update the DL stats */
-						dl_pipe_found = true;
-						num_dl_packets += data->dl_dst_pipe_stats_list[pipe_len].num_ipv4_packets;
-						num_dl_packets += data->dl_dst_pipe_stats_list[pipe_len].num_ipv6_packets;
-						num_dl_bytes += data->dl_dst_pipe_stats_list[pipe_len].num_ipv4_bytes;
-						num_dl_bytes += data->dl_dst_pipe_stats_list[pipe_len].num_ipv6_bytes;
-						IPACMDBG_H("Got matched dst-pipe (%d) from %d tx props\n", data->dl_dst_pipe_stats_list[pipe_len].pipe_index, cnt);
-						IPACMDBG_H("DL_packets:(%lu) DL_bytes:(%lu) \n", num_dl_packets, num_dl_bytes);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	if (data->ul_src_pipe_stats_list_valid)
-	{
-		if(rx_prop != NULL)
-		{
-			for (pipe_len = 0; pipe_len < data->ul_src_pipe_stats_list_len; pipe_len++)
-			{
-				IPACMDBG_H("Check entry(%d) dl_dst_pipe(%d)\n", pipe_len, data->ul_src_pipe_stats_list[pipe_len].pipe_index);
-				for (cnt=0; cnt < rx_prop->num_rx_props; cnt++)
-				{
-					IPACMDBG_H("Check Rx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe));
-					if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == data->ul_src_pipe_stats_list[pipe_len].pipe_index)
-					{
-						/* update the UL stats */
-						ul_pipe_found = true;
-						num_ul_packets += data->ul_src_pipe_stats_list[pipe_len].num_ipv4_packets;
-						num_ul_packets += data->ul_src_pipe_stats_list[pipe_len].num_ipv6_packets;
-						num_ul_bytes += data->ul_src_pipe_stats_list[pipe_len].num_ipv4_bytes;
-						num_ul_bytes += data->ul_src_pipe_stats_list[pipe_len].num_ipv6_bytes;
-						IPACMDBG_H("Got matched dst-pipe (%d) from %d tx props\n", data->ul_src_pipe_stats_list[pipe_len].pipe_index, cnt);
-						IPACMDBG_H("UL_packets:(%lu) UL_bytes:(%lu) \n", num_ul_packets, num_ul_bytes);
-						break;
-					}
-				}
-			}
-		}
-	}
-	close(fd);
-
-	if (ul_pipe_found || dl_pipe_found)
-	{
-		IPACMDBG_H("Update IPA_TETHERING_STATS_UPDATE_EVENT, TX(P%lu/B%lu) RX(P%lu/B%lu) DEV(%s) to LTE(%s) \n",
-					num_ul_packets,
-						num_ul_bytes,
-							num_dl_packets,
-								num_dl_bytes,
-									dev_name,
-										IPACM_Wan::wan_up_dev_name);
-		fp = fopen(IPA_PIPE_STATS_FILE_NAME, "w");
-		if ( fp == NULL )
-		{
-			IPACMERR("Failed to write pipe stats to %s, error is %d - %s\n",
-					IPA_PIPE_STATS_FILE_NAME, errno, strerror(errno));
-			return IPACM_FAILURE;
-		}
-
-		fprintf(fp, PIPE_STATS,
-				dev_name,
-					IPACM_Wan::wan_up_dev_name,
-						num_ul_bytes,
-						num_ul_packets,
-							    num_dl_bytes,
-							num_dl_packets);
-		fclose(fp);
-	}
-	return IPACM_SUCCESS;
-}
-
-/*handle tether client */
-int IPACM_Lan::handle_tethering_client(bool reset, ipacm_client_enum ipa_client)
-{
-	int cnt, fd, ret = IPACM_SUCCESS;
-	int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
-	wan_ioctl_set_tether_client_pipe tether_client;
-
-	if(fd_wwan_ioctl < 0)
-	{
-		IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
-		return IPACM_FAILURE;
-	}
-
-	fd = open(IPA_DEVICE_NAME, O_RDWR);
-	if (fd < 0)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-		close(fd_wwan_ioctl);
-		return IPACM_FAILURE;
-	}
-
-	memset(&tether_client, 0, sizeof(tether_client));
-	tether_client.reset_client = reset;
-	tether_client.ipa_client = ipa_client;
-
-	if(tx_prop != NULL)
-	{
-		tether_client.dl_dst_pipe_len = tx_prop->num_tx_props;
-		for (cnt = 0; cnt < tx_prop->num_tx_props; cnt++)
-		{
-			IPACMDBG_H("Tx(%d), dst_pipe: %d, ipa_pipe: %d\n",
-					cnt, tx_prop->tx[cnt].dst_pipe,
-						ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe));
-			tether_client.dl_dst_pipe_list[cnt] = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe);
-		}
-	}
-
-	if(rx_prop != NULL)
-	{
-		tether_client.ul_src_pipe_len = rx_prop->num_rx_props;
-		for (cnt = 0; cnt < rx_prop->num_rx_props; cnt++)
-		{
-			IPACMDBG_H("Rx(%d), src_pipe: %d, ipa_pipe: %d\n",
-					cnt, rx_prop->rx[cnt].src_pipe,
-						ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe));
-			tether_client.ul_src_pipe_list[cnt] = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe);
-		}
-	}
-
-	ret = ioctl(fd_wwan_ioctl, WAN_IOC_SET_TETHER_CLIENT_PIPE, &tether_client);
-	if (ret != 0)
-	{
-		IPACMERR("Failed set tether-client-pipe %p with ret %d\n ", &tether_client, ret);
-	}
-	IPACMDBG("Set tether-client-pipe %p\n", &tether_client);
-	close(fd);
-	close(fd_wwan_ioctl);
-	return ret;
-}
-
-/* mac address has to be provided for client related events */
-void IPACM_Lan::eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, uint8_t *mac)
-{
-	ipacm_cmd_q_data eth_bridge_evt;
-	ipacm_event_eth_bridge *evt_data;
-
-	evt_data = (ipacm_event_eth_bridge*)malloc(sizeof(ipacm_event_eth_bridge));
-	if(evt_data == NULL)
-	{
-		IPACMERR("Failed to allocate memory.\n");
-		return;
-	}
-	memset(evt_data, 0, sizeof(ipacm_event_eth_bridge));
-
-	evt_data->p_iface = this;
-	evt_data->iptype = iptype;
-	if(mac)
-	{
-		IPACMDBG_H("Client mac: 0x%02x%02x%02x%02x%02x%02x \n",
-			mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-		memcpy(evt_data->mac_addr, mac, sizeof(evt_data->mac_addr));
-	}
-
-	memset(&eth_bridge_evt, 0, sizeof(ipacm_cmd_q_data));
-	eth_bridge_evt.evt_data = (void*)evt_data;
-	eth_bridge_evt.event = evt;
-
-	IPACMDBG_H("Posting event %s\n",
-		IPACM_Iface::ipacmcfg->getEventName(evt));
-	IPACM_EvtDispatcher::PostEvt(&eth_bridge_evt);
-}
-
-/* add header processing context and return handle to lan2lan controller */
-int IPACM_Lan::eth_bridge_add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_hdr_type, uint32_t *hdl)
-{
-	int len, res = IPACM_SUCCESS;
-	uint32_t hdr_template;
-	ipa_ioc_add_hdr_proc_ctx* pHeaderProcTable = NULL;
-
-	if(tx_prop == NULL)
-	{
-		IPACMERR("No tx prop.\n");
-		return IPACM_FAILURE;
-	}
-
-	len = sizeof(struct ipa_ioc_add_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_add);
-	pHeaderProcTable = (ipa_ioc_add_hdr_proc_ctx*)malloc(len);
-	if(pHeaderProcTable == NULL)
-	{
-		IPACMERR("Cannot allocate header processing context table.\n");
-		return IPACM_FAILURE;
-	}
-
-	memset(pHeaderProcTable, 0, len);
-	pHeaderProcTable->commit = 1;
-	pHeaderProcTable->num_proc_ctxs = 1;
-	pHeaderProcTable->proc_ctx[0].type = eth_bridge_get_hdr_proc_type(peer_l2_hdr_type, tx_prop->tx[0].hdr_l2_type);
-	eth_bridge_get_hdr_template_hdl(&hdr_template);
-	pHeaderProcTable->proc_ctx[0].hdr_hdl = hdr_template;
-	if (m_header.AddHeaderProcCtx(pHeaderProcTable) == false)
-	{
-		IPACMERR("Adding hdr proc ctx failed with status: %d\n", pHeaderProcTable->proc_ctx[0].status);
-		res = IPACM_FAILURE;
-		goto end;
-	}
-
-	*hdl = pHeaderProcTable->proc_ctx[0].proc_ctx_hdl;
-
-end:
-	free(pHeaderProcTable);
-	return res;
-}
-
-/* add routing rule and return handle to lan2lan controller */
-int IPACM_Lan::eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl,
-		ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count)
-{
-	int i, len, res = IPACM_SUCCESS;
-	struct ipa_ioc_add_rt_rule* rt_rule_table = NULL;
-	struct ipa_rt_rule_add rt_rule;
-	int position, num_rt_rule;
-
-	IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n",
-			mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-
-	num_rt_rule = each_client_rt_rule_count[iptype];
-
-	len = sizeof(ipa_ioc_add_rt_rule) + num_rt_rule * sizeof(ipa_rt_rule_add);
-	rt_rule_table = (ipa_ioc_add_rt_rule*)malloc(len);
-	if (rt_rule_table == NULL)
-	{
-		IPACMERR("Failed to allocate memory.\n");
-		return IPACM_FAILURE;
-	}
-	memset(rt_rule_table, 0, len);
-
-	rt_rule_table->commit = 1;
-	rt_rule_table->ip = iptype;
-	rt_rule_table->num_rules = num_rt_rule;
-	strlcpy(rt_rule_table->rt_tbl_name, rt_tbl_name, sizeof(rt_rule_table->rt_tbl_name));
-	rt_rule_table->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = 0;
-
-	memset(&rt_rule, 0, sizeof(ipa_rt_rule_add));
-	rt_rule.at_rear = false;
-	rt_rule.status = -1;
-	rt_rule.rt_rule_hdl = -1;
-#ifdef FEATURE_IPA_V3
-	rt_rule.rule.hashable = true;
-#endif
-	rt_rule.rule.hdr_hdl = 0;
-	rt_rule.rule.hdr_proc_ctx_hdl = hdr_proc_ctx_hdl;
-
-	position = 0;
-	for(i=0; i<iface_query->num_tx_props; i++)
-	{
-		if(tx_prop->tx[i].ip == iptype)
-		{
-			if(position >= num_rt_rule || position >= MAX_NUM_PROP)
-			{
-				IPACMERR("Number of routing rules already exceeds limit.\n");
-				res = IPACM_FAILURE;
-				goto end;
-			}
-
-			if(ipa_if_cate == WLAN_IF && IPACM_Iface::ipacmcfg->isMCC_Mode)
-			{
-				IPACMDBG_H("In WLAN MCC mode, use alt dst pipe: %d\n",
-						tx_prop->tx[i].alt_dst_pipe);
-				rt_rule.rule.dst = tx_prop->tx[i].alt_dst_pipe;
-			}
-			else
-			{
-				IPACMDBG_H("It is not WLAN MCC mode, use dst pipe: %d\n",
-						tx_prop->tx[i].dst_pipe);
-				rt_rule.rule.dst = tx_prop->tx[i].dst_pipe;
-			}
-
-			memcpy(&rt_rule.rule.attrib, &tx_prop->tx[i].attrib, sizeof(rt_rule.rule.attrib));
-			if(peer_l2_hdr_type == IPA_HDR_L2_ETHERNET_II)
-				rt_rule.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II;
-			else
-				rt_rule.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3;
-			memcpy(rt_rule.rule.attrib.dst_mac_addr, mac, sizeof(rt_rule.rule.attrib.dst_mac_addr));
-			memset(rt_rule.rule.attrib.dst_mac_addr_mask, 0xFF, sizeof(rt_rule.rule.attrib.dst_mac_addr_mask));
-
-			memcpy(&(rt_rule_table->rules[position]), &rt_rule, sizeof(rt_rule_table->rules[position]));
-			position++;
-		}
-	}
-	if(false == m_routing.AddRoutingRule(rt_rule_table))
-	{
-		IPACMERR("Routing rule addition failed!\n");
-		res = IPACM_FAILURE;
-		goto end;
-	}
-	else
-	{
-		*rt_rule_count = position;
-		for(i=0; i<position; i++)
-			rt_rule_hdl[i] = rt_rule_table->rules[i].rt_rule_hdl;
-	}
-
-end:
-	free(rt_rule_table);
-	return res;
-}
-
-/* modify routing rule*/
-int IPACM_Lan::eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl,
-		ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int rt_rule_count)
-{
-	struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL;
-	struct ipa_rt_rule_mdfy *rt_rule_entry;
-	int len, index, res = IPACM_SUCCESS;
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No tx properties \n");
-		return IPACM_FAILURE;
-	}
-
-	if(ipa_if_cate != WLAN_IF)
-	{
-		IPACMDBG_H("This is not WLAN IF, no need to modify rt rule.\n");
-		return IPACM_SUCCESS;
-	}
-
-	IPACMDBG_H("Receive WLAN client MAC 0x%02x%02x%02x%02x%02x%02x.\n",
-			mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-
-	len = sizeof(struct ipa_ioc_mdfy_rt_rule) + rt_rule_count * sizeof(struct ipa_rt_rule_mdfy);
-	rt_rule = (struct ipa_ioc_mdfy_rt_rule *)malloc(len);
-	if(rt_rule == NULL)
-	{
-		IPACMERR("Unable to allocate memory for modify rt rule\n");
-		return IPACM_FAILURE;
-	}
-	memset(rt_rule, 0, len);
-
-	rt_rule->commit = 1;
-	rt_rule->num_rules = 0;
-	rt_rule->ip = iptype;
-
-	for (index = 0; index < tx_prop->num_tx_props; index++)
-	{
-		if (tx_prop->tx[index].ip == iptype)
-		{
-			if (rt_rule->num_rules >= rt_rule_count ||
-				rt_rule->num_rules >= MAX_NUM_PROP)
-			{
-				IPACMERR("Number of routing rules exceeds limit.\n");
-				res = IPACM_FAILURE;
-				goto end;
-			}
-
-			rt_rule_entry = &rt_rule->rules[rt_rule->num_rules];
-
-			if (IPACM_Iface::ipacmcfg->isMCC_Mode)
-			{
-				IPACMDBG_H("In WLAN MCC mode, use alt dst pipe: %d\n",
-						tx_prop->tx[index].alt_dst_pipe);
-				rt_rule_entry->rule.dst = tx_prop->tx[index].alt_dst_pipe;
-			}
-			else
-			{
-				IPACMDBG_H("In WLAN SCC mode, use dst pipe: %d\n",
-						tx_prop->tx[index].dst_pipe);
-				rt_rule_entry->rule.dst = tx_prop->tx[index].dst_pipe;
-			}
-
-			rt_rule_entry->rule.hdr_hdl = 0;
-			rt_rule_entry->rule.hdr_proc_ctx_hdl = hdr_proc_ctx_hdl;
-#ifdef FEATURE_IPA_V3
-			rt_rule_entry->rule.hashable = true;
-#endif
-			memcpy(&rt_rule_entry->rule.attrib, &tx_prop->tx[index].attrib,
-					sizeof(rt_rule_entry->rule.attrib));
-			if(peer_l2_hdr_type == IPA_HDR_L2_ETHERNET_II)
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II;
-			else
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3;
-			memcpy(rt_rule_entry->rule.attrib.dst_mac_addr, mac,
-					sizeof(rt_rule_entry->rule.attrib.dst_mac_addr));
-			memset(rt_rule_entry->rule.attrib.dst_mac_addr_mask, 0xFF,
-					sizeof(rt_rule_entry->rule.attrib.dst_mac_addr_mask));
-
-			rt_rule_entry->rt_rule_hdl = rt_rule_hdl[rt_rule->num_rules];
-			rt_rule->num_rules++;
-		}
-	}
-
-	if(m_routing.ModifyRoutingRule(rt_rule) == false)
-	{
-		IPACMERR("Failed to modify routing rules.\n");
-		res = IPACM_FAILURE;
-		goto end;
-	}
-	if(m_routing.Commit(iptype) == false)
-	{
-		IPACMERR("Failed to commit routing rules.\n");
-		res = IPACM_FAILURE;
-		goto end;
-	}
-	IPACMDBG("Modified routing rules successfully.\n");
-
-end:
-	free(rt_rule);
-	return res;
-}
-
-int IPACM_Lan::eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip_type iptype, uint32_t *flt_rule_hdl)
-{
-	int len, res = IPACM_SUCCESS;
-	struct ipa_flt_rule_add flt_rule_entry;
-	struct ipa_ioc_add_flt_rule_after *pFilteringTable = NULL;
-
-#ifdef FEATURE_IPA_V3
-	if (rx_prop == NULL || tx_prop == NULL)
-	{
-		IPACMDBG_H("No rx or tx properties registered for iface %s\n", dev_name);
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-
-	len = sizeof(struct ipa_ioc_add_flt_rule_after) + sizeof(struct ipa_flt_rule_add);
-	pFilteringTable = (struct ipa_ioc_add_flt_rule_after*)malloc(len);
-	if (!pFilteringTable)
-	{
-		IPACMERR("Failed to allocate ipa_ioc_add_flt_rule_after memory...\n");
-		return IPACM_FAILURE;
-	}
-	memset(pFilteringTable, 0, len);
-
-	/* add mac based rule*/
-	pFilteringTable->commit = 1;
-	pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-	pFilteringTable->ip = iptype;
-	pFilteringTable->num_rules = 1;
-	pFilteringTable->add_after_hdl = eth_bridge_flt_rule_offset[iptype];
-
-	memset(&flt_rule_entry, 0, sizeof(flt_rule_entry));
-	flt_rule_entry.at_rear = 1;
-
-	flt_rule_entry.rule.retain_hdr = 0;
-	flt_rule_entry.rule.to_uc = 0;
-	flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-	flt_rule_entry.rule.eq_attrib_type = 0;
-	flt_rule_entry.rule.rt_tbl_hdl = rt_tbl_hdl;
-	flt_rule_entry.rule.hashable = true;
-
-	memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
-	if(tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_ETHERNET_II)
-	{
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II;
-	}
-	else
-	{
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3;
-	}
-
-	memcpy(flt_rule_entry.rule.attrib.dst_mac_addr, mac, sizeof(flt_rule_entry.rule.attrib.dst_mac_addr));
-	memset(flt_rule_entry.rule.attrib.dst_mac_addr_mask, 0xFF, sizeof(flt_rule_entry.rule.attrib.dst_mac_addr_mask));
-
-	memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry));
-	if (false == m_filtering.AddFilteringRuleAfter(pFilteringTable))
-	{
-		IPACMERR("Failed to add client filtering rules.\n");
-		res = IPACM_FAILURE;
-		goto end;
-	}
-	*flt_rule_hdl = pFilteringTable->rules[0].flt_rule_hdl;
-
-end:
-	free(pFilteringTable);
-#endif
-	return res;
-}
-
-int IPACM_Lan::eth_bridge_del_flt_rule(uint32_t flt_rule_hdl, ipa_ip_type iptype)
-{
-	if(m_filtering.DeleteFilteringHdls(&flt_rule_hdl, iptype, 1) == false)
-	{
-		IPACMERR("Failed to delete the client specific flt rule.\n");
-		return IPACM_FAILURE;
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Lan::eth_bridge_del_rt_rule(uint32_t rt_rule_hdl, ipa_ip_type iptype)
-{
-	if(m_routing.DeleteRoutingHdl(rt_rule_hdl, iptype) == false)
-	{
-		IPACMERR("Failed to delete routing rule.\n");
-		return IPACM_FAILURE;
-	}
-	return IPACM_SUCCESS;
-}
-
-/* delete header processing context */
-int IPACM_Lan::eth_bridge_del_hdr_proc_ctx(uint32_t hdr_proc_ctx_hdl)
-{
-	if(m_header.DeleteHeaderProcCtx(hdr_proc_ctx_hdl) == false)
-	{
-		IPACMERR("Failed to delete hdr proc ctx.\n");
-		return IPACM_FAILURE;
-	}
-	return IPACM_SUCCESS;
-}
diff --git a/ipacm/src/IPACM_LanToLan.cpp b/ipacm/src/IPACM_LanToLan.cpp
deleted file mode 100644
index d77f389..0000000
--- a/ipacm/src/IPACM_LanToLan.cpp
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*
-Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_LanToLan.cpp
-
-	@brief
-	This file implements the functionality of offloading LAN to LAN traffic.
-
-	@Author
-	Shihuan Liu
-
-*/
-
-#include <stdlib.h>
-#include "IPACM_LanToLan.h"
-#include "IPACM_Wlan.h"
-
-#define __stringify(x...) #x
-
-const char *ipa_l2_hdr_type[] = {
-	__stringify(NONE),
-	__stringify(ETH_II),
-	__stringify(802_3),
-	__stringify(L2_MAX)
-};
-
-IPACM_LanToLan_Iface::IPACM_LanToLan_Iface(IPACM_Lan *p_iface)
-{
-	int i;
-
-	m_p_iface = p_iface;
-	memset(m_is_ip_addr_assigned, 0, sizeof(m_is_ip_addr_assigned));
-	m_support_inter_iface_offload = true;
-	m_support_intra_iface_offload = false;
-	for(i = 0; i < IPA_HDR_L2_MAX; i++)
-	{
-		ref_cnt_peer_l2_hdr_type[i] = 0;
-		hdr_proc_ctx_for_inter_interface[i] = 0;
-	}
-	hdr_proc_ctx_for_intra_interface = 0;
-
-	if(p_iface->ipa_if_cate == WLAN_IF)
-	{
-		IPACMDBG_H("Interface %s is WLAN interface.\n", p_iface->dev_name);
-		m_support_intra_iface_offload = true;
-		if( ((IPACM_Wlan*)p_iface)->is_guest_ap() )
-		{
-			IPACMDBG_H("Interface %s is guest AP.\n", p_iface->dev_name);
-			m_support_inter_iface_offload = false;
-		}
-	}
-	return;
-}
-
-IPACM_LanToLan_Iface::~IPACM_LanToLan_Iface()
-{
-}
-
-IPACM_LanToLan::IPACM_LanToLan()
-{
-	IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_IFACE_UP, this);
-	IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_IFACE_DOWN, this);
-	IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_CLIENT_ADD, this);
-	IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_CLIENT_DEL, this);
-	IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, this);
-
-	return;
-}
-
-IPACM_LanToLan::~IPACM_LanToLan()
-{
-	IPACMDBG_DMESG("WARNING: UNEXPECTEDLY KILL LAN2LAN CONTROLLER!\n");
-	return;
-}
-
-void IPACM_LanToLan::event_callback(ipa_cm_event_id event, void* param)
-{
-	ipacm_event_eth_bridge *data = (ipacm_event_eth_bridge*)param;
-	IPACMDBG_H("Get %s event.\n", IPACM_Iface::ipacmcfg->getEventName(event));
-
-	switch(event)
-	{
-		case IPA_ETH_BRIDGE_IFACE_UP:
-		{
-			handle_iface_up(data);
-			break;
-		}
-
-		case IPA_ETH_BRIDGE_IFACE_DOWN:
-		{
-			handle_iface_down(data);
-			break;
-		}
-
-		case IPA_ETH_BRIDGE_CLIENT_ADD:
-		{
-			handle_client_add(data);
-			break;
-		}
-
-		case IPA_ETH_BRIDGE_CLIENT_DEL:
-		{
-			handle_client_del(data);
-			break;
-		}
-
-		case IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH:
-		{
-			handle_wlan_scc_mcc_switch(data);
-			break;
-		}
-		default:
-			break;
-	}
-
-	print_data_structure_info();
-	return;
-}
-
-void IPACM_LanToLan::handle_iface_up(ipacm_event_eth_bridge *data)
-{
-	list<IPACM_LanToLan_Iface>::iterator it;
-
-	IPACMDBG_H("Interface name: %s IP type: %d\n", data->p_iface->dev_name, data->iptype);
-	for(it = m_iface.begin(); it != m_iface.end(); it++)
-	{
-		if(it->get_iface_pointer() == data->p_iface)
-		{
-			IPACMDBG_H("Found the interface.\n");
-			if(it->get_m_is_ip_addr_assigned(data->iptype) == false)
-			{
-				IPACMDBG_H("IP type %d was not active before, activating it now.\n", data->iptype);
-				it->set_m_is_ip_addr_assigned(data->iptype, true);
-
-				/* install inter-interface rules */
-				if(it->get_m_support_inter_iface_offload())
-					it->add_all_inter_interface_client_flt_rule(data->iptype);
-
-				/* install intra-BSS rules */
-				if(it->get_m_support_intra_iface_offload())
-					it->add_all_intra_interface_client_flt_rule(data->iptype);
-			}
-			break;
-		}
-	}
-
-	if(it == m_iface.end())	//If the interface has not been created before
-	{
-		if(m_iface.size() == MAX_NUM_IFACE)
-		{
-			IPACMERR("The number of interfaces has reached maximum %d.\n", MAX_NUM_IFACE);
-			return;
-		}
-
-		if(!data->p_iface->tx_prop || !data->p_iface->rx_prop)
-		{
-			IPACMERR("The interface %s does not have tx_prop or rx_prop.\n", data->p_iface->dev_name);
-			return;
-		}
-
-		if(data->p_iface->tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_NONE || data->p_iface->tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_MAX)
-		{
-			IPACMERR("Invalid l2 header type %s!\n", ipa_l2_hdr_type[data->p_iface->tx_prop->tx[0].hdr_l2_type]);
-			return;
-		}
-
-		IPACMDBG_H("Does not find the interface, insert a new one.\n");
-		IPACM_LanToLan_Iface new_iface(data->p_iface);
-		new_iface.set_m_is_ip_addr_assigned(data->iptype, true);
-
-		m_iface.push_front(new_iface);
-		IPACMDBG_H("Now the total number of interfaces is %d.\n", m_iface.size());
-
-		IPACM_LanToLan_Iface &front_iface = m_iface.front();
-
-		/* install inter-interface rules */
-		if(front_iface.get_m_support_inter_iface_offload())
-		{
-			for(it = ++m_iface.begin(); it != m_iface.end(); it++)
-			{
-				/* add peer info only when both interfaces support inter-interface communication */
-				if(it->get_m_support_inter_iface_offload())
-				{
-					/* populate hdr_proc_ctx and routing table handle */
-					handle_new_iface_up(&front_iface, &(*it));
-
-					/* add client specific routing rule on existing interface */
-					it->add_client_rt_rule_for_new_iface();
-				}
-			}
-
-			/* add client specific filtering rule on new interface */
-			front_iface.add_all_inter_interface_client_flt_rule(data->iptype);
-		}
-
-		/* populate the intra-interface information */
-		if(front_iface.get_m_support_intra_iface_offload())
-		{
-			front_iface.handle_intra_interface_info();
-		}
-
-		/* handle cached client add event */
-		handle_cached_client_add_event(front_iface.get_iface_pointer());
-	}
-	return;
-}
-
-void IPACM_LanToLan::handle_iface_down(ipacm_event_eth_bridge *data)
-{
-	list<IPACM_LanToLan_Iface>::iterator it_target_iface;
-
-	IPACMDBG_H("Interface name: %s\n", data->p_iface->dev_name);
-
-	for(it_target_iface = m_iface.begin(); it_target_iface != m_iface.end(); it_target_iface++)
-	{
-		if(it_target_iface->get_iface_pointer() == data->p_iface)
-		{
-			IPACMDBG_H("Found the interface.\n");
-			break;
-		}
-	}
-
-	if(it_target_iface == m_iface.end())
-	{
-		IPACMDBG_H("The interface has not been found.\n");
-		/* clear cached client add event for the unfound interface*/
-		clear_cached_client_add_event(data->p_iface);
-		return;
-	}
-
-	it_target_iface->handle_down_event();
-	m_iface.erase(it_target_iface);
-
-	return;
-}
-
-void IPACM_LanToLan::handle_new_iface_up(IPACM_LanToLan_Iface *new_iface, IPACM_LanToLan_Iface *exist_iface)
-{
-	char rt_tbl_name_for_flt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX];
-	char rt_tbl_name_for_rt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX];
-
-	IPACMDBG_H("Populate peer info between: new_iface %s, existing iface %s\n", new_iface->get_iface_pointer()->dev_name,
-		exist_iface->get_iface_pointer()->dev_name);
-
-	/* populate the routing table information */
-	snprintf(rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX, "eth_v4_%s_to_%s",
-		ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type],
-		ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]);
-	IPACMDBG_H("IPv4 routing table for flt name: %s\n", rt_tbl_name_for_flt[IPA_IP_v4]);
-
-	snprintf(rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX, "eth_v6_%s_to_%s",
-		ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type],
-		ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]);
-	IPACMDBG_H("IPv6 routing table for flt name: %s\n", rt_tbl_name_for_flt[IPA_IP_v6]);
-
-	snprintf(rt_tbl_name_for_rt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX, "eth_v4_%s_to_%s",
-		ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type],
-		ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]);
-	IPACMDBG_H("IPv4 routing table for rt name: %s\n", rt_tbl_name_for_rt[IPA_IP_v4]);
-
-	snprintf(rt_tbl_name_for_rt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX, "eth_v6_%s_to_%s",
-		ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type],
-		ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]);
-	IPACMDBG_H("IPv6 routing table for rt name: %s\n", rt_tbl_name_for_rt[IPA_IP_v6]);
-
-	/* add new peer info in both new iface and existing iface */
-	exist_iface->handle_new_iface_up(rt_tbl_name_for_flt, rt_tbl_name_for_rt, new_iface);
-
-	new_iface->handle_new_iface_up(rt_tbl_name_for_rt, rt_tbl_name_for_flt, exist_iface);
-
-	return;
-}
-
-void IPACM_LanToLan::handle_client_add(ipacm_event_eth_bridge *data)
-{
-	list<IPACM_LanToLan_Iface>::iterator it_iface;
-
-	IPACMDBG_H("Incoming client MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", data->mac_addr[0], data->mac_addr[1],
-		data->mac_addr[2], data->mac_addr[3], data->mac_addr[4], data->mac_addr[5], data->p_iface->dev_name);
-
-	for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++)
-	{
-		if(it_iface->get_iface_pointer() == data->p_iface)	//find the interface
-		{
-			IPACMDBG_H("Found the interface.\n");
-			it_iface->handle_client_add(data->mac_addr);
-			break;
-		}
-	}
-
-	/* if the iface was not found, cache the client add event */
-	if(it_iface == m_iface.end())
-	{
-		IPACMDBG_H("The interface is not found.\n");
-		if(m_cached_client_add_event.size() < MAX_NUM_CACHED_CLIENT_ADD_EVENT)
-		{
-			IPACMDBG_H("Cached the client information.\n");
-			m_cached_client_add_event.push_front(*data);
-		}
-		else
-		{
-			IPACMDBG_H("Cached client add event has reached maximum number.\n");
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan::handle_client_del(ipacm_event_eth_bridge *data)
-{
-	list<IPACM_LanToLan_Iface>::iterator it_iface;
-
-	IPACMDBG_H("Incoming client MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", data->mac_addr[0], data->mac_addr[1],
-		data->mac_addr[2], data->mac_addr[3], data->mac_addr[4], data->mac_addr[5], data->p_iface->dev_name);
-
-	for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++)
-	{
-		if(it_iface->get_iface_pointer() == data->p_iface)	//found the interface
-		{
-			IPACMDBG_H("Found the interface.\n");
-			it_iface->handle_client_del(data->mac_addr);
-			break;
-		}
-	}
-
-	if(it_iface == m_iface.end())
-	{
-		IPACMDBG_H("The interface is not found.\n");
-	}
-
-	return;
-}
-
-void IPACM_LanToLan::handle_wlan_scc_mcc_switch(ipacm_event_eth_bridge *data)
-{
-	list<IPACM_LanToLan_Iface>::iterator it_iface;
-
-	IPACMDBG_H("Incoming interface: %s\n", data->p_iface->dev_name);
-	for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++)
-	{
-		if(it_iface->get_iface_pointer() == data->p_iface)
-		{
-			it_iface->handle_wlan_scc_mcc_switch();
-			break;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan::handle_cached_client_add_event(IPACM_Lan *p_iface)
-{
-	list<ipacm_event_eth_bridge>::iterator it;
-
-	it = m_cached_client_add_event.begin();
-	while(it != m_cached_client_add_event.end())
-	{
-		if(it->p_iface == p_iface)
-		{
-			IPACMDBG_H("Found client with MAC: 0x%02x%02x%02x%02x%02x%02x\n", it->mac_addr[0], it->mac_addr[1],
-				it->mac_addr[2], it->mac_addr[3], it->mac_addr[4], it->mac_addr[5]);
-			handle_client_add(&(*it));
-			it = m_cached_client_add_event.erase(it);
-		}
-		else
-		{
-			it++;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan::clear_cached_client_add_event(IPACM_Lan *p_iface)
-{
-	list<ipacm_event_eth_bridge>::iterator it;
-
-	it = m_cached_client_add_event.begin();
-	while(it != m_cached_client_add_event.end())
-	{
-		if(it->p_iface == p_iface)
-		{
-			IPACMDBG_H("Found client with MAC: 0x%02x%02x%02x%02x%02x%02x\n", it->mac_addr[0], it->mac_addr[1],
-				it->mac_addr[2], it->mac_addr[3], it->mac_addr[4], it->mac_addr[5]);
-			it = m_cached_client_add_event.erase(it);
-		}
-		else
-		{
-			it++;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan::print_data_structure_info()
-{
-	list<IPACM_LanToLan_Iface>::iterator it;
-	list<ipacm_event_eth_bridge>::iterator it_event;
-	int i;
-
-	IPACMDBG_H("There are %d interfaces in total.\n", m_iface.size());
-
-	for(it = m_iface.begin(); it != m_iface.end(); it++)
-	{
-		it->print_data_structure_info();
-	}
-
-	IPACMDBG_H("There are %d cached client add events in total.\n", m_cached_client_add_event.size());
-
-	i = 1;
-	for(it_event = m_cached_client_add_event.begin(); it_event != m_cached_client_add_event.end(); it_event++)
-	{
-		IPACMDBG_H("Client %d MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", i, it_event->mac_addr[0], it_event->mac_addr[1], it_event->mac_addr[2],
-			it_event->mac_addr[3], it_event->mac_addr[4], it_event->mac_addr[5], it_event->p_iface->dev_name);
-		i++;
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_client_rt_rule_for_new_iface()
-{
-	list<client_info>::iterator it;
-	ipa_hdr_l2_type peer_l2_type;
-	peer_iface_info &peer = m_peer_iface_info.front();
-
-	peer_l2_type = peer.peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type;
-	if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 1)
-	{
-		for(it = m_client_info.begin(); it != m_client_info.end(); it++)
-		{
-			add_client_rt_rule(&peer, &(*it));
-		}
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_client_rt_rule(peer_iface_info *peer_info, client_info *client)
-{
-	int i, num_rt_rule;
-	uint32_t rt_rule_hdl[MAX_NUM_PROP];
-	ipa_hdr_l2_type peer_l2_hdr_type;
-
-	peer_l2_hdr_type = peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type;
-
-	/* if the peer info is not for intra interface communication */
-	if(peer_info->peer != this)
-	{
-		IPACMDBG_H("This is for inter interface communication.\n");
-
-		m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v4], hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type],
-			peer_l2_hdr_type, IPA_IP_v4, rt_rule_hdl, &num_rt_rule);
-
-		client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4] = num_rt_rule;
-		IPACMDBG_H("Number of IPv4 routing rule is %d.\n", num_rt_rule);
-		for(i=0; i<num_rt_rule; i++)
-		{
-			IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]);
-			client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i] = rt_rule_hdl[i];
-		}
-
-		m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v6], hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type],
-			peer_l2_hdr_type, IPA_IP_v6, rt_rule_hdl, &num_rt_rule);
-
-		client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6] = num_rt_rule;
-		IPACMDBG_H("Number of IPv6 routing rule is %d.\n", num_rt_rule);
-		for(i=0; i<num_rt_rule; i++)
-		{
-			IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]);
-			client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i] = rt_rule_hdl[i];
-		}
-	}
-	else
-	{
-		IPACMDBG_H("This is for intra interface communication.\n");
-		m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v4], hdr_proc_ctx_for_intra_interface,
-			peer_l2_hdr_type, IPA_IP_v4, rt_rule_hdl, &num_rt_rule);
-
-		client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4] = num_rt_rule;
-		IPACMDBG_H("Number of IPv4 routing rule is %d.\n", num_rt_rule);
-		for(i=0; i<num_rt_rule; i++)
-		{
-			IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]);
-			client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i] = rt_rule_hdl[i];
-		}
-
-		m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v6], hdr_proc_ctx_for_intra_interface,
-			peer_l2_hdr_type, IPA_IP_v6, rt_rule_hdl, &num_rt_rule);
-
-		client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6] = num_rt_rule;
-		IPACMDBG_H("Number of IPv6 routing rule is %d.\n", num_rt_rule);
-		for(i=0; i<num_rt_rule; i++)
-		{
-			IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]);
-			client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i] = rt_rule_hdl[i];
-		}
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_all_inter_interface_client_flt_rule(ipa_ip_type iptype)
-{
-	list<peer_iface_info>::iterator it_iface;
-	list<client_info>::iterator it_client;
-
-	for(it_iface = m_peer_iface_info.begin(); it_iface != m_peer_iface_info.end(); it_iface++)
-	{
-		IPACMDBG_H("Add flt rules for clients of interface %s.\n", it_iface->peer->get_iface_pointer()->dev_name);
-		for(it_client = it_iface->peer->m_client_info.begin(); it_client != it_iface->peer->m_client_info.end(); it_client++)
-		{
-			add_client_flt_rule(&(*it_iface), &(*it_client), iptype);
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_all_intra_interface_client_flt_rule(ipa_ip_type iptype)
-{
-	list<client_info>::iterator it_client;
-
-	IPACMDBG_H("Add flt rules for own clients.\n");
-	for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-	{
-		add_client_flt_rule(&m_intra_interface_info, &(*it_client), iptype);
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client)
-{
-	list<peer_iface_info>::iterator it;
-
-	for(it = m_peer_iface_info.begin(); it != m_peer_iface_info.end(); it++)
-	{
-		if(it->peer == peer_iface)
-		{
-			IPACMDBG_H("Found the peer iface info.\n");
-			if(m_is_ip_addr_assigned[IPA_IP_v4])
-			{
-				add_client_flt_rule(&(*it), client, IPA_IP_v4);
-			}
-			if(m_is_ip_addr_assigned[IPA_IP_v6])
-			{
-				add_client_flt_rule(&(*it), client, IPA_IP_v6);
-			}
-
-			break;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_client_flt_rule(peer_iface_info *peer, client_info *client, ipa_ip_type iptype)
-{
-	list<flt_rule_info>::iterator it_flt;
-	uint32_t flt_rule_hdl;
-	flt_rule_info new_flt_info;
-	ipa_ioc_get_rt_tbl rt_tbl;
-
-	rt_tbl.ip = iptype;
-	memcpy(rt_tbl.name, peer->rt_tbl_name_for_flt[iptype], sizeof(rt_tbl.name));
-	IPACMDBG_H("This flt rule points to rt tbl %s.\n", rt_tbl.name);
-
-	if(IPACM_Iface::m_routing.GetRoutingTable(&rt_tbl) == false)
-	{
-		IPACMERR("Failed to get routing table.\n");
-		return;
-	}
-
-	m_p_iface->eth_bridge_add_flt_rule(client->mac_addr, rt_tbl.hdl,
-		iptype, &flt_rule_hdl);
-	IPACMDBG_H("Installed flt rule for IP type %d: handle %d\n", iptype, flt_rule_hdl);
-
-	for(it_flt = peer->flt_rule.begin(); it_flt != peer->flt_rule.end(); it_flt++)
-	{
-		if(it_flt->p_client == client)	//the client is already in the flt info list
-		{
-			IPACMDBG_H("The client is found in flt info list.\n");
-			it_flt->flt_rule_hdl[iptype] = flt_rule_hdl;
-			break;
-		}
-	}
-
-	if(it_flt == peer->flt_rule.end())	//the client is not in the flt info list
-	{
-		IPACMDBG_H("The client is not found in flt info list, insert a new one.\n");
-		memset(&new_flt_info, 0, sizeof(new_flt_info));
-		new_flt_info.p_client = client;
-		new_flt_info.flt_rule_hdl[iptype] = flt_rule_hdl;
-
-		peer->flt_rule.push_front(new_flt_info);
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::del_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client)
-{
-	list<peer_iface_info>::iterator it;
-
-	for(it = m_peer_iface_info.begin(); it != m_peer_iface_info.end(); it++)
-	{
-		if(it->peer == peer_iface)
-		{
-			IPACMDBG_H("Found the peer iface info.\n");
-			del_client_flt_rule(&(*it), client);
-			break;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::del_client_flt_rule(peer_iface_info *peer, client_info *client)
-{
-	list<flt_rule_info>::iterator it_flt;
-
-	for(it_flt = peer->flt_rule.begin(); it_flt != peer->flt_rule.end(); it_flt++)
-	{
-		if(it_flt->p_client == client)	//found the client in flt info list
-		{
-			IPACMDBG_H("Found the client in flt info list.\n");
-			if(m_is_ip_addr_assigned[IPA_IP_v4])
-			{
-				m_p_iface->eth_bridge_del_flt_rule(it_flt->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4);
-				IPACMDBG_H("IPv4 flt rule %d is deleted.\n", it_flt->flt_rule_hdl[IPA_IP_v4]);
-			}
-			if(m_is_ip_addr_assigned[IPA_IP_v6])
-			{
-				m_p_iface->eth_bridge_del_flt_rule(it_flt->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6);
-				IPACMDBG_H("IPv6 flt rule %d is deleted.\n", it_flt->flt_rule_hdl[IPA_IP_v6]);
-			}
-
-			peer->flt_rule.erase(it_flt);
-			break;
-		}
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::del_client_rt_rule(peer_iface_info *peer, client_info *client)
-{
-	ipa_hdr_l2_type peer_l2_hdr_type;
-	int i, num_rules;
-
-	peer_l2_hdr_type = peer->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type;
-	/* if the peer info is not for intra interface communication */
-	if(peer->peer != this)
-	{
-		IPACMDBG_H("Delete routing rules for inter interface communication.\n");
-
-		num_rules = client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4];
-		for(i = 0; i < num_rules; i++)
-		{
-			m_p_iface->eth_bridge_del_rt_rule(client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i], IPA_IP_v4);
-			IPACMDBG_H("IPv4 rt rule %d is deleted.\n", client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i]);
-		}
-		client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4] = 0;
-
-		num_rules = client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6];
-		for(i = 0; i < num_rules; i++)
-		{
-			m_p_iface->eth_bridge_del_rt_rule(client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i], IPA_IP_v6);
-			IPACMDBG_H("IPv6 rt rule %d is deleted.\n", client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i]);
-		}
-		client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6] = 0;
-	}
-	else
-	{
-		IPACMDBG_H("Delete routing rules for intra interface communication.\n");
-		num_rules = client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4];
-		for(i = 0; i < num_rules; i++)
-		{
-			m_p_iface->eth_bridge_del_rt_rule(client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i], IPA_IP_v4);
-			IPACMDBG_H("IPv4 rt rule %d is deleted.\n", client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i]);
-		}
-		client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4] = 0;
-
-		num_rules = client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6];
-		for(i = 0; i < num_rules; i++)
-		{
-			m_p_iface->eth_bridge_del_rt_rule(client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i], IPA_IP_v6);
-			IPACMDBG_H("IPv6 rt rule %d is deleted.\n", client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i]);
-		}
-		client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6] = 0;
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_down_event()
-{
-	list<IPACM_LanToLan_Iface>::iterator it_other_iface;
-	list<peer_iface_info>::iterator it_own_peer_info, it_other_iface_peer_info;
-	IPACM_LanToLan_Iface *other_iface;
-
-	/* clear inter-interface rules */
-	if(m_support_inter_iface_offload)
-	{
-		for(it_own_peer_info = m_peer_iface_info.begin(); it_own_peer_info != m_peer_iface_info.end();
-			it_own_peer_info++)
-		{
-			/* decrement reference count of peer l2 header type on both interfaces*/
-			decrement_ref_cnt_peer_l2_hdr_type(it_own_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type);
-			it_own_peer_info->peer->decrement_ref_cnt_peer_l2_hdr_type(m_p_iface->tx_prop->tx[0].hdr_l2_type);
-
-			/* first clear all flt rule on target interface */
-			IPACMDBG_H("Clear all flt rule on target interface.\n");
-			clear_all_flt_rule_for_one_peer_iface(&(*it_own_peer_info));
-
-			other_iface = it_own_peer_info->peer;
-			/* then clear all flt/rt rule and hdr proc ctx for target interface on peer interfaces */
-			IPACMDBG_H("Clear all flt/rt rules and hdr proc ctx for target interface on peer interfaces %s.\n",
-				it_own_peer_info->peer->get_iface_pointer()->dev_name);
-			for(it_other_iface_peer_info = other_iface->m_peer_iface_info.begin();
-				it_other_iface_peer_info != other_iface->m_peer_iface_info.end();
-				it_other_iface_peer_info++)
-			{
-				if(it_other_iface_peer_info->peer == this)	//found myself in other iface's peer info list
-				{
-					IPACMDBG_H("Found the right peer info on other iface.\n");
-					other_iface->clear_all_flt_rule_for_one_peer_iface(&(*it_other_iface_peer_info));
-					other_iface->clear_all_rt_rule_for_one_peer_iface(&(*it_other_iface_peer_info));
-					/* remove the peer info from the list */
-					other_iface->m_peer_iface_info.erase(it_other_iface_peer_info);
-					other_iface->del_hdr_proc_ctx(m_p_iface->tx_prop->tx[0].hdr_l2_type);
-					break;
-				}
-			}
-
-			/* then clear rt rule and hdr proc ctx and release rt table on target interface */
-			IPACMDBG_H("Clear rt rules and hdr proc ctx and release rt table on target interface.\n");
-			clear_all_rt_rule_for_one_peer_iface(&(*it_own_peer_info));
-			del_hdr_proc_ctx(it_own_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type);
-		}
-		m_peer_iface_info.clear();
-	}
-
-	/* clear intra interface rules */
-	if(m_support_intra_iface_offload)
-	{
-		IPACMDBG_H("Clear intra interface flt/rt rules and hdr proc ctx, release rt tables.\n");
-		clear_all_flt_rule_for_one_peer_iface(&m_intra_interface_info);
-		clear_all_rt_rule_for_one_peer_iface(&m_intra_interface_info);
-		m_p_iface->eth_bridge_del_hdr_proc_ctx(hdr_proc_ctx_for_intra_interface);
-		IPACMDBG_H("Hdr proc ctx with hdl %d is deleted.\n", hdr_proc_ctx_for_intra_interface);
-	}
-
-	/* then clear the client info list */
-	m_client_info.clear();
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::clear_all_flt_rule_for_one_peer_iface(peer_iface_info *peer)
-{
-	list<flt_rule_info>::iterator it;
-
-	for(it = peer->flt_rule.begin(); it != peer->flt_rule.end(); it++)
-	{
-		if(m_is_ip_addr_assigned[IPA_IP_v4])
-		{
-			m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4);
-			IPACMDBG_H("IPv4 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v4]);
-		}
-		if(m_is_ip_addr_assigned[IPA_IP_v6])
-		{
-			m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6);
-			IPACMDBG_H("IPv6 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v6]);
-		}
-	}
-	peer->flt_rule.clear();
-	return;
-}
-
-void IPACM_LanToLan_Iface::clear_all_rt_rule_for_one_peer_iface(peer_iface_info *peer)
-{
-	list<client_info>::iterator it;
-	ipa_hdr_l2_type peer_l2_type;
-
-	peer_l2_type = peer->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type;
-	if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 0)
-	{
-		for(it = m_client_info.begin(); it != m_client_info.end(); it++)
-		{
-			del_client_rt_rule(peer, &(*it));
-		}
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_wlan_scc_mcc_switch()
-{
-	list<peer_iface_info>::iterator it_peer_info;
-	list<client_info>::iterator it_client;
-	ipa_hdr_l2_type peer_l2_hdr_type;
-	bool flag[IPA_HDR_L2_MAX];
-	int i;
-
-	/* modify inter-interface routing rules */
-	if(m_support_inter_iface_offload)
-	{
-		IPACMDBG_H("Modify rt rules for peer interfaces.\n");
-		memset(flag, 0, sizeof(flag));
-		for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end(); it_peer_info++)
-		{
-			peer_l2_hdr_type = it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type;
-			if(flag[peer_l2_hdr_type] == false)
-			{
-				flag[peer_l2_hdr_type] = true;
-				for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-				{
-					m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type],
-						peer_l2_hdr_type, IPA_IP_v4, it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4],
-						it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4]);
-					IPACMDBG_H("The following IPv4 routing rules are modified:\n");
-					for(i = 0; i < it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4]; i++)
-					{
-						IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i]);
-					}
-
-					m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type],
-						peer_l2_hdr_type, IPA_IP_v6, it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6],
-						it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6]);
-					IPACMDBG_H("The following IPv6 routing rules are modified:\n");
-					for(i = 0; i < it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6]; i++)
-					{
-						IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i]);
-					}
-				}
-			}
-		}
-	}
-
-	/* modify routing rules for intra-interface communication */
-	IPACMDBG_H("Modify rt rules for intra-interface communication.\n");
-	if(m_support_intra_iface_offload)
-	{
-		for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-		{
-			m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_intra_interface,
-				m_p_iface->tx_prop->tx[0].hdr_l2_type, IPA_IP_v4, it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4],
-				it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]);
-			IPACMDBG_H("The following IPv4 routing rules are modified:\n");
-			for(i = 0; i < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]; i++)
-			{
-				IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i]);
-			}
-
-			m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_intra_interface,
-				m_p_iface->tx_prop->tx[0].hdr_l2_type, IPA_IP_v6, it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6],
-				it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]);
-			IPACMDBG_H("The following IPv6 routing rules are modified:\n");
-			for(i = 0; i < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]; i++)
-			{
-				IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i]);
-			}
-		}
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_intra_interface_info()
-{
-	uint32_t hdr_proc_ctx_hdl;
-
-	if(m_p_iface->tx_prop == NULL)
-	{
-		IPACMERR("No tx prop.\n");
-		return;
-	}
-
-	m_intra_interface_info.peer = this;
-
-	snprintf(m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX,
-		"eth_v4_intra_interface");
-	IPACMDBG_H("IPv4 routing table for flt name: %s\n", m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4]);
-	snprintf(m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX,
-		"eth_v6_intra_interface");
-	IPACMDBG_H("IPv6 routing table for flt name: %s\n", m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6]);
-
-	memcpy(m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v4], m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4],
-		IPA_RESOURCE_NAME_MAX);
-	IPACMDBG_H("IPv4 routing table for rt name: %s\n", m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v4]);
-	memcpy(m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v6], m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6],
-		IPA_RESOURCE_NAME_MAX);
-	IPACMDBG_H("IPv6 routing table for rt name: %s\n", m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v6]);
-
-	m_p_iface->eth_bridge_add_hdr_proc_ctx(m_p_iface->tx_prop->tx[0].hdr_l2_type,
-		&hdr_proc_ctx_hdl);
-	hdr_proc_ctx_for_intra_interface = hdr_proc_ctx_hdl;
-	IPACMDBG_H("Hdr proc ctx for intra-interface communication: hdl %d\n", hdr_proc_ctx_hdl);
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_new_iface_up(char rt_tbl_name_for_flt[][IPA_RESOURCE_NAME_MAX], char rt_tbl_name_for_rt[][IPA_RESOURCE_NAME_MAX],
-		IPACM_LanToLan_Iface *peer_iface)
-{
-	peer_iface_info new_peer;
-	ipa_hdr_l2_type peer_l2_hdr_type;
-
-	new_peer.peer = peer_iface;
-	memcpy(new_peer.rt_tbl_name_for_rt[IPA_IP_v4], rt_tbl_name_for_rt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX);
-	memcpy(new_peer.rt_tbl_name_for_rt[IPA_IP_v6], rt_tbl_name_for_rt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX);
-	memcpy(new_peer.rt_tbl_name_for_flt[IPA_IP_v4], rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX);
-	memcpy(new_peer.rt_tbl_name_for_flt[IPA_IP_v6], rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX);
-
-	peer_l2_hdr_type = peer_iface->m_p_iface->tx_prop->tx[0].hdr_l2_type;
-	increment_ref_cnt_peer_l2_hdr_type(peer_l2_hdr_type);
-	add_hdr_proc_ctx(peer_l2_hdr_type);
-
-	/* push the new peer_iface_info into the list */
-	m_peer_iface_info.push_front(new_peer);
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_client_add(uint8_t *mac)
-{
-	list<client_info>::iterator it_client;
-	list<peer_iface_info>::iterator it_peer_info;
-	client_info new_client;
-	bool flag[IPA_HDR_L2_MAX];
-
-	for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-	{
-		if(memcmp(it_client->mac_addr, mac, sizeof(it_client->mac_addr)) == 0)
-		{
-			IPACMDBG_H("This client has been added before.\n");
-			return;
-		}
-	}
-
-	if(m_client_info.size() == MAX_NUM_CLIENT)
-	{
-		IPACMDBG_H("The number of clients has reached maximum %d.\n", MAX_NUM_CLIENT);
-		return;
-	}
-
-	memcpy(new_client.mac_addr, mac, sizeof(new_client.mac_addr));
-	m_client_info.push_front(new_client);
-
-	client_info &front_client = m_client_info.front();
-
-	/* install inter-interface rules */
-	if(m_support_inter_iface_offload)
-	{
-		memset(flag, 0, sizeof(flag));
-		for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end(); it_peer_info++)
-		{
-			/* make sure add routing rule only once for each peer l2 header type */
-			if(flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] == false)
-			{
-				/* add client routing rule for each peer interface */
-				add_client_rt_rule(&(*it_peer_info), &front_client);
-				flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] = true;
-			}
-
-			/* add client filtering rule on peer interfaces */
-			it_peer_info->peer->add_one_client_flt_rule(this, &front_client);
-		}
-	}
-
-	/* install intra-interface rules */
-	if(m_support_intra_iface_offload)
-	{
-		/* add routing rule first */
-		add_client_rt_rule(&m_intra_interface_info, &front_client);
-
-		/* add filtering rule */
-		if(m_is_ip_addr_assigned[IPA_IP_v4])
-		{
-			add_client_flt_rule(&m_intra_interface_info, &front_client, IPA_IP_v4);
-		}
-		if(m_is_ip_addr_assigned[IPA_IP_v6])
-		{
-			add_client_flt_rule(&m_intra_interface_info, &front_client, IPA_IP_v6);
-		}
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::handle_client_del(uint8_t *mac)
-{
-	list<client_info>::iterator it_client;
-	list<peer_iface_info>::iterator it_peer_info;
-	bool flag[IPA_HDR_L2_MAX];
-
-	for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-	{
-		if(memcmp(it_client->mac_addr, mac, sizeof(it_client->mac_addr)) == 0)	//found the client
-		{
-			IPACMDBG_H("Found the client.\n");
-			break;
-		}
-	}
-
-	if(it_client != m_client_info.end())	//if we found the client
-	{
-		/* uninstall inter-interface rules */
-		if(m_support_inter_iface_offload)
-		{
-			memset(flag, 0, sizeof(flag));
-			for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end();
-				it_peer_info++)
-			{
-				IPACMDBG_H("Delete client filtering rule on peer interface.\n");
-				it_peer_info->peer->del_one_client_flt_rule(this, &(*it_client));
-
-				/* make sure to delete routing rule only once for each peer l2 header type */
-				if(flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] == false)
-				{
-					IPACMDBG_H("Delete client routing rule for peer interface.\n");
-					del_client_rt_rule(&(*it_peer_info), &(*it_client));
-					flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] = true;
-				}
-			}
-		}
-
-		/* uninstall intra-interface rules */
-		if(m_support_intra_iface_offload)
-		{
-			/* delete filtering rule first */
-			IPACMDBG_H("Delete client filtering rule for intra-interface communication.\n");
-			del_client_flt_rule(&m_intra_interface_info, &(*it_client));
-
-			/* delete routing rule */
-			IPACMDBG_H("Delete client routing rule for intra-interface communication.\n");
-			del_client_rt_rule(&m_intra_interface_info, &(*it_client));
-		}
-
-		/* erase the client from client info list */
-		m_client_info.erase(it_client);
-	}
-	else
-	{
-		IPACMDBG_H("The client is not found.\n");
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type)
-{
-	uint32_t hdr_proc_ctx_hdl;
-
-	if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 1)
-	{
-		m_p_iface->eth_bridge_add_hdr_proc_ctx(peer_l2_type, &hdr_proc_ctx_hdl);
-		hdr_proc_ctx_for_inter_interface[peer_l2_type] = hdr_proc_ctx_hdl;
-		IPACMDBG_H("Installed inter-interface hdr proc ctx on iface %s: handle %d\n", m_p_iface->dev_name, hdr_proc_ctx_hdl);
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::del_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type)
-{
-	if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 0)
-	{
-		m_p_iface->eth_bridge_del_hdr_proc_ctx(hdr_proc_ctx_for_inter_interface[peer_l2_type]);
-		IPACMDBG_H("Hdr proc ctx with hdl %d is deleted.\n", hdr_proc_ctx_for_inter_interface[peer_l2_type]);
-	}
-	return;
-}
-
-void IPACM_LanToLan_Iface::print_data_structure_info()
-{
-	list<peer_iface_info>::iterator it_peer;
-	list<client_info>::iterator it_client;
-	int i, j, k;
-
-	IPACMDBG_H("\n");
-	IPACMDBG_H("Interface %s:\n", m_p_iface->dev_name);
-	IPACMDBG_H("Is IPv4 addr assigned? %d\n", m_is_ip_addr_assigned[IPA_IP_v4]);
-	IPACMDBG_H("Is IPv6 addr assigned? %d\n", m_is_ip_addr_assigned[IPA_IP_v6]);
-	IPACMDBG_H("Support inter interface offload? %d\n", m_support_inter_iface_offload);
-	IPACMDBG_H("Support intra interface offload? %d\n", m_support_intra_iface_offload);
-
-	if(m_support_inter_iface_offload)
-	{
-		for(i = 0; i < IPA_HDR_L2_MAX; i++)
-		{
-			IPACMDBG_H("Ref_cnt of peer l2 type %s is %d.\n", ipa_l2_hdr_type[i], ref_cnt_peer_l2_hdr_type[i]);
-			if(ref_cnt_peer_l2_hdr_type[i] > 0)
-			{
-				IPACMDBG_H("Hdr proc ctx for peer l2 type %s: %d\n", ipa_l2_hdr_type[i], hdr_proc_ctx_for_inter_interface[i]);
-			}
-		}
-	}
-
-	if(m_support_intra_iface_offload)
-	{
-		IPACMDBG_H("Hdr proc ctx for intra-interface: %d\n", hdr_proc_ctx_for_intra_interface);
-	}
-
-	i = 1;
-	IPACMDBG_H("There are %d clients in total.\n", m_client_info.size());
-	for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++)
-	{
-		IPACMDBG_H("Client %d MAC: 0x%02x%02x%02x%02x%02x%02x Pointer: 0x%08x\n", i, it_client->mac_addr[0], it_client->mac_addr[1],
-			it_client->mac_addr[2], it_client->mac_addr[3], it_client->mac_addr[4], it_client->mac_addr[5], &(*it_client));
-
-		if(m_support_inter_iface_offload)
-		{
-			for(j = 0; j < IPA_HDR_L2_MAX; j++)
-			{
-				if(ref_cnt_peer_l2_hdr_type[j] > 0)
-				{
-					IPACMDBG_H("Printing routing rule info for inter-interface communication for peer l2 type %s.\n",
-						ipa_l2_hdr_type[j]);
-					IPACMDBG_H("Number of IPv4 routing rules is %d, handles:\n", it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v4]);
-					for(k = 0; k < it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v4]; k++)
-					{
-						IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[j].rule_hdl[IPA_IP_v4][k]);
-					}
-
-					IPACMDBG_H("Number of IPv6 routing rules is %d, handles:\n", it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v6]);
-					for(k = 0; k < it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v6]; k++)
-					{
-						IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[j].rule_hdl[IPA_IP_v6][k]);
-					}
-				}
-			}
-		}
-
-		if(m_support_intra_iface_offload)
-		{
-			IPACMDBG_H("Printing routing rule info for intra-interface communication.\n");
-			IPACMDBG_H("Number of IPv4 routing rules is %d, handles:\n", it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]);
-			for(j = 0; j < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]; j++)
-			{
-				IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][j]);
-			}
-
-			IPACMDBG_H("Number of IPv6 routing rules is %d, handles:\n", it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]);
-			for(j = 0; j < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]; j++)
-			{
-				IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][j]);
-			}
-		}
-		i++;
-	}
-
-	IPACMDBG_H("There are %d peer interfaces in total.\n", m_peer_iface_info.size());
-	for(it_peer = m_peer_iface_info.begin(); it_peer != m_peer_iface_info.end(); it_peer++)
-	{
-		print_peer_info(&(*it_peer));
-	}
-
-	if(m_support_intra_iface_offload)
-	{
-		IPACMDBG_H("This interface supports intra-interface communication, printing info:\n");
-		print_peer_info(&m_intra_interface_info);
-	}
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::print_peer_info(peer_iface_info *peer_info)
-{
-	list<flt_rule_info>::iterator it_flt;
-	list<rt_rule_info>::iterator it_rt;
-
-	IPACMDBG_H("Printing peer info for iface %s:\n", peer_info->peer->m_p_iface->dev_name);
-
-	IPACMDBG_H("There are %d flt info in total.\n", peer_info->flt_rule.size());
-	for(it_flt = peer_info->flt_rule.begin(); it_flt != peer_info->flt_rule.end(); it_flt++)
-	{
-		IPACMDBG_H("Flt rule handle for client 0x%08x:\n", it_flt->p_client);
-		if(m_is_ip_addr_assigned[IPA_IP_v4])
-		{
-			IPACMDBG_H("IPv4 %d\n", it_flt->flt_rule_hdl[IPA_IP_v4]);
-		}
-		if(m_is_ip_addr_assigned[IPA_IP_v6])
-		{
-			IPACMDBG_H("IPv6 %d\n", it_flt->flt_rule_hdl[IPA_IP_v6]);
-		}
-	}
-
-	return;
-}
-
-IPACM_Lan* IPACM_LanToLan_Iface::get_iface_pointer()
-{
-	return m_p_iface;
-}
-
-bool IPACM_LanToLan_Iface::get_m_is_ip_addr_assigned(ipa_ip_type iptype)
-{
-	IPACMDBG_H("Has IP address been assigned to interface %s for IP type %d? %d\n",
-		m_p_iface->dev_name, iptype, m_is_ip_addr_assigned[iptype]);
-	return m_is_ip_addr_assigned[iptype];
-}
-
-void IPACM_LanToLan_Iface::set_m_is_ip_addr_assigned(ipa_ip_type iptype, bool value)
-{
-	IPACMDBG_H("Is IP address of IP type %d assigned to interface %s? %d\n", iptype,
-		m_p_iface->dev_name, value);
-	m_is_ip_addr_assigned[iptype] = value;
-}
-
-bool IPACM_LanToLan_Iface::get_m_support_inter_iface_offload()
-{
-	IPACMDBG_H("Support inter interface offload on %s? %d\n", m_p_iface->dev_name,
-		m_support_inter_iface_offload);
-	return m_support_inter_iface_offload;
-}
-
-bool IPACM_LanToLan_Iface::get_m_support_intra_iface_offload()
-{
-	IPACMDBG_H("Support intra interface offload on %s? %d\n", m_p_iface->dev_name,
-		m_support_intra_iface_offload);
-	return m_support_intra_iface_offload;
-}
-
-void IPACM_LanToLan_Iface::increment_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type)
-{
-	ref_cnt_peer_l2_hdr_type[peer_l2_type]++;
-	IPACMDBG_H("Now the ref_cnt of peer l2 hdr type %s is %d.\n", ipa_l2_hdr_type[peer_l2_type],
-		ref_cnt_peer_l2_hdr_type[peer_l2_type]);
-
-	return;
-}
-
-void IPACM_LanToLan_Iface::decrement_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type)
-{
-	ref_cnt_peer_l2_hdr_type[peer_l2_type]--;
-	IPACMDBG_H("Now the ref_cnt of peer l2 hdr type %s is %d.\n", ipa_l2_hdr_type[peer_l2_type],
-		ref_cnt_peer_l2_hdr_type[peer_l2_type]);
-
-	return;
-}
diff --git a/ipacm/src/IPACM_Log.cpp b/ipacm/src/IPACM_Log.cpp
deleted file mode 100644
index 20dd26c..0000000
--- a/ipacm/src/IPACM_Log.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_log.cpp
-
-	@brief
-	This file implements the IPAM log functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include "IPACM_Log.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <asm/types.h>
-#include <linux/if.h>
-#include <sys/un.h>
-#include <errno.h>
-#include <IPACM_Defs.h>
-
-void logmessage(int log_level)
-{
-	return;
-}
-
-/* start IPACMDIAG socket*/
-int create_socket(unsigned int *sockfd)
-{
-
-  if ((*sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == IPACM_FAILURE)
-  {
-    perror("Error creating ipacm_log socket\n");
-    return IPACM_FAILURE;
-  }
-
-  if(fcntl(*sockfd, F_SETFD, FD_CLOEXEC) < 0)
-  {
-    perror("Couldn't set ipacm_log Close on Exec\n");
-  }
-
-  return IPACM_SUCCESS;
-}
-
-void ipacm_log_send( void * user_data)
-{
-	ipacm_log_buffer_t ipacm_log_buffer;
-	int numBytes=0, len;
-	struct sockaddr_un ipacmlog_socket;
-	static unsigned int ipacm_log_sockfd = 0;
-
-	if(ipacm_log_sockfd == 0)
-	{
-		/* start ipacm_log socket */
-		if(create_socket(&ipacm_log_sockfd) < 0)
-		{
-			printf("unable to create ipacm_log socket\n");
-			return;
-		}
-		printf("create ipacm_log socket successfully\n");
-	}
-	ipacmlog_socket.sun_family = AF_UNIX;
-	strcpy(ipacmlog_socket.sun_path, IPACMLOG_FILE);
-	len = strlen(ipacmlog_socket.sun_path) + sizeof(ipacmlog_socket.sun_family);
-
-	memcpy(ipacm_log_buffer.user_data, user_data, MAX_BUF_LEN);
-
-	//printf("send : %s\n", ipacm_log_buffer.user_data);
-	if ((numBytes = sendto(ipacm_log_sockfd, (void *)&ipacm_log_buffer, sizeof(ipacm_log_buffer.user_data), 0,
-			(struct sockaddr *)&ipacmlog_socket, len)) == -1)
-	{
-		printf("Send Failed(%d) %s \n",errno,strerror(errno));
-		return;
-	}
-	return;
-}
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
deleted file mode 100644
index c6ab9ee..0000000
--- a/ipacm/src/IPACM_Main.cpp
+++ /dev/null
@@ -1,939 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Main.cpp
-
-	@brief
-	This file implements the IPAM functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-/******************************************************************************
-
-                      IPCM_MAIN.C
-
-******************************************************************************/
-
-#include <sys/socket.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <sys/ioctl.h>
-#include <linux/if.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <fcntl.h>
-#include <sys/inotify.h>
-#include <stdlib.h>
-#include <signal.h>
-#include "linux/ipa_qmi_service_v01.h"
-
-#include "IPACM_CmdQueue.h"
-#include "IPACM_EvtDispatcher.h"
-#include "IPACM_Defs.h"
-#include "IPACM_Neighbor.h"
-#include "IPACM_IfaceManager.h"
-#include "IPACM_Log.h"
-
-#include "IPACM_ConntrackListener.h"
-#include "IPACM_ConntrackClient.h"
-#include "IPACM_Netlink.h"
-
-/* not defined(FEATURE_IPA_ANDROID)*/
-#ifndef FEATURE_IPA_ANDROID
-#include "IPACM_LanToLan.h"
-#endif
-
-#define IPA_DRIVER  "/dev/ipa"
-
-#define IPACM_FIREWALL_FILE_NAME    "mobileap_firewall.xml"
-#define IPACM_CFG_FILE_NAME    "IPACM_cfg.xml"
-#ifdef FEATURE_IPA_ANDROID
-#define IPACM_PID_FILE "/data/misc/ipa/ipacm.pid"
-#define IPACM_DIR_NAME     "/data"
-#else/* defined(FEATURE_IPA_ANDROID) */
-#define IPACM_PID_FILE "/etc/ipacm.pid"
-#define IPACM_DIR_NAME     "/etc"
-#endif /* defined(NOT FEATURE_IPA_ANDROID)*/
-#define IPACM_NAME "ipacm"
-
-#define INOTIFY_EVENT_SIZE  (sizeof(struct inotify_event))
-#define INOTIFY_BUF_LEN     (INOTIFY_EVENT_SIZE + 2*sizeof(IPACM_FIREWALL_FILE_NAME))
-
-#define IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS  3
-#define IPA_DRIVER_WLAN_EVENT_SIZE  (sizeof(struct ipa_wlan_msg_ex)+ IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS*sizeof(ipa_wlan_hdr_attrib_val))
-#define IPA_DRIVER_PIPE_STATS_EVENT_SIZE  (sizeof(struct ipa_get_data_stats_resp_msg_v01))
-#define IPA_DRIVER_WLAN_META_MSG    (sizeof(struct ipa_msg_meta))
-#define IPA_DRIVER_WLAN_BUF_LEN     (IPA_DRIVER_PIPE_STATS_EVENT_SIZE + IPA_DRIVER_WLAN_META_MSG)
-
-uint32_t ipacm_event_stats[IPACM_EVENT_MAX];
-bool ipacm_logging = true;
-
-void ipa_is_ipacm_running(void);
-int ipa_get_if_index(char *if_name, int *if_index);
-
-/* start netlink socket monitor*/
-void* netlink_start(void *param)
-{
-	ipa_nl_sk_fd_set_info_t sk_fdset;
-	int ret_val = 0;
-	memset(&sk_fdset, 0, sizeof(ipa_nl_sk_fd_set_info_t));
-	IPACMDBG_H("netlink starter memset sk_fdset succeeds\n");
-	ret_val = ipa_nl_listener_init(NETLINK_ROUTE, (RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_LINK |
-																										RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_NEIGH |
-																										RTNLGRP_IPV6_PREFIX),
-																 &sk_fdset, ipa_nl_recv_msg);
-
-	if (ret_val != IPACM_SUCCESS)
-	{
-		IPACMERR("Failed to initialize IPA netlink event listener\n");
-		return NULL;
-	}
-
-	return NULL;
-}
-
-/* start firewall-rule monitor*/
-void* firewall_monitor(void *param)
-{
-	int length;
-	int wd;
-	char buffer[INOTIFY_BUF_LEN];
-	int inotify_fd;
-	ipacm_cmd_q_data evt_data;
-	uint32_t mask = IN_MODIFY | IN_MOVE;
-
-	inotify_fd = inotify_init();
-	if (inotify_fd < 0)
-	{
-		PERROR("inotify_init");
-	}
-
-	IPACMDBG_H("Waiting for nofications in dir %s with mask: 0x%x\n", IPACM_DIR_NAME, mask);
-
-	wd = inotify_add_watch(inotify_fd,
-												 IPACM_DIR_NAME,
-												 mask);
-
-	while (1)
-	{
-		length = read(inotify_fd, buffer, INOTIFY_BUF_LEN);
-		if (length < 0)
-		{
-			IPACMERR("inotify read() error return length: %d and mask: 0x%x\n", length, mask);
-			continue;
-		}
-
-		struct inotify_event* event;
-		event = (struct inotify_event*)malloc(length);
-		if(event == NULL)
-		{
-			IPACMERR("Failed to allocate memory.\n");
-			return NULL;
-		}
-		memset(event, 0, length);
-		memcpy(event, buffer, length);
-
-		if (event->len > 0)
-		{
-			if ( (event->mask & IN_MODIFY) || (event->mask & IN_MOVE))
-			{
-				if (event->mask & IN_ISDIR)
-				{
-					IPACMDBG_H("The directory %s was 0x%x\n", event->name, event->mask);
-				}
-				else if (!strncmp(event->name, IPACM_FIREWALL_FILE_NAME, event->len)) // firewall_rule change
-				{
-					IPACMDBG_H("File \"%s\" was 0x%x\n", event->name, event->mask);
-					IPACMDBG_H("The interested file %s .\n", IPACM_FIREWALL_FILE_NAME);
-
-					evt_data.event = IPA_FIREWALL_CHANGE_EVENT;
-					evt_data.evt_data = NULL;
-
-					/* Insert IPA_FIREWALL_CHANGE_EVENT to command queue */
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-				}
-				else if (!strncmp(event->name, IPACM_CFG_FILE_NAME, event->len)) // IPACM_configuration change
-				{
-					IPACMDBG_H("File \"%s\" was 0x%x\n", event->name, event->mask);
-					IPACMDBG_H("The interested file %s .\n", IPACM_CFG_FILE_NAME);
-
-					evt_data.event = IPA_CFG_CHANGE_EVENT;
-					evt_data.evt_data = NULL;
-
-					/* Insert IPA_FIREWALL_CHANGE_EVENT to command queue */
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-				}
-			}
-			IPACMDBG_H("Received monitoring event %s.\n", event->name);
-		}
-		free(event);
-	}
-
-	(void)inotify_rm_watch(inotify_fd, wd);
-	(void)close(inotify_fd);
-	return NULL;
-}
-
-
-/* start IPACM wan-driver notifier */
-void* ipa_driver_msg_notifier(void *param)
-{
-	int length, fd, cnt;
-	char buffer[IPA_DRIVER_WLAN_BUF_LEN];
-	struct ipa_msg_meta event_hdr;
-	struct ipa_ecm_msg event_ecm;
-	struct ipa_wan_msg event_wan;
-	struct ipa_wlan_msg_ex event_ex_o;
-	struct ipa_wlan_msg *event_wlan=NULL;
-	struct ipa_wlan_msg_ex *event_ex= NULL;
-	struct ipa_get_data_stats_resp_msg_v01 event_data_stats;
-	struct ipa_get_apn_data_stats_resp_msg_v01 event_network_stats;
-
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_data_mac *data = NULL;
-	ipacm_event_data_fid *data_fid = NULL;
-	ipacm_event_data_iptype *data_iptype = NULL;
-	ipacm_event_data_wlan_ex *data_ex;
-	ipa_get_data_stats_resp_msg_v01 *data_tethering_stats = NULL;
-	ipa_get_apn_data_stats_resp_msg_v01 *data_network_stats = NULL;
-
-	ipacm_cmd_q_data new_neigh_evt;
-	ipacm_event_data_all* new_neigh_data;
-
-	fd = open(IPA_DRIVER, O_RDWR);
-	if (fd < 0)
-	{
-		IPACMERR("Failed opening %s.\n", IPA_DRIVER);
-		return NULL;
-	}
-
-	while (1)
-	{
-		IPACMDBG_H("Waiting for nofications from IPA driver \n");
-		memset(buffer, 0, sizeof(buffer));
-		memset(&evt_data, 0, sizeof(evt_data));
-		memset(&new_neigh_evt, 0, sizeof(ipacm_cmd_q_data));
-		new_neigh_data = NULL;
-		data = NULL;
-		data_fid = NULL;
-		data_tethering_stats = NULL;
-		data_network_stats = NULL;
-
-		length = read(fd, buffer, IPA_DRIVER_WLAN_BUF_LEN);
-		if (length < 0)
-		{
-			PERROR("didn't read IPA_driver correctly");
-			continue;
-		}
-
-		memcpy(&event_hdr, buffer,sizeof(struct ipa_msg_meta));
-		IPACMDBG_H("Message type: %d\n", event_hdr.msg_type);
-		IPACMDBG_H("Event header length received: %d\n",event_hdr.msg_len);
-
-		/* Insert WLAN_DRIVER_EVENT to command queue */
-		switch (event_hdr.msg_type)
-		{
-
-		case SW_ROUTING_ENABLE:
-			IPACMDBG_H("Received SW_ROUTING_ENABLE\n");
-			evt_data.event = IPA_SW_ROUTING_ENABLE;
-			IPACMDBG_H("Not supported anymore\n");
-			continue;
-
-		case SW_ROUTING_DISABLE:
-			IPACMDBG_H("Received SW_ROUTING_DISABLE\n");
-			evt_data.event = IPA_SW_ROUTING_DISABLE;
-			IPACMDBG_H("Not supported anymore\n");
-			continue;
-
-		case WLAN_AP_CONNECT:
-			event_wlan = (struct ipa_wlan_msg *) (buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Received WLAN_AP_CONNECT name: %s\n",event_wlan->name);
-			IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
-			evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-
-		case WLAN_AP_DISCONNECT:
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Received WLAN_AP_DISCONNECT name: %s\n",event_wlan->name);
-			IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
-			evt_data.event = IPA_WLAN_LINK_DOWN_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-		case WLAN_STA_CONNECT:
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Received WLAN_STA_CONNECT name: %s\n",event_wlan->name);
-			IPACMDBG_H("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-			data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-			if(data == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
-				return NULL;
-			}
-			memcpy(data->mac_addr,
-				 event_wlan->mac_addr,
-				 sizeof(event_wlan->mac_addr));
-			ipa_get_if_index(event_wlan->name, &(data->if_index));
-			evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT;
-			evt_data.evt_data = data;
-			break;
-
-		case WLAN_STA_DISCONNECT:
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Received WLAN_STA_DISCONNECT name: %s\n",event_wlan->name);
-			IPACMDBG_H("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
-			evt_data.event = IPA_WLAN_LINK_DOWN_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-
-		case WLAN_CLIENT_CONNECT:
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Received WLAN_CLIENT_CONNECT\n");
-			IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-		        if (data == NULL)
-		        {
-		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
-		    	        return NULL;
-		        }
-			memcpy(data->mac_addr,
-						 event_wlan->mac_addr,
-						 sizeof(event_wlan->mac_addr));
-			ipa_get_if_index(event_wlan->name, &(data->if_index));
-		        evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT;
-			evt_data.evt_data = data;
-			break;
-
-		case WLAN_CLIENT_CONNECT_EX:
-			IPACMDBG_H("Received WLAN_CLIENT_CONNECT_EX\n");
-
-			memcpy(&event_ex_o, buffer + sizeof(struct ipa_msg_meta),sizeof(struct ipa_wlan_msg_ex));
-			if(event_ex_o.num_of_attribs > IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS)
-			{
-				IPACMERR("buffer size overflow\n");
-				return NULL;
-			}
-			length = sizeof(ipa_wlan_msg_ex)+ event_ex_o.num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val);
-			IPACMDBG_H("num_of_attribs %d, length %d\n", event_ex_o.num_of_attribs, length);
-			event_ex = (ipa_wlan_msg_ex *)malloc(length);
-			if(event_ex == NULL )
-			{
-				IPACMERR("Unable to allocate memory\n");
-				return NULL;
-			}
-			memcpy(event_ex, buffer + sizeof(struct ipa_msg_meta), length);
-			data_ex = (ipacm_event_data_wlan_ex *)malloc(sizeof(ipacm_event_data_wlan_ex) + event_ex_o.num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val));
-		    if (data_ex == NULL)
-		    {
-				IPACMERR("unable to allocate memory for event data\n");
-		    	return NULL;
-		    }
-			data_ex->num_of_attribs = event_ex->num_of_attribs;
-
-			memcpy(data_ex->attribs,
-						event_ex->attribs,
-						event_ex->num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val));
-
-			ipa_get_if_index(event_ex->name, &(data_ex->if_index));
-			evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT_EX;
-			evt_data.evt_data = data_ex;
-
-			/* Construct new_neighbor msg with netdev device internally */
-			new_neigh_data = (ipacm_event_data_all*)malloc(sizeof(ipacm_event_data_all));
-			if(new_neigh_data == NULL)
-			{
-				IPACMERR("Failed to allocate memory.\n");
-				return NULL;
-			}
-			memset(new_neigh_data, 0, sizeof(ipacm_event_data_all));
-			new_neigh_data->iptype = IPA_IP_v6;
-			for(cnt = 0; cnt < event_ex->num_of_attribs; cnt++)
-			{
-				if(event_ex->attribs[cnt].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
-				{
-					memcpy(new_neigh_data->mac_addr, event_ex->attribs[cnt].u.mac_addr, sizeof(new_neigh_data->mac_addr));
-					IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-								 event_ex->attribs[cnt].u.mac_addr[0], event_ex->attribs[cnt].u.mac_addr[1], event_ex->attribs[cnt].u.mac_addr[2],
-								 event_ex->attribs[cnt].u.mac_addr[3], event_ex->attribs[cnt].u.mac_addr[4], event_ex->attribs[cnt].u.mac_addr[5]);
-				}
-				else if(event_ex->attribs[cnt].attrib_type == WLAN_HDR_ATTRIB_STA_ID)
-				{
-					IPACMDBG_H("Wlan client id %d\n",event_ex->attribs[cnt].u.sta_id);
-				}
-				else
-				{
-					IPACMDBG_H("Wlan message has unexpected type!\n");
-				}
-			}
-			new_neigh_data->if_index = data_ex->if_index;
-			new_neigh_evt.evt_data = (void*)new_neigh_data;
-			new_neigh_evt.event = IPA_NEW_NEIGH_EVENT;
-			free(event_ex);
-			break;
-
-		case WLAN_CLIENT_DISCONNECT:
-			IPACMDBG_H("Received WLAN_CLIENT_DISCONNECT\n");
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-		        if (data == NULL)
-		        {
-		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
-		    	        return NULL;
-		        }
-			memcpy(data->mac_addr,
-						 event_wlan->mac_addr,
-						 sizeof(event_wlan->mac_addr));
-			ipa_get_if_index(event_wlan->name, &(data->if_index));
-			evt_data.event = IPA_WLAN_CLIENT_DEL_EVENT;
-			evt_data.evt_data = data;
-			break;
-
-		case WLAN_CLIENT_POWER_SAVE_MODE:
-			IPACMDBG_H("Received WLAN_CLIENT_POWER_SAVE_MODE\n");
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-		        if (data == NULL)
-		        {
-		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
-		    	        return NULL;
-		        }
-			memcpy(data->mac_addr,
-						 event_wlan->mac_addr,
-						 sizeof(event_wlan->mac_addr));
-			ipa_get_if_index(event_wlan->name, &(data->if_index));
-			evt_data.event = IPA_WLAN_CLIENT_POWER_SAVE_EVENT;
-			evt_data.evt_data = data;
-			break;
-
-		case WLAN_CLIENT_NORMAL_MODE:
-			IPACMDBG_H("Received WLAN_CLIENT_NORMAL_MODE\n");
-			event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
-			IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
-							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]);
-		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-		        if (data == NULL)
-		        {
-		    	       IPACMERR("unable to allocate memory for event_wlan data\n");
-		    	       return NULL;
-		        }
-			memcpy(data->mac_addr,
-						 event_wlan->mac_addr,
-						 sizeof(event_wlan->mac_addr));
-			ipa_get_if_index(event_wlan->name, &(data->if_index));
-			evt_data.evt_data = data;
-			evt_data.event = IPA_WLAN_CLIENT_RECOVER_EVENT;
-			break;
-
-		case ECM_CONNECT:
-			memcpy(&event_ecm, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_ecm_msg));
-			IPACMDBG_H("Received ECM_CONNECT name: %s\n",event_ecm.name);
-			data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_ecm data_fid\n");
-				return NULL;
-			}
-			data_fid->if_index = event_ecm.ifindex;
-			evt_data.event = IPA_USB_LINK_UP_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-
-		case ECM_DISCONNECT:
-			memcpy(&event_ecm, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_ecm_msg));
-			IPACMDBG_H("Received ECM_DISCONNECT name: %s\n",event_ecm.name);
-			data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_ecm data_fid\n");
-				return NULL;
-			}
-			data_fid->if_index = event_ecm.ifindex;
-			evt_data.event = IPA_LINK_DOWN_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-		/* Add for 8994 Android case */
-		case WAN_UPSTREAM_ROUTE_ADD:
-			memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg));
-			IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD name: %s, tethered name: %s\n", event_wan.upstream_ifname, event_wan.tethered_ifname);
-			data_iptype = (ipacm_event_data_iptype *)malloc(sizeof(ipacm_event_data_iptype));
-			if(data_iptype == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_ecm data_iptype\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wan.upstream_ifname, &(data_iptype->if_index));
-			ipa_get_if_index(event_wan.tethered_ifname, &(data_iptype->if_index_tether));
-			data_iptype->iptype = event_wan.ip;
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-			data_iptype->ipv4_addr_gw = event_wan.ipv4_addr_gw;
-			data_iptype->ipv6_addr_gw[0] = event_wan.ipv6_addr_gw[0];
-			data_iptype->ipv6_addr_gw[1] = event_wan.ipv6_addr_gw[1];
-			data_iptype->ipv6_addr_gw[2] = event_wan.ipv6_addr_gw[2];
-			data_iptype->ipv6_addr_gw[3] = event_wan.ipv6_addr_gw[3];
-			IPACMDBG_H("default gw ipv4 (%x)\n", data_iptype->ipv4_addr_gw);
-			IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n",
-							data_iptype->ipv6_addr_gw[0], data_iptype->ipv6_addr_gw[1], data_iptype->ipv6_addr_gw[2], data_iptype->ipv6_addr_gw[3]);
-#endif
-			IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD: fid(%d) tether_fid(%d) ip-type(%d)\n", data_iptype->if_index,
-					data_iptype->if_index_tether, data_iptype->iptype);
-			evt_data.event = IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT;
-			evt_data.evt_data = data_iptype;
-			break;
-		case WAN_UPSTREAM_ROUTE_DEL:
-			memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg));
-			IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL name: %s, tethered name: %s\n", event_wan.upstream_ifname, event_wan.tethered_ifname);
-			data_iptype = (ipacm_event_data_iptype *)malloc(sizeof(ipacm_event_data_iptype));
-			if(data_iptype == NULL)
-			{
-				IPACMERR("unable to allocate memory for event_ecm data_iptype\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wan.upstream_ifname, &(data_iptype->if_index));
-			ipa_get_if_index(event_wan.tethered_ifname, &(data_iptype->if_index_tether));
-			data_iptype->iptype = event_wan.ip;
-			IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) ip-type(%d)\n", data_iptype->if_index, data_iptype->iptype);
-			evt_data.event = IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT;
-			evt_data.evt_data = data_iptype;
-			break;
-		/* End of adding for 8994 Android case */
-
-		/* Add for embms case */
-		case WAN_EMBMS_CONNECT:
-			memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg));
-			IPACMDBG("Received WAN_EMBMS_CONNECT name: %s\n",event_wan.upstream_ifname);
-			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 NULL;
-			}
-			ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index));
-			evt_data.event = IPA_WAN_EMBMS_LINK_UP_EVENT;
-			evt_data.evt_data = data_fid;
-			break;
-
-		case WLAN_SWITCH_TO_SCC:
-			IPACMDBG_H("Received WLAN_SWITCH_TO_SCC\n");
-		case WLAN_WDI_ENABLE:
-			IPACMDBG_H("Received WLAN_WDI_ENABLE\n");
-			if (IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-			{
-				IPACM_Iface::ipacmcfg->isMCC_Mode = false;
-				evt_data.event = IPA_WLAN_SWITCH_TO_SCC;
-				break;
-			}
-			continue;
-		case WLAN_SWITCH_TO_MCC:
-			IPACMDBG_H("Received WLAN_SWITCH_TO_MCC\n");
-		case WLAN_WDI_DISABLE:
-			IPACMDBG_H("Received WLAN_WDI_DISABLE\n");
-			if (IPACM_Iface::ipacmcfg->isMCC_Mode == false)
-			{
-				IPACM_Iface::ipacmcfg->isMCC_Mode = true;
-				evt_data.event = IPA_WLAN_SWITCH_TO_MCC;
-				break;
-			}
-			continue;
-
-		case WAN_XLAT_CONNECT:
-			memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta),
-				sizeof(struct ipa_wan_msg));
-			IPACMDBG_H("Received WAN_XLAT_CONNECT name: %s\n",
-					event_wan.upstream_ifname);
-
-			/* post IPA_LINK_UP_EVENT event
-			 * may be WAN interface is not up
-			*/
-			data_fid = (ipacm_event_data_fid *)calloc(1, sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for xlat event\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index));
-			evt_data.event = IPA_LINK_UP_EVENT;
-			evt_data.evt_data = data_fid;
-			IPACMDBG_H("Posting IPA_LINK_UP_EVENT event:%d\n", evt_data.event);
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-			/* post IPA_WAN_XLAT_CONNECT_EVENT event */
-			memset(&evt_data, 0, sizeof(evt_data));
-			data_fid = (ipacm_event_data_fid *)calloc(1, sizeof(ipacm_event_data_fid));
-			if(data_fid == NULL)
-			{
-				IPACMERR("unable to allocate memory for xlat event\n");
-				return NULL;
-			}
-			ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index));
-			evt_data.event = IPA_WAN_XLAT_CONNECT_EVENT;
-			evt_data.evt_data = data_fid;
-			IPACMDBG_H("Posting IPA_WAN_XLAT_CONNECT_EVENT event:%d\n", evt_data.event);
-			break;
-
-		case IPA_TETHERING_STATS_UPDATE_STATS:
-			memcpy(&event_data_stats, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_get_data_stats_resp_msg_v01));
-			data_tethering_stats = (ipa_get_data_stats_resp_msg_v01 *)malloc(sizeof(struct ipa_get_data_stats_resp_msg_v01));
-			if(data_tethering_stats == NULL)
-			{
-				IPACMERR("unable to allocate memory for event data_tethering_stats\n");
-				return NULL;
-			}
-			memcpy(data_tethering_stats,
-					 &event_data_stats,
-						 sizeof(struct ipa_get_data_stats_resp_msg_v01));
-			IPACMDBG("Received IPA_TETHERING_STATS_UPDATE_STATS ipa_stats_type: %d\n",data_tethering_stats->ipa_stats_type);
-			IPACMDBG("Received %d UL, %d DL pipe stats\n",data_tethering_stats->ul_src_pipe_stats_list_len, data_tethering_stats->dl_dst_pipe_stats_list_len);
-			evt_data.event = IPA_TETHERING_STATS_UPDATE_EVENT;
-			evt_data.evt_data = data_tethering_stats;
-			break;
-
-		case IPA_TETHERING_STATS_UPDATE_NETWORK_STATS:
-			memcpy(&event_network_stats, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_get_apn_data_stats_resp_msg_v01));
-			data_network_stats = (ipa_get_apn_data_stats_resp_msg_v01 *)malloc(sizeof(ipa_get_apn_data_stats_resp_msg_v01));
-			if(data_network_stats == NULL)
-			{
-				IPACMERR("unable to allocate memory for event data_network_stats\n");
-				return NULL;
-			}
-			memcpy(data_network_stats,
-					 &event_network_stats,
-						 sizeof(struct ipa_get_apn_data_stats_resp_msg_v01));
-			IPACMDBG("Received %d apn network stats \n", data_network_stats->apn_data_stats_list_len);
-			evt_data.event = IPA_NETWORK_STATS_UPDATE_EVENT;
-			evt_data.evt_data = data_network_stats;
-			break;
-
-		default:
-			IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type);
-			continue;
-
-		}
-		/* finish command queue */
-		IPACMDBG_H("Posting event:%d\n", evt_data.event);
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
-		/* push new_neighbor with netdev device internally */
-		if(new_neigh_data != NULL)
-		{
-			IPACMDBG_H("Internally post event IPA_NEW_NEIGH_EVENT\n");
-			IPACM_EvtDispatcher::PostEvt(&new_neigh_evt);
-		}
-	}
-
-	(void)close(fd);
-	return NULL;
-}
-
-void IPACM_Sig_Handler(int sig)
-{
-	int cnt;
-	ipacm_cmd_q_data evt_data;
-
-	printf("Received Signal: %d\n", sig);
-	memset(&evt_data, 0, sizeof(evt_data));
-
-	switch(sig)
-	{
-		case SIGUSR1:
-			IPACMDBG_H("Received SW_ROUTING_ENABLE request \n");
-			evt_data.event = IPA_SW_ROUTING_ENABLE;
-			IPACM_Iface::ipacmcfg->ipa_sw_rt_enable = true;
-			break;
-
-		case SIGUSR2:
-			IPACMDBG_H("Received SW_ROUTING_DISABLE request \n");
-			evt_data.event = IPA_SW_ROUTING_DISABLE;
-			IPACM_Iface::ipacmcfg->ipa_sw_rt_enable = false;
-			break;
-	}
-	/* finish command queue */
-	IPACMDBG_H("Posting event:%d\n", evt_data.event);
-	IPACM_EvtDispatcher::PostEvt(&evt_data);
-	return;
-}
-
-void RegisterForSignals(void)
-{
-
-	signal(SIGUSR1, IPACM_Sig_Handler);
-	signal(SIGUSR2, IPACM_Sig_Handler);
-}
-
-
-int main(int argc, char **argv)
-{
-	int ret;
-	pthread_t netlink_thread = 0, monitor_thread = 0, ipa_driver_thread = 0;
-	pthread_t cmd_queue_thread = 0;
-
-	/* check if ipacm is already running or not */
-	ipa_is_ipacm_running();
-
-	IPACMDBG_H("In main()\n");
-	IPACM_Neighbor *neigh = new IPACM_Neighbor();
-	IPACM_IfaceManager *ifacemgr = new IPACM_IfaceManager();
-
-#ifdef FEATURE_ETH_BRIDGE_LE
-	IPACM_LanToLan* lan2lan = new IPACM_LanToLan();
-#endif
-
-	IPACM_ConntrackClient *cc = IPACM_ConntrackClient::GetInstance();
-	CtList = new IPACM_ConntrackListener();
-
-	IPACMDBG_H("Staring IPA main\n");
-	IPACMDBG_H("ipa_cmdq_successful\n");
-
-
-	RegisterForSignals();
-
-	if (IPACM_SUCCESS == cmd_queue_thread)
-	{
-		ret = pthread_create(&cmd_queue_thread, NULL, MessageQueue::Process, NULL);
-		if (IPACM_SUCCESS != ret)
-		{
-			IPACMERR("unable to command queue thread\n");
-			return ret;
-		}
-		IPACMDBG_H("created command queue thread\n");
-		if(pthread_setname_np(cmd_queue_thread, "cmd queue process") != 0)
-		{
-			IPACMERR("unable to set thread name\n");
-		}
-	}
-
-	if (IPACM_SUCCESS == netlink_thread)
-	{
-		ret = pthread_create(&netlink_thread, NULL, netlink_start, NULL);
-		if (IPACM_SUCCESS != ret)
-		{
-			IPACMERR("unable to create netlink thread\n");
-			return ret;
-		}
-		IPACMDBG_H("created netlink thread\n");
-		if(pthread_setname_np(netlink_thread, "netlink socket") != 0)
-		{
-			IPACMERR("unable to set thread name\n");
-		}
-	}
-
-	/* Enable Firewall support only on MDM targets */
-#ifndef FEATURE_IPA_ANDROID
-	if (IPACM_SUCCESS == monitor_thread)
-	{
-		ret = pthread_create(&monitor_thread, NULL, firewall_monitor, NULL);
-		if (IPACM_SUCCESS != ret)
-		{
-			IPACMERR("unable to create monitor thread\n");
-			return ret;
-		}
-		IPACMDBG_H("created firewall monitor thread\n");
-		if(pthread_setname_np(monitor_thread, "firewall cfg process") != 0)
-		{
-			IPACMERR("unable to set thread name\n");
-		}
-	}
-#endif
-
-	if (IPACM_SUCCESS == ipa_driver_thread)
-	{
-		ret = pthread_create(&ipa_driver_thread, NULL, ipa_driver_msg_notifier, NULL);
-		if (IPACM_SUCCESS != ret)
-		{
-			IPACMERR("unable to create ipa_driver_wlan thread\n");
-			return ret;
-		}
-		IPACMDBG_H("created ipa_driver_wlan thread\n");
-		if(pthread_setname_np(ipa_driver_thread, "ipa driver ntfy") != 0)
-		{
-			IPACMERR("unable to set thread name\n");
-		}
-	}
-
-	pthread_join(cmd_queue_thread, NULL);
-	pthread_join(netlink_thread, NULL);
-	pthread_join(monitor_thread, NULL);
-	pthread_join(ipa_driver_thread, NULL);
-	return IPACM_SUCCESS;
-}
-
-/*===========================================================================
-		FUNCTION  ipa_is_ipacm_running
-===========================================================================*/
-/*!
-@brief
-  Determine whether there's already an IPACM process running, if so, terminate
-  the current one
-
-@return
-	None
-
-@note
-
-- Dependencies
-		- None
-
-- Side Effects
-		- None
-*/
-/*=========================================================================*/
-
-void ipa_is_ipacm_running(void) {
-
-	int fd;
-	struct flock lock;
-	int retval;
-
-	fd = open(IPACM_PID_FILE, O_RDWR | O_CREAT, 0600);
-	if ( fd <= 0 )
-	{
-		IPACMERR("Failed to open %s, error is %d - %s\n",
-				 IPACM_PID_FILE, errno, strerror(errno));
-		exit(0);
-	}
-
-	/*
-	 * Getting an exclusive Write lock on the file, if it fails,
-	 * it means that another instance of IPACM is running and it
-	 * got the lock before us.
-	 */
-	memset(&lock, 0, sizeof(lock));
-	lock.l_type = F_WRLCK;
-	retval = fcntl(fd, F_SETLK, &lock);
-
-	if (retval != 0)
-	{
-		retval = fcntl(fd, F_GETLK, &lock);
-		if (retval == 0)
-		{
-			IPACMERR("Unable to get lock on file %s (my PID %d), PID %d already has it\n",
-					 IPACM_PID_FILE, getpid(), lock.l_pid);
-			close(fd);
-			exit(0);
-		}
-	}
-	else
-	{
-		IPACMERR("PID %d is IPACM main process\n", getpid());
-	}
-
-	return;
-}
-
-/*===========================================================================
-		FUNCTION  ipa_get_if_index
-===========================================================================*/
-/*!
-@brief
-  get ipa interface index by given the interface name
-
-@return
-	IPACM_SUCCESS or IPA_FALUIRE
-
-@note
-
-- Dependencies
-		- None
-
-- Side Effects
-		- None
-*/
-/*=========================================================================*/
-int ipa_get_if_index
-(
-	 char *if_name,
-	 int *if_index
-	 )
-{
-	int fd;
-	struct ifreq ifr;
-
-	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-	{
-		PERROR("get interface index socket create failed");
-		return IPACM_FAILURE;
-	}
-
-	memset(&ifr, 0, sizeof(struct ifreq));
-
-	(void)strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
-
-	if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0)
-	{
-		IPACMERR("call_ioctl_on_dev: ioctl failed: can't find device %s",if_name);
-		*if_index = -1;
-		close(fd);
-		return IPACM_FAILURE;
-	}
-
-	*if_index = ifr.ifr_ifindex;
-	close(fd);
-	return IPACM_SUCCESS;
-}
diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp
deleted file mode 100644
index b96cebb..0000000
--- a/ipacm/src/IPACM_Neighbor.cpp
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Neighbor.cpp
-
-	@brief
-	This file implements the functionality of handling IPACM Neighbor events.
-
-	@Author
-	Skylar Chang
-
-*/
-
-#include <sys/ioctl.h>
-#include <IPACM_Neighbor.h>
-#include <IPACM_EvtDispatcher.h>
-#include "IPACM_Defs.h"
-#include "IPACM_Log.h"
-
-
-IPACM_Neighbor::IPACM_Neighbor()
-{
-	num_neighbor_client = 0;
-	circular_index = 0;
-	memset(neighbor_client, 0, IPA_MAX_NUM_NEIGHBOR_CLIENTS * sizeof(ipa_neighbor_client));
-	IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT_EX, this);
-	IPACM_EvtDispatcher::registr(IPA_NEW_NEIGH_EVENT, this);
-	IPACM_EvtDispatcher::registr(IPA_DEL_NEIGH_EVENT, this);
-	return;
-}
-
-void IPACM_Neighbor::event_callback(ipa_cm_event_id event, void *param)
-{
-	ipacm_event_data_all *data_all = NULL;
-	int i, ipa_interface_index;
-	ipacm_cmd_q_data evt_data;
-	int num_neighbor_client_temp = num_neighbor_client;
-
-	IPACMDBG("Recieved event %d\n", event);
-
-	switch (event)
-	{
-		case IPA_WLAN_CLIENT_ADD_EVENT_EX:
-		{
-			ipacm_event_data_wlan_ex *data = (ipacm_event_data_wlan_ex *)param;
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("IPA_WLAN_CLIENT_ADD_EVENT_EX: not supported iface id: %d\n", data->if_index);
-				break;
-			}
-			uint8_t client_mac_addr[6] = {0};
-
-			IPACMDBG_H("Received IPA_WLAN_CLIENT_ADD_EVENT\n");
-			for(i = 0; i < data->num_of_attribs; i++)
-			{
-				if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
-				{
-					memcpy(client_mac_addr,
-							data->attribs[i].u.mac_addr,
-							sizeof(client_mac_addr));
-					IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
-							 client_mac_addr[0], client_mac_addr[1], client_mac_addr[2],
-							 client_mac_addr[3], client_mac_addr[4], client_mac_addr[5]);
-				}
-				else
-				{
-					IPACMDBG_H("The attribute type is not expected!\n");
-				}
-			}
-
-			for (i = 0; i < num_neighbor_client_temp; i++)
-			{
-				/* find the client */
-				if (memcmp(neighbor_client[i].mac_addr, client_mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-				{
-					/* check if iface is not bridge interface*/
-					if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0)
-					{
-						/* use previous ipv4 first */
-						if(data->if_index != neighbor_client[i].iface_index)
-						{
-							IPACMERR("update new kernel iface index \n");
-							neighbor_client[i].iface_index = data->if_index;
-						}
-
-						/* check if client associated with previous network interface */
-						if(ipa_interface_index != neighbor_client[i].ipa_if_num)
-						{
-							IPACMERR("client associate to different AP \n");
-							return;
-						}
-
-						if (neighbor_client[i].v4_addr != 0) /* not 0.0.0.0 */
-						{
-							evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-							data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-							if (data_all == NULL)
-							{
-								IPACMERR("Unable to allocate memory\n");
-								return;
-							}
-							data_all->iptype = IPA_IP_v4;
-							data_all->if_index = neighbor_client[i].iface_index;
-							data_all->ipv4_addr = neighbor_client[i].v4_addr; //use previous ipv4 address
-							memcpy(data_all->mac_addr,
-									neighbor_client[i].mac_addr,
-												sizeof(data_all->mac_addr));
-							evt_data.evt_data = (void *)data_all;
-							IPACM_EvtDispatcher::PostEvt(&evt_data);
-							/* ask for replaced iface name*/
-							ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index);
-							/* check for failure return */
-							if (IPACM_FAILURE == ipa_interface_index) {
-								IPACMERR("not supported iface id: %d\n", data_all->if_index);
-							} else {
-								IPACMDBG_H("Posted event %d, with %s for ipv4 client re-connect\n",
-									evt_data.event,
-									IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-							}
-						}
-					}
-					break;
-				}
-			}
-		}
-		break;
-
-		default:
-		{
-			if (event == IPA_NEW_NEIGH_EVENT)
-			{
-				IPACMDBG_H("Received IPA_NEW_NEIGH_EVENT\n");
-			}
-			else
-			{
-				IPACMDBG_H("Received IPA_DEL_NEIGH_EVENT\n");
-			}
-
-			ipacm_event_data_all *data = (ipacm_event_data_all *)param;
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index);
-			/* check for failure return */
-			if (IPACM_FAILURE == ipa_interface_index) {
-				IPACMERR("not supported iface id: %d\n", data->if_index);
-				break;
-			}
-			if (data->iptype == IPA_IP_v4)
-			{
-				if (data->ipv4_addr != 0) /* not 0.0.0.0 */
-				{
-					IPACMDBG("Got Neighbor event with ipv4 address: 0x%x \n", data->ipv4_addr);
-					/* check if ipv4 address is link local(169.254.xxx.xxx) */
-					if ((data->ipv4_addr & IPV4_ADDR_LINKLOCAL_MASK) == IPV4_ADDR_LINKLOCAL)
-					{
-						IPACMDBG_H("This is link local ipv4 address: 0x%x : ignore this NEIGH_EVENT\n", data->ipv4_addr);
-						return;
-					}
-					/* check if iface is bridge interface*/
-					if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0)
-					{
-						/* searh if seen this client or not*/
-						for (i = 0; i < num_neighbor_client_temp; i++)
-						{
-							if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-							{
-								data->if_index = neighbor_client[i].iface_index;
-								neighbor_client[i].v4_addr = data->ipv4_addr; // cache client's previous ipv4 address
-								/* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */
-								if (event == IPA_NEW_NEIGH_EVENT)
-									evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-								else
-									/* not to clean-up the client mac cache on bridge0 delneigh */
-									evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT;
-								data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-								if (data_all == NULL)
-								{
-									IPACMERR("Unable to allocate memory\n");
-									return;
-								}
-								memcpy(data_all, data, sizeof(ipacm_event_data_all));
-								evt_data.evt_data = (void *)data_all;
-								IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-								/* ask for replaced iface name*/
-								ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index);
-								/* check for failure return */
-								if (IPACM_FAILURE == ipa_interface_index) {
-									IPACMERR("not supported iface id: %d\n", data_all->if_index);
-								} else {
-									IPACMDBG_H("Posted event %d,\
-										with %s for ipv4\n",
-										evt_data.event,
-										IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-								}
-								break;
-							}
-						}
-					}
-					else
-					{
-						/* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */
-						if (event == IPA_NEW_NEIGH_EVENT)
-						{
-							evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-							/* Also save to cache for ipv4 */
-							/*searh if seen this client or not*/
-							for (i = 0; i < num_neighbor_client_temp; i++)
-							{
-								/* find the client */
-								if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-								{
-									/* update the network interface client associated */
-									neighbor_client[i].iface_index = data->if_index;
-									neighbor_client[i].ipa_if_num = ipa_interface_index;
-									neighbor_client[i].v4_addr = data->ipv4_addr; // cache client's previous ipv4 address
-									IPACMDBG_H("update cache %d-entry, with %s iface, ipv4 address: 0x%x\n",
-													i,
-													IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,
-													data->ipv4_addr);
-									break;
-								}
-							}
-							/* not find client */
-							if (i == num_neighbor_client_temp)
-							{
-								if (num_neighbor_client_temp < IPA_MAX_NUM_NEIGHBOR_CLIENTS)
-								{
-									memcpy(neighbor_client[num_neighbor_client_temp].mac_addr,
-												data->mac_addr,
-												sizeof(data->mac_addr));
-									neighbor_client[num_neighbor_client_temp].iface_index = data->if_index;
-									/* cache the network interface client associated */
-									neighbor_client[num_neighbor_client_temp].ipa_if_num = ipa_interface_index;
-									neighbor_client[num_neighbor_client_temp].v4_addr = data->ipv4_addr;
-									num_neighbor_client++;
-									IPACMDBG_H("Cache client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n",
-												neighbor_client[num_neighbor_client_temp].mac_addr[0],
-												neighbor_client[num_neighbor_client_temp].mac_addr[1],
-												neighbor_client[num_neighbor_client_temp].mac_addr[2],
-												neighbor_client[num_neighbor_client_temp].mac_addr[3],
-												neighbor_client[num_neighbor_client_temp].mac_addr[4],
-												neighbor_client[num_neighbor_client_temp].mac_addr[5],
-												num_neighbor_client);
-								}
-								else
-								{
-
-									IPACMERR("error:  neighbor client oversize! recycle %d-st entry ! \n", circular_index);
-									memcpy(neighbor_client[circular_index].mac_addr,
-												data->mac_addr,
-												sizeof(data->mac_addr));
-									neighbor_client[circular_index].iface_index = data->if_index;
-									/* cache the network interface client associated */
-									neighbor_client[circular_index].ipa_if_num = ipa_interface_index;
-									neighbor_client[circular_index].v4_addr = 0;
-									IPACMDBG_H("Copy wlan-iface client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d, circular %d\n",
-													neighbor_client[circular_index].mac_addr[0],
-													neighbor_client[circular_index].mac_addr[1],
-													neighbor_client[circular_index].mac_addr[2],
-													neighbor_client[circular_index].mac_addr[3],
-													neighbor_client[circular_index].mac_addr[4],
-													neighbor_client[circular_index].mac_addr[5],
-													num_neighbor_client,
-													circular_index);
-									circular_index++;
-								}
-							}
-						}
-						else
-						{
-							evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT;
-							/*searh if seen this client or not*/
-							for (i = 0; i < num_neighbor_client_temp; i++)
-							{
-								/* find the client */
-								if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-								{
-									IPACMDBG_H("Clean %d-st Cached client-MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n",
-												i,
-												neighbor_client[i].mac_addr[0],
-												neighbor_client[i].mac_addr[1],
-												neighbor_client[i].mac_addr[2],
-												neighbor_client[i].mac_addr[3],
-												neighbor_client[i].mac_addr[4],
-												neighbor_client[i].mac_addr[5],
-												num_neighbor_client);
-
-									memset(neighbor_client[i].mac_addr, 0, sizeof(neighbor_client[i].mac_addr));
-									neighbor_client[i].iface_index = 0;
-									neighbor_client[i].v4_addr = 0;
-									neighbor_client[i].ipa_if_num = 0;
-									for (; i < num_neighbor_client_temp - 1; i++)
-									{
-										memcpy(neighbor_client[i].mac_addr,
-													neighbor_client[i+1].mac_addr,
-													sizeof(neighbor_client[i].mac_addr));
-										neighbor_client[i].iface_index = neighbor_client[i+1].iface_index;
-										neighbor_client[i].v4_addr = neighbor_client[i+1].v4_addr;
-										neighbor_client[i].ipa_if_num = neighbor_client[i+1].ipa_if_num;
-									}
-									num_neighbor_client--;
-									IPACMDBG_H(" total number of left cased clients: %d\n", num_neighbor_client);
-									break;
-								}
-							}
-							/* not find client, no need clean-up */
-						}
-
-						data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-						if (data_all == NULL)
-						{
-							IPACMERR("Unable to allocate memory\n");
-							return;
-						}
-						memcpy(data_all, data, sizeof(ipacm_event_data_all));
-						evt_data.evt_data = (void *)data_all;
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-						IPACMDBG_H("Posted event %d with %s for ipv4\n",
-									evt_data.event,
-									IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					}
-				}
-			}
-			else
-			{   //ipv6 starts
-
-				if ((data->ipv6_addr[0]) || (data->ipv6_addr[1]) || (data->ipv6_addr[2]) || (data->ipv6_addr[3]))
-				{
-					IPACMDBG("Got New_Neighbor event with ipv6 address \n");
-					/* check if iface is bridge interface*/
-					if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0)
-					{
-						/* searh if seen this client or not*/
-						for (i = 0; i < num_neighbor_client_temp; i++)
-						{
-							if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-							{
-								data->if_index = neighbor_client[i].iface_index;
-								/* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */
-								if (event == IPA_NEW_NEIGH_EVENT) evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-								else evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT;
-								data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-								if (data_all == NULL)
-								{
-									IPACMERR("Unable to allocate memory\n");
-									return;
-								}
-								memcpy(data_all, data, sizeof(ipacm_event_data_all));
-								evt_data.evt_data = (void *)data_all;
-								IPACM_EvtDispatcher::PostEvt(&evt_data);
-								/* ask for replaced iface name*/
-								ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index);
-								/* check for failure return */
-								if (IPACM_FAILURE == ipa_interface_index) {
-									IPACMERR("not supported iface id: %d\n", data_all->if_index);
-								} else {
-									IPACMDBG_H("Posted event %d,\
-										with %s for ipv6\n",
-										evt_data.event,
-										IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-								}
-								break;
-							};
-						}
-					}
-					else
-					{
-						/* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */
-						if (event == IPA_NEW_NEIGH_EVENT)
-							evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-						else
-							evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT;
-						data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-						if (data_all == NULL)
-						{
-							IPACMERR("Unable to allocate memory\n");
-							return;
-						}
-						memcpy(data_all, data, sizeof(ipacm_event_data_all));
-						evt_data.evt_data = (void *)data_all;
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-						IPACMDBG_H("Posted event %d with %s for ipv6\n",
-										evt_data.event,
-										IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					}
-				}
-				else
-				{
-					IPACMDBG(" Got Neighbor event with no ipv6/ipv4 address \n");
-					/*no ipv6 in data searh if seen this client or not*/
-					for (i = 0; i < num_neighbor_client_temp; i++)
-					{
-						/* find the client */
-						if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0)
-						{
-							IPACMDBG_H(" find %d-st client, MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n",
-												i,
-												neighbor_client[i].mac_addr[0],
-												neighbor_client[i].mac_addr[1],
-												neighbor_client[i].mac_addr[2],
-												neighbor_client[i].mac_addr[3],
-												neighbor_client[i].mac_addr[4],
-												neighbor_client[i].mac_addr[5],
-												num_neighbor_client);
-							/* check if iface is not bridge interface*/
-							if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0)
-							{
-								/* use previous ipv4 first */
-								if(data->if_index != neighbor_client[i].iface_index)
-								{
-									IPACMDBG_H("update new kernel iface index \n");
-									neighbor_client[i].iface_index = data->if_index;
-								}
-
-								/* check if client associated with previous network interface */
-								if(ipa_interface_index != neighbor_client[i].ipa_if_num)
-								{
-									IPACMDBG_H("client associate to different AP \n");
-								}
-
-								if (neighbor_client[i].v4_addr != 0) /* not 0.0.0.0 */
-								{
-									/* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */
-									if (event == IPA_NEW_NEIGH_EVENT)
-										evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT;
-									else
-										evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT;
-									data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-									if (data_all == NULL)
-									{
-										IPACMERR("Unable to allocate memory\n");
-										return;
-									}
-									data_all->iptype = IPA_IP_v4;
-									data_all->if_index = neighbor_client[i].iface_index;
-									data_all->ipv4_addr = neighbor_client[i].v4_addr; //use previous ipv4 address
-									memcpy(data_all->mac_addr,
-											neighbor_client[i].mac_addr,
-														sizeof(data_all->mac_addr));
-									evt_data.evt_data = (void *)data_all;
-									IPACM_EvtDispatcher::PostEvt(&evt_data);
-									/* ask for replaced iface name*/
-									ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index);
-									/* check for failure return */
-									if (IPACM_FAILURE == ipa_interface_index) {
-										IPACMERR("not supported iface id: %d\n", data_all->if_index);
-									} else {
-										IPACMDBG_H("Posted event %d,\
-											with %s for ipv4 client re-connect\n",
-											evt_data.event,
-											IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-									}
-								}
-							}
-							/* delete cache neighbor entry */
-							if (event == IPA_DEL_NEIGH_EVENT)
-							{
-								IPACMDBG_H("Clean %d-st Cached client-MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n",
-										i,
-										neighbor_client[i].mac_addr[0],
-										neighbor_client[i].mac_addr[1],
-										neighbor_client[i].mac_addr[2],
-										neighbor_client[i].mac_addr[3],
-										neighbor_client[i].mac_addr[4],
-										neighbor_client[i].mac_addr[5],
-										num_neighbor_client);
-
-								memset(neighbor_client[i].mac_addr, 0, sizeof(neighbor_client[i].mac_addr));
-								neighbor_client[i].iface_index = 0;
-								neighbor_client[i].v4_addr = 0;
-								neighbor_client[i].ipa_if_num = 0;
-								for (; i < num_neighbor_client_temp - 1; i++)
-								{
-									memcpy(neighbor_client[i].mac_addr,
-												neighbor_client[i+1].mac_addr,
-												sizeof(neighbor_client[i].mac_addr));
-									neighbor_client[i].iface_index = neighbor_client[i+1].iface_index;
-									neighbor_client[i].v4_addr = neighbor_client[i+1].v4_addr;
-									neighbor_client[i].ipa_if_num = neighbor_client[i+1].ipa_if_num;
-								}
-								num_neighbor_client--;
-								IPACMDBG_H(" total number of left cased clients: %d\n", num_neighbor_client);
-							}
-							break;
-						}
-					}
-					/* not find client */
-					if ((i == num_neighbor_client_temp) && (event == IPA_NEW_NEIGH_EVENT))
-					{
-						/* check if iface is not bridge interface*/
-						if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0)
-						{
-							if (num_neighbor_client_temp < IPA_MAX_NUM_NEIGHBOR_CLIENTS)
-							{
-								memcpy(neighbor_client[num_neighbor_client_temp].mac_addr,
-											data->mac_addr,
-											sizeof(data->mac_addr));
-								neighbor_client[num_neighbor_client_temp].iface_index = data->if_index;
-								/* cache the network interface client associated */
-								neighbor_client[num_neighbor_client_temp].ipa_if_num = ipa_interface_index;
-								neighbor_client[num_neighbor_client_temp].v4_addr = 0;
-								num_neighbor_client++;
-								IPACMDBG_H("Copy client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n",
-												neighbor_client[num_neighbor_client_temp].mac_addr[0],
-												neighbor_client[num_neighbor_client_temp].mac_addr[1],
-												neighbor_client[num_neighbor_client_temp].mac_addr[2],
-												neighbor_client[num_neighbor_client_temp].mac_addr[3],
-												neighbor_client[num_neighbor_client_temp].mac_addr[4],
-												neighbor_client[num_neighbor_client_temp].mac_addr[5],
-												num_neighbor_client);
-								return;
-							}
-							else
-							{
-								IPACMERR("error:  neighbor client oversize! recycle %d-st entry ! \n", circular_index);
-								memcpy(neighbor_client[circular_index].mac_addr,
-											data->mac_addr,
-											sizeof(data->mac_addr));
-								neighbor_client[circular_index].iface_index = data->if_index;
-								/* cache the network interface client associated */
-								neighbor_client[circular_index].ipa_if_num = ipa_interface_index;
-								neighbor_client[circular_index].v4_addr = 0;
-								IPACMDBG_H("Copy wlan-iface client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d, circular %d\n",
-												neighbor_client[circular_index].mac_addr[0],
-												neighbor_client[circular_index].mac_addr[1],
-												neighbor_client[circular_index].mac_addr[2],
-												neighbor_client[circular_index].mac_addr[3],
-												neighbor_client[circular_index].mac_addr[4],
-												neighbor_client[circular_index].mac_addr[5],
-												num_neighbor_client,
-												circular_index);
-								circular_index++;
-								return;
-							}
-						}
-					}
-				}
-			} //ipv6 ends
-		}
-		break;
-	}
-	return;
-}
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
deleted file mode 100644
index 30295b1..0000000
--- a/ipacm/src/IPACM_Netlink.cpp
+++ /dev/null
@@ -1,1773 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the following
-  disclaimer in the documentation and/or other materials provided
-  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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Netlink.cpp
-
-	@brief
-	This file implements the IPAM Netlink Socket Parer functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include <string.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <netinet/in.h>
-#include "IPACM_CmdQueue.h"
-#include "IPACM_Defs.h"
-#include "IPACM_Netlink.h"
-#include "IPACM_EvtDispatcher.h"
-#include "IPACM_Log.h"
-
-int ipa_get_if_name(char *if_name, int if_index);
-int find_mask(int ip_v4_last, int *mask_value);
-
-#ifdef FEATURE_IPA_ANDROID
-
-#define IPACM_NL_COPY_ADDR( event_info, element )                                        \
-        memcpy( &event_info->attr_info.element.__data,                                   \
-                RTA_DATA(rtah),                                                          \
-                sizeof(event_info->attr_info.element.__data) );
-
-#define IPACM_EVENT_COPY_ADDR_v6( event_data, element)                                   \
-        memcpy( event_data, element.__data, sizeof(event_data));
-
-#define IPACM_EVENT_COPY_ADDR_v4( event_data, element)                                   \
-        memcpy( &event_data, element.__data, sizeof(event_data));
-
-#define IPACM_NL_REPORT_ADDR( prefix, addr )                                             \
-        if( AF_INET6 == (addr).ss_family ) {                                             \
-          IPACM_LOG_IPV6_ADDR( prefix, addr.__data);                                    \
-        } else {                                                                         \
-          IPACM_LOG_IPV4_ADDR( prefix, (*(unsigned int*)&(addr).__data) );               \
-        }
-
-#else/* defined(FEATURE_IPA_ANDROID) */
-
-#define IPACM_NL_COPY_ADDR( event_info, element )                                        \
-        memcpy( &event_info->attr_info.element.__ss_padding,                             \
-                RTA_DATA(rtah),                                                          \
-                sizeof(event_info->attr_info.element.__ss_padding) );
-
-#define IPACM_EVENT_COPY_ADDR_v6( event_data, element)                                   \
-        memcpy( event_data, element.__ss_padding, sizeof(event_data));
-
-#define IPACM_EVENT_COPY_ADDR_v4( event_data, element)                                   \
-        memcpy( &event_data, element.__ss_padding, sizeof(event_data));
-
-#define IPACM_NL_REPORT_ADDR( prefix, addr )                                             \
-        if( AF_INET6 == (addr).ss_family ) {                                             \
-          IPACM_LOG_IPV6_ADDR( prefix, addr.__ss_padding);                               \
-        } else {                                                                         \
-          IPACM_LOG_IPV4_ADDR( prefix, (*(unsigned int*)&(addr).__ss_padding) );         \
-        }
-#endif /* defined(FEATURE_IPA_ANDROID)*/
-
-#define NDA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
-#define IPACM_LOG_IPV6_ADDR(prefix, ip_addr)                            \
-        IPACMDBG_H(prefix);                                               \
-		IPACMDBG_H(" IPV6 Address %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", \
-                  (int)ip_addr[0],  (int)ip_addr[1],                                                        \
-                  (int)ip_addr[2],  (int)ip_addr[3],                                                        \
-                  (int)ip_addr[4],  (int)ip_addr[5],                                                        \
-                  (int)ip_addr[6],  (int)ip_addr[7],                                                        \
-                  (int)ip_addr[8],  (int)ip_addr[9],                                                        \
-                  (int)ip_addr[10], (int)ip_addr[11],                                                       \
-                  (int)ip_addr[12], (int)ip_addr[13],                                                       \
-                  (int)ip_addr[14], (int)ip_addr[15]);
-
-#define IPACM_LOG_IPV4_ADDR(prefix, ip_addr)                            \
-        IPACMDBG_H(prefix);                                               \
-        IPACMDBG_H(" IPV4 Address %d.%d.%d.%d\n",                         \
-                    (unsigned char)(ip_addr),                               \
-                    (unsigned char)(ip_addr >> 8),                          \
-                    (unsigned char)(ip_addr >> 16) ,                        \
-                    (unsigned char)(ip_addr >> 24));
-
-/* Opens a netlink socket*/
-static int ipa_nl_open_socket
-(
-	 ipa_nl_sk_info_t *sk_info,
-	 int protocol,
-	 unsigned int grps
-	 )
-{
-	int *p_sk_fd;
-	int buf_size = 6669999, sendbuff=0, res;
-	struct sockaddr_nl *p_sk_addr_loc;
-	socklen_t optlen;
-
-	p_sk_fd = &(sk_info->sk_fd);
-	p_sk_addr_loc = &(sk_info->sk_addr_loc);
-
-	/* Open netlink socket for specified protocol */
-	if((*p_sk_fd = socket(AF_NETLINK, SOCK_RAW, protocol)) < 0)
-	{
-		IPACMERR("cannot open netlink socket\n");
-		return IPACM_FAILURE;
-	}
-
-	optlen = sizeof(sendbuff);
-	res = getsockopt(*p_sk_fd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);
-
-	if(res == -1) {
-		IPACMDBG("Error getsockopt one");
-	} else {
-		IPACMDBG("orignal send buffer size = %d\n", sendbuff);
-	}
-	IPACMDBG("sets the send buffer to %d\n", buf_size);
-	if (setsockopt(*p_sk_fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(int)) == -1) {
-    IPACMERR("Error setting socket opts\n");
-	}
-
-	/* Initialize socket addresses to null */
-	memset(p_sk_addr_loc, 0, sizeof(struct sockaddr_nl));
-
-	/* Populate local socket address using specified groups */
-	p_sk_addr_loc->nl_family = AF_NETLINK;
-	p_sk_addr_loc->nl_pid = getpid();
-	p_sk_addr_loc->nl_groups = grps;
-
-	/* Bind socket to the local address, i.e. specified groups. This ensures
-	 that multicast messages for these groups are delivered over this
-	 socket. */
-
-	if(bind(*p_sk_fd,
-					(struct sockaddr *)p_sk_addr_loc,
-					sizeof(struct sockaddr_nl)) < 0)
-	{
-		IPACMERR("Socket bind failed\n");
-		return IPACM_FAILURE;
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* Add fd to fdmap array and store read handler function ptr (up to MAX_NUM_OF_FD).*/
-static int ipa_nl_addfd_map
-(
-	 ipa_nl_sk_fd_set_info_t *info,
-	 int fd,
-	 ipa_sock_thrd_fd_read_f read_f
-	 )
-{
-	if(info->num_fd < MAX_NUM_OF_FD)
-	{
-		FD_SET(fd, &info->fdset);
-
-		/* Add fd to fdmap array and store read handler function ptr */
-		info->sk_fds[info->num_fd].sk_fd = fd;
-		info->sk_fds[info->num_fd].read_func = read_f;
-
-		/* Increment number of fds stored in fdmap */
-		info->num_fd++;
-		if(info->max_fd < fd)
-			info->max_fd = fd;
-	}
-	else
-	{
-		return IPACM_FAILURE;
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*  start socket listener */
-static int ipa_nl_sock_listener_start
-(
-	 ipa_nl_sk_fd_set_info_t *sk_fd_set
-	 )
-{
-	int i, ret;
-
-	while(true)
-	{
-	    for(i = 0; i < sk_fd_set->num_fd; i++ )
-		{
-			FD_SET(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset));
-		}
-
-		if((ret = select(sk_fd_set->max_fd + 1, &(sk_fd_set->fdset), NULL, NULL, NULL)) < 0)
-		{
-			IPACMERR("ipa_nl select failed\n");
-		}
-		else
-		{
-			for(i = 0; i < sk_fd_set->num_fd; i++)
-			{
-
-				if(FD_ISSET(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset)))
-				{
-
-					if(sk_fd_set->sk_fds[i].read_func)
-					{
-						if(IPACM_SUCCESS != ((sk_fd_set->sk_fds[i].read_func)(sk_fd_set->sk_fds[i].sk_fd)))
-						{
-							IPACMERR("Error on read callback[%d] fd=%d\n",
-											 i,
-											 sk_fd_set->sk_fds[i].sk_fd);
-						}
-						FD_CLR(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset));
-					}
-					else
-					{
-						IPACMERR("No read function\n");
-					}
-				}
-
-			} /* end of for loop*/
-		} /* end of else */
-	} /* end of while */
-
-	return IPACM_SUCCESS;
-}
-
-/* allocate memory for ipa_nl__msg */
-static struct msghdr* ipa_nl_alloc_msg
-(
-	 uint32_t msglen
-	 )
-{
-	unsigned char *buf = NULL;
-	struct sockaddr_nl *nladdr = NULL;
-	struct iovec *iov = NULL;
-	struct msghdr *msgh = NULL;
-
-	if(IPA_NL_MSG_MAX_LEN < msglen)
-	{
-		IPACMERR("Netlink message exceeds maximum length\n");
-		return NULL;
-	}
-
-	msgh = (struct msghdr *)malloc(sizeof(struct msghdr));
-	if(msgh == NULL)
-	{
-		IPACMERR("Failed malloc for msghdr\n");
-		return NULL;
-	}
-
-	nladdr = (struct sockaddr_nl *)malloc(sizeof(struct sockaddr_nl));
-	if(nladdr == NULL)
-	{
-		IPACMERR("Failed malloc for sockaddr\n");
-		free(msgh);
-		return NULL;
-	}
-
-	iov = (struct iovec *)malloc(sizeof(struct iovec));
-	if(iov == NULL)
-	{
-		PERROR("Failed malloc for iovec");
-		free(nladdr);
-		free(msgh);
-		return NULL;
-	}
-
-	buf = (unsigned char *)malloc(msglen);
-	if(buf == NULL)
-	{
-		IPACMERR("Failed malloc for mglen\n");
-		free(iov);
-		free(nladdr);
-		free(msgh);
-		return NULL;
-	}
-
-	memset(nladdr, 0, sizeof(struct sockaddr_nl));
-	nladdr->nl_family = AF_NETLINK;
-
-	memset(msgh, 0x0, sizeof(struct msghdr));
-	msgh->msg_name = nladdr;
-	msgh->msg_namelen = sizeof(struct sockaddr_nl);
-	msgh->msg_iov = iov;
-	msgh->msg_iovlen = 1;
-
-	memset(iov, 0x0, sizeof(struct iovec));
-	iov->iov_base = buf;
-	iov->iov_len = msglen;
-
-	return msgh;
-}
-
-/* release IPA message */
-static void ipa_nl_release_msg
-(
-	 struct msghdr *msgh
-	 )
-{
-	unsigned char *buf = NULL;
-	struct sockaddr_nl *nladdr = NULL;
-	struct iovec *iov = NULL;
-
-	if(NULL == msgh)
-	{
-		return;
-	}
-
-	nladdr = (struct sockaddr_nl *)msgh->msg_name;
-	iov = msgh->msg_iov;
-	if(msgh->msg_iov)
-	{
-		buf = (unsigned char *)msgh->msg_iov->iov_base;
-	}
-
-	if(buf)
-	{
-	free(buf);
-	}
-	if(iov)
-	{
-	free(iov);
-	}
-	if(nladdr)
-	{
-	free(nladdr);
-	}
-	if(msgh)
-	{
-	free(msgh);
-	}
-	return;
-}
-
-/* receive and process nl message */
-static int ipa_nl_recv
-(
-	 int              fd,
-	 struct msghdr **msg_pptr,
-	 unsigned int  *msglen_ptr
-	 )
-{
-	struct msghdr *msgh = NULL;
-	int rmsgl;
-
-	msgh = ipa_nl_alloc_msg(IPA_NL_MSG_MAX_LEN);
-	if(NULL == msgh)
-	{
-		IPACMERR("Failed to allocate NL message\n");
-		goto error;
-	}
-
-
-	/* Receive message over the socket */
-	rmsgl = recvmsg(fd, msgh, 0);
-
-	/* Verify that something was read */
-	if(rmsgl <= 0)
-	{
-		PERROR("NL recv error");
-		goto error;
-	}
-
-	/* Verify that NL address length in the received message is expected value */
-	if(sizeof(struct sockaddr_nl) != msgh->msg_namelen)
-	{
-		IPACMERR("rcvd msg with namelen != sizeof sockaddr_nl\n");
-		goto error;
-	}
-
-	/* Verify that message was not truncated. This should not occur */
-	if(msgh->msg_flags & MSG_TRUNC)
-	{
-		IPACMERR("Rcvd msg truncated!\n");
-		goto error;
-	}
-
-	*msg_pptr    = msgh;
-	*msglen_ptr = rmsgl;
-
-	return IPACM_SUCCESS;
-
-/* An error occurred while receiving the message. Free all memory before
-				 returning. */
-error:
-	ipa_nl_release_msg(msgh);
-	*msg_pptr    = NULL;
-	*msglen_ptr  = 0;
-
-	return IPACM_FAILURE;
-}
-
-/* decode the rtm netlink message */
-static int ipa_nl_decode_rtm_link
-(
-	 const char              *buffer,
-	 unsigned int             buflen,
-	 ipa_nl_link_info_t      *link_info
-)
-{
-	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);
-
-	return IPACM_SUCCESS;
-}
-
-/* Decode kernel address message parameters from Netlink attribute TLVs. */
-static int ipa_nl_decode_rtm_addr
-(
-	 const char              *buffer,
-	 unsigned int             buflen,
-	 ipa_nl_addr_info_t   *addr_info
-	 )
-{
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
-	struct rtattr *rtah = NULL;
-
-	/* Extract the header data */
-	addr_info->metainfo = *((struct ifaddrmsg *)NLMSG_DATA(nlh));
-	buflen -= sizeof(struct nlmsghdr);
-
-	/* Extract the available attributes */
-	addr_info->attr_info.param_mask = IPA_NLA_PARAM_NONE;
-
-	rtah = IFA_RTA(NLMSG_DATA(nlh));
-
-	while(RTA_OK(rtah, buflen))
-	{
-		switch(rtah->rta_type)
-		{
-
-		case IFA_ADDRESS:
-			addr_info->attr_info.prefix_addr.ss_family = addr_info->metainfo.ifa_family;
-			IPACM_NL_COPY_ADDR( addr_info, prefix_addr );
-			addr_info->attr_info.param_mask |= IPA_NLA_PARAM_PREFIXADDR;
-			break;
-		default:
-			break;
-
-		}
-		/* Advance to next attribute */
-		rtah = RTA_NEXT(rtah, buflen);
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* Decode kernel neighbor message parameters from Netlink attribute TLVs. */
-static int ipa_nl_decode_rtm_neigh
-(
-	 const char              *buffer,
-	 unsigned int             buflen,
-	 ipa_nl_neigh_info_t   *neigh_info
-	 )
-{
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
-	struct rtattr *rtah = NULL;
-
-	/* Extract the header data */
-	neigh_info->metainfo = *((struct ndmsg *)NLMSG_DATA(nlh));
-	buflen -= sizeof(struct nlmsghdr);
-
-	/* Extract the available attributes */
-	neigh_info->attr_info.param_mask = IPA_NLA_PARAM_NONE;
-
-	rtah = NDA_RTA(NLMSG_DATA(nlh));
-
-	while(RTA_OK(rtah, buflen))
-	{
-		switch(rtah->rta_type)
-		{
-
-		case NDA_DST:
-			neigh_info->attr_info.local_addr.ss_family = neigh_info->metainfo.ndm_family;
-			IPACM_NL_COPY_ADDR( neigh_info, local_addr );
-			break;
-
-		case NDA_LLADDR:
-			memcpy(neigh_info->attr_info.lladdr_hwaddr.sa_data,
-						 RTA_DATA(rtah),
-						 sizeof(neigh_info->attr_info.lladdr_hwaddr.sa_data));
-			break;
-
-		default:
-			break;
-
-		}
-
-		/* Advance to next attribute */
-		rtah = RTA_NEXT(rtah, buflen);
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* Decode kernel route message parameters from Netlink attribute TLVs. */
-static int ipa_nl_decode_rtm_route
-(
-	 const char              *buffer,
-	 unsigned int             buflen,
-	 ipa_nl_route_info_t   *route_info
-	 )
-{
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
-	struct rtattr *rtah = NULL;
-
-	/* Extract the header data */
-	route_info->metainfo = *((struct rtmsg *)NLMSG_DATA(nlh));
-	buflen -= sizeof(struct nlmsghdr);
-
-	route_info->attr_info.param_mask = IPA_RTA_PARAM_NONE;
-	rtah = RTM_RTA(NLMSG_DATA(nlh));
-
-	while(RTA_OK(rtah, buflen))
-	{
-		switch(rtah->rta_type)
-		{
-
-		case RTA_DST:
-				route_info->attr_info.dst_addr.ss_family = route_info->metainfo.rtm_family;
-				IPACM_NL_COPY_ADDR( route_info, dst_addr );
-				route_info->attr_info.param_mask |= IPA_RTA_PARAM_DST;
-			break;
-
-		case RTA_SRC:
-			route_info->attr_info.src_addr.ss_family = route_info->metainfo.rtm_family;
-			IPACM_NL_COPY_ADDR( route_info, src_addr );
-			route_info->attr_info.param_mask |= IPA_RTA_PARAM_SRC;
-			break;
-
-		case RTA_GATEWAY:
-			route_info->attr_info.gateway_addr.ss_family = route_info->metainfo.rtm_family;
-			IPACM_NL_COPY_ADDR( route_info, gateway_addr );
-			route_info->attr_info.param_mask |= IPA_RTA_PARAM_GATEWAY;
-			break;
-
-		case RTA_IIF:
-			memcpy(&route_info->attr_info.iif_index,
-						 RTA_DATA(rtah),
-						 sizeof(route_info->attr_info.iif_index));
-			route_info->attr_info.param_mask |= IPA_RTA_PARAM_IIF;
-			break;
-
-		case RTA_OIF:
-			memcpy(&route_info->attr_info.oif_index,
-						 RTA_DATA(rtah),
-						 sizeof(route_info->attr_info.oif_index));
-			route_info->attr_info.param_mask |= IPA_RTA_PARAM_OIF;
-			break;
-
-		case RTA_PRIORITY:
-			memcpy(&route_info->attr_info.priority,
-						 RTA_DATA(rtah),
-						 sizeof(route_info->attr_info.priority));
-			route_info->attr_info.param_mask |= IPA_RTA_PARAM_PRIORITY;
-			break;
-
-		default:
-			break;
-
-		}
-
-		/* Advance to next attribute */
-		rtah = RTA_NEXT(rtah, buflen);
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* decode the ipa nl-message */
-static int ipa_nl_decode_nlmsg
-(
-	 const char   *buffer,
-	 unsigned int  buflen,
-	 ipa_nl_msg_t  *msg_ptr
-	 )
-{
-	char dev_name[IF_NAME_LEN]={0};
-	int ret_val, mask_value, mask_index, mask_value_v6;
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;
-
-	uint32_t if_ipv4_addr =0, if_ipipv4_addr_mask =0, temp =0, if_ipv4_addr_gw =0;
-
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_data_all *data_all;
-	ipacm_event_data_fid *data_fid;
-	ipacm_event_data_addr *data_addr;
-
-
-	while(NLMSG_OK(nlh, buflen))
-	{
-		memset(dev_name,0,IF_NAME_LEN);
-		IPACMDBG("Received msg:%d from netlink\n", nlh->nlmsg_type)
-		switch(nlh->nlmsg_type)
-		{
-		case RTM_NEWLINK:
-			msg_ptr->type = nlh->nlmsg_type;
-			msg_ptr->link_event = true;
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_link(buffer, buflen, &(msg_ptr->nl_link_info)))
-			{
-				IPACMERR("Failed to decode rtm link message\n");
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACMDBG("Got RTM_NEWLINK with below values\n");
-				IPACMDBG("RTM_NEWLINK, ifi_change:%d\n", msg_ptr->nl_link_info.metainfo.ifi_change);
-				IPACMDBG("RTM_NEWLINK, ifi_flags:%d\n", msg_ptr->nl_link_info.metainfo.ifi_flags);
-				IPACMDBG("RTM_NEWLINK, ifi_index:%d\n", msg_ptr->nl_link_info.metainfo.ifi_index);
-				IPACMDBG("RTM_NEWLINK, family:%d\n", msg_ptr->nl_link_info.metainfo.ifi_family);
-				/* RTM_NEWLINK event with AF_BRIDGE family should be ignored in Android
-				   but this should be processed in case of MDM for Ehernet interface.
-				*/
-#ifdef FEATURE_IPA_ANDROID
-				if (msg_ptr->nl_link_info.metainfo.ifi_family == AF_BRIDGE)
-				{
-					IPACMERR(" ignore this RTM_NEWLINK msg \n");
-					return IPACM_SUCCESS;
-				}
-#endif
-				if(IFF_UP & msg_ptr->nl_link_info.metainfo.ifi_change)
-				{
-					IPACMDBG("GOT useful newlink event\n");
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-
-					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_H("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
-						/* post link up to command queue */
-						evt_data.event = IPA_LINK_UP_EVENT;
-						IPACMDBG_H("Posting IPA_LINK_UP_EVENT with if index: %d\n",
-										 msg_ptr->nl_link_info.metainfo.ifi_index);
-					}
-					else
-					{
-						IPACMDBG_H("Interface %s bring down with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
-						/* post link down to command queue */
-						evt_data.event = IPA_LINK_DOWN_EVENT;
-						IPACMDBG_H("Posting IPA_LINK_DOWN_EVENT with if index: %d\n",
-										 data_fid->if_index);
-					}
-					evt_data.evt_data = data_fid;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-				}
-
-				/* Add IPACM support for ECM plug-in/plug_out */
-				/*--------------------------------------------------------------------------
-                                   Check if the interface is running.If its a RTM_NEWLINK and the interface
-                                    is running then it means that its a link up event
-                                ---------------------------------------------------------------------------*/
-                                if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) &&
-                                   (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
-                                {
-
-					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;
-
-				        ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-					IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-
-                                        /*--------------------------------------------------------------------------
-                                           Post LAN iface (ECM) link up event
-                                         ---------------------------------------------------------------------------*/
-                                        evt_data.event = IPA_USB_LINK_UP_EVENT;
-					evt_data.evt_data = data_fid;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n",
-										 data_fid->if_index);
-                                }
-                                else if(!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
-                                {
-					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;
-
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-					IPACMDBG_H("Got a usb link_down event (Interface %s) \n", dev_name);
-
-					/*--------------------------------------------------------------------------
-						Post LAN iface (ECM) link down event
-					---------------------------------------------------------------------------*/
-					evt_data.event = IPA_LINK_DOWN_EVENT;
-					evt_data.evt_data = data_fid;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					IPACMDBG_H("Posting usb IPA_LINK_DOWN_EVENT with if index: %d\n",
-										 data_fid->if_index);
-                                }
-			}
-			break;
-
-		case RTM_DELLINK:
-			IPACMDBG("\n GOT dellink event\n");
-			msg_ptr->type = nlh->nlmsg_type;
-			msg_ptr->link_event = true;
-			IPACMDBG("entering rtm decode\n");
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_link(buffer, buflen, &(msg_ptr->nl_link_info)))
-			{
-				IPACMERR("Failed to decode rtm link message\n");
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACMDBG("Got RTM_DELLINK with below values\n");
-				IPACMDBG("RTM_DELLINK, ifi_change:%d\n", msg_ptr->nl_link_info.metainfo.ifi_change);
-				IPACMDBG("RTM_DELLINK, ifi_flags:%d\n", msg_ptr->nl_link_info.metainfo.ifi_flags);
-				IPACMDBG("RTM_DELLINK, ifi_index:%d\n", msg_ptr->nl_link_info.metainfo.ifi_index);
-				IPACMDBG("RTM_DELLINK, family:%d\n", msg_ptr->nl_link_info.metainfo.ifi_family);
-				/* RTM_NEWLINK event with AF_BRIDGE family should be ignored in Android
-				   but this should be processed in case of MDM for Ehernet interface.
-				*/
-#ifdef FEATURE_IPA_ANDROID
-				if (msg_ptr->nl_link_info.metainfo.ifi_family == AF_BRIDGE)
-				{
-					IPACMERR(" ignore this RTM_DELLINK msg \n");
-					return IPACM_SUCCESS;
-				}
-#endif
-				ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-				if(ret_val != IPACM_SUCCESS)
-				{
-					IPACMERR("Error while getting interface name\n");
-					return IPACM_FAILURE;
-				}
-				IPACMDBG("Interface %s bring down \n", dev_name);
-
-				/* post link down to command queue */
-				evt_data.event = IPA_LINK_DOWN_EVENT;
-				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;
-
-				IPACMDBG_H("posting IPA_LINK_DOWN_EVENT with if idnex:%d\n",
-								 data_fid->if_index);
-				evt_data.evt_data = data_fid;
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-				/* finish command queue */
-			}
-			break;
-
-		case RTM_NEWADDR:
-			IPACMDBG("\n GOT RTM_NEWADDR event\n");
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_addr(buffer, buflen, &(msg_ptr->nl_addr_info)))
-			{
-				IPACMERR("Failed to decode rtm addr message\n");
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_addr_info.metainfo.ifa_index);
-				if(ret_val != IPACM_SUCCESS)
-				{
-					IPACMERR("Error while getting interface name\n");
-				}
-				IPACMDBG("Interface %s \n", dev_name);
-
-				data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-				if(data_addr == NULL)
-				{
-					IPACMERR("unable to allocate memory for event data_addr\n");
-					return IPACM_FAILURE;
-				}
-
-				if(AF_INET6 == msg_ptr->nl_addr_info.attr_info.prefix_addr.ss_family)
-				{
-					data_addr->iptype = IPA_IP_v6;
-					IPACM_NL_REPORT_ADDR( "IFA_ADDRESS:", msg_ptr->nl_addr_info.attr_info.prefix_addr );
-					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_addr_info.attr_info.prefix_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
-				{
-					data_addr->iptype = IPA_IP_v4;
-					IPACM_NL_REPORT_ADDR( "IFA_ADDRESS:", msg_ptr->nl_addr_info.attr_info.prefix_addr );
-					IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_addr_info.attr_info.prefix_addr);
-					data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr);
-
-				}
-
-				evt_data.event = IPA_ADDR_ADD_EVENT;
-				data_addr->if_index = msg_ptr->nl_addr_info.metainfo.ifa_index;
-				if(AF_INET6 == msg_ptr->nl_addr_info.attr_info.prefix_addr.ss_family)
-				{
-				    IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv6 addr:0x%x:%x:%x:%x\n",
-								 data_addr->if_index,
-								 data_addr->ipv6_addr[0],
-								 data_addr->ipv6_addr[1],
-								 data_addr->ipv6_addr[2],
-								 data_addr->ipv6_addr[3]);
-                }
-				else
-				{
-				IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv4 addr:0x%x\n",
-								 data_addr->if_index,
-								 data_addr->ipv4_addr);
-				}
-				evt_data.evt_data = data_addr;
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-			}
-			break;
-
-		case RTM_NEWROUTE:
-
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info)))
-			{
-				IPACMERR("Failed to decode rtm route message\n");
-				return IPACM_FAILURE;
-			}
-
-			IPACMDBG("In case RTM_NEWROUTE\n");
-			IPACMDBG("rtm_type: %d\n", msg_ptr->nl_route_info.metainfo.rtm_type);
-			IPACMDBG("protocol: %d\n", msg_ptr->nl_route_info.metainfo.rtm_protocol);
-			IPACMDBG("rtm_scope: %d\n", msg_ptr->nl_route_info.metainfo.rtm_scope);
-			IPACMDBG("rtm_table: %d\n", msg_ptr->nl_route_info.metainfo.rtm_table);
-			IPACMDBG("rtm_family: %d\n", msg_ptr->nl_route_info.metainfo.rtm_family);
-			IPACMDBG("param_mask: 0x%x\n", msg_ptr->nl_route_info.attr_info.param_mask);
-
-			/* take care of route add default route & uniroute */
-			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
-				 ((msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) ||
-				  (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_RA)) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_scope == RT_SCOPE_UNIVERSE) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
-			{
-				IPACMDBG("\n GOT RTM_NEWROUTE event\n");
-
-				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST)
-				{
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-
-					IPACM_NL_REPORT_ADDR( "route add -host", msg_ptr->nl_route_info.attr_info.dst_addr );
-					IPACM_NL_REPORT_ADDR( "gw", msg_ptr->nl_route_info.attr_info.gateway_addr );
-					IPACMDBG("dev %s\n",dev_name );
-					/* insert to command queue */
-					IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
-					temp = (-1);
-
-					evt_data.event = IPA_ROUTE_ADD_EVENT;
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-
-					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
-					data_addr->iptype = IPA_IP_v4;
-					data_addr->ipv4_addr = ntohl(if_ipv4_addr);
-					data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask);
-
-					IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv4 address 0x%x, mask:0x%x\n",
-									 data_addr->if_index,
-									 data_addr->ipv4_addr,
-									 data_addr->ipv4_addr_mask);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-
-				}
-				else
-				{
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-
-					if(AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family)
-					{
-						/* insert to command queue */
-						data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-						if(data_addr == NULL)
-						{
-							IPACMERR("unable to allocate memory for event data_addr\n");
-							return IPACM_FAILURE;
-						}
-
-						if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_PRIORITY)
-						{
-							IPACMDBG_H("ip -6 route add default dev %s metric %d\n",
-											 dev_name,
-											 msg_ptr->nl_route_info.attr_info.priority);
-						}
-						else
-						{
-							IPACMDBG_H("ip -6 route add default dev %s\n", dev_name);
-						}
-
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_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]);
-
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
-						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]);
-
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr);
-						data_addr->ipv6_addr_gw[0] = ntohl(data_addr->ipv6_addr_gw[0]);
-						data_addr->ipv6_addr_gw[1] = ntohl(data_addr->ipv6_addr_gw[1]);
-						data_addr->ipv6_addr_gw[2] = ntohl(data_addr->ipv6_addr_gw[2]);
-						data_addr->ipv6_addr_gw[3] = ntohl(data_addr->ipv6_addr_gw[3]);
-						IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_route_info.attr_info.gateway_addr);
-
-						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;
-
-						IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n",
-										 data_addr->if_index);
-						evt_data.evt_data = data_addr;
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-						/* finish command queue */
-
-					}
-					else
-					{
-						IPACM_NL_REPORT_ADDR( "route add default gw \n", msg_ptr->nl_route_info.attr_info.gateway_addr );
-						IPACMDBG_H("dev %s \n", dev_name);
-						IPACM_NL_REPORT_ADDR( "dstIP:", msg_ptr->nl_route_info.attr_info.dst_addr );
-
-						/* insert to command queue */
-						data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-						if(data_addr == NULL)
-						{
-							IPACMERR("unable to allocate memory for event data_addr\n");
-							return IPACM_FAILURE;
-						}
-
-						IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
-						IPACM_EVENT_COPY_ADDR_v4( if_ipipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
-						IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr);
-
-						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_v4;
-						data_addr->ipv4_addr = ntohl(if_ipv4_addr);
-						data_addr->ipv4_addr_gw = ntohl(if_ipv4_addr_gw);
-						data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask);
-
-            IPACMDBG_H("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv4 addr:0x%x, mask: 0x%x and gw: 0x%x\n",
-										 data_addr->if_index,
-										 data_addr->ipv4_addr,
-										 data_addr->ipv4_addr_mask,
-										 data_addr->ipv4_addr_gw);
-						evt_data.evt_data = data_addr;
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-						/* finish command queue */
-					}
-				}
-			}
-
-			/* ipv6 routing table */
-			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
-			{
-				IPACMDBG("\n GOT valid v6-RTM_NEWROUTE event\n");
-				ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-				if(ret_val != IPACM_SUCCESS)
-				{
-					IPACMERR("Error while getting interface name\n");
-					return IPACM_FAILURE;
-				}
-
-				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST)
-				{
-					IPACM_NL_REPORT_ADDR( "Route ADD DST:", msg_ptr->nl_route_info.attr_info.dst_addr );
-					IPACMDBG("%d, metric %d, dev %s\n",
-									 msg_ptr->nl_route_info.metainfo.rtm_dst_len,
-									 msg_ptr->nl_route_info.attr_info.priority,
-									 dev_name);
-
-					/* insert to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-
-					 IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_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++)
-					{
-						if(mask_value_v6 >= 32)
-						{
-							mask_v6(32, &data_addr->ipv6_addr_mask[mask_index]);
-							mask_value_v6 -= 32;
-						}
-						else
-						{
-							mask_v6(mask_value_v6, &data_addr->ipv6_addr_mask[mask_index]);
-							mask_value_v6 = 0;
-						}
-					}
-
-					IPACMDBG("ADD IPV6 MASK %d: %08x:%08x:%08x:%08x \n",
-									 msg_ptr->nl_route_info.metainfo.rtm_dst_len,
-									 data_addr->ipv6_addr_mask[0],
-									 data_addr->ipv6_addr_mask[1],
-									 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;
-
-					IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 addr\n",
-									 data_addr->if_index);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-				}
-				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_GATEWAY)
-				{
-					IPACM_NL_REPORT_ADDR( "Route ADD ::/0  Next Hop:", msg_ptr->nl_route_info.attr_info.gateway_addr );
-					IPACMDBG(" metric %d, dev %s\n",
-									 msg_ptr->nl_route_info.attr_info.priority,
-									 dev_name);
-
-					/* insert to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-
-					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_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]);
-
-					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
-
-					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;
-
-					IPACMDBG("posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n",
-									 data_addr->if_index);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-				}
-			}
-			break;
-
-		case RTM_DELROUTE:
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info)))
-			{
-				IPACMERR("Failed to decode rtm route message\n");
-				return IPACM_FAILURE;
-			}
-			/* take care of route delete of default route & uniroute */
-			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
-				 ((msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) ||
-				  (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_RA)) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_scope == 0) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
-			{
-
-				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST)
-				{
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-					IPACM_NL_REPORT_ADDR( "route del -host ", msg_ptr->nl_route_info.attr_info.dst_addr);
-					IPACM_NL_REPORT_ADDR( " gw ", msg_ptr->nl_route_info.attr_info.gateway_addr);
-					IPACMDBG("dev %s\n", dev_name);
-
-					/* insert to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-					IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
-					temp = (-1);
-					if_ipipv4_addr_mask = ntohl(temp);
-
-					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_v4;
-					data_addr->ipv4_addr = ntohl(if_ipv4_addr);
-					data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask);
-
-					IPACMDBG_H("Posting event IPA_ROUTE_DEL_EVENT with if index:%d, ipv4 address 0x%x, mask:0x%x\n",
-									 data_addr->if_index,
-									 data_addr->ipv4_addr,
-									 data_addr->ipv4_addr_mask);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-				}
-				else
-				{
-					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-					if(ret_val != IPACM_SUCCESS)
-					{
-						IPACMERR("Error while getting interface name\n");
-						return IPACM_FAILURE;
-					}
-
-					/* insert to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-
-					if(AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family)
-					{
-						if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_PRIORITY)
-						{
-							IPACMDBG("ip -6 route del default dev %s metric %d\n",
-											 dev_name,
-											 msg_ptr->nl_route_info.attr_info.priority);
-						}
-						else
-						{
-							IPACMDBG("ip -6 route del default dev %s\n", dev_name);
-						}
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_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]);
-
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
-						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]);
-
-						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr);
-						data_addr->ipv6_addr_gw[0] = ntohl(data_addr->ipv6_addr_gw[0]);
-						data_addr->ipv6_addr_gw[1] = ntohl(data_addr->ipv6_addr_gw[1]);
-						data_addr->ipv6_addr_gw[2] = ntohl(data_addr->ipv6_addr_gw[2]);
-						data_addr->ipv6_addr_gw[3] = ntohl(data_addr->ipv6_addr_gw[3]);
-						IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_route_info.attr_info.gateway_addr);
-						data_addr->iptype = IPA_IP_v6;
-					}
-					else
-					{
-						IPACM_NL_REPORT_ADDR( "route del default gw", msg_ptr->nl_route_info.attr_info.gateway_addr);
-						IPACMDBG("dev %s\n", dev_name);
-
-						IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
-						data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr);
-
-						IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
-						data_addr->ipv4_addr_mask = ntohl(data_addr->ipv4_addr_mask);
-
-						data_addr->iptype = IPA_IP_v4;
-					}
-
-					evt_data.event = IPA_ROUTE_DEL_EVENT;
-					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
-
-					IPACMDBG_H("Posting IPA_ROUTE_DEL_EVENT with if index:%d\n",
-									 data_addr->if_index);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-				}
-			}
-
-			/* ipv6 routing table */
-			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) &&
-				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
-			{
-				IPACMDBG("\n GOT valid v6-RTM_DELROUTE event\n");
-				ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index);
-				if(ret_val != IPACM_SUCCESS)
-				{
-					IPACMERR("Error while getting interface name");
-					return IPACM_FAILURE;
-				}
-
-				if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST)
-				{
-					IPACM_NL_REPORT_ADDR( "DEL", msg_ptr->nl_route_info.attr_info.dst_addr);
-					IPACMDBG("/%d, metric %d, dev %s\n",
-									 msg_ptr->nl_route_info.metainfo.rtm_dst_len,
-									 msg_ptr->nl_route_info.attr_info.priority,
-									 dev_name);
-
-					/* insert to command queue */
-					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
-					if(data_addr == NULL)
-					{
-						IPACMERR("unable to allocate memory for event data_addr\n");
-						return IPACM_FAILURE;
-					}
-
-					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_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++)
-					{
-						IPACMDBG("%dst %d \n",
-										 mask_index,
-										 mask_value_v6);
-						if(mask_value_v6 >= 32)
-						{
-							mask_v6(32, &data_addr->ipv6_addr_mask[mask_index]);
-							mask_value_v6 -= 32;
-							IPACMDBG("%dst: %08x \n",
-											 mask_index,
-											 data_addr->ipv6_addr_mask[mask_index]);
-						}
-						else
-						{
-							mask_v6(mask_value_v6, data_addr->ipv6_addr_mask);
-							mask_value_v6 = 0;
-							IPACMDBG("%dst: %08x \n",
-											 mask_index,
-											 data_addr->ipv6_addr_mask[mask_index]);
-						}
-					}
-
-					IPACMDBG("DEL IPV6 MASK 0st: %08x ",
-									 data_addr->ipv6_addr_mask[0]);
-					IPACMDBG("1st: %08x ",
-									 data_addr->ipv6_addr_mask[1]);
-					IPACMDBG("2st: %08x ",
-									 data_addr->ipv6_addr_mask[2]);
-					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;
-
-					IPACMDBG_H("posting event IPA_ROUTE_DEL_EVENT with if index:%d, ipv4 address\n",
-									 data_addr->if_index);
-					evt_data.evt_data = data_addr;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-				}
-			}
-			break;
-
-		case RTM_NEWNEIGH:
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_neigh(buffer, buflen, &(msg_ptr->nl_neigh_info)))
-			{
-				IPACMERR("Failed to decode rtm neighbor message\n");
-				return IPACM_FAILURE;
-			}
-
-			ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_neigh_info.metainfo.ndm_ifindex);
-			if(ret_val != IPACM_SUCCESS)
-			{
-				IPACMERR("Error while getting interface index\n");
-				return IPACM_FAILURE;
-			}
-			else
-				{
-				IPACMDBG("\n GOT RTM_NEWNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
-			}
-
-			/* insert to command queue */
-		    data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-		    if(data_all == NULL)
-			{
-		    	IPACMERR("unable to allocate memory for event data_all\n");
-						return IPACM_FAILURE;
-			}
-
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));
-		    if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6)
-		    {
-				IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
-				IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
-
-				data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]);
-				data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]);
-				data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]);
-				data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]);
-				data_all->iptype = IPA_IP_v6;
-		    }
-		    else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET)
-		    {
-   				IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
-				IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
-		    	data_all->ipv4_addr = ntohl(data_all->ipv4_addr);
-		    	data_all->iptype = IPA_IP_v4;
-		    }
-		    else
-		    {
-		        data_all->iptype = IPA_IP_v6;
-		    }
-
-		    IPACMDBG("NDA_LLADDR:MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[0],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[1],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[2],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[3],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[4],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[5]);
-
-
-		    memcpy(data_all->mac_addr,
-		    			 msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data,
-		    			 sizeof(data_all->mac_addr));
-			data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex;
-			/* Add support to replace src-mac as bridge0 mac */
-			if((msg_ptr->nl_neigh_info.metainfo.ndm_family == AF_BRIDGE) &&
-				(msg_ptr->nl_neigh_info.metainfo.ndm_state == NUD_PERMANENT))
-		    {
-				/* Posting IPA_BRIDGE_LINK_UP_EVENT event */
-				evt_data.event = IPA_BRIDGE_LINK_UP_EVENT;
-				IPACMDBG_H("posting IPA_BRIDGE_LINK_UP_EVENT (%s):index:%d \n",
-                                 dev_name,
- 		                    data_all->if_index);
-			}
-			else
-		    {
-				/* Posting new_neigh events for all LAN/WAN clients */
-				evt_data.event = IPA_NEW_NEIGH_EVENT;
-				IPACMDBG_H("posting IPA_NEW_NEIGH_EVENT (%s):index:%d ip-family: %d\n",
-                                 dev_name,
- 		                    data_all->if_index,
-		    				 msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
-			}
-		    evt_data.evt_data = data_all;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);
-					/* finish command queue */
-			break;
-
-		case RTM_DELNEIGH:
-			if(IPACM_SUCCESS != ipa_nl_decode_rtm_neigh(buffer, buflen, &(msg_ptr->nl_neigh_info)))
-			{
-				IPACMERR("Failed to decode rtm neighbor message\n");
-				return IPACM_FAILURE;
-			}
-
-			ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_neigh_info.metainfo.ndm_ifindex);
-			if(ret_val != IPACM_SUCCESS)
-			{
-				IPACMERR("Error while getting interface index\n");
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACMDBG("\n GOT RTM_DELNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
-			}
-
-				/* insert to command queue */
-				data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
-				if(data_all == NULL)
-				{
-					IPACMERR("unable to allocate memory for event data_all\n");
-					return IPACM_FAILURE;
-				}
-
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));
-		    if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6)
-				{
-					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
-					IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
-
-					data_all->ipv6_addr[0] = ntohl(data_all->ipv6_addr[0]);
-					data_all->ipv6_addr[1] = ntohl(data_all->ipv6_addr[1]);
-					data_all->ipv6_addr[2] = ntohl(data_all->ipv6_addr[2]);
-					data_all->ipv6_addr[3] = ntohl(data_all->ipv6_addr[3]);
-					data_all->iptype = IPA_IP_v6;
-				}
-		    else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET)
-				{
-					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
-					IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
-					data_all->ipv4_addr = ntohl(data_all->ipv4_addr);
-					data_all->iptype = IPA_IP_v4;
-				}
-		    else
-		    {
-		        data_all->iptype = IPA_IP_v6;
-		    }
-
-		    IPACMDBG("NDA_LLADDR:MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[0],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[1],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[2],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[3],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[4],
-		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[5]);
-
-				memcpy(data_all->mac_addr,
-							 msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data,
-							 sizeof(data_all->mac_addr));
-		    evt_data.event = IPA_DEL_NEIGH_EVENT;
-				data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex;
-
-		    IPACMDBG_H("posting IPA_DEL_NEIGH_EVENT (%s):index:%d ip-family: %d\n",
-                                 dev_name,
- 		                    data_all->if_index,
-		    				 msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
-				evt_data.evt_data = data_all;
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-				/* finish command queue */
-			break;
-
-		default:
-			IPACMDBG(" ignore NL event %d!!!\n ", nlh->nlmsg_type);
-			break;
-
-		}
-		nlh = NLMSG_NEXT(nlh, buflen);
-	}
-
-	return IPACM_SUCCESS;
-}
-
-
-/*  Virtual function registered to receive incoming messages over the NETLINK routing socket*/
-int ipa_nl_recv_msg(int fd)
-{
-	struct msghdr *msghdr = NULL;
-	struct iovec *iov = NULL;
-	unsigned int msglen = 0;
-	ipa_nl_msg_t *nlmsg = NULL;
-
-	nlmsg = (ipa_nl_msg_t *)malloc(sizeof(ipa_nl_msg_t));
-	if(NULL == nlmsg)
-	{
-		IPACMERR("Failed alloc of nlmsg \n");
-		goto error;
-	}
-	else
-	{
-		if(IPACM_SUCCESS != ipa_nl_recv(fd, &msghdr, &msglen))
-		{
-			IPACMERR("Failed to receive nl message \n");
-			goto error;
-		}
-
-		if(msghdr== NULL)
-		{
-			IPACMERR(" failed to get msghdr\n");
-			goto error;
-		}
-
-		iov = msghdr->msg_iov;
-
-		memset(nlmsg, 0, sizeof(ipa_nl_msg_t));
-		if(IPACM_SUCCESS != ipa_nl_decode_nlmsg((char *)iov->iov_base, msglen, nlmsg))
-		{
-			IPACMERR("Failed to decode nl message \n");
-			goto error;
-		}
-		/* Release NetLink message buffer */
-		if(msghdr)
-		{
-			ipa_nl_release_msg(msghdr);
-		}
-		if(nlmsg)
-		{
-			free(nlmsg);
-		}
-	}
-
-	return IPACM_SUCCESS;
-
-error:
-	if(msghdr)
-	{
-		ipa_nl_release_msg(msghdr);
-	}
-	if(nlmsg)
-	{
-		free(nlmsg);
-	}
-
-	return IPACM_FAILURE;
-}
-
-/*  get ipa interface name */
-int ipa_get_if_name
-(
-	 char *if_name,
-	 int if_index
-	 )
-{
-	int fd;
-	struct ifreq ifr;
-
-	if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-	{
-		IPACMERR("get interface name socket create failed \n");
-		return IPACM_FAILURE;
-	}
-
-	memset(&ifr, 0, sizeof(struct ifreq));
-	ifr.ifr_ifindex = if_index;
-	IPACMDBG("Interface index %d\n", if_index);
-
-	if(ioctl(fd, SIOCGIFNAME, &ifr) < 0)
-	{
-		IPACMERR("call_ioctl_on_dev: ioctl failed:\n");
-		close(fd);
-		return IPACM_FAILURE;
-	}
-
-	(void)strncpy(if_name, ifr.ifr_name, sizeof(ifr.ifr_name));
-	IPACMDBG("interface name %s\n", ifr.ifr_name);
-	close(fd);
-
-	return IPACM_SUCCESS;
-}
-
-/* Initialization routine for listener on NetLink sockets interface */
-int ipa_nl_listener_init
-(
-	 unsigned int nl_type,
-	 unsigned int nl_groups,
-	 ipa_nl_sk_fd_set_info_t *sk_fdset,
-	 ipa_sock_thrd_fd_read_f read_f
-	 )
-{
-	ipa_nl_sk_info_t sk_info;
-	int ret_val;
-
-	memset(&sk_info, 0, sizeof(ipa_nl_sk_info_t));
-	IPACMDBG_H("Entering IPA NL listener init\n");
-
-	if(ipa_nl_open_socket(&sk_info, nl_type, nl_groups) == IPACM_SUCCESS)
-	{
-		IPACMDBG_H("IPA Open netlink socket succeeds\n");
-	}
-	else
-	{
-		IPACMERR("Netlink socket open failed\n");
-		return IPACM_FAILURE;
-	}
-
-	/* Add NETLINK socket to the list of sockets that the listener
-					 thread should listen on. */
-
-	if(ipa_nl_addfd_map(sk_fdset, sk_info.sk_fd, read_f) != IPACM_SUCCESS)
-	{
-		IPACMERR("cannot add nl routing sock for reading\n");
-		close(sk_info.sk_fd);
-		return IPACM_FAILURE;
-	}
-
-	/* Start the socket listener thread */
-	ret_val = ipa_nl_sock_listener_start(sk_fdset);
-
-	if(ret_val != IPACM_SUCCESS)
-	{
-		IPACMERR("Failed to start NL listener\n");
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* find the newroute subnet mask */
-int find_mask(int ip_v4_last, int *mask_value)
-{
-
-	switch(ip_v4_last)
-	{
-
-	case 3:
-		*mask_value = 252;
-		return IPACM_SUCCESS;
-		break;
-
-	case 7:
-		*mask_value = 248;
-		return IPACM_SUCCESS;
-		break;
-
-	case 15:
-		*mask_value = 240;
-		return IPACM_SUCCESS;
-		break;
-
-	case 31:
-		*mask_value = 224;
-		return IPACM_SUCCESS;
-		break;
-
-	case 63:
-		*mask_value = 192;
-		return IPACM_SUCCESS;
-		break;
-
-	case 127:
-		*mask_value = 128;
-		return IPACM_SUCCESS;
-		break;
-
-	case 255:
-		*mask_value = 0;
-		return IPACM_SUCCESS;
-		break;
-
-	default:
-		return IPACM_FAILURE;
-		break;
-
-	}
-}
-
-/* map mask value for ipv6 */
-int mask_v6(int index, uint32_t *mask)
-{
-	switch(index)
-	{
-
-	case 0:
-		*mask = 0x00000000;
-		return IPACM_SUCCESS;
-		break;
-	case 4:
-		*mask = 0xf0000000;
-		return IPACM_SUCCESS;
-		break;
-	case 8:
-		*mask = 0xff000000;
-		return IPACM_SUCCESS;
-		break;
-	case 12:
-		*mask = 0xfff00000;
-		return IPACM_SUCCESS;
-		break;
-	case 16:
-		*mask = 0xffff0000;
-		return IPACM_SUCCESS;
-		break;
-	case 20:
-		*mask = 0xfffff000;
-		return IPACM_SUCCESS;
-		break;
-	case 24:
-		*mask = 0xffffff00;
-		return IPACM_SUCCESS;
-		break;
-	case 28:
-		*mask = 0xfffffff0;
-		return IPACM_SUCCESS;
-		break;
-	case 32:
-		*mask = 0xffffffff;
-		return IPACM_SUCCESS;
-		break;
-	default:
-		return IPACM_FAILURE;
-		break;
-
-	}
-}
-
-
diff --git a/ipacm/src/IPACM_Routing.cpp b/ipacm/src/IPACM_Routing.cpp
deleted file mode 100644
index 2a2555a..0000000
--- a/ipacm/src/IPACM_Routing.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_Routing.cpp
-
-	@brief
-	This file implements the IPACM routing functionality.
-
-	@Author
-
-*/
-
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "IPACM_Routing.h"
-#include <IPACM_Log.h>
-
-const char *IPACM_Routing::DEVICE_NAME = "/dev/ipa";
-
-IPACM_Routing::IPACM_Routing()
-{
-	m_fd = open(DEVICE_NAME, O_RDWR);
-	if (0 == m_fd)
-	{
-		IPACMERR("Failed opening %s.\n", DEVICE_NAME);
-	}
-}
-
-IPACM_Routing::~IPACM_Routing()
-{
-	close(m_fd);
-}
-
-bool IPACM_Routing::DeviceNodeIsOpened()
-{
-	int res = fcntl(m_fd, F_GETFL);
-
-	if (m_fd > 0 && res >= 0) return true;
-	else return false;
-
-}
-
-bool IPACM_Routing::AddRoutingRule(struct ipa_ioc_add_rt_rule *ruleTable)
-{
-	int retval = 0, cnt=0;
-	bool isInvalid = false;
-
-	if (!DeviceNodeIsOpened())
-	{
-		IPACMERR("Device is not opened\n");
-		return false;
-	}
-
-	for(cnt=0; cnt<ruleTable->num_rules; cnt++)
-	{
-		if(ruleTable->rules[cnt].rule.dst > IPA_CLIENT_MAX)
-		{
-			IPACMERR("Invalid dst pipe, Rule:%d  dst_pipe:%d\n", cnt, ruleTable->rules[cnt].rule.dst);
-			isInvalid = true;
-		}
-	}
-
-	if(isInvalid)
-	{
-		return false;
-	}
-
-	retval = ioctl(m_fd, IPA_IOC_ADD_RT_RULE, ruleTable);
-	if (retval)
-	{
-		IPACMERR("Failed adding routing rule %p\n", ruleTable);
-		return false;
-	}
-
-	for(cnt=0; cnt<ruleTable->num_rules; cnt++)
-	{
-		IPACMDBG("Rule:%d  dst_pipe:%d\n", cnt, ruleTable->rules[cnt].rule.dst);
-	}
-
-	IPACMDBG_H("Added routing rule %p\n", ruleTable);
-	return true;
-}
-
-bool IPACM_Routing::DeleteRoutingRule(struct ipa_ioc_del_rt_rule *ruleTable)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_DEL_RT_RULE, ruleTable);
-	if (retval)
-	{
-		IPACMERR("Failed deleting routing rule table %p\n", ruleTable);
-		return false;
-	}
-
-	IPACMDBG_H("Deleted routing rule %p\n", ruleTable);
-	return true;
-}
-
-bool IPACM_Routing::Commit(enum ipa_ip_type ip)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_COMMIT_RT, ip);
-	if (retval)
-	{
-		IPACMERR("Failed commiting routing rules.\n");
-		return false;
-	}
-
-	IPACMDBG_H("Commited routing rules to IPA HW.\n");
-	return true;
-}
-
-bool IPACM_Routing::Reset(enum ipa_ip_type ip)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_RESET_RT, ip);
-	retval |= ioctl(m_fd, IPA_IOC_COMMIT_RT, ip);
-	if (retval)
-	{
-		IPACMERR("Failed resetting routing block.\n");
-		return false;
-	}
-
-	IPACMDBG_H("Reset command issued to IPA routing block.\n");
-	return true;
-}
-
-bool IPACM_Routing::GetRoutingTable(struct ipa_ioc_get_rt_tbl *routingTable)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_GET_RT_TBL, routingTable);
-	if (retval)
-	{
-		IPACMERR("IPA_IOCTL_GET_RT_TBL ioctl failed, routingTable =0x%p, retval=0x%x.\n", routingTable, retval);
-		return false;
-	}
-	IPACMDBG_H("IPA_IOCTL_GET_RT_TBL ioctl issued to IPA routing block.\n");
-	/* put routing table right after successfully get routing table */
-	PutRoutingTable(routingTable->hdl);
-
-	return true;
-}
-
-bool IPACM_Routing::PutRoutingTable(uint32_t routingTableHandle)
-{
-	int retval = 0;
-
-	if (!DeviceNodeIsOpened()) return false;
-
-	retval = ioctl(m_fd, IPA_IOC_PUT_RT_TBL, routingTableHandle);
-	if (retval)
-	{
-		IPACMERR("IPA_IOCTL_PUT_RT_TBL ioctl failed.\n");
-		return false;
-	}
-
-	IPACMDBG_H("IPA_IOCTL_PUT_RT_TBL ioctl issued to IPA routing block.\n");
-	return true;
-}
-
-bool IPACM_Routing::DeleteRoutingHdl(uint32_t rt_rule_hdl, ipa_ip_type ip)
-{
-	const uint8_t NUM_RULES = 1;
-	struct ipa_ioc_del_rt_rule *rt_rule;
-	struct ipa_rt_rule_del *rt_rule_entry;
-	bool res = true;
-	int len = 0;
-
-	if (rt_rule_hdl == 0)
-	{
-		IPACMERR(" No route handle passed. Ignoring it\n");
-		return res;
-	}
-
-	len = (sizeof(struct ipa_ioc_del_rt_rule)) + (NUM_RULES * sizeof(struct ipa_rt_rule_del));
-	rt_rule = (struct ipa_ioc_del_rt_rule *)malloc(len);
-	if (rt_rule == NULL)
-	{
-		IPACMERR("unable to allocate memory for del route rule\n");
-		return false;
-	}
-
-	memset(rt_rule, 0, len);
-	rt_rule->commit = 1;
-	rt_rule->num_hdls = NUM_RULES;
-	rt_rule->ip = ip;
-
-	rt_rule_entry = &rt_rule->hdl[0];
-	rt_rule_entry->status = -1;
-	rt_rule_entry->hdl = rt_rule_hdl;
-
-	IPACMDBG_H("Deleting Route hdl:(0x%x) with ip type: %d\n", rt_rule_entry->hdl, ip);
-	if ((false == DeleteRoutingRule(rt_rule)) ||
-			(rt_rule_entry->status))
-	{
-		PERROR("Routing rule deletion failed!\n");
-		goto fail;
-		res = false;
-	}
-
-fail:
-	free(rt_rule);
-
-	return res;
-}
-
-bool IPACM_Routing::ModifyRoutingRule(struct ipa_ioc_mdfy_rt_rule *mdfyRules)
-{
-	int retval = 0, cnt;
-
-	if (!DeviceNodeIsOpened())
-	{
-		IPACMERR("Device is not opened\n");
-		return false;
-	}
-
-	retval = ioctl(m_fd, IPA_IOC_MDFY_RT_RULE, mdfyRules);
-	if (retval)
-	{
-		IPACMERR("Failed modifying routing rules %p\n", mdfyRules);
-		return false;
-	}
-
-	for(cnt=0; cnt<mdfyRules->num_rules; cnt++)
-	{
-		if(mdfyRules->rules[cnt].status != 0)
-		{
-			IPACMERR("Unable to modify rule: %d\n", cnt);
-		}
-	}
-
-	IPACMDBG_H("Modified routing rules %p\n", mdfyRules);
-	return true;
-}
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
deleted file mode 100644
index 1a7eae1..0000000
--- a/ipacm/src/IPACM_Wan.cpp
+++ /dev/null
@@ -1,6171 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-		@file
-		IPACM_Wan.cpp
-
-		@brief
-		This file implements the WAN iface functionality.
-
-		@Author
-		Skylar Chang
-
-*/
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <IPACM_Wan.h>
-#include <IPACM_Xml.h>
-#include <IPACM_Log.h>
-#include "IPACM_EvtDispatcher.h"
-#include <IPACM_IfaceManager.h>
-#include "linux/rmnet_ipa_fd_ioctl.h"
-#include "IPACM_Config.h"
-#include "IPACM_Defs.h"
-#include <IPACM_ConntrackListener.h>
-#include "linux/ipa_qmi_service_v01.h"
-
-bool IPACM_Wan::wan_up = false;
-bool IPACM_Wan::wan_up_v6 = false;
-uint8_t IPACM_Wan::xlat_mux_id = 0;
-
-uint32_t IPACM_Wan::curr_wan_ip = 0;
-int IPACM_Wan::num_v4_flt_rule = 0;
-int IPACM_Wan::num_v6_flt_rule = 0;
-
-struct ipa_flt_rule_add IPACM_Wan::flt_rule_v4[IPA_MAX_FLT_RULE];
-struct ipa_flt_rule_add IPACM_Wan::flt_rule_v6[IPA_MAX_FLT_RULE];
-
-char IPACM_Wan::wan_up_dev_name[IF_NAME_LEN];
-
-bool IPACM_Wan::backhaul_is_sta_mode = false;
-bool IPACM_Wan::is_ext_prop_set = false;
-
-int IPACM_Wan::num_ipv4_modem_pdn = 0;
-int IPACM_Wan::num_ipv6_modem_pdn = 0;
-
-bool IPACM_Wan::embms_is_on = false;
-bool IPACM_Wan::backhaul_is_wan_bridge = false;
-
-uint32_t IPACM_Wan::backhaul_ipv6_prefix[2];
-
-#ifdef FEATURE_IPA_ANDROID
-int	IPACM_Wan::ipa_if_num_tether_v4_total = 0;
-int	IPACM_Wan::ipa_if_num_tether_v6_total = 0;
-
-int	IPACM_Wan::ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES];
-int	IPACM_Wan::ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES];
-#endif
-
-IPACM_Wan::IPACM_Wan(int iface_index,
-	ipacm_wan_iface_type is_sta_mode,
-	uint8_t *mac_addr) : IPACM_Iface(iface_index)
-{
-	num_firewall_v4 = 0;
-	num_firewall_v6 = 0;
-	wan_route_rule_v4_hdl = NULL;
-	wan_route_rule_v6_hdl = NULL;
-	wan_route_rule_v6_hdl_a5 = NULL;
-	wan_client = NULL;
-
-	if(iface_query != NULL)
-	{
-		wan_route_rule_v4_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-		wan_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-		wan_route_rule_v6_hdl_a5 = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-		IPACMDBG_H("IPACM->IPACM_Wan(%d) constructor: Tx:%d\n", ipa_if_num, iface_query->num_tx_props);
-	}
-	m_is_sta_mode = is_sta_mode;
-
-	wan_v4_addr_set = false;
-	wan_v4_addr_gw_set = false;
-	wan_v6_addr_gw_set = false;
-	active_v4 = false;
-	active_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;
-	hdr_hdl_sta_v6 = 0;
-	num_ipv6_dest_flt_rule = 0;
-	memset(ipv6_dest_flt_rule_hdl, 0, MAX_DEFAULT_v6_ROUTE_RULES*sizeof(uint32_t));
-	memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
-	memset(wan_v6_addr_gw, 0, sizeof(wan_v6_addr_gw));
-	ext_prop = NULL;
-	is_ipv6_frag_firewall_flt_rule_installed = false;
-	ipv6_frag_firewall_flt_rule_hdl = 0;
-
-	num_wan_client = 0;
-	header_name_count = 0;
-	memset(invalid_mac, 0, sizeof(invalid_mac));
-
-	is_xlat = false;
-	hdr_hdl_dummy_v6 = 0;
-	hdr_proc_hdl_dummy_v6 = 0;
-	is_default_gateway = false;
-	m_fd_ipa = 0;
-	wan_client_len = 0;
-
-	if(iface_query != NULL)
-	{
-		wan_client_len = (sizeof(ipa_wan_client)) + (iface_query->num_tx_props * sizeof(wan_client_rt_hdl));
-		wan_client = (ipa_wan_client *)calloc(IPA_MAX_NUM_WAN_CLIENTS, wan_client_len);
-		if (wan_client == NULL)
-		{
-			IPACMERR("unable to allocate memory\n");
-			return;
-		}
-		IPACMDBG_H("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
-	}
-
-
-	if(m_is_sta_mode == Q6_WAN)
-	{
-		IPACMDBG_H("The new WAN interface is modem.\n");
-		is_default_gateway = false;
-		query_ext_prop();
-	}
-	else
-	{
-		IPACMDBG_H("The new WAN interface is WLAN STA.\n");
-	}
-
-	m_fd_ipa = open(IPA_DEVICE_NAME, O_RDWR);
-	if(0 == m_fd_ipa)
-	{
-		IPACMERR("Failed to open %s\n",IPA_DEVICE_NAME);
-	}
-
-	if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF)
-	{
-		IPACMDBG(" IPACM->IPACM_Wan_eMBMS(%d)\n", ipa_if_num);
-		embms_is_on = true;
-		install_wan_filtering_rule(false);
-		/* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
-		if(tx_prop != NULL)
-		{
-			IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-			IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-        	IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-		}
-	}
-	else
-	{
-		IPACMDBG(" IPACM->IPACM_Wan(%d)\n", ipa_if_num);
-	}
-	return;
-}
-
-IPACM_Wan::~IPACM_Wan()
-{
-	IPACM_EvtDispatcher::deregistr(this);
-	IPACM_IfaceManager::deregistr(this);
-	return;
-}
-
-/* handle new_address event */
-int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data)
-{
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	struct ipa_ioc_add_flt_rule *flt_rule;
-	struct ipa_flt_rule_add flt_rule_entry;
-	struct ipa_ioc_get_hdr hdr;
-
-	const int NUM_RULES = 1;
-	int num_ipv6_addr, len;
-	int res = IPACM_SUCCESS;
-
-	memset(&hdr, 0, sizeof(hdr));
-	if(tx_prop == NULL || rx_prop == NULL)
-	{
-		IPACMDBG_H("Either tx or rx property is NULL, return.\n");
-		return IPACM_SUCCESS;
-	}
-
-	/* Update the IP Type. */
-	config_ip_type(data->iptype);
-
-	if (data->iptype == IPA_IP_v6)
-	{
-		for(num_ipv6_addr=0;num_ipv6_addr<num_dft_rt_v6;num_ipv6_addr++)
-		{
-			if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) &&
-			   (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) &&
-			   (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) &&
-			   (ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3]))
-			{
-				IPACMDBG_H("find matched ipv6 address, index:%d \n", num_ipv6_addr);
-				return IPACM_SUCCESS;
-				break;
-			}
-		}
-		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));
-
-		if (!rt_rule)
-		{
-			IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = NUM_RULES;
-		rt_rule->ip = data->iptype;
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name));
-
-		rt_rule_entry = &rt_rule->rules[0];
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name));
-			hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-			if(m_header.GetHeaderHandle(&hdr) == false)
-			{
-				IPACMERR("Failed to get QMAP header.\n");
-				return IPACM_FAILURE;
-			}
-			rt_rule_entry->rule.hdr_hdl = hdr.hdl;
-		}
-		rt_rule_entry->at_rear = false;
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS;
-		}
-		else
-		{
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS;
-		}
-		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];
-#ifdef FEATURE_IPA_V3
-		rt_rule_entry->rule.hashable = false;
-#endif
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			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;
-
-		/* setup same rule for v6_wan table*/
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name));
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			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+1] = rt_rule_entry->rt_rule_hdl;
-
-		IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n",
-				dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6],
-				dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6);
-
-		/* add default filtering rules when wan-iface get global v6-prefix */
-		if (num_dft_rt_v6 == 1)
-		{
-			if(m_is_sta_mode == Q6_WAN)
-			{
-				modem_ipv6_pdn_index = num_ipv6_modem_pdn;
-				num_ipv6_modem_pdn++;
-				IPACMDBG_H("Now the number of modem ipv6 pdn is %d.\n", num_ipv6_modem_pdn);
-				init_fl_rule_ex(data->iptype);
-			}
-			else
-			{
-				init_fl_rule(data->iptype);
-			}
-		}
-
-		/* add WAN DL interface IP specific flt rule for IPv6 when backhaul is not Q6 */
-		if(m_is_sta_mode != Q6_WAN)
-		{
-			if(rx_prop != NULL && is_global_ipv6_addr(data->ipv6_addr)
-				&& num_ipv6_dest_flt_rule < MAX_DEFAULT_v6_ROUTE_RULES)
-			{
-				len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-
-				flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-				if (!flt_rule)
-				{
-					IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-					return IPACM_FAILURE;
-				}
-
-				flt_rule->commit = 1;
-				flt_rule->ep = rx_prop->rx[0].src_pipe;
-				flt_rule->global = false;
-				flt_rule->ip = IPA_IP_v6;
-				flt_rule->num_rules = 1;
-
-				memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-				flt_rule_entry.rule.retain_hdr = 1;
-				flt_rule_entry.rule.to_uc = 0;
-				flt_rule_entry.rule.eq_attrib_type = 0;
-				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;
-#ifdef FEATURE_IPA_V3
-				flt_rule_entry.rule.hashable = true;
-#endif
-				memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
-
-				flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-				memcpy(flt_rule_entry.rule.attrib.u.v6.dst_addr, data->ipv6_addr, sizeof(flt_rule_entry.rule.attrib.u.v6.dst_addr));
-				flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
-				flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
-				flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
-				flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
-				memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-				if (m_filtering.AddFilteringRule(flt_rule) == false)
-				{
-					IPACMERR("Error Adding Filtering rule, aborting...\n");
-					free(flt_rule);
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-				else
-				{
-					IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-					ipv6_dest_flt_rule_hdl[num_ipv6_dest_flt_rule] = flt_rule->rules[0].flt_rule_hdl;
-					IPACMDBG_H("IPv6 dest filter rule %d HDL:0x%x\n", num_ipv6_dest_flt_rule, ipv6_dest_flt_rule_hdl[num_ipv6_dest_flt_rule]);
-					num_ipv6_dest_flt_rule++;
-					free(flt_rule);
-				}
-			}
-		}
-		/* store ipv6 prefix if the ipv6 address is not link local */
-		if(is_global_ipv6_addr(data->ipv6_addr))
-		{
-			memcpy(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix));
-		}
-	    num_dft_rt_v6++;
-    }
-	else
-	{
-		if(wan_v4_addr_set)
-		{
-			/* check iface ipv4 same or not */
-			if(data->ipv4_addr == wan_v4_addr)
-			{
-				IPACMDBG_H("Already setup device (%s) ipv4 and it didn't change(0x%x)\n", dev_name, data->ipv4_addr);
-				return IPACM_SUCCESS;
-			}
-			else
-			{
-				IPACMDBG_H(" device (%s) ipv4 addr is changed\n", dev_name);
-				/* Delete default v4 RT rule */
-				IPACMDBG_H("Delete default v4 routing rules\n");
-				if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
-				{
-					IPACMERR("Routing old RT rule deletion failed!\n");
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-			}
-		}
-
-		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));
-
-		if (!rt_rule)
-		{
-			IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = NUM_RULES;
-		rt_rule->ip = data->iptype;
-		rt_rule_entry = &rt_rule->rules[0];
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name));
-			hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-			if(m_header.GetHeaderHandle(&hdr) == false)
-			{
-				IPACMERR("Failed to get QMAP header.\n");
-				return IPACM_FAILURE;
-			}
-			rt_rule_entry->rule.hdr_hdl = hdr.hdl;
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS;
-		}
-		else
-		{
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS;
-		}
-		rt_rule_entry->at_rear = false;
-		rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
-		/* still need setup v4 default routing rule to A5*/
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name));
-		rt_rule_entry->rule.attrib.u.v4.dst_addr      = data->ipv4_addr;
-		rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-		rt_rule_entry->rule.hashable = false;
-#endif
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		else if (rt_rule_entry->status)
-		{
-			IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status);
-			res = rt_rule_entry->status;
-			goto fail;
-		}
-		dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
-		IPACMDBG_H("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]);
-			/* initial multicast/broadcast/fragment filter rule */
-
-		/* only do one time */
-		if(!wan_v4_addr_set)
-		{
-			/* initial multicast/broadcast/fragment filter rule */
-			if(m_is_sta_mode == Q6_WAN)
-			{
-				modem_ipv4_pdn_index = num_ipv4_modem_pdn;
-				num_ipv4_modem_pdn++;
-				IPACMDBG_H("Now the number of modem ipv4 pdn is %d.\n", num_ipv4_modem_pdn);
-				init_fl_rule_ex(data->iptype);
-			}
-			else
-			{
-				init_fl_rule(data->iptype);
-			}
-		}
-
-		wan_v4_addr = data->ipv4_addr;
-		wan_v4_addr_set = true;
-
-		if (m_is_sta_mode == Q6_WAN)
-			curr_wan_ip = data->ipv4_addr;
-
-		IPACMDBG_H("Receved wan ipv4-addr:0x%x\n",wan_v4_addr);
-	}
-
-	IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6);
-
-fail:
-	free(rt_rule);
-
-	return res;
-}
-
-void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
-{
-	int ipa_interface_index;
-
-	switch (event)
-	{
-	case IPA_WLAN_LINK_DOWN_EVENT:
-		{
-			if(m_is_sta_mode == WLAN_WAN)
-			{
-				ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-				ipa_interface_index = iface_ipa_index_query(data->if_index);
-				if (ipa_interface_index == ipa_if_num)
-				{
-					IPACMDBG_H("Received IPA_WLAN_LINK_DOWN_EVENT\n");
-					handle_down_evt();
-					/* reset the STA-iface category to unknown */
-					IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat = UNKNOWN_IF;
-					IPACMDBG_H("IPA_WAN_STA (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
-					IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-					delete this;
-					return;
-				}
-			}
-		}
-		break;
-
-	case IPA_WAN_XLAT_CONNECT_EVENT:
-		{
-			IPACMDBG_H("Recieved IPA_WAN_XLAT_CONNECT_EVENT\n");
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index);
-			if ((ipa_interface_index == ipa_if_num) && (m_is_sta_mode == Q6_WAN))
-			{
-				is_xlat = true;
-				IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: \n",
-						IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,data->if_index, is_xlat);
-			}
-			break;
-		}
-	case IPA_CFG_CHANGE_EVENT:
-		{
-			if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ipa_if_cate) &&
-					(m_is_sta_mode ==ECM_WAN))
-			{
-				IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category did not change(wan_mode:%d)\n", m_is_sta_mode);
-				IPACMDBG_H("Now the cradle wan mode is %d.\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode);
-				if(is_default_gateway == true)
-				{
-					if(backhaul_is_wan_bridge == false && IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == BRIDGE)
-					{
-						IPACMDBG_H("Cradle wan mode switch to bridge mode.\n");
-						backhaul_is_wan_bridge = true;
-					}
-					else if(backhaul_is_wan_bridge == true && IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-					{
-						IPACMDBG_H("Cradle wan mode switch to router mode.\n");
-						backhaul_is_wan_bridge = false;
-					}
-					else
-					{
-						IPACMDBG_H("No cradle mode switch, return.\n");
-						return;
-					}
-					/* post wan mode change event to LAN/WLAN */
-					if(IPACM_Wan::wan_up == true)
-					{
-						IPACMDBG_H("This interface is default GW.\n");
-						ipacm_cmd_q_data evt_data;
-						memset(&evt_data, 0, sizeof(evt_data));
-
-						ipacm_event_cradle_wan_mode *data_wan_mode = NULL;
-						data_wan_mode = (ipacm_event_cradle_wan_mode *)malloc(sizeof(ipacm_event_cradle_wan_mode));
-						if(data_wan_mode == NULL)
-						{
-							IPACMERR("unable to allocate memory.\n");
-							return;
-						}
-						data_wan_mode->cradle_wan_mode = IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode;
-						evt_data.event = IPA_CRADLE_WAN_MODE_SWITCH;
-						evt_data.evt_data = data_wan_mode;
-						IPACMDBG_H("Posting IPA_CRADLE_WAN_MODE_SWITCH event.\n");
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-					}
-					/* update the firewall flt rule actions */
-					if(active_v4)
-					{
-						del_dft_firewall_rules(IPA_IP_v4);
-						config_dft_firewall_rules(IPA_IP_v4);
-					}
-					if(active_v6)
-					{
-						del_dft_firewall_rules(IPA_IP_v6);
-						config_dft_firewall_rules(IPA_IP_v6);
-					}
-				}
-				else
-				{
-					IPACMDBG_H("This interface is not default GW, ignore.\n");
-				}
-			}
-			else if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate) &&
-					(m_is_sta_mode ==ECM_WAN))
-			{
-				IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category changed(wan_mode:%d)\n", m_is_sta_mode);
-				/* posting link-up event for cradle use-case */
-				ipacm_cmd_q_data evt_data;
-				memset(&evt_data, 0, sizeof(evt_data));
-
-				ipacm_event_data_fid *data_fid = NULL;
-				data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
-				if(data_fid == NULL)
-				{
-					IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n");
-					return;
-				}
-				if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index)))
-				{
-					IPACMERR("Error while getting interface index for %s device", dev_name);
-				}
-				evt_data.event = IPA_USB_LINK_UP_EVENT;
-				evt_data.evt_data = data_fid;
-				IPACMDBG_H("Posting event:%d\n", evt_data.event);
-				IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-				/* delete previous instance */
-				handle_down_evt();
-				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-				delete this;
-				return;
-			}
-		}
-		break;
-
-	case IPA_LINK_DOWN_EVENT:
-		{
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				if(m_is_sta_mode == Q6_WAN)
-				{
-						IPACMDBG_H("Received IPA_LINK_DOWN_EVENT\n");
-						handle_down_evt_ex();
-						IPACMDBG_H("IPA_WAN_Q6 (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
-						IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-						delete this;
-						return;
-				}
-				else if (m_is_sta_mode == ECM_WAN)
-				{
-					IPACMDBG_H("Received IPA_LINK_DOWN_EVENT(wan_mode:%d)\n", m_is_sta_mode);
-					/* delete previous instance */
-					handle_down_evt();
-					IPACMDBG_H("IPA_WAN_CRADLE (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
-					IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-					delete this;
-					return;
-				}
-			}
-		}
-		break;
-
-	case IPA_ADDR_ADD_EVENT:
-		{
-			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_H("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
-				return;
-			}
-
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Get IPA_ADDR_ADD_EVENT: IF ip type %d, incoming ip type %d\n", ip_type, data->iptype);
-				/* check v4 not setup before, v6 can have 2 iface ip */
-				if( (data->iptype == IPA_IP_v4)
-				    || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
-				{
-					IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
-					handle_addr_evt(data);
-					/* checking if SW-RT_enable */
-					if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true &&
-							m_is_sta_mode != Q6_WAN)
-					{
-						/* handle software routing enable event*/
-						IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-						handle_software_routing_enable();
-					}
-
-				}
-			}
-		}
-		break;
-
-
-	case IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT:
-		{
-			ipacm_event_data_iptype *data = (ipacm_event_data_iptype *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT (Android) for ip-type (%d)\n", data->iptype);
-				/* The special below condition is to handle default gateway */
-				if ((data->iptype == IPA_IP_v4) && (ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX))
-				{
-					if (active_v4 == false)
-					{
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-						IPACMDBG_H("adding routing table(upstream), dev (%s) ip-type(%d) default gw (%x)\n", dev_name,data->iptype, wan_v4_addr_gw);
-						wan_v4_addr_gw = data->ipv4_addr_gw;
-						wan_v4_addr_gw_set = true;
-						/* Check & construct STA header */
-						handle_sta_header_add_evt();
-#else
-						IPACMDBG_H("adding routing table(upstream), dev (%s) ip-type(%d)\n", dev_name,data->iptype);
-#endif
-						handle_route_add_evt(data->iptype);
-					}
-#ifdef FEATURE_IPA_ANDROID
-					/* using ipa_if_index, not netdev_index */
-					post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
-#endif
-				}
-				else if ((data->iptype == IPA_IP_v6) && (ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX))
-				{
-					if(ipv6_prefix[0] == 0 && ipv6_prefix[1] == 0)
-					{
-						IPACMDBG_H("IPv6 default route comes earlier than global IP, ignore.\n");
-						return;
-					}
-
-					if (active_v6 == false)
-					{
-						IPACMDBG_H("\n get default v6 route (dst:00.00.00.00) upstream\n");
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-						IPACMDBG_H(" IPV6 gateway: %08x:%08x:%08x:%08x \n",
-								data->ipv6_addr_gw[0], data->ipv6_addr_gw[1], data->ipv6_addr_gw[2], data->ipv6_addr_gw[3]);
-						wan_v6_addr_gw[0] = data->ipv6_addr_gw[0];
-						wan_v6_addr_gw[1] = data->ipv6_addr_gw[1];
-						wan_v6_addr_gw[2] = data->ipv6_addr_gw[2];
-						wan_v6_addr_gw[3] = data->ipv6_addr_gw[3];
-						wan_v6_addr_gw_set = true;
-						/* Check & construct STA header */
-						handle_sta_header_add_evt();
-#endif
-						handle_route_add_evt(data->iptype);
-					}
-#ifdef FEATURE_IPA_ANDROID
-					/* using ipa_if_index, not netdev_index */
-					post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
-#endif
-				}
-			}
-			else /* double check if current default iface is not itself */
-			{
-				if ((data->iptype == IPA_IP_v4) && (active_v4 == true))
-				{
-					IPACMDBG_H("Received v4 IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					IPACMDBG_H("need clean default v4 route (dst:0.0.0.0) for old iface (%s)\n", dev_name);
-					wan_v4_addr_gw_set = false;
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v4);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v4);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v4);
-						handle_route_del_evt(IPA_IP_v4);
-					}
-				}
-				else if ((data->iptype == IPA_IP_v6) && (active_v6 == true))
-				{
-				    IPACMDBG_H("Received v6 IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					IPACMDBG_H("need clean default v6 route for old iface (%s)\n", dev_name);
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v6);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v6);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v6);
-						handle_route_del_evt(IPA_IP_v6);
-					}
-				}
-			}
-		}
-		break;
-
-	case IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT:
-		{
-			ipacm_event_data_iptype *data = (ipacm_event_data_iptype *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT\n");
-				if ((data->iptype == IPA_IP_v4) && (active_v4 == true))
-				{
-					IPACMDBG_H("get del default v4 route (dst:0.0.0.0)\n");
-					wan_v4_addr_gw_set = false;
-#ifdef FEATURE_IPA_ANDROID
-					/* using ipa_if_index, not netdev_index */
-					post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
-					/* no any ipv4 tether iface support*/
-					if(IPACM_Wan::ipa_if_num_tether_v4_total != 0)
-					{
-						IPACMDBG_H("still have tether ipv4 client on upsteam iface\n");
-						return;
-					}
-#endif
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v4);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v4);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v4);
-						handle_route_del_evt(IPA_IP_v4);
-					}
-				}
-				else if ((data->iptype == IPA_IP_v6) && (active_v6 == true))
-				{
-#ifdef FEATURE_IPA_ANDROID
-					/* using ipa_if_index, not netdev_index */
-					post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
-					/* no any ipv6 tether iface support*/
-					if(IPACM_Wan::ipa_if_num_tether_v6_total != 0)
-					{
-						IPACMDBG_H("still have tether ipv6 client on upsteam iface\n");
-						return;
-					}
-#endif
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v6);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v6);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v6);
-						handle_route_del_evt(IPA_IP_v6);
-					}
-				}
-			}
-		}
-		break;
-	case IPA_NETWORK_STATS_UPDATE_EVENT:
-		{
-			ipa_get_apn_data_stats_resp_msg_v01 *data = (ipa_get_apn_data_stats_resp_msg_v01 *)param;
-			if (!data->apn_data_stats_list_valid)
-			{
-				IPACMERR("not valid APN\n");
-				return;
-			}
-			else
-			{
-				handle_network_stats_update(data);
-			}
-		}
-		break;
-	case IPA_ROUTE_ADD_EVENT:
-		{
-			ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_ROUTE_ADD_EVENT\n");
-				IPACMDBG_H("ipv4 addr 0x%x\n", data->ipv4_addr);
-				IPACMDBG_H("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) && (active_v4 == false)
-					&& (ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX))
-				{
-					wan_v4_addr_gw = data->ipv4_addr_gw;
-					wan_v4_addr_gw_set = true;
-					IPACMDBG_H("adding routing table, dev (%s) ip-type(%d), default gw (%x)\n", dev_name,data->iptype, wan_v4_addr_gw);
-					/* Check & construct STA header */
-					handle_sta_header_add_evt();
-					handle_route_add_evt(data->iptype);
-					/* Add IPv6 routing table if XLAT is enabled */
-					if(is_xlat && (m_is_sta_mode == Q6_WAN) && (active_v6 == false))
-					{
-						IPACMDBG_H("XLAT enabled: adding IPv6 routing table dev (%s)\n", dev_name);
-						handle_route_add_evt(IPA_IP_v6);
-					}
-				}
-				else if ((data->iptype == IPA_IP_v6) &&
-						(!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) &&
-						(active_v6 == false) &&	(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX))
-				{
-					if(ipv6_prefix[0] == 0 && ipv6_prefix[1] == 0)
-					{
-						IPACMDBG_H("IPv6 default route comes earlier than global IP, ignore.\n");
-						return;
-					}
-
-					IPACMDBG_H("\n get default v6 route (dst:00.00.00.00)\n");
-					IPACMDBG_H(" IPV6 dst: %08x:%08x:%08x:%08x \n",
-							data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-					IPACMDBG_H(" IPV6 gateway: %08x:%08x:%08x:%08x \n",
-							data->ipv6_addr_gw[0], data->ipv6_addr_gw[1], data->ipv6_addr_gw[2], data->ipv6_addr_gw[3]);
-					wan_v6_addr_gw[0] = data->ipv6_addr_gw[0];
-					wan_v6_addr_gw[1] = data->ipv6_addr_gw[1];
-					wan_v6_addr_gw[2] = data->ipv6_addr_gw[2];
-					wan_v6_addr_gw[3] = data->ipv6_addr_gw[3];
-					wan_v6_addr_gw_set = true;
-					/* Check & construct STA header */
-					handle_sta_header_add_evt();
-					handle_route_add_evt(data->iptype);
-				}
-			}
-			else /* double check if current default iface is not itself */
-			{
-				if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == true))
-				{
-					IPACMDBG_H("Received v4 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					IPACMDBG_H("ipv4 addr 0x%x\n", data->ipv4_addr);
-					IPACMDBG_H("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask);
-					IPACMDBG_H("need clean default v4 route (dst:0.0.0.0) for old iface (%s)\n", dev_name);
-					wan_v4_addr_gw_set = false;
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v4);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v4);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v4);
-						handle_route_del_evt(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]) && (active_v6 == true))
-				{
-				    IPACMDBG_H("Received v6 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
-					IPACMDBG_H("need clean default v6 route for old iface (%s)\n", dev_name);
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v6);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v6);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v6);
-						handle_route_del_evt(IPA_IP_v6);
-					}
-				}
-			}
-		}
-		break;
-
-	case IPA_ROUTE_DEL_EVENT:
-		{
-			ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_ROUTE_DEL_EVENT\n");
-				if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == true))
-				{
-					IPACMDBG_H("get del default v4 route (dst:0.0.0.0)\n");
-					wan_v4_addr_gw_set = false;
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v4);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v4);
-
-						if(is_xlat && active_v6 == true)
-						{
-							IPACMDBG_H("XLAT enabled: Delete IPv6 routing table dev (%s)\n", dev_name);
-							del_wan_firewall_rule(IPA_IP_v6);
-							install_wan_filtering_rule(false);
-							handle_route_del_evt_ex(IPA_IP_v6);
-						}
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v4);
-						handle_route_del_evt(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]) && (active_v6 == true))
-				{
-
-					IPACMDBG_H("get del default v6 route (dst:00.00.00.00)\n");
-					if(m_is_sta_mode == Q6_WAN)
-					{
-						del_wan_firewall_rule(IPA_IP_v6);
-						install_wan_filtering_rule(false);
-						handle_route_del_evt_ex(IPA_IP_v6);
-					}
-					else
-					{
-						del_dft_firewall_rules(IPA_IP_v6);
-						handle_route_del_evt(IPA_IP_v6);
-					}
-				}
-			}
-		}
-		break;
-
-	case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT:
-		{
-			ipacm_event_data_all *data = (ipacm_event_data_all *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n");
-
-				if (m_is_sta_mode == WLAN_WAN)
-				{
-					if (data->iptype == IPA_IP_v4 && data->ipv4_addr == wan_v4_addr)
-					{
-						IPACMDBG_H("Ignore IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n");
-						IPACMDBG_H("for its own ipv4 address\n");
-						return;
-					}
-					else if (data->iptype == IPA_IP_v6)
-					{
-						for (int num_ipv6_addr = 0; num_ipv6_addr < num_dft_rt_v6; num_ipv6_addr++)
-						{
-							if ((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) &&
-								(ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) &&
-								(ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) &&
-								(ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3]))
-							{
-								IPACMDBG_H("Ignore IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n");
-								IPACMDBG_H("for its own ipv6 address\n");
-								return;
-							}
-						}
-					}
-				}
-
-				IPACMDBG_H("wan-iface got client \n");
-				/* first construc WAN-client full header */
-				if(memcmp(data->mac_addr,
-						invalid_mac,
-						sizeof(data->mac_addr)) == 0)
-				{
-					IPACMDBG_H("Received invalid Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 data->mac_addr[0], data->mac_addr[1], data->mac_addr[2],
-					 data->mac_addr[3], data->mac_addr[4], data->mac_addr[5]);
-					return;
-				}
-
-				handle_wan_hdr_init(data->mac_addr);
-				IPACMDBG_H("construct wan-client header and route rules \n");
-				/* Associate with IP and construct RT-rule */
-				if (handle_wan_client_ipaddr(data) == IPACM_FAILURE)
-				{
-					return;
-				}
-				handle_wan_client_route_rule(data->mac_addr, data->iptype);
-				/* Check & construct STA header */
-				handle_sta_header_add_evt();
-				return;
-			}
-		}
-		break;
-
-	case IPA_SW_ROUTING_ENABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n");
-		/* handle software routing enable event */
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			install_wan_filtering_rule(true);
-		}
-		else
-		{
-			handle_software_routing_enable();
-		}
-		break;
-
-	case IPA_SW_ROUTING_DISABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n");
-		/* handle software routing disable event */
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			/* send current DL rules to modem */
-			install_wan_filtering_rule(false);
-			softwarerouting_act = false;
-		}
-		else
-		{
-			handle_software_routing_disable();
-		}
-		break;
-
-	case IPA_FIREWALL_CHANGE_EVENT:
-		IPACMDBG_H("Received IPA_FIREWALL_CHANGE_EVENT\n");
-
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			if(is_default_gateway == false)
-			{
-				IPACMDBG_H("Interface %s is not default gw, return.\n", dev_name);
-				return;
-			}
-
-			if(ip_type == IPA_IP_v4)
-			{
-				del_wan_firewall_rule(IPA_IP_v4);
-				config_wan_firewall_rule(IPA_IP_v4);
-				install_wan_filtering_rule(false);
-			}
-			else if(ip_type == IPA_IP_v6)
-			{
-				del_wan_firewall_rule(IPA_IP_v6);
-				config_wan_firewall_rule(IPA_IP_v6);
-				install_wan_filtering_rule(false);
-			}
-			else if(ip_type == IPA_IP_MAX)
-			{
-				del_wan_firewall_rule(IPA_IP_v4);
-				config_wan_firewall_rule(IPA_IP_v4);
-
-				del_wan_firewall_rule(IPA_IP_v6);
-				config_wan_firewall_rule(IPA_IP_v6);
-				install_wan_filtering_rule(false);
-			}
-			else
-			{
-				IPACMERR("IP type is not expected.\n");
-			}
-		}
-		else
-		{
-			if (active_v4)
-			{
-				del_dft_firewall_rules(IPA_IP_v4);
-				config_dft_firewall_rules(IPA_IP_v4);
-			}
-			if (active_v6)
-			{
-
-				del_dft_firewall_rules(IPA_IP_v6);
-				config_dft_firewall_rules(IPA_IP_v6);
-			}
-		}
-		break;
-
-		case IPA_WLAN_SWITCH_TO_SCC:
-			if(IPACM_Wan::backhaul_is_sta_mode == true)
-			{
-				IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n");
-				if(ip_type == IPA_IP_MAX)
-				{
-					handle_wlan_SCC_MCC_switch(true, IPA_IP_v4);
-					handle_wlan_SCC_MCC_switch(true, IPA_IP_v6);
-					handle_wan_client_SCC_MCC_switch(true, IPA_IP_v4);
-					handle_wan_client_SCC_MCC_switch(true, IPA_IP_v6);
-				}
-				else
-				{
-					handle_wlan_SCC_MCC_switch(true, ip_type);
-					handle_wan_client_SCC_MCC_switch(true, ip_type);
-				}
-			}
-			break;
-
-		case IPA_WLAN_SWITCH_TO_MCC:
-			if(IPACM_Wan::backhaul_is_sta_mode == true)
-			{
-				IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n");
-				if(ip_type == IPA_IP_MAX)
-				{
-					handle_wlan_SCC_MCC_switch(false, IPA_IP_v4);
-					handle_wlan_SCC_MCC_switch(false, IPA_IP_v6);
-					handle_wan_client_SCC_MCC_switch(false, IPA_IP_v4);
-					handle_wan_client_SCC_MCC_switch(false, IPA_IP_v6);
-				}
-				else
-				{
-					handle_wlan_SCC_MCC_switch(false, ip_type);
-					handle_wan_client_SCC_MCC_switch(false, ip_type);
-				}
-			}
-			break;
-
-	default:
-		break;
-	}
-
-	return;
-}
-
-/* wan default route/filter rule configuration */
-int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
-{
-
-	/* add default WAN route */
-	struct ipa_ioc_add_rt_rule *rt_rule = NULL;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	struct ipa_ioc_get_hdr sRetHeader;
-	uint32_t cnt, tx_index = 0;
-	const int NUM = 1;
-	ipacm_cmd_q_data evt_data;
-	struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/
-	struct ipa_ioc_get_hdr hdr;
-
-	IPACMDBG_H("ip-type:%d\n", iptype);
-
-	/* copy header from tx-property, see if partial or not */
-	/* assume all tx-property uses the same header name for v4 or v6*/
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No tx properties, ignore default route setting\n");
-		return IPACM_SUCCESS;
-	}
-
-	is_default_gateway = true;
-	IPACMDBG_H("Default route is added to iface %s.\n", dev_name);
-
-	if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == BRIDGE)
-	{
-		IPACM_Wan::backhaul_is_wan_bridge = true;
-	}
-	else
-	{
-		IPACM_Wan::backhaul_is_wan_bridge = false;
-	}
-	IPACMDBG_H("backhaul_is_wan_bridge ?: %d \n", IPACM_Wan::backhaul_is_wan_bridge);
-
-	if (m_is_sta_mode !=Q6_WAN)
-	{
-		IPACM_Wan::backhaul_is_sta_mode	= true;
-		if((iptype==IPA_IP_v4) && (header_set_v4 != true))
-		{
-			header_partial_default_wan_v4 = true;
-			IPACMDBG_H("STA ipv4-header haven't constructed \n");
-			return IPACM_SUCCESS;
-		}
-		else if((iptype==IPA_IP_v6) && (header_set_v6 != true))
-		{
-			header_partial_default_wan_v6 = true;
-			IPACMDBG_H("STA ipv6-header haven't constructed \n");
-			return IPACM_SUCCESS;
-		}
-	}
-	else
-	{
-		IPACM_Wan::backhaul_is_sta_mode	= false;
-		IPACMDBG_H("reset backhaul to LTE \n");
-
-		if (iface_query != NULL && iface_query->num_ext_props > 0)
-		{
-			if(ext_prop == NULL)
-			{
-				IPACMERR("Extended property is empty.\n");
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->SetQmapId(ext_prop->ext[0].mux_id);
-				IPACMDBG_H("Setting up QMAP ID %d.\n", ext_prop->ext[0].mux_id);
-			}
-		}
-		else
-		{
-			IPACMERR("iface_query is empty.\n");
-			return IPACM_FAILURE;
-		}
-	}
-#if 0
-    for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-	{
-		if(tx_prop->tx[cnt].ip==iptype)
-		break;
-	}
-
-	if(tx_prop->tx[cnt].hdr_name != NULL)
-	{
-	    memset(&sCopyHeader, 0, sizeof(sCopyHeader));
-	    memcpy(sCopyHeader.name,
-	    			 tx_prop->tx[cnt].hdr_name,
-	    			 sizeof(sCopyHeader.name));
-
-	    IPACMDBG_H("header name: %s\n", sCopyHeader.name);
-	    if (m_header.CopyHeader(&sCopyHeader) == false)
-	    {
-	    	IPACMERR("ioctl copy header failed");
-	    	return IPACM_FAILURE;
-	    }
-	    IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-	    if(sCopyHeader.is_partial)
-	    {
- 	        IPACMDBG_H("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;
-	    }
-	    else
-	    {
-            if(iptype==IPA_IP_v4)
-			{
-				header_partial_default_wan_v4 = false;
-            }
-			else
-			{
-				header_partial_default_wan_v6 = false;
-			}
-	    }
-    }
-#endif
-
-	rt_rule = (struct ipa_ioc_add_rt_rule *)
-		 calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
-						NUM * sizeof(struct ipa_rt_rule_add));
-
-	if (!rt_rule)
-	{
-		IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-		return IPACM_FAILURE;
-	}
-
-	rt_rule->commit = 1;
-	rt_rule->num_rules = (uint8_t)NUM;
-	rt_rule->ip = iptype;
-
-
-	IPACMDBG_H(" WAN table created %s \n", rt_rule->rt_tbl_name);
-	rt_rule_entry = &rt_rule->rules[0];
-	rt_rule_entry->at_rear = true;
-
-	if(m_is_sta_mode != Q6_WAN)
-	{
-		IPACMDBG_H(" WAN instance is in STA mode \n");
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			if(iptype != tx_prop->tx[tx_index].ip)
-			{
-				IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
-									tx_index, tx_prop->tx[tx_index].ip,iptype);
-				continue;
-			}
-
-			/* use the STA-header handler */
-			if (iptype == IPA_IP_v4)
-			{
-				strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name, sizeof(rt_rule->rt_tbl_name));
-				rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v4;
-			}
-			else
-			{
-				strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name));
-				rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v6;
-			}
-
-			if(IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-			{
-				IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-						tx_prop->tx[tx_index].alt_dst_pipe);
-				rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-			}
-			else
-			{
-				rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-			}
-			memcpy(&rt_rule_entry->rule.attrib,
-						 &tx_prop->tx[tx_index].attrib,
-						 sizeof(rt_rule_entry->rule.attrib));
-
-			rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			if (iptype == IPA_IP_v4)
-			{
-				rt_rule_entry->rule.attrib.u.v4.dst_addr      = 0;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0;
-#ifdef FEATURE_IPA_V3
-
-				rt_rule_entry->rule.hashable = true;
-#endif
-				if (false == m_routing.AddRoutingRule(rt_rule))
-				{
-		    		IPACMERR("Routing rule addition failed!\n");
-		    		free(rt_rule);
-		    		return IPACM_FAILURE;
-				}
-				wan_route_rule_v4_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
-				IPACMDBG_H("Got ipv4 wan-route rule hdl:0x%x,tx:%d,ip-type: %d \n",
-							 wan_route_rule_v4_hdl[tx_index],
-							 tx_index,
-							 iptype);
-			}
-			else
-			{
-				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;
-#ifdef FEATURE_IPA_V3
-				rt_rule_entry->rule.hashable = true;
-#endif
-				if (false == m_routing.AddRoutingRule(rt_rule))
-				{
-		    		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_H("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],
-							 tx_index,
-							 iptype);
-			}
-		}
-	}
-
-	/* add a catch-all rule in wan dl routing table */
-
-	if (iptype == IPA_IP_v6)
-	{
-		strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name));
-		memset(rt_rule_entry, 0, sizeof(struct ipa_rt_rule_add));
-		rt_rule_entry->at_rear = true;
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			memset(&hdr, 0, sizeof(hdr));
-			strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name));
-			hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-			if(m_header.GetHeaderHandle(&hdr) == false)
-			{
-				IPACMERR("Failed to get QMAP header.\n");
-				return IPACM_FAILURE;
-			}
-			rt_rule_entry->rule.hdr_hdl = hdr.hdl;
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS;
-		}
-		else
-		{
-			/* create dummy ethernet header for v6 RX path */
-			IPACMDBG_H("Construct dummy ethernet_header\n");
-			if (add_dummy_rx_hdr())
-			{
-				IPACMERR("Construct dummy ethernet_header failed!\n");
-				free(rt_rule);
-				return IPACM_FAILURE;
-			}
-			rt_rule_entry->rule.hdr_proc_ctx_hdl = hdr_proc_hdl_dummy_v6;
-			rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS;
-		}
-		rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
-		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;
-#ifdef FEATURE_IPA_V3
-		rt_rule_entry->rule.hashable = true;
-#endif
-		if (false == m_routing.AddRoutingRule(rt_rule))
-		{
-			IPACMERR("Routing rule addition failed!\n");
-			free(rt_rule);
-			return IPACM_FAILURE;
-		}
-		wan_route_rule_v6_hdl_a5[0] = rt_rule_entry->rt_rule_hdl;
-		IPACMDBG_H("Set ipv6 wan-route rule hdl for v6_wan_table:0x%x,tx:%d,ip-type: %d \n",
-				wan_route_rule_v6_hdl_a5[0], 0, iptype);
-	}
-
-	ipacm_event_iface_up *wanup_data;
-	wanup_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
-	if (wanup_data == NULL)
-	{
-		IPACMERR("Unable to allocate memory\n");
-		free(rt_rule);
-		return IPACM_FAILURE;
-	}
-	memset(wanup_data, 0, sizeof(ipacm_event_iface_up));
-
-	if (iptype == IPA_IP_v4)
-	{
-		IPACM_Wan::wan_up = true;
-		active_v4 = true;
-		memcpy(IPACM_Wan::wan_up_dev_name,
-			dev_name,
-				sizeof(IPACM_Wan::wan_up_dev_name));
-
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			config_wan_firewall_rule(IPA_IP_v4);
-			install_wan_filtering_rule(false);
-		}
-		else
-		{
-			config_dft_firewall_rules(IPA_IP_v4);
-		}
-
-		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
-		wanup_data->ipv4_addr = wan_v4_addr;
-		if (m_is_sta_mode!=Q6_WAN)
-		{
-			wanup_data->is_sta = true;
-		}
-		else
-		{
-			wanup_data->is_sta = false;
-		}
-		IPACMDBG_H("Posting IPA_HANDLE_WAN_UP with below information:\n");
-		IPACMDBG_H("if_name:%s, ipv4_address:0x%x, is sta mode:%d\n",
-				wanup_data->ifname, wanup_data->ipv4_addr, wanup_data->is_sta);
-		memset(&evt_data, 0, sizeof(evt_data));
-
-		/* send xlat configuration for installing uplink rules */
-		if(is_xlat && (m_is_sta_mode == Q6_WAN))
-		{
-			IPACM_Wan::xlat_mux_id = ext_prop->ext[0].mux_id;
-			wanup_data->xlat_mux_id = IPACM_Wan::xlat_mux_id;
-			IPACMDBG_H("Set xlat configuraiton with below information:\n");
-			IPACMDBG_H("xlat_enabled:  xlat_mux_id: %d \n",
-					is_xlat, xlat_mux_id);
-		}
-		else
-		{
-			IPACM_Wan::xlat_mux_id = 0;
-			wanup_data->xlat_mux_id = 0;
-			IPACMDBG_H("No xlat configuratio:\n");
-		}
-		evt_data.event = IPA_HANDLE_WAN_UP;
-		evt_data.evt_data = (void *)wanup_data;
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
-	}
-	else
-	{
-		memcpy(backhaul_ipv6_prefix, ipv6_prefix, sizeof(backhaul_ipv6_prefix));
-		IPACMDBG_H("Setup backhaul ipv6 prefix to be 0x%08x%08x.\n", backhaul_ipv6_prefix[0], backhaul_ipv6_prefix[1]);
-
-		IPACM_Wan::wan_up_v6 = true;
-		active_v6 = true;
-		memcpy(IPACM_Wan::wan_up_dev_name,
-			dev_name,
-				sizeof(IPACM_Wan::wan_up_dev_name));
-
-		if(m_is_sta_mode == Q6_WAN)
-		{
-			config_wan_firewall_rule(IPA_IP_v6);
-			install_wan_filtering_rule(false);
-		}
-		else
-		{
-			config_dft_firewall_rules(IPA_IP_v6);
-		}
-
-		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
-		if (m_is_sta_mode!=Q6_WAN)
-		{
-			wanup_data->is_sta = true;
-		}
-		else
-		{
-			wanup_data->is_sta = false;
-		}
-		memcpy(wanup_data->ipv6_prefix, ipv6_prefix, sizeof(wanup_data->ipv6_prefix));
-		IPACMDBG_H("Posting IPA_HANDLE_WAN_UP_V6 with below information:\n");
-		IPACMDBG_H("if_name:%s, is sta mode: %d\n", wanup_data->ifname, wanup_data->is_sta);
-		IPACMDBG_H("ipv6 prefix: 0x%08x%08x.\n", ipv6_prefix[0], ipv6_prefix[1]);
-		memset(&evt_data, 0, sizeof(evt_data));
-		evt_data.event = IPA_HANDLE_WAN_UP_V6;
-		evt_data.evt_data = (void *)wanup_data;
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
-	}
-
-	/* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
-	IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-	IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-	IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
-	if(rt_rule != NULL)
-	{
-		free(rt_rule);
-	}
-	return IPACM_SUCCESS;
-}
-
-#ifdef FEATURE_IPA_ANDROID
-/* wan default route/filter rule configuration */
-int IPACM_Wan::post_wan_up_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether)
-{
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_iface_up_tehter *wanup_data;
-
-	wanup_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter));
-	if (wanup_data == NULL)
-	{
-		IPACMERR("Unable to allocate memory\n");
-		return IPACM_FAILURE;
-	}
-	memset(wanup_data, 0, sizeof(ipacm_event_iface_up_tehter));
-
-	wanup_data->if_index_tether = ipa_if_num_tether;
-	if (m_is_sta_mode!=Q6_WAN)
-	{
-		wanup_data->is_sta = true;
-	}
-	else
-	{
-		wanup_data->is_sta = false;
-	}
-	IPACMDBG_H("Posting IPA_HANDLE_WAN_UP_TETHER with below information:\n");
-	IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n",
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wanup_data->is_sta);
-	memset(&evt_data, 0, sizeof(evt_data));
-
-	if (iptype == IPA_IP_v4)
-	{
-		evt_data.event = IPA_HANDLE_WAN_UP_TETHER;
-		/* Add support tether ifaces to its array*/
-		IPACM_Wan::ipa_if_num_tether_v4[IPACM_Wan::ipa_if_num_tether_v4_total] = ipa_if_num_tether;
-		IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v4_total(%d) on wan_iface(%s)\n",
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name,
-			IPACM_Wan::ipa_if_num_tether_v4_total,
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-		IPACM_Wan::ipa_if_num_tether_v4_total++;
-	}
-	else
-	{
-		evt_data.event = IPA_HANDLE_WAN_UP_V6_TETHER;
-		memcpy(wanup_data->ipv6_prefix, ipv6_prefix, sizeof(wanup_data->ipv6_prefix));
-		/* Add support tether ifaces to its array*/
-		IPACM_Wan::ipa_if_num_tether_v6[IPACM_Wan::ipa_if_num_tether_v6_total] = ipa_if_num_tether;
-		IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v6_total(%d) on wan_iface(%s)\n",
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name,
-			IPACM_Wan::ipa_if_num_tether_v6_total,
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-		IPACM_Wan::ipa_if_num_tether_v6_total++;
-	}
-		evt_data.evt_data = (void *)wanup_data;
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-	return IPACM_SUCCESS;
-}
-
-/* wan default route/filter rule configuration */
-int IPACM_Wan::post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether)
-{
-	ipacm_cmd_q_data evt_data;
-	ipacm_event_iface_up_tehter *wandown_data;
-	int i, j;
-
-	wandown_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter));
-	if (wandown_data == NULL)
-	{
-		IPACMERR("Unable to allocate memory\n");
-		return IPACM_FAILURE;
-	}
-	memset(wandown_data, 0, sizeof(ipacm_event_iface_up_tehter));
-
-	wandown_data->if_index_tether = ipa_if_num_tether;
-	if (m_is_sta_mode!=Q6_WAN)
-	{
-		wandown_data->is_sta = true;
-	}
-	else
-	{
-		wandown_data->is_sta = false;
-	}
-	IPACMDBG_H("Posting IPA_HANDLE_WAN_DOWN_TETHER with below information:\n");
-	IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n",
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wandown_data->is_sta);
-	memset(&evt_data, 0, sizeof(evt_data));
-
-	if (iptype == IPA_IP_v4)
-	{
-		evt_data.event = IPA_HANDLE_WAN_DOWN_TETHER;
-		/* delete support tether ifaces to its array*/
-		for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
-		{
-			if(IPACM_Wan::ipa_if_num_tether_v4[i] == ipa_if_num_tether)
-			{
-				IPACMDBG_H("Found tether client at position %d name(%s)\n", i,
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
-				break;
-			}
-		}
-		if(i == IPACM_Wan::ipa_if_num_tether_v4_total)
-		{
-			IPACMDBG_H("Not finding the tether client.\n");
-			free(wandown_data);
-			return IPACM_SUCCESS;
-		}
-		for(j = i+1; j < IPACM_Wan::ipa_if_num_tether_v4_total; j++)
-		{
-			IPACM_Wan::ipa_if_num_tether_v4[j-1] = IPACM_Wan::ipa_if_num_tether_v4[j];
-		}
-		IPACM_Wan::ipa_if_num_tether_v4_total--;
-		IPACMDBG_H("Now the total num of ipa_if_num_tether_v4_total is %d on wan-iface(%s)\n",
-			IPACM_Wan::ipa_if_num_tether_v4_total,
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-	}
-	else
-	{
-		evt_data.event = IPA_HANDLE_WAN_DOWN_V6_TETHER;
-		/* delete support tether ifaces to its array*/
-		for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
-		{
-			if(IPACM_Wan::ipa_if_num_tether_v6[i] == ipa_if_num_tether)
-			{
-				IPACMDBG_H("Found tether client at position %d name(%s)\n", i,
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
-				break;
-			}
-		}
-		if(i == IPACM_Wan::ipa_if_num_tether_v6_total)
-		{
-			IPACMDBG_H("Not finding the tether client.\n");
-			free(wandown_data);
-			return IPACM_SUCCESS;
-		}
-		for(j = i+1; j < IPACM_Wan::ipa_if_num_tether_v6_total; j++)
-		{
-			IPACM_Wan::ipa_if_num_tether_v6[j-1] = IPACM_Wan::ipa_if_num_tether_v6[j];
-		}
-		IPACM_Wan::ipa_if_num_tether_v6_total--;
-		IPACMDBG_H("Now the total num of ipa_if_num_tether_v6_total is %d on wan-iface(%s)\n",
-			IPACM_Wan::ipa_if_num_tether_v6_total,
-			IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-	}
-		evt_data.evt_data = (void *)wandown_data;
-		IPACM_EvtDispatcher::PostEvt(&evt_data);
-	return IPACM_SUCCESS;
-}
-#endif
-
-/* construct complete ethernet header */
-int IPACM_Wan::handle_sta_header_add_evt()
-{
-	int res = IPACM_SUCCESS, index = IPACM_INVALID_INDEX;
-	if((header_set_v4 == true) || (header_set_v6 == true))
-	{
-		IPACMDBG_H("Already add STA full header\n");
-		return IPACM_SUCCESS;
-	}
-
-	/* checking if the ipv4 same as default route */
-	if(wan_v4_addr_gw_set)
-	{
-		index = get_wan_client_index_ipv4(wan_v4_addr_gw);
-		if (index != IPACM_INVALID_INDEX)
-		{
-			IPACMDBG_H("Matched client index: %d\n", index);
-			IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 get_client_memptr(wan_client, index)->mac[0],
-					 get_client_memptr(wan_client, index)->mac[1],
-					 get_client_memptr(wan_client, index)->mac[2],
-					 get_client_memptr(wan_client, index)->mac[3],
-					 get_client_memptr(wan_client, index)->mac[4],
-					 get_client_memptr(wan_client, index)->mac[5]);
-
-			if(get_client_memptr(wan_client, index)->ipv4_header_set)
-			{
-				hdr_hdl_sta_v4 = get_client_memptr(wan_client, index)->hdr_hdl_v4;
-				header_set_v4 = true;
-				IPACMDBG_H("add full ipv4 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v4);
-				/* store external_ap's MAC */
-				memcpy(ext_router_mac_addr, get_client_memptr(wan_client, index)->mac, sizeof(ext_router_mac_addr));
-			}
-			else
-			{
-				IPACMERR(" wan-client got ipv4 however didn't construct complete ipv4 header \n");
-				return IPACM_FAILURE;
-			}
-
-			if(get_client_memptr(wan_client, index)->ipv6_header_set)
-			{
-				hdr_hdl_sta_v6 = get_client_memptr(wan_client, index)->hdr_hdl_v6;
-				header_set_v6 = true;
-				IPACMDBG_H("add full ipv6 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v6);
-			}
-			else
-			{
-				IPACMERR(" wan-client got ipv6 however didn't construct complete ipv6 header \n");
-				return IPACM_FAILURE;
-			}
-		}
-		else
-		{
-			IPACMDBG_H(" currently can't find matched wan-client's MAC-addr, waiting for header construction\n");
-			return IPACM_SUCCESS;
-		}
-	}
-
-	/* checking if the ipv4 same as default route */
-	if(wan_v6_addr_gw_set)
-	{
-		index = get_wan_client_index_ipv6(wan_v6_addr_gw);
-		if (index != IPACM_INVALID_INDEX)
-		{
-			IPACMDBG_H("Matched client index: %d\n", index);
-			IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 get_client_memptr(wan_client, index)->mac[0],
-					 get_client_memptr(wan_client, index)->mac[1],
-					 get_client_memptr(wan_client, index)->mac[2],
-					 get_client_memptr(wan_client, index)->mac[3],
-					 get_client_memptr(wan_client, index)->mac[4],
-					 get_client_memptr(wan_client, index)->mac[5]);
-
-			if(get_client_memptr(wan_client, index)->ipv6_header_set)
-			{
-				hdr_hdl_sta_v6 = get_client_memptr(wan_client, index)->hdr_hdl_v6;
-				header_set_v6 = true;
-				IPACMDBG_H("add full ipv6 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v6);
-				/* store external_ap's MAC */
-				memcpy(ext_router_mac_addr, get_client_memptr(wan_client, index)->mac, sizeof(ext_router_mac_addr));
-			}
-			else
-			{
-				IPACMERR(" wan-client got ipv6 however didn't construct complete ipv4 header \n");
-				return IPACM_FAILURE;
-			}
-
-			if(get_client_memptr(wan_client, index)->ipv4_header_set)
-			{
-				hdr_hdl_sta_v4 = get_client_memptr(wan_client, index)->hdr_hdl_v4;
-				header_set_v4 = true;
-				IPACMDBG_H("add full ipv4 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v4);
-			}
-			else
-			{
-				IPACMERR(" wan-client got ipv4 however didn't construct complete ipv4 header \n");
-				return IPACM_FAILURE;
-			}
-		}
-		else
-		{
-			IPACMDBG_H(" currently can't find matched wan-client's MAC-addr, waiting for header construction\n");
-			return IPACM_SUCCESS;
-		}
-	}
-
-	/* see if default routes are setup before constructing full header */
-	if(header_partial_default_wan_v4 == true)
-	{
-	   handle_route_add_evt(IPA_IP_v4);
-	}
-
-	if(header_partial_default_wan_v6 == true)
-	{
-	   handle_route_add_evt(IPA_IP_v6);
-	}
-	return res;
-}
-
-/* For checking attribute mask field in firewall rules for IPv6 only */
-bool IPACM_Wan::check_dft_firewall_rules_attr_mask(IPACM_firewall_conf_t *firewall_config)
-{
-	uint32_t attrib_mask = 0ul;
-	attrib_mask =	IPA_FLT_SRC_PORT_RANGE |
-			IPA_FLT_DST_PORT_RANGE |
-			IPA_FLT_TYPE |
-			IPA_FLT_CODE |
-			IPA_FLT_SPI |
-			IPA_FLT_SRC_PORT |
-			IPA_FLT_DST_PORT;
-
-	for (int i = 0; i < firewall_config->num_extd_firewall_entries; i++)
-	{
-		if (firewall_config->extd_firewall_entries[i].ip_vsn == 6)
-		{
-			if (firewall_config->extd_firewall_entries[i].attrib.attrib_mask & attrib_mask)
-			{
-				IPACMDBG_H("IHL based attribute mask is found: install IPv6 frag firewall rule \n");
-				return true;
-			}
-		}
-	}
-	IPACMDBG_H("IHL based attribute mask is not found: no IPv6 frag firewall rule \n");
-	return false;
-}
-
-/* for STA mode: add firewall rules */
-int IPACM_Wan::config_dft_firewall_rules(ipa_ip_type iptype)
-{
-	struct ipa_flt_rule_add flt_rule_entry;
-	int i, rule_v4 = 0, rule_v6 = 0, len;
-
-	IPACMDBG_H("ip-family: %d; \n", iptype);
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("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));
-	strlcpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file));
-
-	IPACMDBG_H("Firewall XML file is %s \n", firewall_config.firewall_config_file);
-	if (IPACM_SUCCESS == IPACM_read_firewall_xml(firewall_config.firewall_config_file, &firewall_config))
-	{
-		IPACMDBG_H("QCMAP Firewall XML read OK \n");
-		/* find the number of v4/v6 firewall rules */
-		for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
-		{
-			if (firewall_config.extd_firewall_entries[i].ip_vsn == 4)
-			{
-				rule_v4++;
-			}
-			else
-			{
-				rule_v6++;
-			}
-		}
-		IPACMDBG_H("firewall rule v4:%d v6:%d total:%d\n", rule_v4, rule_v6, firewall_config.num_extd_firewall_entries);
-	}
-	else
-	{
-		IPACMERR("QCMAP Firewall XML read failed, no that file, use default configuration \n");
-	}
-
-	/* construct ipa_ioc_add_flt_rule with N firewall rules */
-	ipa_ioc_add_flt_rule *m_pFilteringTable = NULL;
-	len = sizeof(struct ipa_ioc_add_flt_rule) + 1 * sizeof(struct ipa_flt_rule_add);
-	m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len);
-	if (!m_pFilteringTable)
-	{
-		IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-		return IPACM_FAILURE;
-	}
-
-	if(iptype == IPA_IP_v6 &&
-			firewall_config.firewall_enable == true &&
-			check_dft_firewall_rules_attr_mask(&firewall_config))
-	{
-		m_pFilteringTable->commit = 1;
-		m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-		m_pFilteringTable->global = false;
-		m_pFilteringTable->ip = IPA_IP_v6;
-		m_pFilteringTable->num_rules = (uint8_t)1;
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-		flt_rule_entry.at_rear = true;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = false;
-		flt_rule_entry.rule.hashable = false;
-#endif
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-		memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(struct ipa_rule_attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
-		memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-		{
-			IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-			free(m_pFilteringTable);
-			return IPACM_FAILURE;
-		}
-		else
-		{
-			IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-			ipv6_frag_firewall_flt_rule_hdl = m_pFilteringTable->rules[0].flt_rule_hdl;
-			is_ipv6_frag_firewall_flt_rule_installed = true;
-			IPACMDBG_H("Installed IPv6 frag firewall rule, handle %d.\n", ipv6_frag_firewall_flt_rule_hdl);
-		}
-	}
-
-	if (iptype == IPA_IP_v4)
-	{
-		if (rule_v4 == 0)
-		{
-			memset(m_pFilteringTable, 0, len);
-
-			m_pFilteringTable->commit = 1;
-			m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-			m_pFilteringTable->global = false;
-			m_pFilteringTable->ip = IPA_IP_v4;
-			m_pFilteringTable->num_rules = (uint8_t)1;
-
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4))
-			{
-				IPACMERR("m_routing.GetRoutingTable(rt_tbl_lan_v4) Failed.\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-
-			/* firewall disable, all traffic are allowed */
-			if(firewall_config.firewall_enable == true)
-			{
-				flt_rule_entry.at_rear = true;
-
-				/* default action for v4 is go DST_NAT unless user set to exception*/
-				if(firewall_config.rule_action_accept == true)
-				{
-					flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-				}
-				else
-				{
-					if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-					}
-					else
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-					}
-				}
-			}
-			else
-			{
-				flt_rule_entry.at_rear = true;
-				if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-				{
-					flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-				}
-				else
-				{
-					flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-				}
-            }
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.at_rear = true;
-			flt_rule_entry.rule.hashable = true;
-#endif
-			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
-			memcpy(&flt_rule_entry.rule.attrib,
-						 &rx_prop->rx[0].attrib,
-						 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000;
-
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-
-			/* copy filter hdls */
-			dft_wan_fl_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-		else
-		{
-			memset(m_pFilteringTable, 0, len);
-
-			m_pFilteringTable->commit = 1;
-			m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-			m_pFilteringTable->global = false;
-			m_pFilteringTable->ip = IPA_IP_v4;
-			m_pFilteringTable->num_rules = (uint8_t)1;
-
-			IPACMDBG_H("Retreiving Routing handle for routing table name:%s\n",
-							 IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name);
-			if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4))
-			{
-				IPACMERR("m_routing.GetRoutingTable(&rt_tbl_lan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_lan_v4);
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			IPACMDBG_H("Routing handle for wan routing table:0x%x\n", IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl);
-
-            if(firewall_config.firewall_enable == true)
-            {
-			rule_v4 = 0;
-			for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
-			{
-				if (firewall_config.extd_firewall_entries[i].ip_vsn == 4)
-				{
-					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		    			flt_rule_entry.at_rear = true;
-					flt_rule_entry.flt_rule_hdl = -1;
-					flt_rule_entry.status = -1;
-					flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
-
-					/* Accept v4 matched rules*/
-                    if(firewall_config.rule_action_accept == true)
-			        {
-						if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-						{
-							flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-						}
-						else
-						{
-							flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-						}
-			        }
-			        else
-			        {
-			            flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-                    }
-#ifdef FEATURE_IPA_V3
-					flt_rule_entry.rule.hashable = true;
-#endif
-					memcpy(&flt_rule_entry.rule.attrib,
-								 &firewall_config.extd_firewall_entries[i].attrib,
-								 sizeof(struct ipa_rule_attrib));
-
-					IPACMDBG_H("rx property attrib mask: 0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
-					flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask;
-					flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask;
-					flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data;
-
-					/* check if the rule is define as TCP_UDP, split into 2 rules, 1 for TCP and 1 UDP */
-					if (firewall_config.extd_firewall_entries[i].attrib.u.v4.protocol
-							== IPACM_FIREWALL_IPPROTO_TCP_UDP)
-					{
-						/* insert TCP rule*/
-						flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_TCP;
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n",
-										 m_pFilteringTable->rules[0].rule.attrib.attrib_mask);
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-							/* save v4 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n",
-											 m_pFilteringTable->rules[rule_v4].flt_rule_hdl,
-											 m_pFilteringTable->rules[rule_v4].status);
-							firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v4++;
-							rule_v4++;
-						}
-
-						/* insert UDP rule*/
-						flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_UDP;
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n",
-										 m_pFilteringTable->rules[0].rule.attrib.attrib_mask);
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-							/* save v4 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n",
-											 m_pFilteringTable->rules[rule_v4].flt_rule_hdl,
-											 m_pFilteringTable->rules[rule_v4].status);
-							firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v4++;
-							rule_v4++;
-						}
-					}
-					else
-					{
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n",
-										 m_pFilteringTable->rules[0].rule.attrib.attrib_mask);
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-							/* save v4 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n",
-											 m_pFilteringTable->rules[rule_v4].flt_rule_hdl,
-											 m_pFilteringTable->rules[rule_v4].status);
-							firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v4++;
-							rule_v4++;
-						}
-					}
-				}
-			} /* end of firewall ipv4 filter rule add for loop*/
-            }
-			/* configure default filter rule */
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-
-			/* firewall disable, all traffic are allowed */
-            if(firewall_config.firewall_enable == true)
-			{
-			     flt_rule_entry.at_rear = true;
-
-			     /* default action for v4 is go DST_NAT unless user set to exception*/
-                             if(firewall_config.rule_action_accept == true)
-			     {
-			        flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-			     }
-			     else
-			     {
-					if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-					}
-					else
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-					}
-				}
-		    }
-			else
-			{
-			    flt_rule_entry.at_rear = true;
-				if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER)
-				{
-					flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-				}
-				else
-				{
-					flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-				}
-            }
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
-			memcpy(&flt_rule_entry.rule.attrib,
-						 &rx_prop->rx[0].attrib,
-						 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000;
-
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			IPACMDBG_H("Filter rule attrib mask: 0x%x\n",
-							 m_pFilteringTable->rules[0].rule.attrib.attrib_mask);
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-
-			/* copy filter hdls */
-			dft_wan_fl_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-
-	}
-	else
-	{
-		if (rule_v6 == 0)
-		{
-			memset(m_pFilteringTable, 0, len);
-
-			m_pFilteringTable->commit = 1;
-			m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-			m_pFilteringTable->global = false;
-			m_pFilteringTable->ip = IPA_IP_v6;
-			m_pFilteringTable->num_rules = (uint8_t)1;
-
-			/* Construct ICMP rule */
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-			flt_rule_entry.at_rear = true;
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.retain_hdr = 1;
-			flt_rule_entry.rule.eq_attrib_type = 0;
-			flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-			memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
-			flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6;
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding Filtering rules, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-			/* copy filter hdls */
-			dft_wan_fl_hdl[2] = m_pFilteringTable->rules[0].flt_rule_hdl;
-
-			/* End of construct ICMP rule */
-
-			/* v6 default route */
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-			if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v6)) //rt_tbl_wan_v6 rt_tbl_v6
-			{
-				IPACMERR("m_routing.GetRoutingTable(rt_tbl_wan_v6) Failed.\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl;
-
-			/* firewall disable, all traffic are allowed */
-                        if(firewall_config.firewall_enable == true)
-			{
-			   flt_rule_entry.at_rear = true;
-
-			   /* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
-                           if(firewall_config.rule_action_accept == true)
-			   {
-			       flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-			   }
-			   else
-			   {
-			       flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-                           }
-		        }
-			else
-			{
-			  flt_rule_entry.at_rear = true;
-			  flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-                        }
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-			memcpy(&flt_rule_entry.rule.attrib,
-						 &rx_prop->rx[0].attrib,
-						 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding Filtering rules, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-
-			/* copy filter hdls */
-			dft_wan_fl_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-		else
-		{
-			memset(m_pFilteringTable, 0, len);
-
-			m_pFilteringTable->commit = 1;
-			m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
-			m_pFilteringTable->global = false;
-			m_pFilteringTable->ip = IPA_IP_v6;
-			m_pFilteringTable->num_rules = (uint8_t)1;
-
-			if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v6))
-			{
-				IPACMERR("m_routing.GetRoutingTable(rt_tbl_wan_v6) Failed.\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-
-            if(firewall_config.firewall_enable == true)
-            {
-			rule_v6 = 0;
-			for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
-			{
-				if (firewall_config.extd_firewall_entries[i].ip_vsn == 6)
-				{
-					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		    			flt_rule_entry.at_rear = true;
-					flt_rule_entry.flt_rule_hdl = -1;
-					flt_rule_entry.status = -1;
-
-				    /* matched rules for v6 go PASS_TO_ROUTE */
-                                    if(firewall_config.rule_action_accept == true)
-			            {
-			                flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-			            }
-			            else
-			            {
-					flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-                                    }
-#ifdef FEATURE_IPA_V3
-					flt_rule_entry.rule.hashable = true;
-#endif
-		    			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl;
-					memcpy(&flt_rule_entry.rule.attrib,
-								 &firewall_config.extd_firewall_entries[i].attrib,
-								 sizeof(struct ipa_rule_attrib));
-					flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask;
-					flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask;
-					flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data;
-
-					/* check if the rule is define as TCP/UDP */
-					if (firewall_config.extd_firewall_entries[i].attrib.u.v6.next_hdr == IPACM_FIREWALL_IPPROTO_TCP_UDP)
-					{
-						/* insert TCP rule*/
-						flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_TCP;
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding Filtering rules, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-							/* save v4 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-							firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v6++;
-							rule_v6++;
-						}
-
-						/* insert UDP rule*/
-						flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_UDP;
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding Filtering rules, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-							/* save v6 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-							firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v6++;
-							rule_v6++;
-						}
-					}
-					else
-					{
-						memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-						{
-							IPACMERR("Error Adding Filtering rules, aborting...\n");
-							free(m_pFilteringTable);
-							return IPACM_FAILURE;
-						}
-						else
-						{
-							IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-							/* save v6 firewall filter rule handler */
-							IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-							firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl;
-							num_firewall_v6++;
-							rule_v6++;
-						}
-					}
-				}
-			} /* end of firewall ipv6 filter rule add for loop*/
-            }
-
-			/* Construct ICMP rule */
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-			flt_rule_entry.at_rear = true;
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.retain_hdr = 1;
-			flt_rule_entry.rule.eq_attrib_type = 0;
-			flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-			memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
-			flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6;
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding Filtering rules, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-			/* copy filter hdls */
-			dft_wan_fl_hdl[2] = m_pFilteringTable->rules[0].flt_rule_hdl;
-			/* End of construct ICMP rule */
-
-			/* setup default wan filter rule */
-			memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-			flt_rule_entry.flt_rule_hdl = -1;
-			flt_rule_entry.status = -1;
-			flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl;
-
-			/* firewall disable, all traffic are allowed */
-                        if(firewall_config.firewall_enable == true)
-			{
-			   flt_rule_entry.at_rear = true;
-
-			   /* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
-               if(firewall_config.rule_action_accept == true)
-			   {
-			        flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-			   }
-			   else
-			   {
-			flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-                           }
-		        }
-			else
-			{
-			  flt_rule_entry.at_rear = true;
-			  flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-                        }
-#ifdef FEATURE_IPA_V3
-			flt_rule_entry.rule.hashable = true;
-#endif
-			memcpy(&flt_rule_entry.rule.attrib,
-						 &rx_prop->rx[0].attrib,
-						 sizeof(struct ipa_rule_attrib));
-			flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-			flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-
-			memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-			if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
-			{
-				IPACMERR("Error Adding Filtering rules, aborting...\n");
-				free(m_pFilteringTable);
-				return IPACM_FAILURE;
-			}
-			else
-			{
-				IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-				IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status);
-			}
-			/* copy filter hdls*/
-			dft_wan_fl_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl;
-		}
-	}
-
-	if(m_pFilteringTable != NULL)
-	{
-		free(m_pFilteringTable);
-	}
-	return IPACM_SUCCESS;
-}
-
-/* configure the initial firewall filter rules */
-int IPACM_Wan::config_dft_firewall_rules_ex(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype)
-{
-	struct ipa_flt_rule_add flt_rule_entry;
-	int i;
-	int num_rules = 0, original_num_rules = 0;
-	ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
-	ipa_ioc_generate_flt_eq flt_eq;
-	int pos = rule_offset;
-
-	IPACMDBG_H("ip-family: %d; \n", iptype);
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if(rules == NULL || rule_offset < 0)
-	{
-		IPACMERR("No filtering table is available.\n");
-		return IPACM_FAILURE;
-	}
-
-	/* default firewall is disable and the rule action is drop */
-	memset(&firewall_config, 0, sizeof(firewall_config));
-	strlcpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file));
-
-	IPACMDBG_H("Firewall XML file is %s \n", firewall_config.firewall_config_file);
-	if (IPACM_SUCCESS == IPACM_read_firewall_xml(firewall_config.firewall_config_file, &firewall_config))
-	{
-		IPACMDBG_H("QCMAP Firewall XML read OK \n");
-	}
-	else
-	{
-		IPACMERR("QCMAP Firewall XML read failed, no that file, use default configuration \n");
-	}
-
-	/* add IPv6 frag rule when firewall is enabled*/
-	if(iptype == IPA_IP_v6 &&
-			firewall_config.firewall_enable == true &&
-			check_dft_firewall_rules_attr_mask(&firewall_config))
-	{
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-		flt_rule_entry.at_rear = true;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = false;
-#endif
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.at_rear = false;
-		flt_rule_entry.rule.hashable = false;
-#endif
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		rt_tbl_idx.ip = IPA_IP_v6;
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			return IPACM_FAILURE;
-		}
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-		IPACMDBG_H("IPv6 frag flt rule uses routing table index %d\n", rt_tbl_idx.idx);
-
-		flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask;
-		flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask;
-		flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data;
-
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
-
-		change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = IPA_IP_v6;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			return IPACM_FAILURE;
-		}
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-			&flt_eq.eq_attrib,
-			sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		pos++;
-		IPACM_Wan::num_v6_flt_rule++;
-	}
-
-	if (iptype == IPA_IP_v4)
-	{
-		original_num_rules = IPACM_Wan::num_v4_flt_rule;
-		if(firewall_config.firewall_enable == true)
-		{
-			for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
-			{
-				if (firewall_config.extd_firewall_entries[i].ip_vsn == 4)
-				{
-					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-					flt_rule_entry.at_rear = true;
-					flt_rule_entry.flt_rule_hdl = -1;
-					flt_rule_entry.status = -1;
-
-					flt_rule_entry.rule.retain_hdr = 1;
-					flt_rule_entry.rule.to_uc = 0;
-					flt_rule_entry.rule.eq_attrib_type = 1;
-
-					/* Accept v4 matched rules*/
-					if(firewall_config.rule_action_accept == true)
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-					}
-					else
-					{
-						flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-					}
-#ifdef FEATURE_IPA_V3
-					flt_rule_entry.rule.hashable = true;
-#endif
-					memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-					rt_tbl_idx.ip = iptype;
-					if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING)
-					{
-						strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-					}
-					else /*pass to dst nat*/
-					{
-						strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, IPA_RESOURCE_NAME_MAX);
-					}
-					rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-					if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-					{
-						IPACMERR("Failed to get routing table index from name\n");
-						return IPACM_FAILURE;
-					}
-					flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-					IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-					memcpy(&flt_rule_entry.rule.attrib,
-						&firewall_config.extd_firewall_entries[i].attrib,
-						sizeof(struct ipa_rule_attrib));
-
-					flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask;
-					flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask;
-					flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data;
-
-					change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib);
-
-					/* check if the rule is define as TCP_UDP, split into 2 rules, 1 for TCP and 1 UDP */
-					if (firewall_config.extd_firewall_entries[i].attrib.u.v4.protocol == IPACM_FIREWALL_IPPROTO_TCP_UDP)
-					{
-						/* insert TCP rule*/
-						flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_TCP;
-
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask);
-						pos++;
-						num_firewall_v4++;
-						IPACM_Wan::num_v4_flt_rule++;
-
-						/* insert UDP rule*/
-						flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_UDP;
-
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask);
-						pos++;
-						num_firewall_v4++;
-						IPACM_Wan::num_v4_flt_rule++;
-					}
-					else
-					{
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask);
-						pos++;
-						num_firewall_v4++;
-						IPACM_Wan::num_v4_flt_rule++;
-					}
-				}
-			} /* end of firewall ipv4 filter rule add for loop*/
-		}
-		/* configure default filter rule */
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-
-		/* firewall disable, all traffic are allowed */
-		if(firewall_config.firewall_enable == true)
-		{
-			/* default action for v4 is go DST_NAT unless user set to exception*/
-			if(firewall_config.rule_action_accept == true)
-			{
-				flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-			}
-			else
-			{
-				flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-			}
-		}
-		else
-		{
-			if(isWan_Bridge_Mode())
-			{
-				IPACMDBG_H("ODU is in bridge mode. \n");
-				flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-			}
-			else
-			{
-				flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
-			}
-		}
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		rt_tbl_idx.ip = iptype;
-
-		if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING)
-		{
-			strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		}
-		else /*pass to dst nat*/
-		{
-			strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, IPA_RESOURCE_NAME_MAX);
-		}
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			return IPACM_FAILURE;
-		}
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		memcpy(&flt_rule_entry.rule.attrib,
-			&rx_prop->rx[0].attrib,
-			sizeof(struct ipa_rule_attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000;
-
-		change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			return IPACM_FAILURE;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-			&flt_eq.eq_attrib,
-			sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		IPACMDBG_H("Filter rule attrib mask: 0x%x\n",	rules[pos].rule.attrib.attrib_mask);
-		pos++;
-		num_firewall_v4++;
-		IPACM_Wan::num_v4_flt_rule++;
-
-		num_rules = IPACM_Wan::num_v4_flt_rule - original_num_rules - 1;
-	}
-	else
-	{
-		original_num_rules = IPACM_Wan::num_v6_flt_rule;
-
-		if(firewall_config.firewall_enable == true)
-		{
-			for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
-			{
-				if (firewall_config.extd_firewall_entries[i].ip_vsn == 6)
-				{
-					memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-					flt_rule_entry.at_rear = true;
-					flt_rule_entry.flt_rule_hdl = -1;
-					flt_rule_entry.status = -1;
-
-					flt_rule_entry.rule.retain_hdr = 1;
-					flt_rule_entry.rule.to_uc = 0;
-					flt_rule_entry.rule.eq_attrib_type = 1;
-					flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-					flt_rule_entry.rule.hashable = true;
-#endif
-					memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-					rt_tbl_idx.ip = iptype;
-
-					/* matched rules for v6 go PASS_TO_ROUTE */
-					if(firewall_config.rule_action_accept == true)
-					{
-						strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
-					}
-					else
-					{
-						strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-					}
-					rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-
-					if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-					{
-						IPACMERR("Failed to get routing table index from name\n");
-						return IPACM_FAILURE;
-					}
-					flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-					IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-					memcpy(&flt_rule_entry.rule.attrib,
-						&firewall_config.extd_firewall_entries[i].attrib,
-						sizeof(struct ipa_rule_attrib));
-
-					flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask;
-					flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask;
-					flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data;
-
-					change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-					/* check if the rule is define as TCP/UDP */
-					if (firewall_config.extd_firewall_entries[i].attrib.u.v6.next_hdr == IPACM_FIREWALL_IPPROTO_TCP_UDP)
-					{
-						/* insert TCP rule*/
-						flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_TCP;
-
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						pos++;
-						num_firewall_v6++;
-						IPACM_Wan::num_v6_flt_rule++;
-
-						/* insert UDP rule*/
-						flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_UDP;
-
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						pos++;
-						num_firewall_v6++;
-						IPACM_Wan::num_v6_flt_rule++;
-					}
-					else
-					{
-						memset(&flt_eq, 0, sizeof(flt_eq));
-						memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-						flt_eq.ip = iptype;
-						if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-						{
-							IPACMERR("Failed to get eq_attrib\n");
-							return IPACM_FAILURE;
-						}
-
-						memcpy(&flt_rule_entry.rule.eq_attrib,
-							&flt_eq.eq_attrib,
-							sizeof(flt_rule_entry.rule.eq_attrib));
-						memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-						pos++;
-						num_firewall_v6++;
-						IPACM_Wan::num_v6_flt_rule++;
-					}
-				}
-			} /* end of firewall ipv6 filter rule add for loop*/
-		}
-
-		/* setup default wan filter rule */
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		rt_tbl_idx.ip = iptype;
-		/* firewall disable, all traffic are allowed */
-		if(firewall_config.firewall_enable == true)
-		{
-			/* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
-			if(firewall_config.rule_action_accept == true)
-			{
-				strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-			}
-			else
-			{
-				strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
-			}
-		}
-		else
-		{
-			strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
-		}
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			return IPACM_FAILURE;
-		}
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		memcpy(&flt_rule_entry.rule.attrib,
-			&rx_prop->rx[1].attrib,
-			sizeof(struct ipa_rule_attrib));
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-
-		change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			return IPACM_FAILURE;
-		}
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-			&flt_eq.eq_attrib,
-			sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		pos++;
-		num_firewall_v6++;
-		IPACM_Wan::num_v6_flt_rule++;
-
-		num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules - 1;
-	}
-	IPACMDBG_H("Constructed %d firewall rules for ip type %d\n", num_rules, iptype);
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype)
-{
-	int res = IPACM_SUCCESS;
-
-	char *dev_wlan0="wlan0";
-	char *dev_wlan1="wlan1";
-	char *dev_ecm0="ecm0";
-
-	/* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */
-	IPACMDBG_H(" dun add producer dependency from %s with registered rx-prop\n", dev_name);
-
-	if(iptype == IPA_IP_v4)
-	{
-		if(modem_ipv4_pdn_index == 0)	/* install ipv4 default modem DL filtering rules only once */
-		{
-			/* reset the num_v4_flt_rule*/
-			IPACM_Wan::num_v4_flt_rule = 0;
-			add_dft_filtering_rule(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4);
-		}
-	}
-	else if(iptype == IPA_IP_v6)
-	{
-		if(modem_ipv6_pdn_index == 0)	/* install ipv6 default modem DL filtering rules only once */
-		{
-			/* reset the num_v6_flt_rule*/
-			IPACM_Wan::num_v6_flt_rule = 0;
-			add_dft_filtering_rule(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6);
-		}
-	}
-	else
-	{
-		IPACMERR("IP type is not expected.\n");
-		res = IPACM_FAILURE;
-		goto fail;
-	}
-	install_wan_filtering_rule(false);
-
-fail:
-	return res;
-}
-
-int IPACM_Wan::add_icmp_alg_rules(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype)
-{
-	int res = IPACM_SUCCESS, i, original_num_rules = 0, num_rules = 0;
-	struct ipa_flt_rule_add flt_rule_entry;
-	IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg;
-	ipa_ioc_generate_flt_eq flt_eq;
-	ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
-
-	if(rules == NULL || rule_offset < 0)
-	{
-		IPACMERR("No filtering table is available.\n");
-		return IPACM_FAILURE;
-	}
-
-	if(iptype == IPA_IP_v4)
-	{
-		original_num_rules = IPACM_Wan::num_v4_flt_rule;
-
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACMDBG_H("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx);
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		/* Configuring ICMP filtering rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* Multiple PDNs may exist so keep meta-data */
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL;
-		flt_rule_entry.rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP;
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		IPACM_Wan::num_v4_flt_rule++;
-
-		/* Configure ALG filtering rules */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* remove meta data mask */
-		flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_SRC_PORT;
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL;
-		for(i = 0; i < ipacm_config->ipa_num_alg_ports; i++)
-		{
-			flt_rule_entry.rule.attrib.src_port = ipacm_config->alg_table[i].port;
-			flt_rule_entry.rule.attrib.u.v4.protocol = ipacm_config->alg_table[i].protocol;
-
-			memset(&flt_eq, 0, sizeof(flt_eq));
-			memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-			flt_eq.ip = iptype;
-			if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-			{
-				IPACMERR("Failed to get eq_attrib\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-			memcpy(&flt_rule_entry.rule.eq_attrib,
-						 &flt_eq.eq_attrib,
-						 sizeof(flt_rule_entry.rule.eq_attrib));
-			memcpy(&(rules[rule_offset + 1 + i]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-			IPACM_Wan::num_v4_flt_rule++;
-		}
-
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* remove meta data mask */
-		flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_PORT;
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL;
-		for(i = 0; i < ipacm_config->ipa_num_alg_ports; i++)
-		{
-			flt_rule_entry.rule.attrib.dst_port = ipacm_config->alg_table[i].port;
-			flt_rule_entry.rule.attrib.u.v4.protocol = ipacm_config->alg_table[i].protocol;
-
-			memset(&flt_eq, 0, sizeof(flt_eq));
-			memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-			flt_eq.ip = iptype;
-			if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-			{
-				IPACMERR("Failed to get eq_attrib\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-
-			memcpy(&flt_rule_entry.rule.eq_attrib,
-						 &flt_eq.eq_attrib,
-						 sizeof(flt_rule_entry.rule.eq_attrib));
-
-			memcpy(&(rules[rule_offset + ipacm_config->ipa_num_alg_ports + 1 + i]),
-				&flt_rule_entry,
-				sizeof(struct ipa_flt_rule_add));
-			IPACM_Wan::num_v4_flt_rule++;
-		}
-		num_rules = IPACM_Wan::num_v4_flt_rule - original_num_rules;
-	}
-	else /* IPv6 case */
-	{
-		original_num_rules = IPACM_Wan::num_v6_flt_rule;
-
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACMDBG_H("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx);
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		/* Configuring ICMP filtering rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[1].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* Multiple PDNs may exist so keep meta-data */
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
-		flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6;
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		IPACM_Wan::num_v6_flt_rule++;
-
-		num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules;
-	}
-
-fail:
-	IPACMDBG_H("Constructed %d ICMP/ALG rules for ip type %d\n", num_rules, iptype);
-		return res;
-}
-
-int IPACM_Wan::query_ext_prop()
-{
-	int fd, ret = IPACM_SUCCESS, cnt;
-
-	if (iface_query->num_ext_props > 0)
-	{
-		fd = open(IPA_DEVICE_NAME, O_RDWR);
-		IPACMDBG_H("iface query-property \n");
-		if (0 == fd)
-		{
-			IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
-			return IPACM_FAILURE;
-		}
-
-		ext_prop = (struct ipa_ioc_query_intf_ext_props *)
-			 calloc(1, sizeof(struct ipa_ioc_query_intf_ext_props) +
-							iface_query->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop));
-		if(ext_prop == NULL)
-		{
-			IPACMERR("Unable to allocate memory.\n");
-			return IPACM_FAILURE;
-		}
-		memcpy(ext_prop->name, dev_name,
-					 sizeof(dev_name));
-		ext_prop->num_ext_props = iface_query->num_ext_props;
-
-		IPACMDBG_H("Query extended property for iface %s\n", ext_prop->name);
-
-		ret = ioctl(fd, IPA_IOC_QUERY_INTF_EXT_PROPS, ext_prop);
-		if (ret < 0)
-		{
-			IPACMERR("ioctl IPA_IOC_QUERY_INTF_EXT_PROPS failed\n");
-			/* ext_prop memory will free when iface-down*/
-			free(ext_prop);
-			close(fd);
-			return ret;
-		}
-
-		IPACMDBG_H("Wan interface has %d tx props, %d rx props and %d ext props\n",
-				iface_query->num_tx_props, iface_query->num_rx_props, iface_query->num_ext_props);
-
-		for (cnt = 0; cnt < ext_prop->num_ext_props; cnt++)
-		{
-#ifndef FEATURE_IPA_V3
-			IPACMDBG_H("Ex(%d): ip-type: %d, mux_id: %d, flt_action: %d\n, rt_tbl_idx: %d, is_xlat_rule: %d flt_hdl: %d\n",
-				cnt, ext_prop->ext[cnt].ip, ext_prop->ext[cnt].mux_id, ext_prop->ext[cnt].action,
-				ext_prop->ext[cnt].rt_tbl_idx, ext_prop->ext[cnt].is_xlat_rule, ext_prop->ext[cnt].filter_hdl);
-#else /* defined (FEATURE_IPA_V3) */
-			IPACMDBG_H("Ex(%d): ip-type: %d, mux_id: %d, flt_action: %d\n, rt_tbl_idx: %d, is_xlat_rule: %d rule_id: %d\n",
-				cnt, ext_prop->ext[cnt].ip, ext_prop->ext[cnt].mux_id, ext_prop->ext[cnt].action,
-				ext_prop->ext[cnt].rt_tbl_idx, ext_prop->ext[cnt].is_xlat_rule, ext_prop->ext[cnt].rule_id);
-#endif
-		}
-
-		if(IPACM_Wan::is_ext_prop_set == false)
-		{
-			IPACM_Iface::ipacmcfg->SetExtProp(ext_prop);
-			IPACM_Wan::is_ext_prop_set = true;
-		}
-		close(fd);
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Wan::config_wan_firewall_rule(ipa_ip_type iptype)
-{
-	int res = IPACM_SUCCESS;
-
-	IPACMDBG_H("Configure WAN DL firewall rules.\n");
-
-	if(iptype == IPA_IP_v4)
-	{
-		IPACM_Wan::num_v4_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4;
-		if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4))
-		{
-			IPACMERR("Failed to add ICMP and ALG port filtering rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Succeded in constructing ICMP/ALG rules for ip type %d\n", iptype);
-
-		if(IPACM_FAILURE == config_dft_firewall_rules_ex(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4))
-		{
-			IPACMERR("Failed to add firewall filtering rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Succeded in constructing firewall rules for ip type %d\n", iptype);
-	}
-	else if(iptype == IPA_IP_v6)
-	{
-		IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
-		if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6))
-		{
-			IPACMERR("Failed to add ICMP and ALG port filtering rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Succeded in constructing ICMP/ALG rules for ip type %d\n", iptype);
-
-		if(IPACM_FAILURE == config_dft_firewall_rules_ex(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6))
-		{
-			IPACMERR("Failed to add firewall filtering rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Succeded in constructing firewall rules for ip type %d\n", iptype);
-	}
-	else
-	{
-		IPACMERR("IP type is not expected.\n");
-		return IPACM_FAILURE;
-	}
-
-fail:
-	return res;
-}
-
-int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype)
-{
-	struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
-	struct ipa_flt_rule_add flt_rule_entry;
-	struct ipa_ioc_generate_flt_eq flt_eq;
-	int res = IPACM_SUCCESS;
-
-	if(rules == NULL)
-	{
-		IPACMERR("No filtering table available.\n");
-		return IPACM_FAILURE;
-	}
-	if(rx_prop == NULL)
-	{
-		IPACMERR("No tx property.\n");
-		return IPACM_FAILURE;
-	}
-
-	if (iptype == IPA_IP_v4)
-	{
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
-
-		/* Configuring Multicast Filtering Rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* remove meta data mask since we only install default flt rules once for all modem PDN*/
-		flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xF0000000;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xE0000000;
-
-		change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring Broadcast Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-		flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xFFFFFFFF;
-
-		change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		IPACM_Wan::num_v4_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4;
-		IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4, iptype);
-	}
-	else	/*insert rules for ipv6*/
-	{
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		/* Configuring Multicast Filtering Rule */
-		memcpy(&flt_rule_entry.rule.attrib,
-					 &rx_prop->rx[0].attrib,
-					 sizeof(flt_rule_entry.rule.attrib));
-		/* remove meta data mask since we only install default flt rules once for all modem PDN*/
-		flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
-		flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFF000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFF000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000;
-
-		change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring fe80::/10 Link-Scoped Unicast Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFE800000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000;
-
-		change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* Configuring fec0::/10 Reserved by IETF Filtering Rule */
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFEC00000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-		flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000;
-
-		change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib);
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = iptype;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-					 &flt_eq.eq_attrib,
-					 sizeof(flt_rule_entry.rule.eq_attrib));
-
-		memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-#ifdef FEATURE_IPA_ANDROID
-		IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6);
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-		flt_rule_entry.at_rear = true;
-		flt_rule_entry.flt_rule_hdl = -1;
-		flt_rule_entry.status = -1;
-
-		flt_rule_entry.rule.retain_hdr = 1;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap = 0;
-
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
-		flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
-		flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
-
-		flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8);
-		flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1;
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12;
-
-		/* add TCP FIN rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT);
-		memcpy(&(rules[rule_offset + 3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* add TCP SYN rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT);
-		memcpy(&(rules[rule_offset + 4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		/* add TCP RST rule*/
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT);
-		flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT);
-		memcpy(&(rules[rule_offset + 5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-#endif
-
-		IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
-		IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6, iptype);
-	}
-
-fail:
-	return res;
-}
-
-int IPACM_Wan::del_wan_firewall_rule(ipa_ip_type iptype)
-{
-	if(iptype == IPA_IP_v4)
-	{
-		IPACM_Wan::num_v4_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4;
-		memset(&IPACM_Wan::flt_rule_v4[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4], 0,
-			(IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4) * sizeof(struct ipa_flt_rule_add));
-	}
-	else if(iptype == IPA_IP_v6)
-	{
-		IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
-		memset(&IPACM_Wan::flt_rule_v6[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6], 0,
-			(IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6) * sizeof(struct ipa_flt_rule_add));
-	}
-	else
-	{
-		IPACMERR("IP type is not expected.\n");
-		return IPACM_FAILURE;
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*for STA mode: clean firewall filter rules */
-int IPACM_Wan::del_dft_firewall_rules(ipa_ip_type iptype)
-{
-	/* free v4 firewall filter rule */
-	if (rx_prop == NULL)
-	{
-		IPACMDBG_H("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 > IPACM_MAX_FIREWALL_ENTRIES)
-		{
-			IPACMERR("the number of v4 firewall entries overflow, aborting...\n");
-			return IPACM_FAILURE;
-		}
-		if (num_firewall_v4 != 0)
-		{
-			if (m_filtering.DeleteFilteringHdls(firewall_hdl_v4,
-																					IPA_IP_v4, num_firewall_v4) == false)
-			{
-				IPACMERR("Error Deleting Filtering rules, aborting...\n");
-				return IPACM_FAILURE;
-			}
-			IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_firewall_v4);
-		}
-		else
-		{
-			IPACMDBG_H("No ipv4 firewall rules, no need deleted\n");
-		}
-
-		if (m_filtering.DeleteFilteringHdls(dft_wan_fl_hdl,
-																				IPA_IP_v4, 1) == false)
-		{
-			IPACMERR("Error Deleting Filtering rules, aborting...\n");
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1);
-
-		num_firewall_v4 = 0;
-	}
-
-	/* free v6 firewall filter rule */
-	if ((iptype == IPA_IP_v6) && (active_v6 == true))
-	{
-		if (num_firewall_v6 > IPACM_MAX_FIREWALL_ENTRIES)
-		{
-			IPACMERR("the number of v6 firewall entries overflow, aborting...\n");
-			return IPACM_FAILURE;
-		}
-		if (num_firewall_v6 != 0)
-		{
-			if (m_filtering.DeleteFilteringHdls(firewall_hdl_v6,
-																					IPA_IP_v6, num_firewall_v6) == false)
-			{
-				IPACMERR("Error Deleting Filtering rules, aborting...\n");
-				return IPACM_FAILURE;
-			}
-			IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_firewall_v6);
-		}
-		else
-		{
-			IPACMDBG_H("No ipv6 firewall rules, no need deleted\n");
-		}
-
-		if (m_filtering.DeleteFilteringHdls(&dft_wan_fl_hdl[1],
-																				IPA_IP_v6, 1) == false)
-		{
-			IPACMERR("Error Deleting Filtering rules, aborting...\n");
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-		if (m_filtering.DeleteFilteringHdls(&dft_wan_fl_hdl[2],
-																				IPA_IP_v6, 1) == false)
-		{
-			IPACMERR("Error Deleting Filtering rules, aborting...\n");
-			return IPACM_FAILURE;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-
-		if (is_ipv6_frag_firewall_flt_rule_installed &&
-			check_dft_firewall_rules_attr_mask(&firewall_config))
-		{
-			if (m_filtering.DeleteFilteringHdls(&ipv6_frag_firewall_flt_rule_hdl, IPA_IP_v6, 1) == false)
-			{
-				IPACMERR("Error deleting IPv6 frag filtering rules.\n");
-				return IPACM_FAILURE;
-			}
-			is_ipv6_frag_firewall_flt_rule_installed = false;
-			IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1);
-		}
-		num_firewall_v6 = 0;
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* for STA mode: wan default route/filter rule delete */
-int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
-{
-	uint32_t tx_index;
-	ipacm_cmd_q_data evt_data;
-
-	IPACMDBG_H("got handle_route_del_evt for STA-mode with ip-family:%d \n", iptype);
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No tx properties, ignore delete default route setting\n");
-		return IPACM_SUCCESS;
-	}
-
-	is_default_gateway = false;
-	IPACMDBG_H("Default route is deleted to iface %s.\n", dev_name);
-
-	if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
-			((iptype == IPA_IP_v6) && (active_v6 == true)))
-	{
-
-		/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-		    if(iptype != tx_prop->tx[tx_index].ip)
-		    {
-		    	IPACMDBG_H("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)
-			{
-		    	IPACMDBG_H("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)
-				{
-					IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v4, wan_route_rule_v4_hdl[tx_index], tx_index);
-					return IPACM_FAILURE;
-				}
-			}
-			else
-			{
-		    	IPACMDBG_H("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)
-				{
-					IPACMDBG_H("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;
-				}
-			}
-		}
-
-		/* Delete the default wan route*/
-		if (iptype == IPA_IP_v6)
-		{
-		   	IPACMDBG_H("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
-			if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
-			{
-			IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
-				return IPACM_FAILURE;
-			}
-		}
-		ipacm_event_iface_up *wandown_data;
-		wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
-		if (wandown_data == NULL)
-		{
-			IPACMERR("Unable to allocate memory\n");
-			return IPACM_FAILURE;
-		}
-		memset(wandown_data, 0, sizeof(ipacm_event_iface_up));
-
-		if (iptype == IPA_IP_v4)
-		{
-			wandown_data->ipv4_addr = wan_v4_addr;
-			if (m_is_sta_mode!=Q6_WAN)
-			{
-				wandown_data->is_sta = true;
-			}
-			else
-			{
-				wandown_data->is_sta = false;
-			}
-			evt_data.event = IPA_HANDLE_WAN_DOWN;
-			evt_data.evt_data = (void *)wandown_data;
-			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
-			IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv4 (%d.%d.%d.%d) \n",
-					(unsigned char)(wandown_data->ipv4_addr),
-					(unsigned char)(wandown_data->ipv4_addr >> 8),
-					(unsigned char)(wandown_data->ipv4_addr >> 16),
-					(unsigned char)(wandown_data->ipv4_addr >> 24));
-
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-			IPACMDBG_H("setup wan_up/active_v4= false \n");
-			IPACM_Wan::wan_up = false;
-			active_v4 = false;
-			if(IPACM_Wan::wan_up_v6)
-			{
-				IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-		else
-		{
-			if (m_is_sta_mode!=Q6_WAN)
-			{
-				wandown_data->is_sta = true;
-			}
-			else
-			{
-				wandown_data->is_sta = false;
-			}
-			memcpy(wandown_data->ipv6_prefix, ipv6_prefix, sizeof(wandown_data->ipv6_prefix));
-			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
-			evt_data.evt_data = (void *)wandown_data;
-			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
-			IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv6 with prefix 0x%08x%08x\n", ipv6_prefix[0], ipv6_prefix[1]);
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-			IPACMDBG_H("setup wan_up_v6/active_v6= false \n");
-			IPACM_Wan::wan_up_v6 = false;
-			active_v6 = false;
-			if(IPACM_Wan::wan_up)
-			{
-				IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-	}
-	else
-	{
-		IPACMDBG_H(" The default WAN routing rules are deleted already \n");
-	}
-
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype)
-{
-	ipacm_cmd_q_data evt_data;
-
-	IPACMDBG_H("got handle_route_del_evt_ex with ip-family:%d \n", iptype);
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No tx properties, ignore delete default route setting\n");
-		return IPACM_SUCCESS;
-	}
-
-	is_default_gateway = false;
-	IPACMDBG_H("Default route is deleted to iface %s.\n", dev_name);
-
-	if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
-		((iptype == IPA_IP_v6) && (active_v6 == true)))
-	{
-
-		/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-
-		/* Delete the default route*/
-		if (iptype == IPA_IP_v6)
-		{
-			IPACMDBG_H("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
-			if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
-			{
-				IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
-				return IPACM_FAILURE;
-			}
-		}
-
-		ipacm_event_iface_up *wandown_data;
-		wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
-		if (wandown_data == NULL)
-		{
-			IPACMERR("Unable to allocate memory\n");
-			return IPACM_FAILURE;
-		}
-		memset(wandown_data, 0, sizeof(ipacm_event_iface_up));
-
-		if (iptype == IPA_IP_v4)
-		{
-			wandown_data->ipv4_addr = wan_v4_addr;
-			if (m_is_sta_mode!=Q6_WAN)
-			{
-				wandown_data->is_sta = true;
-			}
-			else
-			{
-				wandown_data->is_sta = false;
-			}
-			evt_data.event = IPA_HANDLE_WAN_DOWN;
-			evt_data.evt_data = (void *)wandown_data;
-			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
-			IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv4 with address: 0x%x\n", wan_v4_addr);
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-			IPACMDBG_H("setup wan_up/active_v4= false \n");
-			IPACM_Wan::wan_up = false;
-			active_v4 = false;
-			if(IPACM_Wan::wan_up_v6)
-			{
-				IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-		else
-		{
-			if (m_is_sta_mode!=Q6_WAN)
-			{
-				wandown_data->is_sta = true;
-			}
-			else
-			{
-				wandown_data->is_sta = false;
-			}
-			memcpy(wandown_data->ipv6_prefix, ipv6_prefix, sizeof(wandown_data->ipv6_prefix));
-			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
-			evt_data.evt_data = (void *)wandown_data;
-			IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN_V6 for IPv6 with prefix 0x%08x%08x\n", ipv6_prefix[0], ipv6_prefix[1]);
-			IPACM_EvtDispatcher::PostEvt(&evt_data);
-
-			IPACMDBG_H("setup wan_up_v6/active_v6= false \n");
-			IPACM_Wan::wan_up_v6 = false;
-			active_v6 = false;
-			if(IPACM_Wan::wan_up)
-			{
-				IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-	}
-	else
-	{
-		IPACMDBG_H(" The default WAN routing rules are deleted already \n");
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* configure the initial embms filter rules */
-int IPACM_Wan::config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4, ipa_ioc_add_flt_rule *pFilteringTable_v6)
-{
-	struct ipa_flt_rule_add flt_rule_entry;
-	struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
-	struct ipa_ioc_generate_flt_eq flt_eq;
-
-	if (rx_prop == NULL)
-	{
-		IPACMDBG("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	if(pFilteringTable_v4 == NULL || pFilteringTable_v6 == NULL)
-	{
-		IPACMERR("Either v4 or v6 filtering table is empty.\n");
-		return IPACM_FAILURE;
-	}
-
-	/* set up ipv4 odu rule*/
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
-	/* get eMBMS ODU tbl index*/
-	memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-	strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name, IPA_RESOURCE_NAME_MAX);
-	rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-	rt_tbl_idx.ip = IPA_IP_v4;
-	if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-	{
-		IPACMERR("Failed to get routing table index from name\n");
-		return IPACM_FAILURE;
-	}
-	IPACMDBG_H("Odu routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-	flt_rule_entry.flt_rule_hdl = -1;
-	flt_rule_entry.status = -1;
-	flt_rule_entry.at_rear = false;
-
-	flt_rule_entry.rule.retain_hdr = 0;
-	flt_rule_entry.rule.to_uc = 0;
-	flt_rule_entry.rule.eq_attrib_type = 1;
-	flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-	flt_rule_entry.rule.hashable = true;
-#endif
-	flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-	memcpy(&flt_rule_entry.rule.attrib,
-				 &rx_prop->rx[0].attrib,
-				 sizeof(struct ipa_rule_attrib));
-	flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-	flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000;
-
-	memset(&flt_eq, 0, sizeof(flt_eq));
-	memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-	flt_eq.ip = IPA_IP_v4;
-	if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-	{
-		IPACMERR("Failed to get eq_attrib\n");
-		return IPACM_FAILURE;
-	}
-	memcpy(&flt_rule_entry.rule.eq_attrib,
-				 &flt_eq.eq_attrib,
-				 sizeof(flt_rule_entry.rule.eq_attrib));
-
-	memcpy(&(pFilteringTable_v4->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-	/* construc v6 rule */
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-	/* get eMBMS ODU tbl*/
-	memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-	strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name, IPA_RESOURCE_NAME_MAX);
-	rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-	rt_tbl_idx.ip = IPA_IP_v6;
-	if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
-	{
-		IPACMERR("Failed to get routing table index from name\n");
-		return IPACM_FAILURE;
-	}
-	IPACMDBG_H("Odu routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-	memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-	flt_rule_entry.flt_rule_hdl = -1;
-	flt_rule_entry.status = -1;
-	flt_rule_entry.at_rear = false;
-
-	flt_rule_entry.rule.retain_hdr = 0;
-	flt_rule_entry.rule.to_uc = 0;
-	flt_rule_entry.rule.eq_attrib_type = 1;
-	flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
-#ifdef FEATURE_IPA_V3
-	flt_rule_entry.rule.hashable = true;
-#endif
-	flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-	memcpy(&flt_rule_entry.rule.attrib,
-				 &rx_prop->rx[0].attrib,
-				 sizeof(struct ipa_rule_attrib));
-	flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
-	flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
-
-	memset(&flt_eq, 0, sizeof(flt_eq));
-	memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-	flt_eq.ip = IPA_IP_v6;
-	if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-	{
-		IPACMERR("Failed to get eq_attrib\n");
-		return IPACM_FAILURE;
-	}
-	memcpy(&flt_rule_entry.rule.eq_attrib,
-				 &flt_eq.eq_attrib,
-				 sizeof(flt_rule_entry.rule.eq_attrib));
-
-	memcpy(&(pFilteringTable_v6->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-	return IPACM_SUCCESS;
-}
-
-
-/*for STA mode: handle wan-iface down event */
-int IPACM_Wan::handle_down_evt()
-{
-	int res = IPACM_SUCCESS;
-	int i, tether_total;
-	int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES];
-
-	IPACMDBG_H(" wan handle_down_evt \n");
-
-	/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
-	IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-	if (tx_prop != NULL)
-	{
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-	}
-
-	/* no iface address up, directly close iface*/
-	if (ip_type == IPACM_IP_NULL)
-	{
-		goto fail;
-	}
-
-	/* make sure default routing rules and firewall rules are deleted*/
-	if (active_v4)
-	{
-		if (rx_prop != NULL)
-		{
-			del_dft_firewall_rules(IPA_IP_v4);
-		}
-		handle_route_del_evt(IPA_IP_v4);
-		IPACMDBG_H("Delete default v4 routing rules\n");
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-		/* posting wan_down_tether for all lan clients */
-		for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
-		{
-			ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i];
-		}
-		tether_total = IPACM_Wan::ipa_if_num_tether_v4_total;
-		for (i=0; i < tether_total; i++)
-		{
-			post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]);
-			IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n", i,
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-		}
-#endif
-	}
-
-	if (active_v6)
-	{
-		if (rx_prop != NULL)
-		{
-			del_dft_firewall_rules(IPA_IP_v6);
-		}
-		handle_route_del_evt(IPA_IP_v6);
-		IPACMDBG_H("Delete default v6 routing rules\n");
-#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
-		/* posting wan_down_tether for all lan clients */
-		for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
-		{
-			ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i];
-		}
-		tether_total = IPACM_Wan::ipa_if_num_tether_v6_total;
-		for (i=0; i < tether_total; i++)
-		{
-			post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]);
-			IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n", i,
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-		}
-#endif
-	}
-
-	/* Delete default v4 RT rule */
-	if (ip_type != IPA_IP_v6)
-	{
-		IPACMDBG_H("Delete default v4 routing rules\n");
-		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
-		{
-		   IPACMERR("Routing rule deletion failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-
-	/* delete default v6 RT rule */
-	if (ip_type != IPA_IP_v4)
-	{
-		IPACMDBG_H("Delete default v6 routing rules\n");
-		/* May have multiple ipv6 iface-routing rules*/
-		for (i = 0; i < 2*num_dft_rt_v6; i++)
-		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false)
-			{
-				IPACMERR("Routing rule deletion failed!\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-		}
-
-		IPACMDBG_H("finished delete default v6 RT rules\n ");
-	}
-
-
-	/* clean wan-client header, routing rules */
-	IPACMDBG_H("left %d wan clients need to be deleted \n ", num_wan_client);
-	for (i = 0; i < num_wan_client; i++)
-	{
-			/* Del NAT rules before ipv4 RT rules are delete */
-			if(get_client_memptr(wan_client, i)->ipv4_set == true)
-			{
-				IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wan_client, i)->v4_addr);
-				CtList->HandleSTAClientDelEvt(get_client_memptr(wan_client, i)->v4_addr);
-			}
-
-			if (delete_wan_rtrules(i, IPA_IP_v4))
-			{
-				IPACMERR("unbale to delete wan-client v4 route rules for index %d\n", i);
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-
-			if (delete_wan_rtrules(i, IPA_IP_v6))
-			{
-				IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i);
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-
-			IPACMDBG_H("Delete %d client header\n", num_wan_client);
-
-
-			if(get_client_memptr(wan_client, i)->ipv4_header_set == true)
-			{
-				if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, i)->hdr_hdl_v4)
-					== false)
-				{
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-			}
-
-			if(get_client_memptr(wan_client, i)->ipv6_header_set == true)
-			{
-			if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, i)->hdr_hdl_v6)
-					== false)
-			{
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-			}
-	} /* end of for loop */
-
-	/* free the edm clients cache */
-	IPACMDBG_H("Free wan clients cache\n");
-
-	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true)
-	{
-		handle_software_routing_disable();
-	}
-
-	/* free filter rule handlers */
-	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
-	{
-		if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
-																				IPA_IP_v4,
-																				IPV4_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("Error Delete Filtering rules, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES);
-
-		IPACMDBG_H("finished delete default v4 filtering rules\n ");
-	}
-
-
-	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
-	{
-		if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
-																				IPA_IP_v6,
-																				IPV6_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("ErrorDeleting Filtering rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
-
-		if(num_ipv6_dest_flt_rule > 0 && num_ipv6_dest_flt_rule <= MAX_DEFAULT_v6_ROUTE_RULES)
-		{
-			if(m_filtering.DeleteFilteringHdls(ipv6_dest_flt_rule_hdl,  IPA_IP_v6, num_ipv6_dest_flt_rule) == false)
-			{
-				IPACMERR("Failed to delete ipv6 dest flt rules.\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-			IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_ipv6_dest_flt_rule);
-		}
-		IPACMDBG_H("finished delete default v6 filtering rules\n ");
-	}
-	if(hdr_proc_hdl_dummy_v6)
-	{
-		if(m_header.DeleteHeaderProcCtx(hdr_proc_hdl_dummy_v6) == false)
-		{
-			IPACMERR("Failed to delete hdr_proc_hdl_dummy_v6\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-	if(hdr_hdl_dummy_v6)
-	{
-		if (m_header.DeleteHeaderHdl(hdr_hdl_dummy_v6) == false)
-		{
-			IPACMERR("Failed to delete hdr_hdl_dummy_v6\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-fail:
-	if (tx_prop != NULL)
-	{
-		free(tx_prop);
-	}
-	if (rx_prop != NULL)
-	{
-		free(rx_prop);
-	}
-	if (iface_query != NULL)
-	{
-		free(iface_query);
-	}
-	if (wan_route_rule_v4_hdl != NULL)
-	{
-		free(wan_route_rule_v4_hdl);
-	}
-	if (wan_route_rule_v6_hdl != NULL)
-	{
-		free(wan_route_rule_v6_hdl);
-	}
-	if (wan_route_rule_v6_hdl_a5 != NULL)
-	{
-		free(wan_route_rule_v6_hdl_a5);
-	}
-	if (wan_client != NULL)
-	{
-		free(wan_client);
-	}
-	close(m_fd_ipa);
-	return res;
-}
-
-int IPACM_Wan::handle_down_evt_ex()
-{
-	int res = IPACM_SUCCESS;
-	int i, tether_total;
-	int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES];
-
-	IPACMDBG_H(" wan handle_down_evt \n");
-
-	/* free ODU filter rule handlers */
-	if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF)
-	{
-		embms_is_on = false;
-		/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		if (tx_prop != NULL)
-		{
-			IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-			IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		}
-
-		if (rx_prop != NULL)
-		{
-			install_wan_filtering_rule(false);
-			IPACMDBG("finished delete embms filtering rule\n ");
-		}
-		goto fail;
-	}
-
-	/* no iface address up, directly close iface*/
-	if (ip_type == IPACM_IP_NULL)
-	{
-		goto fail;
-	}
-
-	if(ip_type == IPA_IP_v4)
-	{
-		num_ipv4_modem_pdn--;
-		IPACMDBG_H("Now the number of ipv4 modem pdn is %d.\n", num_ipv4_modem_pdn);
-		/* only when default gw goes down we post WAN_DOWN event*/
-		if(is_default_gateway == true)
-		{
-			IPACM_Wan::wan_up = false;
-			del_wan_firewall_rule(IPA_IP_v4);
-			install_wan_filtering_rule(false);
-			handle_route_del_evt_ex(IPA_IP_v4);
-#ifdef FEATURE_IPA_ANDROID
-			/* posting wan_down_tether for all lan clients */
-			for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
-			{
-				ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i];
-			}
-			tether_total = IPACM_Wan::ipa_if_num_tether_v4_total;
-			for (i=0; i < tether_total; i++)
-			{
-				post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]);
-				IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n",
-					i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-			}
-#endif
-			if(IPACM_Wan::wan_up_v6)
-			{
-				IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-
-		/* only when the last ipv4 modem interface goes down, delete ipv4 default flt rules*/
-		if(num_ipv4_modem_pdn == 0)
-		{
-			IPACMDBG_H("Now the number of modem ipv4 interface is 0, delete default flt rules.\n");
-		IPACM_Wan::num_v4_flt_rule = 0;
-		memset(IPACM_Wan::flt_rule_v4, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
-		install_wan_filtering_rule(false);
-		}
-
-		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
-		{
-			IPACMERR("Routing rule deletion failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-	else if(ip_type == IPA_IP_v6)
-	{
-	    if (num_dft_rt_v6 > 1)
-			num_ipv6_modem_pdn--;
-		IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn);
-		/* only when default gw goes down we post WAN_DOWN event*/
-		if(is_default_gateway == true)
-		{
-			IPACM_Wan::wan_up_v6 = false;
-			del_wan_firewall_rule(IPA_IP_v6);
-			install_wan_filtering_rule(false);
-			handle_route_del_evt_ex(IPA_IP_v6);
-#ifdef FEATURE_IPA_ANDROID //sky
-			/* posting wan_down_tether for all lan clients */
-			for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
-			{
-				ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i];
-			}
-			tether_total = IPACM_Wan::ipa_if_num_tether_v6_total;
-			for (i=0; i < tether_total; i++)
-			{
-				post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]);
-				IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n",
-					i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-			}
-#endif
-			if(IPACM_Wan::wan_up)
-			{
-				IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
-			}
-			else
-			{
-				memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-			}
-		}
-
-		/* only when the last ipv6 modem interface goes down, delete ipv6 default flt rules*/
-		if(num_ipv6_modem_pdn == 0)
-		{
-			IPACMDBG_H("Now the number of modem ipv6 interface is 0, delete default flt rules.\n");
-		IPACM_Wan::num_v6_flt_rule = 0;
-		memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
-		install_wan_filtering_rule(false);
-		}
-
-		for (i = 0; i < 2*num_dft_rt_v6; i++)
-		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false)
-			{
-				IPACMERR("Routing rule deletion failed!\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-		}
-	}
-	else
-	{
-		num_ipv4_modem_pdn--;
-		IPACMDBG_H("Now the number of ipv4 modem pdn is %d.\n", num_ipv4_modem_pdn);
-	    if (num_dft_rt_v6 > 1)
-			num_ipv6_modem_pdn--;
-		IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn);
-		/* only when default gw goes down we post WAN_DOWN event*/
-		if(is_default_gateway == true)
-		{
-			IPACM_Wan::wan_up = false;
-			del_wan_firewall_rule(IPA_IP_v4);
-			handle_route_del_evt_ex(IPA_IP_v4);
-#ifdef FEATURE_IPA_ANDROID
-			/* posting wan_down_tether for all lan clients */
-			for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
-			{
-				ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i];
-			}
-			tether_total = IPACM_Wan::ipa_if_num_tether_v4_total;
-			for (i=0; i < tether_total; i++)
-			{
-				post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]);
-				IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n",
-					i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-			}
-#endif
-			IPACM_Wan::wan_up_v6 = false;
-			del_wan_firewall_rule(IPA_IP_v6);
-			handle_route_del_evt_ex(IPA_IP_v6);
-#ifdef FEATURE_IPA_ANDROID
-			/* posting wan_down_tether for all lan clients */
-			for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
-			{
-				ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i];
-			}
-			tether_total = IPACM_Wan::ipa_if_num_tether_v6_total;
-			for (i=0; i < tether_total; i++)
-			{
-				post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]);
-				IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n",
-					i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
-			}
-#endif
-			memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
-
-			install_wan_filtering_rule(false);
-		}
-
-		/* only when the last ipv4 modem interface goes down, delete ipv4 default flt rules*/
-		if(num_ipv4_modem_pdn == 0)
-		{
-			IPACMDBG_H("Now the number of modem ipv4 interface is 0, delete default flt rules.\n");
-			IPACM_Wan::num_v4_flt_rule = 0;
-			memset(IPACM_Wan::flt_rule_v4, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
-			install_wan_filtering_rule(false);
-		}
-		/* only when the last ipv6 modem interface goes down, delete ipv6 default flt rules*/
-		if(num_ipv6_modem_pdn == 0)
-		{
-			IPACMDBG_H("Now the number of modem ipv6 interface is 0, delete default flt rules.\n");
-			IPACM_Wan::num_v6_flt_rule = 0;
-			memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
-			install_wan_filtering_rule(false);
-		}
-
-		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
-		{
-			IPACMERR("Routing rule deletion failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-
-		for (i = 0; i < 2*num_dft_rt_v6; i++)
-		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false)
-			{
-				IPACMERR("Routing rule deletion failed!\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-		}
-	}
-
-	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true)
-	{
-		handle_software_routing_disable();
-	}
-
-fail:
-	if (tx_prop != NULL)
-	{
-		free(tx_prop);
-	}
-	if (rx_prop != NULL)
-	{
-		free(rx_prop);
-	}
-	if (ext_prop != NULL)
-	{
-		free(ext_prop);
-	}
-	if (iface_query != NULL)
-	{
-		free(iface_query);
-	}
-	if (wan_route_rule_v4_hdl != NULL)
-	{
-		free(wan_route_rule_v4_hdl);
-	}
-	if (wan_route_rule_v6_hdl != NULL)
-	{
-		free(wan_route_rule_v6_hdl);
-	}
-	if (wan_route_rule_v6_hdl_a5 != NULL)
-	{
-		free(wan_route_rule_v6_hdl_a5);
-	}
-	if (wan_client != NULL)
-	{
-		free(wan_client);
-	}
-	close(m_fd_ipa);
-	return res;
-}
-
-int IPACM_Wan::install_wan_filtering_rule(bool is_sw_routing)
-{
-	int len, res = IPACM_SUCCESS;
-	uint8_t mux_id;
-	ipa_ioc_add_flt_rule *pFilteringTable_v4 = NULL;
-	ipa_ioc_add_flt_rule *pFilteringTable_v6 = NULL;
-
-	mux_id = IPACM_Iface::ipacmcfg->GetQmapId();
-	if(rx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-	if (is_sw_routing == true ||
-			IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true)
-	{
-		/* contruct SW-RT rules to Q6*/
-		struct ipa_flt_rule_add flt_rule_entry;
-		struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
-		ipa_ioc_generate_flt_eq flt_eq;
-
-		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;
-		}
-
-		len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-		pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-		if (pFilteringTable_v4 == NULL)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			return IPACM_FAILURE;
-		}
-		memset(pFilteringTable_v4, 0, len);
-		IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is 1\n");
-
-		pFilteringTable_v4->commit = 1;
-		pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe;
-		pFilteringTable_v4->global = false;
-		pFilteringTable_v4->ip = IPA_IP_v4;
-		pFilteringTable_v4->num_rules = (uint8_t)1;
-
-		/* Configuring Software-Routing Filtering Rule */
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = IPA_IP_v4;
-		if(ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx) < 0)
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		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_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-		memcpy(&flt_rule_entry.rule.attrib,
-					&rx_prop->rx[0].attrib,
-					sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.retain_hdr = 0;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = IPA_IP_v4;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-			&flt_eq.eq_attrib,
-			sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(pFilteringTable_v4->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-		len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
-		pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-		if (pFilteringTable_v6 == NULL)
-		{
-			IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-			free(pFilteringTable_v4);
-			return IPACM_FAILURE;
-		}
-		memset(pFilteringTable_v6, 0, len);
-		IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is 1\n");
-
-		pFilteringTable_v6->commit = 1;
-		pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe;
-		pFilteringTable_v6->global = false;
-		pFilteringTable_v6->ip = IPA_IP_v6;
-		pFilteringTable_v6->num_rules = (uint8_t)1;
-
-		/* Configuring Software-Routing Filtering Rule */
-		memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-		memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
-		strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
-		rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-		rt_tbl_idx.ip = IPA_IP_v6;
-		if(ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx) < 0)
-		{
-			IPACMERR("Failed to get routing table index from name\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
-		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_ROUTING;
-#ifdef FEATURE_IPA_V3
-		flt_rule_entry.rule.hashable = true;
-#endif
-		flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-		memcpy(&flt_rule_entry.rule.attrib,
-					&rx_prop->rx[0].attrib,
-					sizeof(flt_rule_entry.rule.attrib));
-		flt_rule_entry.rule.retain_hdr = 0;
-		flt_rule_entry.rule.to_uc = 0;
-		flt_rule_entry.rule.eq_attrib_type = 1;
-
-		memset(&flt_eq, 0, sizeof(flt_eq));
-		memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
-		flt_eq.ip = IPA_IP_v6;
-		if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
-		{
-			IPACMERR("Failed to get eq_attrib\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		memcpy(&flt_rule_entry.rule.eq_attrib,
-			&flt_eq.eq_attrib,
-			sizeof(flt_rule_entry.rule.eq_attrib));
-		memcpy(&(pFilteringTable_v6->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-		softwarerouting_act = true;
-		/* end of contruct SW-RT rules to Q6*/
-	}
-	else
-	{
-		if(embms_is_on == false)
-		{
-			if(IPACM_Wan::num_v4_flt_rule > 0)
-			{
-				len = sizeof(struct ipa_ioc_add_flt_rule) + IPACM_Wan::num_v4_flt_rule * sizeof(struct ipa_flt_rule_add);
-				pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-
-				IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is %d\n", IPACM_Wan::num_v4_flt_rule);
-
-				if (pFilteringTable_v4 == NULL)
-				{
-					IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-					return IPACM_FAILURE;
-				}
-				memset(pFilteringTable_v4, 0, len);
-				pFilteringTable_v4->commit = 1;
-				pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe;
-				pFilteringTable_v4->global = false;
-				pFilteringTable_v4->ip = IPA_IP_v4;
-				pFilteringTable_v4->num_rules = (uint8_t)IPACM_Wan::num_v4_flt_rule;
-
-				memcpy(pFilteringTable_v4->rules, IPACM_Wan::flt_rule_v4, IPACM_Wan::num_v4_flt_rule * sizeof(ipa_flt_rule_add));
-			}
-
-			if(IPACM_Wan::num_v6_flt_rule > 0)
-			{
-				len = sizeof(struct ipa_ioc_add_flt_rule) + IPACM_Wan::num_v6_flt_rule * sizeof(struct ipa_flt_rule_add);
-				pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-
-				IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is %d\n", IPACM_Wan::num_v6_flt_rule);
-
-				if (pFilteringTable_v6 == NULL)
-				{
-					IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-					free(pFilteringTable_v4);
-					return IPACM_FAILURE;
-				}
-				memset(pFilteringTable_v6, 0, len);
-				pFilteringTable_v6->commit = 1;
-				pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe;
-				pFilteringTable_v6->global = false;
-				pFilteringTable_v6->ip = IPA_IP_v6;
-				pFilteringTable_v6->num_rules = (uint8_t)IPACM_Wan::num_v6_flt_rule;
-
-				memcpy(pFilteringTable_v6->rules, IPACM_Wan::flt_rule_v6, IPACM_Wan::num_v6_flt_rule * sizeof(ipa_flt_rule_add));
-			}
-		}
-		else	//embms is on, always add 1 embms rule on top of WAN DL flt table
-		{
-			/* allocate ipv4 filtering table */
-			len = sizeof(struct ipa_ioc_add_flt_rule) + (1 + IPACM_Wan::num_v4_flt_rule) * sizeof(struct ipa_flt_rule_add);
-			pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-			IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is %d\n", IPACM_Wan::num_v4_flt_rule + 1);
-			if (pFilteringTable_v4 == NULL)
-			{
-				IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-				return IPACM_FAILURE;
-			}
-			memset(pFilteringTable_v4, 0, len);
-			pFilteringTable_v4->commit = 1;
-			pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe;
-			pFilteringTable_v4->global = false;
-			pFilteringTable_v4->ip = IPA_IP_v4;
-			pFilteringTable_v4->num_rules = (uint8_t)IPACM_Wan::num_v4_flt_rule + 1;
-
-			/* allocate ipv6 filtering table */
-			len = sizeof(struct ipa_ioc_add_flt_rule) + (1 + IPACM_Wan::num_v6_flt_rule) * sizeof(struct ipa_flt_rule_add);
-			pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len);
-			IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is %d\n", IPACM_Wan::num_v6_flt_rule + 1);
-			if (pFilteringTable_v6 == NULL)
-			{
-				IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
-				free(pFilteringTable_v4);
-				return IPACM_FAILURE;
-			}
-			memset(pFilteringTable_v6, 0, len);
-			pFilteringTable_v6->commit = 1;
-			pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe;
-			pFilteringTable_v6->global = false;
-			pFilteringTable_v6->ip = IPA_IP_v6;
-			pFilteringTable_v6->num_rules = (uint8_t)IPACM_Wan::num_v6_flt_rule + 1;
-
-			config_dft_embms_rules(pFilteringTable_v4, pFilteringTable_v6);
-			if(IPACM_Wan::num_v4_flt_rule > 0)
-			{
-				memcpy(&(pFilteringTable_v4->rules[1]), IPACM_Wan::flt_rule_v4, IPACM_Wan::num_v4_flt_rule * sizeof(ipa_flt_rule_add));
-			}
-
-			if(IPACM_Wan::num_v6_flt_rule > 0)
-			{
-				memcpy(&(pFilteringTable_v6->rules[1]), IPACM_Wan::flt_rule_v6, IPACM_Wan::num_v6_flt_rule * sizeof(ipa_flt_rule_add));
-			}
-		}
-	}
-
-	if(false == m_filtering.AddWanDLFilteringRule(pFilteringTable_v4, pFilteringTable_v6, mux_id))
-	{
-		IPACMERR("Failed to install WAN DL filtering table.\n");
-		res = IPACM_FAILURE;
-		goto fail;
-	}
-
-fail:
-	if(pFilteringTable_v4 != NULL)
-	{
-		free(pFilteringTable_v4);
-	}
-	if(pFilteringTable_v6 != NULL)
-	{
-		free(pFilteringTable_v6);
-	}
-	return res;
-}
-
-void IPACM_Wan::change_to_network_order(ipa_ip_type iptype, ipa_rule_attrib* attrib)
-{
-	if(attrib == NULL)
-	{
-		IPACMERR("Attribute pointer is NULL.\n");
-		return;
-	}
-
-	if(iptype == IPA_IP_v6)
-	{
-		int i;
-		for(i=0; i<4; i++)
-		{
-			attrib->u.v6.src_addr[i] = htonl(attrib->u.v6.src_addr[i]);
-			attrib->u.v6.src_addr_mask[i] = htonl(attrib->u.v6.src_addr_mask[i]);
-			attrib->u.v6.dst_addr[i] = htonl(attrib->u.v6.dst_addr[i]);
-			attrib->u.v6.dst_addr_mask[i] = htonl(attrib->u.v6.dst_addr_mask[i]);
-		}
-	}
-	else
-	{
-		IPACMDBG_H("IP type is not IPv6, do nothing: %d\n", iptype);
-	}
-
-	return;
-}
-
-bool IPACM_Wan::is_global_ipv6_addr(uint32_t* ipv6_addr)
-{
-	if(ipv6_addr == NULL)
-	{
-		IPACMERR("IPv6 address is empty.\n");
-		return false;
-	}
-	IPACMDBG_H("Get ipv6 address with first word 0x%08x.\n", ipv6_addr[0]);
-
-	uint32_t ipv6_link_local_prefix, ipv6_link_local_prefix_mask;
-	ipv6_link_local_prefix = 0xFE800000;
-	ipv6_link_local_prefix_mask = 0xFFC00000;
-	if((ipv6_addr[0] & ipv6_link_local_prefix_mask) == (ipv6_link_local_prefix & ipv6_link_local_prefix_mask))
-	{
-		IPACMDBG_H("This IPv6 address is link local.\n");
-		return false;
-	}
-	else
-	{
-		IPACMDBG_H("This IPv6 address is not link local.\n");
-		return true;
-	}
-}
-
-/* handle STA WAN-client */
-/* handle WAN client initial, construct full headers (tx property) */
-int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
-{
-
-#define WAN_IFACE_INDEX_LEN 2
-
-	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 cnt;
-	int clnt_indx;
-
-	clnt_indx = get_wan_client_index(mac_addr);
-
-	if (clnt_indx != IPACM_INVALID_INDEX)
-	{
-		IPACMERR("eth client is found/attached already with index %d \n", clnt_indx);
-		return IPACM_FAILURE;
-	}
-
-	/* add header to IPA */
-	if (num_wan_client >= IPA_MAX_NUM_WAN_CLIENTS)
-	{
-		IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_WAN_CLIENTS);
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG_H("WAN client number: %d\n", num_wan_client);
-
-	memcpy(get_client_memptr(wan_client, num_wan_client)->mac,
-				 mac_addr,
-				 sizeof(get_client_memptr(wan_client, num_wan_client)->mac));
-
-	IPACMDBG_H("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]);
-
-	IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 get_client_memptr(wan_client, num_wan_client)->mac[0],
-					 get_client_memptr(wan_client, num_wan_client)->mac[1],
-					 get_client_memptr(wan_client, num_wan_client)->mac[2],
-					 get_client_memptr(wan_client, num_wan_client)->mac[3],
-					 get_client_memptr(wan_client, num_wan_client)->mac[4],
-					 get_client_memptr(wan_client, num_wan_client)->mac[5]);
-
-	/* add header to IPA */
-	if(tx_prop != NULL)
-	{
-		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 for v4*/
-		for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-		{
-				 if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-				 {
-								IPACMDBG_H("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_H("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_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-								IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-								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 */
-								IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n",
-										sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-
-								/* only copy 6 bytes mac-address */
-								if(sCopyHeader.is_eth2_ofst_valid == false)
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[0],
-											mac_addr, IPA_MAC_ADDR_SIZE);
-								}
-								else
-								{
-									memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-											mac_addr, IPA_MAC_ADDR_SIZE);
-								}
-
-
-								pHeaderDescriptor->commit = true;
-								pHeaderDescriptor->num_hdrs = 1;
-
-								memset(pHeaderDescriptor->hdr[0].name, 0,
-											 sizeof(pHeaderDescriptor->hdr[0].name));
-
-								snprintf(index,sizeof(index), "%d", ipa_if_num);
-								strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-								pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-								if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-								{
-									IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-									res = IPACM_FAILURE;
-									goto fail;
-								}
-
-								snprintf(index,sizeof(index), "%d", header_name_count);
-								if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-								{
-									IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-									res = IPACM_FAILURE;
-									goto fail;
-								}
-
-								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;
-					 }
-
-					get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
-					IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
-												 num_wan_client,
-												 pHeaderDescriptor->hdr[0].name,
-												 get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4);
-									get_client_memptr(wan_client, num_wan_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)
-			{
-
-				IPACMDBG_H("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_H("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_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-				IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-				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 */
-				if(sCopyHeader.is_eth2_ofst_valid == false)
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[0],
-								 mac_addr, IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
-				}
-				else
-				{
-					memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst],
-								 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));
-
-				snprintf(index,sizeof(index), "%d", ipa_if_num);
-				strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-				pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-				if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-				snprintf(index,sizeof(index), "%d", header_name_count);
-				if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-
-				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;
-				}
-
-				get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
-				IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
-						 num_wan_client,
-						 pHeaderDescriptor->hdr[0].name,
-									 get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6);
-
-									get_client_memptr(wan_client, num_wan_client)->ipv6_header_set=true;
-
-				break;
-
-			}
-		}
-		/* initialize wifi client*/
-		get_client_memptr(wan_client, num_wan_client)->route_rule_set_v4 = false;
-		get_client_memptr(wan_client, num_wan_client)->route_rule_set_v6 = 0;
-		get_client_memptr(wan_client, num_wan_client)->ipv4_set = false;
-		get_client_memptr(wan_client, num_wan_client)->ipv6_set = 0;
-		num_wan_client++;
-		header_name_count++; //keep increasing header_name_count
-		res = IPACM_SUCCESS;
-		IPACMDBG_H("eth client number: %d\n", num_wan_client);
-	}
-	else
-	{
-		return res;
-	}
-fail:
-	free(pHeaderDescriptor);
-
-	return res;
-}
-
-/*handle eth client */
-int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data)
-{
-	int clnt_indx;
-	int v6_num;
-
-	IPACMDBG_H("number of wan clients: %d\n", num_wan_client);
-	IPACMDBG_H(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 data->mac_addr[0],
-					 data->mac_addr[1],
-					 data->mac_addr[2],
-					 data->mac_addr[3],
-					 data->mac_addr[4],
-					 data->mac_addr[5]);
-
-	clnt_indx = get_wan_client_index(data->mac_addr);
-
-		if (clnt_indx == IPACM_INVALID_INDEX)
-		{
-			IPACMERR("wan client not found/attached \n");
-			return IPACM_FAILURE;
-		}
-
-	IPACMDBG_H("Ip-type received %d\n", data->iptype);
-	if (data->iptype == IPA_IP_v4)
-	{
-		IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr);
-		if (data->ipv4_addr != 0) /* not 0.0.0.0 */
-		{
-			if (get_client_memptr(wan_client, clnt_indx)->ipv4_set == false)
-			{
-				get_client_memptr(wan_client, clnt_indx)->v4_addr = data->ipv4_addr;
-				get_client_memptr(wan_client, clnt_indx)->ipv4_set = true;
-				/* Add NAT rules after ipv4 RT rules are set */
-				CtList->HandleSTAClientAddEvt(data->ipv4_addr);
-			}
-			else
-			{
-			   /* check if client got new IPv4 address*/
-			   if(data->ipv4_addr == get_client_memptr(wan_client, clnt_indx)->v4_addr)
-			   {
-			     IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx);
-				 return IPACM_FAILURE;
-			   }
-			   else
-			   {
-					IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx);
-					/* Del NAT rules before ipv4 RT rules are delete */
-					CtList->HandleSTAClientDelEvt(get_client_memptr(wan_client, clnt_indx)->v4_addr);
-					delete_wan_rtrules(clnt_indx,IPA_IP_v4);
-					get_client_memptr(wan_client, clnt_indx)->route_rule_set_v4 = false;
-					get_client_memptr(wan_client, clnt_indx)->v4_addr = data->ipv4_addr;
-					/* Add NAT rules after ipv4 RT rules are set */
-					CtList->HandleSTAClientAddEvt(data->ipv4_addr);
-				}
-			}
-		}
-		else
-		{
-				IPACMDBG_H("Invalid client IPv4 address \n");
-				return IPACM_FAILURE;
-		}
-	}
-	else
-	{
-		if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
-				(data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
-		{
-		   IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-                   if(get_client_memptr(wan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
-		   {
-
-		       for(v6_num=0;v6_num < get_client_memptr(wan_client, clnt_indx)->ipv6_set;v6_num++)
-	               {
-			      if( data->ipv6_addr[0] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][0] &&
-			           data->ipv6_addr[1] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][1] &&
-			  	        data->ipv6_addr[2]== get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][2] &&
-			  	         data->ipv6_addr[3] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][3])
-			      {
-			  	    IPACMDBG_H("Already see this ipv6 addr for client:%d\n", clnt_indx);
-			  	    return IPACM_FAILURE; /* not setup the RT rules*/
-			      }
-		       }
-
-		       /* not see this ipv6 before for wifi client*/
-			   get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0];
-			   get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1];
-			   get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2];
-			   get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3];
-			   get_client_memptr(wan_client, clnt_indx)->ipv6_set++;
-		    }
-		    else
-		    {
-		         IPACMDBG_H("Already got 3 ipv6 addr for client:%d\n", clnt_indx);
-			 return IPACM_FAILURE; /* not setup the RT rules*/
-		    }
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle wan client routing rule*/
-int IPACM_Wan::handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype)
-{
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	uint32_t tx_index;
-	int wan_index,v6_num;
-	const int NUM = 1;
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	IPACMDBG_H("Received mac_addr 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]);
-
-	wan_index = get_wan_client_index(mac_addr);
-	if (wan_index == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("wan client not found/attached \n");
-		return IPACM_SUCCESS;
-	}
-
-	if (iptype==IPA_IP_v4) {
-		IPACMDBG_H("wan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", wan_index, iptype,
-				get_client_memptr(wan_client, wan_index)->ipv4_set,
-				get_client_memptr(wan_client, wan_index)->route_rule_set_v4);
-	} else {
-		IPACMDBG_H("wan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wan_index, iptype,
-				get_client_memptr(wan_client, wan_index)->ipv6_set,
-				get_client_memptr(wan_client, wan_index)->route_rule_set_v6);
-	}
-
-	/* Add default routing rules if not set yet */
-	if ((iptype == IPA_IP_v4
-				&& get_client_memptr(wan_client, wan_index)->route_rule_set_v4 == false
-				&& get_client_memptr(wan_client, wan_index)->ipv4_set == true)
-			|| (iptype == IPA_IP_v6
-				&& get_client_memptr(wan_client, wan_index)->route_rule_set_v6 < get_client_memptr(wan_client, wan_index)->ipv6_set
-			   ))
-	{
-
-		/* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-		IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
-		rt_rule = (struct ipa_ioc_add_rt_rule *)
-			calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
-					NUM * sizeof(struct ipa_rt_rule_add));
-
-		if (rt_rule == NULL)
-		{
-			PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = (uint8_t)NUM;
-		rt_rule->ip = iptype;
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			if(iptype != tx_prop->tx[tx_index].ip)
-			{
-				IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
-						tx_index, tx_prop->tx[tx_index].ip,iptype);
-				continue;
-			}
-
-			rt_rule_entry = &rt_rule->rules[0];
-			rt_rule_entry->at_rear = 0;
-
-			if (iptype == IPA_IP_v4)
-			{
-				IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wan_index,
-						get_client_memptr(wan_client, wan_index)->v4_addr);
-
-				IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
-						wan_index,
-						get_client_memptr(wan_client, wan_index)->hdr_hdl_v4);
-				strlcpy(rt_rule->rt_tbl_name,
-						IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name,
-						sizeof(rt_rule->rt_tbl_name));
-				rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-				if (IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-				{
-					IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-							tx_prop->tx[tx_index].alt_dst_pipe);
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-				}
-				else
-				{
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-				}
-				memcpy(&rt_rule_entry->rule.attrib,
-						&tx_prop->tx[tx_index].attrib,
-						sizeof(rt_rule_entry->rule.attrib));
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-				rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, wan_index)->hdr_hdl_v4;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wan_client, wan_index)->v4_addr;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-				rt_rule_entry->rule.hashable = true;
-#endif
-				if (false == m_routing.AddRoutingRule(rt_rule))
-				{
-					IPACMERR("Routing rule addition failed!\n");
-					free(rt_rule);
-					return IPACM_FAILURE;
-				}
-
-				/* copy ipv4 RT hdl */
-				get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4 =
-					rt_rule->rules[0].rt_rule_hdl;
-				IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-						get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4, iptype);
-			} else {
-
-				for(v6_num = get_client_memptr(wan_client, wan_index)->route_rule_set_v6;v6_num < get_client_memptr(wan_client, wan_index)->ipv6_set;v6_num++)
-				{
-					IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n",
-							wan_index,
-							get_client_memptr(wan_client, wan_index)->hdr_hdl_v6);
-
-					/* v6 LAN_RT_TBL */
-					strlcpy(rt_rule->rt_tbl_name,
-							IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
-							sizeof(rt_rule->rt_tbl_name));
-					rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-					/* Uplink going to wan clients should go to IPA */
-					if (IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-					{
-						IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-								tx_prop->tx[tx_index].alt_dst_pipe);
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-					}
-					else
-					{
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-					}
-					memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib));
-					rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, wan_index)->hdr_hdl_v6;;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][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;
-#ifdef FEATURE_IPA_V3
-					rt_rule_entry->rule.hashable = true;
-#endif
-					if (false == m_routing.AddRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule addition failed!\n");
-						free(rt_rule);
-						return IPACM_FAILURE;
-					}
-
-					get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-					IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-							get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[v6_num], iptype);
-
-					/*Copy same rule to v6 WAN RT TBL*/
-					strlcpy(rt_rule->rt_tbl_name,
-							IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
-							sizeof(rt_rule->rt_tbl_name));
-					rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-					/* Downlink traffic from Wan clients, should go exception */
-					rt_rule_entry->rule.dst = iface_query->excp_pipe;
-					memcpy(&rt_rule_entry->rule.attrib,
-							&tx_prop->tx[tx_index].attrib,
-							sizeof(rt_rule_entry->rule.attrib));
-					rt_rule_entry->rule.hdr_hdl = 0;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][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;
-					if (false == m_routing.AddRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule addition failed!\n");
-						free(rt_rule);
-						return IPACM_FAILURE;
-					}
-
-					get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-					IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-							get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num], iptype);
-				}
-			}
-
-		} /* end of for loop */
-
-		free(rt_rule);
-
-		if (iptype == IPA_IP_v4)
-		{
-			get_client_memptr(wan_client, wan_index)->route_rule_set_v4 = true;
-		}
-		else
-		{
-			get_client_memptr(wan_client, wan_index)->route_rule_set_v6 = get_client_memptr(wan_client, wan_index)->ipv6_set;
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/* TODO Handle wan client routing rules also */
-void IPACM_Wan::handle_wlan_SCC_MCC_switch(bool isSCCMode, ipa_ip_type iptype)
-{
-	struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL;
-	struct ipa_rt_rule_mdfy *rt_rule_entry;
-	uint32_t tx_index = 0;
-
-	IPACMDBG("\n");
-	if (tx_prop == NULL || is_default_gateway == false)
-	{
-		IPACMDBG_H("No tx properties or no default route set yet\n");
-		return;
-	}
-
-	const int NUM = tx_prop->num_tx_props;
-
-	for (tx_index = 0; tx_index < tx_prop->num_tx_props; tx_index++)
-	{
-		if (tx_prop->tx[tx_index].ip != iptype)
-		{
-			IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d Ignore\n",
-					tx_index, tx_prop->tx[tx_index].ip, iptype);
-			continue;
-		}
-
-		if (rt_rule == NULL)
-		{
-			rt_rule = (struct ipa_ioc_mdfy_rt_rule *)
-				calloc(1, sizeof(struct ipa_ioc_mdfy_rt_rule) +
-						NUM * sizeof(struct ipa_rt_rule_mdfy));
-
-			if (rt_rule == NULL)
-			{
-				IPACMERR("Unable to allocate memory for modify rt rule\n");
-				return;
-			}
-			IPACMDBG("Allocated memory for %d rules successfully\n", NUM);
-
-			rt_rule->commit = 1;
-			rt_rule->num_rules = 0;
-			rt_rule->ip = iptype;
-		}
-
-		rt_rule_entry = &rt_rule->rules[rt_rule->num_rules];
-
-		memcpy(&rt_rule_entry->rule.attrib,
-				&tx_prop->tx[tx_index].attrib,
-				sizeof(rt_rule_entry->rule.attrib));
-		rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-
-		if (iptype == IPA_IP_v4)
-		{
-			rt_rule_entry->rule.attrib.u.v4.dst_addr      = 0;
-			rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0;
-			rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v4;
-			rt_rule_entry->rt_rule_hdl = wan_route_rule_v4_hdl[tx_index];
-		}
-		else
-		{
-			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;
-
-			rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v6;
-			rt_rule_entry->rt_rule_hdl = wan_route_rule_v6_hdl[tx_index];
-		}
-		IPACMDBG_H("Header handle: 0x%x\n", rt_rule_entry->rule.hdr_hdl);
-
-		if (isSCCMode)
-		{
-			rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-		}
-		else
-		{
-			IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-					tx_prop->tx[tx_index].alt_dst_pipe);
-			rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-		}
-
-		rt_rule->num_rules++;
-	}
-
-	if (rt_rule != NULL)
-	{
-
-		if (rt_rule->num_rules > 0)
-		{
-			if (false == m_routing.ModifyRoutingRule(rt_rule))
-			{
-				IPACMERR("Routing rule modify failed!\n");
-				free(rt_rule);
-				return;
-			}
-
-			IPACMDBG("Routing rule modified successfully \n");
-		}
-
-		free(rt_rule);
-	}
-
-	return;
-}
-
-void IPACM_Wan::handle_wan_client_SCC_MCC_switch(bool isSCCMode, ipa_ip_type iptype)
-{
-	struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL;
-	struct ipa_rt_rule_mdfy *rt_rule_entry;
-
-	uint32_t tx_index = 0, clnt_index =0;
-	int v6_num = 0;
-	const int NUM_RULES = 1;
-
-	int size = sizeof(struct ipa_ioc_mdfy_rt_rule) +
-		NUM_RULES * sizeof(struct ipa_rt_rule_mdfy);
-
-	IPACMDBG("\n");
-
-	if (tx_prop == NULL || is_default_gateway == false)
-	{
-		IPACMDBG_H("No tx properties or no default route set yet\n");
-		return;
-	}
-
-	rt_rule = (struct ipa_ioc_mdfy_rt_rule *)calloc(1, size);
-	if (rt_rule == NULL)
-	{
-		IPACMERR("Unable to allocate memory for modify rt rule\n");
-		return;
-	}
-
-
-	for (clnt_index = 0; clnt_index < num_wan_client; clnt_index++)
-	{
-		if (iptype == IPA_IP_v4)
-		{
-			IPACMDBG_H("wan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n",
-					clnt_index, iptype,
-					get_client_memptr(wan_client, clnt_index)->ipv4_set,
-					get_client_memptr(wan_client, clnt_index)->route_rule_set_v4);
-
-			if( get_client_memptr(wan_client, clnt_index)->route_rule_set_v4 == false ||
-					get_client_memptr(wan_client, clnt_index)->ipv4_set == false)
-			{
-				continue;
-			}
-
-			for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-			{
-				if (iptype != tx_prop->tx[tx_index].ip)
-				{
-					IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d skip\n",
-							tx_index, tx_prop->tx[tx_index].ip, iptype);
-					continue;
-				}
-
-				memset(rt_rule, 0, size);
-				rt_rule->commit = 1;
-				rt_rule->num_rules = NUM_RULES;
-				rt_rule->ip = iptype;
-				rt_rule_entry = &rt_rule->rules[0];
-
-				IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", clnt_index,
-						get_client_memptr(wan_client, clnt_index)->v4_addr);
-
-				IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
-						clnt_index,
-						get_client_memptr(wan_client, clnt_index)->hdr_hdl_v4);
-
-				if (IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-				{
-					IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-							tx_prop->tx[tx_index].alt_dst_pipe);
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-				}
-				else
-				{
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-				}
-
-				memcpy(&rt_rule_entry->rule.attrib,
-						&tx_prop->tx[tx_index].attrib,
-						sizeof(rt_rule_entry->rule.attrib));
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-
-				rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, clnt_index)->hdr_hdl_v4;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wan_client, clnt_index)->v4_addr;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-
-				/* copy ipv4 RT rule hdl */
-				IPACMDBG_H("rt rule hdl=%x\n",
-						get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4);
-
-				rt_rule_entry->rt_rule_hdl =
-					get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4;
-
-				if (false == m_routing.ModifyRoutingRule(rt_rule))
-				{
-					IPACMERR("Routing rule modify failed!\n");
-					free(rt_rule);
-					return;
-				}
-			}
-		}
-		else
-		{
-			IPACMDBG_H("wan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", clnt_index, iptype,
-					get_client_memptr(wan_client, clnt_index)->ipv6_set,
-					get_client_memptr(wan_client, clnt_index)->route_rule_set_v6);
-
-			if( get_client_memptr(wan_client, clnt_index)->route_rule_set_v6 == 0)
-			{
-				continue;
-			}
-
-			for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-			{
-				if (iptype != tx_prop->tx[tx_index].ip)
-				{
-					IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d skip\n",
-							tx_index, tx_prop->tx[tx_index].ip, iptype);
-					continue;
-				}
-
-				memset(rt_rule, 0, size);
-				rt_rule->commit = 1;
-				rt_rule->num_rules = NUM_RULES;
-				rt_rule->ip = iptype;
-				rt_rule_entry = &rt_rule->rules[0];
-
-				/* Modify only rules in v6 WAN RT TBL*/
-				for (v6_num = 0;
-						v6_num < get_client_memptr(wan_client, clnt_index)->route_rule_set_v6;
-						v6_num++)
-				{
-					IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n",
-							clnt_index,
-							get_client_memptr(wan_client, clnt_index)->hdr_hdl_v6);
-
-					/* Downlink traffic from Wan iface, directly through IPA */
-					if (IPACM_Iface::ipacmcfg->isMCC_Mode == true)
-					{
-						IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-								tx_prop->tx[tx_index].alt_dst_pipe);
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-					}
-					else
-					{
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-					}
-
-					memcpy(&rt_rule_entry->rule.attrib,
-							&tx_prop->tx[tx_index].attrib,
-							sizeof(rt_rule_entry->rule.attrib));
-
-					rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, clnt_index)->hdr_hdl_v6;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][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;
-
-					IPACMDBG_H("rt rule hdl=%x\n",
-							get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num]);
-
-					rt_rule_entry->rt_rule_hdl =
-						get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num];
-
-					if (false == m_routing.ModifyRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule Modify failed!\n");
-						free(rt_rule);
-						return;
-					}
-				}
-			} /* end of for loop */
-		}
-
-	}
-
-	free(rt_rule);
-	return;
-}
-
-/*handle eth client */
-int IPACM_Wan::handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 *data)
-{
-	FILE *fp = NULL;
-
-	for (int apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++)
-	{
-		if(data->apn_data_stats_list[apn_index].mux_id == ext_prop->ext[0].mux_id)
-		{
-			IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_NETWORK_STATS, MUX ID %d TX (P%lu/B%lu) RX (P%lu/B%lu)\n",
-				data->apn_data_stats_list[apn_index].mux_id,
-					data->apn_data_stats_list[apn_index].num_ul_packets,
-						data->apn_data_stats_list[apn_index].num_ul_bytes,
-							data->apn_data_stats_list[apn_index].num_dl_packets,
-								data->apn_data_stats_list[apn_index].num_dl_bytes);
-			fp = fopen(IPA_NETWORK_STATS_FILE_NAME, "w");
-			if ( fp == NULL )
-			{
-				IPACMERR("Failed to write pipe stats to %s, error is %d - %s\n",
-						IPA_NETWORK_STATS_FILE_NAME, errno, strerror(errno));
-				return IPACM_FAILURE;
-			}
-
-			fprintf(fp, NETWORK_STATS,
-				dev_name,
-					data->apn_data_stats_list[apn_index].num_ul_packets,
-						data->apn_data_stats_list[apn_index].num_ul_bytes,
-							data->apn_data_stats_list[apn_index].num_dl_packets,
-								data->apn_data_stats_list[apn_index].num_dl_bytes);
-			fclose(fp);
-			break;
-		};
-	}
-	return IPACM_SUCCESS;
-}
-
-int IPACM_Wan::add_dummy_rx_hdr()
-{
-
-#define IFACE_INDEX_LEN 2
-	char index[IFACE_INDEX_LEN];
-	struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
-	int len = 0;
-	struct ipa_ioc_copy_hdr sCopyHeader;
-	struct ipa_hdr_add *ipv6_hdr;
-	struct ethhdr *eth_ipv6;
-	struct ipa_ioc_add_hdr_proc_ctx* pHeaderProcTable = NULL;
-	uint32_t cnt;
-
-	/* get netdev-mac */
-	if(tx_prop != NULL)
-	{
-		/* copy partial header for v6 */
-		for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-		{
-				 if(tx_prop->tx[cnt].ip==IPA_IP_v6)
-				 {
-								IPACMDBG_H("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_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt);
-								if (m_header.CopyHeader(&sCopyHeader) == false)
-								{
-									PERROR("ioctl copy header failed");
-									return IPACM_FAILURE;
-								}
-
-								IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
-								IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-								if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE)
-								{
-									IPACMERR("header oversize\n");
-									return IPACM_FAILURE;
-								}
-								else
-								{
-									/* copy client mac_addr to partial header */
-									IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n",
-											sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst);
-									/* only copy 6 bytes mac-address */
-									if(sCopyHeader.is_eth2_ofst_valid == false)
-									{
-										memcpy(netdev_mac, &sCopyHeader.hdr[0+IPA_MAC_ADDR_SIZE],
-												sizeof(netdev_mac));
-									}
-									else
-									{
-										memcpy(netdev_mac, &sCopyHeader.hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE],
-												sizeof(netdev_mac));
-									}
-								}
-					break;
-				}
-		}
-	}
-
-	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;
-	}
-	ipv6_hdr = &pHeaderDescriptor->hdr[0];
-	/* copy ethernet type to header */
-	eth_ipv6 = (struct ethhdr *) (ipv6_hdr->hdr +2);
-	memcpy(eth_ipv6->h_dest, netdev_mac, ETH_ALEN);
-	memcpy(eth_ipv6->h_source, ext_router_mac_addr, ETH_ALEN);
-	eth_ipv6->h_proto = htons(ETH_P_IPV6);
-	pHeaderDescriptor->commit = true;
-	pHeaderDescriptor->num_hdrs = 1;
-
-	memset(ipv6_hdr->name, 0,
-			 sizeof(pHeaderDescriptor->hdr[0].name));
-
-	snprintf(index,sizeof(index), "%d", ipa_if_num);
-	strlcpy(ipv6_hdr->name, index, sizeof(ipv6_hdr->name));
-	ipv6_hdr->name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-
-	if (strlcat(ipv6_hdr->name, IPA_DUMMY_ETH_HDR_NAME_v6, sizeof(ipv6_hdr->name)) > IPA_RESOURCE_NAME_MAX)
-	{
-		IPACMERR(" header name construction failed exceed length (%d)\n", strlen(ipv6_hdr->name));
-		return IPACM_FAILURE;
-	}
-
-	ipv6_hdr->hdr_len = ETH_HLEN + 2;
-	ipv6_hdr->hdr_hdl = -1;
-	ipv6_hdr->is_partial = 0;
-	ipv6_hdr->status = -1;
-	ipv6_hdr->type = IPA_HDR_L2_ETHERNET_II;
-
-	if (m_header.AddHeader(pHeaderDescriptor) == false ||
-			ipv6_hdr->status != 0)
-	{
-		IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", ipv6_hdr->status);
-		return IPACM_FAILURE;
-	}
-
-	hdr_hdl_dummy_v6 = ipv6_hdr->hdr_hdl;
-	IPACMDBG_H("dummy v6 full header name:%s header handle:(0x%x)\n",
-								 ipv6_hdr->name,
-								 hdr_hdl_dummy_v6);
-	/* add dummy hdr_proc_hdl */
-	len = sizeof(struct ipa_ioc_add_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_add);
-	pHeaderProcTable = (ipa_ioc_add_hdr_proc_ctx*)malloc(len);
-	if(pHeaderProcTable == NULL)
-	{
-		IPACMERR("Cannot allocate header processing table.\n");
-		return IPACM_FAILURE;
-	}
-
-	memset(pHeaderProcTable, 0, len);
-	pHeaderProcTable->commit = 1;
-	pHeaderProcTable->num_proc_ctxs = 1;
-	pHeaderProcTable->proc_ctx[0].hdr_hdl = hdr_hdl_dummy_v6;
-	if (m_header.AddHeaderProcCtx(pHeaderProcTable) == false)
-	{
-		IPACMERR("Adding dummy hhdr_proc_hdl failed with status: %d\n", pHeaderProcTable->proc_ctx[0].status);
-		return IPACM_FAILURE;
-	}
-	else
-	{
-		hdr_proc_hdl_dummy_v6 = pHeaderProcTable->proc_ctx[0].proc_ctx_hdl;
-		IPACMDBG_H("dummy hhdr_proc_hdl is added successfully. (0x%x)\n", hdr_proc_hdl_dummy_v6);
-	}
-	return IPACM_SUCCESS;
-}
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
deleted file mode 100644
index 2152c4d..0000000
--- a/ipacm/src/IPACM_Wlan.cpp
+++ /dev/null
@@ -1,2037 +0,0 @@
-/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
-	notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above
-	copyright notice, this list of conditions and the following
-	disclaimer in the documentation and/or other materials provided
-	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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-@file
-IPACM_Wlan.cpp
-
-@brief
-This file implements the WLAN iface functionality.
-
-@Author
-Skylar Chang
-
-*/
-
-#include <string.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <IPACM_Wlan.h>
-#include <IPACM_Netlink.h>
-#include <fcntl.h>
-#include <sys/inotify.h>
-#include <IPACM_Wan.h>
-#include <IPACM_Lan.h>
-#include <IPACM_IfaceManager.h>
-#include <IPACM_ConntrackListener.h>
-
-
-/* static member to store the number of total wifi clients within all APs*/
-int IPACM_Wlan::total_num_wifi_clients = 0;
-
-int IPACM_Wlan::num_wlan_ap_iface = 0;
-
-IPACM_Wlan::IPACM_Wlan(int iface_index) : IPACM_Lan(iface_index)
-{
-#define WLAN_AMPDU_DEFAULT_FILTER_RULES 3
-
-	wlan_ap_index = IPACM_Wlan::num_wlan_ap_iface;
-	if(wlan_ap_index < 0 || wlan_ap_index > 1)
-	{
-		IPACMERR("Wlan_ap_index is not correct: %d, not creating instance.\n", wlan_ap_index);
-		if (tx_prop != NULL)
-		{
-			free(tx_prop);
-		}
-		if (rx_prop != NULL)
-		{
-			free(rx_prop);
-		}
-		if (iface_query != NULL)
-		{
-			free(iface_query);
-		}
-		delete this;
-		return;
-	}
-
-	num_wifi_client = 0;
-	header_name_count = 0;
-	wlan_client = NULL;
-	wlan_client_len = 0;
-
-	if(iface_query != NULL)
-	{
-		wlan_client_len = (sizeof(ipa_wlan_client)) + (iface_query->num_tx_props * sizeof(wlan_client_rt_hdl));
-		wlan_client = (ipa_wlan_client *)calloc(IPA_MAX_NUM_WIFI_CLIENTS, wlan_client_len);
-		if (wlan_client == NULL)
-		{
-			IPACMERR("unable to allocate memory\n");
-			return;
-		}
-		IPACMDBG_H("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
-	}
-	Nat_App = NatApp::GetInstance();
-	if (Nat_App == NULL)
-	{
-		IPACMERR("unable to get Nat App instance \n");
-		return;
-	}
-
-	IPACM_Wlan::num_wlan_ap_iface++;
-	IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface);
-
-	m_is_guest_ap = false;
-	if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == INTERNET)
-	{
-		m_is_guest_ap = true;
-	}
-	IPACMDBG_H("%s: guest ap enable: %d \n",
-		IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, m_is_guest_ap);
-
-#ifdef FEATURE_IPA_ANDROID
-	/* set the IPA-client pipe enum */
-	if(ipa_if_cate == WLAN_IF)
-	{
-		handle_tethering_client(false, IPACM_CLIENT_WLAN);
-	}
-#endif
-	return;
-}
-
-
-IPACM_Wlan::~IPACM_Wlan()
-{
-	IPACM_EvtDispatcher::deregistr(this);
-	IPACM_IfaceManager::deregistr(this);
-	return;
-}
-
-void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
-{
-	if(is_active == false && event != IPA_LAN_DELETE_SELF)
-	{
-		IPACMDBG_H("The interface is no longer active, return.\n");
-		return;
-	}
-
-	int ipa_interface_index;
-	int wlan_index;
-	ipacm_ext_prop* ext_prop;
-	ipacm_event_iface_up* data_wan;
-	ipacm_event_iface_up_tehter* data_wan_tether;
-
-	switch (event)
-	{
-
-	case IPA_WLAN_LINK_DOWN_EVENT:
-		{
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_WLAN_LINK_DOWN_EVENT\n");
-				handle_down_evt();
-				/* reset the AP-iface category to unknown */
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat = UNKNOWN_IF;
-				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
-				IPACM_Wlan::total_num_wifi_clients = (IPACM_Wlan::total_num_wifi_clients) - \
-                                                                     (num_wifi_client);
-				return;
-			}
-		}
-		break;
-
-	case IPA_PRIVATE_SUBNET_CHANGE_EVENT:
-		{
-			ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-			/* internel event: data->if_index is ipa_if_index */
-			if (data->if_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from itself posting, ignore\n");
-				return;
-			}
-			else
-			{
-				IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from other LAN iface \n");
-#ifdef FEATURE_IPA_ANDROID
-				handle_private_subnet_android(IPA_IP_v4);
-#endif
-				IPACMDBG_H(" delete old private subnet rules, use new sets \n");
-				return;
-			}
-		}
-		break;
-
-	case IPA_LAN_DELETE_SELF:
-	{
-		ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
-		if(data->if_index == ipa_if_num)
-		{
-			IPACM_Wlan::num_wlan_ap_iface--;
-			IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface);
-
-			IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n");
-			IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
-			delete this;
-		}
-		break;
-	}
-
-	case IPA_ADDR_ADD_EVENT:
-		{
-			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_H("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_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
-				{
-					IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
-					/* Post event to NAT */
-					if (data->iptype == IPA_IP_v4)
-					{
-						ipacm_cmd_q_data evt_data;
-						ipacm_event_iface_up *info;
-
-						info = (ipacm_event_iface_up *)
-							 malloc(sizeof(ipacm_event_iface_up));
-						if (info == NULL)
-						{
-							IPACMERR("Unable to allocate memory\n");
-							return;
-						}
-
-						memcpy(info->ifname, dev_name, IF_NAME_LEN);
-						info->ipv4_addr = data->ipv4_addr;
-						info->addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[0].subnet_mask;
-
-						evt_data.event = IPA_HANDLE_WLAN_UP;
-						evt_data.evt_data = (void *)info;
-
-						/* Insert IPA_HANDLE_WLAN_UP to command queue */
-						IPACMDBG_H("posting IPA_HANDLE_WLAN_UP for IPv4 with below information\n");
-						IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n",
-										 info->ipv4_addr, info->addr_mask);
-						IPACM_EvtDispatcher::PostEvt(&evt_data);
-					}
-
-					if(handle_addr_evt(data) == IPACM_FAILURE)
-					{
-						return;
-					}
-
-#ifdef FEATURE_IPA_ANDROID
-					add_dummy_private_subnet_flt_rule(data->iptype);
-					handle_private_subnet_android(data->iptype);
-#else
-					handle_private_subnet(data->iptype);
-#endif
-
-					if (IPACM_Wan::isWanUP(ipa_if_num))
-					{
-						if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
-						{
-							if(IPACM_Wan::backhaul_is_sta_mode == false)
-							{
-								ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-								IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4,
-												IPACM_Wan::getXlat_Mux_Id());
-							}
-							else
-							{
-								IPACM_Lan::handle_wan_up(IPA_IP_v4);
-							}
-						}
-					}
-
-					if(IPACM_Wan::isWanUP_V6(ipa_if_num))
-					{
-						if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
-						{
-							memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix));
-							install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
-
-							if(IPACM_Wan::backhaul_is_sta_mode == false)
-							{
-								ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-								IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-							}
-							else
-							{
-								IPACM_Lan::handle_wan_up(IPA_IP_v6);
-							}
-						}
-					}
-
-					IPACMDBG_H("posting IPA_HANDLE_WLAN_UP:Finished checking wan_up\n");
-					/* checking if SW-RT_enable */
-					if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true)
-					{
-						/* handle software routing enable event*/
-						IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-						handle_software_routing_enable();
-					}
-				}
-			}
-		}
-		break;
-#ifdef FEATURE_IPA_ANDROID
-	case IPA_HANDLE_WAN_UP_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_TETHER event\n");
-
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-			{
-				if(data_wan_tether->is_sta == false)
-				{
-					ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-					IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, 0);
-				}
-				else
-				{
-					IPACM_Lan::handle_wan_up(IPA_IP_v4);
-				}
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_UP_V6_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6_TETHER event\n");
-
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-			{
-				memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
-				install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
-
-				if(data_wan_tether->is_sta == false)
-				{
-					ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-					IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-				}
-				else
-				{
-					IPACM_Lan::handle_wan_up(IPA_IP_v6);
-				}
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_TETHER event\n");
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			if(data_wan_tether->is_sta == false && wlan_ap_index > 0)
-			{
-				IPACMDBG_H("This is not the first AP instance and not STA mode, ignore WAN_DOWN event.\n");
-				return;
-			}
-			if (rx_prop != NULL)
-			{
-				if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-				{
-					handle_wan_down(data_wan_tether->is_sta);
-				}
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_V6_TETHER:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER event\n");
-		data_wan_tether = (ipacm_event_iface_up_tehter*)param;
-		if(data_wan_tether == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
-					data_wan_tether->if_index_tether,
-					IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
-		if (data_wan_tether->if_index_tether == ipa_if_num)
-		{
-			/* clean up v6 RT rules*/
-			IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n");
-			/* reset wifi-client ipv6 rt-rules */
-			handle_wlan_client_reset_rt(IPA_IP_v6);
-
-			if (rx_prop != NULL)
-			{
-				if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-				{
-					handle_wan_down_v6(data_wan_tether->is_sta);
-				}
-			}
-		}
-		break;
-#else
-	case IPA_HANDLE_WAN_UP:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
-
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-		{
-			if(data_wan->is_sta == false)
-			{
-				ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
-				IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, data_wan->xlat_mux_id);
-			}
-			else
-			{
-				IPACM_Lan::handle_wan_up(IPA_IP_v4);
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_UP_V6:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6 event\n");
-
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-		{
-			memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix));
-			install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix);
-
-			if(data_wan->is_sta == false)
-			{
-				ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
-				IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
-			}
-			else
-			{
-				IPACM_Lan::handle_wan_up(IPA_IP_v6);
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n");
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
-		if (rx_prop != NULL)
-		{
-			if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-			{
-				handle_wan_down(data_wan->is_sta);
-			}
-		}
-		break;
-
-	case IPA_HANDLE_WAN_DOWN_V6:
-		IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6 event\n");
-		data_wan = (ipacm_event_iface_up*)param;
-		if(data_wan == NULL)
-		{
-			IPACMERR("No event data is found.\n");
-			return;
-		}
-		/* clean up v6 RT rules*/
-		IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n");
-		/* reset wifi-client ipv6 rt-rules */
-		handle_wlan_client_reset_rt(IPA_IP_v6);
-		IPACMDBG_H("Backhaul is sta mode ? %d\n", data_wan->is_sta);
-		if (rx_prop != NULL)
-		{
-			if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-			{
-				handle_wan_down_v6(data_wan->is_sta);
-			}
-		}
-		break;
-#endif
-
-	case IPA_WLAN_CLIENT_ADD_EVENT_EX:
-		{
-			ipacm_event_data_wlan_ex *data = (ipacm_event_data_wlan_ex *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				int i;
-				for(i=0; i<data->num_of_attribs; i++)
-				{
-					if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
-					{
-						eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->attribs[i].u.mac_addr);
-						break;
-					}
-				}
-				IPACMDBG_H("Received IPA_WLAN_CLIENT_ADD_EVENT\n");
-				handle_wlan_client_init_ex(data);
-			}
-		}
-		break;
-
-	case IPA_WLAN_CLIENT_DEL_EVENT:
-		{
-			ipacm_event_data_mac *data = (ipacm_event_data_mac *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_WLAN_CLIENT_DEL_EVENT\n");
-				eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_DEL, IPA_IP_MAX, data->mac_addr);
-				handle_wlan_client_down_evt(data->mac_addr);
-			}
-		}
-		break;
-
-	case IPA_WLAN_CLIENT_POWER_SAVE_EVENT:
-		{
-			ipacm_event_data_mac *data = (ipacm_event_data_mac *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_WLAN_CLIENT_POWER_SAVE_EVENT\n");
-				handle_wlan_client_pwrsave(data->mac_addr);
-			}
-		}
-		break;
-
-	case IPA_WLAN_CLIENT_RECOVER_EVENT:
-		{
-			ipacm_event_data_mac *data = (ipacm_event_data_mac *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("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_H("change wlan client out of  power safe mode \n");
-					get_client_memptr(wlan_client, wlan_index)->power_save_set = false;
-
-					/* First add route rules and then nat rules */
-					if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */
-					{
-						     IPACMDBG_H("recover client index(%d):ipv4 address: 0x%x\n",
-										 wlan_index,
-										 get_client_memptr(wlan_client, wlan_index)->v4_addr);
-
-						IPACMDBG_H("Adding Route Rules\n");
-						handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
-						IPACMDBG_H("Adding Nat Rules\n");
-						Nat_App->ResetPwrSaveIf(get_client_memptr(wlan_client, wlan_index)->v4_addr);
-					}
-
-					if(get_client_memptr(wlan_client, wlan_index)->ipv6_set != 0) /* for ipv6 */
-					{
-						handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6);
-					}
-				}
-			}
-		}
-		break;
-
-	case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT:
-		{
-			ipacm_event_data_all *data = (ipacm_event_data_all *)param;
-			ipa_interface_index = iface_ipa_index_query(data->if_index);
-			if (ipa_interface_index == ipa_if_num)
-			{
-				IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT\n");
-				if (handle_wlan_client_ipaddr(data) == IPACM_FAILURE)
-				{
-					return;
-				}
-
-				handle_wlan_client_route_rule(data->mac_addr, data->iptype);
-				if (data->iptype == IPA_IP_v4)
-				{
-					/* Add NAT rules after ipv4 RT rules are set */
-					CtList->HandleNeighIpAddrAddEvt(data);
-					//Nat_App->ResetPwrSaveIf(data->ipv4_addr);
-				}
-			}
-		}
-		break;
-
-		/* handle software routing enable event, iface will update softwarerouting_act to true*/
-	case IPA_SW_ROUTING_ENABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n");
-		IPACM_Iface::handle_software_routing_enable();
-		break;
-
-		/* handle software routing disable event, iface will update softwarerouting_act to false*/
-	case IPA_SW_ROUTING_DISABLE:
-		IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n");
-		IPACM_Iface::handle_software_routing_disable();
-		break;
-
-	case IPA_WLAN_SWITCH_TO_SCC:
-		IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n");
-		if(ip_type == IPA_IP_MAX)
-		{
-			handle_SCC_MCC_switch(IPA_IP_v4);
-			handle_SCC_MCC_switch(IPA_IP_v6);
-		}
-		else
-		{
-			handle_SCC_MCC_switch(ip_type);
-		}
-		eth_bridge_post_event(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, IPA_IP_MAX, NULL);
-		break;
-
-	case IPA_WLAN_SWITCH_TO_MCC:
-		IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n");
-		if(ip_type == IPA_IP_MAX)
-		{
-			handle_SCC_MCC_switch(IPA_IP_v4);
-			handle_SCC_MCC_switch(IPA_IP_v6);
-		}
-		else
-		{
-			handle_SCC_MCC_switch(ip_type);
-		}
-		eth_bridge_post_event(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, IPA_IP_MAX, NULL);
-		break;
-
-	case IPA_CRADLE_WAN_MODE_SWITCH:
-	{
-		IPACMDBG_H("Received IPA_CRADLE_WAN_MODE_SWITCH event.\n");
-		ipacm_event_cradle_wan_mode* wan_mode = (ipacm_event_cradle_wan_mode*)param;
-		if(wan_mode == NULL)
-		{
-			IPACMERR("Event data is empty.\n");
-			return;
-		}
-
-		if(wan_mode->cradle_wan_mode == BRIDGE)
-		{
-			handle_cradle_wan_mode_switch(true);
-		}
-		else
-		{
-			handle_cradle_wan_mode_switch(false);
-		}
-	}
-	break;
-	case IPA_CFG_CHANGE_EVENT:
-	{
-		IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT event for %s with new wlan-mode: %s old wlan-mode: %s\n",
-				IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name,
-				(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == 0) ? "full" : "internet",
-				(m_is_guest_ap == true) ? "internet" : "full");
-		/* Add Natting iface to IPACM_Config if there is  Rx/Tx property */
-		if (rx_prop != NULL || tx_prop != NULL)
-		{
-			IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name);
-			IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name);
-		}
-
-		if (m_is_guest_ap == true && (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == FULL))
-		{
-			m_is_guest_ap = false;
-			IPACMDBG_H("wlan mode is switched to full access mode. \n");
-			eth_bridge_handle_wlan_mode_switch();
-		}
-		else if (m_is_guest_ap == false && (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == INTERNET))
-		{
-			m_is_guest_ap = true;
-			IPACMDBG_H("wlan mode is switched to internet only access mode. \n");
-			eth_bridge_handle_wlan_mode_switch();
-		}
-		else
-		{
-			IPACMDBG_H("No change in %s access mode. \n",
-					IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
-		}
-	}
-	break;
-	case IPA_TETHERING_STATS_UPDATE_EVENT:
-	{
-		IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_EVENT event.\n");
-		if (IPACM_Wan::isWanUP(ipa_if_num) || IPACM_Wan::isWanUP_V6(ipa_if_num))
-		{
-			if(IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */
-			{
-				ipa_get_data_stats_resp_msg_v01 *data = (ipa_get_data_stats_resp_msg_v01 *)param;
-				if (data->ipa_stats_type != QMI_IPA_STATS_TYPE_PIPE_V01)
-				{
-					IPACMERR("not valid pipe stats\n");
-					return;
-				}
-				handle_tethering_stats_event(data);
-			};
-		}
-	}
-	break;
-	default:
-		break;
-	}
-	return;
-}
-
-/* handle wifi client initial,copy all partial headers (tx property) */
-int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data)
-{
-
-#define WLAN_IFACE_INDEX_LEN 2
-
-	int res = IPACM_SUCCESS, len = 0, i, evt_size;
-	char index[WLAN_IFACE_INDEX_LEN];
-	struct ipa_ioc_copy_hdr sCopyHeader;
-	struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
-        uint32_t cnt;
-
-	/* start of adding header */
-	IPACMDBG_H("Wifi client number for this iface: %d & total number of wlan clients: %d\n",
-                 num_wifi_client,IPACM_Wlan::total_num_wifi_clients);
-
-	if ((num_wifi_client >= IPA_MAX_NUM_WIFI_CLIENTS) ||
-			(IPACM_Wlan::total_num_wifi_clients >= IPA_MAX_NUM_WIFI_CLIENTS))
-	{
-		IPACMERR("Reached maximum number of wlan clients\n");
-		return IPACM_FAILURE;
-	}
-
-	IPACMDBG_H("Wifi client number: %d\n", num_wifi_client);
-
-	/* add header to IPA */
-	if(tx_prop != NULL)
-	{
-		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;
-		}
-
-		evt_size = sizeof(ipacm_event_data_wlan_ex) + data->num_of_attribs * sizeof(struct ipa_wlan_hdr_attrib_val);
-		get_client_memptr(wlan_client, num_wifi_client)->p_hdr_info = (ipacm_event_data_wlan_ex*)malloc(evt_size);
-		memcpy(get_client_memptr(wlan_client, num_wifi_client)->p_hdr_info, data, evt_size);
-
-		/* copy partial header for v4*/
-		for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
-		{
-			if(tx_prop->tx[cnt].ip==IPA_IP_v4)
-			{
-				IPACMDBG_H("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_H("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_H("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);
-				}
-
-				for(i = 0; i < data->num_of_attribs; i++)
-				{
-					if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
-					{
-						memcpy(get_client_memptr(wlan_client, num_wifi_client)->mac,
-								data->attribs[i].u.mac_addr,
-								sizeof(get_client_memptr(wlan_client, num_wifi_client)->mac));
-
-						/* copy client mac_addr to partial header */
-						memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset],
-									 get_client_memptr(wlan_client, num_wifi_client)->mac,
-									 IPA_MAC_ADDR_SIZE);
-						/* replace src mac to bridge mac_addr if any  */
-						if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-						{
-							memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset+IPA_MAC_ADDR_SIZE],
-									 IPACM_Iface::ipacmcfg->bridge_mac,
-									 IPA_MAC_ADDR_SIZE);
-							IPACMDBG_H("device is in bridge mode \n");
-						}
-
-					}
-					else if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_STA_ID)
-					{
-						/* copy client id to header */
-						memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset],
-									&data->attribs[i].u.sta_id, sizeof(data->attribs[i].u.sta_id));
-					}
-					else
-					{
-						IPACMDBG_H("The attribute type is not expected!\n");
-					}
-				}
-
-				pHeaderDescriptor->commit = true;
-				pHeaderDescriptor->num_hdrs = 1;
-
-				memset(pHeaderDescriptor->hdr[0].name, 0,
-							 sizeof(pHeaderDescriptor->hdr[0].name));
-
-				snprintf(index,sizeof(index), "%d", ipa_if_num);
-				strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-				pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-
-				if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-				snprintf(index,sizeof(index), "%d", header_name_count);
-				if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-
-
-				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;
-				}
-
-				get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
-				IPACMDBG_H("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)
-			{
-				IPACMDBG_H("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_H("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_H("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);
-				}
-
-				for(i = 0; i < data->num_of_attribs; i++)
-				{
-					if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
-					{
-						memcpy(get_client_memptr(wlan_client, num_wifi_client)->mac,
-								data->attribs[i].u.mac_addr,
-								sizeof(get_client_memptr(wlan_client, num_wifi_client)->mac));
-
-						/* copy client mac_addr to partial header */
-						memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset],
-								get_client_memptr(wlan_client, num_wifi_client)->mac,
-								IPA_MAC_ADDR_SIZE);
-
-						/* replace src mac to bridge mac_addr if any  */
-						if (IPACM_Iface::ipacmcfg->ipa_bridge_enable)
-						{
-							memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset+IPA_MAC_ADDR_SIZE],
-									 IPACM_Iface::ipacmcfg->bridge_mac,
-									 IPA_MAC_ADDR_SIZE);
-							IPACMDBG_H("device is in bridge mode \n");
-						}
-					}
-					else if (data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_STA_ID)
-					{
-						/* copy client id to header */
-						memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset],
-								&data->attribs[i].u.sta_id, sizeof(data->attribs[i].u.sta_id));
-					}
-					else
-					{
-						IPACMDBG_H("The attribute type is not expected!\n");
-					}
-				}
-
-				pHeaderDescriptor->commit = true;
-				pHeaderDescriptor->num_hdrs = 1;
-
-				memset(pHeaderDescriptor->hdr[0].name, 0,
-							 sizeof(pHeaderDescriptor->hdr[0].name));
-
-				snprintf(index,sizeof(index), "%d", ipa_if_num);
-				strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name));
-				pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-				if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-
-				snprintf(index,sizeof(index), "%d", header_name_count);
-				if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
-				{
-					IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
-					res = IPACM_FAILURE;
-					goto fail;
-				}
-
-				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;
-				}
-
-				get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
-				IPACMDBG_H("client(%d) v6 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_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 = 0;
-		get_client_memptr(wlan_client, num_wifi_client)->ipv4_set = false;
-		get_client_memptr(wlan_client, num_wifi_client)->ipv6_set = 0;
-		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++;
-		res = IPACM_SUCCESS;
-		IPACMDBG_H("Wifi client number: %d\n", num_wifi_client);
-	}
-	else
-	{
-		return res;
-	}
-
-fail:
-	free(pHeaderDescriptor);
-	return res;
-}
-
-/*handle wifi client */
-int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
-{
-	int clnt_indx;
-	int v6_num;
-	uint32_t ipv6_link_local_prefix = 0xFE800000;
-	uint32_t ipv6_link_local_prefix_mask = 0xFFC00000;
-
-	IPACMDBG_H("number of wifi clients: %d\n", num_wifi_client);
-	IPACMDBG_H(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-					 data->mac_addr[0],
-					 data->mac_addr[1],
-					 data->mac_addr[2],
-					 data->mac_addr[3],
-					 data->mac_addr[4],
-					 data->mac_addr[5]);
-
-	clnt_indx = get_wlan_client_index(data->mac_addr);
-
-		if (clnt_indx == IPACM_INVALID_INDEX)
-		{
-			IPACMERR("wlan client not found/attached \n");
-			return IPACM_FAILURE;
-		}
-
-	IPACMDBG_H("Ip-type received %d\n", data->iptype);
-	if (data->iptype == IPA_IP_v4)
-	{
-		IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr);
-		if (data->ipv4_addr != 0) /* not 0.0.0.0 */
-		{
-			if (get_client_memptr(wlan_client, clnt_indx)->ipv4_set == false)
-			{
-				get_client_memptr(wlan_client, clnt_indx)->v4_addr = data->ipv4_addr;
-				get_client_memptr(wlan_client, clnt_indx)->ipv4_set = true;
-			}
-			else
-			{
-			   /* check if client got new IPv4 address*/
-			   if(data->ipv4_addr == get_client_memptr(wlan_client, clnt_indx)->v4_addr)
-			   {
-			     IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx);
-				 return IPACM_FAILURE;
-			   }
-			   else
-			   {
-			     IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx);
-				 /* delete NAT rules first */
-				 CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, clnt_indx)->v4_addr);
-			     delete_default_qos_rtrules(clnt_indx,IPA_IP_v4);
-		         get_client_memptr(wlan_client, clnt_indx)->route_rule_set_v4 = false;
-			     get_client_memptr(wlan_client, clnt_indx)->v4_addr = data->ipv4_addr;
-			}
-		}
-	}
-	else
-	{
-		    IPACMDBG_H("Invalid client IPv4 address \n");
-		    return IPACM_FAILURE;
-		}
-	}
-	else
-	{
-		if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
-				(data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
-		{
-			IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
-			if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
-				memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0)
-			{
-				IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n");
-				return IPACM_FAILURE;
-			}
-
-			if(get_client_memptr(wlan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
-			{
-
-		       for(v6_num=0;v6_num < get_client_memptr(wlan_client, clnt_indx)->ipv6_set;v6_num++)
-				{
-					if( data->ipv6_addr[0] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][0] &&
-			           data->ipv6_addr[1] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][1] &&
-			  	        data->ipv6_addr[2]== get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][2] &&
-			  	         data->ipv6_addr[3] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][3])
-					{
-			  	    IPACMDBG_H("Already see this ipv6 addr for client:%d\n", clnt_indx);
-			  	    return IPACM_FAILURE; /* not setup the RT rules*/
-			  		break;
-					}
-				}
-
-		       /* not see this ipv6 before for wifi client*/
-			   get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0];
-			   get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1];
-			   get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2];
-			   get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3];
-			   get_client_memptr(wlan_client, clnt_indx)->ipv6_set++;
-		    }
-		    else
-		    {
-				IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx);
-				return IPACM_FAILURE; /* not setup the RT rules*/
-		    }
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle wifi client routing rule*/
-int IPACM_Wlan::handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype)
-{
-	struct ipa_ioc_add_rt_rule *rt_rule;
-	struct ipa_rt_rule_add *rt_rule_entry;
-	uint32_t tx_index;
-	int wlan_index,v6_num;
-	const int NUM = 1;
-
-	if(tx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return IPACM_SUCCESS;
-	}
-
-	IPACMDBG_H("Received mac_addr 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]);
-
-	wlan_index = get_wlan_client_index(mac_addr);
-	if (wlan_index == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("wlan client not found/attached \n");
-		return IPACM_SUCCESS;
-	}
-
-	/* during power_save mode, even receive IP_ADDR_ADD, not setting RT rules*/
-	if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true)
-	{
-		IPACMDBG_H("wlan client is in power safe mode \n");
-		return IPACM_SUCCESS;
-	}
-
-	if (iptype==IPA_IP_v4)
-	{
-		IPACMDBG_H("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);
-	}
-	else
-	{
-		IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wlan_index, iptype,
-				get_client_memptr(wlan_client, wlan_index)->ipv6_set,
-				get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6);
-	}
-
-
-	/* Add default  Qos routing rules if not set yet */
-	if ((iptype == IPA_IP_v4
-				&& get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 == false
-				&& get_client_memptr(wlan_client, wlan_index)->ipv4_set == true)
-			|| (iptype == IPA_IP_v6
-				&& get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 < get_client_memptr(wlan_client, wlan_index)->ipv6_set
-			   ))
-	{
-		rt_rule = (struct ipa_ioc_add_rt_rule *)
-			calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
-					NUM * sizeof(struct ipa_rt_rule_add));
-
-		if (rt_rule == NULL)
-		{
-			PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n");
-			return IPACM_FAILURE;
-		}
-
-		rt_rule->commit = 1;
-		rt_rule->num_rules = (uint8_t)NUM;
-		rt_rule->ip = iptype;
-
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-
-			if(iptype != tx_prop->tx[tx_index].ip)
-			{
-				IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
-						tx_index, tx_prop->tx[tx_index].ip,iptype);
-				continue;
-			}
-
-			rt_rule_entry = &rt_rule->rules[0];
-			rt_rule_entry->at_rear = 0;
-
-			if (iptype == IPA_IP_v4)
-			{
-				IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wlan_index,
-						get_client_memptr(wlan_client, wlan_index)->v4_addr);
-
-				IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
-						wlan_index,
-						get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4);
-				strlcpy(rt_rule->rt_tbl_name,
-						IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
-						sizeof(rt_rule->rt_tbl_name));
-				rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-
-				if(IPACM_Iface::ipacmcfg->isMCC_Mode)
-				{
-					IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-							tx_prop->tx[tx_index].alt_dst_pipe);
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-				}
-				else
-				{
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-				}
-
-				memcpy(&rt_rule_entry->rule.attrib,
-						&tx_prop->tx[tx_index].attrib,
-						sizeof(rt_rule_entry->rule.attrib));
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-				rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
-				rt_rule_entry->rule.hashable = false;
-#endif
-				if (false == m_routing.AddRoutingRule(rt_rule))
-				{
-					IPACMERR("Routing rule addition failed!\n");
-					free(rt_rule);
-					return IPACM_FAILURE;
-				}
-
-				/* copy ipv4 RT hdl */
-				get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4 =
-					rt_rule->rules[0].rt_rule_hdl;
-				IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-						get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4, iptype);
-			}
-			else
-			{
-				for(v6_num = get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6;v6_num < get_client_memptr(wlan_client, wlan_index)->ipv6_set;v6_num++)
-				{
-					IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n",
-							wlan_index,
-							get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6);
-
-					/* v6 LAN_RT_TBL */
-					strlcpy(rt_rule->rt_tbl_name,
-							IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
-							sizeof(rt_rule->rt_tbl_name));
-					rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-					/* Support QCMAP LAN traffic feature, send to A5 */
-					rt_rule_entry->rule.dst = iface_query->excp_pipe;
-					memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib));
-					rt_rule_entry->rule.hdr_hdl = 0;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][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;
-#ifdef FEATURE_IPA_V3
-					rt_rule_entry->rule.hashable = true;
-#endif
-					if (false == m_routing.AddRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule addition failed!\n");
-						free(rt_rule);
-						return IPACM_FAILURE;
-					}
-
-					get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-					IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-							get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[v6_num], iptype);
-
-					/*Copy same rule to v6 WAN RT TBL*/
-					strlcpy(rt_rule->rt_tbl_name,
-							IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
-							sizeof(rt_rule->rt_tbl_name));
-					rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0';
-					/* Downlink traffic from Wan iface, directly through IPA */
-					if(IPACM_Iface::ipacmcfg->isMCC_Mode)
-					{
-						IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-								tx_prop->tx[tx_index].alt_dst_pipe);
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-					}
-					else
-					{
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-					}
-					memcpy(&rt_rule_entry->rule.attrib,
-							&tx_prop->tx[tx_index].attrib,
-							sizeof(rt_rule_entry->rule.attrib));
-					rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][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;
-#ifdef FEATURE_IPA_V3
-					rt_rule_entry->rule.hashable = true;
-#endif
-					if (false == m_routing.AddRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule addition failed!\n");
-						free(rt_rule);
-						return IPACM_FAILURE;
-					}
-
-					get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl;
-
-					IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-							get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num], iptype);
-				}
-			}
-
-		} /* end of for loop */
-
-		free(rt_rule);
-
-		if (iptype == IPA_IP_v4)
-		{
-			get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 = true;
-		}
-		else
-		{
-			get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 = get_client_memptr(wlan_client, wlan_index)->ipv6_set;
-		}
-	}
-
-	return IPACM_SUCCESS;
-}
-
-/*handle wifi client power-save mode*/
-int IPACM_Wlan::handle_wlan_client_pwrsave(uint8_t *mac_addr)
-{
-	int clt_indx;
-	IPACMDBG_H("wlan->handle_wlan_client_pwrsave();\n");
-
-	clt_indx = get_wlan_client_index(mac_addr);
-	if (clt_indx == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("wlan client not attached\n");
-		return IPACM_SUCCESS;
-	}
-
-        if (get_client_memptr(wlan_client, clt_indx)->power_save_set == false)
-	{
-		/* First reset nat rules and then route rules */
-	    if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true)
-	    {
-			IPACMDBG_H("Deleting Nat Rules\n");
-			Nat_App->UpdatePwrSaveIf(get_client_memptr(wlan_client, clt_indx)->v4_addr);
- 	     }
-
-		IPACMDBG_H("Deleting default qos Route Rules\n");
-		delete_default_qos_rtrules(clt_indx, IPA_IP_v4);
-		delete_default_qos_rtrules(clt_indx, IPA_IP_v6);
-                get_client_memptr(wlan_client, clt_indx)->power_save_set = true;
-	}
-	else
-	{
-		IPACMDBG_H("wlan client already in power-save mode\n");
-	}
-    return IPACM_SUCCESS;
-}
-
-/*handle wifi client del mode*/
-int IPACM_Wlan::handle_wlan_client_down_evt(uint8_t *mac_addr)
-{
-	int clt_indx;
-	uint32_t tx_index;
-	int num_wifi_client_tmp = num_wifi_client;
-	int num_v6;
-
-	IPACMDBG_H("total client: %d\n", num_wifi_client_tmp);
-
-	clt_indx = get_wlan_client_index(mac_addr);
-	if (clt_indx == IPACM_INVALID_INDEX)
-	{
-		IPACMDBG_H("wlan client not attached\n");
-		return IPACM_SUCCESS;
-	}
-
-	/* First reset nat rules and then route rules */
-	if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true)
-	{
-	        IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wlan_client, clt_indx)->v4_addr);
-			CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, clt_indx)->v4_addr);
- 	}
-
-	if (delete_default_qos_rtrules(clt_indx, IPA_IP_v4))
-	{
-		IPACMERR("unbale to delete v4 default qos route rules for index: %d\n", clt_indx);
-		return IPACM_FAILURE;
-	}
-
-	if (delete_default_qos_rtrules(clt_indx, IPA_IP_v6))
-	{
-		IPACMERR("unbale to delete v6 default qos route rules for indexn: %d\n", clt_indx);
-		return IPACM_FAILURE;
-	}
-
-	/* 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 = 0;
-	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 = 0;
-	free(get_client_memptr(wlan_client, clt_indx)->p_hdr_info);
-
-	for (; clt_indx < num_wifi_client_tmp - 1; clt_indx++)
-	{
-		get_client_memptr(wlan_client, clt_indx)->p_hdr_info = get_client_memptr(wlan_client, (clt_indx + 1))->p_hdr_info;
-
-		memcpy(get_client_memptr(wlan_client, clt_indx)->mac,
-					 get_client_memptr(wlan_client, (clt_indx + 1))->mac,
-					 sizeof(get_client_memptr(wlan_client, clt_indx)->mac));
-
-		get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v4 = get_client_memptr(wlan_client, (clt_indx + 1))->hdr_hdl_v4;
-		get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v6 = get_client_memptr(wlan_client, (clt_indx + 1))->hdr_hdl_v6;
-		get_client_memptr(wlan_client, clt_indx)->v4_addr = get_client_memptr(wlan_client, (clt_indx + 1))->v4_addr;
-
-		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_header_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv4_header_set;
-		get_client_memptr(wlan_client, clt_indx)->ipv6_header_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;
-
-                for(num_v6=0;num_v6< get_client_memptr(wlan_client, clt_indx)->ipv6_set;num_v6++)
-	        {
-		    get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][0] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][0];
-		    get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][1] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][1];
-		    get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][2] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][2];
-		    get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][3] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][3];
-                }
-
-		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-		{
-			get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4 =
-				 get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4;
-
-			for(num_v6=0;num_v6< get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++)
-			{
-			  get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6] =
-			   	 get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6];
-			  get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6] =
-			   	 get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6];
-		    }
-		}
-	}
-
-	IPACMDBG_H(" %d wifi client deleted successfully \n", num_wifi_client);
-	num_wifi_client = num_wifi_client - 1;
-	IPACM_Wlan::total_num_wifi_clients = IPACM_Wlan::total_num_wifi_clients - 1;
-	IPACMDBG_H(" Number of wifi client: %d\n", num_wifi_client);
-
-	return IPACM_SUCCESS;
-}
-
-/*handle wlan iface down event*/
-int IPACM_Wlan::handle_down_evt()
-{
-	int res = IPACM_SUCCESS, i, num_private_subnet_fl_rule;
-
-	IPACMDBG_H("WLAN ip-type: %d \n", ip_type);
-	/* no iface address up, directly close iface*/
-	if (ip_type == IPACM_IP_NULL)
-	{
-		IPACMERR("Invalid iptype: 0x%x\n", ip_type);
-		goto fail;
-	}
-
-	/* delete wan filter rule */
-	if (IPACM_Wan::isWanUP(ipa_if_num) && rx_prop != NULL)
-	{
-		IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode);
-		IPACM_Lan::handle_wan_down(IPACM_Wan::backhaul_is_sta_mode);
-	}
-
-	if (IPACM_Wan::isWanUP_V6(ipa_if_num) && rx_prop != NULL)
-	{
-		IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode);
-		handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode);
-	}
-	IPACMDBG_H("finished deleting wan filtering rules\n ");
-
-	/* Delete v4 filtering rules */
-	if (ip_type != IPA_IP_v6 && rx_prop != NULL)
-	{
-		/* delete IPv4 icmp filter rules */
-		if(m_filtering.DeleteFilteringHdls(ipv4_icmp_flt_rule_hdl, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE) == false)
-		{
-			IPACMERR("Error Deleting ICMPv4 Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE);
-
-		if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("Error Deleting Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES);
-		IPACMDBG_H("Deleted default v4 filter rules successfully.\n");
-
-		/* delete private-ipv4 filter rules */
-#ifdef FEATURE_IPA_ANDROID
-		if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES) == false)
-		{
-			IPACMERR("Error deleting private subnet IPv4 flt rules.\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES);
-#else
-		num_private_subnet_fl_rule = IPACM_Iface::ipacmcfg->ipa_num_private_subnet > IPA_MAX_PRIVATE_SUBNET_ENTRIES?
-			IPA_MAX_PRIVATE_SUBNET_ENTRIES : IPACM_Iface::ipacmcfg->ipa_num_private_subnet;
-		if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, num_private_subnet_fl_rule) == false)
-		{
-			IPACMERR("Error deleting private subnet flt rules, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_private_subnet_fl_rule);
-#endif
-		IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n");
-	}
-
-	/* Delete v6 filtering rules */
-	if (ip_type != IPA_IP_v4 && rx_prop != NULL)
-	{
-		/* delete icmp filter rules */
-		if(m_filtering.DeleteFilteringHdls(ipv6_icmp_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE) == false)
-		{
-			IPACMERR("Error Deleting ICMPv6 Filtering Rule, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE);
-
-		if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES) == false)
-		{
-			IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-		IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
-		IPACMDBG_H("Deleted default v6 filter rules successfully.\n");
-	}
-	IPACMDBG_H("finished delete filtering rules\n ");
-
-	/* Delete default v4 RT rule */
-	if (ip_type != IPA_IP_v6)
-	{
-		IPACMDBG_H("Delete default v4 routing rules\n");
-		if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4)
-				== false)
-		{
-			IPACMERR("Routing rule deletion failed!\n");
-			res = IPACM_FAILURE;
-			goto fail;
-		}
-	}
-
-	/* Delete default v6 RT rule */
-	if (ip_type != IPA_IP_v4)
-	{
-		IPACMDBG_H("Delete default v6 routing rules\n");
-		/* May have multiple ipv6 iface-RT rules */
-		for (i = 0; i < 2*num_dft_rt_v6; i++)
-		{
-			if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6)
-					== false)
-			{
-				IPACMERR("Routing rule deletion failed!\n");
-				res = IPACM_FAILURE;
-				goto fail;
-			}
-		}
-	}
-	IPACMDBG_H("finished deleting default RT rules\n ");
-
-	eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
-
-	/* free the wlan clients cache */
-	IPACMDBG_H("Free wlan clients cache\n");
-
-	/* Delete private subnet*/
-#ifdef FEATURE_IPA_ANDROID
-	if (ip_type != IPA_IP_v6)
-	{
-		IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
-		IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false)
-		{
-			IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
-		}
-	}
-	/* reset the IPA-client pipe enum */
-	handle_tethering_client(true, IPACM_CLIENT_WLAN);
-#endif /* defined(FEATURE_IPA_ANDROID)*/
-
-fail:
-	/* clean wifi-client header, routing rules */
-	/* clean wifi client rule*/
-	IPACMDBG_H("left %d wifi clients need to be deleted \n ", num_wifi_client);
-	for (i = 0; i < num_wifi_client; i++)
-	{
-		/* First reset nat rules and then route rules */
-		if(get_client_memptr(wlan_client, i)->ipv4_set == true)
-		{
-	        IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wlan_client, i)->v4_addr);
-			CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, i)->v4_addr);
-		}
-
-		if (delete_default_qos_rtrules(i, IPA_IP_v4))
-		{
-			IPACMERR("unbale to delete v4 default qos route rules for index: %d\n", i);
-			res = IPACM_FAILURE;
-		}
-
-		if (delete_default_qos_rtrules(i, IPA_IP_v6))
-		{
-			IPACMERR("unbale to delete v6 default qos route rules for index: %d\n", i);
-			res = IPACM_FAILURE;
-		}
-
-		IPACMDBG_H("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;
-			}
-		}
-
-		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;
-			}
-		}
-	} /* end of for loop */
-
-	/* check software routing fl rule hdl */
-	if (softwarerouting_act == true && rx_prop != NULL )
-	{
-		IPACMDBG_H("Delete sw routing filtering rules\n");
-		IPACM_Iface::handle_software_routing_disable();
-	}
-	IPACMDBG_H("finished delete software-routing filtering rules\n ");
-
-	/* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
-	if (rx_prop != NULL)
-	{
-		IPACMDBG_H("dev %s add producer dependency\n", dev_name);
-		IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
-		IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
-		free(rx_prop);
-	}
-
-	for (i = 0; i < num_wifi_client; i++)
-	{
-		if(get_client_memptr(wlan_client, i)->p_hdr_info != NULL)
-		{
-			free(get_client_memptr(wlan_client, i)->p_hdr_info);
-		}
-	}
-	if(wlan_client != NULL)
-	{
-		free(wlan_client);
-	}
-	if (tx_prop != NULL)
-	{
-		free(tx_prop);
-	}
-
-	if (iface_query != NULL)
-	{
-		free(iface_query);
-	}
-
-	is_active = false;
-	post_del_self_evt();
-
-	return res;
-}
-
-/*handle reset wifi-client rt-rules */
-int IPACM_Wlan::handle_wlan_client_reset_rt(ipa_ip_type iptype)
-{
-	int i, res = IPACM_SUCCESS;
-
-	/* clean wifi-client routing rules */
-	IPACMDBG_H("left %d wifi clients to reset ip-type(%d) rules \n ", num_wifi_client, iptype);
-
-	for (i = 0; i < num_wifi_client; i++)
-	{
-		/* Reset RT rules */
-		res = delete_default_qos_rtrules(i, iptype);
-		if (res != IPACM_SUCCESS)
-		{
-			IPACMERR("Failed to delete old iptype(%d) rules.\n", iptype);
-			return res;
-		}
-
-		/* Reset ip-address */
-		if(iptype == IPA_IP_v4)
-		{
-			get_client_memptr(wlan_client, i)->ipv4_set = false;
-		}
-		else
-		{
-			get_client_memptr(wlan_client, i)->ipv6_set = 0;
-		}
-	} /* end of for loop */
-	return res;
-}
-
-void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype)
-{
-	struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL;
-	struct ipa_rt_rule_mdfy *rt_rule_entry;
-	uint32_t tx_index;
-	int wlan_index, v6_num;
-	const int NUM = 1;
-	int num_wifi_client_tmp = IPACM_Wlan::num_wifi_client;
-	bool isAdded = false;
-
-	if (tx_prop == NULL)
-	{
-		IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
-		return;
-	}
-
-	if (rt_rule == NULL)
-	{
-		rt_rule = (struct ipa_ioc_mdfy_rt_rule *)
-			calloc(1, sizeof(struct ipa_ioc_mdfy_rt_rule) +
-					NUM * sizeof(struct ipa_rt_rule_mdfy));
-
-		if (rt_rule == NULL)
-		{
-			PERROR("Error Locate ipa_ioc_mdfy_rt_rule memory...\n");
-			return;
-		}
-
-		rt_rule->commit = 0;
-		rt_rule->num_rules = NUM;
-		rt_rule->ip = iptype;
-	}
-	rt_rule_entry = &rt_rule->rules[0];
-
-	/* modify ipv4 routing rule */
-	if (iptype == IPA_IP_v4)
-	{
-		for (wlan_index = 0; wlan_index < num_wifi_client_tmp; wlan_index++)
-		{
-			IPACMDBG_H("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);
-
-			if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true ||
-					get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 == false)
-			{
-				IPACMDBG_H("client %d route rules not set\n", wlan_index);
-				continue;
-			}
-
-			IPACMDBG_H("Modify client %d route rule\n", wlan_index);
-			for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-			{
-				if (iptype != tx_prop->tx[tx_index].ip)
-				{
-					IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d ignore\n",
-							tx_index, tx_prop->tx[tx_index].ip, iptype);
-					continue;
-				}
-
-				IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wlan_index,
-						get_client_memptr(wlan_client, wlan_index)->v4_addr);
-
-				IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
-						wlan_index,
-						get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4);
-
-				if (IPACM_Iface::ipacmcfg->isMCC_Mode)
-				{
-					IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-							tx_prop->tx[tx_index].alt_dst_pipe);
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-				}
-				else
-				{
-					rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-				}
-
-				memcpy(&rt_rule_entry->rule.attrib,
-						&tx_prop->tx[tx_index].attrib,
-						sizeof(rt_rule_entry->rule.attrib));
-
-				rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-				rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4;
-
-				rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr;
-				rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-
-				IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
-						get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4, iptype);
-
-				rt_rule_entry->rt_rule_hdl =
-					get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4;
-
-				if (false == m_routing.ModifyRoutingRule(rt_rule))
-				{
-					IPACMERR("Routing rule modify failed!\n");
-					free(rt_rule);
-					return;
-				}
-				isAdded = true;
-			}
-
-		}
-	}
-
-	/* modify ipv6 routing rule */
-	if (iptype == IPA_IP_v6)
-	{
-		for (wlan_index = 0; wlan_index < num_wifi_client_tmp; wlan_index++)
-		{
-
-			IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wlan_index, iptype,
-					get_client_memptr(wlan_client, wlan_index)->ipv6_set,
-					get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6);
-
-			if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true ||
-					(get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 <
-					 get_client_memptr(wlan_client, wlan_index)->ipv6_set) )
-			{
-				IPACMDBG_H("client %d route rules not set\n", wlan_index);
-				continue;
-			}
-
-			IPACMDBG_H("Modify client %d route rule\n", wlan_index);
-			for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
-			{
-				if (iptype != tx_prop->tx[tx_index].ip)
-				{
-					IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d Ignore\n",
-							tx_index, tx_prop->tx[tx_index].ip, iptype);
-					continue;
-				}
-
-				for (v6_num = get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6;
-						v6_num < get_client_memptr(wlan_client, wlan_index)->ipv6_set;
-						v6_num++)
-				{
-
-					IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n",
-							wlan_index,
-							get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6);
-
-					if (IPACM_Iface::ipacmcfg->isMCC_Mode)
-					{
-						IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n",
-								tx_prop->tx[tx_index].alt_dst_pipe);
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe;
-					}
-					else
-					{
-						rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
-					}
-
-					memcpy(&rt_rule_entry->rule.attrib,
-							&tx_prop->tx[tx_index].attrib,
-							sizeof(rt_rule_entry->rule.attrib));
-
-					rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6;
-					rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2];
-					rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][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;
-
-					rt_rule_entry->rt_rule_hdl =
-						get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num];
-
-					if (false == m_routing.ModifyRoutingRule(rt_rule))
-					{
-						IPACMERR("Routing rule modify failed!\n");
-						free(rt_rule);
-						return;
-					}
-					isAdded = true;
-				}
-			}
-
-		}
-	}
-
-
-	if (isAdded)
-	{
-		if (false == m_routing.Commit(iptype))
-		{
-			IPACMERR("Routing rule modify commit failed!\n");
-			free(rt_rule);
-			return;
-		}
-
-		IPACMDBG("Routing rule modified successfully \n");
-	}
-
-	if(rt_rule)
-	{
-		free(rt_rule);
-	}
-	return;
-}
-
-void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch()
-{
-	int i;
-
-	/* ====== post events to mimic WLAN interface goes down/up when AP mode is changing ====== */
-
-	/* first post IFACE_DOWN event */
-	eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
-
-	/* then post IFACE_UP event */
-	if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
-	{
-		eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v4, NULL);
-	}
-	if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
-	{
-		eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v6, NULL);
-	}
-
-	/* at last post CLIENT_ADD event */
-	for(i = 0; i < num_wifi_client; i++)
-	{
-		eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX,
-			get_client_memptr(wlan_client, i)->mac);
-	}
-
-	return;
-}
-
-bool IPACM_Wlan::is_guest_ap()
-{
-	return m_is_guest_ap;
-}
diff --git a/ipacm/src/IPACM_Xml.cpp b/ipacm/src/IPACM_Xml.cpp
deleted file mode 100644
index 120a638..0000000
--- a/ipacm/src/IPACM_Xml.cpp
+++ /dev/null
@@ -1,1176 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-   copyright notice, this list of conditions and the following
-   disclaimer in the documentation and/or other materials provided
-   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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-  @file
-   IPACM_Xml.cpp
-
-  @brief
-   This file implements the XML specific parsing functionality.
-
-  @Author
-   Skylar Chang/Shihuan Liu
-*/
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include "IPACM_Xml.h"
-#include "IPACM_Log.h"
-#include "IPACM_Netlink.h"
-
-static char* IPACM_read_content_element
-(
-	 xmlNode* element
-);
-
-static int32_t IPACM_util_icmp_string
-(
-	 const char* xml_str,
-	 const char* str
-);
-
-static int ipacm_cfg_xml_parse_tree
-(
-	 xmlNode* xml_node,
-	 IPACM_conf_t *config
-);
-
-static int IPACM_firewall_xml_parse_tree
-(
-	 xmlNode* xml_node,
-	 IPACM_firewall_conf_t *config
-);
-
-/*Reads content (stored as child) of the element */
-static char* IPACM_read_content_element
-(
-	 xmlNode* element
-)
-{
-	xmlNode* child_ptr;
-
-	for (child_ptr  = element->children;
-			 child_ptr != NULL;
-			 child_ptr  = child_ptr->next)
-	{
-		if (child_ptr->type == XML_TEXT_NODE)
-		{
-			return (char*)child_ptr->content;
-		}
-	}
-	return NULL;
-}
-
-/* insensitive comparison of a libxml's string (xml_str) and a regular string (str)*/
-static int32_t IPACM_util_icmp_string
-(
-	 const char* xml_str,
-	 const char* str
-)
-{
-	int32_t ret = -1;
-
-	if (NULL != xml_str && NULL != str)
-	{
-		uint32_t len1 = strlen(str);
-		uint32_t len2 = strlen(xml_str);
-		/* If the lengths match, do the string comparison */
-		if (len1 == len2)
-		{
-			ret = strncasecmp(xml_str, str, len1);
-		}
-	}
-
-	return ret;
-}
-
-/* This function read IPACM XML and populate the IPA CM Cfg */
-int ipacm_read_cfg_xml(char *xml_file, IPACM_conf_t *config)
-{
-	xmlDocPtr doc = NULL;
-	xmlNode* root = NULL;
-	int ret_val = IPACM_SUCCESS;
-
-	/* Invoke the XML parser and obtain the parse tree */
-	doc = xmlReadFile(xml_file, "UTF-8", XML_PARSE_NOBLANKS);
-	if (doc == NULL) {
-		IPACMDBG_H("IPACM_xml_parse: libxml returned parse error!\n");
-		return IPACM_FAILURE;
-	}
-
-	/*Get the root of the tree*/
-	root = xmlDocGetRootElement(doc);
-
-	memset(config, 0, sizeof(IPACM_conf_t));
-
-	/* parse the xml tree returned by libxml */
-	ret_val = ipacm_cfg_xml_parse_tree(root, config);
-
-	if (ret_val != IPACM_SUCCESS)
-	{
-		IPACMDBG_H("IPACM_xml_parse: ipacm_cfg_xml_parse_tree returned parse error!\n");
-	}
-
-	/* Free up the libxml's parse tree */
-	xmlFreeDoc(doc);
-
-	return ret_val;
-}
-
-/* This function traverses the xml tree*/
-static int ipacm_cfg_xml_parse_tree
-(
-	 xmlNode* xml_node,
-	 IPACM_conf_t *config
-)
-{
-	int32_t ret_val = IPACM_SUCCESS;
-	int str_size;
-	char* content;
-	char content_buf[MAX_XML_STR_LEN];
-
-	if (NULL == xml_node)
-		return ret_val;
-	while ( xml_node != NULL &&
-				 ret_val == IPACM_SUCCESS)
-	{
-		switch (xml_node->type)
-		{
-		case XML_ELEMENT_NODE:
-			{
-				if (IPACM_util_icmp_string((char*)xml_node->name, system_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, ODU_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IPACMCFG_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IPACMIFACECFG_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IFACE_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IPACMPRIVATESUBNETCFG_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, SUBNET_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IPACMALG_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, ALG_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IPACMNat_TAG) == 0 ||
-						IPACM_util_icmp_string((char*)xml_node->name, IP_PassthroughFlag_TAG) == 0)
-				{
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, IFACE_TAG))
-					{
-						/* increase iface entry number */
-						config->iface_config.num_iface_entries++;
-					}
-
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, SUBNET_TAG))
-					{
-						/* increase iface entry number */
-						config->private_subnet_config.num_subnet_entries++;
-					}
-
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, ALG_TAG))
-					{
-						/* increase iface entry number */
-						config->alg_config.num_alg_entries++;
-					}
-					/* go to child */
-					ret_val = ipacm_cfg_xml_parse_tree(xml_node->children, config);
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, IP_PassthroughMode_TAG) == 0)
-				{
-					IPACMDBG_H("inside IP Passthrough\n");
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (atoi(content_buf))
-						{
-							config->ip_passthrough_mode = true;
-							IPACMDBG_H("Passthrough enable %d buf(%d)\n", config->ip_passthrough_mode, atoi(content_buf));
-						}
-						else
-						{
-							config->ip_passthrough_mode = false;
-							IPACMDBG_H("Passthrough enable %d buf(%d)\n", config->ip_passthrough_mode, atoi(content_buf));
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, ODUMODE_TAG) == 0)
-				{
-					IPACMDBG_H("inside ODU-XML\n");
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (0 == strncasecmp(content_buf, ODU_ROUTER_TAG, str_size))
-						{
-							config->router_mode_enable = true;
-							IPACMDBG_H("router-mode enable %d\n", config->router_mode_enable);
-						}
-						else if (0 == strncasecmp(content_buf, ODU_BRIDGE_TAG, str_size))
-						{
-							config->router_mode_enable = false;
-							IPACMDBG_H("router-mode enable %d\n", config->router_mode_enable);
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, ODUEMBMS_OFFLOAD_TAG) == 0)
-				{
-					IPACMDBG_H("inside ODU-XML\n");
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (atoi(content_buf))
-						{
-							config->odu_embms_enable = true;
-							IPACMDBG_H("router-mode enable %d buf(%d)\n", config->odu_embms_enable, atoi(content_buf));
-						}
-						else
-						{
-							config->odu_embms_enable = false;
-							IPACMDBG_H("router-mode enable %d buf(%d)\n", config->odu_embms_enable, atoi(content_buf));
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, NAME_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						strlcpy(content_buf, content, MAX_XML_STR_LEN);
-						strlcpy(config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].iface_name, content_buf, IPA_IFACE_NAME_LEN);
-						IPACMDBG_H("Name %s\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].iface_name);
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, CATEGORY_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (0 == strncasecmp(content_buf, WANIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = WAN_IF;
-							IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
-						}
-						else if (0 == strncasecmp(content_buf, LANIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = LAN_IF;
-							IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
-						}
-						else if (0 == strncasecmp(content_buf, WLANIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = WLAN_IF;
-							IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
-						}
-						else  if (0 == strncasecmp(content_buf, VIRTUALIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = VIRTUAL_IF;
-							IPACMDBG_H("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_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
-						}
-						else  if (0 == strncasecmp(content_buf, ETHIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = ETH_IF;
-							IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat);
-						}
-						else  if (0 == strncasecmp(content_buf, ODUIF_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = ODU_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, MODE_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (0 == strncasecmp(content_buf, IFACE_ROUTER_MODE_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode = ROUTER;
-							IPACMDBG_H("Iface mode %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode);
-						}
-						else  if (0 == strncasecmp(content_buf, IFACE_BRIDGE_MODE_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode = BRIDGE;
-							IPACMDBG_H("Iface mode %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode);
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, WLAN_MODE_TAG) == 0)
-				{
-					IPACMDBG_H("Inside WLAN-XML\n");
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-
-						if (0 == strncasecmp(content_buf, WLAN_FULL_MODE_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode = FULL;
-							IPACMDBG_H("Wlan-mode full(%d)\n",
-									config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode);
-						}
-						else  if (0 == strncasecmp(content_buf, WLAN_INTERNET_MODE_TAG, str_size))
-						{
-							config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode = INTERNET;
-							config->num_wlan_guest_ap++;
-							IPACMDBG_H("Wlan-mode internet(%d)\n",
-									config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode);
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, SUBNETADDRESS_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						config->private_subnet_config.private_subnet_entries[config->private_subnet_config.num_subnet_entries - 1].subnet_addr
-							 = ntohl(inet_addr(content_buf));
-						IPACMDBG_H("subnet_addr: %s \n", content_buf);
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, SUBNETMASK_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						config->private_subnet_config.private_subnet_entries[config->private_subnet_config.num_subnet_entries - 1].subnet_mask
-							 = ntohl(inet_addr(content_buf));
-						IPACMDBG_H("subnet_mask: %s \n", content_buf);
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, Protocol_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-
-						if (0 == strncasecmp(content_buf, TCP_PROTOCOL_TAG, str_size))
-						{
-							config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol = IPPROTO_TCP;
-							IPACMDBG_H("Protocol %s: %d\n",
-									content_buf, config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol);
-						}
-						else if (0 == strncasecmp(content_buf, UDP_PROTOCOL_TAG, str_size))
-						{
-							config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol = IPPROTO_UDP;
-							IPACMDBG_H("Protocol %s: %d\n",
-									content_buf, config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol);
-						}
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, Port_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].port
-							 = atoi(content_buf);
-						IPACMDBG_H("port %d\n", config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].port);
-					}
-				}
-				else if (IPACM_util_icmp_string((char*)xml_node->name, NAT_MaxEntries_TAG) == 0)
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->nat_max_entries = atoi(content_buf);
-						IPACMDBG_H("Nat Table Max Entries %d\n", config->nat_max_entries);
-					}
-				}
-			}
-			break;
-		default:
-			break;
-		}
-		/* go to sibling */
-		xml_node = xml_node->next;
-	} /* end while */
-	return ret_val;
-}
-
-/* This function read QCMAP CM Firewall XML and populate the QCMAP CM Cfg */
-int IPACM_read_firewall_xml(char *xml_file, IPACM_firewall_conf_t *config)
-{
-	xmlDocPtr doc = NULL;
-	xmlNode* root = NULL;
-	int ret_val;
-
-	IPACM_ASSERT(xml_file != NULL);
-	IPACM_ASSERT(config != NULL);
-
-	/* invoke the XML parser and obtain the parse tree */
-	doc = xmlReadFile(xml_file, "UTF-8", XML_PARSE_NOBLANKS);
-	if (doc == NULL) {
-		IPACMDBG_H("IPACM_xml_parse: libxml returned parse error\n");
-		return IPACM_FAILURE;
-	}
-	/*get the root of the tree*/
-	root = xmlDocGetRootElement(doc);
-
-	/* parse the xml tree returned by libxml*/
-	ret_val = IPACM_firewall_xml_parse_tree(root, config);
-
-	if (ret_val != IPACM_SUCCESS)
-	{
-		IPACMDBG_H("IPACM_xml_parse: ipacm_firewall_xml_parse_tree returned parse error!\n");
-	}
-
-	/* free the tree */
-	xmlFreeDoc(doc);
-
-	return ret_val;
-}
-
-
-/* This function traverses the firewall xml tree */
-static int IPACM_firewall_xml_parse_tree
-(
-	 xmlNode* xml_node,
-	 IPACM_firewall_conf_t *config
-)
-{
-	int mask_value_v6, mask_index;
-	int32_t ret_val = IPACM_SUCCESS;
-	char *content;
-	int str_size;
-	char content_buf[MAX_XML_STR_LEN];
-	struct in6_addr ip6_addr;
-
-	IPACM_ASSERT(config != NULL);
-
-	if (NULL == xml_node)
-		return ret_val;
-
-	while ( xml_node != NULL &&
-				 ret_val == IPACM_SUCCESS)
-	{
-		switch (xml_node->type)
-		{
-
-		case XML_ELEMENT_NODE:
-			{
-				if (0 == IPACM_util_icmp_string((char*)xml_node->name, system_TAG) ||
-						0 == IPACM_util_icmp_string((char*)xml_node->name, MobileAPFirewallCfg_TAG) ||
-						0 == IPACM_util_icmp_string((char*)xml_node->name, Firewall_TAG) ||
-						0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallEnabled_TAG)  ||
-						0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallPktsAllowed_TAG))
-				{
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, Firewall_TAG))
-					{
-						/* increase firewall entry num */
-						config->num_extd_firewall_entries++;
-					}
-
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallPktsAllowed_TAG))
-					{
-						/* setup action of matched rules */
-					    content = IPACM_read_content_element(xml_node);
-					    if (content)
-					    {
-						        str_size = strlen(content);
-						        memset(content_buf, 0, sizeof(content_buf));
-						        memcpy(content_buf, (void *)content, str_size);
-							if (atoi(content_buf)==1)
-							{
-								config->rule_action_accept = true;
-							}
-							else
-							{
-								config->rule_action_accept = false;
-							}
-							IPACMDBG_H(" Allow traffic which matches rules ?:%d\n",config->rule_action_accept);
-					    }
-				        }
-
-					if (0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallEnabled_TAG))
-					{
-						/* setup if firewall enable or not */
-					    content = IPACM_read_content_element(xml_node);
-					    if (content)
-					    {
-						        str_size = strlen(content);
-						        memset(content_buf, 0, sizeof(content_buf));
-						        memcpy(content_buf, (void *)content, str_size);
-							if (atoi(content_buf)==1)
-							{
-								config->firewall_enable = true;
-							}
-						        else
-							{
-								config->firewall_enable = false;
-							}
-							IPACMDBG_H(" Firewall Enable?:%d\n", config->firewall_enable);
-				            }
-					}
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPFamily_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].ip_vsn
-							 = (firewall_ip_version_enum)atoi(content_buf);
-						IPACMDBG_H("\n IP family type is %d \n",
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].ip_vsn);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceAddress_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_ADDR;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceIPAddress_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.src_addr
-							 = ntohl(inet_addr(content_buf));
-						IPACMDBG_H("IPv4 source address is: %s \n", content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceSubnetMask_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.src_addr_mask
-							 = ntohl(inet_addr(content_buf));
-						IPACMDBG_H("IPv4 source subnet mask is: %s \n", content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationAddress_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_ADDR;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationIPAddress_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.dst_addr
-							 = ntohl(inet_addr(content_buf));
-						IPACMDBG_H("IPv4 destination address is: %s \n", content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationSubnetMask_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						content_buf[MAX_XML_STR_LEN-1] = '\0';
-						if (content_buf > 0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.dst_addr_mask
-								 = ntohl(inet_addr(content_buf));
-							IPACMDBG_H("IPv4 destination subnet mask is: %s \n", content_buf);
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4TypeOfService_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TOS;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TOSValue_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos
-							 = atoi(content_buf);
-						IPACMDBG_H("\n IPV4 TOS val is %d \n",
-										 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TOSMask_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos
-							 &= atoi(content_buf);
-						IPACMDBG_H("\n IPv4 TOS mask is %d \n",
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4NextHeaderProtocol_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_PROTOCOL;
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.protocol = atoi(content_buf);
-						IPACMDBG_H("\n IPv4 next header prot is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.protocol);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourceAddress_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |=
-						 IPA_FLT_SRC_ADDR;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourceIPAddress_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						inet_pton(AF_INET6, content_buf, &ip6_addr);
-						memcpy(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr,
-									 ip6_addr.s6_addr, IPACM_IPV6_ADDR_LEN * sizeof(uint8_t));
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[1]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[1]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[2]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[2]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[3]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[3]);
-
-						IPACMDBG_H("\n ipv6 source addr is %d \n ",
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourcePrefix_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						mask_value_v6 = atoi(content_buf);
-						for (mask_index = 0; mask_index < 4; mask_index++)
-						{
-							if (mask_value_v6 >= 32)
-							{
-								mask_v6(32, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr_mask[mask_index]));
-								mask_value_v6 -= 32;
-							}
-							else
-							{
-								mask_v6(mask_value_v6, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr_mask[mask_index]));
-								mask_value_v6 = 0;
-							}
-						}
-						IPACMDBG_H("\n ipv6 source prefix is %d \n", atoi(content_buf));
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationAddress_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |=
-						 IPA_FLT_DST_ADDR;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationIPAddress_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						inet_pton(AF_INET6, content_buf, &ip6_addr);
-						memcpy(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr,
-									 ip6_addr.s6_addr, IPACM_IPV6_ADDR_LEN * sizeof(uint8_t));
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[1]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[1]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[2]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[2]);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[3]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[3]);
-						IPACMDBG_H("\n ipv6 dest addr is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationPrefix_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						mask_value_v6 = atoi(content_buf);
-						for (mask_index = 0; mask_index < 4; mask_index++)
-						{
-							if (mask_value_v6 >= 32)
-							{
-								mask_v6(32, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr_mask[mask_index]));
-								mask_value_v6 -= 32;
-							}
-							else
-							{
-								mask_v6(mask_value_v6, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr_mask[mask_index]));
-								mask_value_v6 = 0;
-							}
-						}
-						IPACMDBG_H("\n ipv6 dest prefix is %d \n", atoi(content_buf));
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6TrafficClass_TAG))
-				{
-					config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TC;
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TrfClsValue_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc
-							 = atoi(content_buf);
-						IPACMDBG_H("\n ipv6 trf class val is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TrfClsMask_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc
-							 &= atoi(content_buf);
-						IPACMDBG_H("\n ipv6 trf class mask is %d \n", atoi(content_buf));
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6NextHeaderProtocol_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.next_hdr
-							 = atoi(content_buf);
-						IPACMDBG_H("\n ipv6 next header protocol is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.next_hdr);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSource_TAG))
-				{
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSourcePort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSourceRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if (atoi(content_buf) != 0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0;
-							IPACMDBG_H("\n tcp source port from %d to %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo,
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT;
-							IPACMDBG_H("\n tcp source port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port);
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestination_TAG))
-				{
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestinationPort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestinationRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if(atoi(content_buf)!=0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0;
-							IPACMDBG_H("\n tcp dest port from %d to %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo,
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT;
-							IPACMDBG_H("\n tcp dest port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port);
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSource_TAG))
-				{
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSourcePort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSourceRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if(atoi(content_buf)!=0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE;
- 							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0;
-							IPACMDBG_H("\n udp source port from %d to %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo,
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT;
-							IPACMDBG_H("\n udp source port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port);
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestination_TAG))
-				{
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestinationPort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestinationRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if(atoi(content_buf)!=0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0;
-							IPACMDBG_H("\n UDP dest port from %d to %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo,
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT;
-							IPACMDBG_H("\n UDP dest port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port);
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ICMPType_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.type = atoi(content_buf);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TYPE;
-						IPACMDBG_H("\n icmp type is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.type);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ICMPCode_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.code = atoi(content_buf);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_CODE;
-						IPACMDBG_H("\n icmp code is %d \n",
-								 config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.code);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ESPSPI_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.spi = atoi(content_buf);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SPI;
-						IPACMDBG_H("\n esp spi is %d \n",
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.spi);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSource_TAG))
-				{
-					/* go to child */
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSourcePort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content,str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSourceRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if(atoi(content_buf)!=0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0;
-							IPACMDBG_H("\n tcp_udp source port from %d to %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo,
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT;
-							IPACMDBG_H("\n tcp_udp source port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port);
-
-						}
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestination_TAG))
-				{
-					ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config);
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestinationPort_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port
-							 = atoi(content_buf);
-					}
-				}
-				else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestinationRange_TAG))
-				{
-					content = IPACM_read_content_element(xml_node);
-					if (content)
-					{
-						str_size = strlen(content);
-						memset(content_buf, 0, sizeof(content_buf));
-						memcpy(content_buf, (void *)content, str_size);
-						if(atoi(content_buf)!=0)
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port;
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi
-								= config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf);
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0;
-							IPACMDBG_H("\n tcp_udp dest port from %d to %d \n",
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo,
-								config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi);
-						}
-						else
-						{
-							config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT;
-							IPACMDBG_H("\n tcp_udp dest port= %d \n",
-									config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port);
-						}
-					}
-				}
-			}
-			break;
-
-		default:
-			break;
-		}
-		/* go to sibling */
-		xml_node = xml_node->next;
-	} /* end while */
-	return ret_val;
-}
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
deleted file mode 100644
index 9bac7a4..0000000
--- a/ipacm/src/IPACM_cfg.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ipacm_cfg.xsd">
-	<ODUCFG>
-		<OduMode>router</OduMode>
-		<eMBMS_offload>0</eMBMS_offload>
-	</ODUCFG>
-	<IPACM>
-		<IPACMIface>
-			<Iface>
-			   <Name>rndis0</Name>
-			   <Category>LAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>ecm0</Name>
-			   <Category>LAN</Category>
-			   <Mode>ROUTER</Mode>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data0</Name>
-			   <Category>WAN</Category>
-			   <Mode>ROUTER</Mode>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data1</Name>
-			   <Category>WAN</Category>
-			</Iface>			
-			<Iface>
-			   <Name>rmnet_data2</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data3</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data4</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data5</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data6</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>rmnet_data7</Name>
-			   <Category>WAN</Category>
-			</Iface>
-			<Iface>
-			   <Name>softap0</Name>
-			   <Category>UNKNOWN</Category>
-			   <WlanMode>full</WlanMode>
-			</Iface>
-			<Iface>
-			   <Name>wlan0</Name>
-			   <Category>UNKNOWN</Category>
-			   <WlanMode>full</WlanMode>
-			</Iface>			
-			<Iface>
-			   <Name>wlan1</Name>
-			   <Category>UNKNOWN</Category>
-			   <WlanMode>full</WlanMode>
-			</Iface>
-			<Iface>
-			   <Name>wlan2</Name>
-			   <Category>UNKNOWN</Category>
-			   <WlanMode>full</WlanMode>
-			</Iface>
-			<Iface>
-			   <Name>wlan3</Name>
-			   <Category>UNKNOWN</Category>
-			   <WlanMode>full</WlanMode>
-			</Iface>
-			<Iface>
-			   <Name>eth0</Name>
-			   <Category>ODU</Category>
-			</Iface>
-			<Iface>
-			   <Name>bridge0</Name>
-			   <Category>VIRTUAL</Category>
-		    </Iface>
-		</IPACMIface>
-		<IPPassthroughFlag>
-			<IPPassthroughMode>0</IPPassthroughMode>
-		</IPPassthroughFlag>
-		<IPACMPrivateSubnet>
-			<Subnet>
-  			   <SubnetAddress>192.168.225.0</SubnetAddress>
-  			   <SubnetMask>255.255.255.0</SubnetMask>
-		    </Subnet>		
-		</IPACMPrivateSubnet>
-		<IPACMALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>21</Port>
-			   <Description>FTP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>554</Port>
-			   <Description>RTSP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>5060</Port>
-			   <Description>SIP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>5060</Port>
-			   <Description>SIP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>1723</Port>
-			   <Description>PPTP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>69</Port>
-			   <Description>TFTP</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>53</Port>
-			   <Description>DNS</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>53</Port>
-			   <Description>DNS</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>10080</Port>
-			   <Description>AMANDA</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>1719</Port>
-			   <Description>H323</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>1720</Port>
-			   <Description>H323</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>6667</Port>
-			   <Description>IRC</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>UDP</Protocol>
-  			   <Port>137</Port>
-			   <Description>NETBIOS_NS</Description>
-		    </ALG>
-			<ALG>
-			   <Protocol>UDP</Protocol>
-			   <Port>138</Port>
-			   <Description>NETBIOS_NS</Description>
-		    </ALG>
-			<ALG>
-  			   <Protocol>TCP</Protocol>
-  			   <Port>6566</Port>
-			   <Description>SANE</Description>
-		    </ALG>
-		</IPACMALG>
-		<IPACMNAT>		
- 	        <MaxNatEntries>500</MaxNatEntries>
-		</IPACMNAT>
-		</IPACM>
-</system>
diff --git a/ipacm/src/Makefile.am b/ipacm/src/Makefile.am
deleted file mode 100644
index 7a62a75..0000000
--- a/ipacm/src/Makefile.am
+++ /dev/null
@@ -1,55 +0,0 @@
-AM_CPPFLAGS = -I./../inc \
-	      -I$(top_srcdir)/ipanat/inc \
-	      ${LIBXML_CFLAGS}
-AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs
-AM_CPPFLAGS	+= -DDEBUG -g -DFEATURE_ETH_BRIDGE_LE
-AM_CPPFLAGS += -DFEATURE_IPA_V3
-
-ipacm_SOURCES =	IPACM_Main.cpp \
-		IPACM_Conntrack_NATApp.cpp\
-		IPACM_ConntrackClient.cpp \
-		IPACM_ConntrackListener.cpp \
-		IPACM_EvtDispatcher.cpp \
-		IPACM_Config.cpp \
-		IPACM_CmdQueue.cpp \
-		IPACM_Log.cpp \
-		IPACM_Filtering.cpp \
-		IPACM_Routing.cpp \
-		IPACM_Header.cpp \
-		IPACM_Lan.cpp \
-		IPACM_Iface.cpp \
-		IPACM_Wlan.cpp \
-		IPACM_Wan.cpp \
-		IPACM_IfaceManager.cpp \
-		IPACM_Neighbor.cpp \
-		IPACM_Netlink.cpp \
-		IPACM_Xml.cpp \
-		IPACM_LanToLan.cpp
-
-bin_PROGRAMS  =  ipacm
-
-requiredlibs =  ${LIBXML_LIB} -lxml2 -lpthread -lnetfilter_conntrack -lnfnetlink\
-               ../../ipanat/src/libipanat.la
-
-AM_CPPFLAGS += "-std=c++0x"
-
-if USE_GLIB
-ipacm_CFLAGS  = $(AM_CFLAGS) -DUSE_GLIB @GLIB_CFLAGS@
-ipacm_LDFLAGS = -lpthread @GLIB_LIBS@
-ipacm_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
-else
-ipacm_CFLAGS = $(AM_CFLAGS)
-ipacm_LDFLAGS = -lpthread
-ipacm_CPPFLAGS = $(AM_CPPFLAGS)
-endif
-ipacm_LDADD =  $(requiredlibs)
-
-LOCAL_MODULE := libipanat
-LOCAL_PRELINK_MODULE := false
-include $(BUILD_SHARED_LIBRARY)
-
-etcdir = ${sysconfdir}
-etc_SCRIPTS = IPACM_cfg.xml
-
-init_ddir = ${sysconfdir}/init.d
-init_d_SCRIPTS = start_ipacm_le
diff --git a/ipacm/src/mobileap_firewall.xml b/ipacm/src/mobileap_firewall.xml
deleted file mode 100644
index 84da527..0000000
--- a/ipacm/src/mobileap_firewall.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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>
diff --git a/ipacm/src/start_ipacm_le b/ipacm/src/start_ipacm_le
deleted file mode 100644
index 3541a0b..0000000
--- a/ipacm/src/start_ipacm_le
+++ /dev/null
@@ -1,57 +0,0 @@
-#! /bin/sh
-#
-################################ 
-# Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-#   copyright notice, this list of conditions and the following
-#   disclaimer in the documentation and/or other materials provided
-#   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.
-
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-################################
-
-# ipacm   init.d script to start the data-ipa Software's ipacm daemon
-
-set -e
-
-case "$1" in
-  start)
-        echo -n "Starting ipacm: "
-        start-stop-daemon -S -b -a ipacm
-        echo "done"
-        ;;
-  stop)
-        echo -n "Stopping ipacm: "
-        start-stop-daemon -K -n ipacm
-        echo "done"
-        ;;
-  restart)
-        $0 stop
-        $0 start
-        ;;
-  *)
-        echo "Usage ipacm { start | stop | restart}" >&2
-        exit 1
-        ;;
-esac
-
-exit 0
diff --git a/ipanat/inc/ipa_nat_drv.h b/ipanat/inc/ipa_nat_drv.h
deleted file mode 100644
index 04e3af9..0000000
--- a/ipanat/inc/ipa_nat_drv.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "string.h"  /* memset */
-#include "stdlib.h"  /* free, malloc */
-#include "stdint.h"  /* uint32_t */
-
-/**
- * struct ipa_nat_ipv4_rule - To hold ipv4 nat rule
- * @target_ip: destination ip address
- * @private_ip: private ip address
- * @target_port: destination port
- * @private_port: private port
- * @protocol: protocol of rule (tcp/udp)
- */
-typedef struct {
-	uint32_t target_ip;
-	uint32_t private_ip;
-	uint16_t target_port;
-	uint16_t private_port;
-	uint16_t public_port;
-	uint8_t  protocol;
-} ipa_nat_ipv4_rule;
-
-/**
- * ipa_nat_add_ipv4_tbl() - create ipv4 nat table
- * @public_ip_addr: [in] public ipv4 address
- * @number_of_entries: [in]  number of nat entries
- * @table_handle: [out] Handle of new ipv4 nat table
- *
- * To create new ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_tbl(uint32_t public_ip_addr,
-				uint16_t number_of_entries,
-				uint32_t *table_handle);
-
-/**
- * ipa_nat_del_ipv4_tbl() - delete ipv4 table
- * @table_handle: [in] Handle of ipv4 nat table
- *
- * To delete given ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_tbl(uint32_t table_handle);
-
-/**
- * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule: [in]  Pointer to new rule
- * @rule_handle: [out] Return the handle to rule
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_rule(uint32_t table_handle,
-				const ipa_nat_ipv4_rule * rule,
-				uint32_t *rule_handle);
-
-/**
- * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_rule(uint32_t table_handle,
-				uint32_t rule_handle);
-
-
-/**
- * ipa_nat_query_timestamp() - to query timestamp
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- * @time_stamp: [out] time stamp of rule
- *
- * To retrieve the timestamp that lastly the
- * nat rule was accessed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_query_timestamp(uint32_t  table_handle,
-				uint32_t  rule_handle,
-				uint32_t  *time_stamp);
-
diff --git a/ipanat/inc/ipa_nat_drvi.h b/ipanat/inc/ipa_nat_drvi.h
deleted file mode 100644
index 6f9b1bd..0000000
--- a/ipanat/inc/ipa_nat_drvi.h
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef IPA_NAT_DRVI_H
-#define IPA_NAT_DRVI_H
-
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <linux/msm_ipa.h>
-#include <netinet/in.h>
-#include <sys/inotify.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include "ipa_nat_logi.h"
-
-#define NAT_DUMP
-
-/*======= IMPLEMENTATION related data structures and functions ======= */
-#ifdef IPA_ON_R3PC
-#define NAT_MMAP_MEM_SIZE (2 * 1024UL * 1024UL - 1)
-#endif
-
-#define IPA_DEV_NAME       "/dev/ipa"
-#define NAT_DEV_DIR        "/dev"
-#define NAT_DEV_NAME       "ipaNatTable"
-#define NAT_DEV_FULL_NAME  "/dev/ipaNatTable"
-
-#define IPA_NAT_TABLE_VALID 1
-#define IPA_NAT_MAX_IP4_TBLS   1
-#define IPA_NAT_BASE_TABLE_PERCENTAGE       .8
-#define IPA_NAT_EXPANSION_TABLE_PERCENTAGE  .2
-
-#define IPA_NAT_NUM_OF_BASE_TABLES      2
-#define IPA_NAT_UNUSED_BASE_ENTRIES     2
-
-#define IPA_NAT_RULE_FLAG_FIELD_OFFSET        18
-#define IPA_NAT_RULE_NEXT_FIELD_OFFSET        8
-#define IPA_NAT_RULE_PROTO_FIELD_OFFSET       22
-
-#define IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET       2
-#define IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET  0
-
-#define IPA_NAT_RULE_FLAG_FIELD_SIZE       2
-#define IPA_NAT_RULE_NEXTFIELD_FIELD_SIZE  2
-
-#define IPA_NAT_FLAG_ENABLE_BIT_MASK  0x8000
-#define IPA_NAT_FLAG_DISABLE_BIT_MASK 0x0000
-
-#define IPA_NAT_FLAG_ENABLE_BIT  1
-#define IPA_NAT_FLAG_DISABLE_BIT 0
-
-#define IPA_NAT_INVALID_PROTO_FIELD_VALUE 0xFF00
-#define IPA_NAT_INVALID_PROTO_FIELD_CMP   0xFF
-
-#define IPA_NAT_INVALID_INDEX 0xFF
-#define IPA_NAT_INVALID_NAT_ENTRY 0x0
-
-#define INDX_TBL_ENTRY_SIZE_IN_BITS  16
-
-/* ----------- Rule id -----------------------
-
-   ------------------------------------------------
-   |  3bits   |    12 bits       |     1 bit      |
-   ------------------------------------------------
-   | reserved | index into table |  0 - base      |
-   |          |                  |  1 - expansion |
-   ------------------------------------------------
-
-*/
-#define IPA_NAT_RULE_HDL_TBL_TYPE_BITS        0x1
-#define IPA_NAT_RULE_HDL_TBL_TYPE_MASK        0x1
-
-/* ----------- sw specif parameter -----
-   ------------------------------------
-   |     16 bits     |     16 bits    |
-   ------------------------------------
-   |  index table    |  prev index    |
-   |     entry       |                |
-   ------------------------------------
------------------------------------------*/
-#define IPA_NAT_SW_PARAM_PREV_INDX_BYTE       0
-#define IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE  1
-
-typedef enum {
-	IPA_NAT_BASE_TBL        = 0,
-	IPA_NAT_EXPN_TBL        = 1,
-	IPA_NAT_INDX_TBL        = 2,
-	IPA_NAT_INDEX_EXPN_TBL  = 3,
-} nat_table_type;
-
-typedef enum {
-	NEXT_INDEX_FIELD,
-	PUBLIC_PORT_FILED,
-	PRIVATE_PORT_FIELD,
-	TARGET_PORT_FIELD,
-	IP_CHKSUM_FIELD,
-	ENABLE_FIELD,
-	TIME_STAMP_FIELD,
-	PROTOCOL_FIELD,
-	TCP_UDP_CHKSUM_FIELD,
-	SW_SPEC_PARAM_PREV_INDEX_FIELD,
-	SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD,
-	INDX_TBL_TBL_ENTRY_FIELD,
-	INDX_TBL_NEXT_INDEX_FILED
-} ipa_nat_rule_field_type;
-
-/*
-	---------------------------------------------
-	|     3      |    2    |    1    |    0      |
-	---------------------------------------------
-	| Public Port(2B)     | Next Index(2B)       |
-	---------------------------------------------
-*/
-typedef struct {
-	uint32_t next_index:16;
-	uint32_t public_port:16;
-} next_index_pub_port;
-
-
-/*
-	---------------------------------------------
-	|     3      |    2    |    1    |    0      |
-	---------------------------------------------
-  |       Flags(2B)     | IP check sum Diff(2B)|
-	|EN|FIN|Resv |        |                      |
-	---------------------------------------------
-*/
-typedef struct {
-	uint32_t ip_chksum:16;
-	uint32_t rsvd1:14;
-	uint32_t redirect:1;
-	uint32_t enable:1;
-} ipcksum_enbl;
-
-
-/*
-	---------------------------------------
-	|   7    |    6    |   5    |    4    |
-	---------------------------------------
-  | Proto   |      TimeStamp(3B)        |
-	| (1B)    |                           |
-	---------------------------------------
-*/
-typedef struct {
-	uint32_t time_stamp:24;
-	uint32_t protocol:8;
-} time_stamp_proto;
-
-
-/*
-	---------------------------------------------
-	|     3      |    2    |    1    |    0      |
-	---------------------------------------------
-  |       next_index     | Table entry         |
-	----------------------------------------------
-*/
-typedef struct {
-	uint16_t tbl_entry;
-	uint16_t next_index;
-} tbl_ent_nxt_indx;
-
-/*--------------------------------------------------
-   32 bit sw_spec_params is interpreted as follows
-   ------------------------------------
-   |     16 bits     |     16 bits    |
-   ------------------------------------
-   |  index table    |  prev index    |
-   |     entry       |                |
-	 ------------------------------------
---------------------------------------------------*/
-typedef struct {
-	uint16_t prev_index;
-	uint16_t index_table_entry;
-} sw_spec_params;
-
-/*------------------------  NAT Table Entry  ---------------------------------------
-
-  -----------------------------------------------------------------------------------
-  |   7    |    6    |   5    |    4    |     3      |    2    |    1    |    0      |
-  -----------------------------------------------------------------------------------
-  |             Target IP(4B)           |             Private IP(4B)                 |
-  -----------------------------------------------------------------------------------
-  |Target Port(2B)   | Private Port(2B) | Public Port(2B)     | Next Index(2B)       |
-  -----------------------------------------------------------------------------------
-  | Proto   |      TimeStamp(3B)        |       Flags(2B)     | IP check sum Diff(2B)|
-  | (1B)    |                           |EN|FIN|Resv |        |                      |
-  -----------------------------------------------------------------------------------
-  | TCP/UDP checksum |  Reserved(2B)    |    SW Specific Parameters(4B)              |
-  |    diff (2B)                        |                                            |
-  -----------------------------------------------------------------------------------
-
-  Dont change below structure definition.
-  It should be same as above(little endian order)
-  -------------------------------------------------------------------------------*/
-struct ipa_nat_rule {
-	uint64_t private_ip:32;
-	uint64_t target_ip:32;
-
-	uint64_t nxt_indx_pub_port:32;
-	uint64_t private_port:16;
-	uint64_t target_port:16;
-
-	uint64_t ip_cksm_enbl:32;
-	uint64_t ts_proto:32;
-
-  /*--------------------------------------------------
-   32 bit sw_spec_params is interpreted as follows
-   ------------------------------------
-   |     16 bits     |     16 bits    |
-   ------------------------------------
-   |  index table    |  prev index    |
-   |     entry       |                |
-	 ------------------------------------
-  --------------------------------------------------*/
-	uint64_t sw_spec_params:32;
-
-	uint64_t rsvd2:16;
-	uint64_t tcp_udp_chksum:16;
-};
-
-struct ipa_nat_sw_rule {
-	uint64_t private_ip:32;
-	uint64_t target_ip:32;
-
-	uint64_t next_index:16;
-	uint64_t public_port:16;
-	uint64_t private_port:16;
-	uint64_t target_port:16;
-
-	uint64_t ip_chksum:16;
-	uint64_t rsvd1:14;
-	uint64_t redirect:1;
-	uint64_t enable:1;
-	uint64_t time_stamp:24;
-	uint64_t protocol:8;
-
-  /*--------------------------------------------------
-   32 bit sw_spec_params is interpreted as follows
-   ------------------------------------
-   |     16 bits     |     16 bits    |
-   ------------------------------------
-   |  index table    |  prev index    |
-   |     entry       |                |
-   ------------------------------------
-  --------------------------------------------------*/
-	uint64_t prev_index:16;
-	uint64_t indx_tbl_entry:16;
-	uint64_t rsvd2:16;
-	uint64_t tcp_udp_chksum:16;
-};
-#define IPA_NAT_TABLE_ENTRY_SIZE        32
-#define IPA_NAT_INDEX_TABLE_ENTRY_SIZE  4
-
-struct ipa_nat_indx_tbl_rule {
-	uint32_t tbl_entry_nxt_indx;
-};
-
-struct ipa_nat_sw_indx_tbl_rule {
-	uint16_t tbl_entry;
-	uint16_t next_index;
-};
-
-struct ipa_nat_indx_tbl_meta_info {
-	uint16_t prev_index;
-};
-
-struct ipa_nat_ip4_table_cache {
-	uint8_t valid;
-	uint32_t public_addr;
-
-	int nat_fd;
-	int size;
-	uint32_t tbl_addr_offset;
-	char table_name[IPA_RESOURCE_NAME_MAX];
-
-	char  *ipv4_rules_addr;
-	char  *index_table_addr;
-	uint16_t   table_entries;
-
-	char *ipv4_expn_rules_addr;
-	char *index_table_expn_addr;
-	uint16_t  expn_table_entries;
-
-	struct ipa_nat_indx_tbl_meta_info *index_expn_table_meta;
-
-	uint16_t *rule_id_array;
-#ifdef IPA_ON_R3PC
-	uint32_t mmap_offset;
-#endif
-
-	uint16_t cur_tbl_cnt;
-	uint16_t cur_expn_tbl_cnt;
-};
-
-struct ipa_nat_cache {
-	struct ipa_nat_ip4_table_cache ip4_tbl[IPA_NAT_MAX_IP4_TBLS];
-	int ipa_fd;
-	uint8_t table_cnt;
-};
-
-struct ipa_nat_indx_tbl_sw_rule {
-	uint16_t tbl_entry;
-	uint16_t next_index;
-	uint16_t prev_index;
-};
-
-typedef enum {
-	IPA_NAT_DEL_TYPE_ONLY_ONE,
-	IPA_NAT_DEL_TYPE_HEAD,
-	IPA_NAT_DEL_TYPE_MIDDLE,
-	IPA_NAT_DEL_TYPE_LAST,
-} del_type;
-
-/**
- * ipa_nati_parse_ipv4_rule_hdl() - prase rule handle
- * @tbl_hdl:	[in] nat table rule
- * @rule_hdl: [in] nat rule handle
- * @expn_tbl: [out] expansion table or not
- * @tbl_entry: [out] index into table
- *
- * Parse the rule handle to retrieve the nat table
- * type and entry of nat table
- *
- * Returns:	None
- */
-void ipa_nati_parse_ipv4_rule_hdl(uint8_t tbl_hdl,
-				uint16_t rule_hdl,
-				uint8_t *expn_tbl,
-				uint16_t *tbl_entry);
-
-/**
- * ipa_nati_make_rule_hdl() - makes nat rule handle
- * @tbl_hdl: [in] nat table handle
- * @tbl_entry: [in]  nat table entry
- *
- * Calculate the nat rule handle which from
- * nat entry which will be returned to client of
- * nat driver
- *
- * Returns:	>0 nat rule handle
- */
-uint16_t ipa_nati_make_rule_hdl(uint16_t tbl_hdl,
-				uint16_t tbl_entry);
-
-uint32_t ipa_nati_get_index_entry_offset(
-				struct ipa_nat_ip4_table_cache*,
-				nat_table_type tbl_type,
-				uint16_t indx_tbl_entry);
-uint32_t ipa_nati_get_entry_offset(
-				struct ipa_nat_ip4_table_cache*,
-				nat_table_type tbl_type,
-				uint16_t  tbl_entry);
-
-int ipa_nati_add_ipv4_tbl(uint32_t public_ip_addr,
-				uint16_t number_of_entries,
-				uint32_t *table_hanle);
-
-int ipa_nati_alloc_table(uint16_t number_of_entries,
-				struct ipa_ioc_nat_alloc_mem *mem,
-				uint16_t*, uint16_t*);
-
-int ipa_nati_update_cache(struct ipa_ioc_nat_alloc_mem *,
-				uint32_t public_ip_addr,
-				uint16_t tbl_entries,
-				uint16_t expn_tbl_entries);
-
-int ipa_nati_del_ipv4_table(uint32_t tbl_hdl);
-int ipa_nati_reset_ipv4_table(uint32_t tbl_hdl);
-int ipa_nati_post_ipv4_init_cmd(uint8_t tbl_index);
-
-int ipa_nati_query_timestamp(uint32_t  tbl_hdl,
-				uint32_t  rule_hdl,
-				uint32_t  *time_stamp);
-
-int ipa_nati_add_ipv4_rule(uint32_t tbl_hdl,
-				const ipa_nat_ipv4_rule *clnt_rule,
-				uint32_t *rule_hdl);
-
-int ipa_nati_generate_rule(uint32_t tbl_hdl,
-				const ipa_nat_ipv4_rule *clnt_rule,
-				struct ipa_nat_sw_rule *rule,
-				struct ipa_nat_indx_tbl_sw_rule *index_sw_rule,
-				uint16_t *tbl_entry,
-				uint16_t *indx_tbl_entry);
-
-uint16_t ipa_nati_expn_tbl_free_entry(struct ipa_nat_rule *expn_tbl,
-				uint16_t size);
-
-uint16_t ipa_nati_generate_tbl_rule(const ipa_nat_ipv4_rule *clnt_rule,
-				struct ipa_nat_sw_rule *sw_rule,
-				struct ipa_nat_ip4_table_cache *tbl_ptr);
-
-uint16_t ipa_nati_generate_index_rule(const ipa_nat_ipv4_rule *clnt_rule,
-				struct ipa_nat_indx_tbl_sw_rule *sw_rule,
-				struct ipa_nat_ip4_table_cache *tbl_ptr);
-
-uint16_t ipa_nati_index_expn_get_free_entry(struct ipa_nat_indx_tbl_rule *tbl,
-				uint16_t size);
-
-void ipa_nati_copy_ipv4_rule_to_hw(
-				struct ipa_nat_ip4_table_cache *ipv4_cache,
-				struct ipa_nat_sw_rule *rule,
-				uint16_t entry, uint8_t tbl_index);
-
-void ipa_nati_copy_ipv4_index_rule_to_hw(
-				struct ipa_nat_ip4_table_cache *ipv4_cache,
-				struct ipa_nat_indx_tbl_sw_rule *indx_sw_rule,
-				uint16_t entry, uint8_t tbl_index);
-
-void ipa_nati_write_next_index(uint8_t tbl_indx,
-				nat_table_type tbl_type,
-				uint16_t value,
-				uint32_t offset);
-
-int ipa_nati_post_ipv4_dma_cmd(uint8_t tbl_indx,
-				uint16_t entry);
-
-int ipa_nati_del_ipv4_rule(uint32_t tbl_hdl,
-				uint32_t rule_hdl);
-
-int ipa_nati_post_del_dma_cmd(uint8_t tbl_indx,
-				uint16_t tbl_entry,
-				uint8_t expn_tbl,
-				del_type rule_pos);
-
-void ipa_nati_find_index_rule_pos(
-				struct ipa_nat_ip4_table_cache *cache_ptr,
-				uint16_t tbl_entry,
-				del_type *rule_pos);
-
-void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx);
-void ipa_nati_find_rule_pos(struct ipa_nat_ip4_table_cache *cache_ptr,
-				uint8_t expn_tbl,
-				uint16_t tbl_entry,
-				del_type *rule_pos);
-void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx);
-
-uint16_t Read16BitFieldValue(uint32_t param,
-				ipa_nat_rule_field_type fld_type);
-
-/* ========================================================
-								Debug functions
-   ========================================================*/
-#ifdef NAT_DUMP
-void ipa_nati_print_rule(struct ipa_nat_rule*, uint32_t);
-void ipa_nat_dump_ipv4_table(uint32_t);
-void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule*,
-				uint32_t, uint16_t);
-int ipa_nati_query_nat_rules(uint32_t, nat_table_type);
-#endif
-
-#endif /* #ifndef IPA_NAT_DRVI_H */
diff --git a/ipanat/inc/ipa_nat_logi.h b/ipanat/inc/ipa_nat_logi.h
deleted file mode 100644
index 5f79cc6..0000000
--- a/ipanat/inc/ipa_nat_logi.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	ipa_nat_logi.h
-
-	@brief
-	This file implements the IPAM log functionality.
-
-	@Author
-	
-
-*/
-
-#ifndef IPA_NAT_LOGI_H
-#define IPA_NAT_LOGI_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-
-#define PERROR(fmt) printf("%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\
-                    perror(fmt);
-
-#define IPAERR(fmt, ...)  printf("ERR: %s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#ifdef DEBUG
-#define IPADBG(fmt, ...) printf("%s:%d %s() " fmt, __FILE__,  __LINE__, __FUNCTION__, ##__VA_ARGS__);
-
-#define IPADUMP(fmt, ...) printf(fmt, ##__VA_ARGS__);
-
-#else
-#define IPADBG(fmt, ...)
-#define IPADUMP(fmt, ...)
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* IPA_NAT_LOGI_H */
diff --git a/ipanat/src/Android.mk b/ipanat/src/Android.mk
deleted file mode 100644
index 21037f0..0000000
--- a/ipanat/src/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-BOARD_PLATFORM_LIST := msm8916
-BOARD_PLATFORM_LIST += msm8909
-ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true)
-ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM)))
-ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH)))
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../inc
-LOCAL_C_INCLUDES += $(LOCAL_PATH)
-ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
-LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
-LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-endif
-
-LOCAL_SRC_FILES := ipa_nat_drv.c \
-                   ipa_nat_drvi.c
-
-LOCAL_CFLAGS := -DDEBUG
-LOCAL_MODULE := libipanat
-LOCAL_MODULE_TAGS := optional
-LOCAL_PRELINK_MODULE := false
-LOCAL_CLANG := true
-include $(BUILD_SHARED_LIBRARY)
-
-endif # $(TARGET_ARCH)
-endif
-endif
diff --git a/ipanat/src/Makefile.am b/ipanat/src/Makefile.am
deleted file mode 100644
index 8bdb9b8..0000000
--- a/ipanat/src/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-AM_CFLAGS = -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
-AM_CFLAGS += -I./../inc
-#AM_CFLAGS += -DDEBUG -g
-
-common_CFLAGS =  -DUSE_GLIB @GLIB_CFLAGS@
-common_LDFLAGS = -lrt @GLIB_LIBS@
-
-c_sources   = ipa_nat_drv.c \
-              ipa_nat_drvi.c \
-              ipa_nat_logi.c
-
-library_includedir = $(pkgincludedir)
-library_include_HEADERS = ./../inc/ipa_nat_drvi.h \
-                          ./../inc/ipa_nat_drv.h \
-                          ./../inc/ipa_nat_logi.h
-
-lib_LTLIBRARIES = libipanat.la
-libipanat_la_C = @C@
-libipanat_la_SOURCES = $(c_sources)
-libipanat_la_CFLAGS = $(AM_CFLAGS) $(common_CFLAGS)
-libipanat_la_LDFLAGS = -shared $(common_LDFLAGS) -version-info 1:0:0
diff --git a/ipanat/src/ipa_nat_drv.c b/ipanat/src/ipa_nat_drv.c
deleted file mode 100644
index 66504e1..0000000
--- a/ipanat/src/ipa_nat_drv.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-/**
- * ipa_nat_add_ipv4_tbl() - create ipv4 nat table
- * @public_ip_addr: [in] public ipv4 address
- * @number_of_entries: [in]  number of nat entries
- * @table_handle: [out] Handle of new ipv4 nat table
- *
- * To create new ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_tbl(uint32_t public_ip_addr,
-		uint16_t number_of_entries,
-		uint32_t *tbl_hdl)
-{
-  int ret;
-
-  if (NULL == tbl_hdl || 0 == number_of_entries) {
-    IPAERR("Invalid parameters \n");
-    return -EINVAL;
-  }
-
-  ret = ipa_nati_add_ipv4_tbl(public_ip_addr,
-								number_of_entries,
-								tbl_hdl);
-  if (ret != 0) {
-    IPAERR("unable to add table \n");
-    return -EINVAL;
-  }
-  IPADBG("Returning table handle 0x%x\n", *tbl_hdl);
-
-  return ret;
-} /* __ipa_nat_add_ipv4_tbl() */
-
-/**
- * ipa_nat_del_ipv4_tbl() - delete ipv4 table
- * @table_handle: [in] Handle of ipv4 nat table
- *
- * To delete given ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_tbl(uint32_t tbl_hdl)
-{
-  if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-      tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
-    IPAERR("invalid table handle passed \n");
-    return -EINVAL;
-  }
-  IPADBG("Passed Table Handle: 0x%x\n", tbl_hdl);
-
-  return ipa_nati_del_ipv4_table(tbl_hdl);
-}
-
-/**
- * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule: [in]  Pointer to new rule
- * @rule_handle: [out] Return the handle to rule
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_add_ipv4_rule(uint32_t tbl_hdl,
-		const ipa_nat_ipv4_rule *clnt_rule,
-		uint32_t *rule_hdl)
-{
-  int result = -EINVAL;
-
-  if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-      tbl_hdl > IPA_NAT_MAX_IP4_TBLS || NULL == rule_hdl ||
-      NULL == clnt_rule) {
-    IPAERR("invalide table handle passed \n");
-    return result;
-  }
-  IPADBG("Passed Table handle: 0x%x\n", tbl_hdl);
-
-  if (ipa_nati_add_ipv4_rule(tbl_hdl, clnt_rule, rule_hdl) != 0) {
-		return result;
-	}
-
-  IPADBG("returning rule handle 0x%x\n", *rule_hdl);
-  return 0;
-}
-
-
-/**
- * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- *
- * To insert new ipv4 nat rule into ipv4 nat table
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_del_ipv4_rule(uint32_t tbl_hdl,
-		uint32_t rule_hdl)
-{
-  int result = -EINVAL;
-
-  if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-      IPA_NAT_INVALID_NAT_ENTRY == rule_hdl) {
-    IPAERR("invalide parameters\n");
-    return result;
-  }
-  IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl);
-
-  result = ipa_nati_del_ipv4_rule(tbl_hdl, rule_hdl);
-  if (result) {
-    IPAERR("unable to delete rule from hw \n");
-    return result;
-  }
-
-  return 0;
-}
-
-/**
- * ipa_nat_query_timestamp() - to query timestamp
- * @table_handle: [in] handle of ipv4 nat table
- * @rule_handle: [in] ipv4 nat rule handle
- * @time_stamp: [out] time stamp of rule
- *
- * To retrieve the timestamp that lastly the
- * nat rule was accessed
- *
- * Returns:	0  On Success, negative on failure
- */
-int ipa_nat_query_timestamp(uint32_t  tbl_hdl,
-		uint32_t  rule_hdl,
-		uint32_t  *time_stamp)
-{
-
-  if (0 == tbl_hdl || tbl_hdl > IPA_NAT_MAX_IP4_TBLS ||
-      NULL == time_stamp) {
-    IPAERR("invalid parameters passed \n");
-    return -EINVAL;
-  }
-  IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl);
-
-  return ipa_nati_query_timestamp(tbl_hdl, rule_hdl, time_stamp);
-}
-
-
diff --git a/ipanat/src/ipa_nat_drvi.c b/ipanat/src/ipa_nat_drvi.c
deleted file mode 100644
index 9b96c44..0000000
--- a/ipanat/src/ipa_nat_drvi.c
+++ /dev/null
@@ -1,2368 +0,0 @@
-/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-
-#ifdef USE_GLIB
-#include <glib.h>
-#define strlcpy g_strlcpy
-#endif
-
-struct ipa_nat_cache ipv4_nat_cache;
-pthread_mutex_t nat_mutex    = PTHREAD_MUTEX_INITIALIZER;
-
-/* ------------------------------------------
-		UTILITY FUNCTIONS START
-	 --------------------------------------------*/
-
-/**
- * UpdateSwSpecParams() - updates sw specific params
- * @rule: [in/out] nat table rule
- * @param_type: [in] which param need to update
- * @value: [in] value of param
- *
- * Update SW specific params in the passed rule.
- *
- * Returns: None
- */
-void UpdateSwSpecParams(struct ipa_nat_rule *rule,
-															uint8_t param_type,
-															uint32_t value)
-{
-	uint32_t temp = rule->sw_spec_params;
-
-	if (IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE == param_type) {
-		value = (value << INDX_TBL_ENTRY_SIZE_IN_BITS);
-		temp &= 0x0000FFFF;
-	} else {
-		temp &= 0xFFFF0000;
-	}
-
-	temp = (temp | value);
-	rule->sw_spec_params = temp;
-	return;
-}
-
-/**
- * Read8BitFieldValue()
- * @rule: [in/out]
- * @param_type: [in]
- * @value: [in]
- *
- *
- *
- * Returns: None
- */
-
-uint8_t Read8BitFieldValue(uint32_t param,
-														ipa_nat_rule_field_type fld_type)
-{
-	void *temp = (void *)&param;
-
-	switch (fld_type) {
-
-	case PROTOCOL_FIELD:
-		return ((time_stamp_proto *)temp)->protocol;
-
-	default:
-		IPAERR("Invalid Field type passed\n");
-		return 0;
-	}
-}
-
-uint16_t Read16BitFieldValue(uint32_t param,
-														 ipa_nat_rule_field_type fld_type)
-{
-	void *temp = (void *)&param;
-
-	switch (fld_type) {
-
-	case NEXT_INDEX_FIELD:
-		return ((next_index_pub_port *)temp)->next_index;
-
-	case PUBLIC_PORT_FILED:
-		return ((next_index_pub_port *)temp)->public_port;
-
-	case ENABLE_FIELD:
-		return ((ipcksum_enbl *)temp)->enable;
-
-	case SW_SPEC_PARAM_PREV_INDEX_FIELD:
-		return ((sw_spec_params *)temp)->prev_index;
-
-	case SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD:
-		return ((sw_spec_params *)temp)->index_table_entry;
-
-	case INDX_TBL_TBL_ENTRY_FIELD:
-		return ((tbl_ent_nxt_indx *)temp)->tbl_entry;
-
-	case INDX_TBL_NEXT_INDEX_FILED:
-		return ((tbl_ent_nxt_indx *)temp)->next_index;
-
-#ifdef NAT_DUMP
-	case IP_CHKSUM_FIELD:
-		return ((ipcksum_enbl *)temp)->ip_chksum;
-#endif
-
-	default:
-		IPAERR("Invalid Field type passed\n");
-		return 0;
-	}
-}
-
-uint32_t Read32BitFieldValue(uint32_t param,
-														 ipa_nat_rule_field_type fld_type)
-{
-
-	void *temp = (void *)&param;
-
-	switch (fld_type) {
-
-	case TIME_STAMP_FIELD:
-		return ((time_stamp_proto *)temp)->time_stamp;
-
-	default:
-		IPAERR("Invalid Field type passed\n");
-		return 0;
-	}
-}
-
-
-/**
- * CreateNatDevice() - Create nat devices
- * @mem: [in] name of device that need to create
- *
- * Create Nat device and Register for file create
- * notification in given directory and wait till
- * receive notification
- *
- * Returns: 0 on success, negative on failure
- */
-int CreateNatDevice(struct ipa_ioc_nat_alloc_mem *mem)
-{
-	int ret;
-
-	ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_ALLOC_NAT_MEM, mem);
-	if (ret != 0) {
-		perror("CreateNatDevice(): ioctl error value");
-		IPAERR("unable to post nat mem init. Error ;%d\n", ret);
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		return -EINVAL;
-	}
-	IPADBG("posted IPA_IOC_ALLOC_NAT_MEM to kernel successfully\n");
-	return 0;
-}
-
-/**
- * GetNearest2Power() - Returns the nearest power of 2
- * @num: [in] given number
- * @ret: [out] nearest power of 2
- *
- * Returns the nearest power of 2 for a
- * given number
- *
- * Returns: 0 on success, negative on failure
- */
-int GetNearest2Power(uint16_t num, uint16_t *ret)
-{
-	uint16_t number = num;
-	uint16_t tmp = 1;
-	*ret = 0;
-
-	if (0 == num) {
-		return -EINVAL;
-	}
-
-	if (1 == num) {
-		*ret = 2;
-		return 0;
-	}
-
-	for (;;) {
-		if (1 == num) {
-			if (number != tmp) {
-				tmp *= 2;
-			}
-
-			*ret = tmp;
-			return 0;
-		}
-
-		num >>= 1;
-		tmp *= 2;
-	}
-
-	return -EINVAL;
-}
-
-/**
- * GetNearestEven() - Returns the nearest even number
- * @num: [in] given number
- * @ret: [out] nearest even number
- *
- * Returns the nearest even number for a given number
- *
- * Returns: 0 on success, negative on failure
- */
-void GetNearestEven(uint16_t num, uint16_t *ret)
-{
-
-	if (num < 2) {
-		*ret = 2;
-		return;
-	}
-
-	while ((num % 2) != 0) {
-		num = num + 1;
-	}
-
-	*ret = num;
-	return;
-}
-
-/**
- * dst_hash() - Find the index into ipv4 base table
- * @trgt_ip: [in] Target IP address
- * @trgt_port: [in]  Target port
- * @public_port: [in]  Public port
- * @proto: [in] Protocol (TCP/IP)
- * @size: [in] size of the ipv4 base Table
- *
- * This hash method is used to find the hash index of new nat
- * entry into ipv4 base table. In case of zero index, the
- * new entry will be stored into N-1 index where N is size of
- * ipv4 base table
- *
- * Returns: >0 index into ipv4 base table, negative on failure
- */
-static uint16_t dst_hash(uint32_t trgt_ip, uint16_t trgt_port,
-				uint16_t public_port, uint8_t proto,
-				uint16_t size)
-{
-	uint16_t hash = ((uint16_t)(trgt_ip)) ^ ((uint16_t)(trgt_ip >> 16)) ^
-		 (trgt_port) ^ (public_port) ^ (proto);
-
-	IPADBG("trgt_ip: 0x%x trgt_port: 0x%x\n", trgt_ip, trgt_port);
-	IPADBG("public_port: 0x%x\n", public_port);
-	IPADBG("proto: 0x%x size: 0x%x\n", proto, size);
-
-	hash = (hash & size);
-
-	/* If the hash resulted to zero then set it to maximum value
-		 as zero is unused entry in nat tables */
-	if (0 == hash) {
-		return size;
-	}
-
-	IPADBG("dst_hash returning value: %d\n", hash);
-	return hash;
-}
-
-/**
- * src_hash() - Find the index into ipv4 index base table
- * @priv_ip: [in] Private IP address
- * @priv_port: [in]  Private port
- * @trgt_ip: [in]  Target IP address
- * @trgt_port: [in] Target Port
- * @proto: [in]  Protocol (TCP/IP)
- * @size: [in] size of the ipv4 index base Table
- *
- * This hash method is used to find the hash index of new nat
- * entry into ipv4 index base table. In case of zero index, the
- * new entry will be stored into N-1 index where N is size of
- * ipv4 index base table
- *
- * Returns: >0 index into ipv4 index base table, negative on failure
- */
-static uint16_t src_hash(uint32_t priv_ip, uint16_t priv_port,
-				uint32_t trgt_ip, uint16_t trgt_port,
-				uint8_t proto, uint16_t size)
-{
-	uint16_t hash =  ((uint16_t)(priv_ip)) ^ ((uint16_t)(priv_ip >> 16)) ^
-		 (priv_port) ^
-		 ((uint16_t)(trgt_ip)) ^ ((uint16_t)(trgt_ip >> 16)) ^
-		 (trgt_port) ^ (proto);
-
-	IPADBG("priv_ip: 0x%x priv_port: 0x%x\n", priv_ip, priv_port);
-	IPADBG("trgt_ip: 0x%x trgt_port: 0x%x\n", trgt_ip, trgt_port);
-	IPADBG("proto: 0x%x size: 0x%x\n", proto, size);
-
-	hash = (hash & size);
-
-	/* If the hash resulted to zero then set it to maximum value
-		 as zero is unused entry in nat tables */
-	if (0 == hash) {
-		return size;
-	}
-
-	IPADBG("src_hash returning value: %d\n", hash);
-	return hash;
-}
-
-/**
- * ipa_nati_calc_ip_cksum() - Calculate the source nat
- *														 IP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @priv_ip_addr: [in]	Private ip address
- *
- * source nat ip checksum different is calculated as
- * public_ip_addr - private_ip_addr
- * Here we are using 1's complement to represent -ve number.
- * So take 1's complement of private ip addr and add it
- * to public ip addr.
- *
- * Returns: >0 ip checksum diff
- */
-static uint16_t ipa_nati_calc_ip_cksum(uint32_t pub_ip_addr,
-										uint32_t priv_ip_addr)
-{
-	uint16_t ret;
-	uint32_t cksum = 0;
-
-	/* Add LSB(2 bytes) of public ip address to cksum */
-	cksum += (pub_ip_addr & 0xFFFF);
-
-	/* Add MSB(2 bytes) of public ip address to cksum
-		and check for carry forward(CF), if any add it
-	*/
-	cksum += (pub_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private ip address */
-	priv_ip_addr = (~priv_ip_addr);
-
-	/* Add LSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr & 0xFFFF);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add MSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Return the LSB(2 bytes) of checksum	*/
-	ret = (uint16_t)cksum;
-	return ret;
-}
-
-/**
- * ipa_nati_calc_tcp_udp_cksum() - Calculate the source nat
- *																TCP/UDP checksum diff
- * @pub_ip_addr: [in] public ip address
- * @pub_port: [in] public tcp/udp port
- * @priv_ip_addr: [in]	Private ip address
- * @priv_port: [in] Private tcp/udp prot
- *
- * source nat tcp/udp checksum is calculated as
- * (pub_ip_addr + pub_port) - (priv_ip_addr + priv_port)
- * Here we are using 1's complement to represent -ve number.
- * So take 1's complement of prviate ip addr &private port
- * and add it public ip addr & public port.
- *
- * Returns: >0 tcp/udp checksum diff
- */
-static uint16_t ipa_nati_calc_tcp_udp_cksum(uint32_t pub_ip_addr,
-										uint16_t pub_port,
-										uint32_t priv_ip_addr,
-										uint16_t priv_port)
-{
-	uint16_t ret = 0;
-	uint32_t cksum = 0;
-
-	/* Add LSB(2 bytes) of public ip address to cksum */
-	cksum += (pub_ip_addr & 0xFFFF);
-
-	/* Add MSB(2 bytes) of public ip address to cksum
-		and check for carry forward(CF), if any add it
-	*/
-	cksum += (pub_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add public port to cksum and
-		 check for carry forward(CF), if any add it */
-	cksum += pub_port;
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private ip address */
-	priv_ip_addr = (~priv_ip_addr);
-
-	/* Add LSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add it
-	*/
-	cksum += (priv_ip_addr & 0xFFFF);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Add MSB(2 bytes) of private ip address to cksum
-		 and check for carry forward(CF), if any add
-	*/
-	cksum += (priv_ip_addr>>16);
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* Calculate the 1's complement of private port */
-	priv_port = (~priv_port);
-
-	/* Add public port to cksum and
-	 check for carry forward(CF), if any add it */
-	cksum += priv_port;
-	if (cksum >> 16) {
-		cksum = (cksum & 0x0000FFFF);
-		cksum += 1;
-	}
-
-	/* return the LSB(2 bytes) of checksum */
-	ret = (uint16_t)cksum;
-	return ret;
-}
-
-/**
- * ipa_nati_make_rule_hdl() - makes nat rule handle
- * @tbl_hdl: [in] nat table handle
- * @tbl_entry: [in]  nat table entry
- *
- * Calculate the nat rule handle which from
- * nat entry which will be returned to client of
- * nat driver
- *
- * Returns: >0 nat rule handle
- */
-uint16_t ipa_nati_make_rule_hdl(uint16_t tbl_hdl,
-				uint16_t tbl_entry)
-{
-	struct ipa_nat_ip4_table_cache *tbl_ptr;
-	uint16_t rule_hdl = 0;
-	uint16_t cnt = 0;
-
-	tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1];
-
-	if (tbl_entry >= tbl_ptr->table_entries) {
-		/* Increase the current expansion table count */
-		tbl_ptr->cur_expn_tbl_cnt++;
-
-		/* Update the index into table */
-		rule_hdl = tbl_entry - tbl_ptr->table_entries;
-		rule_hdl = (rule_hdl << IPA_NAT_RULE_HDL_TBL_TYPE_BITS);
-		/* Update the table type mask */
-		rule_hdl = (rule_hdl | IPA_NAT_RULE_HDL_TBL_TYPE_MASK);
-	} else {
-		/* Increase the current count */
-		tbl_ptr->cur_tbl_cnt++;
-
-		rule_hdl = tbl_entry;
-		rule_hdl = (rule_hdl << IPA_NAT_RULE_HDL_TBL_TYPE_BITS);
-	}
-
-	for (; cnt < (tbl_ptr->table_entries + tbl_ptr->expn_table_entries); cnt++) {
-		if (IPA_NAT_INVALID_NAT_ENTRY == tbl_ptr->rule_id_array[cnt]) {
-			tbl_ptr->rule_id_array[cnt] = rule_hdl;
-			return cnt + 1;
-		}
-	}
-
-	return 0;
-}
-
-/**
- * ipa_nati_parse_ipv4_rule_hdl() - prase rule handle
- * @tbl_hdl:	[in] nat table rule
- * @rule_hdl: [in] nat rule handle
- * @expn_tbl: [out] expansion table or not
- * @tbl_entry: [out] index into table
- *
- * Parse the rule handle to retrieve the nat table
- * type and entry of nat table
- *
- * Returns: None
- */
-void ipa_nati_parse_ipv4_rule_hdl(uint8_t tbl_index,
-				uint16_t rule_hdl, uint8_t *expn_tbl,
-				uint16_t *tbl_entry)
-{
-	struct ipa_nat_ip4_table_cache *tbl_ptr;
-	uint16_t rule_id;
-
-	*expn_tbl = 0;
-	*tbl_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_index];
-
-	if (rule_hdl >= (tbl_ptr->table_entries + tbl_ptr->expn_table_entries)) {
-		IPAERR("invalid rule handle\n");
-		return;
-	}
-
-	rule_id = tbl_ptr->rule_id_array[rule_hdl-1];
-
-	/* Retrieve the table type */
-	*expn_tbl = 0;
-	if (rule_id & IPA_NAT_RULE_HDL_TBL_TYPE_MASK) {
-		*expn_tbl = 1;
-	}
-
-	/* Retrieve the table entry */
-	*tbl_entry = (rule_id >> IPA_NAT_RULE_HDL_TBL_TYPE_BITS);
-	return;
-}
-
-uint32_t ipa_nati_get_entry_offset(struct ipa_nat_ip4_table_cache *cache_ptr,
-						nat_table_type tbl_type,
-						uint16_t	tbl_entry)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	uint32_t ret = 0;
-
-	if (IPA_NAT_EXPN_TBL == tbl_type) {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr;
-	} else {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr;
-	}
-
-	ret = (char *)&tbl_ptr[tbl_entry] - (char *)tbl_ptr;
-	ret += cache_ptr->tbl_addr_offset;
-	return ret;
-}
-
-uint32_t ipa_nati_get_index_entry_offset(struct ipa_nat_ip4_table_cache *cache_ptr,
-								nat_table_type tbl_type,
-								uint16_t indx_tbl_entry)
-{
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	uint32_t ret = 0;
-
-	if (IPA_NAT_INDEX_EXPN_TBL == tbl_type) {
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr;
-	} else {
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr;
-	}
-
-	ret = (char *)&indx_tbl_ptr[indx_tbl_entry] - (char *)indx_tbl_ptr;
-	ret += cache_ptr->tbl_addr_offset;
-	return ret;
-}
-
-/* ------------------------------------------
-		UTILITY FUNCTIONS END
---------------------------------------------*/
-
-/* ------------------------------------------
-	 Main Functions
---------------------------------------------**/
-void ipa_nati_reset_tbl(uint8_t tbl_indx)
-{
-	uint16_t table_entries = ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries;
-	uint16_t expn_table_entries = ipv4_nat_cache.ip4_tbl[tbl_indx].expn_table_entries;
-
-	/* Base table */
-	IPADBG("memset() base table to 0, %p\n",
-				 ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr);
-
-	memset(ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr,
-				 0,
-				 IPA_NAT_TABLE_ENTRY_SIZE * table_entries);
-
-	/* Base expansino table */
-	IPADBG("memset() expn base table to 0, %p\n",
-				 ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr);
-
-	memset(ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr,
-				 0,
-				 IPA_NAT_TABLE_ENTRY_SIZE * expn_table_entries);
-
-	/* Index table */
-	IPADBG("memset() index table to 0, %p\n",
-				 ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_addr);
-
-	memset(ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_addr,
-				 0,
-				 IPA_NAT_INDEX_TABLE_ENTRY_SIZE * table_entries);
-
-	/* Index expansion table */
-	IPADBG("memset() index expn table to 0, %p\n",
-				 ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_expn_addr);
-
-	memset(ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_expn_addr,
-				 0,
-				 IPA_NAT_INDEX_TABLE_ENTRY_SIZE * expn_table_entries);
-
-	IPADBG("returning from ipa_nati_reset_tbl()\n");
-	return;
-}
-
-int ipa_nati_add_ipv4_tbl(uint32_t public_ip_addr,
-				uint16_t number_of_entries,
-				uint32_t *tbl_hdl)
-{
-	struct ipa_ioc_nat_alloc_mem mem;
-	uint8_t tbl_indx = ipv4_nat_cache.table_cnt;
-	uint16_t table_entries, expn_table_entries;
-	int ret;
-
-	*tbl_hdl = 0;
-	/* Allocate table */
-	memset(&mem, 0, sizeof(mem));
-	ret = ipa_nati_alloc_table(number_of_entries,
-														 &mem,
-														 &table_entries,
-														 &expn_table_entries);
-	if (0 != ret) {
-		IPAERR("unable to allocate nat table\n");
-		return -ENOMEM;
-	}
-
-	/* Update the cache
-		 The (IPA_NAT_UNUSED_BASE_ENTRIES/2) indicates zero entry entries
-		 for both base and expansion table
-	*/
-	ret = ipa_nati_update_cache(&mem,
-															public_ip_addr,
-															table_entries,
-															expn_table_entries);
-	if (0 != ret) {
-		IPAERR("unable to update cache Error: %d\n", ret);
-		return -EINVAL;
-	}
-
-	/* Reset the nat table before posting init cmd */
-	ipa_nati_reset_tbl(tbl_indx);
-
-	/* Initialize the ipa hw with nat table dimensions */
-	ret = ipa_nati_post_ipv4_init_cmd(tbl_indx);
-	if (0 != ret) {
-		IPAERR("unable to post nat_init command Error %d\n", ret);
-		return -EINVAL;
-	}
-
-	/* Return table handle */
-	ipv4_nat_cache.table_cnt++;
-	*tbl_hdl = ipv4_nat_cache.table_cnt;
-
-#ifdef NAT_DUMP
-	ipa_nat_dump_ipv4_table(*tbl_hdl);
-#endif
-	return 0;
-}
-
-int ipa_nati_alloc_table(uint16_t number_of_entries,
-				struct ipa_ioc_nat_alloc_mem *mem,
-				uint16_t *table_entries,
-				uint16_t *expn_table_entries)
-{
-	int fd = 0, ret;
-	uint16_t total_entries;
-
-	/* Copy the table name */
-	strlcpy(mem->dev_name, NAT_DEV_NAME, IPA_RESOURCE_NAME_MAX);
-
-	/* Calculate the size for base table and expansion table */
-	*table_entries = (uint16_t)(number_of_entries * IPA_NAT_BASE_TABLE_PERCENTAGE);
-	if (*table_entries == 0) {
-		*table_entries = 1;
-	}
-	if (GetNearest2Power(*table_entries, table_entries)) {
-		IPAERR("unable to calculate power of 2\n");
-		return -EINVAL;
-	}
-
-	*expn_table_entries = (uint16_t)(number_of_entries * IPA_NAT_EXPANSION_TABLE_PERCENTAGE);
-	GetNearestEven(*expn_table_entries, expn_table_entries);
-
-	total_entries = (*table_entries)+(*expn_table_entries);
-
-	/* 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) {
-		fd = open(IPA_DEV_NAME, O_RDONLY);
-		if (fd < 0) {
-			perror("ipa_nati_alloc_table(): open error value:");
-			IPAERR("unable to open ipa device\n");
-			return -EIO;
-		}
-		ipv4_nat_cache.ipa_fd = fd;
-	}
-
-	ret = CreateNatDevice(mem);
-	return ret;
-}
-
-
-int ipa_nati_update_cache(struct ipa_ioc_nat_alloc_mem *mem,
-				uint32_t public_addr,
-				uint16_t tbl_entries,
-				uint16_t expn_tbl_entries)
-{
-	uint32_t index = ipv4_nat_cache.table_cnt;
-	char *ipv4_rules_addr = NULL;
-
-	int fd = 0;
-	int flags = MAP_SHARED;
-	int prot = PROT_READ | PROT_WRITE;
-	off_t offset = 0;
-#ifdef IPA_ON_R3PC
-	int ret = 0;
-	uint32_t nat_mem_offset = 0;
-#endif
-
-	ipv4_nat_cache.ip4_tbl[index].valid = IPA_NAT_TABLE_VALID;
-	ipv4_nat_cache.ip4_tbl[index].public_addr = public_addr;
-	ipv4_nat_cache.ip4_tbl[index].size = mem->size;
-	ipv4_nat_cache.ip4_tbl[index].tbl_addr_offset = mem->offset;
-
-	ipv4_nat_cache.ip4_tbl[index].table_entries = tbl_entries;
-	ipv4_nat_cache.ip4_tbl[index].expn_table_entries = expn_tbl_entries;
-
-	IPADBG("num of ipv4 rules:%d\n", tbl_entries);
-	IPADBG("num of ipv4 expn rules:%d\n", expn_tbl_entries);
-
-	/* allocate memory for nat index expansion table */
-	if (NULL == ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta) {
-		ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta =
-			 malloc(sizeof(struct ipa_nat_indx_tbl_meta_info) * expn_tbl_entries);
-
-		if (NULL == ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta) {
-			IPAERR("Fail to allocate ipv4 index expansion table meta\n");
-			return 0;
-		}
-
-		memset(ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta,
-					 0,
-					 sizeof(struct ipa_nat_indx_tbl_meta_info) * expn_tbl_entries);
-	}
-
-	/* Allocate memory for rule_id_array */
-	if (NULL == ipv4_nat_cache.ip4_tbl[index].rule_id_array) {
-		ipv4_nat_cache.ip4_tbl[index].rule_id_array =
-			 malloc(sizeof(uint16_t) * (tbl_entries + expn_tbl_entries));
-
-		if (NULL == ipv4_nat_cache.ip4_tbl[index].rule_id_array) {
-			IPAERR("Fail to allocate rule id array\n");
-			return 0;
-		}
-
-		memset(ipv4_nat_cache.ip4_tbl[index].rule_id_array,
-					 0,
-					 sizeof(uint16_t) * (tbl_entries + expn_tbl_entries));
-	}
-
-
-	/* open the nat table */
-	strlcpy(mem->dev_name, NAT_DEV_FULL_NAME, IPA_RESOURCE_NAME_MAX);
-	fd = open(mem->dev_name, O_RDWR);
-	if (fd < 0) {
-		perror("ipa_nati_update_cache(): open error value:");
-		IPAERR("unable to open nat device. Error:%d\n", fd);
-		return -EIO;
-	}
-
-	/* copy the nat table name */
-	strlcpy(ipv4_nat_cache.ip4_tbl[index].table_name,
-					mem->dev_name,
-					IPA_RESOURCE_NAME_MAX);
-	ipv4_nat_cache.ip4_tbl[index].nat_fd = fd;
-
-	/* open the nat device Table */
-#ifndef IPA_ON_R3PC
-	ipv4_rules_addr = (void *)mmap(NULL, mem->size,
-																 prot, flags,
-																 fd, offset);
-#else
-	IPADBG("user space r3pc\n");
-	ipv4_rules_addr = (void *)mmap((caddr_t)0, NAT_MMAP_MEM_SIZE,
-																 prot, flags,
-																 fd, offset);
-#endif
-	if (MAP_FAILED  == ipv4_rules_addr) {
-		perror("unable to mmap the memory\n");
-		return -EINVAL;
-	}
-
-#ifdef IPA_ON_R3PC
-	ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_GET_NAT_OFFSET, &nat_mem_offset);
-	if (ret != 0) {
-		perror("ipa_nati_post_ipv4_init_cmd(): ioctl error value");
-		IPAERR("unable to post ant offset cmd Error: %d\n", ret);
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		return -EIO;
-	}
-	ipv4_rules_addr += nat_mem_offset;
-	ipv4_nat_cache.ip4_tbl[index].mmap_offset = nat_mem_offset;
-#endif
-
-	IPADBG("mmap return value 0x%lx\n", (long unsigned int)ipv4_rules_addr);
-
-	ipv4_nat_cache.ip4_tbl[index].ipv4_rules_addr = ipv4_rules_addr;
-
-	ipv4_nat_cache.ip4_tbl[index].ipv4_expn_rules_addr =
-	ipv4_rules_addr + (IPA_NAT_TABLE_ENTRY_SIZE * tbl_entries);
-
-	ipv4_nat_cache.ip4_tbl[index].index_table_addr =
-	ipv4_rules_addr + (IPA_NAT_TABLE_ENTRY_SIZE * (tbl_entries + expn_tbl_entries));
-
-	ipv4_nat_cache.ip4_tbl[index].index_table_expn_addr =
-	ipv4_rules_addr +
-	(IPA_NAT_TABLE_ENTRY_SIZE * (tbl_entries + expn_tbl_entries))+
-	(IPA_NAT_INDEX_TABLE_ENTRY_SIZE * tbl_entries);
-
-	return 0;
-}
-
-/* comment: check the implementation once
-	 offset should be in terms of byes */
-int ipa_nati_post_ipv4_init_cmd(uint8_t tbl_index)
-{
-	struct ipa_ioc_v4_nat_init cmd;
-	uint32_t offset = ipv4_nat_cache.ip4_tbl[tbl_index].tbl_addr_offset;
-	int ret;
-
-	cmd.tbl_index = tbl_index;
-
-	cmd.ipv4_rules_offset = offset;
-	cmd.expn_rules_offset = cmd.ipv4_rules_offset +
-	(ipv4_nat_cache.ip4_tbl[tbl_index].table_entries * IPA_NAT_TABLE_ENTRY_SIZE);
-
-	cmd.index_offset = cmd.expn_rules_offset +
-	(ipv4_nat_cache.ip4_tbl[tbl_index].expn_table_entries * IPA_NAT_TABLE_ENTRY_SIZE);
-
-	cmd.index_expn_offset = cmd.index_offset +
-	(ipv4_nat_cache.ip4_tbl[tbl_index].table_entries * IPA_NAT_INDEX_TABLE_ENTRY_SIZE);
-
-	cmd.table_entries  = ipv4_nat_cache.ip4_tbl[tbl_index].table_entries - 1;
-	cmd.expn_table_entries = ipv4_nat_cache.ip4_tbl[tbl_index].expn_table_entries;
-
-	cmd.ip_addr = ipv4_nat_cache.ip4_tbl[tbl_index].public_addr;
-
-	ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_V4_INIT_NAT, &cmd);
-	if (ret != 0) {
-		perror("ipa_nati_post_ipv4_init_cmd(): ioctl error value");
-		IPAERR("unable to post init cmd Error: %d\n", ret);
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		return -EINVAL;
-	}
-	IPADBG("Posted IPA_IOC_V4_INIT_NAT to kernel successfully\n");
-
-	return 0;
-}
-
-int ipa_nati_del_ipv4_table(uint32_t tbl_hdl)
-{
-	uint8_t index = (uint8_t)(tbl_hdl - 1);
-	void *addr = (void *)ipv4_nat_cache.ip4_tbl[index].ipv4_rules_addr;
-	struct ipa_ioc_v4_nat_del del_cmd;
-	int ret;
-
-	if (!ipv4_nat_cache.ip4_tbl[index].valid) {
-		IPAERR("invalid table handle passed\n");
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	if (pthread_mutex_lock(&nat_mutex) != 0) {
-		ret = -1;
-		goto lock_mutex_fail;
-	}
-
-	/* unmap the device memory from user space */
-#ifndef IPA_ON_R3PC
-	munmap(addr, ipv4_nat_cache.ip4_tbl[index].size);
-#else
-	addr = (char *)addr - ipv4_nat_cache.ip4_tbl[index].mmap_offset;
-	munmap(addr, NAT_MMAP_MEM_SIZE);
-#endif
-
-	/* close the file descriptor of nat device */
-	if (close(ipv4_nat_cache.ip4_tbl[index].nat_fd)) {
-		IPAERR("unable to close the file descriptor\n");
-		ret = -EINVAL;
-		if (pthread_mutex_unlock(&nat_mutex) != 0)
-			goto unlock_mutex_fail;
-		goto fail;
-	}
-
-	del_cmd.table_index = index;
-	del_cmd.public_ip_addr = ipv4_nat_cache.ip4_tbl[index].public_addr;
-	ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_V4_DEL_NAT, &del_cmd);
-	if (ret != 0) {
-		perror("ipa_nati_del_ipv4_table(): ioctl error value");
-		IPAERR("unable to post nat del command init Error: %d\n", ret);
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		ret = -EINVAL;
-		if (pthread_mutex_unlock(&nat_mutex) != 0)
-			goto unlock_mutex_fail;
-		goto fail;
-	}
-	IPAERR("posted IPA_IOC_V4_DEL_NAT to kernel successfully\n");
-
-	free(ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta);
-	free(ipv4_nat_cache.ip4_tbl[index].rule_id_array);
-
-	memset(&ipv4_nat_cache.ip4_tbl[index],
-				 0,
-				 sizeof(ipv4_nat_cache.ip4_tbl[index]));
-
-	/* Decrease the table count by 1*/
-	ipv4_nat_cache.table_cnt--;
-
-	if (pthread_mutex_unlock(&nat_mutex) != 0) {
-		ret = -1;
-		goto unlock_mutex_fail;
-	}
-
-	return 0;
-
-lock_mutex_fail:
-	IPAERR("unable to lock the nat mutex\n");
-	return ret;
-
-unlock_mutex_fail:
-	IPAERR("unable to unlock the nat mutex\n");
-
-fail:
-	return ret;
-}
-
-int ipa_nati_query_timestamp(uint32_t  tbl_hdl,
-				uint32_t  rule_hdl,
-				uint32_t  *time_stamp)
-{
-	uint8_t tbl_index = (uint8_t)(tbl_hdl - 1);
-	uint8_t expn_tbl = 0;
-	uint16_t tbl_entry = 0;
-	struct ipa_nat_rule *tbl_ptr = NULL;
-
-	if (!ipv4_nat_cache.ip4_tbl[tbl_index].valid) {
-		IPAERR("invalid table handle\n");
-		return -EINVAL;
-	}
-
-	if (pthread_mutex_lock(&nat_mutex) != 0) {
-		IPAERR("unable to lock the nat mutex\n");
-		return -1;
-	}
-
-	ipa_nati_parse_ipv4_rule_hdl(tbl_index, (uint16_t)rule_hdl,
-															 &expn_tbl, &tbl_entry);
-
-	tbl_ptr =
-	(struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_index].ipv4_rules_addr;
-	if (expn_tbl) {
-		tbl_ptr =
-			 (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_index].ipv4_expn_rules_addr;
-	}
-
-	if (tbl_ptr)
-		*time_stamp = Read32BitFieldValue(tbl_ptr[tbl_entry].ts_proto,
-					TIME_STAMP_FIELD);
-
-	if (pthread_mutex_unlock(&nat_mutex) != 0) {
-		IPAERR("unable to unlock the nat mutex\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int ipa_nati_add_ipv4_rule(uint32_t tbl_hdl,
-				const ipa_nat_ipv4_rule *clnt_rule,
-				uint32_t *rule_hdl)
-{
-	struct ipa_nat_ip4_table_cache *tbl_ptr;
-	struct ipa_nat_sw_rule sw_rule;
-	struct ipa_nat_indx_tbl_sw_rule index_sw_rule;
-	uint16_t new_entry, new_index_tbl_entry;
-
-	memset(&sw_rule, 0, sizeof(sw_rule));
-	memset(&index_sw_rule, 0, sizeof(index_sw_rule));
-
-	/* Generate rule from client input */
-	if (ipa_nati_generate_rule(tbl_hdl, clnt_rule,
-					&sw_rule, &index_sw_rule,
-					&new_entry, &new_index_tbl_entry)) {
-		IPAERR("unable to generate rule\n");
-		return -EINVAL;
-	}
-
-	tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1];
-	ipa_nati_copy_ipv4_rule_to_hw(tbl_ptr, &sw_rule, new_entry, (uint8_t)(tbl_hdl-1));
-	ipa_nati_copy_ipv4_index_rule_to_hw(tbl_ptr,
-																			&index_sw_rule,
-																			new_index_tbl_entry,
-																			(uint8_t)(tbl_hdl-1));
-
-	IPADBG("new entry:%d, new index entry: %d\n", new_entry, new_index_tbl_entry);
-	if (ipa_nati_post_ipv4_dma_cmd((uint8_t)(tbl_hdl - 1), new_entry)) {
-		IPAERR("unable to post dma command\n");
-		return -EIO;
-	}
-
-	/* Generate rule handle */
-	*rule_hdl  = ipa_nati_make_rule_hdl((uint16_t)tbl_hdl, new_entry);
-	if (!(*rule_hdl)) {
-		IPAERR("unable to generate rule handle\n");
-		return -EINVAL;
-	}
-
-#ifdef NAT_DUMP
-	ipa_nat_dump_ipv4_table(tbl_hdl);
-#endif
-
-	return 0;
-}
-
-int ipa_nati_generate_rule(uint32_t tbl_hdl,
-				const ipa_nat_ipv4_rule *clnt_rule,
-				struct ipa_nat_sw_rule *rule,
-				struct ipa_nat_indx_tbl_sw_rule *index_sw_rule,
-				uint16_t *tbl_entry,
-				uint16_t *indx_tbl_entry)
-{
-	struct ipa_nat_ip4_table_cache *tbl_ptr;
-	uint16_t tmp;
-
-	if (NULL == clnt_rule || NULL == index_sw_rule ||
-			NULL == rule || NULL == tbl_entry  ||
-			NULL == indx_tbl_entry) {
-		IPAERR("invalid parameters\n");
-		return -EINVAL;
-	}
-
-	tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1];
-
-	*tbl_entry = ipa_nati_generate_tbl_rule(clnt_rule,
-																					rule,
-																					tbl_ptr);
-	if (IPA_NAT_INVALID_NAT_ENTRY == *tbl_entry) {
-		IPAERR("unable to generate table entry\n");
-		return -EINVAL;
-	}
-
-	index_sw_rule->tbl_entry = *tbl_entry;
-	*indx_tbl_entry = ipa_nati_generate_index_rule(clnt_rule,
-																								 index_sw_rule,
-																								 tbl_ptr);
-	if (IPA_NAT_INVALID_NAT_ENTRY == *indx_tbl_entry) {
-		IPAERR("unable to generate index table entry\n");
-		return -EINVAL;
-	}
-
-	rule->indx_tbl_entry = *indx_tbl_entry;
-	if (*indx_tbl_entry >= tbl_ptr->table_entries) {
-		tmp = *indx_tbl_entry - tbl_ptr->table_entries;
-		tbl_ptr->index_expn_table_meta[tmp].prev_index = index_sw_rule->prev_index;
-	}
-
-	return 0;
-}
-
-uint16_t ipa_nati_generate_tbl_rule(const ipa_nat_ipv4_rule *clnt_rule,
-						struct ipa_nat_sw_rule *sw_rule,
-						struct ipa_nat_ip4_table_cache *tbl_ptr)
-{
-	uint32_t pub_ip_addr;
-	uint16_t prev = 0, nxt_indx = 0, new_entry;
-	struct ipa_nat_rule *tbl = NULL, *expn_tbl = NULL;
-
-	pub_ip_addr = tbl_ptr->public_addr;
-
-	tbl = (struct ipa_nat_rule *)tbl_ptr->ipv4_rules_addr;
-	expn_tbl = (struct ipa_nat_rule *)tbl_ptr->ipv4_expn_rules_addr;
-
-	/* copy the values from client rule to sw rule */
-	sw_rule->private_ip = clnt_rule->private_ip;
-	sw_rule->private_port = clnt_rule->private_port;
-	sw_rule->protocol = clnt_rule->protocol;
-	sw_rule->public_port = clnt_rule->public_port;
-	sw_rule->target_ip = clnt_rule->target_ip;
-	sw_rule->target_port = clnt_rule->target_port;
-
-	/* consider only public and private ip fields */
-	sw_rule->ip_chksum = ipa_nati_calc_ip_cksum(pub_ip_addr,
-																							clnt_rule->private_ip);
-
-	if (IPPROTO_TCP == sw_rule->protocol ||
-			IPPROTO_UDP == sw_rule->protocol) {
-		/* consider public and private ip & port fields */
-		sw_rule->tcp_udp_chksum = ipa_nati_calc_tcp_udp_cksum(
-			 pub_ip_addr,
-			 clnt_rule->public_port,
-			 clnt_rule->private_ip,
-			 clnt_rule->private_port);
-	}
-
-	sw_rule->rsvd1 = 0;
-	sw_rule->enable = IPA_NAT_FLAG_DISABLE_BIT;
-	sw_rule->next_index = 0;
-
-	/*
-		SW sets this timer to 0.
-		The assumption is that 0 is an invalid clock value and no clock
-		wraparounds are expected
-	*/
-	sw_rule->time_stamp = 0;
-	sw_rule->rsvd2 = 0;
-	sw_rule->prev_index = 0;
-	sw_rule->indx_tbl_entry = 0;
-
-	new_entry = dst_hash(clnt_rule->target_ip,
-											 clnt_rule->target_port,
-											 clnt_rule->public_port,
-											 clnt_rule->protocol,
-											 tbl_ptr->table_entries-1);
-
-	/* check whether there is any collision
-		 if no collision return */
-	if (!Read16BitFieldValue(tbl[new_entry].ip_cksm_enbl,
-													 ENABLE_FIELD)) {
-		sw_rule->prev_index = 0;
-		IPADBG("Destination Nat New Entry Index %d\n", new_entry);
-		return new_entry;
-	}
-
-	/* First collision */
-	if (Read16BitFieldValue(tbl[new_entry].nxt_indx_pub_port,
-													NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) {
-		sw_rule->prev_index = new_entry;
-	} else { /* check for more than one collision	*/
-		/* Find the IPA_NAT_DEL_TYPE_LAST entry in list */
-		nxt_indx = Read16BitFieldValue(tbl[new_entry].nxt_indx_pub_port,
-																	 NEXT_INDEX_FIELD);
-
-		while (nxt_indx != IPA_NAT_INVALID_NAT_ENTRY) {
-			prev = nxt_indx;
-
-			nxt_indx -= tbl_ptr->table_entries;
-			nxt_indx = Read16BitFieldValue(expn_tbl[nxt_indx].nxt_indx_pub_port,
-																		 NEXT_INDEX_FIELD);
-
-			/* Handling error case */
-			if (prev == nxt_indx) {
-				IPAERR("Error: Prev index:%d and next:%d index should not be same\n", prev, nxt_indx);
-				return IPA_NAT_INVALID_NAT_ENTRY;
-			}
-		}
-
-		sw_rule->prev_index = prev;
-	}
-
-	/* On collision check for the free entry in expansion table */
-	new_entry = ipa_nati_expn_tbl_free_entry(expn_tbl,
-					tbl_ptr->expn_table_entries);
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == new_entry) {
-		/* Expansion table is full return*/
-		IPAERR("Expansion table is full\n");
-		IPAERR("Current Table: %d & Expn Entries: %d\n",
-			   tbl_ptr->cur_tbl_cnt, tbl_ptr->cur_expn_tbl_cnt);
-		return IPA_NAT_INVALID_NAT_ENTRY;
-	}
-	new_entry += tbl_ptr->table_entries;
-
-	IPADBG("new entry index %d\n", new_entry);
-	return new_entry;
-}
-
-/* returns expn table entry index */
-uint16_t ipa_nati_expn_tbl_free_entry(struct ipa_nat_rule *expn_tbl,
-						uint16_t size)
-{
-	int cnt;
-
-	for (cnt = 1; cnt < size; cnt++) {
-		if (!Read16BitFieldValue(expn_tbl[cnt].ip_cksm_enbl,
-														 ENABLE_FIELD)) {
-			IPADBG("new expansion table entry index %d\n", cnt);
-			return cnt;
-		}
-	}
-
-	IPAERR("nat expansion table is full\n");
-	return 0;
-}
-
-uint16_t ipa_nati_generate_index_rule(const ipa_nat_ipv4_rule *clnt_rule,
-						struct ipa_nat_indx_tbl_sw_rule *sw_rule,
-						struct ipa_nat_ip4_table_cache *tbl_ptr)
-{
-	struct ipa_nat_indx_tbl_rule *indx_tbl, *indx_expn_tbl;
-	uint16_t prev = 0, nxt_indx = 0, new_entry;
-
-	indx_tbl =
-	(struct ipa_nat_indx_tbl_rule *)tbl_ptr->index_table_addr;
-	indx_expn_tbl =
-	(struct ipa_nat_indx_tbl_rule *)tbl_ptr->index_table_expn_addr;
-
-	new_entry = src_hash(clnt_rule->private_ip,
-											 clnt_rule->private_port,
-											 clnt_rule->target_ip,
-											 clnt_rule->target_port,
-											 clnt_rule->protocol,
-											 tbl_ptr->table_entries-1);
-
-	/* check whether there is any collision
-		 if no collision return */
-	if (!Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx,
-													 INDX_TBL_TBL_ENTRY_FIELD)) {
-		sw_rule->prev_index = 0;
-		IPADBG("Source Nat Index Table Entry %d\n", new_entry);
-		return new_entry;
-	}
-
-	/* check for more than one collision	*/
-	if (Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx,
-													INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) {
-		sw_rule->prev_index = new_entry;
-		IPADBG("First collosion. Entry %d\n", new_entry);
-	} else {
-		/* Find the IPA_NAT_DEL_TYPE_LAST entry in list */
-		nxt_indx = Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx,
-																	 INDX_TBL_NEXT_INDEX_FILED);
-
-		while (nxt_indx != IPA_NAT_INVALID_NAT_ENTRY) {
-			prev = nxt_indx;
-
-			nxt_indx -= tbl_ptr->table_entries;
-			nxt_indx = Read16BitFieldValue(indx_expn_tbl[nxt_indx].tbl_entry_nxt_indx,
-																		 INDX_TBL_NEXT_INDEX_FILED);
-
-			/* Handling error case */
-			if (prev == nxt_indx) {
-				IPAERR("Error: Prev:%d and next:%d index should not be same\n", prev, nxt_indx);
-				return IPA_NAT_INVALID_NAT_ENTRY;
-			}
-		}
-
-		sw_rule->prev_index = prev;
-	}
-
-	/* On collision check for the free entry in expansion table */
-	new_entry = ipa_nati_index_expn_get_free_entry(indx_expn_tbl,
-					tbl_ptr->expn_table_entries);
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == new_entry) {
-		/* Expansion table is full return*/
-		IPAERR("Index expansion table is full\n");
-		IPAERR("Current Table: %d & Expn Entries: %d\n",
-			   tbl_ptr->cur_tbl_cnt, tbl_ptr->cur_expn_tbl_cnt);
-		return IPA_NAT_INVALID_NAT_ENTRY;
-	}
-	new_entry += tbl_ptr->table_entries;
-
-
-	if (sw_rule->prev_index == new_entry) {
-		IPAERR("Error: prev_entry:%d ", sw_rule->prev_index);
-		IPAERR("and new_entry:%d should not be same ", new_entry);
-		IPAERR("infinite loop detected\n");
-		return IPA_NAT_INVALID_NAT_ENTRY;
-	}
-
-	IPADBG("index table entry %d\n", new_entry);
-	return new_entry;
-}
-
-/* returns index expn table entry index */
-uint16_t ipa_nati_index_expn_get_free_entry(
-						struct ipa_nat_indx_tbl_rule *indx_tbl,
-						uint16_t size)
-{
-	int cnt;
-	for (cnt = 1; cnt < size; cnt++) {
-		if (!Read16BitFieldValue(indx_tbl[cnt].tbl_entry_nxt_indx,
-														 INDX_TBL_TBL_ENTRY_FIELD)) {
-			return cnt;
-		}
-	}
-
-	IPAERR("nat index expansion table is full\n");
-	return 0;
-}
-
-void ipa_nati_write_next_index(uint8_t tbl_indx,
-				nat_table_type tbl_type,
-				uint16_t value,
-				uint32_t offset)
-{
-	struct ipa_ioc_nat_dma_cmd *cmd;
-
-	IPADBG("Updating next index field of table %d on collosion using dma\n", tbl_type);
-	IPADBG("table index: %d, value: %d offset;%d\n", tbl_indx, value, offset);
-
-	cmd = (struct ipa_ioc_nat_dma_cmd *)
-	malloc(sizeof(struct ipa_ioc_nat_dma_cmd)+
-				 sizeof(struct ipa_ioc_nat_dma_one));
-	if (NULL == cmd) {
-		IPAERR("unable to allocate memory\n");
-		return;
-	}
-
-	cmd->dma[0].table_index = tbl_indx;
-	cmd->dma[0].base_addr = tbl_type;
-	cmd->dma[0].data = value;
-	cmd->dma[0].offset = offset;
-
-	cmd->entries = 1;
-	if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) {
-		perror("ipa_nati_post_ipv4_dma_cmd(): ioctl error value");
-		IPAERR("unable to call dma icotl to update next index\n");
-		IPAERR("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		goto fail;
-	}
-
-fail:
-	free(cmd);
-
-	return;
-}
-
-void ipa_nati_copy_ipv4_rule_to_hw(
-				struct ipa_nat_ip4_table_cache *ipv4_cache,
-				struct ipa_nat_sw_rule *rule,
-				uint16_t entry, uint8_t tbl_index)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	uint16_t prev_entry = rule->prev_index;
-	nat_table_type tbl_type;
-	uint32_t offset = 0;
-
-	if (entry < ipv4_cache->table_entries) {
-		tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_rules_addr;
-
-		memcpy(&tbl_ptr[entry],
-					 rule,
-					 sizeof(struct ipa_nat_rule));
-	} else {
-		tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_expn_rules_addr;
-		memcpy(&tbl_ptr[entry - ipv4_cache->table_entries],
-					 rule,
-					 sizeof(struct ipa_nat_rule));
-	}
-
-	/* Update the previos entry next_index */
-	if (IPA_NAT_INVALID_NAT_ENTRY != prev_entry) {
-
-		if (prev_entry < ipv4_cache->table_entries) {
-			tbl_type = IPA_NAT_BASE_TBL;
-			tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_rules_addr;
-		} else {
-			tbl_type = IPA_NAT_EXPN_TBL;
-			/* tbp_ptr is already pointing to expansion table
-				 no need to initialize it */
-			prev_entry = prev_entry - ipv4_cache->table_entries;
-		}
-
-		offset = ipa_nati_get_entry_offset(ipv4_cache, tbl_type, prev_entry);
-		offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET;
-
-		ipa_nati_write_next_index(tbl_index, tbl_type, entry, offset);
-	}
-
-	return;
-}
-
-void ipa_nati_copy_ipv4_index_rule_to_hw(
-				struct ipa_nat_ip4_table_cache *ipv4_cache,
-				struct ipa_nat_indx_tbl_sw_rule *indx_sw_rule,
-				uint16_t entry,
-				uint8_t tbl_index)
-{
-	struct ipa_nat_indx_tbl_rule *tbl_ptr;
-	struct ipa_nat_sw_indx_tbl_rule sw_rule;
-	uint16_t prev_entry = indx_sw_rule->prev_index;
-	nat_table_type tbl_type;
-	uint16_t offset = 0;
-
-	sw_rule.next_index = indx_sw_rule->next_index;
-	sw_rule.tbl_entry = indx_sw_rule->tbl_entry;
-
-	if (entry < ipv4_cache->table_entries) {
-		tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_addr;
-
-		memcpy(&tbl_ptr[entry],
-					 &sw_rule,
-					 sizeof(struct ipa_nat_indx_tbl_rule));
-	} else {
-		tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_expn_addr;
-
-		memcpy(&tbl_ptr[entry - ipv4_cache->table_entries],
-					 &sw_rule,
-					 sizeof(struct ipa_nat_indx_tbl_rule));
-	}
-
-	/* Update the next field of previous entry on collosion */
-	if (IPA_NAT_INVALID_NAT_ENTRY != prev_entry) {
-		if (prev_entry < ipv4_cache->table_entries) {
-			tbl_type = IPA_NAT_INDX_TBL;
-			tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_addr;
-		} else {
-			tbl_type = IPA_NAT_INDEX_EXPN_TBL;
-			/* tbp_ptr is already pointing to expansion table
-			 no need to initialize it */
-			prev_entry = prev_entry - ipv4_cache->table_entries;
-		}
-
-		offset = ipa_nati_get_index_entry_offset(ipv4_cache, tbl_type, prev_entry);
-		offset += IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET;
-
-		IPADBG("Updating next index field of index table on collosion using dma()\n");
-		ipa_nati_write_next_index(tbl_index, tbl_type, entry, offset);
-	}
-
-	return;
-}
-
-int ipa_nati_post_ipv4_dma_cmd(uint8_t tbl_indx,
-				uint16_t entry)
-{
-	struct ipa_ioc_nat_dma_cmd *cmd;
-	struct ipa_nat_rule *tbl_ptr;
-	uint32_t offset = ipv4_nat_cache.ip4_tbl[tbl_indx].tbl_addr_offset;
-	int ret = 0;
-
-	cmd = (struct ipa_ioc_nat_dma_cmd *)
-	malloc(sizeof(struct ipa_ioc_nat_dma_cmd)+
-				 sizeof(struct ipa_ioc_nat_dma_one));
-	if (NULL == cmd) {
-		IPAERR("unable to allocate memory\n");
-		return -ENOMEM;
-	}
-
-	if (entry < ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries) {
-		tbl_ptr =
-			 (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr;
-
-		cmd->dma[0].table_index = tbl_indx;
-		cmd->dma[0].base_addr = IPA_NAT_BASE_TBL;
-		cmd->dma[0].data = IPA_NAT_FLAG_ENABLE_BIT_MASK;
-
-		cmd->dma[0].offset = (char *)&tbl_ptr[entry] - (char *)tbl_ptr;
-		cmd->dma[0].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET;
-	} else {
-		tbl_ptr =
-			 (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr;
-		entry = entry - ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries;
-
-		cmd->dma[0].table_index = tbl_indx;
-		cmd->dma[0].base_addr = IPA_NAT_EXPN_TBL;
-		cmd->dma[0].data = IPA_NAT_FLAG_ENABLE_BIT_MASK;
-
-		cmd->dma[0].offset = (char *)&tbl_ptr[entry] - (char *)tbl_ptr;
-		cmd->dma[0].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET;
-		cmd->dma[0].offset += offset;
-	}
-
-	cmd->entries = 1;
-	if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) {
-		perror("ipa_nati_post_ipv4_dma_cmd(): ioctl error value");
-		IPAERR("unable to call dma icotl\n");
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		ret = -EIO;
-		goto fail;
-	}
-	IPADBG("posted IPA_IOC_NAT_DMA to kernel successfully during add operation\n");
-
-
-fail:
-	free(cmd);
-
-	return ret;
-}
-
-
-int ipa_nati_del_ipv4_rule(uint32_t tbl_hdl,
-				uint32_t rule_hdl)
-{
-	uint8_t expn_tbl;
-	uint16_t tbl_entry;
-	struct ipa_nat_ip4_table_cache *tbl_ptr;
-	del_type rule_pos;
-	uint8_t tbl_indx = (uint8_t)(tbl_hdl - 1);
-	int ret;
-
-	/* Parse the rule handle */
-	ipa_nati_parse_ipv4_rule_hdl(tbl_indx, (uint16_t)rule_hdl,
-															 &expn_tbl, &tbl_entry);
-	if (IPA_NAT_INVALID_NAT_ENTRY == tbl_entry) {
-		IPAERR("Invalid Rule Entry\n");
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	if (pthread_mutex_lock(&nat_mutex) != 0) {
-		ret = -1;
-		goto mutex_lock_error;
-	}
-
-	IPADBG("Delete below rule\n");
-	IPADBG("tbl_entry:%d expn_tbl:%d\n", tbl_entry, expn_tbl);
-
-	tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_indx];
-	if (!tbl_ptr->valid) {
-		IPAERR("invalid table handle\n");
-		ret = -EINVAL;
-		if (pthread_mutex_unlock(&nat_mutex) != 0)
-			goto mutex_unlock_error;
-		goto fail;
-	}
-
-	ipa_nati_find_rule_pos(tbl_ptr, expn_tbl,
-												 tbl_entry, &rule_pos);
-	IPADBG("rule_pos:%d\n", rule_pos);
-
-	if (ipa_nati_post_del_dma_cmd(tbl_indx, tbl_entry,
-					expn_tbl, rule_pos)) {
-		ret = -EINVAL;
-		if (pthread_mutex_unlock(&nat_mutex) != 0)
-			goto mutex_unlock_error;
-		goto fail;
-	}
-
-	ipa_nati_del_dead_ipv4_head_nodes(tbl_indx);
-
-	/* Reset rule_id_array entry */
-	ipv4_nat_cache.ip4_tbl[tbl_indx].rule_id_array[rule_hdl-1] =
-	IPA_NAT_INVALID_NAT_ENTRY;
-
-#ifdef NAT_DUMP
-	IPADBG("Dumping Table after deleting rule\n");
-	ipa_nat_dump_ipv4_table(tbl_hdl);
-#endif
-
-	if (pthread_mutex_unlock(&nat_mutex) != 0) {
-		ret = -1;
-		goto mutex_unlock_error;
-	}
-
-	return 0;
-
-mutex_lock_error:
-	IPAERR("unable to lock the nat mutex\n");
-	return ret;
-
-mutex_unlock_error:
-	IPAERR("unable to unlock the nat mutex\n");
-
-fail:
-	return ret;
-}
-
-void ReorderCmds(struct ipa_ioc_nat_dma_cmd *cmd, int size)
-{
-	int indx_tbl_start = 0, cnt, cnt1;
-	struct ipa_ioc_nat_dma_cmd *tmp;
-
-	IPADBG("called ReorderCmds() with entries :%d\n", cmd->entries);
-
-	for (cnt = 0; cnt < cmd->entries; cnt++) {
-		if (cmd->dma[cnt].base_addr == IPA_NAT_INDX_TBL ||
-				cmd->dma[cnt].base_addr == IPA_NAT_INDEX_EXPN_TBL) {
-			indx_tbl_start = cnt;
-			break;
-		}
-	}
-
-	if (indx_tbl_start == 0) {
-		IPADBG("Reorder not needed\n");
-		return;
-	}
-
-	tmp = (struct ipa_ioc_nat_dma_cmd *)malloc(size);
-	if (tmp == NULL) {
-		IPAERR("unable to allocate memory\n");
-		return;
-	}
-
-	cnt1 = 0;
-	tmp->entries = cmd->entries;
-	for (cnt = indx_tbl_start; cnt < cmd->entries; cnt++) {
-		tmp->dma[cnt1] = cmd->dma[cnt];
-		cnt1++;
-	}
-
-	for (cnt = 0; cnt < indx_tbl_start; cnt++) {
-		tmp->dma[cnt1] = cmd->dma[cnt];
-		cnt1++;
-	}
-
-	memset(cmd, 0, size);
-	memcpy(cmd, tmp, size);
-	free(tmp);
-
-	return;
-}
-
-int ipa_nati_post_del_dma_cmd(uint8_t tbl_indx,
-				uint16_t cur_tbl_entry,
-				uint8_t expn_tbl,
-				del_type rule_pos)
-{
-
-#define MAX_DMA_ENTRIES_FOR_DEL 3
-
-	struct ipa_nat_ip4_table_cache *cache_ptr;
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	struct ipa_nat_rule *tbl_ptr;
-	int ret = 0, size = 0;
-
-	uint16_t indx_tbl_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	del_type indx_rule_pos;
-
-	struct ipa_ioc_nat_dma_cmd *cmd;
-	uint8_t no_of_cmds = 0;
-
-	uint16_t prev_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	uint16_t next_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	uint16_t indx_next_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	uint16_t indx_next_next_entry = IPA_NAT_INVALID_NAT_ENTRY;
-	uint16_t table_entry;
-
-	size = sizeof(struct ipa_ioc_nat_dma_cmd)+
-	(MAX_DMA_ENTRIES_FOR_DEL * sizeof(struct ipa_ioc_nat_dma_one));
-
-	cmd = (struct ipa_ioc_nat_dma_cmd *)malloc(size);
-	if (NULL == cmd) {
-		IPAERR("unable to allocate memory\n");
-		return -ENOMEM;
-	}
-
-	cache_ptr = &ipv4_nat_cache.ip4_tbl[tbl_indx];
-	if (!expn_tbl) {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr;
-	} else {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr;
-	}
-
-
-	if (!Read16BitFieldValue(tbl_ptr[cur_tbl_entry].ip_cksm_enbl,
-													 ENABLE_FIELD)) {
-		IPAERR("Deleting invalid(not enabled) rule\n");
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	indx_tbl_entry =
-		Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params,
-		SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD);
-
-	/* ================================================
-	 Base Table rule Deletion
-	 ================================================*/
-	/* Just delete the current rule by disabling the flag field */
-	if (IPA_NAT_DEL_TYPE_ONLY_ONE == rule_pos) {
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL;
-		cmd->dma[no_of_cmds].data = IPA_NAT_FLAG_DISABLE_BIT_MASK;
-
-		cmd->dma[no_of_cmds].offset =
-			 ipa_nati_get_entry_offset(cache_ptr,
-					cmd->dma[no_of_cmds].base_addr,
-					cur_tbl_entry);
-		cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET;
-	}
-
-	/* Just update the protocol field to invalid */
-	else if (IPA_NAT_DEL_TYPE_HEAD == rule_pos) {
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL;
-		cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_PROTO_FIELD_VALUE;
-
-		cmd->dma[no_of_cmds].offset =
-			 ipa_nati_get_entry_offset(cache_ptr,
-					cmd->dma[no_of_cmds].base_addr,
-					cur_tbl_entry);
-		cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_PROTO_FIELD_OFFSET;
-
-		IPADBG("writing invalid proto: 0x%x\n", cmd->dma[no_of_cmds].data);
-	}
-
-	/*
-			 Update the previous entry of next_index field value
-			 with current entry next_index field value
-	*/
-	else if (IPA_NAT_DEL_TYPE_MIDDLE == rule_pos) {
-		prev_entry =
-			Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params,
-				SW_SPEC_PARAM_PREV_INDEX_FIELD);
-
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data =
-			Read16BitFieldValue(tbl_ptr[cur_tbl_entry].nxt_indx_pub_port,
-					NEXT_INDEX_FIELD);
-
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL;
-		if (prev_entry >= cache_ptr->table_entries) {
-			cmd->dma[no_of_cmds].base_addr = IPA_NAT_EXPN_TBL;
-			prev_entry -= cache_ptr->table_entries;
-		}
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_entry_offset(cache_ptr,
-				cmd->dma[no_of_cmds].base_addr, prev_entry);
-
-		cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET;
-	}
-
-	/*
-			 Reset the previous entry of next_index field with 0
-	*/
-	else if (IPA_NAT_DEL_TYPE_LAST == rule_pos) {
-		prev_entry =
-			Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params,
-				SW_SPEC_PARAM_PREV_INDEX_FIELD);
-
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY;
-
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL;
-		if (prev_entry >= cache_ptr->table_entries) {
-			cmd->dma[no_of_cmds].base_addr = IPA_NAT_EXPN_TBL;
-			prev_entry -= cache_ptr->table_entries;
-		}
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_entry_offset(cache_ptr,
-				cmd->dma[no_of_cmds].base_addr, prev_entry);
-
-		cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET;
-	}
-
-	/* ================================================
-	 Base Table rule Deletion End
-	 ================================================*/
-
-	/* ================================================
-	 Index Table rule Deletion
-	 ================================================*/
-	ipa_nati_find_index_rule_pos(cache_ptr,
-															 indx_tbl_entry,
-															 &indx_rule_pos);
-	IPADBG("Index table entry: 0x%x\n", indx_tbl_entry);
-	IPADBG("and position: %d\n", indx_rule_pos);
-	if (indx_tbl_entry >= cache_ptr->table_entries) {
-		indx_tbl_entry -= cache_ptr->table_entries;
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr;
-	} else {
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr;
-	}
-
-	/* Just delete the current rule by resetting nat_table_index field to 0 */
-	if (IPA_NAT_DEL_TYPE_ONLY_ONE == indx_rule_pos) {
-		no_of_cmds++;
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL;
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY;
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_index_entry_offset(cache_ptr,
-			cmd->dma[no_of_cmds].base_addr,
-			indx_tbl_entry);
-
-		cmd->dma[no_of_cmds].offset +=
-			IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET;
-	}
-
-	/* copy the next entry values to current entry */
-	else if (IPA_NAT_DEL_TYPE_HEAD == indx_rule_pos) {
-		next_entry =
-			Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx,
-				INDX_TBL_NEXT_INDEX_FILED);
-
-		next_entry -= cache_ptr->table_entries;
-
-		no_of_cmds++;
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL;
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-
-		/* Copy the nat_table_index field value of next entry */
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr;
-		cmd->dma[no_of_cmds].data =
-			Read16BitFieldValue(indx_tbl_ptr[next_entry].tbl_entry_nxt_indx,
-				INDX_TBL_TBL_ENTRY_FIELD);
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_index_entry_offset(cache_ptr,
-					cmd->dma[no_of_cmds].base_addr,
-					indx_tbl_entry);
-
-		cmd->dma[no_of_cmds].offset +=
-			IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET;
-
-		/* Copy the next_index field value of next entry */
-		no_of_cmds++;
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL;
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data =
-			Read16BitFieldValue(indx_tbl_ptr[next_entry].tbl_entry_nxt_indx,
-				INDX_TBL_NEXT_INDEX_FILED);
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_index_entry_offset(cache_ptr,
-				cmd->dma[no_of_cmds].base_addr, indx_tbl_entry);
-
-		cmd->dma[no_of_cmds].offset +=
-			IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET;
-		indx_next_entry = next_entry;
-	}
-
-	/*
-			 Update the previous entry of next_index field value
-			 with current entry next_index field value
-	*/
-	else if (IPA_NAT_DEL_TYPE_MIDDLE == indx_rule_pos) {
-		prev_entry = cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index;
-
-		no_of_cmds++;
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data =
-			Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx,
-				INDX_TBL_NEXT_INDEX_FILED);
-
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL;
-		if (prev_entry >= cache_ptr->table_entries) {
-			cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDEX_EXPN_TBL;
-			prev_entry -= cache_ptr->table_entries;
-		}
-
-		IPADBG("prev_entry: %d update with cur next_index: %d\n",
-				prev_entry, cmd->dma[no_of_cmds].data);
-		IPADBG("prev_entry: %d exist in table_type:%d\n",
-				prev_entry, cmd->dma[no_of_cmds].base_addr);
-
-		cmd->dma[no_of_cmds].offset =
-			ipa_nati_get_index_entry_offset(cache_ptr,
-				cmd->dma[no_of_cmds].base_addr, prev_entry);
-
-		cmd->dma[no_of_cmds].offset +=
-			IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET;
-	}
-
-	/* Reset the previous entry next_index field with 0 */
-	else if (IPA_NAT_DEL_TYPE_LAST == indx_rule_pos) {
-		prev_entry = cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index;
-
-		no_of_cmds++;
-		cmd->dma[no_of_cmds].table_index = tbl_indx;
-		cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY;
-
-		cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL;
-		if (prev_entry >= cache_ptr->table_entries) {
-			cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDEX_EXPN_TBL;
-			prev_entry -= cache_ptr->table_entries;
-		}
-
-		IPADBG("Reseting prev_entry: %d next_index\n", prev_entry);
-		IPADBG("prev_entry: %d exist in table_type:%d\n",
-			prev_entry, cmd->dma[no_of_cmds].base_addr);
-
-		cmd->dma[no_of_cmds].offset =
-			 ipa_nati_get_index_entry_offset(cache_ptr,
-					cmd->dma[no_of_cmds].base_addr, prev_entry);
-
-		cmd->dma[no_of_cmds].offset +=
-			IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET;
-	}
-
-	/* ================================================
-	 Index Table rule Deletion End
-	 ================================================*/
-	cmd->entries = no_of_cmds + 1;
-
-	if (cmd->entries > 1) {
-		ReorderCmds(cmd, size);
-	}
-	if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) {
-		perror("ipa_nati_post_del_dma_cmd(): ioctl error value");
-		IPAERR("unable to post cmd\n");
-		IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd);
-		ret = -EIO;
-		goto fail;
-	}
-
-	/* if entry exist in IPA_NAT_DEL_TYPE_MIDDLE of list
-			 Update the previous entry in sw specific parameters
-	*/
-	if (IPA_NAT_DEL_TYPE_MIDDLE == rule_pos) {
-		/* Retrieve the current entry prev_entry value */
-		prev_entry =
-			Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params,
-				SW_SPEC_PARAM_PREV_INDEX_FIELD);
-
-		/* Retrieve the next entry */
-		next_entry =
-			Read16BitFieldValue(tbl_ptr[cur_tbl_entry].nxt_indx_pub_port,
-				NEXT_INDEX_FIELD);
-
-		next_entry -= cache_ptr->table_entries;
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr;
-
-		/* copy the current entry prev_entry value to next entry*/
-		UpdateSwSpecParams(&tbl_ptr[next_entry],
-											 IPA_NAT_SW_PARAM_PREV_INDX_BYTE,
-											 prev_entry);
-	}
-
-	/* Reset the other field values of current delete entry
-			 In case of IPA_NAT_DEL_TYPE_HEAD, don't reset */
-	if (IPA_NAT_DEL_TYPE_HEAD != rule_pos) {
-		memset(&tbl_ptr[cur_tbl_entry], 0, sizeof(struct ipa_nat_rule));
-	}
-
-	if (indx_rule_pos == IPA_NAT_DEL_TYPE_HEAD) {
-
-    /* Update next next entry previous value to current
-       entry as we moved the next entry values
-       to current entry */
-		indx_next_next_entry =
-			Read16BitFieldValue(indx_tbl_ptr[indx_next_entry].tbl_entry_nxt_indx,
-				INDX_TBL_NEXT_INDEX_FILED);
-
-		if (indx_next_next_entry != 0 &&
-			indx_next_next_entry >= cache_ptr->table_entries) {
-
-			IPADBG("Next Next entry: %d\n", indx_next_next_entry);
-			indx_next_next_entry -= cache_ptr->table_entries;
-
-			IPADBG("Updating entry: %d prev index to: %d\n",
-				indx_next_next_entry, indx_tbl_entry);
-			cache_ptr->index_expn_table_meta[indx_next_next_entry].prev_index =
-				 indx_tbl_entry;
-		}
-
-    /* Now reset the next entry as we copied
-				the next entry to current entry */
-		IPADBG("Resetting, index table entry(Proper): %d\n",
-			(cache_ptr->table_entries + indx_next_entry));
-
-    /* This resets both table entry and next index values */
-		indx_tbl_ptr[indx_next_entry].tbl_entry_nxt_indx = 0;
-
-		/*
-				 In case of IPA_NAT_DEL_TYPE_HEAD, update the sw specific parameters
-				 (index table entry) of base table entry
-		*/
-		indx_tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr;
-		table_entry =
-				Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx,
-						INDX_TBL_TBL_ENTRY_FIELD);
-
-		if (table_entry >= cache_ptr->table_entries) {
-			tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr;
-			table_entry -= cache_ptr->table_entries;
-		} else {
-			tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr;
-		}
-
-		UpdateSwSpecParams(&tbl_ptr[table_entry],
-				IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE,
-				indx_tbl_entry);
-	} else {
-		/* Update the prev_entry value (in index_expn_table_meta)
-				 for the next_entry in list with current entry prev_entry value
-		*/
-		if (IPA_NAT_DEL_TYPE_MIDDLE == indx_rule_pos) {
-			next_entry =
-				Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx,
-					INDX_TBL_NEXT_INDEX_FILED);
-
-			if (next_entry >= cache_ptr->table_entries) {
-				next_entry -= cache_ptr->table_entries;
-			}
-
-			cache_ptr->index_expn_table_meta[next_entry].prev_index =
-				 cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index;
-
-			cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index =
-				 IPA_NAT_INVALID_NAT_ENTRY;
-		}
-
-		IPADBG("At, indx_tbl_entry value: %d\n", indx_tbl_entry);
-		IPADBG("At, indx_tbl_entry member address: %p\n",
-					 &indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx);
-
-		indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx = 0;
-
-	}
-
-fail:
-	free(cmd);
-
-	return ret;
-}
-
-void ipa_nati_find_index_rule_pos(
-				struct ipa_nat_ip4_table_cache *cache_ptr,
-				uint16_t tbl_entry,
-				del_type *rule_pos)
-{
-	struct ipa_nat_indx_tbl_rule *tbl_ptr;
-
-	if (tbl_entry >= cache_ptr->table_entries) {
-		tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr;
-
-		tbl_entry -= cache_ptr->table_entries;
-		if (Read16BitFieldValue(tbl_ptr[tbl_entry].tbl_entry_nxt_indx,
-					INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) {
-			*rule_pos = IPA_NAT_DEL_TYPE_LAST;
-		} else {
-			*rule_pos = IPA_NAT_DEL_TYPE_MIDDLE;
-		}
-	} else {
-		tbl_ptr =
-			 (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr;
-
-		if (Read16BitFieldValue(tbl_ptr[tbl_entry].tbl_entry_nxt_indx,
-					INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) {
-			*rule_pos = IPA_NAT_DEL_TYPE_ONLY_ONE;
-		} else {
-			*rule_pos = IPA_NAT_DEL_TYPE_HEAD;
-		}
-	}
-}
-
-void ipa_nati_find_rule_pos(struct ipa_nat_ip4_table_cache *cache_ptr,
-														uint8_t expn_tbl,
-														uint16_t tbl_entry,
-														del_type *rule_pos)
-{
-	struct ipa_nat_rule *tbl_ptr;
-
-	if (expn_tbl) {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr;
-		if (Read16BitFieldValue(tbl_ptr[tbl_entry].nxt_indx_pub_port,
-														NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) {
-			*rule_pos = IPA_NAT_DEL_TYPE_LAST;
-		} else {
-			*rule_pos = IPA_NAT_DEL_TYPE_MIDDLE;
-		}
-	} else {
-		tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr;
-		if (Read16BitFieldValue(tbl_ptr[tbl_entry].nxt_indx_pub_port,
-					NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) {
-			*rule_pos = IPA_NAT_DEL_TYPE_ONLY_ONE;
-		} else {
-			*rule_pos = IPA_NAT_DEL_TYPE_HEAD;
-		}
-	}
-}
-
-void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	uint16_t cnt;
-
-	tbl_ptr =
-	(struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr;
-
-	for (cnt = 0;
-			 cnt < ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries;
-			 cnt++) {
-
-		if (Read8BitFieldValue(tbl_ptr[cnt].ts_proto,
-					PROTOCOL_FIELD) == IPA_NAT_INVALID_PROTO_FIELD_CMP
-				&&
-				Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port,
-					NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) {
-			/* Delete the IPA_NAT_DEL_TYPE_HEAD node */
-			IPADBG("deleting the dead node 0x%x\n", cnt);
-			memset(&tbl_ptr[cnt], 0, sizeof(struct ipa_nat_rule));
-		}
-	} /* end of for loop */
-
-	return;
-}
-
-
-/* ========================================================
-						Debug functions
-	 ========================================================*/
-#ifdef NAT_DUMP
-void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	int cnt;
-	uint8_t atl_one = 0;
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-			tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
-		IPAERR("invalid table handle passed\n");
-		return;
-	}
-
-	/* Print ipv4 rules */
-	IPADBG("Dumping ipv4 active rules:\n");
-	tbl_ptr = (struct ipa_nat_rule *)
-	ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr;
-	for (cnt = 0;
-			 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-					ENABLE_FIELD)) {
-			atl_one = 1;
-			ipa_nati_print_rule(&tbl_ptr[cnt], cnt);
-		}
-	}
-	if (!atl_one) {
-		IPADBG("No active base rules, total: %d\n",
-					 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries);
-	}
-	atl_one = 0;
-
-	/* Print ipv4 expansion rules */
-	IPADBG("Dumping ipv4 active expansion rules:\n");
-	tbl_ptr = (struct ipa_nat_rule *)
-	ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr;
-	for (cnt = 0;
-			 cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-					ENABLE_FIELD)) {
-			atl_one = 1;
-			ipa_nati_print_rule(&tbl_ptr[cnt],
-				(cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries));
-		}
-	}
-	if (!atl_one) {
-		IPADBG("No active base expansion rules, total: %d\n",
-					 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries);
-	}
-	atl_one = 0;
-
-	/* Print ipv4 index rules */
-	IPADBG("Dumping ipv4 index active rules:\n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-	ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr;
-	for (cnt = 0;
-			 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-					INDX_TBL_TBL_ENTRY_FIELD)) {
-			atl_one = 1;
-			ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt, 0);
-		}
-	}
-	if (!atl_one) {
-		IPADBG("No active index table rules, total:%d\n",
-					 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries);
-	}
-	atl_one = 0;
-
-
-	/* Print ipv4 index expansion rules */
-	IPADBG("Dumping ipv4 index expansion active rules:\n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-	ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr;
-	for (cnt = 0;
-			 cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-					INDX_TBL_TBL_ENTRY_FIELD)) {
-			atl_one = 1;
-			ipa_nati_print_index_rule(&indx_tbl_ptr[cnt],
-				(cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries),
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_expn_table_meta[cnt].prev_index);
-		}
-	}
-	if (!atl_one) {
-		IPADBG("No active index expansion rules, total:%d\n",
-					 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries);
-	}
-	atl_one = 0;
-
-}
-
-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));
-	uint32_t ip_addr;
-
-	IPADUMP("rule-id:%d  ", rule_id);
-	ip_addr = sw_rule.target_ip;
-	IPADUMP("Trgt-IP:%d.%d.%d.%d	",
-				((ip_addr & 0xFF000000) >> 24), ((ip_addr & 0x00FF0000) >> 16),
-			((ip_addr & 0x0000FF00) >> 8), ((ip_addr & 0x000000FF)));
-
-	IPADUMP("Trgt-Port:%d  Priv-Port:%d  ", sw_rule.target_port, sw_rule.private_port);
-
-	ip_addr = sw_rule.private_ip;
-	IPADUMP("Priv-IP:%d.%d.%d.%d ",
-							((ip_addr & 0xFF000000) >> 24), ((ip_addr & 0x00FF0000) >> 16),
-							((ip_addr & 0x0000FF00) >> 8), ((ip_addr & 0x000000FF)));
-
-	IPADUMP("Pub-Port:%d	Nxt-indx:%d  ", sw_rule.public_port, sw_rule.next_index);
-	IPADUMP("IP-cksm-delta: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:%d	indx_tbl_entry:%d	", sw_rule.prev_index, sw_rule.indx_tbl_entry);
-	IPADUMP("Tcp-udp-cksum-delta:0x%x", sw_rule.tcp_udp_chksum);
-	IPADUMP("\n");
-	return;
-}
-
-void ipa_nati_print_index_rule(
-		struct ipa_nat_indx_tbl_rule *param,
-		uint32_t rule_id, uint16_t prev_indx)
-{
-	struct ipa_nat_sw_indx_tbl_rule sw_rule;
-	memcpy(&sw_rule, param, sizeof(sw_rule));
-
-	IPADUMP("rule-id:%d  Table_entry:%d  Next_index:%d, prev_indx:%d",
-					  rule_id, sw_rule.tbl_entry, sw_rule.next_index, prev_indx);
-	IPADUMP("\n");
-	return;
-}
-
-int ipa_nati_query_nat_rules(
-		uint32_t tbl_hdl,
-		nat_table_type tbl_type)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	int cnt = 0, ret = 0;
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-			tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
-		IPAERR("invalid table handle passed\n");
-		return ret;
-	}
-
-	/* Print ipv4 rules */
-	if (tbl_type == IPA_NAT_BASE_TBL) {
-		IPADBG("Counting ipv4 active rules:\n");
-		tbl_ptr = (struct ipa_nat_rule *)
-			 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].ipv4_rules_addr;
-		for (cnt = 0;
-				 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-				 cnt++) {
-			if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-						ENABLE_FIELD)) {
-				ret++;
-			}
-		}
-		if (!ret) {
-			IPADBG("No active base rules\n");
-		}
-
-		IPADBG("Number of active base rules: %d\n", ret);
-	}
-
-	/* Print ipv4 expansion rules */
-	if (tbl_type == IPA_NAT_EXPN_TBL) {
-		IPADBG("Counting ipv4 active expansion rules:\n");
-		tbl_ptr = (struct ipa_nat_rule *)
-			 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].ipv4_expn_rules_addr;
-		for (cnt = 0;
-				 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-				 cnt++) {
-			if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-						ENABLE_FIELD)) {
-				ret++;
-			}
-		}
-		if (!ret) {
-			IPADBG("No active base expansion rules\n");
-		}
-
-		IPADBG("Number of active base expansion rules: %d\n", ret);
-	}
-
-	/* Print ipv4 index rules */
-	if (tbl_type == IPA_NAT_INDX_TBL) {
-		IPADBG("Counting ipv4 index active rules:\n");
-		indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-			 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_table_addr;
-		for (cnt = 0;
-				 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-				 cnt++) {
-			if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-						INDX_TBL_TBL_ENTRY_FIELD)) {
-				ret++;
-			}
-		}
-		if (!ret) {
-			IPADBG("No active index table rules\n");
-		}
-
-		IPADBG("Number of active index table rules: %d\n", ret);
-	}
-
-	/* Print ipv4 index expansion rules */
-	if (tbl_type == IPA_NAT_INDEX_EXPN_TBL) {
-		IPADBG("Counting ipv4 index expansion active rules:\n");
-		indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-			 ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_table_expn_addr;
-		for (cnt = 0;
-				 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-				 cnt++) {
-			if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-						INDX_TBL_TBL_ENTRY_FIELD)) {
-						ret++;
-			}
-		}
-
-		if (!ret)
-			IPADBG("No active index expansion rules\n");
-
-		IPADBG("Number of active index expansion rules: %d\n", ret);
-	}
-
-	return ret;
-}
-#endif
diff --git a/ipanat/src/ipa_nat_logi.c b/ipanat/src/ipa_nat_logi.c
deleted file mode 100644
index b829b78..0000000
--- a/ipanat/src/ipa_nat_logi.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* 
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-		* Redistributions of source code must retain the above copyright
-			notice, this list of conditions and the following disclaimer.
-		* Redistributions in binary form must reproduce the above
-			copyright notice, this list of conditions and the following
-			disclaimer in the documentation and/or other materials provided
-			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.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-/*!
-	@file
-	IPACM_log.cpp
-
-	@brief
-	This file implements the IPAM log functionality.
-
-	@Author
-	Skylar Chang
-
-*/
-#include "ipa_nat_logi.h"
-#include <stdlib.h>
-#include <unistd.h>
-
-void log_nat_message(char *msg)
-{
-	 return;
-}
-
-
diff --git a/ipanat/test/Android.mk b/ipanat/test/Android.mk
deleted file mode 100644
index bb0c59b..0000000
--- a/ipanat/test/Android.mk
+++ /dev/null
@@ -1,55 +0,0 @@
-BOARD_PLATFORM_LIST := msm8916
-BOARD_PLATFORM_LIST += msm8909
-ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true)
-ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM)))
-ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH)))
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc
-
-ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
-LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
-LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-endif
-
-LOCAL_MODULE := ipa_nat_test
-LOCAL_SRC_FILES := ipa_nat_test000.c \
-		ipa_nat_test001.c \
-		ipa_nat_test002.c \
-		ipa_nat_test003.c \
-		ipa_nat_test004.c \
-		ipa_nat_test005.c \
-		ipa_nat_test006.c \
-		ipa_nat_test007.c \
-		ipa_nat_test008.c \
-		ipa_nat_test009.c \
-		ipa_nat_test010.c \
-		ipa_nat_test011.c \
-		ipa_nat_test012.c \
-		ipa_nat_test013.c \
-		ipa_nat_test014.c \
-		ipa_nat_test015.c \
-		ipa_nat_test016.c \
-		ipa_nat_test017.c \
-		ipa_nat_test018.c \
-		ipa_nat_test019.c \
-		ipa_nat_test020.c \
-		ipa_nat_test021.c \
-		ipa_nat_test022.c \
-		main.c
-
-
-LOCAL_SHARED_LIBRARIES := libipanat
-
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/kernel-tests/ip_accelerator
-
-include $(BUILD_EXECUTABLE)
-
-endif # $(TARGET_ARCH)
-endif
-endif
diff --git a/ipanat/test/Makefile.am b/ipanat/test/Makefile.am
deleted file mode 100644
index 3aec070..0000000
--- a/ipanat/test/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-AM_CPPFLAGS = -I./../inc \
-	      -I$(top_srcdir)/ipanat/inc
-
-AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs
-AM_CPPFLAGS += -g
-
-ipanattest_SOURCES = ipa_nat_test000.c \
-		ipa_nat_test001.c \
-		ipa_nat_test002.c \
-		ipa_nat_test003.c \
-		ipa_nat_test004.c \
-		ipa_nat_test005.c \
-		ipa_nat_test006.c \
-		ipa_nat_test007.c \
-		ipa_nat_test008.c \
-		ipa_nat_test009.c \
-		ipa_nat_test010.c \
-		ipa_nat_test011.c \
-		ipa_nat_test012.c \
-		ipa_nat_test013.c \
-		ipa_nat_test014.c \
-		ipa_nat_test015.c \
-		ipa_nat_test016.c \
-		ipa_nat_test017.c \
-		ipa_nat_test018.c \
-		ipa_nat_test019.c \
-		ipa_nat_test020.c \
-		ipa_nat_test021.c \
-		ipa_nat_test022.c \
-		main.c
-
-
-bin_PROGRAMS  =  ipanattest
-
-requiredlibs =  ../src/libipanat.la
-
-ipanattest_LDADD =  $(requiredlibs)
-
-LOCAL_MODULE := libipanat
-LOCAL_PRELINK_MODULE := false
-include $(BUILD_SHARED_LIBRARY)
-
diff --git a/ipanat/test/README.txt b/ipanat/test/README.txt
deleted file mode 100644
index 4e87121..0000000
--- a/ipanat/test/README.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-1 To run this suite separately(each test case creates table and delete table) use below command
-   - To execute test suite nt times with n entries, command "ipanatest sep nt n"
-
-  Example:  To execute test suite 1 time with 100 entries, command "ipanattest sep 100"
-
-
-2. To run test suite not separately(creates table and delete table only once) use below command
-   - To execute test suite nt times with n entries, command "ipanatest reg nt n"
-
-   Example: To execute test suite 5 times with 32 entries, command "ipanattest reg 5 32"
-
-
-3. To run inotify regression test use command, "ipanattest inotify nt"
-
-   Example: To execute inotify 5 times, command "ipanattest inotify 5"
-
-
-4. if we just give command "ipanattest", runs test suite 1 time with 100 entries (non separate)
diff --git a/ipanat/test/ipa_nat_test.h b/ipanat/test/ipa_nat_test.h
deleted file mode 100644
index d5ac0d5..0000000
--- a/ipanat/test/ipa_nat_test.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*===========================================================================
-
-                     INCLUDE FILES FOR MODULE
-
-===========================================================================*/
-#include "stdint.h"  /* uint32_t */
-#include "stdio.h"
-#include <netinet/in.h> /* for proto definitions */
-
-#define u32 uint32_t
-#define u16 uint16_t
-#define u8  uint8_t
-
-/*============ Preconditions to run NAT Test cases =========*/
-#define IPA_NAT_TEST_PRE_COND_TE  20
-
-#define CHECK_ERR1(x, tbl_hdl) \
-  if(ipa_nat_validate_ipv4_table(tbl_hdl)) { \
-    if(sep) {\
-       ipa_nat_del_ipv4_tbl(tbl_hdl); \
-     }\
-    return -1;\
-  }\
-  if(x) { \
-    IPAERR("%d\n", ret); \
-    if(sep) {\
-      ipa_nat_del_ipv4_tbl(tbl_hdl); \
-     }\
-     return -1; \
-  }
-
-#define CHECK_ERR(x) if(x) { \
-    IPAERR("%d\n", ret); \
-    return -1;\
- }
-
-#if 0
-#define CHECK_ERR(x) if(x) { \
-    IPAERR("%d\n", ret); \
-    if(sep) {\
-      ipa_nat_del_ipv4_tbl(tbl_hdl); \
-    }\
-    return -1;\
- }
-#endif
-
-#define IPADBG(fmt, args...) printf(" %s:%d " fmt, __FUNCTION__, __LINE__, ## args)
-#define IPAERR(fmt, args...) printf(" %s:%d " fmt, __FUNCTION__, __LINE__, ## args)
-
-#define NAT_DUMP
-int ipa_nat_validate_ipv4_table(u32);
-
-int ipa_nat_test000(int, u32, u8);
-int ipa_nat_test001(int, u32, u8);
-int ipa_nat_test002(int, u32, u8);
-int ipa_nat_test003(int, u32, u8);
-int ipa_nat_test004(int, u32, u8);
-int ipa_nat_test005(int, u32, u8);
-int ipa_nat_test006(int, u32, u8);
-int ipa_nat_test007(int, u32, u8);
-int ipa_nat_test008(int, u32, u8);
-int ipa_nat_test009(int, u32, u8);
-int ipa_nat_test010(int, u32, u8);
-int ipa_nat_test011(int, u32, u8);
-int ipa_nat_test012(int, u32, u8);
-int ipa_nat_test013(int, u32, u8);
-int ipa_nat_test014(int, u32, u8);
-int ipa_nat_test015(int, u32, u8);
-int ipa_nat_test016(int, u32, u8);
-int ipa_nat_test017(int, u32, u8);
-int ipa_nat_test018(int, u32, u8);
-int ipa_nat_test019(int, u32, u8);
-int ipa_nat_test020(int, u32, u8);
-int ipa_nat_test021(int, int);
-int ipa_nat_test022(int, u32, u8);
diff --git a/ipanat/test/ipa_nat_test000.c b/ipanat/test/ipa_nat_test000.c
deleted file mode 100644
index 09914ea..0000000
--- a/ipanat/test/ipa_nat_test000.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test000.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test000(int total_entries, u32 tbl_hdl, u8 sep)
-{
-
-	int ret;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-	if (0 != ret)
-	{
-		IPAERR("unable to create ipv4 nat table and returning Error:%d\n", ret);
-		return -1;
-	}
-	IPADBG("create nat ipv4 table successfully() \n");
-
-	IPADBG("calling ipa_nat_del_ipv4_tbl() \n");
-	ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-	if (0 != ret)
-	{
-		IPAERR("Unable to delete ipv4 nat table %d\n", ret);
-		return -1;
-	}
-	IPADBG("deleted ipv4 nat table successfully. Test passed \n");
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test001.c b/ipanat/test/ipa_nat_test001.c
deleted file mode 100644
index 8daef33..0000000
--- a/ipanat/test/ipa_nat_test001.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test001.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test001(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s()\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test002.c b/ipanat/test/ipa_nat_test002.c
deleted file mode 100644
index e6f5ae3..0000000
--- a/ipanat/test/ipa_nat_test002.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test002.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. delete ipv4 rule
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test002(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s()\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test003.c b/ipanat/test/ipa_nat_test003.c
deleted file mode 100644
index 0634265..0000000
--- a/ipanat/test/ipa_nat_test003.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	IPA_NAT_ipa_nat_test003.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Add ipv4 rule
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test003(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test004.c b/ipanat/test/ipa_nat_test004.c
deleted file mode 100644
index 02378ff..0000000
--- a/ipanat/test/ipa_nat_test004.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test004.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Query nat table handle
-	3. Delete ipv4 table
-*/
-/*===========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test004(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret = 0;
-	u32 tbl_hdl1 = 0;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl1);
-		if(ret == 0)
-		{
-			IPAERR("able to delete table using invalid table handle\n");
-			return -1;
-		}
-	}
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test005.c b/ipanat/test/ipa_nat_test005.c
deleted file mode 100644
index 12228d1..0000000
--- a/ipanat/test/ipa_nat_test005.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test005.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Add ipv4 rule
-	3. Delete ipv4 rule
-	4. Add ipv4 rule
-	5. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test005(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret = 0;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	if (sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-		CHECK_ERR(ret);
-
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test006.c b/ipanat/test/ipa_nat_test006.c
deleted file mode 100644
index 36f0171..0000000
--- a/ipanat/test/ipa_nat_test006.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test006.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same ipv rules
-	3. delete first followed by second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test006(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret=0;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test007.c b/ipanat/test/ipa_nat_test007.c
deleted file mode 100644
index 4160c02..0000000
--- a/ipanat/test/ipa_nat_test007.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test007.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same ipv rules
-	3. delete second followed by first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test007(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test008.c b/ipanat/test/ipa_nat_test008.c
deleted file mode 100644
index d016055..0000000
--- a/ipanat/test/ipa_nat_test008.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test008.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 2 distinct rules
-	3. delete first followed by second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test008(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-	ipv4_rule1.target_ip = 0xC1171602; /* 193.23.22.2 */
-	ipv4_rule1.target_port = 1234;
-	ipv4_rule1.private_ip = 0xC2171602; /* 194.23.22.2 */
-	ipv4_rule1.private_port = 5678;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test009.c b/ipanat/test/ipa_nat_test009.c
deleted file mode 100644
index cf3c40f..0000000
--- a/ipanat/test/ipa_nat_test009.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test009.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 2 distinct rules
-	3. delete second followed by first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test009(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	ipv4_rule1.target_ip = 0xC1171602; /* 193.23.22.2 */
-	ipv4_rule1.target_port = 1234;
-	ipv4_rule1.private_ip = 0xC2171602; /* 194.23.22.2 */
-	ipv4_rule1.private_port = 5678;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test010.c b/ipanat/test/ipa_nat_test010.c
deleted file mode 100644
index 42d7fee..0000000
--- a/ipanat/test/ipa_nat_test010.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test010.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. delete first, second followed by last
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test010(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	ipv4_rule1.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule1.target_port = 1235;
-	ipv4_rule1.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule1.private_port = 5679;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 9051;
-
-	ipv4_rule2.target_ip = 0xC1171602; /* 193.23.22.2 */
-	ipv4_rule2.target_port = 1235;
-	ipv4_rule2.private_ip = 0xC2171602; /* 194.23.22.2 */
-	ipv4_rule2.private_port = 5679;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = 9051;
-
-	IPADBG("%s():\n",__FUNCTION__);
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test011.c b/ipanat/test/ipa_nat_test011.c
deleted file mode 100644
index bcce76c..0000000
--- a/ipanat/test/ipa_nat_test011.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test011.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. delete second, first followed by last
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test011(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	ipv4_rule1.target_ip = 0xF1181601;
-	ipv4_rule1.target_port = 1555;
-	ipv4_rule1.private_ip = 0xF2151601;
-	ipv4_rule1.private_port = 5999;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 9111;
-
-	ipv4_rule2.target_ip = 0xC1166602;
-	ipv4_rule2.target_port = 1555;
-	ipv4_rule2.private_ip = 0xC2155602;
-	ipv4_rule2.private_port = 5777;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = 9000;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test012.c b/ipanat/test/ipa_nat_test012.c
deleted file mode 100644
index 9d3c835..0000000
--- a/ipanat/test/ipa_nat_test012.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test012.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. Delete third, second, first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-
-int ipa_nat_test012(int totoal_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	ipv4_rule1.target_ip = 0xD1171601;
-	ipv4_rule1.target_port = 3512;
-	ipv4_rule1.private_ip = 0xD2471601;
-	ipv4_rule1.private_port = 9997;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 8881;
-
-	ipv4_rule2.target_ip = 0xC1172452;
-	ipv4_rule2.target_port = 1895;
-	ipv4_rule2.private_ip = 0xC2172452;
-	ipv4_rule2.private_port = 6668;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = 5551;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, totoal_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test013.c b/ipanat/test/ipa_nat_test013.c
deleted file mode 100644
index 2b9b005..0000000
--- a/ipanat/test/ipa_nat_test013.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test013.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add 3 distinct ipv4 rules
-	3. Delete third, first and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test013(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl, rule_hdl1, rule_hdl2;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	ipv4_rule1.target_ip = 0xC1171609; /* 193.23.22.9 */
-	ipv4_rule1.target_port = 1235;
-	ipv4_rule1.private_ip = 0xC2171609; /* 194.23.22.9 */
-	ipv4_rule1.private_port = 6579;
-	ipv4_rule1.protocol = IPPROTO_TCP;
-	ipv4_rule1.public_port = 8951;
-
-	ipv4_rule2.target_ip = 0xC1171606; /* 193.23.22.6 */
-	ipv4_rule2.target_port = 1235;
-	ipv4_rule2.private_ip = 0xC2171606; /* 194.23.22.6 */
-	ipv4_rule2.private_port = 7956;
-	ipv4_rule2.protocol = IPPROTO_TCP;
-	ipv4_rule2.public_port = 5109;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test014.c b/ipanat/test/ipa_nat_test014.c
deleted file mode 100644
index fd30317..0000000
--- a/ipanat/test/ipa_nat_test014.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test014.cpp
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete first, second and third
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test014(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s()\n", __FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test015.c b/ipanat/test/ipa_nat_test015.c
deleted file mode 100644
index eaef923..0000000
--- a/ipanat/test/ipa_nat_test015.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test015.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete first, third and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-
-int ipa_nat_test015(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test016.c b/ipanat/test/ipa_nat_test016.c
deleted file mode 100644
index 23157e2..0000000
--- a/ipanat/test/ipa_nat_test016.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test016.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete second, first and third
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test016(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test017.c b/ipanat/test/ipa_nat_test017.c
deleted file mode 100644
index d88e611..0000000
--- a/ipanat/test/ipa_nat_test017.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test017.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete second, third and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test017(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test018.c b/ipanat/test/ipa_nat_test018.c
deleted file mode 100644
index c885d4d..0000000
--- a/ipanat/test/ipa_nat_test018.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test018.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete third, second and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test018(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test019.c b/ipanat/test/ipa_nat_test019.c
deleted file mode 100644
index 3ba3119..0000000
--- a/ipanat/test/ipa_nat_test019.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test019.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-	3. delete third, first and second
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test019(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test020.c b/ipanat/test/ipa_nat_test020.c
deleted file mode 100644
index e6871b5..0000000
--- a/ipanat/test/ipa_nat_test020.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test020.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 4 ipv rules
-	3. delete third, second, fourth and first
-	4. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test020(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3, rule_hdl4;
-	ipa_nat_ipv4_rule ipv4_rule;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl4);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl4);
-	CHECK_ERR(ret);
-
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR(ret);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR(ret);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test021.c b/ipanat/test/ipa_nat_test021.c
deleted file mode 100644
index 48c4321..0000000
--- a/ipanat/test/ipa_nat_test021.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test021.c
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test021(int total_entries, int reg)
-{
-
-	int ret, i;
-	u32 tbl_hdl;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	for(i=0; i<reg; i++)
-	{
-		IPADBG("executing %d th time:\n",i);
-
-		IPADBG("calling ipa_nat_add_ipv4_tbl() \n");
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		if (0 != ret)
-		{
-			IPAERR("unable to create ipv4 nat table and returning Error:%d\n", ret);
-			IPADBG("executed %d times:\n",i);
-			return -1;
-		}
-		IPADBG("create nat ipv4 table successfully() \n");
-
-		IPADBG("calling ipa_nat_del_ipv4_tbl() \n");
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		if (0 != ret)
-		{
-			IPAERR("Unable to delete ipv4 nat table %d\n", ret);
-			IPADBG("executed %d times:\n",i);
-			return -1;
-		}
-		IPADBG("deleted ipv4 nat table successfully. Test passed \n");
-	}
-
-	IPADBG("executed %d times:\n",(i+1));
-	return 0;
-}
diff --git a/ipanat/test/ipa_nat_test022.c b/ipanat/test/ipa_nat_test022.c
deleted file mode 100644
index ebdd291..0000000
--- a/ipanat/test/ipa_nat_test022.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/*=========================================================================*/
-/*!
-	@file
-	ipa_nat_test022.cpp
-
-	@brief
-	Verify the following scenario:
-	1. Add ipv4 table
-	2. add same 3 ipv rules
-  3. delete Head and last entry
-  4. add 2 new same ip4 entries
-  5. Add head entry again
-	6. Delete ipv4 table
-*/
-/*=========================================================================*/
-
-#include "ipa_nat_test.h"
-#include "ipa_nat_drv.h"
-
-int ipa_nat_test022(int total_entries, u32 tbl_hdl, u8 sep)
-{
-	int ret;
-	u32 rule_hdl1, rule_hdl2, rule_hdl3;
-	ipa_nat_ipv4_rule ipv4_rule, ipv4_rule2;
-	u32 rule_hdl21, rule_hdl22;
-
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	/* Rule 1 */
-	ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */
-	ipv4_rule.private_port = 5678;
-	ipv4_rule.protocol = IPPROTO_TCP;
-	ipv4_rule.public_port = 9050;
-
-	/* Rule 2*/
-	ipv4_rule.target_ip = 0xC1171604; /* 193.23.22.4 */
-	ipv4_rule.target_port = 1234;
-	ipv4_rule.private_ip = 0xC2171603; /* 194.23.22.3 */
-	ipv4_rule.private_port = 5680;
-	ipv4_rule.protocol = IPPROTO_UDP;
-	ipv4_rule.public_port = 9066;
-
-	IPADBG("%s():\n",__FUNCTION__);
-
-	if(sep)
-	{
-		ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-		CHECK_ERR1(ret, tbl_hdl);
-	}
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	/* Delete head entry */
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	/* Delete Last Entry */
-	ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	/* Add 2 different Entries */
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl21);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl22);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	/* Add first entry again */
-	ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3);
-	CHECK_ERR1(ret, tbl_hdl);
-
-	if(sep)
-	{
-		ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-		CHECK_ERR1(ret, tbl_hdl);
-	}
-
-	return 0;
-}
diff --git a/ipanat/test/main.c b/ipanat/test/main.c
deleted file mode 100644
index c49ce3b..0000000
--- a/ipanat/test/main.c
+++ /dev/null
@@ -1,640 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above
- *    copyright notice, this list of conditions and the following
- *    disclaimer in the documentation and/or other materials provided
- *    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.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "ipa_nat_drv.h"
-#include "ipa_nat_drvi.h"
-#include "ipa_nat_test.h"
-
-extern struct ipa_nat_cache ipv4_nat_cache;
-
-int chk_for_loop(u32 tbl_hdl)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	int cnt;
-	uint16_t cur_entry;
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-			tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
-		IPAERR("invalid table handle passed \n");
-		return -EINVAL;
-	}
-
-	IPADBG("checking ipv4 rules:\n");
-	tbl_ptr = (struct ipa_nat_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr;
-	for (cnt = 0;
-		cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-		cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,ENABLE_FIELD)) {
-			if(Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port,
-							NEXT_INDEX_FIELD) == cnt)
-			{
-				IPAERR("Infinite loop detected, entry\n");
-				ipa_nati_print_rule(&tbl_ptr[cnt], cnt);
-				return -EINVAL;
-			}
-		}
-	}
-
-	/* Print ipv4 expansion rules */
-	IPADBG("checking ipv4 active expansion rules:\n");
-	tbl_ptr = (struct ipa_nat_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr;
-	for (cnt = 0;
-		cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-		cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-								ENABLE_FIELD)) {
-			cur_entry =
-				cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			if (Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port,
-							NEXT_INDEX_FIELD) == cur_entry)
-			{
-				IPAERR("Infinite loop detected\n");
-				ipa_nati_print_rule(&tbl_ptr[cnt],
-					(cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries));
-				return -EINVAL;
-			}
-		}
-	}
-
-	/* Print ipv4 index rules */
-	IPADBG("checking ipv4 index active rules: \n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr;
-	for (cnt = 0;
-		 cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_TBL_ENTRY_FIELD)) {
-			if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_NEXT_INDEX_FILED) == cnt)
-			{
-				IPAERR("Infinite loop detected\n");
-				ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt, 0);
-				return -EINVAL;
-			}
-		}
-	}
-
-	/* Print ipv4 index expansion rules */
-	IPADBG("Checking ipv4 index expansion active rules: \n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr;
-	for (cnt = 0;
-		cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_TBL_ENTRY_FIELD)) {
-			cur_entry =
-				cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_NEXT_INDEX_FILED) == cur_entry)
-			{
-				IPAERR("Infinite loop detected\n");
-				ipa_nati_print_index_rule(&indx_tbl_ptr[cnt],
-					(cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries),
-				ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_expn_table_meta[cnt].prev_index);
-				return -EINVAL;
-			}
-		}
-	}
-	return 0;
-}
-
-uint8_t is_base_entry_valid(u32 tbl_hdl, u16 entry)
-{
-	struct ipa_nat_rule *tbl_ptr;
-
-	if (entry >
-		ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries)
-	{
-		tbl_ptr = (struct ipa_nat_rule *)
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr;
-		entry -=
-			ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-	}
-	else
-	{
-		tbl_ptr = (struct ipa_nat_rule *)
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr;
-	}
-	return (Read16BitFieldValue(tbl_ptr[entry].ip_cksm_enbl,
-							ENABLE_FIELD));
-}
-
-uint8_t is_index_entry_valid(u32 tbl_hdl, u16 entry)
-{
-	struct ipa_nat_indx_tbl_rule *tbl_ptr;
-
-	if (entry >
-		ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries)
-	{
-		tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr;
-		entry -=
-			ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-	}
-	else
-	{
-		tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr;
-	}
-	if (Read16BitFieldValue(tbl_ptr[entry].tbl_entry_nxt_indx,
-						INDX_TBL_TBL_ENTRY_FIELD)) {
-		return 1;
-	}
-	else
-	{
-		return 0;
-	}
-}
-
-int chk_for_validity(u32 tbl_hdl)
-{
-	struct ipa_nat_rule *tbl_ptr;
-	struct ipa_nat_indx_tbl_rule *indx_tbl_ptr;
-	uint16_t nxt_index, prv_index;
-	int cnt;
-
-	if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl ||
-			tbl_hdl > IPA_NAT_MAX_IP4_TBLS) {
-		IPAERR("invalid table handle passed \n");
-		return -EINVAL;
-	}
-
-	/* Validate base table next_indx and prev_indx values */
-	IPADBG("Validating ipv4 active rules: \n");
-	tbl_ptr = (struct ipa_nat_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr;
-	for (cnt = 0;
-		cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-						ENABLE_FIELD)) {
-			nxt_index =
-			Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port,
-						NEXT_INDEX_FIELD);
-			if (!is_base_entry_valid(tbl_hdl, nxt_index)) {
-				IPAERR("Invalid next index found, entry:%d\n", cnt);
-			}
-		}
-	}
-
-	IPADBG("Validating ipv4 expansion active rules: \n");
-	tbl_ptr = (struct ipa_nat_rule *)
-			ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr;
-	for (cnt = 0;
-		cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,
-							ENABLE_FIELD)) {
-			/* Validate next index */
-			nxt_index =
-				Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port,
-									NEXT_INDEX_FIELD);
-			if (!is_base_entry_valid(tbl_hdl, nxt_index)) {
-				IPAERR("Invalid next index found, entry:%d\n", cnt);
-			}
-			/* Validate previous index */
-			prv_index =
-				Read16BitFieldValue(tbl_ptr[cnt].sw_spec_params,
-						SW_SPEC_PARAM_PREV_INDEX_FIELD);
-			if (!is_base_entry_valid(tbl_hdl, prv_index)) {
-				IPAERR("Invalid Previous index found, entry:%d\n", cnt);
-			}
-		}
-	}
-
-	IPADBG("Validating ipv4 index active rules: \n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr;
-	for (cnt = 0;
-		cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_TBL_ENTRY_FIELD)) {
-			nxt_index =
-				Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-							INDX_TBL_NEXT_INDEX_FILED);
-			if (!is_index_entry_valid(tbl_hdl, nxt_index)) {
-				IPAERR("Invalid next index found, entry:%d\n", cnt);
-			}
-		}
-	}
-
-	IPADBG("Validating ipv4 index expansion active rules: \n");
-	indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *)
-	ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr;
-	for (cnt = 0;
-		cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries;
-			 cnt++) {
-		if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-								INDX_TBL_TBL_ENTRY_FIELD)) {
-			/* Validate next index*/
-			nxt_index =
-				Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx,
-								INDX_TBL_NEXT_INDEX_FILED);
-			if (!is_index_entry_valid(tbl_hdl, nxt_index)) {
-				IPAERR("Invalid next index found, entry:%d\n", cnt);
-			}
-
-			/* Validate previous index*/
-			prv_index =
-				ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_expn_table_meta[cnt].prev_index;
-
-			if (!is_index_entry_valid(tbl_hdl, prv_index)) {
-				IPAERR("Invalid Previous index found, entry:%d\n", cnt);
-			}
-		}
-	}
-
-	return 0;
-}
-
-int ipa_nat_validate_ipv4_table(u32 tbl_hdl)
-{
-	int ret = 0;
-
-	ret = chk_for_loop(tbl_hdl);
-	if (ret)
-		return ret;
-	ret = chk_for_validity(tbl_hdl);
-
-	return ret;
-}
-
-int main(int argc, char* argv[])
-{
-	int exec = 0, pass = 0, ret;
-	int cnt, nt=1;
-	int total_entries = 100;
-	u8 sep = 0;
-	u32 tbl_hdl = 0;
-	u32 pub_ip_add = 0x011617c0;   /* "192.23.22.1" */
-
-	IPADBG("ipa_nat_testing user space nat driver\n");
-
-	if (argc == 4)
-	{
-		if (!strncmp(argv[1], "reg", 3))
-		{
-			nt = atoi(argv[2]);
-			total_entries = atoi(argv[3]);
-			IPADBG("Reg: %d, Nat Entries: %d\n", nt, total_entries);
-		}
-		else if (!strncmp(argv[1], "sep", 3))
-		{
-			sep = 1;
-			nt = atoi(argv[2]);
-			total_entries = atoi(argv[3]);
-		}
-	}
-	else if (argc == 3)
-	{
-		if (!strncmp(argv[1], "inotify", 7))
-		{
-			ipa_nat_test021(total_entries, atoi(argv[2]));
-			return 0;
-		}
-		else if (!strncmp(argv[1], "sep", 3))
-		{
-			sep = 1;
-			total_entries = atoi(argv[2]);
-		}
-	}
-	else if (argc == 2)
-	{
-		total_entries = atoi(argv[1]);
-		IPADBG("Nat Entries: %d\n", total_entries);
-	}
-
-
-	for (cnt=0; cnt<nt; cnt++)
-	{
-		IPADBG("%s():Executing %d time \n",__FUNCTION__, cnt);
-
-		if (!sep)
-		{
-			ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl);
-			CHECK_ERR(ret);
-		}
-
-		if (sep)
-		{
-			IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-			ret = ipa_nat_test000(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test00%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-			ret = ipa_nat_test001(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test00%d Fail\n", exec);
-			}
-			exec++;
-		}
-
-		IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-		ret = ipa_nat_test002(total_entries, tbl_hdl, sep);
-		if (!ret)
-		{
-			pass++;
-		}
-		else
-		{
-			IPAERR("ipa_nat_test00%d Fail\n", exec);
-		}
-		exec++;
-
-		if (sep)
-		{
-			IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-			ret = ipa_nat_test003(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test00%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-			ret = ipa_nat_test004(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test00%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-			ret = ipa_nat_test005(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test00%d Fail\n", exec);
-			}
-			exec++;
-		}
-
-		IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-		ret = ipa_nat_test006(total_entries, tbl_hdl, sep);
-		if (!ret)
-		{
-			pass++;
-		}
-		else
-		{
-			IPAERR("ipa_nat_test00%d Fail\n", exec);
-		}
-		exec++;
-
-		IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-		ret = ipa_nat_test007(total_entries, tbl_hdl, sep);
-		if (!ret)
-		{
-			pass++;
-		}
-		else
-		{
-			IPAERR("ipa_nat_test00%d Fail\n", exec);
-		}
-		exec++;
-
-		IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-		ret = ipa_nat_test008(total_entries, tbl_hdl, sep);
-		if (!ret)
-		{
-			pass++;
-		}
-		else
-		{
-			IPAERR("ipa_nat_test00%d Fail\n", exec);
-		}
-		exec++;
-
-		IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec);
-		ret = ipa_nat_test009(total_entries, tbl_hdl, sep);
-		if (!ret)
-		{
-			pass++;
-		}
-		else
-		{
-			IPAERR("ipa_nat_test00%d Fail\n", exec);
-		}
-		exec++;
-
-		if (total_entries >= IPA_NAT_TEST_PRE_COND_TE)
-		{
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test010(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test011(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test012(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test013(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test014(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test015(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test016(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test017(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test018(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test019(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test020(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-
-			IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec);
-			ret = ipa_nat_test022(total_entries, tbl_hdl, sep);
-			if (!ret)
-			{
-				pass++;
-			}
-			else
-			{
-				IPAERR("ipa_nat_test0%d Fail\n", exec);
-			}
-			exec++;
-		}
-
-		if (!sep)
-		{
-			ret = ipa_nat_del_ipv4_tbl(tbl_hdl);
-			CHECK_ERR(ret);
-		}
-	}
-	/*=======  Printing Results ==========*/
-	IPADBG("Total ipa_nat Tests Run:%d, Pass:%d, Fail:%d\n",exec, pass, exec-pass);
-	return 0;
-}