Merge "IPACM: support usb dynamic config w.o plug-in/out"
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index eb9e265..436e99e 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -73,6 +73,9 @@
 	/* IPACM interface id */
 	int ipa_if_num;
 
+		/* IPACM interface category */
+		int ipa_if_cate;
+
 	/* IPACM interface name */
 	char dev_name[IF_NAME_LEN];
 
@@ -121,6 +124,9 @@
 	/*Configure the initial filter rules */
 	virtual int init_fl_rule(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;
diff --git a/ipacm/inc/IPACM_IfaceManager.h b/ipacm/inc/IPACM_IfaceManager.h
index a78ec4c..d37ede2 100644
--- a/ipacm/inc/IPACM_IfaceManager.h
+++ b/ipacm/inc/IPACM_IfaceManager.h
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -67,23 +67,23 @@
 
 public:
 
-  IPACM_IfaceManager(); 
-  
+  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(int if_index, bool is_sta_mode);
 
-    /* api to register instances */	
+private:
+	int create_iface_instance(int if_index, int is_sta_mode);
+
+    /* api to register instances */
 	int registr(int ipa_if_index, IPACM_Listener *obj);
-		
+
 	int SearchInstance(int ipa_if_index);
-	
+
 	static iface_instances *head;
 
 };
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
index 7f5229e..45eb9ee 100644
--- a/ipacm/inc/IPACM_Lan.h
+++ b/ipacm/inc/IPACM_Lan.h
@@ -191,6 +191,8 @@
 
 	/* 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;
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 407de2e..4d0249e 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -62,7 +62,7 @@
 	static bool wan_up;
 	static bool wan_up_v6;
 
-	IPACM_Wan(int iface_index, bool is_sta_mode);
+	IPACM_Wan(int iface_index, int is_sta_mode);
 	virtual ~IPACM_Wan();
 
 	static bool isWanUP()
@@ -84,8 +84,8 @@
 
 	static int num_v4_flt_rule;
 	static int num_v6_flt_rule;
-	
-	bool m_is_sta_mode;
+
+	int m_is_sta_mode;
 	static bool backhaul_is_sta_mode;
 	static bool is_ext_prop_set;
 
@@ -120,23 +120,22 @@
 	int handle_header_add_evt(uint8_t mac_addr[6]);
 
 	int config_dft_firewall_rules(ipa_ip_type iptype);
-	
+
 	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 */	
+	/* 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, 
+	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 */
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index c274a3d..e55ff2f 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -47,6 +47,7 @@
 #include <IPACM_Wan.h>
 #include <IPACM_Wlan.h>
 #include <ifaddrs.h>
+#include <string.h>
 
 const char *IPACM_Iface::DEVICE_NAME = "/dev/ipa";
 IPACM_Routing IPACM_Iface::m_routing;
@@ -61,6 +62,7 @@
 	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;
@@ -832,3 +834,37 @@
 
 	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("interface name %s\n", ifr.ifr_name);
+
+  if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0)
+  {
+    IPACMERR("call_ioctl_on_dev: ioctl failed:\n");
+    close(fd);
+    return IPACM_FAILURE;
+  }
+
+  *if_index = ifr.ifr_ifindex;
+  IPACMDBG("Interface index %d\n", *if_index);
+  close(fd);
+  return IPACM_SUCCESS;
+}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 5046fa9..535a9c7 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -73,7 +73,7 @@
 			break;
 		case IPA_LINK_UP_EVENT:
 			IPACMDBG("link up %d: \n", evt_data->if_index);
-			create_iface_instance(evt_data->if_index, false);
+			create_iface_instance(evt_data->if_index, 0);
 			break;
 
 		case IPA_USB_LINK_UP_EVENT:
@@ -81,15 +81,16 @@
 			/* check if it's WAN_IF */
 			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF)
 			{
+				/* usb-backhaul using sta_mode 2*/
 			IPACMDBG("WAN-usb (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, true);
+				create_iface_instance(evt_data->if_index, 2);
 			}
 			else
 			{
-			create_iface_instance(evt_data->if_index, false);
+				create_iface_instance(evt_data->if_index, 0);
 			}
 			break;
-		
+
 		case IPA_WLAN_AP_LINK_UP_EVENT:
 			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
 			/* change iface category from unknown to WLAN_IF */
@@ -97,7 +98,7 @@
 			{
 			IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WLAN_IF;
 			IPACMDBG("WLAN AP (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, false);
+			create_iface_instance(evt_data->if_index, 0);
 			}
 			else
 			{
@@ -110,9 +111,10 @@
 			/* 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 1 */
 			IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WAN_IF;
 			IPACMDBG("WLAN STA (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, true);
+				create_iface_instance(evt_data->if_index, 1);
 			}
 			else
 			{
@@ -126,7 +128,7 @@
 	return;
 }
 
-int IPACM_IfaceManager::create_iface_instance(int if_index, bool is_sta_mode)
+int IPACM_IfaceManager::create_iface_instance(int if_index, int is_sta_mode)
 {
 	int ipa_interface_index;
 	ipa_interface_index = IPACM_Iface::iface_ipa_index_query(if_index);
@@ -161,6 +163,7 @@
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, lan);
 				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
 				IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, lan);
+				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, lan); 		// register for IPA_CFG_CHANGE event
 				IPACMDBG("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 */
@@ -224,6 +227,7 @@
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, w);
 				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, w);
 				IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, w); // for STA mode
