Merge "IPACM: clean the modem UL rules after SSR"
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
index 62ea189..a210255 100644
--- a/ipacm/inc/IPACM_Lan.h
+++ b/ipacm/inc/IPACM_Lan.h
@@ -347,6 +347,8 @@
int num_wan_ul_fl_rule_v6;
bool is_active;
+ bool modem_ul_v4_set;
+ bool modem_ul_v6_set;
uint32_t if_ipv4_subnet;
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 0878d29..2cc5088 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -189,6 +189,8 @@
memset(private_fl_rule_hdl, 0, IPA_MAX_PRIVATE_SUBNET_ENTRIES * sizeof(uint32_t));
memset(ipv6_prefix_flt_rule_hdl, 0, NUM_IPV6_PREFIX_FLT_RULE * sizeof(uint32_t));
memset(ipv6_icmp_flt_rule_hdl, 0, NUM_IPV6_ICMP_FLT_RULE * sizeof(uint32_t));
+ modem_ul_v4_set = false;
+ modem_ul_v6_set = false;
#ifdef FEATURE_ETH_BRIDGE_LE
if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == LAN_IF)
@@ -1222,7 +1224,7 @@
{
if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES)
{
- IPACMERR("number of wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES, aborting...\n");
+ IPACMERR("number of wan_ul_fl_rule_v4 (%d) > MAX_WAN_UL_FILTER_RULES (%d), aborting...\n", num_wan_ul_fl_rule_v4, MAX_WAN_UL_FILTER_RULES);
close(fd);
return IPACM_FAILURE;
}
@@ -1237,6 +1239,7 @@
memset(wan_ul_fl_rule_hdl_v4, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
num_wan_ul_fl_rule_v4 = 0;
+ modem_ul_v4_set = false;
memset(&flt_index, 0, sizeof(flt_index));
flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
@@ -1741,11 +1744,17 @@
}
/* check only add static UL filter rule once */
- if ((num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6) ||
- (iptype ==IPA_IP_v4))
+ if (num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6 && modem_ul_v6_set == false)
{
- IPACMDBG_H("num_dft_rt_v6 %d iptype %d xlat_mux_id: %d \n", num_dft_rt_v6, iptype, xlat_mux_id);
+ IPACMDBG_H("IPA_IP_v6 num_dft_rt_v6 %d xlat_mux_id: %d modem_ul_v6_set: %d\n", num_dft_rt_v6, xlat_mux_id, modem_ul_v6_set);
ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id);
+ modem_ul_v6_set = true;
+ } else if (iptype ==IPA_IP_v4 && modem_ul_v4_set == false) {
+ IPACMDBG_H("IPA_IP_v4 xlat_mux_id: %d, modem_ul_v4_set %d\n", xlat_mux_id, modem_ul_v4_set);
+ ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id);
+ modem_ul_v4_set = true;
+ } else {
+ IPACMDBG_H("ip-type: %d modem_ul_v4_set: %d, modem_ul_v6_set %d\n", iptype, modem_ul_v4_set, modem_ul_v6_set);
}
return ret;
}
@@ -3290,6 +3299,7 @@
if (pFilteringTable == NULL)
{
IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
+ close(fd);
return IPACM_FAILURE;
}
memset(pFilteringTable, 0, len);
@@ -3448,7 +3458,7 @@
{
if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES)
{
- IPACMERR(" the number of rules are bigger than array, aborting...\n");
+ IPACMERR(" the number of rules (%d) are bigger than array (%d), aborting...\n", num_wan_ul_fl_rule_v6, MAX_WAN_UL_FILTER_RULES);
close(fd);
return IPACM_FAILURE;
}
@@ -3469,6 +3479,7 @@
IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_wan_ul_fl_rule_v6);
memset(wan_ul_fl_rule_hdl_v6, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t));
num_wan_ul_fl_rule_v6 = 0;
+ modem_ul_v6_set = false;
memset(&flt_index, 0, sizeof(flt_index));
flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index cf8d98e..c30a81b 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -1649,7 +1649,7 @@
{
evt_data.event = IPA_HANDLE_WAN_DOWN_TETHER;
/* delete support tether ifaces to its array*/
- for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++) //sky
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
{
if(IPACM_Wan::ipa_if_num_tether_v4[i] == ipa_if_num_tether)
{
@@ -1677,7 +1677,7 @@
{
evt_data.event = IPA_HANDLE_WAN_DOWN_V6_TETHER;
/* delete support tether ifaces to its array*/
- for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++) //sky
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
{
if(IPACM_Wan::ipa_if_num_tether_v6[i] == ipa_if_num_tether)
{
@@ -4430,7 +4430,8 @@
int IPACM_Wan::handle_down_evt_ex()
{
int res = IPACM_SUCCESS;
- int i;
+ int i, tether_total;
+ int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES];
IPACMDBG_H(" wan handle_down_evt \n");
@@ -4471,6 +4472,20 @@
del_wan_firewall_rule(IPA_IP_v4);
install_wan_filtering_rule(false);
handle_route_del_evt_ex(IPA_IP_v4);
+#ifdef FEATURE_IPA_ANDROID
+ /* posting wan_down_tether for all lan clients */
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
+ {
+ ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i];
+ }
+ tether_total = IPACM_Wan::ipa_if_num_tether_v4_total;
+ for (i=0; i < tether_total; i++)
+ {
+ post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]);
+ IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n",
+ i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
+ }
+#endif
if(IPACM_Wan::wan_up_v6)
{
IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
@@ -4499,7 +4514,8 @@
}
else if(ip_type == IPA_IP_v6)
{
- num_ipv6_modem_pdn--;
+ if (num_dft_rt_v6 > 1)
+ num_ipv6_modem_pdn--;
IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn);
/* only when default gw goes down we post WAN_DOWN event*/
if(is_default_gateway == true)
@@ -4508,6 +4524,20 @@
del_wan_firewall_rule(IPA_IP_v6);
install_wan_filtering_rule(false);
handle_route_del_evt_ex(IPA_IP_v6);
+#ifdef FEATURE_IPA_ANDROID //sky
+ /* posting wan_down_tether for all lan clients */
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
+ {
+ ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i];
+ }
+ tether_total = IPACM_Wan::ipa_if_num_tether_v6_total;
+ for (i=0; i < tether_total; i++)
+ {
+ post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]);
+ IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n",
+ i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
+ }
+#endif
if(IPACM_Wan::wan_up)
{
IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name);
@@ -4541,7 +4571,8 @@
{
num_ipv4_modem_pdn--;
IPACMDBG_H("Now the number of ipv4 modem pdn is %d.\n", num_ipv4_modem_pdn);
- num_ipv6_modem_pdn--;
+ if (num_dft_rt_v6 > 1)
+ num_ipv6_modem_pdn--;
IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn);
/* only when default gw goes down we post WAN_DOWN event*/
if(is_default_gateway == true)
@@ -4549,10 +4580,37 @@
IPACM_Wan::wan_up = false;
del_wan_firewall_rule(IPA_IP_v4);
handle_route_del_evt_ex(IPA_IP_v4);
-
+#ifdef FEATURE_IPA_ANDROID
+ /* posting wan_down_tether for all lan clients */
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++)
+ {
+ ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i];
+ }
+ tether_total = IPACM_Wan::ipa_if_num_tether_v4_total;
+ for (i=0; i < tether_total; i++)
+ {
+ post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]);
+ IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n",
+ i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
+ }
+#endif
IPACM_Wan::wan_up_v6 = false;
del_wan_firewall_rule(IPA_IP_v6);
handle_route_del_evt_ex(IPA_IP_v6);
+#ifdef FEATURE_IPA_ANDROID
+ /* posting wan_down_tether for all lan clients */
+ for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++)
+ {
+ ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i];
+ }
+ tether_total = IPACM_Wan::ipa_if_num_tether_v6_total;
+ for (i=0; i < tether_total; i++)
+ {
+ post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]);
+ IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n",
+ i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name);
+ }
+#endif
memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
install_wan_filtering_rule(false);
@@ -4570,9 +4628,9 @@
if(num_ipv6_modem_pdn == 0)
{
IPACMDBG_H("Now the number of modem ipv6 interface is 0, delete default flt rules.\n");
- IPACM_Wan::num_v6_flt_rule = 0;
- memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
- install_wan_filtering_rule(false);
+ IPACM_Wan::num_v6_flt_rule = 0;
+ memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add));
+ install_wan_filtering_rule(false);
}
if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)