Merge "IPACM: add MCC/SCC switch support in ipacm"
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h
index 69c3412..864a554 100644
--- a/ipacm/inc/IPACM_Config.h
+++ b/ipacm/inc/IPACM_Config.h
@@ -122,12 +122,12 @@
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_lan2lan_v4, rt_tbl_lan2lan_v6;
-
struct ipa_ioc_get_rt_tbl rt_tbl_odu_v4, rt_tbl_odu_v6;
-
struct ipa_ioc_get_rt_tbl rt_tbl_eth_bridge_usb_wlan_v4, rt_tbl_eth_bridge_wlan_wlan_v4;
struct ipa_ioc_get_rt_tbl rt_tbl_eth_bridge_usb_wlan_v6, rt_tbl_eth_bridge_wlan_wlan_v6;
+ bool isMCC_Mode;
+
/* To return the instance */
static IPACM_Config* GetInstance();
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index 78c6b02..45ea6c0 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.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
@@ -177,6 +177,8 @@
IPA_ETH_BRIDGE_WLAN_CLIENT_DEL_EVENT, /* 47 ipacm_event_data_mac */
IPA_ETH_BRIDGE_HDR_PROC_CTX_SET_EVENT, /* 48 ipacm_event_data_fid */
IPA_ETH_BRIDGE_HDR_PROC_CTX_UNSET_EVENT, /* 49 ipacm_event_data_fid */
+ IPA_WLAN_SWITCH_TO_SCC, /* 50 No Data */
+ IPA_WLAN_SWITCH_TO_MCC, /* 51 No Data */
IPACM_EVENT_MAX
} ipa_cm_event_id;
diff --git a/ipacm/inc/IPACM_Routing.h b/ipacm/inc/IPACM_Routing.h
index ca7a5fd..4f5488f 100644
--- a/ipacm/inc/IPACM_Routing.h
+++ b/ipacm/inc/IPACM_Routing.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
@@ -66,6 +66,8 @@
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 */
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 381f792..8c56449 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -324,6 +324,9 @@
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 m_fd_ipa;
};
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
index 6d602a6..37584e2 100644
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -320,6 +320,8 @@
/*handle reset wifi-client rt-rules */
int handle_wlan_client_reset_rt(ipa_ip_type iptype);
+
+ void handle_SCC_MCC_switch(ipa_ip_type);
};
diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp
index 3fd3b55..00fb7df 100644
--- a/ipacm/src/IPACM_Config.cpp
+++ b/ipacm/src/IPACM_Config.cpp
@@ -63,6 +63,7 @@
ipa_nat_max_entries = 0;
ipa_nat_iface_entries = 0;
ipa_sw_rt_enable = false;
+ isMCC_Mode = false;
memset(&rt_tbl_default_v4, 0, sizeof(rt_tbl_default_v4));
memset(&rt_tbl_lan_v4, 0, sizeof(rt_tbl_lan_v4));
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 2494e99..729acf2 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -553,8 +553,11 @@
{
for (cnt = 0; cnt < tx_prop->num_tx_props; cnt++)
{
- IPACMDBG_H("Tx(%d):attrib-mask:0x%x, ip-type: %d, 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].hdr_name);
+ 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);
}
}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 335b64e..573d7c6 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -236,22 +236,22 @@
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_LINK_DOWN_EVENT, ETH);
- 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);
+ 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_LINK_DOWN_EVENT, ETH);
+ 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;
@@ -321,6 +321,10 @@
#endif
IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, wl);
IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, wl);
+#ifndef FEATURE_IPA_ANDROID
+ IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, wl);
+ IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, wl);
+#endif
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 */
@@ -357,15 +361,20 @@
if(is_sta_mode == WLAN_WAN)
{
IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, w); // for STA mode
+#ifndef FEATURE_IPA_ANDROI
+ 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);
+ IPACM_Iface::iface_addr_query(if_index);
}
}
break;
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 8e08410..06d9f41 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -39,7 +39,7 @@
*/
/******************************************************************************
- IP_MAIN.C
+ IPCM_MAIN.C
******************************************************************************/
@@ -609,6 +609,18 @@
evt_data.evt_data = data_fid;
break;
+ case WLAN_SWITCH_TO_SCC:
+ IPACMDBG_H("Received WLAN_SWITCH_TO_SCC\n");
+ IPACM_Iface::ipacmcfg->isMCC_Mode = false;
+ evt_data.event = IPA_WLAN_SWITCH_TO_SCC;
+ break;
+
+ case WLAN_SWITCH_TO_MCC:
+ IPACMDBG_H("Received WLAN_SWITCH_TO_MCC\n");
+ IPACM_Iface::ipacmcfg->isMCC_Mode = true;
+ evt_data.event = IPA_WLAN_SWITCH_TO_MCC;
+ break;
+
default:
IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type);
continue;
diff --git a/ipacm/src/IPACM_Routing.cpp b/ipacm/src/IPACM_Routing.cpp
index d6cafa0..7ae6131 100644
--- a/ipacm/src/IPACM_Routing.cpp
+++ b/ipacm/src/IPACM_Routing.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
@@ -73,7 +73,8 @@
bool IPACM_Routing::AddRoutingRule(struct ipa_ioc_add_rt_rule *ruleTable)
{
- int retval = 0;
+ int retval = 0, cnt=0;
+ bool isInvalid = false;
if (!DeviceNodeIsOpened())
{
@@ -81,6 +82,20 @@
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)
{
@@ -88,6 +103,11 @@
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;
}
@@ -224,3 +244,31 @@
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
index 2d806ab..f998969 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -715,7 +715,7 @@
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");
+ 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);
@@ -876,6 +876,44 @@
}
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;
}
@@ -1055,7 +1093,16 @@
rt_rule_entry->rule.hdr_hdl = sRetHeader.hdl;
}
- rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
+ 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));
@@ -4746,8 +4793,8 @@
}
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]);
+ 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)
@@ -4758,31 +4805,31 @@
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);
+ 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);
+ 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)
+ && 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
- ))
+ && 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 */
+ /* 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));
+ calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
+ NUM * sizeof(struct ipa_rt_rule_add));
if (rt_rule == NULL)
{
@@ -4797,70 +4844,79 @@
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;
- }
+ 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 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);
+ IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
+ wan_index,
+ get_client_memptr(wan_client, wan_index)->hdr_hdl_v4);
strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name,
- sizeof(rt_rule->rt_tbl_name));
+ IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name,
+ sizeof(rt_rule->rt_tbl_name));
- 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;
+ 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;
- if (false == m_routing.AddRoutingRule(rt_rule))
+ if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
free(rt_rule);
return IPACM_FAILURE;
}
- /* copy ipv4 RT hdl */
+ /* 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 {
+ 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);
+ 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 */
- strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
- sizeof(rt_rule->rt_tbl_name));
+ /* v6 LAN_RT_TBL */
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
- /* Support QCMAP LAN traffic feature, send to A5 */
+ /* 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(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];
+ 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(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;
@@ -4868,47 +4924,56 @@
if (false == m_routing.AddRoutingRule(rt_rule))
{
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
+ 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);
+ 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*/
+ /*Copy same rule to v6 WAN RT TBL*/
strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
- sizeof(rt_rule->rt_tbl_name));
+ IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
- /* 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(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];
+ /* 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, 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;
- if (false == m_routing.AddRoutingRule(rt_rule))
- {
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
+ 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;
+ 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);
- }
+ 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 */
@@ -4927,3 +4992,292 @@
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->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->rt_rule_hdl = wan_route_rule_v6_hdl[tx_index];
+ }
+
+ 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;
+}
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 9bb05d1..760cb61 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -617,7 +617,7 @@
{
/* Add NAT rules after ipv4 RT rules are set */
CtList->HandleNeighIpAddrAddEvt(data);
-// Nat_App->ResetPwrSaveIf(data->ipv4_addr);
+ //Nat_App->ResetPwrSaveIf(data->ipv4_addr);
}
}
}
@@ -733,6 +733,32 @@
}
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);
+ }
+ 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);
+ }
+ break;
+
default:
break;
}
@@ -1739,8 +1765,8 @@
}
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]);
+ 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)
@@ -1756,31 +1782,31 @@
return IPACM_SUCCESS;
}
- if (iptype==IPA_IP_v4)
+ 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);
+ 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
+ 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);
+ 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)
+ && 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
- ))
+ && 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));
+ calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
+ NUM * sizeof(struct ipa_rt_rule_add));
if (rt_rule == NULL)
{
@@ -1788,133 +1814,152 @@
return IPACM_FAILURE;
}
- rt_rule->commit = 1;
- rt_rule->num_rules = (uint8_t)NUM;
- rt_rule->ip = iptype;
+ 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;
- }
+ 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 = &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 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);
+ IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n",
+ wlan_index,
+ get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4);
strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
- sizeof(rt_rule->rt_tbl_name));
+ IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
+ sizeof(rt_rule->rt_tbl_name));
- 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;
+ 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;
- if (false == m_routing.AddRoutingRule(rt_rule))
- {
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
+ 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 */
- strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
- sizeof(rt_rule->rt_tbl_name));
-
- /* 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(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;
-
- 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*/
- strncpy(rt_rule->rt_tbl_name,
- IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
- sizeof(rt_rule->rt_tbl_name));
-
- /* 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(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;
-
- 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;
-
+ /* 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_v6_wan[v6_num], iptype);
- }
+ 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 */
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
+
+ /* 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;
+
+ 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*/
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
+
+ /* 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;
+
+ 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 */
+ } /* end of for loop */
free(rt_rule);
@@ -4561,3 +4606,210 @@
IPACM_Lan::num_wlan_client--;
return;
}
+
+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;
+}