blob: 7cccfcb51859c81c699eb1a14b4b29c30cd7f1eb [file] [log] [blame]
//
// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <tinyxml2.h>
#include "host/commands/modem_simulator/modem_service.h"
namespace cuttlefish {
using namespace tinyxml2;
class NetworkService;
class SimService : public ModemService, public std::enable_shared_from_this<SimService> {
public:
SimService(int32_t service_id, ChannelMonitor* channel_monitor,
ThreadLooper* thread_looper);
~SimService() = default;
SimService(const SimService &) = delete;
SimService &operator=(const SimService &) = delete;
void SetupDependency(NetworkService* net);
void HandleSIMStatusReq(const Client& client);
void HandleChangeOrEnterPIN(const Client& client, const std::string& command);
void HandleSIM_IO(const Client& client, const std::string& command);
void HandleCSIM_IO(const Client& client, const std::string& command);
void HandleGetIMSI(const Client& client);
void HandleGetIccId(const Client& client);
void HandleFacilityLock(const Client& client, const std::string& command);
void HandleOpenLogicalChannel(const Client& client,
const std::string& command);
void HandleCloseLogicalChannel(const Client& client,
const std::string& command);
void HandleTransmitLogicalChannel(const Client& client,
const std::string& command);
void HandleChangePassword(const Client& client, const std::string& command);
void HandleQueryRemainTimes(const Client& client, const std::string& command);
void HandleCdmaSubscriptionSource(const Client& client,
const std::string& command);
void HandleCdmaRoamingPreference(const Client& client,
const std::string& command);
void HandleSimAuthentication(const Client& client,
const std::string& command);
void SavePinStateToIccProfile();
void SaveFacilityLockToIccProfile();
bool IsFDNEnabled();
bool IsFixedDialNumber(std::string_view number);
XMLElement* GetIccProfile();
std::string GetPhoneNumber();
enum SimStatus {
SIM_STATUS_ABSENT = 0,
SIM_STATUS_NOT_READY,
SIM_STATUS_READY,
SIM_STATUS_PIN,
SIM_STATUS_PUK,
};
SimStatus GetSimStatus() const;
std::string GetSimOperator();
private:
void InitializeServiceState();
std::vector<CommandHandler> InitializeCommandHandlers();
void InitializeSimFileSystemAndSimState();
void InitializeFacilityLock();
void OnSimStatusChanged();
NetworkService* network_service_;
/* SimStatus */
SimStatus sim_status_;
/* SimFileSystem */
struct SimFileSystem {
enum EFId: int32_t {
EF_ADN = 0x6F3A,
EF_FDN = 0x6F3B,
EF_GID1 = 0x6F3E,
EF_GID2 = 0x6F3F,
EF_SDN = 0x6F49,
EF_EXT1 = 0x6F4A,
EF_EXT2 = 0x6F4B,
EF_EXT3 = 0x6F4C,
EF_EXT5 = 0x6F4E,
EF_EXT6 = 0x6FC8, // Ext record for EF[MBDN]
EF_MWIS = 0x6FCA,
EF_MBDN = 0x6FC7,
EF_PNN = 0x6FC5,
EF_OPL = 0x6FC6,
EF_SPN = 0x6F46,
EF_SMS = 0x6F3C,
EF_ICCID = 0x2FE2,
EF_AD = 0x6FAD,
EF_MBI = 0x6FC9,
EF_MSISDN = 0x6F40,
EF_SPDI = 0x6FCD,
EF_SST = 0x6F38,
EF_CFIS = 0x6FCB,
EF_IMG = 0x4F20,
// USIM SIM file ids from TS 131.102
EF_PBR = 0x4F30,
EF_LI = 0x6F05,
// GSM SIM file ids from CPHS (phase 2, version 4.2) CPHS4_2.WW6
EF_MAILBOX_CPHS = 0x6F17,
EF_VOICE_MAIL_INDICATOR_CPHS = 0x6F11,
EF_CFF_CPHS = 0x6F13,
EF_SPN_CPHS = 0x6F14,
EF_SPN_SHORT_CPHS = 0x6F18,
EF_INFO_CPHS = 0x6F16,
EF_CSP_CPHS = 0x6F15,
// CDMA RUIM file ids from 3GPP2 C.S0023-0
EF_CST = 0x6F32,
EF_RUIM_SPN =0x6F41,
// ETSI TS.102.221
EF_PL = 0x2F05,
// 3GPP2 C.S0065
EF_CSIM_LI = 0x6F3A,
EF_CSIM_SPN =0x6F41,
EF_CSIM_MDN = 0x6F44,
EF_CSIM_IMSIM = 0x6F22,
EF_CSIM_CDMAHOME = 0x6F28,
EF_CSIM_EPRL = 0x6F5A,
EF_CSIM_MIPUPP = 0x6F4D,
//ISIM access
EF_IMPU = 0x6F04,
EF_IMPI = 0x6F02,
EF_DOMAIN = 0x6F03,
EF_IST = 0x6F07,
EF_PCSCF = 0x6F09,
EF_PSI = 0x6FE5,
//PLMN Selection Information w/ Access Technology TS 131.102
EF_PLMN_W_ACT = 0x6F60,
EF_OPLMN_W_ACT = 0x6F61,
EF_HPLMN_W_ACT = 0x6F62,
//Equivalent Home and Forbidden PLMN Lists TS 131.102
EF_EHPLMN = 0x6FD9,
EF_FPLMN = 0x6F7B,
// Last Roaming Selection Indicator
EF_LRPLMNSI = 0x6FDC,
//Search interval for higher priority PLMNs
EF_HPPLMN = 0x6F31,
};
XMLElement* GetRootElement();
static std::string GetCommonIccEFPath(EFId efid);
static std::string GetUsimEFPath(EFId efid);
static XMLElement *FindAttribute(XMLElement* parent,
const std::string& attr_name,
const std::string& attr_value);
XMLElement* AppendNewElement(XMLElement* parent, const char* name);
XMLElement* AppendNewElementWithText(XMLElement* parent, const char* name,
const char* text);
XMLDocument doc;
std::string file_path;
};
SimFileSystem sim_file_system_;
/* PinStatus */
struct PinStatus {
enum ChangeMode {WITH_PIN, WITH_PUK};
std::string pin_;
std::string puk_;
int pin_remaining_times_;
int puk_remaining_times_;
bool CheckPasswordValid(std::string_view password);
bool VerifyPIN(const std::string_view pin);
bool VerifyPUK(const std::string_view puk);
bool ChangePIN(ChangeMode mode, const std::string_view pin_or_puk,
const std::string_view new_pin);
bool ChangePUK(const std::string_view puk, const std::string_view new_puk);
};
PinStatus pin1_status_;
PinStatus pin2_status_;
bool checkPin1AndAdjustSimStatus(std::string_view password);
bool ChangePin1AndAdjustSimStatus(PinStatus::ChangeMode mode,
std::string_view pin,
std::string_view new_pin);
/* FacilityLock */
struct FacilityLock {
enum LockType {
AO = 1, // Barr all outgoing calls
OI = 2, // Barr all outgoing international calls
OX = 3, // Barr all outgoing international calls, except to Home Country
AI = 4, // Barr all incoming calls
IR = 5, // Barr all call, when roaming outside Home Country
AB = 6, // All barring services
AG = 7, // All outgoing barring services
AC = 8, // All incoming barring services
SC = 9, // PIN enable/disable
FD = 10, // SIM fixed FDN dialing lock, PIN2 is required as a password
};
enum Mode {
UNLOCK = 0,
LOCK = 1,
QUERY = 2,
};
enum Class : int32_t {
DEFAULT = 7, // all classes
VOICE = 1 << 0, // telephony
DATA = 1 << 1, // to all bear service
FAX = 1 << 2, // facsimile services
SMS = 1 << 3, // short message services
};
enum LockStatus {
DISABLE,
ENABLE,
};
LockStatus lock_status; // Ignore class
FacilityLock(LockStatus status) : lock_status(status) {}
};
std::map<std::string, FacilityLock> facility_lock_;
/* LogicalChannel */
struct LogicalChannel {
std::string df_name;
bool is_open;
int session_id;
LogicalChannel(int session_id) :
df_name(""), is_open(false), session_id(session_id) {};
};
std::vector<LogicalChannel> logical_channels_;
std::string last_file_id_;
int cdma_subscription_source_;
int cdma_roaming_preference_;
};
} // namespace cuttlefish