aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/uicc
diff options
context:
space:
mode:
authorarunvoddu <arunvoddu@google.com>2022-03-23 14:56:17 +0000
committerJack Yu <jackyu@google.com>2023-02-28 16:29:30 -0800
commit8a16e761699cb054513b0d86c407debef6bd5353 (patch)
tree3a2764c0b699e816af56c5a3c26c1277ebc0847b /src/java/com/android/internal/telephony/uicc
parent893f2410c5bba312c2d61912b7a10e58847bf4a1 (diff)
downloadtelephony-8a16e761699cb054513b0d86c407debef6bd5353.tar.gz
Get and Set the TPMR value to EF_SMSS field in ISIM/USIM
Bug: 226337641 Test: Atest verified Merged-In: I7fa09707595877f3edd6619ed875020e4e39f263 Change-Id: I7fa09707595877f3edd6619ed875020e4e39f263
Diffstat (limited to 'src/java/com/android/internal/telephony/uicc')
-rw-r--r--src/java/com/android/internal/telephony/uicc/IccConstants.java1
-rw-r--r--src/java/com/android/internal/telephony/uicc/IccRecords.java108
-rw-r--r--src/java/com/android/internal/telephony/uicc/IsimFileHandler.java1
-rw-r--r--src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java30
-rw-r--r--src/java/com/android/internal/telephony/uicc/SIMRecords.java31
-rwxr-xr-xsrc/java/com/android/internal/telephony/uicc/UsimFileHandler.java1
6 files changed, 163 insertions, 9 deletions
diff --git a/src/java/com/android/internal/telephony/uicc/IccConstants.java b/src/java/com/android/internal/telephony/uicc/IccConstants.java
index 5349f3999f..a9275bedd0 100644
--- a/src/java/com/android/internal/telephony/uicc/IccConstants.java
+++ b/src/java/com/android/internal/telephony/uicc/IccConstants.java
@@ -46,6 +46,7 @@ public interface IccConstants {
static final int EF_CFIS = 0x6FCB;
static final int EF_IMG = 0x4F20;
static final int EF_PSISMSC = 0x6FE5;
+ static final int EF_SMSS = 0x6F43;
// USIM SIM file ids from TS 131.102
public static final int EF_PBR = 0x4F30;
diff --git a/src/java/com/android/internal/telephony/uicc/IccRecords.java b/src/java/com/android/internal/telephony/uicc/IccRecords.java
index a35bb6bb1e..da112b166e 100644
--- a/src/java/com/android/internal/telephony/uicc/IccRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/IccRecords.java
@@ -30,6 +30,7 @@ import android.telephony.CellIdentity;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.Log;
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
@@ -40,6 +41,7 @@ import com.android.internal.telephony.util.ArrayUtils;
import com.android.telephony.Rlog;
import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Retention;
@@ -55,8 +57,11 @@ import java.util.concurrent.atomic.AtomicInteger;
* {@hide}
*/
public abstract class IccRecords extends Handler implements IccConstants {
+ private static final String LOG_TAG = "IccRecords";
protected static final boolean DBG = true;
- protected static final boolean VDBG = false; // STOPSHIP if true
+ private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */
+ protected static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING ||
+ Rlog.isLoggable(LOG_TAG, Log.VERBOSE);
public static final int PLMN_MIN_LENGTH = CellIdentity.MCC_LENGTH
+ CellIdentity.MNC_MIN_LENGTH;
@@ -121,6 +126,10 @@ public abstract class IccRecords extends Handler implements IccConstants {
protected boolean mRecordsRequested = false; // true if we've made requests for the sim records
protected int mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE;
+ // EF_SMSS fields tpmr invalid, min and max declarations
+ protected static final int SMSS_INVALID_TPMR = -1;
+ private static final int TPMR_MIN = 0x00;
+ private static final int TPMR_MAX = 0xFF;
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
public String mIccId; // Includes only decimals (no hex)
@@ -179,6 +188,10 @@ public abstract class IccRecords extends Handler implements IccConstants {
// Reference: TS 31.102 section 4.5.9
protected String mPsiSmsc;
+ // EF_SMSS value which is combination of TPMR and Memory exceed flag
+ // Reference: TS 31.102 section 4.2.9
+ protected byte[] mSmssValues;
+
CarrierTestOverride mCarrierTestOverride;
//Arbitrary offset for the Handler
@@ -240,6 +253,10 @@ public abstract class IccRecords extends Handler implements IccConstants {
// TAG value to retrieve EF_PSISMSC from parsed SimTlv object
private static final int TAG_TLV_USIM_VALUE_80 = 0x80;
+
+ // call back received on this upon EF_SMSS record update.
+ public static final int EVENT_SET_SMSS_RECORD_DONE = 201;
+
/**
* There are two purposes for this class. First, each instance of AuthAsyncResponse acts as a
* lock to for calling thead to wait in getIccSimChallengeResponse(). Second, pass the IMS
@@ -962,6 +979,26 @@ public abstract class IccRecords extends Handler implements IccConstants {
}
break;
+ case EVENT_SET_SMSS_RECORD_DONE:
+ ar = (AsyncResult) msg.obj;
+ SmssRecord smssRecord = null;
+ if (ar.userObj != null) {
+ smssRecord = (SmssRecord) ar.userObj;
+ }
+ if (ar.exception == null && smssRecord.getSmssValue() != null) {
+ mSmssValues = smssRecord.getSmssValue().clone();
+ } else {
+ loge("SIM EF_SMSS field updating error=" + ar.exception);
+ }
+ if (smssRecord != null && smssRecord.getMessage() != null) {
+ Message message = smssRecord.getMessage();
+ AsyncResult.forMessage(message, ar.result, ar.exception);
+ message.sendToTarget();
+ } else {
+ loge("smssRecord or smssRecord.getMessage() object is null");
+ }
+ break;
+
default:
super.handleMessage(msg);
}
@@ -1568,4 +1605,73 @@ public abstract class IccRecords extends Handler implements IccConstants {
return "{fullName = " + fullName + ", shortName = " + shortName + "}";
}
}
+
+ /**
+ * Sets the elementary (EF_SMSS) field with latest last used TP-Message reference value.
+ * First byte of EF_SMSS represents the TPMR value as per the spec
+ * (Section 4.2.9 of 3GPP TS 31.102)
+ *
+ * @param tpmr: Last used TP-Message reference parameter of type int
+ * @param onComplete: android.os.Message to be notified upon completion
+ */
+ public void setSmssTpmrValue(int tpmr, Message onComplete) {
+ if(VDBG) log("setSmssTpmrValue()");
+ if (mSmssValues != null && mSmssValues.length > 0 && tpmr >= TPMR_MIN && tpmr <= TPMR_MAX) {
+ byte[] tempSmss = mSmssValues.clone();
+ tempSmss[0] = (byte) (tpmr & 0xFF);
+ SmssRecord smssRecord = createSmssRecord(onComplete, tempSmss);
+ mFh.updateEFTransparent(IccConstants.EF_SMSS, tempSmss,
+ obtainMessage(EVENT_SET_SMSS_RECORD_DONE, smssRecord));
+ } else if (onComplete != null) {
+ loge("Failed to set EF_SMSS [TPMR] field to SIM");
+ if (mSmssValues == null || mSmssValues.length <= 0) {
+ AsyncResult.forMessage((onComplete)).exception =
+ new FileNotFoundException("EF_SMSS file not found");
+ } else if (tpmr < TPMR_MIN || tpmr > TPMR_MAX) {
+ AsyncResult.forMessage((onComplete)).exception =
+ new IllegalArgumentException("TPMR value is not in allowed range");
+ }
+ onComplete.sendToTarget();
+ }
+ }
+
+ /**
+ * Fetches the last used TPMR value from elementary (EF_SMSS) field. First byte of EF_SMSS
+ * represents the TPMR value as per the spec (Section 4.2.9 of 3GPP TS 31.102)
+ *
+ * @return TP-Message reference parameter of type int, -1 in case if it fails to read the
+ * EF_SMSS field from the sim.
+ */
+ public int getSmssTpmrValue() {
+ if (mSmssValues != null && mSmssValues.length > 0) {
+ return (mSmssValues[0] & 0xFF);
+ }
+ loge("IccRecords - EF_SMSS is null");
+ return SMSS_INVALID_TPMR;
+ }
+
+ @VisibleForTesting
+ public SmssRecord createSmssRecord(Message msg, byte[] smss) {
+ return new SmssRecord(msg, smss);
+ }
+
+
+ static class SmssRecord {
+
+ private Message mMsg;
+ private byte[] mSmss;
+
+ SmssRecord (Message msg, byte[] smss) {
+ mMsg = msg;
+ mSmss = smss;
+ }
+
+ private byte[] getSmssValue() {
+ return mSmss;
+ }
+
+ private Message getMessage() {
+ return mMsg;
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java b/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java
index fe900cb387..4d5f8d156f 100644
--- a/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java
+++ b/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java
@@ -38,6 +38,7 @@ public final class IsimFileHandler extends IccFileHandler implements IccConstant
case EF_DOMAIN:
case EF_IST:
case EF_PCSCF:
+ case EF_SMSS:
return MF_SIM + DF_ADF;
}
String path = getCommonIccEFPath(efid);
diff --git a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
index 06525349aa..f9b51cf819 100644
--- a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
@@ -23,6 +23,7 @@ import android.os.AsyncResult;
import android.os.Build;
import android.os.Message;
import android.telephony.SubscriptionManager;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.CommandsInterface;
@@ -42,7 +43,9 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
protected static final String LOG_TAG = "IsimUiccRecords";
private static final boolean DBG = true;
- private static final boolean VDBG = false; // STOPSHIP if true
+ private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */
+ private static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING ||
+ Rlog.isLoggable(LOG_TAG, Log.VERBOSE);
private static final boolean DUMP_RECORDS = false; // Note: PII is logged when this is true
// STOPSHIP if true
public static final String INTENT_ISIM_REFRESH = "com.android.intent.isim_refresh";
@@ -71,7 +74,8 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
+ " mIsimImpu=" + Arrays.toString(mIsimImpu)
+ " mIsimIst=" + mIsimIst
+ " mIsimPcscf=" + Arrays.toString(mIsimPcscf)
- + " mPsiSmsc=" + mPsiSmsc) : "");
+ + " mPsiSmsc=" + mPsiSmsc
+ + " mSmss TPMR=" + getSmssTpmrValue()) : "");
}
public IsimUiccRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
@@ -113,7 +117,6 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
broadcastRefresh();
super.handleMessage(msg);
break;
-
default:
super.handleMessage(msg); // IccRecords handles generic record load responses
@@ -145,6 +148,9 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
mFh.loadEFLinearFixedAll(EF_PCSCF, obtainMessage(
IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimPcscfLoaded()));
mRecordsToLoad++;
+ mFh.loadEFTransparent(EF_SMSS, obtainMessage(
+ IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimSmssLoaded()));
+ mRecordsToLoad++;
mFh.loadEFLinearFixed(EF_PSISMSC, 1, obtainMessage(
IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimPsiSmscLoaded()));
@@ -218,6 +224,23 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
if (DUMP_RECORDS) log("EF_IST=" + mIsimIst);
}
}
+
+ private class EfIsimSmssLoaded implements IccRecords.IccRecordLoaded {
+
+ @Override
+ public String getEfName() {
+ return "EF_ISIM_SMSS";
+ }
+
+ @Override
+ public void onRecordLoaded(AsyncResult ar) {
+ mSmssValues = (byte[]) ar.result;
+ if (VDBG) {
+ log("IsimUiccRecords - EF_SMSS TPMR value = " + getSmssTpmrValue());
+ }
+ }
+ }
+
private class EfIsimPcscfLoaded implements IccRecords.IccRecordLoaded {
public String getEfName() {
return "EF_ISIM_PCSCF";
@@ -468,6 +491,7 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords {
pw.println(" mIsimIst" + mIsimIst);
pw.println(" mIsimPcscf" + Arrays.toString(mIsimPcscf));
pw.println(" mPsismsc=" + mPsiSmsc);
+ pw.println(" mSmss TPMR=" + getSmssTpmrValue());
}
pw.flush();
}
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index 533e044766..04c64a2c38 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -31,6 +31,7 @@ import android.telephony.PhoneNumberUtils;
import android.telephony.SmsMessage;
import android.telephony.SubscriptionInfo;
import android.text.TextUtils;
+import android.util.Log;
import android.util.Pair;
import com.android.internal.telephony.CommandsInterface;
@@ -54,8 +55,9 @@ public class SIMRecords extends IccRecords {
protected static final String LOG_TAG = "SIMRecords";
private static final boolean CRASH_RIL = false;
-
- private static final boolean VDBG = false;
+ private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */
+ private static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING ||
+ Rlog.isLoggable(LOG_TAG, Log.VERBOSE);
// ***** Instance Variables
@@ -109,7 +111,8 @@ public class SIMRecords extends IccRecords {
+ " mEfCff=" + IccUtils.bytesToHexString(mEfCff)
+ " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis)
+ " getOperatorNumeric=" + getOperatorNumeric()
- + " mPsiSmsc=" + mPsiSmsc;
+ + " mPsiSmsc=" + mPsiSmsc
+ + " TPMR=" + getSmssTpmrValue();
}
// ***** Constants
@@ -185,7 +188,9 @@ public class SIMRecords extends IccRecords {
private static final int EVENT_GET_FPLMN_DONE = 41 + SIM_RECORD_EVENT_BASE;
private static final int EVENT_GET_FPLMN_SIZE_DONE = 42 + SIM_RECORD_EVENT_BASE;
private static final int EVENT_SET_FPLMN_DONE = 43 + SIM_RECORD_EVENT_BASE;
+ protected static final int EVENT_GET_SMSS_RECORD_DONE = 46 + SIM_RECORD_EVENT_BASE;
protected static final int EVENT_GET_PSISMSC_DONE = 47 + SIM_RECORD_EVENT_BASE;
+
// ***** Constructor
public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
@@ -641,7 +646,6 @@ public class SIMRecords extends IccRecords {
" while being destroyed. Ignoring.");
return;
}
-
try {
switch (msg.what) {
/* IO events */
@@ -1297,7 +1301,7 @@ public class SIMRecords extends IccRecords {
isRecordLoadResponse = true;
ar = (AsyncResult) msg.obj;
if (ar.exception != null) {
- loge("Failed to read USIM EF_SMSS field error=" + ar.exception);
+ loge("Failed to read USIM EF_PSISMSC field error=" + ar.exception);
} else {
data = (byte[]) ar.result;
if (data != null && data.length > 0) {
@@ -1309,6 +1313,19 @@ public class SIMRecords extends IccRecords {
}
break;
+ case EVENT_GET_SMSS_RECORD_DONE:
+ isRecordLoadResponse = true;
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ loge("Failed to read USIM EF_SMSS field error=" + ar.exception);
+ } else {
+ mSmssValues = (byte[]) ar.result;
+ if (VDBG) {
+ log("SIMRecords - EF_SMSS TPMR value = " + getSmssTpmrValue());
+ }
+ }
+ break;
+
default:
super.handleMessage(msg); // IccRecords handles generic record load responses
}
@@ -1707,6 +1724,9 @@ public class SIMRecords extends IccRecords {
mRecordsToLoad++;
}
+ mFh.loadEFTransparent(EF_SMSS, obtainMessage(EVENT_GET_SMSS_RECORD_DONE));
+ mRecordsToLoad++;
+
if (CRASH_RIL) {
String sms = "0107912160130310f20404d0110041007030208054832b0120"
+ "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
@@ -2166,6 +2186,7 @@ public class SIMRecords extends IccRecords {
pw.println(" mFplmns[]=" + Arrays.toString(mFplmns));
pw.println(" mEhplmns[]=" + Arrays.toString(mEhplmns));
pw.println(" mPsismsc=" + mPsiSmsc);
+ pw.println(" TPMR=" + getSmssTpmrValue());
pw.flush();
}
}
diff --git a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
index ff8d63d5c1..bc46f800a2 100755
--- a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
+++ b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java
@@ -68,6 +68,7 @@ public final class UsimFileHandler extends IccFileHandler implements IccConstant
case EF_FPLMN:
case EF_LRPLMNSI:
case EF_HPPLMN:
+ case EF_SMSS:
return MF_SIM + DF_ADF;
case EF_PBR: