IPACM: Add QMAP header in routing rule

Specify QMAP header in the routing rule to A7 for modem PDN,
otherwise embedded DL packets will be dropped in A7.

Change-Id: Ie5714d7664b0d60fed639784f2fda73b8087d4e4
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 3527f13..785d8e2 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -1079,6 +1079,7 @@
 	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);
 
@@ -1297,38 +1298,44 @@
 
 	if (iptype == IPA_IP_v6)
 	{
-    strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.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)
-	{
-		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] = 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;
+		strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.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));
+			strncpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name));
+			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->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;
 
-	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);
+		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;
@@ -1343,7 +1350,7 @@
 
 	if (iptype == IPA_IP_v4)
 	{
-	    IPACM_Wan::wan_up = true;
+		IPACM_Wan::wan_up = true;
 		active_v4 = true;
 
 		if(m_is_sta_mode == Q6_WAN)