IPACM: fix L2TP issues
Fix 2 issues in L2TP:
1. ipa rm dependency was not created between ETH and WLAN.
2. L2TP filtering rule was not cleaned up after WLAN was
going down.
Change-Id: Ic01e10eaf35195da8b55e25f779a13669d0d1dae
Acked-by: Shihuan Liu <shihuanl@qti.qualcomm.com>
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index c4c6cd9..2f561cc 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -857,6 +857,11 @@
#ifdef FEATURE_L2TP
else if(is_l2tp_event(data->iface_name) && ipa_if_cate == ODU_IF)
{
+ if(tx_prop != NULL)
+ {
+ IPACMDBG_H("add rm dependency for L2TP interface.\n");
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ }
eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->mac_addr, NULL, data->iface_name);
}
else
diff --git a/ipacm/src/IPACM_LanToLan.cpp b/ipacm/src/IPACM_LanToLan.cpp
index 28ee649..799dfee 100644
--- a/ipacm/src/IPACM_LanToLan.cpp
+++ b/ipacm/src/IPACM_LanToLan.cpp
@@ -1338,13 +1338,49 @@
{
if(m_is_ip_addr_assigned[IPA_IP_v4])
{
- m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4);
- IPACMDBG_H("IPv4 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v4]);
+ if(m_is_l2tp_iface)
+ {
+ IPACMDBG_H("No IPv4 client flt rule on l2tp iface.\n");
+ }
+ else
+ {
+ if(it->p_client->is_l2tp_client)
+ {
+ m_p_iface->del_l2tp_flt_rule(IPA_IP_v4, it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v4],
+ it->l2tp_second_pass_flt_rule_hdl);
+ it->l2tp_second_pass_flt_rule_hdl = 0;
+ IPACMDBG_H("Deleted IPv4 first pass flt rule %d and second pass flt rule %d.\n",
+ it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v4], it->l2tp_second_pass_flt_rule_hdl);
+ }
+ else
+ {
+ m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4);
+ IPACMDBG_H("Deleted IPv4 flt rule %d.\n", it->flt_rule_hdl[IPA_IP_v4]);
+ }
+ }
}
if(m_is_ip_addr_assigned[IPA_IP_v6])
{
- m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6);
- IPACMDBG_H("IPv6 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v6]);
+ if(m_is_l2tp_iface)
+ {
+ m_p_iface->del_l2tp_flt_rule(it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v6]);
+ IPACMDBG_H("Deleted IPv6 flt rule %d.\n", it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v6]);
+ }
+ else
+ {
+ if(it->p_client->is_l2tp_client)
+ {
+ m_p_iface->del_l2tp_flt_rule(IPA_IP_v6, it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v6],
+ it->l2tp_second_pass_flt_rule_hdl);
+ IPACMDBG_H("Deleted IPv6 first pass flt rule %d and second pass flt rule %d.\n",
+ it->l2tp_first_pass_flt_rule_hdl[IPA_IP_v6], it->l2tp_second_pass_flt_rule_hdl);
+ }
+ else
+ {
+ m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6);
+ IPACMDBG_H("Deleted IPv6 flt rule %d.\n", it->flt_rule_hdl[IPA_IP_v6]);
+ }
+ }
}
}
peer->flt_rule.clear();