From 731026c2df0daff1a2ff5a4c1cf44f3891995dd8 Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Tue, 1 Nov 2011 21:59:44 -0700 Subject: [PATCH] Ignore errors when untethering Sometimes the interface is removed before we can untether leading to errors when cleanup up various rules (iptables). Do as much as we can and then let a re-tether result in error if needed. bug:5536516 Change-Id: Ib1d064ecc8e9022566f9b0e4678b33144906971c --- .../server/connectivity/Tethering.java | 79 +++++++------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 1107fe9af4f72..7bd29d90cca09 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -73,7 +73,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { private Context mContext; private final static String TAG = "Tethering"; private final static boolean DBG = true; - private final static boolean VDBG = false; + private final static boolean VDBG = true; // TODO - remove both of these - should be part of interface inspection/selection stuff private String[] mTetherableUsbRegexs; @@ -920,6 +920,29 @@ public class Tethering extends INetworkManagementEventObserver.Stub { setTethered(true); sendTetherStateChangedBroadcast(); } + + void cleanupUpstream() { + if (mMyUpstreamIfaceName != null) { + // note that we don't care about errors here. + // sometimes interfaces are gone before we get + // to remove their rules, which generates errors. + // just do the best we can. + try { + // about to tear down NAT; gather remaining statistics + mStatsService.forceUpdate(); + } catch (Exception e) { + if (VDBG) Log.e(TAG, "Exception in forceUpdate: " + e.toString()); + } + try { + mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName); + } catch (Exception e) { + if (VDBG) Log.e(TAG, "Exception in disableNat: " + e.toString()); + } + mMyUpstreamIfaceName = null; + } + return; + } + @Override public boolean processMessage(Message message) { if (VDBG) Log.d(TAG, "TetheredState.processMessage what=" + message.what); @@ -928,23 +951,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { switch (message.what) { case CMD_TETHER_UNREQUESTED: case CMD_INTERFACE_DOWN: - if (mMyUpstreamIfaceName != null) { - try { - // about to tear down NAT; gather remaining statistics - mStatsService.forceUpdate(); - - mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName); - mMyUpstreamIfaceName = null; - } catch (Exception e) { - try { - mNMService.untetherInterface(mIfaceName); - } catch (Exception ee) {} - - setLastErrorAndTransitionToInitialState( - ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); - break; - } - } + cleanupUpstream(); try { mNMService.untetherInterface(mIfaceName); } catch (Exception e) { @@ -975,23 +982,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { if (VDBG) Log.d(TAG, "Connection changed noop - dropping"); break; } - if (mMyUpstreamIfaceName != null) { - try { - // about to tear down NAT; gather remaining statistics - mStatsService.forceUpdate(); - - mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName); - mMyUpstreamIfaceName = null; - } catch (Exception e) { - try { - mNMService.untetherInterface(mIfaceName); - } catch (Exception ee) {} - - setLastErrorAndTransitionToInitialState( - ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); - break; - } - } + cleanupUpstream(); if (newUpstreamIfaceName != null) { try { mNMService.enableNat(mIfaceName, newUpstreamIfaceName); @@ -1016,23 +1007,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { error = true; // fall through case CMD_TETHER_MODE_DEAD: - if (mMyUpstreamIfaceName != null) { - try { - // about to tear down NAT; gather remaining statistics - mStatsService.forceUpdate(); - - mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName); - mMyUpstreamIfaceName = null; - } catch (Exception e) { - try { - mNMService.untetherInterface(mIfaceName); - } catch (Exception ee) {} - - setLastErrorAndTransitionToInitialState( - ConnectivityManager.TETHER_ERROR_DISABLE_NAT_ERROR); - break; - } - } + cleanupUpstream(); try { mNMService.untetherInterface(mIfaceName); } catch (Exception e) {