Merge "IPACM: add backup support to reset upstream iface"
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index fa6d101..e0fe7b0 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -42,7 +42,6 @@
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
-#include <assert.h>
#include "IPACM_Netlink.h"
#include "IPACM_Lan.h"
#include "IPACM_Wan.h"
@@ -247,35 +246,35 @@
if (IPACM_Wan::isWanUP())
{
+ if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
+ {
if(IPACM_Wan::backhaul_is_sta_mode == false)
{
- if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
handle_wan_up_ex(ext_prop, IPA_IP_v4);
}
- }
else
{
handle_wan_up(IPA_IP_v4);
}
}
+ }
if(IPACM_Wan::isWanUP_V6())
{
+ if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
+ {
if(IPACM_Wan::backhaul_is_sta_mode == false)
{
- if(data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
handle_wan_up_ex(ext_prop, IPA_IP_v6);
}
- }
else
{
handle_wan_up(IPA_IP_v6);
}
}
+ }
/* Post event to NAT */
if (data->iptype == IPA_IP_v4)
@@ -320,18 +319,18 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
+ if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ {
if(data_wan->is_sta == false)
{
- if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
handle_wan_up_ex(ext_prop, IPA_IP_v4);
}
- }
else
{
handle_wan_up(IPA_IP_v4);
}
+ }
break;
case IPA_HANDLE_WAN_UP_V6:
@@ -344,18 +343,18 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
+ if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ {
if(data_wan->is_sta == false)
{
- if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
handle_wan_up_ex(ext_prop, IPA_IP_v6);
}
- }
else
{
handle_wan_up(IPA_IP_v6);
}
+ }
break;
case IPA_HANDLE_WAN_DOWN:
@@ -2494,7 +2493,6 @@
{
if(lan2lan_flt_rule_hdl_v4[i].rule_hdl == rule_hdl)
{
- assert(lan2lan_flt_rule_hdl_v4[i].valid == true);
if(reset_to_dummy_flt_rule(IPA_IP_v4, rule_hdl) == IPACM_FAILURE)
{
IPACMERR("Failed to delete lan2lan v4 flt rule %d\n", rule_hdl);
@@ -2519,7 +2517,6 @@
{
if(lan2lan_flt_rule_hdl_v6[i].rule_hdl == rule_hdl)
{
- assert(lan2lan_flt_rule_hdl_v6[i].valid == true);
if(reset_to_dummy_flt_rule(IPA_IP_v6, rule_hdl) == IPACM_FAILURE)
{
IPACMERR("Failed to delete lan2lan v6 flt rule %d\n", rule_hdl);
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 3ec5fab..7993ce5 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -416,6 +416,43 @@
handle_route_add_evt(data->iptype);
}
}
+ else /* double check if current default iface is not itself */
+ {
+ if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == true))
+ {
+ IPACMDBG("Received v4 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
+ IPACMDBG("ipv4 addr 0x%x\n", data->ipv4_addr);
+ IPACMDBG("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask);
+ IPACMDBG("need clean default v4 route (dst:0.0.0.0) for old iface (%s)\n", dev_name);
+ if(m_is_sta_mode == Q6_WAN)
+ {
+ del_wan_firewall_rule(IPA_IP_v4);
+ install_wan_filtering_rule();
+ handle_route_del_evt_ex(IPA_IP_v4);
+ }
+ else
+ {
+ del_dft_firewall_rules(IPA_IP_v4);
+ handle_route_del_evt(IPA_IP_v4);
+ }
+ }
+ 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("Received v6 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name);
+ IPACMDBG("need clean default v6 route for old iface (%s)\n", dev_name);
+ if(m_is_sta_mode == Q6_WAN)
+ {
+ del_wan_firewall_rule(IPA_IP_v6);
+ install_wan_filtering_rule();
+ handle_route_del_evt_ex(IPA_IP_v6);
+ }
+ else
+ {
+ del_dft_firewall_rules(IPA_IP_v6);
+ handle_route_del_evt(IPA_IP_v6);
+ }
+ }
+ }
}
break;
@@ -589,6 +626,11 @@
return IPACM_SUCCESS;
}
}
+ else
+ {
+ IPACM_Wan::backhaul_is_sta_mode = false;
+ IPACMDBG("reset backhaul to LTE \n");
+ }
for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
{
@@ -2902,7 +2944,12 @@
evt_data.event = IPA_HANDLE_WAN_DOWN;
evt_data.evt_data = (void *)wandown_data;
/* Insert IPA_HANDLE_WAN_DOWN to command queue */
- IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 \n");
+ IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 (%d.%d.%d.%d) \n",
+ (unsigned char)(wandown_data->ipv4_addr),
+ (unsigned char)(wandown_data->ipv4_addr >> 8),
+ (unsigned char)(wandown_data->ipv4_addr >> 16),
+ (unsigned char)(wandown_data->ipv4_addr >> 24));
+
IPACM_EvtDispatcher::PostEvt(&evt_data);
IPACMDBG("setup wan_up/active_v4= false \n");
IPACM_Wan::wan_up = false;
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 2b68bc7..42099f0 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -250,35 +250,35 @@
if (IPACM_Wan::isWanUP())
{
+ if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
+ {
if(IPACM_Wan::backhaul_is_sta_mode == false)
{
- if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4);
}
- }
else
{
IPACM_Lan::handle_wan_up(IPA_IP_v4);
}
}
+ }
if(IPACM_Wan::isWanUP_V6())
{
+ if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
+ {
if(IPACM_Wan::backhaul_is_sta_mode == false)
{
- if(data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6);
}
- }
else
{
IPACM_Lan::handle_wan_up(IPA_IP_v6);
}
}
+ }
IPACMDBG("posting IPA_HANDLE_WLAN_UP:Finished checking wan_up\n");
}
@@ -297,19 +297,19 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
+ if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ {
if(data_wan->is_sta == false)
{
- if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4);
IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4);
}
- }
else
{
IPACM_Lan::handle_wan_up(IPA_IP_v4);
}
}
+ }
break;
case IPA_HANDLE_WAN_UP_V6:
@@ -322,18 +322,18 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
+ if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ {
if(data_wan->is_sta == false)
{
- if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
- {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6);
}
- }
else
{
IPACM_Lan::handle_wan_up(IPA_IP_v6);
}
+ }
break;
case IPA_HANDLE_WAN_DOWN: