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)