+				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, w); 		// register for IPA_CFG_CHANGE event
 				IPACMDBG("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 */
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 008a185..ce813bb 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -92,10 +92,9 @@
 	memset(lan2lan_hdr_hdl_v6, 0, MAX_OFFLOAD_PAIR*sizeof(lan2lan_hdr_hdl));
 
 	is_active = true;
-
 	memset(tcp_ctl_flt_rule_hdl_v4, 0, NUM_TCP_CTL_FLT_RULE*sizeof(uint32_t));
 	memset(tcp_ctl_flt_rule_hdl_v6, 0, NUM_TCP_CTL_FLT_RULE*sizeof(uint32_t));
-
+	is_mode_switch = false;
 	return;
 }
 
@@ -136,6 +135,20 @@
 		}
 		break;
 
+	case IPA_CFG_CHANGE_EVENT:
+		{
+			if ( IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate)
+			{
+				IPACMDBG("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;
+			}
+		}
+		break;
+
 	case IPA_LAN_DELETE_SELF:
 	{
 		ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
@@ -143,6 +156,29 @@
 		{
 			IPACMDBG("Received IPA_LAN_DELETE_SELF event.\n");
 			IPACMDBG("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("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 NULL;
+				}
+				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("Posting event:%d\n", evt_data.event);
+				IPACM_EvtDispatcher::PostEvt(&evt_data);
+			}
 			delete this;
 		}
 		break;
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index ae3902c..012668e 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -147,8 +147,7 @@
 	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));
 
@@ -158,7 +157,7 @@
 	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 
