diff options
author | Skylar Chang <chiaweic@codeaurora.org> | 2017-11-03 15:13:45 -0700 |
---|---|---|
committer | Skylar Chang <chiaweic@codeaurora.org> | 2017-11-08 12:15:10 -0800 |
commit | 3dc153cdd48e699d82ef94c7815d4706e87853e1 (patch) | |
tree | 0b0410a82e6715dc6f827ba6b5af7bbb5325ff86 | |
parent | bad4d1f535707a060d0bcb330c97e4a1bbbacfde (diff) | |
download | ipacfg-mgr-3dc153cdd48e699d82ef94c7815d4706e87853e1.tar.gz |
IPACM: clean wlan NAT ifaces during modem SSR
Wlan-driver will disconnect/reconnect to IPA after modem
SSR and bootup again where framework already send
add_downstream to IPA and resulted in offload failed.
The workaround is to self delete NAT ifaces for wlan
related instances during SSR and cache the downstream
event before wlan restarts.
Change-Id: I178c418621862b19327f70a077623f14a69a56c6
-rw-r--r-- | ipacm/inc/IPACM_Defs.h | 5 | ||||
-rw-r--r-- | ipacm/src/IPACM_IfaceManager.cpp | 4 | ||||
-rw-r--r-- | ipacm/src/IPACM_Main.cpp | 5 | ||||
-rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 20 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wan.cpp | 11 | ||||
-rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 9 |
6 files changed, 46 insertions, 8 deletions
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h index 2031fc5..149c03a 100644 --- a/ipacm/inc/IPACM_Defs.h +++ b/ipacm/inc/IPACM_Defs.h @@ -173,7 +173,7 @@ typedef enum IPA_HANDLE_WAN_UP, /* ipacm_event_iface_up */ IPA_HANDLE_WAN_DOWN, /* ipacm_event_iface_up */ - IPA_HANDLE_WAN_UP_V6, /* NULL */ + IPA_HANDLE_WAN_UP_V6, /* ipacm_event_iface_up */ IPA_HANDLE_WAN_DOWN_V6, /* NULL */ IPA_HANDLE_WAN_UP_TETHER, /* ipacm_event_iface_up_tehter */ IPA_HANDLE_WAN_DOWN_TETHER, /* ipacm_event_iface_up_tehter */ @@ -186,7 +186,7 @@ typedef enum IPA_ETH_BRIDGE_CLIENT_ADD, /* ipacm_event_eth_bridge */ IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/ IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/ - IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ + IPA_SSR_NOTICE, /* NULL*/ #ifdef FEATURE_L2TP IPA_ADD_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ IPA_DEL_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ @@ -195,6 +195,7 @@ typedef enum IPA_HANDLE_VLAN_CLIENT_INFO, /* ipacm_event_data_all */ IPA_HANDLE_VLAN_IFACE_INFO, /* ipacm_event_data_all */ #endif + IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ IPACM_EVENT_MAX } ipa_cm_event_id; diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp index 17f546d..85033a3 100644 --- a/ipacm/src/IPACM_IfaceManager.cpp +++ b/ipacm/src/IPACM_IfaceManager.cpp @@ -383,6 +383,7 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) #ifdef FEATURE_IPACM_HAL IPACM_EvtDispatcher::registr(IPA_DOWNSTREAM_ADD, wl); IPACM_EvtDispatcher::registr(IPA_DOWNSTREAM_DEL, wl); + IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, wl); #endif #else IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl); @@ -449,6 +450,9 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) #ifndef FEATURE_IPA_ANDROID IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, w); IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w); +#ifdef FEATURE_IPACM_HAL + IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, w); +#endif #endif } else diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp index 1f92bfa..55a3fd5 100644 --- a/ipacm/src/IPACM_Main.cpp +++ b/ipacm/src/IPACM_Main.cpp @@ -713,7 +713,10 @@ void* ipa_driver_msg_notifier(void *param) IPACMERR("calling OffloadMng->elrInstance->onOffloadStopped \n"); OffloadMng->elrInstance->onOffloadStopped(IpaEventRelay::ERROR); } - continue; + /* WA to clean up wlan instances during SSR */ + evt_data.event = IPA_SSR_NOTICE; + evt_data.evt_data = NULL; + break; case IPA_SSR_AFTER_POWERUP: IPACMDBG_H("Received IPA_SSR_AFTER_POWERUP\n"); OffloadMng = IPACM_OffloadManager::GetInstance(); diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index 4b85c6e..b13460a 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -445,8 +445,14 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (upstream_v6_up == false) { IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", gw_addr_v6.v6Addr[0], gw_addr_v6.v6Addr[1], gw_addr_v6.v6Addr[2], gw_addr_v6.v6Addr[3]); - post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); - upstream_v6_up = true; + /* check v6-address valid or not */ + if((gw_addr_v6.v6Addr[0] == 0) && (gw_addr_v6.v6Addr[1] ==0) && (gw_addr_v6.v6Addr[2] == 0) && (gw_addr_v6.v6Addr[3] == 0)) + { + IPACMDBG_H("Invliad ipv6-address, ignored v6-setupstream\n"); + } else { + post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); + upstream_v6_up = true; + } } else { IPACMDBG_H("already setupstream iface(%s) ipv6 previously\n", upstream_name); } @@ -480,8 +486,14 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (upstream_v6_up == false) { IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", gw_addr_v6.v6Addr[0], gw_addr_v6.v6Addr[1], gw_addr_v6.v6Addr[2], gw_addr_v6.v6Addr[3]); - post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); - upstream_v6_up = true; + /* check v6-address valid or not */ + if((gw_addr_v6.v6Addr[0] == 0) && (gw_addr_v6.v6Addr[1] ==0) && (gw_addr_v6.v6Addr[2] == 0) && (gw_addr_v6.v6Addr[3] == 0)) + { + IPACMDBG_H("Invliad ipv6-address, ignored v6-setupstream\n"); + } else { + post_route_evt(IPA_IP_v6, index, IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, gw_addr_v6); + upstream_v6_up = true; + } } else { IPACMDBG_H("already setupstream iface(%s) ipv6 previously\n", upstream_name); result = SUCCESS_DUPLICATE_CONFIG; diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp index 6d57c39..cf16c71 100644 --- a/ipacm/src/IPACM_Wan.cpp +++ b/ipacm/src/IPACM_Wan.cpp @@ -1254,7 +1254,16 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) } } break; - +#ifdef FEATURE_IPACM_HAL + /* WA for WLAN to clean up NAT instance during SSR */ + case IPA_SSR_NOTICE: //sky + IPACMDBG_H("Received IPA_SSR_NOTICE event.\n"); + if(m_is_sta_mode == WLAN_WAN) + { + IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface + } + break; +#endif default: break; } diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index 14fe0b7..ec93233 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -910,6 +910,15 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) } } break; +#ifdef FEATURE_IPACM_HAL + /* WA for WLAN to clean up NAT instance during SSR */ + case IPA_SSR_NOTICE: + { + IPACMDBG_H("Received IPA_SSR_NOTICE event.\n"); + IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface + } + break; +#endif default: break; } |