IPACM: Fix the UL traffic taking SW-exception
When LTE comes first with usb/wlan-tethering enable
lately from android UI, IPACM failed to add modem
UL filter rules if it's getting UPSTREAM_add event
from CNE earlier then the usb/wlan netdev creation
event from netlink. The fix is to handle this
timing issue.
Change-Id: I6452c1bb880bcaec2232784b117e22a2d12c6e8f
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 65f788f..eb2bfc9 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -104,10 +104,12 @@
{
#ifdef FEATURE_IPA_ANDROID
int i;
- for (i=1; i < ipa_if_num_tether_v4_total;i++)
+ for (i=0; i < ipa_if_num_tether_v4_total;i++)
{
if (ipa_if_num_tether_v4[i] == ipa_if_num_tether)
{
+ IPACMDBG_H("support ipv4 tether_iface(%s)\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
return wan_up;
break;
}
@@ -122,10 +124,12 @@
{
#ifdef FEATURE_IPA_ANDROID
int i;
- for (i=1; i < ipa_if_num_tether_v6_total;i++)
+ for (i=0; i < ipa_if_num_tether_v6_total;i++)
{
if (ipa_if_num_tether_v6[i] == ipa_if_num_tether)
{
+ IPACMDBG_H("support ipv6 tether_iface(%s)\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
return wan_up_v6;
break;
}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 4067e9f..40bbec5 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -586,9 +586,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
{
@@ -614,9 +615,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
@@ -642,9 +644,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
{
@@ -661,9 +664,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
/* clean up v6 RT rules*/
IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER in LAN-instance and need clean up client IPv6 address \n");
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 5e215ce..2c870a7 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -709,7 +709,8 @@
handle_route_add_evt(data->iptype);
}
#ifdef FEATURE_IPA_ANDROID
- post_wan_up_tether_evt(data->iptype, data->if_index_tether);
+ /* using ipa_if_index, not netdev_index */
+ post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
#endif
}
else if ((data->iptype == IPA_IP_v6) && (ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX))
@@ -720,7 +721,8 @@
handle_route_add_evt(data->iptype);
}
#ifdef FEATURE_IPA_ANDROID
- post_wan_up_tether_evt(data->iptype, data->if_index_tether);
+ /* using ipa_if_index, not netdev_index */
+ post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
#endif
}
}
@@ -775,7 +777,8 @@
IPACMDBG_H("get del default v4 route (dst:0.0.0.0)\n");
// wan_v4_addr_gw_set = false; /* android requires CnE change too */
#ifdef FEATURE_IPA_ANDROID
- post_wan_down_tether_evt(data->iptype, data->if_index_tether);
+ /* using ipa_if_index, not netdev_index */
+ post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
/* no any ipv4 tether iface support*/
if(IPACM_Wan::ipa_if_num_tether_v4_total != 0)
{
@@ -798,7 +801,8 @@
else if ((data->iptype == IPA_IP_v6) && (active_v6 == true))
{
#ifdef FEATURE_IPA_ANDROID
- post_wan_down_tether_evt(data->iptype, data->if_index_tether);
+ /* using ipa_if_index, not netdev_index */
+ post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether));
/* no any ipv6 tether iface support*/
if(IPACM_Wan::ipa_if_num_tether_v6_total != 0)
{
@@ -1563,7 +1567,7 @@
}
IPACMDBG_H("Posting IPA_HANDLE_WAN_UP_TETHER with below information:\n");
IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n",
- IPACM_Iface::ipacmcfg->iface_table[iface_ipa_index_query(ipa_if_num_tether)].iface_name, wanup_data->is_sta);
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wanup_data->is_sta);
memset(&evt_data, 0, sizeof(evt_data));
if (iptype == IPA_IP_v4)
@@ -1571,9 +1575,10 @@
evt_data.event = IPA_HANDLE_WAN_UP_TETHER;
/* Add support tether ifaces to its array*/
IPACM_Wan::ipa_if_num_tether_v4[IPACM_Wan::ipa_if_num_tether_v4_total] = ipa_if_num_tether;
- IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v4_total(%d)\n",
- IPACM_Iface::ipacmcfg->iface_table[iface_ipa_index_query(ipa_if_num_tether)].iface_name,
- IPACM_Wan::ipa_if_num_tether_v4_total);
+ IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v4_total(%d) on wan_iface(%s)\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name,
+ IPACM_Wan::ipa_if_num_tether_v4_total,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
IPACM_Wan::ipa_if_num_tether_v4_total++;
}
else
@@ -1582,9 +1587,10 @@
memcpy(wanup_data->ipv6_prefix, ipv6_prefix, sizeof(wanup_data->ipv6_prefix));
/* Add support tether ifaces to its array*/
IPACM_Wan::ipa_if_num_tether_v6[IPACM_Wan::ipa_if_num_tether_v6_total] = ipa_if_num_tether;
- IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v6_total(%d)\n",
- IPACM_Iface::ipacmcfg->iface_table[iface_ipa_index_query(ipa_if_num_tether)].iface_name,
- IPACM_Wan::ipa_if_num_tether_v6_total);
+ IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v6_total(%d) on wan_iface(%s)\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name,
+ IPACM_Wan::ipa_if_num_tether_v6_total,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
IPACM_Wan::ipa_if_num_tether_v6_total++;
}
evt_data.evt_data = (void *)wanup_data;
@@ -1619,7 +1625,7 @@
}
IPACMDBG_H("Posting IPA_HANDLE_WAN_DOWN_TETHER with below information:\n");
IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n",
- IPACM_Iface::ipacmcfg->iface_table[iface_ipa_index_query(ipa_if_num_tether)].iface_name, wandown_data->is_sta);
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wandown_data->is_sta);
memset(&evt_data, 0, sizeof(evt_data));
if (iptype == IPA_IP_v4)
@@ -1630,7 +1636,8 @@
{
if(IPACM_Wan::ipa_if_num_tether_v4[i] == ipa_if_num_tether)
{
- IPACMDBG_H("Found tether client at position %d.\n", i);
+ IPACMDBG_H("Found tether client at position %d name(%s)\n", i,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
break;
}
}
@@ -1645,7 +1652,9 @@
IPACM_Wan::ipa_if_num_tether_v4[j-1] = IPACM_Wan::ipa_if_num_tether_v4[j];
}
IPACM_Wan::ipa_if_num_tether_v4_total--;
- IPACMDBG_H("Now the total num of ipa_if_num_tether_v4_total is %d \n", IPACM_Wan::ipa_if_num_tether_v4_total);
+ IPACMDBG_H("Now the total num of ipa_if_num_tether_v4_total is %d on wan-iface(%s)\n",
+ IPACM_Wan::ipa_if_num_tether_v4_total,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
}
else
{
@@ -1655,7 +1664,8 @@
{
if(IPACM_Wan::ipa_if_num_tether_v6[i] == ipa_if_num_tether)
{
- IPACMDBG_H("Found tether client at position %d.\n", i);
+ IPACMDBG_H("Found tether client at position %d name(%s)\n", i,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name);
break;
}
}
@@ -1670,7 +1680,9 @@
IPACM_Wan::ipa_if_num_tether_v6[j-1] = IPACM_Wan::ipa_if_num_tether_v6[j];
}
IPACM_Wan::ipa_if_num_tether_v6_total--;
- IPACMDBG_H("Now the total num of ipa_if_num_tether_v6_total is %d \n", IPACM_Wan::ipa_if_num_tether_v6_total);
+ IPACMDBG_H("Now the total num of ipa_if_num_tether_v6_total is %d on wan-iface(%s)\n",
+ IPACM_Wan::ipa_if_num_tether_v6_total,
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name);
}
evt_data.evt_data = (void *)wandown_data;
IPACM_EvtDispatcher::PostEvt(&evt_data);
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 530e2bf..1971e90 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -410,9 +410,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
{
@@ -438,9 +439,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d\n", data_wan_tether->is_sta,
- data_wan_tether->if_index_tether);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
@@ -469,10 +471,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d, itself %d\n", data_wan_tether->is_sta,
- iface_ipa_index_query(data_wan_tether->if_index_tether),
- ipa_if_num);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
if(data_wan_tether->is_sta == false && wlan_ap_index > 0)
{
@@ -497,10 +499,10 @@
IPACMERR("No event data is found.\n");
return;
}
- IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d, itself %d\n", data_wan_tether->is_sta,
- iface_ipa_index_query(data_wan_tether->if_index_tether),
- ipa_if_num);
- if (iface_ipa_index_query(data_wan_tether->if_index_tether) == ipa_if_num)
+ IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta,
+ data_wan_tether->if_index_tether,
+ IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name);
+ if (data_wan_tether->if_index_tether == ipa_if_num)
{
/* clean up v6 RT rules*/
IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n");