+	 that multicast messages for these groups are delivered over this
 	 socket. */
 
 	if(bind(*p_sk_fd,
@@ -394,7 +393,7 @@
 
 	return IPACM_SUCCESS;
 
-/* An error occurred while receiving the message. Free all memory before 
+/* An error occurred while receiving the message. Free all memory before
 				 returning. */
 error:
 	ipa_nl_release_msg(msgh);
@@ -433,7 +432,7 @@
 {
 	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);
@@ -475,7 +474,7 @@
 {
 	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);
@@ -523,7 +522,7 @@
 {
 	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);
@@ -632,7 +631,7 @@
 				{
 					IPACMDBG("\n GOT useful newlink event\n");
 					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-					
+
 					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
 					if(data_fid == NULL)
 					{
@@ -640,7 +639,7 @@
 						return IPACM_FAILURE;
 					}
 					data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
-					
+
 					if(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_UP)
 					{
 						IPACMDBG("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
@@ -662,8 +661,8 @@
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
 
 				}
-				
-				/* Add IPACM support for ECM plug-in/plug_out */                
+
+				/* 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
@@ -671,7 +670,7 @@
                                 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)
 					{
@@ -679,17 +678,17 @@
 						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);
 				        IPACMDBG("Got a ECM link_up event (Interface %s) \n", dev_name);
-                  
+
                                         /*--------------------------------------------------------------------------
                                            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);
-                                }				
+                                }
                                 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));
@@ -703,14 +702,14 @@
 					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
          		                IPACMDBG("Got a ECM link_down event (Interface %s) \n", dev_name);
 
-                                        /*--------------------------------------------------------------------------
-                                           Post LAN iface (ECM) link down event
-                                         ---------------------------------------------------------------------------*/
-                                        evt_data.event = IPA_LINK_DOWN_EVENT;
+                    /*--------------------------------------------------------------------------
+                       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);                     
-                                }							
-				
+					IPACM_EvtDispatcher::PostEvt(&evt_data);
+                                }
+
 			}
 			break;
 
@@ -783,7 +782,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
 				}
 				else
 				{
@@ -791,7 +790,7 @@
 					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;
@@ -803,7 +802,7 @@
 								 data_addr->ipv6_addr[0],
 								 data_addr->ipv6_addr[1],
 								 data_addr->ipv6_addr[2],
-								 data_addr->ipv6_addr[3]);				
+								 data_addr->ipv6_addr[3]);
                 }
 				else
 				{
@@ -832,11 +831,11 @@
 			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_scope == RT_SCOPE_UNIVERSE) && 
+			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_scope == RT_SCOPE_UNIVERSE) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 				IPACMDBG("\n GOT RTM_NEWROUTE event\n");
@@ -849,8 +848,8 @@
 						IPACMERR("Error while getting interface name\n");
 					}
 
-					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 );				 
+					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);
@@ -917,13 +916,13 @@
 						data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 						data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 						data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
+						data_addr->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", 
+						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);
@@ -932,8 +931,8 @@
 					}
 					else
 					{
-						IPACM_NL_REPORT_ADDR( "route add default gw", msg_ptr->nl_route_info.attr_info.gateway_addr );
-						IPACMDBG("dev %s", dev_name);
+						IPACM_NL_REPORT_ADDR( "route add default gw \n", msg_ptr->nl_route_info.attr_info.gateway_addr );
+						IPACMDBG("dev %s \n", dev_name);
 						IPACM_NL_REPORT_ADDR( "dstIP:", msg_ptr->nl_route_info.attr_info.dst_addr );
 
 						/* insert to command queue */
@@ -944,8 +943,8 @@
 							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, 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);
 
 						evt_data.event = IPA_ROUTE_ADD_EVENT;
 						data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
@@ -965,9 +964,9 @@
 			}
 
 			/* 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) && 
+			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");
@@ -985,7 +984,7 @@
 									 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)
@@ -999,7 +998,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+					data_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++)
@@ -1026,8 +1025,8 @@
 					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
-									 
+					data_addr->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;
@@ -1044,7 +1043,7 @@
 					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)
@@ -1055,17 +1054,17 @@
 
 					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]);								 
+                    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]);		
+					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;
@@ -1087,9 +1086,9 @@
 				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_scope == 0) && 
+			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_scope == 0) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 
@@ -1162,19 +1161,19 @@
 						data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 						data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 						data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-						data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+						data_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]);								
+						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
 						data_addr->iptype = IPA_IP_v6;
 					}
 					else
 					{
-						IPACM_NL_REPORT_ADDR( "route del default gw", msg_ptr->nl_route_info.attr_info.gateway_addr);				 
+						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);
@@ -1198,9 +1197,9 @@
 			}
 
 			/* 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) && 
+			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");
@@ -1231,7 +1230,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);	
+					data_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++)
@@ -1269,8 +1268,8 @@
 					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); 
-						
+					data_addr->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;
@@ -1310,21 +1309,21 @@
 						return IPACM_FAILURE;
 					}
 
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));				
+		    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->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_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;
@@ -1375,7 +1374,7 @@
 			{
 				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)
@@ -1384,21 +1383,21 @@
 					return IPACM_FAILURE;
 				}
 
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));				
+		    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_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->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_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;
@@ -1407,7 +1406,7 @@
 		    {
 		        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],
@@ -1415,7 +1414,6 @@
 		     (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,
@@ -1553,7 +1551,7 @@
 		return IPACM_FAILURE;
 	}
 
-	/* Add NETLINK socket to the list of sockets that the listener 
+	/* 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)
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 4df0467..54e5c82 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -61,7 +61,7 @@
 bool IPACM_Wan::backhaul_is_sta_mode = false;
 bool IPACM_Wan::is_ext_prop_set = false;
 
-IPACM_Wan::IPACM_Wan(int iface_index, bool is_sta_mode) : IPACM_Iface(iface_index)
+IPACM_Wan::IPACM_Wan(int iface_index, int is_sta_mode) : IPACM_Iface(iface_index)
 {
 	num_firewall_v4 = 0;
 	num_firewall_v6 = 0;
@@ -81,7 +81,7 @@
 	hdr_hdl_sta_v4 = 0;
 	hdr_hdl_sta_v6 = 0;
 
-	if(m_is_sta_mode == false)
+	if(m_is_sta_mode == 0)
 	{
 		IPACMDBG("The new WAN interface is modem.\n");
 		query_ext_prop();
@@ -198,7 +198,7 @@
 
         if (num_dft_rt_v6 == 0)
 	    {
-			if(m_is_sta_mode == false)
+			if(m_is_sta_mode == 0)
 			{
 				init_fl_rule_ex(data->iptype);
 			}
@@ -249,7 +249,7 @@
         IPACMDBG("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]);
 			/* initial multicast/broadcast/fragment filter rule */
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			init_fl_rule_ex(data->iptype);
 		}
@@ -278,7 +278,7 @@
 	{
 	case IPA_WLAN_LINK_DOWN_EVENT:
 		{
-			if(m_is_sta_mode == true)
+			if(m_is_sta_mode == 1)
 			{
 				ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
 				ipa_interface_index = iface_ipa_index_query(data->if_index);
@@ -297,9 +297,44 @@
 		}
 		break;
 
+	case IPA_CFG_CHANGE_EVENT:
+		{
+			if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate) &&
+					(m_is_sta_mode ==2))
+			{
+				IPACMDBG("Received IPA_CFG_CHANGE_EVENT and category changed(sta_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 NULL;
+				}
+				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("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:
 		{
-			if(m_is_sta_mode == false)
+			if(m_is_sta_mode == 0)
 			{
 				ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
 				ipa_interface_index = iface_ipa_index_query(data->if_index);
@@ -383,7 +418,7 @@
 				{
 					IPACMDBG("get del default v4 route (dst:0.0.0.0)\n");
 
-					if(m_is_sta_mode == false)
+					if(m_is_sta_mode == 0)
 					{
 						del_wan_firewall_rule(IPA_IP_v4);
 						install_wan_filtering_rule();
@@ -399,7 +434,7 @@
 				{
 					IPACMDBG("get del default v6 route (dst:00.00.00.00)\n");
 
-					if(m_is_sta_mode == false)
+					if(m_is_sta_mode == 0)
 					{
 						del_wan_firewall_rule(IPA_IP_v6);
 						install_wan_filtering_rule();
@@ -442,7 +477,7 @@
 	case IPA_FIREWALL_CHANGE_EVENT:
 		IPACMDBG("Received IPA_FIREWALL_CHANGE_EVENT\n");
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			if(ip_type == IPA_IP_v4)
 			{
@@ -517,7 +552,22 @@
 		return IPACM_SUCCESS;
 	}
 
-	IPACM_Wan::backhaul_is_sta_mode	= m_is_sta_mode;
+	if (m_is_sta_mode !=0)
+	{
+		IPACM_Wan::backhaul_is_sta_mode	= true;
+		if((iptype==IPA_IP_v4) && (header_set_v4 != true))
+		{
+			header_partial_default_wan_v4 = true;
+			IPACMDBG("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("STA ipv6-header haven't constructed \n");
+			return IPACM_SUCCESS;
+		}
+	}
 
     for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
@@ -584,7 +634,7 @@
 	rt_rule_entry = &rt_rule->rules[0];
 	rt_rule_entry->at_rear = true;
 
-	if(m_is_sta_mode == true)
+	if(m_is_sta_mode != 0)
 	{
 		IPACMDBG(" WAN instance is in STA mode \n");
 		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
@@ -715,7 +765,7 @@
 	    IPACM_Wan::wan_up = true;
 		active_v4 = true;
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			config_wan_firewall_rule(IPA_IP_v4);
 			install_wan_filtering_rule();
@@ -727,7 +777,14 @@
 
 		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
 		wanup_data->ipv4_addr = wan_v4_addr;
-		wanup_data->is_sta = m_is_sta_mode;
+		if (m_is_sta_mode!=0)
+		{
+			wanup_data->is_sta = true;
+		}
+		else
+		{
+			wanup_data->is_sta = false;
+		}
 		IPACMDBG("Posting IPA_HANDLE_WAN_UP with below information:\n");
 		IPACMDBG("if_name:%s, ipv4_address:0x%x, is sta mode:%d\n",
 			wanup_data->ifname, wanup_data->ipv4_addr,  wanup_data->is_sta);
@@ -741,7 +798,7 @@
 		IPACM_Wan::wan_up_v6 = true;
 		active_v6 = true;
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			config_wan_firewall_rule(IPA_IP_v6);
 			install_wan_filtering_rule();
@@ -752,7 +809,15 @@
 		}
 
 		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
-		wanup_data->is_sta = m_is_sta_mode;
+		if (m_is_sta_mode!=0)
+		{
+			wanup_data->is_sta = true;
+		}
+		else
+		{
+			wanup_data->is_sta = false;
+		}
+
 		IPACMDBG("Posting IPA_HANDLE_WAN_UP_V6 with below information:\n");
 		IPACMDBG("if_name:%s, is sta mode: %d\n", wanup_data->ifname, wanup_data->is_sta);
 
@@ -2772,7 +2837,14 @@
 		if (iptype == IPA_IP_v4)
 		{
 			wandown_data->ipv4_addr = wan_v4_addr;
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				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 */
@@ -2784,7 +2856,14 @@
 		}
 		else
 		{
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
 			evt_data.evt_data = (void *)wandown_data;
 			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
@@ -2845,7 +2924,14 @@
 		if (iptype == IPA_IP_v4)
 		{
 			wandown_data->ipv4_addr = wan_v4_addr;
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				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 */
@@ -2858,7 +2944,14 @@
 		}
 		else
 		{
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
 			evt_data.evt_data = (void *)wandown_data;
 			IPACMDBG("posting IPA_HANDLE_WAN_DOWN_V6 for IPv6 \n");