From 5ce6268faae8cb3114b64416ec336a528517f436 Mon Sep 17 00:00:00 2001 From: Kazuhiro Ondo Date: Wed, 18 May 2011 16:50:15 -0500 Subject: [PATCH] Fix broken data retry Change I2b737efa6092ad1254c8dc25840ec429f5c6e882 brought side effect that retry count is reset at every setup. Change-Id: I6f20d2e82110b2873ff5acbb60a747fd11c09c60 --- .../gsm/GsmDataConnectionTracker.java | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 6b4054a9bd4e8..80395ed58e541 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -927,37 +927,43 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return false; } - dc = findReadyDataConnection(apn); + // First, check to see if ApnContext already has DC. + // This could happen if the retries are currently engaged. + dc = (GsmDataConnection)apnContext.getDataConnection(); if (dc == null) { - if (DBG) log("setupData: No ready GsmDataConnection found!"); - // TODO: When allocating you are mapping type to id. If more than 1 free, - // then could findFreeDataConnection get the wrong one?? - dc = findFreeDataConnection(); - } + dc = findReadyDataConnection(apn); - if (dc == null) { - dc = createDataConnection(); - } + if (dc == null) { + if (DBG) log("setupData: No ready GsmDataConnection found!"); + // TODO: When allocating you are mapping type to id. If more than 1 free, + // then could findFreeDataConnection get the wrong one?? + dc = findFreeDataConnection(); + } - if (dc == null) { - if (DBG) log("setupData: No free GsmDataConnection found!"); - return false; - } + if (dc == null) { + dc = createDataConnection(); + } - dc.setProfileId( profileId ); - dc.setActiveApnType(apnContext.getApnType()); - int refCount = dc.incAndGetRefCount(); - if (DBG) log("setupData: init dc and apnContext refCount=" + refCount); + if (dc == null) { + if (DBG) log("setupData: No free GsmDataConnection found!"); + return false; + } - // configure retry count if no other Apn is using the same connection. - if (refCount == 1) { - configureRetry(dc, apnContext.getApnType()); + dc.setProfileId( profileId ); + dc.setActiveApnType(apnContext.getApnType()); + int refCount = dc.incAndGetRefCount(); + if (DBG) log("setupData: init dc and apnContext refCount=" + refCount); + + // configure retry count if no other Apn is using the same connection. + if (refCount == 1) { + configureRetry(dc, apnContext.getApnType()); + } + DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId()); + apnContext.setDataConnectionAc(mDataConnectionAsyncChannels.get(dc.getDataConnectionId())); + apnContext.setApnSetting(apn); + apnContext.setDataConnection(dc); } - DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId()); - apnContext.setDataConnectionAc(mDataConnectionAsyncChannels.get(dc.getDataConnectionId())); - apnContext.setApnSetting(apn); - apnContext.setDataConnection(dc); Message msg = obtainMessage(); msg.what = EVENT_DATA_SETUP_COMPLETE; @@ -1655,6 +1661,12 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } apnContext.setState(State.FAILED); mPhone.notifyDataConnection(Phone.REASON_APN_FAILED, apnContext.getApnType()); + + int refCount = releaseApnContext(apnContext, false); + if (DBG) { + log("onDataSetupComplete: permanent error apn=%s" + apnString + + " refCount=" + refCount); + } } else { if (DBG) log("onDataSetupComplete: Not all permanent failures, retry"); startDelayedRetry(cause, apnContext); @@ -1667,11 +1679,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext), APN_DELAY_MILLIS); } - - int refCount = releaseApnContext(apnContext, false); - if (DBG) { - log("onDataSetupComplete: error apn=%s" + apnString + " refCount=" + refCount); - } } }