IPACM: Fix for AP + STA mode

in AP+STA mode, IPANAT won't create dummy nat entry
in IPA-HW to send DL traffic back to Q6, also wlan
layer2 header offset is changed

Change-Id: I3830059372af07fd0fc2c724eb08d0b85c25f777
diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h
index 43b33c4..b4c3f28 100644
--- a/ipacm/inc/IPACM_ConntrackListener.h
+++ b/ipacm/inc/IPACM_ConntrackListener.h
@@ -70,6 +70,7 @@
 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);
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index 28bc142..37a9ef5 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -54,7 +54,7 @@
 #define IPA_IFACE_NAME_LEN 16
 #define IPA_ALG_PROTOCOL_NAME_LEN  10
 
-#define IPA_WLAN_PARTIAL_HDR_OFFSET  12 // dst mac first then src mac
+#define IPA_WLAN_PARTIAL_HDR_OFFSET  0 // dst mac first then src mac
 #define IPA_VIRTUAL_IFACE_NAME "bridge0"
 #define IPA_WLAN_PARTIAL_HDR_NAME_v4  "IEEE802_3_v4"
 #define IPA_WLAN_PARTIAL_HDR_NAME_v6  "IEEE802_3_v6"
@@ -198,6 +198,7 @@
 	char ifname[IPA_IFACE_NAME_LEN];
 	uint32_t ipv4_addr;
 	uint32_t addr_mask;
+	bool is_sta;
 }ipacm_event_iface_up;
 
 
diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp
index cff8e7a..b747e0c 100644
--- a/ipacm/src/IPACM_ConntrackClient.cpp
+++ b/ipacm/src/IPACM_ConntrackClient.cpp
@@ -291,13 +291,16 @@
 
 				nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
 
-				IPACMDBG("ignore connections orignated from interface %s\n", item->ifr_name);
-		IPACM_ConntrackClient::iptodot("with ipv4 address:", filter_ipv4.addr);
-		nfct_filter_set_logic(filter,
-													NFCT_FILTER_SRC_IPV4,
-													NFCT_FILTER_LOGIC_NEGATIVE);
+        if(!ct->isStaMode) {
+					IPACMDBG("ignore connections orignated from interface %s\n", item->ifr_name);
+					IPACM_ConntrackClient::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);
+					nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
+				}
+
 			}
 		}
 
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index bfa2f37..3b62bd4 100644
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -258,6 +258,7 @@
 
 	 IPACM_ConntrackClient::iptodot("public ip address", wanup_data->ipv4_addr);
 	 isWanUp = true;
+	 isStaMode = wanup_data->is_sta;
 
 	 wan_ipaddr = wanup_data->ipv4_addr;
 	 memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname));
@@ -489,7 +490,7 @@
 	 }
 	 else
 	 {
-		 IPACMDBG("Neither Destination nor Source nat flag reset\n");
+		 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)
@@ -640,7 +641,7 @@
 	 }
 	 }
 	 
-	 IPACMDBG("Nat Entry with below information will be added\n");
+	 IPACMDBG("Nat Entry with below information will either be added or deleted\n");
 	 IPACM_ConntrackClient::iptodot("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);
 	 IPACM_ConntrackClient::iptodot("private ip or src ip", rule.private_ip);
@@ -650,7 +651,7 @@
 
 	 if(IPPROTO_TCP == rule.protocol)
 	 {
-		        na = NatApp::GetInstance();
+		  na = NatApp::GetInstance();
 			if(na == NULL)
 			{
 				IPACMERR("unable to get nat app instance");
diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp
index 27f6ab0..36dec9a 100644
--- a/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -185,7 +185,12 @@
 			 cache[cnt].target_port == rule->target_port &&
 			 cache[cnt].protocol == rule->protocol)
 		{
-			IPACMDBG("Duplicate Rule\n");
+			IPACMDBG("Duplicate Rule, ignore\n");
+			IPACMDBG("Received below nat entry for deletion\n");
+			IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
+			IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
+			IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
+			IPACMDBG("protocolcol: %d\n", rule->protocol);
 			return true;
 		}
 	}
@@ -224,21 +229,15 @@
 					return -1;
 				}
 
-				IPACMDBG("Deleted below Nat entry Successfully\n");
+				IPACMDBG("Deleted Nat entry Successfully\n");
 			}
 			else
 			{
-				IPACMDBG("Deleted below Nat entry only from cache\n");
+				IPACMDBG("Deleted Nat entry only from cache\n");
 			}
 			
 			memset(&cache[cnt], 0, sizeof(cache[cnt]));
 			curCnt--;
-			
-			IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
-			IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
-			IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
-			IPACMDBG("protocolcol: %d\n", rule->protocol);
-			
 			break; 
 		}
 	}
@@ -256,6 +255,12 @@
 
 	CHK_TBL_HDL();
 
+	IPACMDBG("Received below nat entry for deletion\n");
+	IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
+	IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
+	IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
+	IPACMDBG("protocolcol: %d\n", rule->protocol);
+
 	if(isAlgPort(rule->protocol, rule->private_port) ||
 		 isAlgPort(rule->protocol, rule->target_port))
 	{
@@ -270,11 +275,6 @@
 		 rule->protocol == 0)
 	{
 		IPACMERR("Invalid Connection, ignoring it\n");
-		IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
-		IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
-		IPACMDBG("Private Port:%d \t Target Port: %d\t", rule->private_port, rule->target_port);
-		IPACMDBG("Public Port:%d\n", rule->public_port);
-		IPACMDBG("protocol: %d\n", rule->protocol);
 		return 0;
 	}
 
@@ -345,12 +345,7 @@
 
 	if(cache[cnt].enabled == true)
 	{
-		IPACMDBG("Added below rule successfully\n");
-		IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
-		IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
-		IPACMDBG("Private Port:%d \t Target Port: %d\t", rule->private_port, rule->target_port);
-		IPACMDBG("Public Port:%d\n", rule->public_port);
-		IPACMDBG("protocol: %d\n", rule->protocol);
+		IPACMDBG("Added rule successfully\n");
 	}
 
 	return 0;
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 4c9710d..ac49526 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -717,6 +717,7 @@
 
 		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
 		wanup_data->ipv4_addr = wan_v4_addr;
+		wanup_data->is_sta = IPACM_Wan::backhaul_is_sta_mode;
 		IPACMDBG("Posting IPA_HANDLE_WAN_UP with below information:\n");
 		IPACMDBG("if_name:%s, ipv4_address:0x%x\n",
 						 wanup_data->ifname, wanup_data->ipv4_addr);