blob: 0f4136895f0305b0e3a5867dc9f6f93456f36662 [file] [log] [blame]
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001/* //device/libs/telephony/ril.cpp
2**
3** Copyright 2006, The Android Open Source Project
4**
Wink Saville7f856802009-06-09 10:23:37 -07005** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08008**
Wink Saville7f856802009-06-09 10:23:37 -07009** http://www.apache.org/licenses/LICENSE-2.0
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080010**
Wink Saville7f856802009-06-09 10:23:37 -070011** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080015** limitations under the License.
16*/
17
18#define LOG_TAG "RILC"
19
20#include <hardware_legacy/power.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080021#include <telephony/ril.h>
Wink Savillef4c4d362009-04-02 01:37:03 -070022#include <telephony/ril_cdma_sms.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080023#include <cutils/sockets.h>
24#include <cutils/jstring.h>
Dima Zavin622bf2b2013-05-22 11:29:34 -070025#include <telephony/record_stream.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080026#include <utils/Log.h>
27#include <utils/SystemClock.h>
28#include <pthread.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080029#include <cutils/jstring.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080030#include <sys/types.h>
Wink Saville18e4ab12013-04-07 17:31:04 -070031#include <sys/limits.h>
Sanket Padawe4c05f352016-01-26 16:19:00 -080032#include <sys/system_properties.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080033#include <pwd.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080034#include <stdio.h>
35#include <stdlib.h>
36#include <stdarg.h>
37#include <string.h>
38#include <unistd.h>
39#include <fcntl.h>
40#include <time.h>
41#include <errno.h>
42#include <assert.h>
43#include <ctype.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080044#include <sys/un.h>
45#include <assert.h>
46#include <netinet/in.h>
47#include <cutils/properties.h>
Dheeraj Shetty27976c42014-07-02 21:27:57 +020048#include <RilSapSocket.h>
Amit Mahajan18fe36b2016-08-25 11:19:21 -070049#include <ril_service.h>
Amit Mahajanc2c71852016-11-29 16:48:54 -080050#include <sap_service.h>
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080051
Dheeraj Shetty27976c42014-07-02 21:27:57 +020052extern "C" void
53RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
Sanket Padawe6ff9a872016-01-27 15:09:12 -080054
55extern "C" void
56RIL_onRequestAck(RIL_Token t);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080057namespace android {
58
59#define PHONE_PROCESS "radio"
Dheeraj Shetty27976c42014-07-02 21:27:57 +020060#define BLUETOOTH_PROCESS "bluetooth"
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080061
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080062#define SOCKET_NAME_RIL_DEBUG "rild-debug"
63
64#define ANDROID_WAKE_LOCK_NAME "radio-interface"
65
Nathan Harolda0153392015-07-28 14:54:58 -070066#define ANDROID_WAKE_LOCK_SECS 0
67#define ANDROID_WAKE_LOCK_USECS 200000
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080068
69#define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
70
71// match with constant in RIL.java
72#define MAX_COMMAND_BYTES (8 * 1024)
73
74// Basically: memset buffers that the client library
75// shouldn't be using anymore in an attempt to find
76// memory usage issues sooner.
77#define MEMSET_FREED 1
78
79#define NUM_ELEMS(a) (sizeof (a) / sizeof (a)[0])
80
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080081/* Negative values for private RIL errno's */
Chih-Hung Hsieh434554c2016-05-12 10:01:16 -070082#define RIL_ERRNO_INVALID_RESPONSE (-1)
Robert Greenwalt78e2c9c2016-05-16 12:36:42 -070083#define RIL_ERRNO_NO_MEMORY (-12)
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080084
85// request, response, and unsolicited msg print macro
86#define PRINTBUF_SIZE 8096
87
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080088enum WakeType {DONT_WAKE, WAKE_PARTIAL};
89
90typedef struct {
91 int requestNumber;
Amit Mahajan18fe36b2016-08-25 11:19:21 -070092 int (*responseFunction) (Parcel &p, int slotId, int requestNumber, int responseType, int token,
93 RIL_Errno e, void *response, size_t responselen);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080094 WakeType wakeType;
95} UnsolResponseInfo;
96
Wink Saville3d54e742009-05-18 18:00:44 -070097typedef struct UserCallbackInfo {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -080098 RIL_TimedCallback p_callback;
99 void *userParam;
100 struct ril_event event;
101 struct UserCallbackInfo *p_next;
102} UserCallbackInfo;
103
Etan Cohend3652192014-06-20 08:28:44 -0700104extern "C" const char * failCauseToString(RIL_Errno);
105extern "C" const char * callStateToString(RIL_CallState);
106extern "C" const char * radioStateToString(RIL_RadioState);
107extern "C" const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
108
109extern "C"
110char rild[MAX_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800111/*******************************************************************/
112
113RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
114static int s_registerCalled = 0;
115
116static pthread_t s_tid_dispatch;
117static pthread_t s_tid_reader;
118static int s_started = 0;
119
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800120static int s_fdDebug = -1;
Etan Cohend3652192014-06-20 08:28:44 -0700121static int s_fdDebug_socket2 = -1;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800122
123static int s_fdWakeupRead;
124static int s_fdWakeupWrite;
125
Sanket Padawe6ff9a872016-01-27 15:09:12 -0800126int s_wakelock_count = 0;
127
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800128static struct ril_event s_commands_event;
129static struct ril_event s_wakeupfd_event;
130static struct ril_event s_listen_event;
Etan Cohend3652192014-06-20 08:28:44 -0700131static SocketListenParam s_ril_param_socket;
132
133static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
134static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
Sanket Padawe6ff9a872016-01-27 15:09:12 -0800135static pthread_mutex_t s_wakeLockCountMutex = PTHREAD_MUTEX_INITIALIZER;
Etan Cohend3652192014-06-20 08:28:44 -0700136static RequestInfo *s_pendingRequests = NULL;
137
138#if (SIM_COUNT >= 2)
139static struct ril_event s_commands_event_socket2;
140static struct ril_event s_listen_event_socket2;
141static SocketListenParam s_ril_param_socket2;
142
143static pthread_mutex_t s_pendingRequestsMutex_socket2 = PTHREAD_MUTEX_INITIALIZER;
144static pthread_mutex_t s_writeMutex_socket2 = PTHREAD_MUTEX_INITIALIZER;
145static RequestInfo *s_pendingRequests_socket2 = NULL;
146#endif
147
148#if (SIM_COUNT >= 3)
149static struct ril_event s_commands_event_socket3;
150static struct ril_event s_listen_event_socket3;
151static SocketListenParam s_ril_param_socket3;
152
153static pthread_mutex_t s_pendingRequestsMutex_socket3 = PTHREAD_MUTEX_INITIALIZER;
154static pthread_mutex_t s_writeMutex_socket3 = PTHREAD_MUTEX_INITIALIZER;
155static RequestInfo *s_pendingRequests_socket3 = NULL;
156#endif
157
158#if (SIM_COUNT >= 4)
159static struct ril_event s_commands_event_socket4;
160static struct ril_event s_listen_event_socket4;
161static SocketListenParam s_ril_param_socket4;
162
163static pthread_mutex_t s_pendingRequestsMutex_socket4 = PTHREAD_MUTEX_INITIALIZER;
164static pthread_mutex_t s_writeMutex_socket4 = PTHREAD_MUTEX_INITIALIZER;
165static RequestInfo *s_pendingRequests_socket4 = NULL;
166#endif
167
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800168static struct ril_event s_wake_timeout_event;
169static struct ril_event s_debug_event;
170
171
Nathan Harolda0153392015-07-28 14:54:58 -0700172static const struct timeval TIMEVAL_WAKE_TIMEOUT = {ANDROID_WAKE_LOCK_SECS,ANDROID_WAKE_LOCK_USECS};
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800173
Etan Cohend3652192014-06-20 08:28:44 -0700174
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800175static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
176static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
177
178static pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
179static pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
180
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800181static RequestInfo *s_toDispatchHead = NULL;
182static RequestInfo *s_toDispatchTail = NULL;
183
184static UserCallbackInfo *s_last_wake_timeout_info = NULL;
185
186static void *s_lastNITZTimeData = NULL;
187static size_t s_lastNITZTimeDataSize;
188
189#if RILC_LOG
190 static char printBuf[PRINTBUF_SIZE];
191#endif
192
193/*******************************************************************/
Etan Cohend3652192014-06-20 08:28:44 -0700194static int sendResponse (Parcel &p, RIL_SOCKET_ID socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800195
196static void dispatchVoid (Parcel& p, RequestInfo *pRI);
197static void dispatchString (Parcel& p, RequestInfo *pRI);
198static void dispatchStrings (Parcel& p, RequestInfo *pRI);
199static void dispatchInts (Parcel& p, RequestInfo *pRI);
200static void dispatchDial (Parcel& p, RequestInfo *pRI);
201static void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
Shishir Agrawal2458d8d2013-11-27 14:53:05 -0800202static void dispatchSIM_APDU (Parcel& p, RequestInfo *pRI);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800203static void dispatchCallForward(Parcel& p, RequestInfo *pRI);
204static void dispatchRaw(Parcel& p, RequestInfo *pRI);
205static void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
Lorenzo Colitti4f81dcf2010-09-01 19:38:57 -0700206static void dispatchDataCall (Parcel& p, RequestInfo *pRI);
Sungmin Choi75697532013-04-26 15:04:45 -0700207static void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI);
Wink Savillef4c4d362009-04-02 01:37:03 -0700208static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -0700209static void dispatchImsSms(Parcel &p, RequestInfo *pRI);
210static void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
211static void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
Wink Savillef4c4d362009-04-02 01:37:03 -0700212static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
Wink Savillea592eeb2009-05-22 13:26:36 -0700213static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
Wink Savillef4c4d362009-04-02 01:37:03 -0700214static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
215static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
Jake Hamby8a4a2332014-01-15 13:12:05 -0800216static void dispatchNVReadItem(Parcel &p, RequestInfo *pRI);
217static void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI);
Etan Cohend3652192014-06-20 08:28:44 -0700218static void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI);
Amit Mahajan90530a62014-07-01 15:54:08 -0700219static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI);
Amit Mahajanc796e222014-08-13 16:54:01 +0000220static void dispatchDataProfile(Parcel &p, RequestInfo *pRI);
Wink Saville8b4e4f72014-10-17 15:01:45 -0700221static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI);
Meng Wangb4e34312016-05-12 14:54:36 -0700222static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700223static int responseInts(Parcel &p, int slotId, int requestNumber, int responseType, int token,
224 RIL_Errno e, void *response, size_t responselen);
225static int responseFailCause(Parcel &p, int slotId, int requestNumber, int responseType, int token,
226 RIL_Errno e, void *response, size_t responselen);
227static int responseStrings(Parcel &p, int slotId, int requestNumber, int responseType, int token,
228 RIL_Errno e, void *response, size_t responselen);
229static int responseString(Parcel &p, int slotId, int requestNumber, int responseType, int token,
230 RIL_Errno e, void *response, size_t responselen);
231static int responseVoid(Parcel &p, int slotId, int requestNumber, int responseType, int token,
232 RIL_Errno e, void *response, size_t responselen);
233static int responseCallList(Parcel &p, int slotId, int requestNumber, int responseType, int token,
234 RIL_Errno e, void *response, size_t responselen);
235static int responseSMS(Parcel &p, int slotId, int requestNumber, int responseType, int token,
236 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700237static int responseRaw(Parcel &p, int slotId, int requestNumber, int responseType, int token,
238 RIL_Errno e, void *response, size_t responselen);
239static int responseSsn(Parcel &p, int slotId, int requestNumber, int responseType, int token,
240 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700241static int responseCdmaSms(Parcel &p, int slotId, int requestNumber, int responseType, int token,
242 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700243static int responseCdmaInformationRecords(Parcel &p, int slotId, int requestNumber,
244 int responseType, int token, RIL_Errno e,void *response, size_t responselen);
245static int responseRilSignalStrength(Parcel &p, int slotId, int requestNumber, int responseType,
246 int token, RIL_Errno e,void *response, size_t responselen);
247static int responseCallRing(Parcel &p, int slotId, int requestNumber, int responseType, int token,
248 RIL_Errno e, void *response, size_t responselen);
249static int responseCdmaSignalInfoRecord(Parcel &p, int slotId, int requestNumber, int responseType,
250 int token, RIL_Errno e,void *response, size_t responselen);
251static int responseCdmaCallWaiting(Parcel &p, int slotId, int requestNumber, int responseType,
252 int token, RIL_Errno e,void *response, size_t responselen);
253static int responseSimRefresh(Parcel &p, int slotId, int requestNumber, int responseType, int token,
254 RIL_Errno e, void *response, size_t responselen);
255static int responseCellInfoList(Parcel &p, int slotId, int requestNumber, int responseType,
256 int token, RIL_Errno e, void *response, size_t responselen);
257static int responseHardwareConfig(Parcel &p, int slotId, int requestNumber, int responseType,
258 int token, RIL_Errno e, void *response, size_t responselen);
259static int responseDcRtInfo(Parcel &p, int slotId, int requestNumber, int responseType, int token,
260 RIL_Errno e, void *response, size_t responselen);
261static int responseRadioCapability(Parcel &p, int slotId, int requestNumber, int responseType,
262 int token, RIL_Errno e, void *response, size_t responselen);
263static int responseSSData(Parcel &p, int slotId, int requestNumber, int responseType, int token,
264 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700265static int responseLceData(Parcel &p, int slotId, int requestNumber, int responseType, int token,
266 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700267static int responsePcoData(Parcel &p, int slotId, int requestNumber, int responseType, int token,
268 RIL_Errno e, void *response, size_t responselen);
Amit Mahajan54563d32014-11-22 00:54:49 +0000269
Sanket Padawe6ff9a872016-01-27 15:09:12 -0800270static void grabPartialWakeLock();
Sanket Padawe85f952a2017-01-02 23:46:00 -0800271void releaseWakeLock();
Sanket Padawe6ff9a872016-01-27 15:09:12 -0800272static void wakeTimeoutCallback(void *);
Naveen Kalla2bc78d62011-12-07 16:22:53 -0800273
Sanket Padawe4c05f352016-01-26 16:19:00 -0800274static bool isDebuggable();
275
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800276#ifdef RIL_SHLIB
Etan Cohend3652192014-06-20 08:28:44 -0700277#if defined(ANDROID_MULTI_SIM)
Vinit Deshpande1b1ec2d2015-04-15 13:31:05 -0700278extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
Etan Cohend3652192014-06-20 08:28:44 -0700279 size_t datalen, RIL_SOCKET_ID socket_id);
280#else
Vinit Deshpande1b1ec2d2015-04-15 13:31:05 -0700281extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800282 size_t datalen);
283#endif
Etan Cohend3652192014-06-20 08:28:44 -0700284#endif
285
286#if defined(ANDROID_MULTI_SIM)
287#define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c), (d))
288#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
289#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest(a)
290#else
291#define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c))
292#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d))
293#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest()
294#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800295
Wink Saville7f856802009-06-09 10:23:37 -0700296static UserCallbackInfo * internalRequestTimedCallback
Dianne Hackborn0d9f0c02010-06-25 16:50:46 -0700297 (RIL_TimedCallback callback, void *param,
298 const struct timeval *relativeTime);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800299
300/** Index == requestNumber */
301static CommandInfo s_commands[] = {
302#include "ril_commands.h"
303};
304
305static UnsolResponseInfo s_unsolResponses[] = {
306#include "ril_unsol_commands.h"
307};
308
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700309char * RIL_getRilSocketName() {
Etan Cohend3652192014-06-20 08:28:44 -0700310 return rild;
311}
312
313extern "C"
Dheeraj Shetty27976c42014-07-02 21:27:57 +0200314void RIL_setRilSocketName(const char * s) {
Etan Cohend3652192014-06-20 08:28:44 -0700315 strncpy(rild, s, MAX_SOCKET_NAME_LENGTH);
316}
317
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800318static char *
Wink Savillef4c4d362009-04-02 01:37:03 -0700319strdupReadString(Parcel &p) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800320 size_t stringlen;
321 const char16_t *s16;
Wink Saville7f856802009-06-09 10:23:37 -0700322
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800323 s16 = p.readString16Inplace(&stringlen);
Wink Saville7f856802009-06-09 10:23:37 -0700324
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800325 return strndup16to8(s16, stringlen);
326}
327
Wink Saville8b4e4f72014-10-17 15:01:45 -0700328static status_t
329readStringFromParcelInplace(Parcel &p, char *str, size_t maxLen) {
330 size_t s16Len;
331 const char16_t *s16;
332
333 s16 = p.readString16Inplace(&s16Len);
334 if (s16 == NULL) {
335 return NO_MEMORY;
336 }
337 size_t strLen = strnlen16to8(s16, s16Len);
338 if ((strLen + 1) > maxLen) {
339 return NO_MEMORY;
340 }
341 if (strncpy16to8(str, s16, strLen) == NULL) {
342 return NO_MEMORY;
343 } else {
344 return NO_ERROR;
345 }
346}
347
Wink Savillef4c4d362009-04-02 01:37:03 -0700348static void writeStringToParcel(Parcel &p, const char *s) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800349 char16_t *s16;
350 size_t s16_len;
351 s16 = strdup8to16(s, &s16_len);
352 p.writeString16(s16, s16_len);
353 free(s16);
354}
355
356
357static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700358memsetString (char *s) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800359 if (s != NULL) {
360 memset (s, 0, strlen(s));
361 }
362}
363
364void nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
365 const size_t* objects, size_t objectsSize,
Wink Savillef4c4d362009-04-02 01:37:03 -0700366 void* cookie) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800367 // do nothing -- the data reference lives longer than the Parcel object
368}
369
Wink Saville7f856802009-06-09 10:23:37 -0700370/**
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800371 * To be called from dispatch thread
372 * Issue a single local request, ensuring that the response
Wink Saville7f856802009-06-09 10:23:37 -0700373 * is not sent back up to the command process
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800374 */
375static void
Etan Cohend3652192014-06-20 08:28:44 -0700376issueLocalRequest(int request, void *data, int len, RIL_SOCKET_ID socket_id) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800377 RequestInfo *pRI;
378 int ret;
Etan Cohend3652192014-06-20 08:28:44 -0700379 /* Hook for current context */
380 /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
381 pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
382 /* pendingRequestsHook refer to &s_pendingRequests */
383 RequestInfo** pendingRequestsHook = &s_pendingRequests;
384
385#if (SIM_COUNT == 2)
386 if (socket_id == RIL_SOCKET_2) {
387 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
388 pendingRequestsHook = &s_pendingRequests_socket2;
389 }
390#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800391
392 pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
Sanket Padawe55227b52016-02-29 10:09:26 -0800393 if (pRI == NULL) {
394 RLOGE("Memory allocation failed for request %s", requestToString(request));
395 return;
396 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800397
398 pRI->local = 1;
399 pRI->token = 0xffffffff; // token is not used in this context
400 pRI->pCI = &(s_commands[request]);
Etan Cohend3652192014-06-20 08:28:44 -0700401 pRI->socket_id = socket_id;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800402
Etan Cohend3652192014-06-20 08:28:44 -0700403 ret = pthread_mutex_lock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800404 assert (ret == 0);
405
Etan Cohend3652192014-06-20 08:28:44 -0700406 pRI->p_next = *pendingRequestsHook;
407 *pendingRequestsHook = pRI;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800408
Etan Cohend3652192014-06-20 08:28:44 -0700409 ret = pthread_mutex_unlock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800410 assert (ret == 0);
411
Wink Saville8eb2a122012-11-19 16:05:13 -0800412 RLOGD("C[locl]> %s", requestToString(request));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800413
Etan Cohend3652192014-06-20 08:28:44 -0700414 CALL_ONREQUEST(request, data, len, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800415}
416
417
418
419static int
Etan Cohend3652192014-06-20 08:28:44 -0700420processCommandBuffer(void *buffer, size_t buflen, RIL_SOCKET_ID socket_id) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800421 Parcel p;
422 status_t status;
423 int32_t request;
424 int32_t token;
425 RequestInfo *pRI;
426 int ret;
Etan Cohend3652192014-06-20 08:28:44 -0700427 /* Hook for current context */
428 /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
429 pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
430 /* pendingRequestsHook refer to &s_pendingRequests */
431 RequestInfo** pendingRequestsHook = &s_pendingRequests;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800432
433 p.setData((uint8_t *) buffer, buflen);
434
435 // status checked at end
436 status = p.readInt32(&request);
437 status = p.readInt32 (&token);
438
Etan Cohend3652192014-06-20 08:28:44 -0700439#if (SIM_COUNT >= 2)
440 if (socket_id == RIL_SOCKET_2) {
441 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
442 pendingRequestsHook = &s_pendingRequests_socket2;
443 }
444#if (SIM_COUNT >= 3)
445 else if (socket_id == RIL_SOCKET_3) {
446 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
447 pendingRequestsHook = &s_pendingRequests_socket3;
448 }
449#endif
450#if (SIM_COUNT >= 4)
451 else if (socket_id == RIL_SOCKET_4) {
452 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
453 pendingRequestsHook = &s_pendingRequests_socket4;
454 }
455#endif
456#endif
457
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800458 if (status != NO_ERROR) {
Wink Saville8eb2a122012-11-19 16:05:13 -0800459 RLOGE("invalid request block");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800460 return 0;
461 }
462
Sooraj Sasindran405313f2016-05-06 16:19:56 -0700463 // Received an Ack for the previous result sent to RIL.java,
464 // so release wakelock and exit
465 if (request == RIL_RESPONSE_ACKNOWLEDGEMENT) {
466 releaseWakeLock();
467 return 0;
468 }
469
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800470 if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
Etan Cohend3652192014-06-20 08:28:44 -0700471 Parcel pErr;
Wink Saville8eb2a122012-11-19 16:05:13 -0800472 RLOGE("unsupported request code %d token %d", request, token);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800473 // FIXME this should perhaps return a response
Etan Cohend3652192014-06-20 08:28:44 -0700474 pErr.writeInt32 (RESPONSE_SOLICITED);
475 pErr.writeInt32 (token);
476 pErr.writeInt32 (RIL_E_GENERIC_FAILURE);
477
478 sendResponse(pErr, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800479 return 0;
480 }
481
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800482 pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
Sanket Padawe55227b52016-02-29 10:09:26 -0800483 if (pRI == NULL) {
484 RLOGE("Memory allocation failed for request %s", requestToString(request));
485 return 0;
486 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800487
488 pRI->token = token;
489 pRI->pCI = &(s_commands[request]);
Etan Cohend3652192014-06-20 08:28:44 -0700490 pRI->socket_id = socket_id;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800491
Etan Cohend3652192014-06-20 08:28:44 -0700492 ret = pthread_mutex_lock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800493 assert (ret == 0);
494
Etan Cohend3652192014-06-20 08:28:44 -0700495 pRI->p_next = *pendingRequestsHook;
496 *pendingRequestsHook = pRI;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800497
Etan Cohend3652192014-06-20 08:28:44 -0700498 ret = pthread_mutex_unlock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800499 assert (ret == 0);
500
Wink Saville7f856802009-06-09 10:23:37 -0700501 pRI->pCI->dispatchFunction(p, pRI);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800502
503 return 0;
504}
505
Sanket Padawe85f952a2017-01-02 23:46:00 -0800506RequestInfo *
507addRequestToList(int serial, int slotId, int request) {
508 RequestInfo *pRI;
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700509 int ret;
Sanket Padawe85f952a2017-01-02 23:46:00 -0800510 RIL_SOCKET_ID socket_id = (RIL_SOCKET_ID) slotId;
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700511 /* Hook for current context */
512 /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
513 pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
514 /* pendingRequestsHook refer to &s_pendingRequests */
515 RequestInfo** pendingRequestsHook = &s_pendingRequests;
516
517#if (SIM_COUNT >= 2)
518 if (socket_id == RIL_SOCKET_2) {
519 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
520 pendingRequestsHook = &s_pendingRequests_socket2;
521 }
522#if (SIM_COUNT >= 3)
523 else if (socket_id == RIL_SOCKET_3) {
524 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
525 pendingRequestsHook = &s_pendingRequests_socket3;
526 }
527#endif
528#if (SIM_COUNT >= 4)
529 else if (socket_id == RIL_SOCKET_4) {
530 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
531 pendingRequestsHook = &s_pendingRequests_socket4;
532 }
533#endif
534#endif
535
Sanket Padawe85f952a2017-01-02 23:46:00 -0800536 pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
537 if (pRI == NULL) {
538 RLOGE("Memory allocation failed for request %s", requestToString(request));
539 return NULL;
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700540 }
541
Sanket Padawe85f952a2017-01-02 23:46:00 -0800542 pRI->token = serial;
543 pRI->pCI = &(s_commands[request]);
544 pRI->socket_id = socket_id;
545
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700546 ret = pthread_mutex_lock(pendingRequestsMutexHook);
547 assert (ret == 0);
548
549 pRI->p_next = *pendingRequestsHook;
550 *pendingRequestsHook = pRI;
551
552 ret = pthread_mutex_unlock(pendingRequestsMutexHook);
553 assert (ret == 0);
554
Sanket Padawe85f952a2017-01-02 23:46:00 -0800555 return pRI;
Amit Mahajan18fe36b2016-08-25 11:19:21 -0700556}
557
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800558static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700559invalidCommandBlock (RequestInfo *pRI) {
Wink Saville8eb2a122012-11-19 16:05:13 -0800560 RLOGE("invalid command block for token %d request %s",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800561 pRI->token, requestToString(pRI->pCI->requestNumber));
562}
563
564/** Callee expects NULL */
Wink Saville7f856802009-06-09 10:23:37 -0700565static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700566dispatchVoid (Parcel& p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800567 clearPrintBuf;
568 printRequest(pRI->token, pRI->pCI->requestNumber);
Etan Cohend3652192014-06-20 08:28:44 -0700569 CALL_ONREQUEST(pRI->pCI->requestNumber, NULL, 0, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800570}
571
572/** Callee expects const char * */
573static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700574dispatchString (Parcel& p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800575 status_t status;
576 size_t datalen;
577 size_t stringlen;
578 char *string8 = NULL;
579
580 string8 = strdupReadString(p);
581
582 startRequest;
583 appendPrintBuf("%s%s", printBuf, string8);
584 closeRequest;
585 printRequest(pRI->token, pRI->pCI->requestNumber);
586
Etan Cohend3652192014-06-20 08:28:44 -0700587 CALL_ONREQUEST(pRI->pCI->requestNumber, string8,
588 sizeof(char *), pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800589
590#ifdef MEMSET_FREED
591 memsetString(string8);
592#endif
593
594 free(string8);
595 return;
596invalid:
597 invalidCommandBlock(pRI);
598 return;
599}
600
601/** Callee expects const char ** */
602static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700603dispatchStrings (Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800604 int32_t countStrings;
605 status_t status;
606 size_t datalen;
607 char **pStrings;
608
609 status = p.readInt32 (&countStrings);
610
611 if (status != NO_ERROR) {
612 goto invalid;
613 }
614
615 startRequest;
616 if (countStrings == 0) {
617 // just some non-null pointer
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800618 pStrings = (char **)calloc(1, sizeof(char *));
Sanket Padawe55227b52016-02-29 10:09:26 -0800619 if (pStrings == NULL) {
620 RLOGE("Memory allocation failed for request %s",
621 requestToString(pRI->pCI->requestNumber));
622 closeRequest;
623 return;
624 }
625
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800626 datalen = 0;
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800627 } else if (countStrings < 0) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800628 pStrings = NULL;
629 datalen = 0;
630 } else {
631 datalen = sizeof(char *) * countStrings;
Wink Saville7f856802009-06-09 10:23:37 -0700632
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800633 pStrings = (char **)calloc(countStrings, sizeof(char *));
Sanket Padawe55227b52016-02-29 10:09:26 -0800634 if (pStrings == NULL) {
635 RLOGE("Memory allocation failed for request %s",
636 requestToString(pRI->pCI->requestNumber));
637 closeRequest;
638 return;
639 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800640
641 for (int i = 0 ; i < countStrings ; i++) {
642 pStrings[i] = strdupReadString(p);
643 appendPrintBuf("%s%s,", printBuf, pStrings[i]);
644 }
645 }
646 removeLastChar;
647 closeRequest;
648 printRequest(pRI->token, pRI->pCI->requestNumber);
649
Etan Cohend3652192014-06-20 08:28:44 -0700650 CALL_ONREQUEST(pRI->pCI->requestNumber, pStrings, datalen, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800651
652 if (pStrings != NULL) {
653 for (int i = 0 ; i < countStrings ; i++) {
654#ifdef MEMSET_FREED
655 memsetString (pStrings[i]);
656#endif
657 free(pStrings[i]);
658 }
659
660#ifdef MEMSET_FREED
661 memset(pStrings, 0, datalen);
662#endif
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800663 free(pStrings);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800664 }
Wink Saville7f856802009-06-09 10:23:37 -0700665
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800666 return;
667invalid:
668 invalidCommandBlock(pRI);
669 return;
670}
671
672/** Callee expects const int * */
673static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700674dispatchInts (Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800675 int32_t count;
676 status_t status;
677 size_t datalen;
678 int *pInts;
679
680 status = p.readInt32 (&count);
681
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800682 if (status != NO_ERROR || count <= 0) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800683 goto invalid;
684 }
685
686 datalen = sizeof(int) * count;
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800687 pInts = (int *)calloc(count, sizeof(int));
Sanket Padawe55227b52016-02-29 10:09:26 -0800688 if (pInts == NULL) {
689 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
690 return;
691 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800692
693 startRequest;
694 for (int i = 0 ; i < count ; i++) {
695 int32_t t;
696
697 status = p.readInt32(&t);
698 pInts[i] = (int)t;
699 appendPrintBuf("%s%d,", printBuf, t);
700
701 if (status != NO_ERROR) {
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800702 free(pInts);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800703 goto invalid;
704 }
705 }
706 removeLastChar;
707 closeRequest;
708 printRequest(pRI->token, pRI->pCI->requestNumber);
709
Etan Cohend3652192014-06-20 08:28:44 -0700710 CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<int *>(pInts),
711 datalen, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800712
713#ifdef MEMSET_FREED
714 memset(pInts, 0, datalen);
715#endif
Sanket Padawe0cfc5532016-03-07 17:12:19 -0800716 free(pInts);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800717 return;
718invalid:
719 invalidCommandBlock(pRI);
720 return;
721}
722
723
Wink Saville7f856802009-06-09 10:23:37 -0700724/**
725 * Callee expects const RIL_SMS_WriteArgs *
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800726 * Payload is:
727 * int32_t status
728 * String pdu
729 */
730static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700731dispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800732 RIL_SMS_WriteArgs args;
733 int32_t t;
734 status_t status;
735
Mark Salyzyndba25612015-04-09 07:18:35 -0700736 RLOGD("dispatchSmsWrite");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800737 memset (&args, 0, sizeof(args));
738
739 status = p.readInt32(&t);
740 args.status = (int)t;
741
742 args.pdu = strdupReadString(p);
743
744 if (status != NO_ERROR || args.pdu == NULL) {
745 goto invalid;
746 }
747
748 args.smsc = strdupReadString(p);
749
750 startRequest;
751 appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
752 (char*)args.pdu, (char*)args.smsc);
753 closeRequest;
754 printRequest(pRI->token, pRI->pCI->requestNumber);
Wink Saville7f856802009-06-09 10:23:37 -0700755
Etan Cohend3652192014-06-20 08:28:44 -0700756 CALL_ONREQUEST(pRI->pCI->requestNumber, &args, sizeof(args), pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800757
758#ifdef MEMSET_FREED
759 memsetString (args.pdu);
760#endif
761
762 free (args.pdu);
Wink Saville7f856802009-06-09 10:23:37 -0700763
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800764#ifdef MEMSET_FREED
765 memset(&args, 0, sizeof(args));
766#endif
767
768 return;
769invalid:
770 invalidCommandBlock(pRI);
771 return;
772}
773
Wink Saville7f856802009-06-09 10:23:37 -0700774/**
775 * Callee expects const RIL_Dial *
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800776 * Payload is:
777 * String address
778 * int32_t clir
779 */
780static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700781dispatchDial (Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800782 RIL_Dial dial;
Wink Saville74fa3882009-12-22 15:35:41 -0800783 RIL_UUS_Info uusInfo;
Wink Saville7bce0822010-01-08 15:20:12 -0800784 int32_t sizeOfDial;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800785 int32_t t;
Wink Saville74fa3882009-12-22 15:35:41 -0800786 int32_t uusPresent;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800787 status_t status;
788
Mark Salyzyndba25612015-04-09 07:18:35 -0700789 RLOGD("dispatchDial");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800790 memset (&dial, 0, sizeof(dial));
791
792 dial.address = strdupReadString(p);
793
794 status = p.readInt32(&t);
795 dial.clir = (int)t;
796
797 if (status != NO_ERROR || dial.address == NULL) {
798 goto invalid;
799 }
800
Wink Saville3a4840b2010-04-07 13:29:58 -0700801 if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
Wink Saville74fa3882009-12-22 15:35:41 -0800802 uusPresent = 0;
Wink Saville7bce0822010-01-08 15:20:12 -0800803 sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
Wink Saville74fa3882009-12-22 15:35:41 -0800804 } else {
805 status = p.readInt32(&uusPresent);
806
807 if (status != NO_ERROR) {
808 goto invalid;
809 }
810
811 if (uusPresent == 0) {
812 dial.uusInfo = NULL;
813 } else {
814 int32_t len;
815
816 memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
817
818 status = p.readInt32(&t);
819 uusInfo.uusType = (RIL_UUS_Type) t;
820
821 status = p.readInt32(&t);
822 uusInfo.uusDcs = (RIL_UUS_DCS) t;
823
824 status = p.readInt32(&len);
825 if (status != NO_ERROR) {
826 goto invalid;
827 }
828
829 // The java code writes -1 for null arrays
830 if (((int) len) == -1) {
831 uusInfo.uusData = NULL;
832 len = 0;
833 } else {
834 uusInfo.uusData = (char*) p.readInplace(len);
Sooraj Sasindrane0491222016-09-23 11:20:39 -0700835 // check if the length is invalid
836 if (uusInfo.uusData == NULL) {
837 goto invalid;
838 }
Wink Saville74fa3882009-12-22 15:35:41 -0800839 }
840
841 uusInfo.uusLength = len;
842 dial.uusInfo = &uusInfo;
843 }
Wink Saville7bce0822010-01-08 15:20:12 -0800844 sizeOfDial = sizeof(dial);
Wink Saville74fa3882009-12-22 15:35:41 -0800845 }
846
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800847 startRequest;
848 appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
Wink Saville74fa3882009-12-22 15:35:41 -0800849 if (uusPresent) {
850 appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
851 dial.uusInfo->uusType, dial.uusInfo->uusDcs,
852 dial.uusInfo->uusLength);
853 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800854 closeRequest;
855 printRequest(pRI->token, pRI->pCI->requestNumber);
856
Etan Cohend3652192014-06-20 08:28:44 -0700857 CALL_ONREQUEST(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800858
859#ifdef MEMSET_FREED
860 memsetString (dial.address);
861#endif
862
863 free (dial.address);
Wink Saville7f856802009-06-09 10:23:37 -0700864
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800865#ifdef MEMSET_FREED
Wink Saville74fa3882009-12-22 15:35:41 -0800866 memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800867 memset(&dial, 0, sizeof(dial));
868#endif
869
870 return;
871invalid:
872 invalidCommandBlock(pRI);
873 return;
874}
875
Wink Saville7f856802009-06-09 10:23:37 -0700876/**
877 * Callee expects const RIL_SIM_IO *
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800878 * Payload is:
879 * int32_t command
880 * int32_t fileid
881 * String path
882 * int32_t p1, p2, p3
Wink Saville7f856802009-06-09 10:23:37 -0700883 * String data
884 * String pin2
Wink Savillec0114b32011-02-18 10:14:07 -0800885 * String aidPtr
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800886 */
887static void
Wink Savillef4c4d362009-04-02 01:37:03 -0700888dispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
Wink Savillec0114b32011-02-18 10:14:07 -0800889 union RIL_SIM_IO {
890 RIL_SIM_IO_v6 v6;
891 RIL_SIM_IO_v5 v5;
892 } simIO;
893
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800894 int32_t t;
Wink Savillec0114b32011-02-18 10:14:07 -0800895 int size;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800896 status_t status;
897
Robert Greenwalt191e4dc2015-04-29 16:57:39 -0700898#if VDBG
Mark Salyzyndba25612015-04-09 07:18:35 -0700899 RLOGD("dispatchSIM_IO");
Robert Greenwalt191e4dc2015-04-29 16:57:39 -0700900#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800901 memset (&simIO, 0, sizeof(simIO));
902
Wink Saville7f856802009-06-09 10:23:37 -0700903 // note we only check status at the end
904
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800905 status = p.readInt32(&t);
Wink Savillec0114b32011-02-18 10:14:07 -0800906 simIO.v6.command = (int)t;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800907
908 status = p.readInt32(&t);
Wink Savillec0114b32011-02-18 10:14:07 -0800909 simIO.v6.fileid = (int)t;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800910
Wink Savillec0114b32011-02-18 10:14:07 -0800911 simIO.v6.path = strdupReadString(p);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800912
913 status = p.readInt32(&t);
Wink Savillec0114b32011-02-18 10:14:07 -0800914 simIO.v6.p1 = (int)t;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800915
916 status = p.readInt32(&t);
Wink Savillec0114b32011-02-18 10:14:07 -0800917 simIO.v6.p2 = (int)t;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800918
919 status = p.readInt32(&t);
Wink Savillec0114b32011-02-18 10:14:07 -0800920 simIO.v6.p3 = (int)t;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800921
Wink Savillec0114b32011-02-18 10:14:07 -0800922 simIO.v6.data = strdupReadString(p);
923 simIO.v6.pin2 = strdupReadString(p);
924 simIO.v6.aidPtr = strdupReadString(p);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800925
926 startRequest;
Wink Savillec0114b32011-02-18 10:14:07 -0800927 appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
928 simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
929 simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
930 (char*)simIO.v6.data, (char*)simIO.v6.pin2, simIO.v6.aidPtr);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800931 closeRequest;
932 printRequest(pRI->token, pRI->pCI->requestNumber);
Wink Saville7f856802009-06-09 10:23:37 -0700933
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800934 if (status != NO_ERROR) {
935 goto invalid;
936 }
937
Wink Savillec0114b32011-02-18 10:14:07 -0800938 size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
Etan Cohend3652192014-06-20 08:28:44 -0700939 CALL_ONREQUEST(pRI->pCI->requestNumber, &simIO, size, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800940
941#ifdef MEMSET_FREED
Wink Savillec0114b32011-02-18 10:14:07 -0800942 memsetString (simIO.v6.path);
943 memsetString (simIO.v6.data);
944 memsetString (simIO.v6.pin2);
945 memsetString (simIO.v6.aidPtr);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800946#endif
947
Wink Savillec0114b32011-02-18 10:14:07 -0800948 free (simIO.v6.path);
949 free (simIO.v6.data);
950 free (simIO.v6.pin2);
951 free (simIO.v6.aidPtr);
Wink Saville7f856802009-06-09 10:23:37 -0700952
The Android Open Source Project00f06fc2009-03-03 19:32:15 -0800953#ifdef MEMSET_FREED
954 memset(&simIO, 0, sizeof(simIO));
955#endif
956
957 return;
958invalid:
959 invalidCommandBlock(pRI);
960 return;
961}
962
963/**
Shishir Agrawal2458d8d2013-11-27 14:53:05 -0800964 * Callee expects const RIL_SIM_APDU *
965 * Payload is:
966 * int32_t sessionid
967 * int32_t cla
968 * int32_t instruction
969 * int32_t p1, p2, p3
970 * String data
971 */
972static void
973dispatchSIM_APDU (Parcel &p, RequestInfo *pRI) {
974 int32_t t;
975 status_t status;
976 RIL_SIM_APDU apdu;
977
Robert Greenwalt191e4dc2015-04-29 16:57:39 -0700978#if VDBG
Mark Salyzyndba25612015-04-09 07:18:35 -0700979 RLOGD("dispatchSIM_APDU");
Robert Greenwalt191e4dc2015-04-29 16:57:39 -0700980#endif
Shishir Agrawal2458d8d2013-11-27 14:53:05 -0800981 memset (&apdu, 0, sizeof(RIL_SIM_APDU));
982
983 // Note we only check status at the end. Any single failure leads to
984 // subsequent reads filing.
985 status = p.readInt32(&t);
986 apdu.sessionid = (int)t;
987
988 status = p.readInt32(&t);
989 apdu.cla = (int)t;
990
991 status = p.readInt32(&t);
992 apdu.instruction = (int)t;
993
994 status = p.readInt32(&t);
995 apdu.p1 = (int)t;
996
997 status = p.readInt32(&t);
998 apdu.p2 = (int)t;
999
1000 status = p.readInt32(&t);
1001 apdu.p3 = (int)t;
1002
1003 apdu.data = strdupReadString(p);
1004
1005 startRequest;
1006 appendPrintBuf("%ssessionid=%d,cla=%d,ins=%d,p1=%d,p2=%d,p3=%d,data=%s",
1007 printBuf, apdu.sessionid, apdu.cla, apdu.instruction, apdu.p1, apdu.p2,
1008 apdu.p3, (char*)apdu.data);
1009 closeRequest;
1010 printRequest(pRI->token, pRI->pCI->requestNumber);
1011
1012 if (status != NO_ERROR) {
1013 goto invalid;
1014 }
1015
Etan Cohend3652192014-06-20 08:28:44 -07001016 CALL_ONREQUEST(pRI->pCI->requestNumber, &apdu, sizeof(RIL_SIM_APDU), pRI, pRI->socket_id);
Shishir Agrawal2458d8d2013-11-27 14:53:05 -08001017
1018#ifdef MEMSET_FREED
1019 memsetString(apdu.data);
1020#endif
1021 free(apdu.data);
1022
1023#ifdef MEMSET_FREED
1024 memset(&apdu, 0, sizeof(RIL_SIM_APDU));
1025#endif
1026
1027 return;
1028invalid:
1029 invalidCommandBlock(pRI);
1030 return;
1031}
1032
1033
1034/**
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001035 * Callee expects const RIL_CallForwardInfo *
1036 * Payload is:
1037 * int32_t status/action
1038 * int32_t reason
1039 * int32_t serviceCode
1040 * int32_t toa
1041 * String number (0 length -> null)
1042 * int32_t timeSeconds
1043 */
Wink Saville7f856802009-06-09 10:23:37 -07001044static void
Wink Savillef4c4d362009-04-02 01:37:03 -07001045dispatchCallForward(Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001046 RIL_CallForwardInfo cff;
1047 int32_t t;
1048 status_t status;
1049
Mark Salyzyndba25612015-04-09 07:18:35 -07001050 RLOGD("dispatchCallForward");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001051 memset (&cff, 0, sizeof(cff));
1052
Wink Saville7f856802009-06-09 10:23:37 -07001053 // note we only check status at the end
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001054
1055 status = p.readInt32(&t);
1056 cff.status = (int)t;
Wink Saville7f856802009-06-09 10:23:37 -07001057
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001058 status = p.readInt32(&t);
1059 cff.reason = (int)t;
1060
1061 status = p.readInt32(&t);
1062 cff.serviceClass = (int)t;
1063
1064 status = p.readInt32(&t);
1065 cff.toa = (int)t;
1066
1067 cff.number = strdupReadString(p);
1068
1069 status = p.readInt32(&t);
1070 cff.timeSeconds = (int)t;
1071
1072 if (status != NO_ERROR) {
1073 goto invalid;
1074 }
1075
1076 // special case: number 0-length fields is null
1077
1078 if (cff.number != NULL && strlen (cff.number) == 0) {
1079 cff.number = NULL;
1080 }
1081
1082 startRequest;
1083 appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
1084 cff.status, cff.reason, cff.serviceClass, cff.toa,
1085 (char*)cff.number, cff.timeSeconds);
1086 closeRequest;
1087 printRequest(pRI->token, pRI->pCI->requestNumber);
1088
Etan Cohend3652192014-06-20 08:28:44 -07001089 CALL_ONREQUEST(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001090
1091#ifdef MEMSET_FREED
1092 memsetString(cff.number);
1093#endif
1094
1095 free (cff.number);
1096
1097#ifdef MEMSET_FREED
1098 memset(&cff, 0, sizeof(cff));
1099#endif
1100
1101 return;
1102invalid:
1103 invalidCommandBlock(pRI);
1104 return;
1105}
1106
1107
Wink Saville7f856802009-06-09 10:23:37 -07001108static void
Wink Savillef4c4d362009-04-02 01:37:03 -07001109dispatchRaw(Parcel &p, RequestInfo *pRI) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001110 int32_t len;
1111 status_t status;
1112 const void *data;
1113
1114 status = p.readInt32(&len);
1115
1116 if (status != NO_ERROR) {
1117 goto invalid;
1118 }
1119
1120 // The java code writes -1 for null arrays
1121 if (((int)len) == -1) {
1122 data = NULL;
1123 len = 0;
Wink Saville7f856802009-06-09 10:23:37 -07001124 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001125
1126 data = p.readInplace(len);
1127
1128 startRequest;
1129 appendPrintBuf("%sraw_size=%d", printBuf, len);
1130 closeRequest;
1131 printRequest(pRI->token, pRI->pCI->requestNumber);
1132
Etan Cohend3652192014-06-20 08:28:44 -07001133 CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI, pRI->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08001134
1135 return;
1136invalid:
1137 invalidCommandBlock(pRI);
1138 return;
1139}
1140
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001141static status_t
1142constructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) {
Wink Savillef4c4d362009-04-02 01:37:03 -07001143 int32_t t;
1144 uint8_t ut;
1145 status_t status;
1146 int32_t digitCount;
1147 int digitLimit;
Wink Saville7f856802009-06-09 10:23:37 -07001148
Wink Savillef4c4d362009-04-02 01:37:03 -07001149 memset(&rcsm, 0, sizeof(rcsm));
1150
1151 status = p.readInt32(&t);
1152 rcsm.uTeleserviceID = (int) t;
1153
1154 status = p.read(&ut,sizeof(ut));
1155 rcsm.bIsServicePresent = (uint8_t) ut;
1156
1157 status = p.readInt32(&t);
1158 rcsm.uServicecategory = (int) t;
1159
1160 status = p.readInt32(&t);
1161 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1162
1163 status = p.readInt32(&t);
1164 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1165
1166 status = p.readInt32(&t);
1167 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1168
1169 status = p.readInt32(&t);
1170 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1171
1172 status = p.read(&ut,sizeof(ut));
1173 rcsm.sAddress.number_of_digits= (uint8_t) ut;
1174
1175 digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1176 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1177 status = p.read(&ut,sizeof(ut));
1178 rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
1179 }
1180
Wink Saville7f856802009-06-09 10:23:37 -07001181 status = p.readInt32(&t);
Wink Savillef4c4d362009-04-02 01:37:03 -07001182 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1183
Wink Saville7f856802009-06-09 10:23:37 -07001184 status = p.read(&ut,sizeof(ut));
Wink Savillef4c4d362009-04-02 01:37:03 -07001185 rcsm.sSubAddress.odd = (uint8_t) ut;
1186
1187 status = p.read(&ut,sizeof(ut));
1188 rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
1189
1190 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
Wink Saville7f856802009-06-09 10:23:37 -07001191 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1192 status = p.read(&ut,sizeof(ut));
Wink Savillef4c4d362009-04-02 01:37:03 -07001193 rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
1194 }
1195
Wink Saville7f856802009-06-09 10:23:37 -07001196 status = p.readInt32(&t);
Wink Savillef4c4d362009-04-02 01:37:03 -07001197 rcsm.uBearerDataLen = (int) t;
1198
1199 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
Wink Saville7f856802009-06-09 10:23:37 -07001200 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1201 status = p.read(&ut, sizeof(ut));
Wink Savillef4c4d362009-04-02 01:37:03 -07001202 rcsm.aBearerData[digitCount] = (uint8_t) ut;
1203 }
1204
1205 if (status != NO_ERROR) {
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001206 return status;
Wink Savillef4c4d362009-04-02 01:37:03 -07001207 }
1208
1209 startRequest;
1210 appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
Wink Saville1b5fd232009-04-22 14:50:00 -07001211 sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
Wink Savillef4c4d362009-04-02 01:37:03 -07001212 printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
Wink Saville1b5fd232009-04-22 14:50:00 -07001213 rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
Wink Savillef4c4d362009-04-02 01:37:03 -07001214 closeRequest;
Wink Saville7f856802009-06-09 10:23:37 -07001215
Wink Savillef4c4d362009-04-02 01:37:03 -07001216 printRequest(pRI->token, pRI->pCI->requestNumber);
1217
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001218 return status;
1219}
1220
1221static void
1222dispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
1223 RIL_CDMA_SMS_Message rcsm;
1224
Mark Salyzyndba25612015-04-09 07:18:35 -07001225 RLOGD("dispatchCdmaSms");
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001226 if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1227 goto invalid;
1228 }
1229
Etan Cohend3652192014-06-20 08:28:44 -07001230 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI, pRI->socket_id);
Wink Savillef4c4d362009-04-02 01:37:03 -07001231
1232#ifdef MEMSET_FREED
1233 memset(&rcsm, 0, sizeof(rcsm));
1234#endif
1235
1236 return;
1237
1238invalid:
1239 invalidCommandBlock(pRI);
1240 return;
1241}
1242
Wink Saville7f856802009-06-09 10:23:37 -07001243static void
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001244dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1245 RIL_IMS_SMS_Message rism;
1246 RIL_CDMA_SMS_Message rcsm;
1247
Mark Salyzyndba25612015-04-09 07:18:35 -07001248 RLOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001249
1250 if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1251 goto invalid;
1252 }
1253 memset(&rism, 0, sizeof(rism));
1254 rism.tech = RADIO_TECH_3GPP2;
1255 rism.retry = retry;
1256 rism.messageRef = messageRef;
1257 rism.message.cdmaMessage = &rcsm;
1258
Etan Cohend3652192014-06-20 08:28:44 -07001259 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001260 sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
Etan Cohend3652192014-06-20 08:28:44 -07001261 +sizeof(rcsm),pRI, pRI->socket_id);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001262
1263#ifdef MEMSET_FREED
1264 memset(&rcsm, 0, sizeof(rcsm));
1265 memset(&rism, 0, sizeof(rism));
1266#endif
1267
1268 return;
1269
1270invalid:
1271 invalidCommandBlock(pRI);
1272 return;
1273}
1274
1275static void
1276dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1277 RIL_IMS_SMS_Message rism;
1278 int32_t countStrings;
1279 status_t status;
1280 size_t datalen;
1281 char **pStrings;
Mark Salyzyndba25612015-04-09 07:18:35 -07001282 RLOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001283
1284 status = p.readInt32 (&countStrings);
1285
1286 if (status != NO_ERROR) {
1287 goto invalid;
1288 }
1289
1290 memset(&rism, 0, sizeof(rism));
1291 rism.tech = RADIO_TECH_3GPP;
1292 rism.retry = retry;
1293 rism.messageRef = messageRef;
1294
1295 startRequest;
Etan Cohen5d891b72014-02-27 17:25:17 -08001296 appendPrintBuf("%stech=%d, retry=%d, messageRef=%d, ", printBuf,
1297 (int)rism.tech, (int)rism.retry, rism.messageRef);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001298 if (countStrings == 0) {
1299 // just some non-null pointer
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001300 pStrings = (char **)calloc(1, sizeof(char *));
Sanket Padawe55227b52016-02-29 10:09:26 -08001301 if (pStrings == NULL) {
1302 RLOGE("Memory allocation failed for request %s",
1303 requestToString(pRI->pCI->requestNumber));
1304 closeRequest;
1305 return;
1306 }
1307
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001308 datalen = 0;
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001309 } else if (countStrings < 0) {
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001310 pStrings = NULL;
1311 datalen = 0;
1312 } else {
Meng Wangef966a32016-06-20 17:38:18 -07001313 if ((size_t)countStrings > (INT_MAX/sizeof(char *))) {
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001314 RLOGE("Invalid value of countStrings: \n");
1315 closeRequest;
1316 return;
1317 }
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001318 datalen = sizeof(char *) * countStrings;
1319
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001320 pStrings = (char **)calloc(countStrings, sizeof(char *));
Sanket Padawe55227b52016-02-29 10:09:26 -08001321 if (pStrings == NULL) {
1322 RLOGE("Memory allocation failed for request %s",
1323 requestToString(pRI->pCI->requestNumber));
1324 closeRequest;
1325 return;
1326 }
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001327
1328 for (int i = 0 ; i < countStrings ; i++) {
1329 pStrings[i] = strdupReadString(p);
1330 appendPrintBuf("%s%s,", printBuf, pStrings[i]);
1331 }
1332 }
1333 removeLastChar;
1334 closeRequest;
1335 printRequest(pRI->token, pRI->pCI->requestNumber);
1336
1337 rism.message.gsmMessage = pStrings;
Etan Cohend3652192014-06-20 08:28:44 -07001338 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001339 sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
Etan Cohend3652192014-06-20 08:28:44 -07001340 +datalen, pRI, pRI->socket_id);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001341
1342 if (pStrings != NULL) {
1343 for (int i = 0 ; i < countStrings ; i++) {
1344#ifdef MEMSET_FREED
1345 memsetString (pStrings[i]);
1346#endif
1347 free(pStrings[i]);
1348 }
1349
1350#ifdef MEMSET_FREED
1351 memset(pStrings, 0, datalen);
1352#endif
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001353 free(pStrings);
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001354 }
1355
1356#ifdef MEMSET_FREED
1357 memset(&rism, 0, sizeof(rism));
1358#endif
1359 return;
1360invalid:
1361 ALOGE("dispatchImsGsmSms invalid block");
1362 invalidCommandBlock(pRI);
1363 return;
1364}
1365
1366static void
1367dispatchImsSms(Parcel &p, RequestInfo *pRI) {
1368 int32_t t;
1369 status_t status = p.readInt32(&t);
1370 RIL_RadioTechnologyFamily format;
1371 uint8_t retry;
1372 int32_t messageRef;
1373
Mark Salyzyndba25612015-04-09 07:18:35 -07001374 RLOGD("dispatchImsSms");
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07001375 if (status != NO_ERROR) {
1376 goto invalid;
1377 }
1378 format = (RIL_RadioTechnologyFamily) t;
1379
1380 // read retry field
1381 status = p.read(&retry,sizeof(retry));
1382 if (status != NO_ERROR) {
1383 goto invalid;
1384 }
1385 // read messageRef field
1386 status = p.read(&messageRef,sizeof(messageRef));
1387 if (status != NO_ERROR) {
1388 goto invalid;
1389 }
1390
1391 if (RADIO_TECH_3GPP == format) {
1392 dispatchImsGsmSms(p, pRI, retry, messageRef);
1393 } else if (RADIO_TECH_3GPP2 == format) {
1394 dispatchImsCdmaSms(p, pRI, retry, messageRef);
1395 } else {
1396 ALOGE("requestImsSendSMS invalid format value =%d", format);
1397 }
1398
1399 return;
1400
1401invalid:
1402 invalidCommandBlock(pRI);
1403 return;
1404}
1405
1406static void
Wink Savillef4c4d362009-04-02 01:37:03 -07001407dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
1408 RIL_CDMA_SMS_Ack rcsa;
1409 int32_t t;
1410 status_t status;
1411 int32_t digitCount;
1412
Mark Salyzyndba25612015-04-09 07:18:35 -07001413 RLOGD("dispatchCdmaSmsAck");
Wink Savillef4c4d362009-04-02 01:37:03 -07001414 memset(&rcsa, 0, sizeof(rcsa));
1415
1416 status = p.readInt32(&t);
1417 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
1418
1419 status = p.readInt32(&t);
1420 rcsa.uSMSCauseCode = (int) t;
1421
1422 if (status != NO_ERROR) {
1423 goto invalid;
1424 }
1425
1426 startRequest;
Wink Saville1b5fd232009-04-22 14:50:00 -07001427 appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
1428 printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
Wink Savillef4c4d362009-04-02 01:37:03 -07001429 closeRequest;
1430
1431 printRequest(pRI->token, pRI->pCI->requestNumber);
1432
Etan Cohend3652192014-06-20 08:28:44 -07001433 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI, pRI->socket_id);
Wink Savillef4c4d362009-04-02 01:37:03 -07001434
1435#ifdef MEMSET_FREED
1436 memset(&rcsa, 0, sizeof(rcsa));
1437#endif
1438
1439 return;
1440
1441invalid:
1442 invalidCommandBlock(pRI);
1443 return;
1444}
1445
Wink Savillea592eeb2009-05-22 13:26:36 -07001446static void
1447dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1448 int32_t t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001449 status_t status;
Wink Savillea592eeb2009-05-22 13:26:36 -07001450 int32_t num;
Wink Savillef4c4d362009-04-02 01:37:03 -07001451
Wink Savillea592eeb2009-05-22 13:26:36 -07001452 status = p.readInt32(&num);
Wink Savillef4c4d362009-04-02 01:37:03 -07001453 if (status != NO_ERROR) {
1454 goto invalid;
1455 }
1456
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001457 {
1458 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1459 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Wink Savillea592eeb2009-05-22 13:26:36 -07001460
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001461 startRequest;
1462 for (int i = 0 ; i < num ; i++ ) {
1463 gsmBciPtrs[i] = &gsmBci[i];
Wink Savillef4c4d362009-04-02 01:37:03 -07001464
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001465 status = p.readInt32(&t);
1466 gsmBci[i].fromServiceId = (int) t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001467
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001468 status = p.readInt32(&t);
1469 gsmBci[i].toServiceId = (int) t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001470
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001471 status = p.readInt32(&t);
1472 gsmBci[i].fromCodeScheme = (int) t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001473
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001474 status = p.readInt32(&t);
1475 gsmBci[i].toCodeScheme = (int) t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001476
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001477 status = p.readInt32(&t);
1478 gsmBci[i].selected = (uint8_t) t;
Wink Savillef4c4d362009-04-02 01:37:03 -07001479
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001480 appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
1481 fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
1482 gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
1483 gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
1484 gsmBci[i].selected);
1485 }
1486 closeRequest;
Wink Savillef4c4d362009-04-02 01:37:03 -07001487
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001488 if (status != NO_ERROR) {
1489 goto invalid;
1490 }
Wink Savillef4c4d362009-04-02 01:37:03 -07001491
Etan Cohend3652192014-06-20 08:28:44 -07001492 CALL_ONREQUEST(pRI->pCI->requestNumber,
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001493 gsmBciPtrs,
1494 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
Etan Cohend3652192014-06-20 08:28:44 -07001495 pRI, pRI->socket_id);
Wink Savillef4c4d362009-04-02 01:37:03 -07001496
1497#ifdef MEMSET_FREED
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001498 memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
1499 memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
Wink Savillef4c4d362009-04-02 01:37:03 -07001500#endif
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001501 }
Wink Savillef4c4d362009-04-02 01:37:03 -07001502
1503 return;
1504
1505invalid:
1506 invalidCommandBlock(pRI);
1507 return;
Wink Savillea592eeb2009-05-22 13:26:36 -07001508}
Wink Savillef4c4d362009-04-02 01:37:03 -07001509
Wink Savillea592eeb2009-05-22 13:26:36 -07001510static void
1511dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1512 int32_t t;
1513 status_t status;
1514 int32_t num;
1515
1516 status = p.readInt32(&num);
1517 if (status != NO_ERROR) {
1518 goto invalid;
1519 }
1520
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001521 {
1522 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1523 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Wink Savillea592eeb2009-05-22 13:26:36 -07001524
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001525 startRequest;
1526 for (int i = 0 ; i < num ; i++ ) {
1527 cdmaBciPtrs[i] = &cdmaBci[i];
Wink Savillea592eeb2009-05-22 13:26:36 -07001528
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001529 status = p.readInt32(&t);
1530 cdmaBci[i].service_category = (int) t;
Wink Savillea592eeb2009-05-22 13:26:36 -07001531
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001532 status = p.readInt32(&t);
1533 cdmaBci[i].language = (int) t;
Wink Savillea592eeb2009-05-22 13:26:36 -07001534
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001535 status = p.readInt32(&t);
1536 cdmaBci[i].selected = (uint8_t) t;
Wink Savillea592eeb2009-05-22 13:26:36 -07001537
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001538 appendPrintBuf("%s [%d: service_category=%d, language =%d, \
1539 entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
1540 cdmaBci[i].language, cdmaBci[i].selected);
1541 }
1542 closeRequest;
Wink Savillea592eeb2009-05-22 13:26:36 -07001543
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001544 if (status != NO_ERROR) {
1545 goto invalid;
1546 }
Wink Savillea592eeb2009-05-22 13:26:36 -07001547
Etan Cohend3652192014-06-20 08:28:44 -07001548 CALL_ONREQUEST(pRI->pCI->requestNumber,
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001549 cdmaBciPtrs,
1550 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
Etan Cohend3652192014-06-20 08:28:44 -07001551 pRI, pRI->socket_id);
Wink Savillea592eeb2009-05-22 13:26:36 -07001552
1553#ifdef MEMSET_FREED
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001554 memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
1555 memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
Wink Savillea592eeb2009-05-22 13:26:36 -07001556#endif
Kevin Schoedel96dcdbc2012-05-25 17:00:17 -04001557 }
Wink Savillea592eeb2009-05-22 13:26:36 -07001558
1559 return;
1560
1561invalid:
1562 invalidCommandBlock(pRI);
1563 return;
Wink Savillef4c4d362009-04-02 01:37:03 -07001564}
1565
1566static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1567 RIL_CDMA_SMS_WriteArgs rcsw;
1568 int32_t t;
1569 uint32_t ut;
1570 uint8_t uct;
1571 status_t status;
1572 int32_t digitCount;
Sukanya Rajkhowa605c7842013-10-29 14:55:30 +08001573 int32_t digitLimit;
Wink Savillef4c4d362009-04-02 01:37:03 -07001574
1575 memset(&rcsw, 0, sizeof(rcsw));
1576
1577 status = p.readInt32(&t);
1578 rcsw.status = t;
Wink Savillea592eeb2009-05-22 13:26:36 -07001579
Wink Savillef4c4d362009-04-02 01:37:03 -07001580 status = p.readInt32(&t);
1581 rcsw.message.uTeleserviceID = (int) t;
1582
1583 status = p.read(&uct,sizeof(uct));
1584 rcsw.message.bIsServicePresent = (uint8_t) uct;
1585
1586 status = p.readInt32(&t);
1587 rcsw.message.uServicecategory = (int) t;
1588
1589 status = p.readInt32(&t);
1590 rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1591
1592 status = p.readInt32(&t);
1593 rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1594
1595 status = p.readInt32(&t);
1596 rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1597
1598 status = p.readInt32(&t);
1599 rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1600
1601 status = p.read(&uct,sizeof(uct));
1602 rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1603
Sukanya Rajkhowa605c7842013-10-29 14:55:30 +08001604 digitLimit = MIN((rcsw.message.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1605
1606 for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
Wink Savillef4c4d362009-04-02 01:37:03 -07001607 status = p.read(&uct,sizeof(uct));
1608 rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1609 }
1610
Wink Savillea592eeb2009-05-22 13:26:36 -07001611 status = p.readInt32(&t);
Wink Savillef4c4d362009-04-02 01:37:03 -07001612 rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1613
Wink Savillea592eeb2009-05-22 13:26:36 -07001614 status = p.read(&uct,sizeof(uct));
Wink Savillef4c4d362009-04-02 01:37:03 -07001615 rcsw.message.sSubAddress.odd = (uint8_t) uct;
1616
1617 status = p.read(&uct,sizeof(uct));
1618 rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1619
Sukanya Rajkhowa605c7842013-10-29 14:55:30 +08001620 digitLimit = MIN((rcsw.message.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1621
1622 for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
Wink Savillea592eeb2009-05-22 13:26:36 -07001623 status = p.read(&uct,sizeof(uct));
Wink Savillef4c4d362009-04-02 01:37:03 -07001624 rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1625 }
1626
Wink Savillea592eeb2009-05-22 13:26:36 -07001627 status = p.readInt32(&t);
Wink Savillef4c4d362009-04-02 01:37:03 -07001628 rcsw.message.uBearerDataLen = (int) t;
1629
Sukanya Rajkhowa605c7842013-10-29 14:55:30 +08001630 digitLimit = MIN((rcsw.message.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1631
1632 for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
Wink Savillea592eeb2009-05-22 13:26:36 -07001633 status = p.read(&uct, sizeof(uct));
Wink Savillef4c4d362009-04-02 01:37:03 -07001634 rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1635 }
1636
1637 if (status != NO_ERROR) {
1638 goto invalid;
1639 }
1640
1641 startRequest;
Wink Saville1b5fd232009-04-22 14:50:00 -07001642 appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
1643 message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
1644 message.sAddress.number_mode=%d, \
1645 message.sAddress.number_type=%d, ",
Wink Savillef4c4d362009-04-02 01:37:03 -07001646 printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
Wink Saville1b5fd232009-04-22 14:50:00 -07001647 rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
1648 rcsw.message.sAddress.number_mode,
1649 rcsw.message.sAddress.number_type);
Wink Savillef4c4d362009-04-02 01:37:03 -07001650 closeRequest;
1651
1652 printRequest(pRI->token, pRI->pCI->requestNumber);
1653
Etan Cohend3652192014-06-20 08:28:44 -07001654 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI, pRI->socket_id);
Wink Savillef4c4d362009-04-02 01:37:03 -07001655
1656#ifdef MEMSET_FREED
1657 memset(&rcsw, 0, sizeof(rcsw));
1658#endif
1659
1660 return;
1661
1662invalid:
1663 invalidCommandBlock(pRI);
1664 return;
1665
1666}
1667
Lorenzo Colitti4f81dcf2010-09-01 19:38:57 -07001668// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
1669// Version 4 of the RIL interface adds a new PDP type parameter to support
1670// IPv6 and dual-stack PDP contexts. When dealing with a previous version of
1671// RIL, remove the parameter from the request.
1672static void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
1673 // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
1674 const int numParamsRilV3 = 6;
1675
1676 // The first bytes of the RIL parcel contain the request number and the
1677 // serial number - see processCommandBuffer(). Copy them over too.
1678 int pos = p.dataPosition();
1679
1680 int numParams = p.readInt32();
1681 if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
1682 Parcel p2;
1683 p2.appendFrom(&p, 0, pos);
1684 p2.writeInt32(numParamsRilV3);
1685 for(int i = 0; i < numParamsRilV3; i++) {
1686 p2.writeString16(p.readString16());
1687 }
1688 p2.setDataPosition(pos);
1689 dispatchStrings(p2, pRI);
1690 } else {
Lorenzo Colitti57ce1f22010-09-13 12:23:50 -07001691 p.setDataPosition(pos);
Lorenzo Colitti4f81dcf2010-09-01 19:38:57 -07001692 dispatchStrings(p, pRI);
1693 }
1694}
1695
Sungmin Choi75697532013-04-26 15:04:45 -07001696static void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
1697{
1698 RIL_InitialAttachApn pf;
1699 int32_t t;
1700 status_t status;
1701
1702 memset(&pf, 0, sizeof(pf));
1703
1704 pf.apn = strdupReadString(p);
1705 pf.protocol = strdupReadString(p);
1706
1707 status = p.readInt32(&t);
1708 pf.authtype = (int) t;
1709
1710 pf.username = strdupReadString(p);
1711 pf.password = strdupReadString(p);
1712
1713 startRequest;
Etan Cohen5d891b72014-02-27 17:25:17 -08001714 appendPrintBuf("%sapn=%s, protocol=%s, authtype=%d, username=%s, password=%s",
1715 printBuf, pf.apn, pf.protocol, pf.authtype, pf.username, pf.password);
Sungmin Choi75697532013-04-26 15:04:45 -07001716 closeRequest;
1717 printRequest(pRI->token, pRI->pCI->requestNumber);
1718
1719 if (status != NO_ERROR) {
1720 goto invalid;
1721 }
Etan Cohend3652192014-06-20 08:28:44 -07001722 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
Sungmin Choi75697532013-04-26 15:04:45 -07001723
1724#ifdef MEMSET_FREED
1725 memsetString(pf.apn);
1726 memsetString(pf.protocol);
1727 memsetString(pf.username);
1728 memsetString(pf.password);
1729#endif
1730
1731 free(pf.apn);
1732 free(pf.protocol);
1733 free(pf.username);
1734 free(pf.password);
1735
1736#ifdef MEMSET_FREED
1737 memset(&pf, 0, sizeof(pf));
1738#endif
1739
1740 return;
1741invalid:
1742 invalidCommandBlock(pRI);
1743 return;
1744}
1745
Jake Hamby8a4a2332014-01-15 13:12:05 -08001746static void dispatchNVReadItem(Parcel &p, RequestInfo *pRI) {
1747 RIL_NV_ReadItem nvri;
1748 int32_t t;
1749 status_t status;
1750
1751 memset(&nvri, 0, sizeof(nvri));
1752
1753 status = p.readInt32(&t);
1754 nvri.itemID = (RIL_NV_Item) t;
1755
1756 if (status != NO_ERROR) {
1757 goto invalid;
1758 }
1759
1760 startRequest;
1761 appendPrintBuf("%snvri.itemID=%d, ", printBuf, nvri.itemID);
1762 closeRequest;
1763
1764 printRequest(pRI->token, pRI->pCI->requestNumber);
1765
Etan Cohend3652192014-06-20 08:28:44 -07001766 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, pRI->socket_id);
Jake Hamby8a4a2332014-01-15 13:12:05 -08001767
1768#ifdef MEMSET_FREED
1769 memset(&nvri, 0, sizeof(nvri));
1770#endif
1771
1772 return;
1773
1774invalid:
1775 invalidCommandBlock(pRI);
1776 return;
1777}
1778
1779static void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI) {
1780 RIL_NV_WriteItem nvwi;
1781 int32_t t;
1782 status_t status;
1783
1784 memset(&nvwi, 0, sizeof(nvwi));
1785
1786 status = p.readInt32(&t);
1787 nvwi.itemID = (RIL_NV_Item) t;
1788
1789 nvwi.value = strdupReadString(p);
1790
1791 if (status != NO_ERROR || nvwi.value == NULL) {
1792 goto invalid;
1793 }
1794
1795 startRequest;
1796 appendPrintBuf("%snvwi.itemID=%d, value=%s, ", printBuf, nvwi.itemID,
1797 nvwi.value);
1798 closeRequest;
1799
1800 printRequest(pRI->token, pRI->pCI->requestNumber);
1801
Etan Cohend3652192014-06-20 08:28:44 -07001802 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, pRI->socket_id);
Jake Hamby8a4a2332014-01-15 13:12:05 -08001803
1804#ifdef MEMSET_FREED
1805 memsetString(nvwi.value);
1806#endif
1807
1808 free(nvwi.value);
1809
1810#ifdef MEMSET_FREED
1811 memset(&nvwi, 0, sizeof(nvwi));
1812#endif
1813
1814 return;
1815
1816invalid:
1817 invalidCommandBlock(pRI);
1818 return;
1819}
1820
1821
Etan Cohend3652192014-06-20 08:28:44 -07001822static void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI) {
1823 RIL_SelectUiccSub uicc_sub;
1824 status_t status;
1825 int32_t t;
1826 memset(&uicc_sub, 0, sizeof(uicc_sub));
1827
1828 status = p.readInt32(&t);
1829 if (status != NO_ERROR) {
1830 goto invalid;
1831 }
1832 uicc_sub.slot = (int) t;
1833
1834 status = p.readInt32(&t);
1835 if (status != NO_ERROR) {
1836 goto invalid;
1837 }
1838 uicc_sub.app_index = (int) t;
1839
1840 status = p.readInt32(&t);
1841 if (status != NO_ERROR) {
1842 goto invalid;
1843 }
1844 uicc_sub.sub_type = (RIL_SubscriptionType) t;
1845
1846 status = p.readInt32(&t);
1847 if (status != NO_ERROR) {
1848 goto invalid;
1849 }
1850 uicc_sub.act_status = (RIL_UiccSubActStatus) t;
1851
1852 startRequest;
1853 appendPrintBuf("slot=%d, app_index=%d, act_status = %d", uicc_sub.slot, uicc_sub.app_index,
1854 uicc_sub.act_status);
1855 RLOGD("dispatchUiccSubscription, slot=%d, app_index=%d, act_status = %d", uicc_sub.slot,
1856 uicc_sub.app_index, uicc_sub.act_status);
1857 closeRequest;
1858 printRequest(pRI->token, pRI->pCI->requestNumber);
1859
1860 CALL_ONREQUEST(pRI->pCI->requestNumber, &uicc_sub, sizeof(uicc_sub), pRI, pRI->socket_id);
1861
1862#ifdef MEMSET_FREED
1863 memset(&uicc_sub, 0, sizeof(uicc_sub));
1864#endif
1865 return;
1866
1867invalid:
1868 invalidCommandBlock(pRI);
1869 return;
1870}
1871
Amit Mahajan90530a62014-07-01 15:54:08 -07001872static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI)
1873{
1874 RIL_SimAuthentication pf;
1875 int32_t t;
1876 status_t status;
1877
1878 memset(&pf, 0, sizeof(pf));
1879
1880 status = p.readInt32(&t);
1881 pf.authContext = (int) t;
1882 pf.authData = strdupReadString(p);
1883 pf.aid = strdupReadString(p);
1884
1885 startRequest;
1886 appendPrintBuf("authContext=%s, authData=%s, aid=%s", pf.authContext, pf.authData, pf.aid);
1887 closeRequest;
1888 printRequest(pRI->token, pRI->pCI->requestNumber);
1889
1890 if (status != NO_ERROR) {
1891 goto invalid;
1892 }
1893 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
1894
1895#ifdef MEMSET_FREED
1896 memsetString(pf.authData);
1897 memsetString(pf.aid);
1898#endif
1899
1900 free(pf.authData);
1901 free(pf.aid);
1902
1903#ifdef MEMSET_FREED
1904 memset(&pf, 0, sizeof(pf));
1905#endif
1906
1907 return;
1908invalid:
1909 invalidCommandBlock(pRI);
1910 return;
1911}
1912
Amit Mahajanc796e222014-08-13 16:54:01 +00001913static void dispatchDataProfile(Parcel &p, RequestInfo *pRI) {
1914 int32_t t;
1915 status_t status;
1916 int32_t num;
1917
1918 status = p.readInt32(&num);
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001919 if (status != NO_ERROR || num < 0) {
Amit Mahajanc796e222014-08-13 16:54:01 +00001920 goto invalid;
1921 }
1922
1923 {
Sanket Padawe55227b52016-02-29 10:09:26 -08001924 RIL_DataProfileInfo *dataProfiles =
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001925 (RIL_DataProfileInfo *)calloc(num, sizeof(RIL_DataProfileInfo));
Sanket Padawe55227b52016-02-29 10:09:26 -08001926 if (dataProfiles == NULL) {
1927 RLOGE("Memory allocation failed for request %s",
1928 requestToString(pRI->pCI->requestNumber));
1929 return;
1930 }
1931 RIL_DataProfileInfo **dataProfilePtrs =
Sanket Padawe0cfc5532016-03-07 17:12:19 -08001932 (RIL_DataProfileInfo **)calloc(num, sizeof(RIL_DataProfileInfo *));
Sanket Padawe55227b52016-02-29 10:09:26 -08001933 if (dataProfilePtrs == NULL) {
1934 RLOGE("Memory allocation failed for request %s",
1935 requestToString(pRI->pCI->requestNumber));
1936 free(dataProfiles);
1937 return;
1938 }
Amit Mahajanc796e222014-08-13 16:54:01 +00001939
1940 startRequest;
1941 for (int i = 0 ; i < num ; i++ ) {
1942 dataProfilePtrs[i] = &dataProfiles[i];
1943
1944 status = p.readInt32(&t);
1945 dataProfiles[i].profileId = (int) t;
1946
1947 dataProfiles[i].apn = strdupReadString(p);
1948 dataProfiles[i].protocol = strdupReadString(p);
1949 status = p.readInt32(&t);
1950 dataProfiles[i].authType = (int) t;
1951
1952 dataProfiles[i].user = strdupReadString(p);
1953 dataProfiles[i].password = strdupReadString(p);
1954
1955 status = p.readInt32(&t);
1956 dataProfiles[i].type = (int) t;
1957
1958 status = p.readInt32(&t);
1959 dataProfiles[i].maxConnsTime = (int) t;
1960 status = p.readInt32(&t);
1961 dataProfiles[i].maxConns = (int) t;
1962 status = p.readInt32(&t);
1963 dataProfiles[i].waitTime = (int) t;
1964
1965 status = p.readInt32(&t);
1966 dataProfiles[i].enabled = (int) t;
1967
1968 appendPrintBuf("%s [%d: profileId=%d, apn =%s, protocol =%s, authType =%d, \
1969 user =%s, password =%s, type =%d, maxConnsTime =%d, maxConns =%d, \
1970 waitTime =%d, enabled =%d]", printBuf, i, dataProfiles[i].profileId,
1971 dataProfiles[i].apn, dataProfiles[i].protocol, dataProfiles[i].authType,
1972 dataProfiles[i].user, dataProfiles[i].password, dataProfiles[i].type,
1973 dataProfiles[i].maxConnsTime, dataProfiles[i].maxConns,
1974 dataProfiles[i].waitTime, dataProfiles[i].enabled);
1975 }
1976 closeRequest;
1977 printRequest(pRI->token, pRI->pCI->requestNumber);
1978
1979 if (status != NO_ERROR) {
Sanket Padawe55227b52016-02-29 10:09:26 -08001980 free(dataProfiles);
1981 free(dataProfilePtrs);
Amit Mahajanc796e222014-08-13 16:54:01 +00001982 goto invalid;
1983 }
1984 CALL_ONREQUEST(pRI->pCI->requestNumber,
1985 dataProfilePtrs,
1986 num * sizeof(RIL_DataProfileInfo *),
1987 pRI, pRI->socket_id);
1988
1989#ifdef MEMSET_FREED
1990 memset(dataProfiles, 0, num * sizeof(RIL_DataProfileInfo));
1991 memset(dataProfilePtrs, 0, num * sizeof(RIL_DataProfileInfo *));
1992#endif
Sanket Padawe55227b52016-02-29 10:09:26 -08001993 free(dataProfiles);
1994 free(dataProfilePtrs);
Amit Mahajanc796e222014-08-13 16:54:01 +00001995 }
1996
1997 return;
1998
1999invalid:
2000 invalidCommandBlock(pRI);
2001 return;
2002}
2003
Wink Saville8b4e4f72014-10-17 15:01:45 -07002004static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI){
2005 RIL_RadioCapability rc;
2006 int32_t t;
2007 status_t status;
2008
2009 memset (&rc, 0, sizeof(RIL_RadioCapability));
2010
2011 status = p.readInt32(&t);
2012 rc.version = (int)t;
2013 if (status != NO_ERROR) {
2014 goto invalid;
2015 }
2016
2017 status = p.readInt32(&t);
2018 rc.session= (int)t;
2019 if (status != NO_ERROR) {
2020 goto invalid;
2021 }
2022
2023 status = p.readInt32(&t);
2024 rc.phase= (int)t;
2025 if (status != NO_ERROR) {
2026 goto invalid;
2027 }
2028
2029 status = p.readInt32(&t);
2030 rc.rat = (int)t;
2031 if (status != NO_ERROR) {
2032 goto invalid;
2033 }
2034
2035 status = readStringFromParcelInplace(p, rc.logicalModemUuid, sizeof(rc.logicalModemUuid));
2036 if (status != NO_ERROR) {
2037 goto invalid;
2038 }
2039
2040 status = p.readInt32(&t);
2041 rc.status = (int)t;
2042
2043 if (status != NO_ERROR) {
2044 goto invalid;
2045 }
2046
2047 startRequest;
2048 appendPrintBuf("%s [version:%d, session:%d, phase:%d, rat:%d, \
Chih-Wei Huang8593f262015-10-02 15:09:52 +08002049 logicalModemUuid:%s, status:%d", printBuf, rc.version, rc.session,
Legler Wu8caf06f2014-10-29 14:02:14 +08002050 rc.phase, rc.rat, rc.logicalModemUuid, rc.session);
Wink Saville8b4e4f72014-10-17 15:01:45 -07002051
2052 closeRequest;
2053 printRequest(pRI->token, pRI->pCI->requestNumber);
2054
2055 CALL_ONREQUEST(pRI->pCI->requestNumber,
2056 &rc,
2057 sizeof(RIL_RadioCapability),
2058 pRI, pRI->socket_id);
2059 return;
2060invalid:
2061 invalidCommandBlock(pRI);
2062 return;
2063}
2064
Meng Wangb4e34312016-05-12 14:54:36 -07002065/**
2066 * Callee expects const RIL_CarrierRestrictions *
2067 */
2068static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI) {
2069 RIL_CarrierRestrictions cr;
2070 RIL_Carrier * allowed_carriers = NULL;
2071 RIL_Carrier * excluded_carriers = NULL;
2072 int32_t t;
2073 status_t status;
2074
2075 memset(&cr, 0, sizeof(RIL_CarrierRestrictions));
2076
Robert Greenwalt27e99c52016-06-01 16:31:38 -07002077 if (s_callbacks.version < 14) {
Meng Wangb4e34312016-05-12 14:54:36 -07002078 RLOGE("Unsuppoted RIL version %d, min version expected %d",
Robert Greenwalt27e99c52016-06-01 16:31:38 -07002079 s_callbacks.version, 14);
Meng Wangdf8398c2016-05-25 12:59:15 -07002080 RIL_onRequestComplete(pRI, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
2081 return;
Meng Wangb4e34312016-05-12 14:54:36 -07002082 }
2083
2084 status = p.readInt32(&t);
2085 if (status != NO_ERROR) {
2086 goto invalid;
2087 }
2088 allowed_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
2089 if (allowed_carriers == NULL) {
2090 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
2091 goto exit;
2092 }
2093 cr.len_allowed_carriers = t;
2094 cr.allowed_carriers = allowed_carriers;
2095
2096 status = p.readInt32(&t);
2097 if (status != NO_ERROR) {
2098 goto invalid;
2099 }
2100 excluded_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
2101 if (excluded_carriers == NULL) {
2102 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
2103 goto exit;
2104 }
2105 cr.len_excluded_carriers = t;
2106 cr.excluded_carriers = excluded_carriers;
2107
Meng Wang5d703cb2016-06-08 11:53:25 -07002108 startRequest;
2109 appendPrintBuf("%s len_allowed_carriers:%d, len_excluded_carriers:%d,",
2110 printBuf, cr.len_allowed_carriers, cr.len_excluded_carriers);
2111
2112 appendPrintBuf("%s allowed_carriers:", printBuf);
Meng Wangb4e34312016-05-12 14:54:36 -07002113 for (int32_t i = 0; i < cr.len_allowed_carriers; i++) {
2114 RIL_Carrier *p_cr = allowed_carriers + i;
Meng Wang5d703cb2016-06-08 11:53:25 -07002115 p_cr->mcc = strdupReadString(p);
2116 p_cr->mnc = strdupReadString(p);
Meng Wangb4e34312016-05-12 14:54:36 -07002117 status = p.readInt32(&t);
2118 p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
2119 if (status != NO_ERROR) {
2120 goto invalid;
2121 }
Meng Wang5d703cb2016-06-08 11:53:25 -07002122 p_cr->match_data = strdupReadString(p);
2123 appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
2124 printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
Meng Wangb4e34312016-05-12 14:54:36 -07002125 }
2126
2127 for (int32_t i = 0; i < cr.len_excluded_carriers; i++) {
2128 RIL_Carrier *p_cr = excluded_carriers + i;
Meng Wang5d703cb2016-06-08 11:53:25 -07002129 p_cr->mcc = strdupReadString(p);
2130 p_cr->mnc = strdupReadString(p);
Meng Wangb4e34312016-05-12 14:54:36 -07002131 status = p.readInt32(&t);
2132 p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
2133 if (status != NO_ERROR) {
2134 goto invalid;
2135 }
Meng Wang5d703cb2016-06-08 11:53:25 -07002136 p_cr->match_data = strdupReadString(p);
2137 appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
2138 printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
Meng Wangb4e34312016-05-12 14:54:36 -07002139 }
2140
Meng Wangb4e34312016-05-12 14:54:36 -07002141 closeRequest;
2142 printRequest(pRI->token, pRI->pCI->requestNumber);
2143
2144 CALL_ONREQUEST(pRI->pCI->requestNumber,
2145 &cr,
2146 sizeof(RIL_CarrierRestrictions),
2147 pRI, pRI->socket_id);
2148
2149 goto exit;
2150
2151invalid:
2152 invalidCommandBlock(pRI);
Meng Wangdf8398c2016-05-25 12:59:15 -07002153 RIL_onRequestComplete(pRI, RIL_E_INVALID_ARGUMENTS, NULL, 0);
Meng Wangb4e34312016-05-12 14:54:36 -07002154exit:
2155 if (allowed_carriers != NULL) {
2156 free(allowed_carriers);
2157 }
2158 if (excluded_carriers != NULL) {
2159 free(excluded_carriers);
2160 }
2161 return;
2162}
2163
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002164static int
Wink Savillef4c4d362009-04-02 01:37:03 -07002165blockingWrite(int fd, const void *buffer, size_t len) {
Wink Saville7f856802009-06-09 10:23:37 -07002166 size_t writeOffset = 0;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002167 const uint8_t *toWrite;
2168
2169 toWrite = (const uint8_t *)buffer;
2170
2171 while (writeOffset < len) {
2172 ssize_t written;
2173 do {
2174 written = write (fd, toWrite + writeOffset,
2175 len - writeOffset);
Banavathu, Srinivas Naik38884902011-07-05 20:04:25 +05302176 } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002177
2178 if (written >= 0) {
2179 writeOffset += written;
2180 } else { // written < 0
Wink Saville8eb2a122012-11-19 16:05:13 -08002181 RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002182 close(fd);
2183 return -1;
2184 }
2185 }
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07002186#if VDBG
Dheeraj Shetty27976c42014-07-02 21:27:57 +02002187 RLOGE("RIL Response bytes written:%d", writeOffset);
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07002188#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002189 return 0;
2190}
2191
2192static int
Etan Cohend3652192014-06-20 08:28:44 -07002193sendResponseRaw (const void *data, size_t dataSize, RIL_SOCKET_ID socket_id) {
2194 int fd = s_ril_param_socket.fdCommand;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002195 int ret;
2196 uint32_t header;
Etan Cohend3652192014-06-20 08:28:44 -07002197 pthread_mutex_t * writeMutexHook = &s_writeMutex;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002198
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07002199#if VDBG
Etan Cohend3652192014-06-20 08:28:44 -07002200 RLOGE("Send Response to %s", rilSocketIdToString(socket_id));
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07002201#endif
Etan Cohend3652192014-06-20 08:28:44 -07002202
2203#if (SIM_COUNT >= 2)
2204 if (socket_id == RIL_SOCKET_2) {
2205 fd = s_ril_param_socket2.fdCommand;
2206 writeMutexHook = &s_writeMutex_socket2;
2207 }
2208#if (SIM_COUNT >= 3)
2209 else if (socket_id == RIL_SOCKET_3) {
2210 fd = s_ril_param_socket3.fdCommand;
2211 writeMutexHook = &s_writeMutex_socket3;
2212 }
2213#endif
2214#if (SIM_COUNT >= 4)
2215 else if (socket_id == RIL_SOCKET_4) {
2216 fd = s_ril_param_socket4.fdCommand;
2217 writeMutexHook = &s_writeMutex_socket4;
2218 }
2219#endif
2220#endif
2221 if (fd < 0) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002222 return -1;
2223 }
2224
2225 if (dataSize > MAX_COMMAND_BYTES) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002226 RLOGE("RIL: packet larger than %u (%u)",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002227 MAX_COMMAND_BYTES, (unsigned int )dataSize);
2228
2229 return -1;
2230 }
Wink Saville7f856802009-06-09 10:23:37 -07002231
Etan Cohend3652192014-06-20 08:28:44 -07002232 pthread_mutex_lock(writeMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002233
2234 header = htonl(dataSize);
2235
2236 ret = blockingWrite(fd, (void *)&header, sizeof(header));
2237
2238 if (ret < 0) {
Etan Cohend3652192014-06-20 08:28:44 -07002239 pthread_mutex_unlock(writeMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002240 return ret;
2241 }
2242
Kennyee1fadc2009-08-13 00:45:53 +08002243 ret = blockingWrite(fd, data, dataSize);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002244
2245 if (ret < 0) {
Etan Cohend3652192014-06-20 08:28:44 -07002246 pthread_mutex_unlock(writeMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002247 return ret;
2248 }
2249
Etan Cohend3652192014-06-20 08:28:44 -07002250 pthread_mutex_unlock(writeMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002251
2252 return 0;
2253}
2254
2255static int
Etan Cohend3652192014-06-20 08:28:44 -07002256sendResponse (Parcel &p, RIL_SOCKET_ID socket_id) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002257 printResponse;
Etan Cohend3652192014-06-20 08:28:44 -07002258 return sendResponseRaw(p.data(), p.dataSize(), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002259}
2260
Mohamad Ayyash74f7e662014-04-18 11:43:28 -07002261/** response is an int* pointing to an array of ints */
Wink Saville7f856802009-06-09 10:23:37 -07002262
2263static int
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002264responseInts(Parcel &p, int slotId, int requestNumber, int responseType, int token, RIL_Errno e,
2265 void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002266 int numInts;
2267
2268 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002269 RLOGE("invalid response: NULL");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002270 return RIL_ERRNO_INVALID_RESPONSE;
2271 }
2272 if (responselen % sizeof(int) != 0) {
Amit Mahajan52500162014-07-29 17:36:48 -07002273 RLOGE("responseInts: invalid response length %d expected multiple of %d\n",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002274 (int)responselen, (int)sizeof(int));
2275 return RIL_ERRNO_INVALID_RESPONSE;
2276 }
2277
2278 int *p_int = (int *) response;
2279
Mohamad Ayyash74f7e662014-04-18 11:43:28 -07002280 numInts = responselen / sizeof(int);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002281 p.writeInt32 (numInts);
2282
2283 /* each int*/
2284 startResponse;
2285 for (int i = 0 ; i < numInts ; i++) {
2286 appendPrintBuf("%s%d,", printBuf, p_int[i]);
2287 p.writeInt32(p_int[i]);
2288 }
2289 removeLastChar;
2290 closeResponse;
2291
2292 return 0;
2293}
2294
Chao Liu548a81e2015-05-14 16:13:46 -07002295// Response is an int or RIL_LastCallFailCauseInfo.
2296// Currently, only Shamu plans to use RIL_LastCallFailCauseInfo.
2297// TODO(yjl): Let all implementations use RIL_LastCallFailCauseInfo.
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002298static int responseFailCause(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2299 RIL_Errno e, void *response, size_t responselen) {
Chao Liu548a81e2015-05-14 16:13:46 -07002300 if (response == NULL && responselen != 0) {
2301 RLOGE("invalid response: NULL");
2302 return RIL_ERRNO_INVALID_RESPONSE;
2303 }
2304
2305 if (responselen == sizeof(int)) {
Sungmin Choia408c252015-07-01 16:22:46 +09002306 startResponse;
2307 int *p_int = (int *) response;
2308 appendPrintBuf("%s%d,", printBuf, p_int[0]);
2309 p.writeInt32(p_int[0]);
2310 removeLastChar;
2311 closeResponse;
Chao Liu548a81e2015-05-14 16:13:46 -07002312 } else if (responselen == sizeof(RIL_LastCallFailCauseInfo)) {
2313 startResponse;
2314 RIL_LastCallFailCauseInfo *p_fail_cause_info = (RIL_LastCallFailCauseInfo *) response;
2315 appendPrintBuf("%s[cause_code=%d,vendor_cause=%s]", printBuf, p_fail_cause_info->cause_code,
2316 p_fail_cause_info->vendor_cause);
2317 p.writeInt32(p_fail_cause_info->cause_code);
2318 writeStringToParcel(p, p_fail_cause_info->vendor_cause);
2319 removeLastChar;
2320 closeResponse;
2321 } else {
2322 RLOGE("responseFailCause: invalid response length %d expected an int or "
2323 "RIL_LastCallFailCauseInfo", (int)responselen);
2324 return RIL_ERRNO_INVALID_RESPONSE;
2325 }
2326
2327 return 0;
2328}
2329
Wink Saville43808972011-01-13 17:39:51 -08002330/** response is a char **, pointing to an array of char *'s
2331 The parcel will begin with the version */
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002332static int responseStringsWithVersion(int version, Parcel &p, int slotId, int requestNumber,
2333 int responseType, int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville43808972011-01-13 17:39:51 -08002334 p.writeInt32(version);
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002335 return responseStrings(p, slotId, requestNumber, responseType, token, e, response, responselen);
Wink Saville43808972011-01-13 17:39:51 -08002336}
2337
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002338/** response is a char **, pointing to an array of char *'s */
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002339static int responseStrings(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2340 RIL_Errno e, void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002341 int numStrings;
Wink Saville7f856802009-06-09 10:23:37 -07002342
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002343 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002344 RLOGE("invalid response: NULL");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002345 return RIL_ERRNO_INVALID_RESPONSE;
2346 }
2347 if (responselen % sizeof(char *) != 0) {
Amit Mahajan52500162014-07-29 17:36:48 -07002348 RLOGE("responseStrings: invalid response length %d expected multiple of %d\n",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002349 (int)responselen, (int)sizeof(char *));
2350 return RIL_ERRNO_INVALID_RESPONSE;
2351 }
2352
2353 if (response == NULL) {
2354 p.writeInt32 (0);
2355 } else {
2356 char **p_cur = (char **) response;
2357
2358 numStrings = responselen / sizeof(char *);
2359 p.writeInt32 (numStrings);
2360
2361 /* each string*/
2362 startResponse;
2363 for (int i = 0 ; i < numStrings ; i++) {
2364 appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
2365 writeStringToParcel (p, p_cur[i]);
2366 }
2367 removeLastChar;
2368 closeResponse;
2369 }
2370 return 0;
2371}
2372
2373
2374/**
Wink Saville7f856802009-06-09 10:23:37 -07002375 * NULL strings are accepted
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002376 * FIXME currently ignores responselen
2377 */
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002378static int responseString(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2379 RIL_Errno e, void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002380 /* one string only */
2381 startResponse;
2382 appendPrintBuf("%s%s", printBuf, (char*)response);
2383 closeResponse;
2384
2385 writeStringToParcel(p, (const char *)response);
2386
2387 return 0;
2388}
2389
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002390static int responseVoid(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2391 RIL_Errno e, void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002392 startResponse;
2393 removeLastChar;
2394 return 0;
2395}
2396
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002397static int responseRaw(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2398 RIL_Errno e, void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002399 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002400 RLOGE("invalid response: NULL with responselen != 0");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002401 return RIL_ERRNO_INVALID_RESPONSE;
2402 }
2403
2404 // The java code reads -1 size as null byte array
2405 if (response == NULL) {
Wink Saville7f856802009-06-09 10:23:37 -07002406 p.writeInt32(-1);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002407 } else {
2408 p.writeInt32(responselen);
2409 p.write(response, responselen);
2410 }
2411
2412 return 0;
2413}
2414
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002415static int responseSsn(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2416 RIL_Errno e, void *response, size_t responselen) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002417 if (response == NULL) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002418 RLOGE("invalid response: NULL");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002419 return RIL_ERRNO_INVALID_RESPONSE;
2420 }
2421
2422 if (responselen != sizeof(RIL_SuppSvcNotification)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002423 RLOGE("invalid response length was %d expected %d",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08002424 (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
2425 return RIL_ERRNO_INVALID_RESPONSE;
2426 }
2427
2428 RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
2429 p.writeInt32(p_cur->notificationType);
2430 p.writeInt32(p_cur->code);
2431 p.writeInt32(p_cur->index);
2432 p.writeInt32(p_cur->type);
2433 writeStringToParcel(p, p_cur->number);
2434
2435 startResponse;
2436 appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
2437 (p_cur->notificationType==0)?"mo":"mt",
2438 p_cur->code, p_cur->index, p_cur->type,
2439 (char*)p_cur->number);
2440 closeResponse;
2441
2442 return 0;
2443}
2444
Wink Saville3d54e742009-05-18 18:00:44 -07002445/**
2446 * Marshall the signalInfoRecord into the parcel if it exists.
2447 */
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002448static void marshallSignalInfoRecord(Parcel &p, RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
Wink Saville3d54e742009-05-18 18:00:44 -07002449 p.writeInt32(p_signalInfoRecord.isPresent);
2450 p.writeInt32(p_signalInfoRecord.signalType);
2451 p.writeInt32(p_signalInfoRecord.alertPitch);
2452 p.writeInt32(p_signalInfoRecord.signal);
2453}
2454
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002455static int responseCdmaInformationRecords(Parcel &p, int slotId, int requestNumber,
2456 int responseType, int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville3d54e742009-05-18 18:00:44 -07002457 int num;
Wink Savillea592eeb2009-05-22 13:26:36 -07002458 char* string8 = NULL;
2459 int buffer_lenght;
2460 RIL_CDMA_InformationRecord *infoRec;
Wink Saville3d54e742009-05-18 18:00:44 -07002461
2462 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002463 RLOGE("invalid response: NULL");
Wink Saville3d54e742009-05-18 18:00:44 -07002464 return RIL_ERRNO_INVALID_RESPONSE;
2465 }
2466
Wink Savillea592eeb2009-05-22 13:26:36 -07002467 if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002468 RLOGE("responseCdmaInformationRecords: invalid response length %d expected multiple of \
2469 %d\n", (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
Wink Saville3d54e742009-05-18 18:00:44 -07002470 return RIL_ERRNO_INVALID_RESPONSE;
2471 }
2472
Wink Savillea592eeb2009-05-22 13:26:36 -07002473 RIL_CDMA_InformationRecords *p_cur =
2474 (RIL_CDMA_InformationRecords *) response;
2475 num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
Wink Saville3d54e742009-05-18 18:00:44 -07002476
2477 startResponse;
Wink Savillea592eeb2009-05-22 13:26:36 -07002478 p.writeInt32(num);
Wink Saville3d54e742009-05-18 18:00:44 -07002479
Wink Savillea592eeb2009-05-22 13:26:36 -07002480 for (int i = 0 ; i < num ; i++) {
2481 infoRec = &p_cur->infoRec[i];
2482 p.writeInt32(infoRec->name);
2483 switch (infoRec->name) {
Wink Saville3d54e742009-05-18 18:00:44 -07002484 case RIL_CDMA_DISPLAY_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002485 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
2486 if (infoRec->rec.display.alpha_len >
2487 CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002488 RLOGE("invalid display info response length %d \
Wink Savillea592eeb2009-05-22 13:26:36 -07002489 expected not more than %d\n",
2490 (int)infoRec->rec.display.alpha_len,
2491 CDMA_ALPHA_INFO_BUFFER_LENGTH);
2492 return RIL_ERRNO_INVALID_RESPONSE;
Wink Saville3d54e742009-05-18 18:00:44 -07002493 }
Sanket Padawe0cfc5532016-03-07 17:12:19 -08002494 string8 = (char*) calloc(infoRec->rec.display.alpha_len + 1, sizeof(char));
Sanket Padawe55227b52016-02-29 10:09:26 -08002495 if (string8 == NULL) {
2496 RLOGE("Memory allocation failed for responseCdmaInformationRecords");
2497 closeRequest;
2498 return RIL_ERRNO_NO_MEMORY;
2499 }
Wink Savillea592eeb2009-05-22 13:26:36 -07002500 for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
2501 string8[i] = infoRec->rec.display.alpha_buf[i];
2502 }
Wink Saville43808972011-01-13 17:39:51 -08002503 string8[(int)infoRec->rec.display.alpha_len] = '\0';
Wink Savillea592eeb2009-05-22 13:26:36 -07002504 writeStringToParcel(p, (const char*)string8);
2505 free(string8);
2506 string8 = NULL;
Wink Saville3d54e742009-05-18 18:00:44 -07002507 break;
2508 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
Wink Saville3d54e742009-05-18 18:00:44 -07002509 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
Wink Saville3d54e742009-05-18 18:00:44 -07002510 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002511 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002512 RLOGE("invalid display info response length %d \
Wink Savillea592eeb2009-05-22 13:26:36 -07002513 expected not more than %d\n",
2514 (int)infoRec->rec.number.len,
2515 CDMA_NUMBER_INFO_BUFFER_LENGTH);
2516 return RIL_ERRNO_INVALID_RESPONSE;
Wink Saville3d54e742009-05-18 18:00:44 -07002517 }
Sanket Padawe0cfc5532016-03-07 17:12:19 -08002518 string8 = (char*) calloc(infoRec->rec.number.len + 1, sizeof(char));
Sanket Padawe55227b52016-02-29 10:09:26 -08002519 if (string8 == NULL) {
2520 RLOGE("Memory allocation failed for responseCdmaInformationRecords");
2521 closeRequest;
2522 return RIL_ERRNO_NO_MEMORY;
2523 }
Wink Savillea592eeb2009-05-22 13:26:36 -07002524 for (int i = 0 ; i < infoRec->rec.number.len; i++) {
2525 string8[i] = infoRec->rec.number.buf[i];
2526 }
Wink Saville43808972011-01-13 17:39:51 -08002527 string8[(int)infoRec->rec.number.len] = '\0';
Wink Savillea592eeb2009-05-22 13:26:36 -07002528 writeStringToParcel(p, (const char*)string8);
2529 free(string8);
2530 string8 = NULL;
2531 p.writeInt32(infoRec->rec.number.number_type);
2532 p.writeInt32(infoRec->rec.number.number_plan);
2533 p.writeInt32(infoRec->rec.number.pi);
2534 p.writeInt32(infoRec->rec.number.si);
Wink Saville3d54e742009-05-18 18:00:44 -07002535 break;
2536 case RIL_CDMA_SIGNAL_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002537 p.writeInt32(infoRec->rec.signal.isPresent);
2538 p.writeInt32(infoRec->rec.signal.signalType);
2539 p.writeInt32(infoRec->rec.signal.alertPitch);
2540 p.writeInt32(infoRec->rec.signal.signal);
2541
2542 appendPrintBuf("%sisPresent=%X, signalType=%X, \
2543 alertPitch=%X, signal=%X, ",
2544 printBuf, (int)infoRec->rec.signal.isPresent,
2545 (int)infoRec->rec.signal.signalType,
2546 (int)infoRec->rec.signal.alertPitch,
2547 (int)infoRec->rec.signal.signal);
2548 removeLastChar;
Wink Saville3d54e742009-05-18 18:00:44 -07002549 break;
2550 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002551 if (infoRec->rec.redir.redirectingNumber.len >
2552 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002553 RLOGE("invalid display info response length %d \
Wink Savillea592eeb2009-05-22 13:26:36 -07002554 expected not more than %d\n",
2555 (int)infoRec->rec.redir.redirectingNumber.len,
2556 CDMA_NUMBER_INFO_BUFFER_LENGTH);
2557 return RIL_ERRNO_INVALID_RESPONSE;
Wink Saville3d54e742009-05-18 18:00:44 -07002558 }
Sanket Padawe0cfc5532016-03-07 17:12:19 -08002559 string8 = (char*) calloc(infoRec->rec.redir.redirectingNumber.len + 1,
2560 sizeof(char));
Sanket Padawe55227b52016-02-29 10:09:26 -08002561 if (string8 == NULL) {
2562 RLOGE("Memory allocation failed for responseCdmaInformationRecords");
2563 closeRequest;
2564 return RIL_ERRNO_NO_MEMORY;
2565 }
Wink Savillea592eeb2009-05-22 13:26:36 -07002566 for (int i = 0;
2567 i < infoRec->rec.redir.redirectingNumber.len;
2568 i++) {
2569 string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
2570 }
Wink Saville43808972011-01-13 17:39:51 -08002571 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
Wink Savillea592eeb2009-05-22 13:26:36 -07002572 writeStringToParcel(p, (const char*)string8);
2573 free(string8);
2574 string8 = NULL;
2575 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
2576 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
2577 p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
2578 p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
2579 p.writeInt32(infoRec->rec.redir.redirectingReason);
Wink Saville3d54e742009-05-18 18:00:44 -07002580 break;
2581 case RIL_CDMA_LINE_CONTROL_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002582 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
2583 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
2584 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
2585 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2586
2587 appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
2588 lineCtrlToggle=%d, lineCtrlReverse=%d, \
2589 lineCtrlPowerDenial=%d, ", printBuf,
2590 (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
2591 (int)infoRec->rec.lineCtrl.lineCtrlToggle,
2592 (int)infoRec->rec.lineCtrl.lineCtrlReverse,
2593 (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2594 removeLastChar;
Wink Saville3d54e742009-05-18 18:00:44 -07002595 break;
2596 case RIL_CDMA_T53_CLIR_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002597 p.writeInt32((int)(infoRec->rec.clir.cause));
Wink Saville3d54e742009-05-18 18:00:44 -07002598
Wink Savillea592eeb2009-05-22 13:26:36 -07002599 appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
2600 removeLastChar;
Wink Saville3d54e742009-05-18 18:00:44 -07002601 break;
2602 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
Wink Savillea592eeb2009-05-22 13:26:36 -07002603 p.writeInt32(infoRec->rec.audioCtrl.upLink);
2604 p.writeInt32(infoRec->rec.audioCtrl.downLink);
2605
2606 appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
2607 infoRec->rec.audioCtrl.upLink,
2608 infoRec->rec.audioCtrl.downLink);
2609 removeLastChar;
Wink Saville3d54e742009-05-18 18:00:44 -07002610 break;
Wink Savillea592eeb2009-05-22 13:26:36 -07002611 case RIL_CDMA_T53_RELEASE_INFO_REC:
2612 // TODO(Moto): See David Krause, he has the answer:)
Wink Saville8eb2a122012-11-19 16:05:13 -08002613 RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
Wink Savillea592eeb2009-05-22 13:26:36 -07002614 return RIL_ERRNO_INVALID_RESPONSE;
2615 default:
Wink Saville8eb2a122012-11-19 16:05:13 -08002616 RLOGE("Incorrect name value");
Wink Savillea592eeb2009-05-22 13:26:36 -07002617 return RIL_ERRNO_INVALID_RESPONSE;
Wink Saville3d54e742009-05-18 18:00:44 -07002618 }
2619 }
Wink Savillea592eeb2009-05-22 13:26:36 -07002620 closeResponse;
Wink Saville3d54e742009-05-18 18:00:44 -07002621
Wink Savillea592eeb2009-05-22 13:26:36 -07002622 return 0;
Wink Saville3d54e742009-05-18 18:00:44 -07002623}
2624
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002625static void responseRilSignalStrengthV5(Parcel &p, int slotId, int requestNumber, int responseType,
2626 int token, RIL_Errno e, RIL_SignalStrength_v10 *p_cur) {
Sanket Padawe4c05f352016-01-26 16:19:00 -08002627 p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
2628 p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
2629 p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
2630 p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
2631 p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
2632 p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
2633 p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
2634}
2635
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002636static void responseRilSignalStrengthV6Extra(Parcel &p, int slotId, int requestNumber,
2637 int responseType, int token, RIL_Errno e, RIL_SignalStrength_v10 *p_cur) {
Sanket Padawe4c05f352016-01-26 16:19:00 -08002638 /*
2639 * Fixup LTE for backwards compatibility
2640 */
2641 // signalStrength: -1 -> 99
2642 if (p_cur->LTE_SignalStrength.signalStrength == -1) {
2643 p_cur->LTE_SignalStrength.signalStrength = 99;
2644 }
2645 // rsrp: -1 -> INT_MAX all other negative value to positive.
2646 // So remap here
2647 if (p_cur->LTE_SignalStrength.rsrp == -1) {
2648 p_cur->LTE_SignalStrength.rsrp = INT_MAX;
2649 } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
2650 p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
2651 }
2652 // rsrq: -1 -> INT_MAX
2653 if (p_cur->LTE_SignalStrength.rsrq == -1) {
2654 p_cur->LTE_SignalStrength.rsrq = INT_MAX;
2655 }
2656 // Not remapping rssnr is already using INT_MAX
2657
2658 // cqi: -1 -> INT_MAX
2659 if (p_cur->LTE_SignalStrength.cqi == -1) {
2660 p_cur->LTE_SignalStrength.cqi = INT_MAX;
2661 }
2662
2663 p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
2664 p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
2665 p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
2666 p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
2667 p.writeInt32(p_cur->LTE_SignalStrength.cqi);
2668}
2669
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002670static void responseRilSignalStrengthV10(Parcel &p, int slotId, int requestNumber, int responseType,
2671 int token, RIL_Errno e, RIL_SignalStrength_v10 *p_cur) {
2672 responseRilSignalStrengthV5(p, slotId, requestNumber, responseType, token, e, p_cur);
2673 responseRilSignalStrengthV6Extra(p, slotId, requestNumber, responseType, token, e, p_cur);
Sanket Padawe4c05f352016-01-26 16:19:00 -08002674 p.writeInt32(p_cur->TD_SCDMA_SignalStrength.rscp);
2675}
2676
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002677static int responseRilSignalStrength(Parcel &p, int slotId, int requestNumber, int responseType,
2678 int token, RIL_Errno e, void *response, size_t responselen) {
Wink Savillea592eeb2009-05-22 13:26:36 -07002679 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002680 RLOGE("invalid response: NULL");
Wink Saville3d54e742009-05-18 18:00:44 -07002681 return RIL_ERRNO_INVALID_RESPONSE;
2682 }
2683
Sanket Padawe626099e2016-06-08 14:09:26 -07002684 RIL_SignalStrength_v10 *p_cur;
Sanket Padawe4c05f352016-01-26 16:19:00 -08002685 if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
2686 if (responselen >= sizeof (RIL_SignalStrength_v5)) {
Sanket Padawe626099e2016-06-08 14:09:26 -07002687 p_cur = ((RIL_SignalStrength_v10 *) response);
Wink Saville3d54e742009-05-18 18:00:44 -07002688
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002689 responseRilSignalStrengthV5(p, slotId, requestNumber, responseType, token, e, p_cur);
Uma Maheswari Ramalingam9efcac52012-08-09 11:59:17 -07002690
Sanket Padawe4c05f352016-01-26 16:19:00 -08002691 if (responselen >= sizeof (RIL_SignalStrength_v6)) {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002692 responseRilSignalStrengthV6Extra(p, slotId, requestNumber, responseType, token, e,
2693 p_cur);
Sanket Padawe4c05f352016-01-26 16:19:00 -08002694 if (responselen >= sizeof (RIL_SignalStrength_v10)) {
2695 p.writeInt32(p_cur->TD_SCDMA_SignalStrength.rscp);
2696 } else {
2697 p.writeInt32(INT_MAX);
Wink Saville18e4ab12013-04-07 17:31:04 -07002698 }
Etan Cohend3652192014-06-20 08:28:44 -07002699 } else {
Sanket Padawe4c05f352016-01-26 16:19:00 -08002700 p.writeInt32(99);
2701 p.writeInt32(INT_MAX);
2702 p.writeInt32(INT_MAX);
2703 p.writeInt32(INT_MAX);
2704 p.writeInt32(INT_MAX);
Etan Cohend3652192014-06-20 08:28:44 -07002705 p.writeInt32(INT_MAX);
2706 }
Wink Savillec0114b32011-02-18 10:14:07 -08002707 } else {
Sanket Padawe4c05f352016-01-26 16:19:00 -08002708 RLOGE("invalid response length");
2709 return RIL_ERRNO_INVALID_RESPONSE;
Wink Savillec0114b32011-02-18 10:14:07 -08002710 }
Sanket Padawe00909612016-01-26 18:44:01 -08002711 } else { // RIL version >= 13
Sanket Padawe4c05f352016-01-26 16:19:00 -08002712 if (responselen % sizeof(RIL_SignalStrength_v10) != 0) {
2713 RLOGE("Data structure expected is RIL_SignalStrength_v10");
2714 if (!isDebuggable()) {
2715 return RIL_ERRNO_INVALID_RESPONSE;
2716 } else {
2717 assert(0);
2718 }
2719 }
Sanket Padawe626099e2016-06-08 14:09:26 -07002720 p_cur = ((RIL_SignalStrength_v10 *) response);
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002721 responseRilSignalStrengthV10(p, slotId, requestNumber, responseType, token, e, p_cur);
Wink Saville3d54e742009-05-18 18:00:44 -07002722 }
Sanket Padawe4c05f352016-01-26 16:19:00 -08002723 startResponse;
2724 appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
2725 CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
2726 EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
2727 EVDO_SS.signalNoiseRatio=%d,\
2728 LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
2729 LTE_SS.rssnr=%d,LTE_SS.cqi=%d,TDSCDMA_SS.rscp=%d]",
2730 printBuf,
2731 p_cur->GW_SignalStrength.signalStrength,
2732 p_cur->GW_SignalStrength.bitErrorRate,
2733 p_cur->CDMA_SignalStrength.dbm,
2734 p_cur->CDMA_SignalStrength.ecio,
2735 p_cur->EVDO_SignalStrength.dbm,
2736 p_cur->EVDO_SignalStrength.ecio,
2737 p_cur->EVDO_SignalStrength.signalNoiseRatio,
2738 p_cur->LTE_SignalStrength.signalStrength,
2739 p_cur->LTE_SignalStrength.rsrp,
2740 p_cur->LTE_SignalStrength.rsrq,
2741 p_cur->LTE_SignalStrength.rssnr,
2742 p_cur->LTE_SignalStrength.cqi,
2743 p_cur->TD_SCDMA_SignalStrength.rscp);
2744 closeResponse;
Wink Saville3d54e742009-05-18 18:00:44 -07002745 return 0;
2746}
2747
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002748static int responseCallRing(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2749 RIL_Errno e, void *response, size_t responselen) {
Wink Saville3d54e742009-05-18 18:00:44 -07002750 if ((response == NULL) || (responselen == 0)) {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002751 return responseVoid(p, slotId, requestNumber, responseType, token, e, response,
2752 responselen);
Wink Saville3d54e742009-05-18 18:00:44 -07002753 } else {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002754 return responseCdmaSignalInfoRecord(p, slotId, requestNumber, responseType, token, e,
2755 response, responselen);
Wink Saville3d54e742009-05-18 18:00:44 -07002756 }
2757}
2758
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002759static int responseCdmaSignalInfoRecord(Parcel &p, int slotId, int requestNumber, int responseType,
2760 int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville3d54e742009-05-18 18:00:44 -07002761 if (response == NULL || responselen == 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002762 RLOGE("invalid response: NULL");
Wink Saville3d54e742009-05-18 18:00:44 -07002763 return RIL_ERRNO_INVALID_RESPONSE;
2764 }
2765
2766 if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002767 RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
Wink Saville3d54e742009-05-18 18:00:44 -07002768 (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
2769 return RIL_ERRNO_INVALID_RESPONSE;
2770 }
2771
2772 startResponse;
2773
2774 RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
2775 marshallSignalInfoRecord(p, *p_cur);
2776
2777 appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
2778 signal=%d]",
2779 printBuf,
2780 p_cur->isPresent,
2781 p_cur->signalType,
2782 p_cur->alertPitch,
2783 p_cur->signal);
2784
2785 closeResponse;
2786 return 0;
2787}
2788
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002789static int responseCdmaCallWaiting(Parcel &p, int slotId, int requestNumber, int responseType,
2790 int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville3d54e742009-05-18 18:00:44 -07002791 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002792 RLOGE("invalid response: NULL");
Wink Saville3d54e742009-05-18 18:00:44 -07002793 return RIL_ERRNO_INVALID_RESPONSE;
2794 }
2795
Wink Savillec0114b32011-02-18 10:14:07 -08002796 if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002797 RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
Wink Savillec0114b32011-02-18 10:14:07 -08002798 }
2799
2800 RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
2801
2802 writeStringToParcel(p, p_cur->number);
2803 p.writeInt32(p_cur->numberPresentation);
2804 writeStringToParcel(p, p_cur->name);
2805 marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
2806
Sanket Padawe4c05f352016-01-26 16:19:00 -08002807 if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
2808 if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
2809 p.writeInt32(p_cur->number_type);
2810 p.writeInt32(p_cur->number_plan);
2811 } else {
2812 p.writeInt32(0);
2813 p.writeInt32(0);
2814 }
Sanket Padawe00909612016-01-26 18:44:01 -08002815 } else { // RIL version >= 13
Sanket Padawe4c05f352016-01-26 16:19:00 -08002816 if (responselen % sizeof(RIL_CDMA_CallWaiting_v6) != 0) {
2817 RLOGE("Data structure expected is RIL_CDMA_CallWaiting_v6");
2818 if (!isDebuggable()) {
2819 return RIL_ERRNO_INVALID_RESPONSE;
2820 } else {
2821 assert(0);
2822 }
2823 }
Wink Savillec0114b32011-02-18 10:14:07 -08002824 p.writeInt32(p_cur->number_type);
2825 p.writeInt32(p_cur->number_plan);
Wink Saville3d54e742009-05-18 18:00:44 -07002826 }
2827
2828 startResponse;
Wink Saville3d54e742009-05-18 18:00:44 -07002829 appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
2830 signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
Wink Savillec0114b32011-02-18 10:14:07 -08002831 signal=%d,number_type=%d,number_plan=%d]",
Wink Saville3d54e742009-05-18 18:00:44 -07002832 printBuf,
2833 p_cur->number,
2834 p_cur->numberPresentation,
2835 p_cur->name,
2836 p_cur->signalInfoRecord.isPresent,
2837 p_cur->signalInfoRecord.signalType,
2838 p_cur->signalInfoRecord.alertPitch,
Wink Savillec0114b32011-02-18 10:14:07 -08002839 p_cur->signalInfoRecord.signal,
2840 p_cur->number_type,
2841 p_cur->number_plan);
Wink Saville3d54e742009-05-18 18:00:44 -07002842 closeResponse;
2843
2844 return 0;
2845}
2846
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002847static void responseSimRefreshV7(Parcel &p, int slotId, int requestNumber, int responseType,
2848 int token, RIL_Errno e, void *response) {
Sanket Padawe4c05f352016-01-26 16:19:00 -08002849 RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
2850 p.writeInt32(p_cur->result);
2851 p.writeInt32(p_cur->ef_id);
2852 writeStringToParcel(p, p_cur->aid);
2853
2854 appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
2855 printBuf,
2856 p_cur->result,
2857 p_cur->ef_id,
2858 p_cur->aid);
2859
2860}
2861
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002862static int responseSimRefresh(Parcel &p, int slotId, int requestNumber, int responseType, int token,
2863 RIL_Errno e, void *response, size_t responselen) {
Alex Yakavenka45e740e2012-01-31 11:48:27 -08002864 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08002865 RLOGE("responseSimRefresh: invalid response: NULL");
Alex Yakavenka45e740e2012-01-31 11:48:27 -08002866 return RIL_ERRNO_INVALID_RESPONSE;
2867 }
2868
2869 startResponse;
Sanket Padawe4c05f352016-01-26 16:19:00 -08002870 if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
Sanket Padawe66701c52016-01-26 17:44:34 -08002871 if (s_callbacks.version >= 7) {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002872 responseSimRefreshV7(p, slotId, requestNumber, responseType, token, e, response);
Sanket Padawe4c05f352016-01-26 16:19:00 -08002873 } else {
2874 int *p_cur = ((int *) response);
2875 p.writeInt32(p_cur[0]);
2876 p.writeInt32(p_cur[1]);
2877 writeStringToParcel(p, NULL);
Alex Yakavenka45e740e2012-01-31 11:48:27 -08002878
Sanket Padawe4c05f352016-01-26 16:19:00 -08002879 appendPrintBuf("%sresult=%d, ef_id=%d",
2880 printBuf,
2881 p_cur[0],
2882 p_cur[1]);
2883 }
Sanket Padawe00909612016-01-26 18:44:01 -08002884 } else { // RIL version >= 13
Sanket Padawe4c05f352016-01-26 16:19:00 -08002885 if (responselen % sizeof(RIL_SimRefreshResponse_v7) != 0) {
2886 RLOGE("Data structure expected is RIL_SimRefreshResponse_v7");
2887 if (!isDebuggable()) {
2888 return RIL_ERRNO_INVALID_RESPONSE;
2889 } else {
2890 assert(0);
2891 }
2892 }
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002893 responseSimRefreshV7(p, slotId, requestNumber, responseType, token, e, response);
Alex Yakavenka45e740e2012-01-31 11:48:27 -08002894
Alex Yakavenka45e740e2012-01-31 11:48:27 -08002895 }
2896 closeResponse;
2897
2898 return 0;
2899}
2900
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002901static int responseCellInfoListV6(Parcel &p, int slotId, int requestNumber, int responseType,
2902 int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville8a9e0212013-04-09 12:11:38 -07002903 if (response == NULL && responselen != 0) {
2904 RLOGE("invalid response: NULL");
2905 return RIL_ERRNO_INVALID_RESPONSE;
2906 }
2907
2908 if (responselen % sizeof(RIL_CellInfo) != 0) {
Amit Mahajan52500162014-07-29 17:36:48 -07002909 RLOGE("responseCellInfoList: invalid response length %d expected multiple of %d",
Wink Saville8a9e0212013-04-09 12:11:38 -07002910 (int)responselen, (int)sizeof(RIL_CellInfo));
2911 return RIL_ERRNO_INVALID_RESPONSE;
2912 }
2913
2914 int num = responselen / sizeof(RIL_CellInfo);
2915 p.writeInt32(num);
2916
2917 RIL_CellInfo *p_cur = (RIL_CellInfo *) response;
2918 startResponse;
2919 int i;
2920 for (i = 0; i < num; i++) {
Wink Saville8a9e0212013-04-09 12:11:38 -07002921 p.writeInt32((int)p_cur->cellInfoType);
2922 p.writeInt32(p_cur->registered);
2923 p.writeInt32(p_cur->timeStampType);
2924 p.writeInt64(p_cur->timeStamp);
2925 switch(p_cur->cellInfoType) {
2926 case RIL_CELL_INFO_TYPE_GSM: {
Wink Saville8a9e0212013-04-09 12:11:38 -07002927 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
2928 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
2929 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
2930 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
Wink Saville8a9e0212013-04-09 12:11:38 -07002931 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
2932 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
2933 break;
2934 }
Wink Savillec57b3eb2013-04-17 12:51:41 -07002935 case RIL_CELL_INFO_TYPE_WCDMA: {
Wink Savillec57b3eb2013-04-17 12:51:41 -07002936 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
2937 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
2938 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
2939 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
2940 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
2941 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
2942 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
2943 break;
2944 }
Wink Saville8a9e0212013-04-09 12:11:38 -07002945 case RIL_CELL_INFO_TYPE_CDMA: {
Wink Saville8a9e0212013-04-09 12:11:38 -07002946 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
2947 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
2948 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
2949 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
2950 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
2951
Wink Saville8a9e0212013-04-09 12:11:38 -07002952 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
2953 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
2954 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
2955 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
2956 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
2957 break;
2958 }
2959 case RIL_CELL_INFO_TYPE_LTE: {
Wink Saville8a9e0212013-04-09 12:11:38 -07002960 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
2961 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
2962 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
2963 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
2964 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
2965
Wink Saville8a9e0212013-04-09 12:11:38 -07002966 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
2967 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
2968 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
2969 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
2970 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
2971 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
2972 break;
2973 }
Etan Cohend3652192014-06-20 08:28:44 -07002974 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
Etan Cohend3652192014-06-20 08:28:44 -07002975 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
2976 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
2977 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac);
2978 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
2979 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
2980 p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
2981 break;
2982 }
Wink Saville8a9e0212013-04-09 12:11:38 -07002983 }
2984 p_cur += 1;
2985 }
2986 removeLastChar;
2987 closeResponse;
2988
2989 return 0;
2990}
2991
Amit Mahajan18fe36b2016-08-25 11:19:21 -07002992static int responseCellInfoListV12(Parcel &p, int slotId, int requestNumber, int responseType,
2993 int token, RIL_Errno e, void *response, size_t responselen) {
Sanket Padawe00909612016-01-26 18:44:01 -08002994 if (response == NULL && responselen != 0) {
2995 RLOGE("invalid response: NULL");
2996 return RIL_ERRNO_INVALID_RESPONSE;
2997 }
2998
2999 if (responselen % sizeof(RIL_CellInfo_v12) != 0) {
3000 RLOGE("responseCellInfoList: invalid response length %d expected multiple of %d",
3001 (int)responselen, (int)sizeof(RIL_CellInfo_v12));
3002 return RIL_ERRNO_INVALID_RESPONSE;
3003 }
3004
3005 int num = responselen / sizeof(RIL_CellInfo_v12);
3006 p.writeInt32(num);
3007
3008 RIL_CellInfo_v12 *p_cur = (RIL_CellInfo_v12 *) response;
3009 startResponse;
3010 int i;
3011 for (i = 0; i < num; i++) {
Sanket Padawe00909612016-01-26 18:44:01 -08003012 p.writeInt32((int)p_cur->cellInfoType);
3013 p.writeInt32(p_cur->registered);
3014 p.writeInt32(p_cur->timeStampType);
3015 p.writeInt64(p_cur->timeStamp);
3016 switch(p_cur->cellInfoType) {
3017 case RIL_CELL_INFO_TYPE_GSM: {
Sanket Padawe00909612016-01-26 18:44:01 -08003018 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
3019 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
3020 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
3021 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
3022 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.arfcn);
3023 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.bsic);
3024 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
3025 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
3026 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.timingAdvance);
3027 break;
3028 }
3029 case RIL_CELL_INFO_TYPE_WCDMA: {
Sanket Padawe00909612016-01-26 18:44:01 -08003030 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
3031 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
3032 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
3033 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
3034 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
3035 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.uarfcn);
3036 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
3037 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
3038 break;
3039 }
3040 case RIL_CELL_INFO_TYPE_CDMA: {
Sanket Padawe00909612016-01-26 18:44:01 -08003041 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
3042 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
3043 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
3044 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
3045 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
3046
Sanket Padawe00909612016-01-26 18:44:01 -08003047 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
3048 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
3049 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
3050 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
3051 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
3052 break;
3053 }
3054 case RIL_CELL_INFO_TYPE_LTE: {
Sanket Padawe00909612016-01-26 18:44:01 -08003055 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
3056 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
3057 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
3058 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
3059 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
3060 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.earfcn);
3061
Sanket Padawe00909612016-01-26 18:44:01 -08003062 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
3063 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
3064 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
3065 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
3066 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
3067 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
3068 break;
3069 }
3070 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
Sanket Padawe00909612016-01-26 18:44:01 -08003071 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
3072 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
3073 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac);
3074 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
3075 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
3076 p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
3077 break;
3078 }
3079 }
3080 p_cur += 1;
3081 }
3082 removeLastChar;
3083 closeResponse;
3084 return 0;
3085}
3086
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003087static int responseCellInfoList(Parcel &p, int slotId, int requestNumber, int responseType,
3088 int token, RIL_Errno e, void *response, size_t responselen) {
Sanket Padawe00909612016-01-26 18:44:01 -08003089 if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
3090 if (s_callbacks.version < 12) {
3091 RLOGD("responseCellInfoList: v6");
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003092 return responseCellInfoListV6(p, slotId, requestNumber, responseType, token, e,
3093 response, responselen);
Sanket Padawe00909612016-01-26 18:44:01 -08003094 } else {
3095 RLOGD("responseCellInfoList: v12");
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003096 return responseCellInfoListV12(p, slotId, requestNumber, responseType, token, e,
3097 response, responselen);
Sanket Padawe00909612016-01-26 18:44:01 -08003098 }
3099 } else { // RIL version >= 13
3100 if (responselen % sizeof(RIL_CellInfo_v12) != 0) {
3101 RLOGE("Data structure expected is RIL_CellInfo_v12");
3102 if (!isDebuggable()) {
3103 return RIL_ERRNO_INVALID_RESPONSE;
3104 } else {
3105 assert(0);
3106 }
3107 }
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003108 return responseCellInfoListV12(p, slotId, requestNumber, responseType, token, e, response,
3109 responselen);
Sanket Padawe00909612016-01-26 18:44:01 -08003110 }
3111
3112 return 0;
3113}
3114
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003115static int responseHardwareConfig(Parcel &p, int slotId, int requestNumber, int responseType,
3116 int token, RIL_Errno e, void *response, size_t responselen) {
Etan Cohend3652192014-06-20 08:28:44 -07003117 if (response == NULL && responselen != 0) {
3118 RLOGE("invalid response: NULL");
3119 return RIL_ERRNO_INVALID_RESPONSE;
3120 }
3121
3122 if (responselen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan52500162014-07-29 17:36:48 -07003123 RLOGE("responseHardwareConfig: invalid response length %d expected multiple of %d",
Etan Cohend3652192014-06-20 08:28:44 -07003124 (int)responselen, (int)sizeof(RIL_HardwareConfig));
3125 return RIL_ERRNO_INVALID_RESPONSE;
3126 }
3127
3128 int num = responselen / sizeof(RIL_HardwareConfig);
3129 int i;
3130 RIL_HardwareConfig *p_cur = (RIL_HardwareConfig *) response;
3131
3132 p.writeInt32(num);
3133
3134 startResponse;
3135 for (i = 0; i < num; i++) {
3136 switch (p_cur[i].type) {
3137 case RIL_HARDWARE_CONFIG_MODEM: {
3138 writeStringToParcel(p, p_cur[i].uuid);
3139 p.writeInt32((int)p_cur[i].state);
3140 p.writeInt32(p_cur[i].cfg.modem.rat);
3141 p.writeInt32(p_cur[i].cfg.modem.maxVoice);
3142 p.writeInt32(p_cur[i].cfg.modem.maxData);
3143 p.writeInt32(p_cur[i].cfg.modem.maxStandby);
3144
3145 appendPrintBuf("%s modem: uuid=%s,state=%d,rat=%08x,maxV=%d,maxD=%d,maxS=%d", printBuf,
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003146 p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.modem.rat,
3147 p_cur[i].cfg.modem.maxVoice, p_cur[i].cfg.modem.maxData,
3148 p_cur[i].cfg.modem.maxStandby);
Etan Cohend3652192014-06-20 08:28:44 -07003149 break;
3150 }
3151 case RIL_HARDWARE_CONFIG_SIM: {
3152 writeStringToParcel(p, p_cur[i].uuid);
3153 p.writeInt32((int)p_cur[i].state);
3154 writeStringToParcel(p, p_cur[i].cfg.sim.modemUuid);
3155
3156 appendPrintBuf("%s sim: uuid=%s,state=%d,modem-uuid=%s", printBuf,
3157 p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.sim.modemUuid);
3158 break;
3159 }
3160 }
3161 }
3162 removeLastChar;
3163 closeResponse;
3164 return 0;
3165}
3166
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003167static int responseRadioCapability(Parcel &p, int slotId, int requestNumber, int responseType,
3168 int token, RIL_Errno e, void *response, size_t responselen) {
Wink Saville8b4e4f72014-10-17 15:01:45 -07003169 if (response == NULL) {
3170 RLOGE("invalid response: NULL");
3171 return RIL_ERRNO_INVALID_RESPONSE;
3172 }
3173
3174 if (responselen != sizeof (RIL_RadioCapability) ) {
3175 RLOGE("invalid response length was %d expected %d",
3176 (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
3177 return RIL_ERRNO_INVALID_RESPONSE;
3178 }
3179
3180 RIL_RadioCapability *p_cur = (RIL_RadioCapability *) response;
3181 p.writeInt32(p_cur->version);
3182 p.writeInt32(p_cur->session);
3183 p.writeInt32(p_cur->phase);
3184 p.writeInt32(p_cur->rat);
3185 writeStringToParcel(p, p_cur->logicalModemUuid);
3186 p.writeInt32(p_cur->status);
3187
3188 startResponse;
3189 appendPrintBuf("%s[version=%d,session=%d,phase=%d,\
Legler Wu8caf06f2014-10-29 14:02:14 +08003190 rat=%s,logicalModemUuid=%s,status=%d]",
Wink Saville8b4e4f72014-10-17 15:01:45 -07003191 printBuf,
3192 p_cur->version,
3193 p_cur->session,
3194 p_cur->phase,
3195 p_cur->rat,
Legler Wu8caf06f2014-10-29 14:02:14 +08003196 p_cur->logicalModemUuid,
Wink Saville8b4e4f72014-10-17 15:01:45 -07003197 p_cur->status);
3198 closeResponse;
3199 return 0;
3200}
3201
Wink Saville3d54e742009-05-18 18:00:44 -07003202static void triggerEvLoop() {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003203 int ret;
3204 if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
3205 /* trigger event loop to wakeup. No reason to do this,
3206 * if we're in the event loop thread */
3207 do {
3208 ret = write (s_fdWakeupWrite, " ", 1);
3209 } while (ret < 0 && errno == EINTR);
3210 }
3211}
3212
Wink Saville3d54e742009-05-18 18:00:44 -07003213static void rilEventAddWakeup(struct ril_event *ev) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003214 ril_event_add(ev);
3215 triggerEvLoop();
3216}
3217
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003218static int responseCdmaSms(Parcel &p, int slotId, int requestNumber, int responseType, int token,
3219 RIL_Errno e, void *response, size_t responselen) {
Wink Savillef4c4d362009-04-02 01:37:03 -07003220 int num;
3221 int digitCount;
3222 int digitLimit;
3223 uint8_t uct;
3224 void* dest;
3225
Wink Saville8eb2a122012-11-19 16:05:13 -08003226 RLOGD("Inside responseCdmaSms");
Wink Savillef5903df2009-04-24 11:54:14 -07003227
Wink Savillef4c4d362009-04-02 01:37:03 -07003228 if (response == NULL && responselen != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003229 RLOGE("invalid response: NULL");
Wink Savillef4c4d362009-04-02 01:37:03 -07003230 return RIL_ERRNO_INVALID_RESPONSE;
3231 }
3232
Wink Savillef5903df2009-04-24 11:54:14 -07003233 if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003234 RLOGE("invalid response length was %d expected %d",
Wink Savillef5903df2009-04-24 11:54:14 -07003235 (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
Wink Savillef4c4d362009-04-02 01:37:03 -07003236 return RIL_ERRNO_INVALID_RESPONSE;
3237 }
3238
3239 RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
3240 p.writeInt32(p_cur->uTeleserviceID);
3241 p.write(&(p_cur->bIsServicePresent),sizeof(uct));
3242 p.writeInt32(p_cur->uServicecategory);
3243 p.writeInt32(p_cur->sAddress.digit_mode);
3244 p.writeInt32(p_cur->sAddress.number_mode);
3245 p.writeInt32(p_cur->sAddress.number_type);
3246 p.writeInt32(p_cur->sAddress.number_plan);
3247 p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
3248 digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
3249 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3250 p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
3251 }
3252
3253 p.writeInt32(p_cur->sSubAddress.subaddressType);
3254 p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
3255 p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
3256 digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
3257 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3258 p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
3259 }
3260
3261 digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
3262 p.writeInt32(p_cur->uBearerDataLen);
3263 for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3264 p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
3265 }
3266
3267 startResponse;
3268 appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
Wink Saville1b5fd232009-04-22 14:50:00 -07003269 sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
Wink Savillef4c4d362009-04-02 01:37:03 -07003270 printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
3271 p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
3272 closeResponse;
3273
3274 return 0;
3275}
3276
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003277static int responseDcRtInfo(Parcel &p, int slotId, int requestNumber, int responseType, int token,
3278 RIL_Errno e, void *response, size_t responselen)
Wink Savillec29360a2014-07-13 05:17:28 -07003279{
3280 int num = responselen / sizeof(RIL_DcRtInfo);
3281 if ((responselen % sizeof(RIL_DcRtInfo) != 0) || (num != 1)) {
Amit Mahajan52500162014-07-29 17:36:48 -07003282 RLOGE("responseDcRtInfo: invalid response length %d expected multiple of %d",
Wink Savillec29360a2014-07-13 05:17:28 -07003283 (int)responselen, (int)sizeof(RIL_DcRtInfo));
3284 return RIL_ERRNO_INVALID_RESPONSE;
3285 }
3286
3287 startResponse;
3288 RIL_DcRtInfo *pDcRtInfo = (RIL_DcRtInfo *)response;
3289 p.writeInt64(pDcRtInfo->time);
3290 p.writeInt32(pDcRtInfo->powerState);
3291 appendPrintBuf("%s[time=%d,powerState=%d]", printBuf,
3292 pDcRtInfo->time,
3293 pDcRtInfo->powerState);
3294 closeResponse;
3295
3296 return 0;
3297}
3298
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003299static int responseLceData(Parcel &p, int slotId, int requestNumber, int responseType, int token,
3300 RIL_Errno e, void *response, size_t responselen) {
fengluf7408292015-04-14 14:53:55 -07003301 if (response == NULL || responselen != sizeof(RIL_LceDataInfo)) {
3302 if (response == NULL) {
3303 RLOGE("invalid response: NULL");
3304 }
3305 else {
Meng Wangef966a32016-06-20 17:38:18 -07003306 RLOGE("responseLceData: invalid response length %u expecting len: %u",
3307 (unsigned)sizeof(RIL_LceDataInfo), (unsigned)responselen);
fengluf7408292015-04-14 14:53:55 -07003308 }
3309 return RIL_ERRNO_INVALID_RESPONSE;
3310 }
3311
3312 RIL_LceDataInfo *p_cur = (RIL_LceDataInfo *)response;
3313 p.writeInt32(p_cur->last_hop_capacity_kbps);
3314
3315 /* p_cur->confidence_level and p_cur->lce_suspended take 1 byte each.*/
3316 p.write((void *)&(p_cur->confidence_level), 1);
3317 p.write((void *)&(p_cur->lce_suspended), 1);
3318
3319 startResponse;
Hyejin606dd672015-09-14 16:27:28 -07003320 appendPrintBuf("LCE info received: capacity %d confidence level %d \
fengluf7408292015-04-14 14:53:55 -07003321 and suspended %d",
3322 p_cur->last_hop_capacity_kbps, p_cur->confidence_level,
3323 p_cur->lce_suspended);
3324 closeResponse;
3325
3326 return 0;
3327}
3328
Amit Mahajan18fe36b2016-08-25 11:19:21 -07003329static int responsePcoData(Parcel &p, int slotId, int requestNumber, int responseType, int token,
3330 RIL_Errno e, void *response, size_t responselen) {
Robert Greenwalt27e99c52016-06-01 16:31:38 -07003331 if (response == NULL) {
3332 RLOGE("responsePcoData: invalid NULL response");
3333 return RIL_ERRNO_INVALID_RESPONSE;
3334 }
3335 if (responselen != sizeof(RIL_PCO_Data)) {
Meng Wangef966a32016-06-20 17:38:18 -07003336 RLOGE("responsePcoData: invalid response length %u, expecting %u",
3337 (unsigned)responselen, (unsigned)sizeof(RIL_PCO_Data));
Robert Greenwalt27e99c52016-06-01 16:31:38 -07003338 return RIL_ERRNO_INVALID_RESPONSE;
3339 }
3340
3341 RIL_PCO_Data *p_cur = (RIL_PCO_Data *)response;
3342 p.writeInt32(p_cur->cid);
3343 writeStringToParcel(p, p_cur->bearer_proto);
3344 p.writeInt32(p_cur->pco_id);
3345 p.writeInt32(p_cur->contents_length);
3346 p.write(p_cur->contents, p_cur->contents_length);
3347
3348 startResponse;
3349 appendPrintBuf("PCO data received: cid %d, id %d, length %d",
3350 p_cur->cid, p_cur->pco_id, p_cur->contents_length);
3351 closeResponse;
3352
3353 return 0;
3354}
3355
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003356/**
3357 * A write on the wakeup fd is done just to pop us out of select()
3358 * We empty the buffer here and then ril_event will reset the timers on the
3359 * way back down
3360 */
Wink Savillef4c4d362009-04-02 01:37:03 -07003361static void processWakeupCallback(int fd, short flags, void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003362 char buff[16];
3363 int ret;
3364
Wink Saville8eb2a122012-11-19 16:05:13 -08003365 RLOGV("processWakeupCallback");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003366
3367 /* empty our wakeup socket out */
3368 do {
3369 ret = read(s_fdWakeupRead, &buff, sizeof(buff));
Wink Saville7f856802009-06-09 10:23:37 -07003370 } while (ret > 0 || (ret < 0 && errno == EINTR));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003371}
3372
Etan Cohend3652192014-06-20 08:28:44 -07003373static void onCommandsSocketClosed(RIL_SOCKET_ID socket_id) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003374 int ret;
3375 RequestInfo *p_cur;
Etan Cohend3652192014-06-20 08:28:44 -07003376 /* Hook for current context
3377 pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
3378 pthread_mutex_t * pendingRequestsMutexHook = &s_pendingRequestsMutex;
3379 /* pendingRequestsHook refer to &s_pendingRequests */
3380 RequestInfo ** pendingRequestsHook = &s_pendingRequests;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003381
Etan Cohend3652192014-06-20 08:28:44 -07003382#if (SIM_COUNT >= 2)
3383 if (socket_id == RIL_SOCKET_2) {
3384 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
3385 pendingRequestsHook = &s_pendingRequests_socket2;
3386 }
3387#if (SIM_COUNT >= 3)
3388 else if (socket_id == RIL_SOCKET_3) {
3389 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
3390 pendingRequestsHook = &s_pendingRequests_socket3;
3391 }
3392#endif
3393#if (SIM_COUNT >= 4)
3394 else if (socket_id == RIL_SOCKET_4) {
3395 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
3396 pendingRequestsHook = &s_pendingRequests_socket4;
3397 }
3398#endif
3399#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003400 /* mark pending requests as "cancelled" so we dont report responses */
Etan Cohend3652192014-06-20 08:28:44 -07003401 ret = pthread_mutex_lock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003402 assert (ret == 0);
3403
Etan Cohend3652192014-06-20 08:28:44 -07003404 p_cur = *pendingRequestsHook;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003405
Etan Cohend3652192014-06-20 08:28:44 -07003406 for (p_cur = *pendingRequestsHook
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003407 ; p_cur != NULL
3408 ; p_cur = p_cur->p_next
3409 ) {
3410 p_cur->cancelled = 1;
3411 }
3412
Etan Cohend3652192014-06-20 08:28:44 -07003413 ret = pthread_mutex_unlock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003414 assert (ret == 0);
3415}
3416
Wink Savillef4c4d362009-04-02 01:37:03 -07003417static void processCommandsCallback(int fd, short flags, void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003418 RecordStream *p_rs;
3419 void *p_record;
3420 size_t recordlen;
3421 int ret;
Etan Cohend3652192014-06-20 08:28:44 -07003422 SocketListenParam *p_info = (SocketListenParam *)param;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003423
Etan Cohend3652192014-06-20 08:28:44 -07003424 assert(fd == p_info->fdCommand);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003425
Etan Cohend3652192014-06-20 08:28:44 -07003426 p_rs = p_info->p_rs;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003427
3428 for (;;) {
3429 /* loop until EAGAIN/EINTR, end of stream, or other error */
3430 ret = record_stream_get_next(p_rs, &p_record, &recordlen);
3431
3432 if (ret == 0 && p_record == NULL) {
3433 /* end-of-stream */
3434 break;
3435 } else if (ret < 0) {
3436 break;
3437 } else if (ret == 0) { /* && p_record != NULL */
Etan Cohend3652192014-06-20 08:28:44 -07003438 processCommandBuffer(p_record, recordlen, p_info->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003439 }
3440 }
3441
3442 if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
3443 /* fatal error or end-of-stream */
3444 if (ret != 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003445 RLOGE("error on reading command socket errno:%d\n", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003446 } else {
Wink Saville8eb2a122012-11-19 16:05:13 -08003447 RLOGW("EOS. Closing command socket.");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003448 }
Wink Saville7f856802009-06-09 10:23:37 -07003449
Etan Cohend3652192014-06-20 08:28:44 -07003450 close(fd);
3451 p_info->fdCommand = -1;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003452
Etan Cohend3652192014-06-20 08:28:44 -07003453 ril_event_del(p_info->commands_event);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003454
3455 record_stream_free(p_rs);
3456
3457 /* start listening for new connections again */
3458 rilEventAddWakeup(&s_listen_event);
3459
Etan Cohend3652192014-06-20 08:28:44 -07003460 onCommandsSocketClosed(p_info->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003461 }
3462}
3463
Weilun Dud2c30932017-02-09 12:32:42 -08003464static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) {
3465 if (s_lastNITZTimeData != NULL) {
3466 Parcel p;
3467 int responseType = (s_callbacks.version >= 13)
3468 ? RESPONSE_UNSOLICITED_ACK_EXP
3469 : RESPONSE_UNSOLICITED;
3470 int ret = radio::nitzTimeReceivedInd(
3471 p, (int)socket_id, RIL_UNSOL_NITZ_TIME_RECEIVED, responseType, 0,
3472 RIL_E_SUCCESS, s_lastNITZTimeData, s_lastNITZTimeDataSize);
3473 if (ret == 0) {
3474 free(s_lastNITZTimeData);
3475 s_lastNITZTimeData = NULL;
3476 }
3477 }
3478}
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003479
Etan Cohend3652192014-06-20 08:28:44 -07003480static void onNewCommandConnect(RIL_SOCKET_ID socket_id) {
Wink Saville5b9df332011-04-06 16:24:21 -07003481 // Inform we are connected and the ril version
Jake Hambya9c18d12011-04-12 23:32:08 -07003482 int rilVer = s_callbacks.version;
Etan Cohend3652192014-06-20 08:28:44 -07003483 RIL_UNSOL_RESPONSE(RIL_UNSOL_RIL_CONNECTED,
3484 &rilVer, sizeof(rilVer), socket_id);
Wink Saville5b9df332011-04-06 16:24:21 -07003485
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003486 // implicit radio state changed
Etan Cohend3652192014-06-20 08:28:44 -07003487 RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
3488 NULL, 0, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003489
3490 // Send last NITZ time data, in case it was missed
3491 if (s_lastNITZTimeData != NULL) {
Weilun Dud2c30932017-02-09 12:32:42 -08003492 resendLastNITZTimeData(socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003493 }
3494
3495 // Get version string
3496 if (s_callbacks.getVersion != NULL) {
3497 const char *version;
3498 version = s_callbacks.getVersion();
Wink Saville8eb2a122012-11-19 16:05:13 -08003499 RLOGI("RIL Daemon version: %s\n", version);
Wink Saville7f856802009-06-09 10:23:37 -07003500
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003501 property_set(PROPERTY_RIL_IMPL, version);
3502 } else {
Wink Saville8eb2a122012-11-19 16:05:13 -08003503 RLOGI("RIL Daemon version: unavailable\n");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003504 property_set(PROPERTY_RIL_IMPL, "unavailable");
3505 }
3506
3507}
3508
Wink Savillef4c4d362009-04-02 01:37:03 -07003509static void listenCallback (int fd, short flags, void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003510 int ret;
3511 int err;
3512 int is_phone_socket;
Etan Cohend3652192014-06-20 08:28:44 -07003513 int fdCommand = -1;
Meng Wangef966a32016-06-20 17:38:18 -07003514 const char* processName;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003515 RecordStream *p_rs;
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003516 MySocketListenParam* listenParam;
3517 RilSocket *sapSocket = NULL;
3518 socketClient *sClient = NULL;
3519
Etan Cohend3652192014-06-20 08:28:44 -07003520 SocketListenParam *p_info = (SocketListenParam *)param;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003521
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003522 if(RIL_SAP_SOCKET == p_info->type) {
3523 listenParam = (MySocketListenParam *)param;
3524 sapSocket = listenParam->socket;
3525 }
3526
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003527 struct sockaddr_un peeraddr;
3528 socklen_t socklen = sizeof (peeraddr);
3529
3530 struct ucred creds;
3531 socklen_t szCreds = sizeof(creds);
3532
3533 struct passwd *pwd = NULL;
3534
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003535 if(NULL == sapSocket) {
George Burgess IVd9cee0a2016-10-27 22:51:30 -07003536 assert (p_info->fdCommand < 0);
3537 assert (fd == p_info->fdListen);
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003538 processName = PHONE_PROCESS;
3539 } else {
George Burgess IVd9cee0a2016-10-27 22:51:30 -07003540 assert (sapSocket->getCommandFd() < 0);
3541 assert (fd == sapSocket->getListenFd());
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003542 processName = BLUETOOTH_PROCESS;
3543 }
3544
Wink Saville7f856802009-06-09 10:23:37 -07003545
Etan Cohend3652192014-06-20 08:28:44 -07003546 fdCommand = accept(fd, (sockaddr *) &peeraddr, &socklen);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003547
Etan Cohend3652192014-06-20 08:28:44 -07003548 if (fdCommand < 0 ) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003549 RLOGE("Error on accept() errno:%d", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003550 /* start listening for new connections again */
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003551 if(NULL == sapSocket) {
3552 rilEventAddWakeup(p_info->listen_event);
3553 } else {
3554 rilEventAddWakeup(sapSocket->getListenEvent());
3555 }
Etan Cohend3652192014-06-20 08:28:44 -07003556 return;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003557 }
3558
3559 /* check the credential of the other side and only accept socket from
3560 * phone process
Wink Saville7f856802009-06-09 10:23:37 -07003561 */
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003562 errno = 0;
3563 is_phone_socket = 0;
Wink Savillef4c4d362009-04-02 01:37:03 -07003564
Etan Cohend3652192014-06-20 08:28:44 -07003565 err = getsockopt(fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
Wink Savillef4c4d362009-04-02 01:37:03 -07003566
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003567 if (err == 0 && szCreds > 0) {
Wink Savillef4c4d362009-04-02 01:37:03 -07003568 errno = 0;
3569 pwd = getpwuid(creds.uid);
3570 if (pwd != NULL) {
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003571 if (strcmp(pwd->pw_name, processName) == 0) {
Wink Savillef4c4d362009-04-02 01:37:03 -07003572 is_phone_socket = 1;
3573 } else {
Wink Saville8eb2a122012-11-19 16:05:13 -08003574 RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
Wink Savillef4c4d362009-04-02 01:37:03 -07003575 }
3576 } else {
Wink Saville8eb2a122012-11-19 16:05:13 -08003577 RLOGE("Error on getpwuid() errno: %d", errno);
Wink Savillef4c4d362009-04-02 01:37:03 -07003578 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003579 } else {
Wink Saville8eb2a122012-11-19 16:05:13 -08003580 RLOGD("Error on getsockopt() errno: %d", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003581 }
3582
Etan Cohend3652192014-06-20 08:28:44 -07003583 if (!is_phone_socket) {
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003584 RLOGE("RILD must accept socket from %s", processName);
Wink Saville7f856802009-06-09 10:23:37 -07003585
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003586 close(fdCommand);
3587 fdCommand = -1;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003588
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003589 if(NULL == sapSocket) {
3590 onCommandsSocketClosed(p_info->socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003591
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003592 /* start listening for new connections again */
3593 rilEventAddWakeup(p_info->listen_event);
3594 } else {
3595 sapSocket->onCommandsSocketClosed();
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003596
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003597 /* start listening for new connections again */
3598 rilEventAddWakeup(sapSocket->getListenEvent());
3599 }
3600
3601 return;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003602 }
3603
Etan Cohend3652192014-06-20 08:28:44 -07003604 ret = fcntl(fdCommand, F_SETFL, O_NONBLOCK);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003605
3606 if (ret < 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003607 RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003608 }
3609
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003610 if(NULL == sapSocket) {
3611 RLOGI("libril: new connection to %s", rilSocketIdToString(p_info->socket_id));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003612
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003613 p_info->fdCommand = fdCommand;
3614 p_rs = record_stream_new(p_info->fdCommand, MAX_COMMAND_BYTES);
3615 p_info->p_rs = p_rs;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003616
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003617 ril_event_set (p_info->commands_event, p_info->fdCommand, 1,
Etan Cohend3652192014-06-20 08:28:44 -07003618 p_info->processCommandsCallback, p_info);
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003619 rilEventAddWakeup (p_info->commands_event);
Etan Cohend3652192014-06-20 08:28:44 -07003620
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003621 onNewCommandConnect(p_info->socket_id);
3622 } else {
3623 RLOGI("libril: new connection");
Etan Cohend3652192014-06-20 08:28:44 -07003624
Dheeraj Shetty27976c42014-07-02 21:27:57 +02003625 sapSocket->setCommandFd(fdCommand);
3626 p_rs = record_stream_new(sapSocket->getCommandFd(), MAX_COMMAND_BYTES);
3627 sClient = new socketClient(sapSocket,p_rs);
3628 ril_event_set (sapSocket->getCallbackEvent(), sapSocket->getCommandFd(), 1,
3629 sapSocket->getCommandCb(), sClient);
3630
3631 rilEventAddWakeup(sapSocket->getCallbackEvent());
3632 sapSocket->onNewCommandConnect();
3633 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003634}
3635
3636static void freeDebugCallbackArgs(int number, char **args) {
3637 for (int i = 0; i < number; i++) {
3638 if (args[i] != NULL) {
3639 free(args[i]);
3640 }
3641 }
3642 free(args);
3643}
3644
Wink Savillef4c4d362009-04-02 01:37:03 -07003645static void debugCallback (int fd, short flags, void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003646 int acceptFD, option;
3647 struct sockaddr_un peeraddr;
3648 socklen_t socklen = sizeof (peeraddr);
3649 int data;
3650 unsigned int qxdm_data[6];
3651 const char *deactData[1] = {"1"};
3652 char *actData[1];
3653 RIL_Dial dialData;
3654 int hangupData[1] = {1};
3655 int number;
3656 char **args;
Etan Cohend3652192014-06-20 08:28:44 -07003657 RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
3658 int sim_id = 0;
3659
3660 RLOGI("debugCallback for socket %s", rilSocketIdToString(socket_id));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003661
3662 acceptFD = accept (fd, (sockaddr *) &peeraddr, &socklen);
3663
3664 if (acceptFD < 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003665 RLOGE ("error accepting on debug port: %d\n", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003666 return;
3667 }
3668
3669 if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003670 RLOGE ("error reading on socket: number of Args: \n");
Sanket Padawe55227b52016-02-29 10:09:26 -08003671 close(acceptFD);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003672 return;
3673 }
Sanket Padawe55227b52016-02-29 10:09:26 -08003674
Sanket Padawe0cfc5532016-03-07 17:12:19 -08003675 if (number < 0) {
3676 RLOGE ("Invalid number of arguments: \n");
3677 close(acceptFD);
3678 return;
3679 }
3680
3681 args = (char **) calloc(number, sizeof(char*));
Sanket Padawe55227b52016-02-29 10:09:26 -08003682 if (args == NULL) {
3683 RLOGE("Memory allocation failed for debug args");
3684 close(acceptFD);
3685 return;
3686 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003687
3688 for (int i = 0; i < number; i++) {
3689 int len;
3690 if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003691 RLOGE ("error reading on socket: Len of Args: \n");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003692 freeDebugCallbackArgs(i, args);
Sanket Padawe55227b52016-02-29 10:09:26 -08003693 close(acceptFD);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003694 return;
3695 }
Sanket Padawe0cfc5532016-03-07 17:12:19 -08003696 if (len == INT_MAX || len < 0) {
3697 RLOGE("Invalid value of len: \n");
3698 freeDebugCallbackArgs(i, args);
3699 close(acceptFD);
3700 return;
3701 }
Sanket Padawe55227b52016-02-29 10:09:26 -08003702
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003703 // +1 for null-term
Sanket Padawe0cfc5532016-03-07 17:12:19 -08003704 args[i] = (char *) calloc(len + 1, sizeof(char));
Sanket Padawe55227b52016-02-29 10:09:26 -08003705 if (args[i] == NULL) {
3706 RLOGE("Memory allocation failed for debug args");
3707 freeDebugCallbackArgs(i, args);
3708 close(acceptFD);
3709 return;
3710 }
Wink Saville7f856802009-06-09 10:23:37 -07003711 if (recv(acceptFD, args[i], sizeof(char) * len, 0)
Wink Saville1b5fd232009-04-22 14:50:00 -07003712 != (int)sizeof(char) * len) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003713 RLOGE ("error reading on socket: Args[%d] \n", i);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003714 freeDebugCallbackArgs(i, args);
Sanket Padawe55227b52016-02-29 10:09:26 -08003715 close(acceptFD);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003716 return;
3717 }
3718 char * buf = args[i];
3719 buf[len] = 0;
Etan Cohend3652192014-06-20 08:28:44 -07003720 if ((i+1) == number) {
3721 /* The last argument should be sim id 0(SIM1)~3(SIM4) */
3722 sim_id = atoi(args[i]);
3723 switch (sim_id) {
3724 case 0:
3725 socket_id = RIL_SOCKET_1;
3726 break;
3727 #if (SIM_COUNT >= 2)
3728 case 1:
3729 socket_id = RIL_SOCKET_2;
3730 break;
3731 #endif
3732 #if (SIM_COUNT >= 3)
3733 case 2:
3734 socket_id = RIL_SOCKET_3;
3735 break;
3736 #endif
3737 #if (SIM_COUNT >= 4)
3738 case 3:
3739 socket_id = RIL_SOCKET_4;
3740 break;
3741 #endif
3742 default:
3743 socket_id = RIL_SOCKET_1;
3744 break;
3745 }
3746 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003747 }
3748
3749 switch (atoi(args[0])) {
3750 case 0:
Wink Saville8eb2a122012-11-19 16:05:13 -08003751 RLOGI ("Connection on debug port: issuing reset.");
Etan Cohend3652192014-06-20 08:28:44 -07003752 issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003753 break;
3754 case 1:
Wink Saville8eb2a122012-11-19 16:05:13 -08003755 RLOGI ("Connection on debug port: issuing radio power off.");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003756 data = 0;
Etan Cohend3652192014-06-20 08:28:44 -07003757 issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003758 // Close the socket
Etan Cohend3652192014-06-20 08:28:44 -07003759 if (socket_id == RIL_SOCKET_1 && s_ril_param_socket.fdCommand > 0) {
3760 close(s_ril_param_socket.fdCommand);
3761 s_ril_param_socket.fdCommand = -1;
3762 }
3763 #if (SIM_COUNT == 2)
3764 else if (socket_id == RIL_SOCKET_2 && s_ril_param_socket2.fdCommand > 0) {
3765 close(s_ril_param_socket2.fdCommand);
3766 s_ril_param_socket2.fdCommand = -1;
3767 }
3768 #endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003769 break;
3770 case 2:
Wink Saville8eb2a122012-11-19 16:05:13 -08003771 RLOGI ("Debug port: issuing unsolicited voice network change.");
Etan Cohend3652192014-06-20 08:28:44 -07003772 RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, NULL, 0, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003773 break;
3774 case 3:
Wink Saville8eb2a122012-11-19 16:05:13 -08003775 RLOGI ("Debug port: QXDM log enable.");
Xia Wangd855ef42010-07-27 17:26:55 -07003776 qxdm_data[0] = 65536; // head.func_tag
3777 qxdm_data[1] = 16; // head.len
3778 qxdm_data[2] = 1; // mode: 1 for 'start logging'
3779 qxdm_data[3] = 32; // log_file_size: 32megabytes
3780 qxdm_data[4] = 0; // log_mask
3781 qxdm_data[5] = 8; // log_max_fileindex
Wink Saville7f856802009-06-09 10:23:37 -07003782 issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
Etan Cohend3652192014-06-20 08:28:44 -07003783 6 * sizeof(int), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003784 break;
3785 case 4:
Wink Saville8eb2a122012-11-19 16:05:13 -08003786 RLOGI ("Debug port: QXDM log disable.");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003787 qxdm_data[0] = 65536;
3788 qxdm_data[1] = 16;
Xia Wangd855ef42010-07-27 17:26:55 -07003789 qxdm_data[2] = 0; // mode: 0 for 'stop logging'
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003790 qxdm_data[3] = 32;
3791 qxdm_data[4] = 0;
Xia Wangd855ef42010-07-27 17:26:55 -07003792 qxdm_data[5] = 8;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003793 issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
Etan Cohend3652192014-06-20 08:28:44 -07003794 6 * sizeof(int), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003795 break;
3796 case 5:
Wink Saville8eb2a122012-11-19 16:05:13 -08003797 RLOGI("Debug port: Radio On");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003798 data = 1;
Etan Cohend3652192014-06-20 08:28:44 -07003799 issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003800 sleep(2);
3801 // Set network selection automatic.
Etan Cohend3652192014-06-20 08:28:44 -07003802 issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003803 break;
3804 case 6:
Wink Saville8eb2a122012-11-19 16:05:13 -08003805 RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003806 actData[0] = args[1];
Wink Saville7f856802009-06-09 10:23:37 -07003807 issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
Etan Cohend3652192014-06-20 08:28:44 -07003808 sizeof(actData), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003809 break;
3810 case 7:
Wink Saville8eb2a122012-11-19 16:05:13 -08003811 RLOGI("Debug port: Deactivate Data Call");
Wink Saville7f856802009-06-09 10:23:37 -07003812 issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
Etan Cohend3652192014-06-20 08:28:44 -07003813 sizeof(deactData), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003814 break;
3815 case 8:
Wink Saville8eb2a122012-11-19 16:05:13 -08003816 RLOGI("Debug port: Dial Call");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003817 dialData.clir = 0;
3818 dialData.address = args[1];
Etan Cohend3652192014-06-20 08:28:44 -07003819 issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003820 break;
3821 case 9:
Wink Saville8eb2a122012-11-19 16:05:13 -08003822 RLOGI("Debug port: Answer Call");
Etan Cohend3652192014-06-20 08:28:44 -07003823 issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0, socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003824 break;
3825 case 10:
Wink Saville8eb2a122012-11-19 16:05:13 -08003826 RLOGI("Debug port: End Call");
Wink Saville7f856802009-06-09 10:23:37 -07003827 issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
Etan Cohend3652192014-06-20 08:28:44 -07003828 sizeof(hangupData), socket_id);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003829 break;
3830 default:
Wink Saville8eb2a122012-11-19 16:05:13 -08003831 RLOGE ("Invalid request");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003832 break;
3833 }
3834 freeDebugCallbackArgs(number, args);
3835 close(acceptFD);
3836}
3837
3838
Wink Savillef4c4d362009-04-02 01:37:03 -07003839static void userTimerCallback (int fd, short flags, void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003840 UserCallbackInfo *p_info;
3841
3842 p_info = (UserCallbackInfo *)param;
3843
3844 p_info->p_callback(p_info->userParam);
3845
3846
3847 // FIXME generalize this...there should be a cancel mechanism
3848 if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
3849 s_last_wake_timeout_info = NULL;
3850 }
3851
3852 free(p_info);
3853}
3854
3855
3856static void *
Wink Savillef4c4d362009-04-02 01:37:03 -07003857eventLoop(void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003858 int ret;
3859 int filedes[2];
3860
3861 ril_event_init();
3862
3863 pthread_mutex_lock(&s_startupMutex);
3864
3865 s_started = 1;
3866 pthread_cond_broadcast(&s_startupCond);
3867
3868 pthread_mutex_unlock(&s_startupMutex);
3869
3870 ret = pipe(filedes);
3871
3872 if (ret < 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003873 RLOGE("Error in pipe() errno:%d", errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003874 return NULL;
3875 }
3876
3877 s_fdWakeupRead = filedes[0];
3878 s_fdWakeupWrite = filedes[1];
3879
3880 fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
3881
3882 ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
3883 processWakeupCallback, NULL);
3884
3885 rilEventAddWakeup (&s_wakeupfd_event);
3886
3887 // Only returns on error
3888 ril_event_loop();
Wink Saville8eb2a122012-11-19 16:05:13 -08003889 RLOGE ("error in event_loop_base errno:%d", errno);
Kazuhiro Ondo5cdc1352011-10-14 17:50:58 -05003890 // kill self to restart on error
3891 kill(0, SIGKILL);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003892
3893 return NULL;
3894}
3895
Wink Saville7f856802009-06-09 10:23:37 -07003896extern "C" void
Wink Savillef4c4d362009-04-02 01:37:03 -07003897RIL_startEventLoop(void) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003898 /* spin up eventLoop thread and wait for it to get started */
3899 s_started = 0;
3900 pthread_mutex_lock(&s_startupMutex);
3901
Elliott Hughesc0d8dc62014-01-03 15:31:42 -08003902 pthread_attr_t attr;
3903 pthread_attr_init(&attr);
Wink Saville7f856802009-06-09 10:23:37 -07003904 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
Elliott Hughesc0d8dc62014-01-03 15:31:42 -08003905
Elliott Hughesfd81e712014-01-06 12:46:02 -08003906 int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
3907 if (result != 0) {
3908 RLOGE("Failed to create dispatch thread: %s", strerror(result));
Elliott Hughesc0d8dc62014-01-03 15:31:42 -08003909 goto done;
3910 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003911
3912 while (s_started == 0) {
3913 pthread_cond_wait(&s_startupCond, &s_startupMutex);
3914 }
3915
Elliott Hughesc0d8dc62014-01-03 15:31:42 -08003916done:
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003917 pthread_mutex_unlock(&s_startupMutex);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003918}
3919
3920// Used for testing purpose only.
3921extern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
3922 memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
3923}
3924
Etan Cohend3652192014-06-20 08:28:44 -07003925static void startListen(RIL_SOCKET_ID socket_id, SocketListenParam* socket_listen_p) {
3926 int fdListen = -1;
3927 int ret;
3928 char socket_name[10];
3929
3930 memset(socket_name, 0, sizeof(char)*10);
3931
3932 switch(socket_id) {
3933 case RIL_SOCKET_1:
3934 strncpy(socket_name, RIL_getRilSocketName(), 9);
3935 break;
3936 #if (SIM_COUNT >= 2)
3937 case RIL_SOCKET_2:
3938 strncpy(socket_name, SOCKET2_NAME_RIL, 9);
3939 break;
3940 #endif
3941 #if (SIM_COUNT >= 3)
3942 case RIL_SOCKET_3:
3943 strncpy(socket_name, SOCKET3_NAME_RIL, 9);
3944 break;
3945 #endif
3946 #if (SIM_COUNT >= 4)
3947 case RIL_SOCKET_4:
3948 strncpy(socket_name, SOCKET4_NAME_RIL, 9);
3949 break;
3950 #endif
3951 default:
3952 RLOGE("Socket id is wrong!!");
3953 return;
3954 }
3955
3956 RLOGI("Start to listen %s", rilSocketIdToString(socket_id));
3957
3958 fdListen = android_get_control_socket(socket_name);
3959 if (fdListen < 0) {
3960 RLOGE("Failed to get socket %s", socket_name);
3961 exit(-1);
3962 }
3963
3964 ret = listen(fdListen, 4);
3965
3966 if (ret < 0) {
3967 RLOGE("Failed to listen on control socket '%d': %s",
3968 fdListen, strerror(errno));
3969 exit(-1);
3970 }
3971 socket_listen_p->fdListen = fdListen;
3972
3973 /* note: non-persistent so we can accept only one connection at a time */
3974 ril_event_set (socket_listen_p->listen_event, fdListen, false,
3975 listenCallback, socket_listen_p);
3976
3977 rilEventAddWakeup (socket_listen_p->listen_event);
3978}
3979
Wink Saville7f856802009-06-09 10:23:37 -07003980extern "C" void
Wink Savillef4c4d362009-04-02 01:37:03 -07003981RIL_register (const RIL_RadioFunctions *callbacks) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003982 int ret;
3983 int flags;
3984
Etan Cohend3652192014-06-20 08:28:44 -07003985 RLOGI("SIM_COUNT: %d", SIM_COUNT);
3986
Wink Saville43808972011-01-13 17:39:51 -08003987 if (callbacks == NULL) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003988 RLOGE("RIL_register: RIL_RadioFunctions * null");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003989 return;
3990 }
Wink Saville43808972011-01-13 17:39:51 -08003991 if (callbacks->version < RIL_VERSION_MIN) {
Wink Saville8eb2a122012-11-19 16:05:13 -08003992 RLOGE("RIL_register: version %d is to old, min version is %d",
Wink Saville43808972011-01-13 17:39:51 -08003993 callbacks->version, RIL_VERSION_MIN);
3994 return;
Wink Saville3a4840b2010-04-07 13:29:58 -07003995 }
Sanket Padawe4c05f352016-01-26 16:19:00 -08003996
Wink Saville8eb2a122012-11-19 16:05:13 -08003997 RLOGE("RIL_register: RIL version %d", callbacks->version);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08003998
3999 if (s_registerCalled > 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08004000 RLOGE("RIL_register has been called more than once. "
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004001 "Subsequent call ignored");
4002 return;
4003 }
4004
4005 memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
4006
Etan Cohend3652192014-06-20 08:28:44 -07004007 /* Initialize socket1 parameters */
4008 s_ril_param_socket = {
4009 RIL_SOCKET_1, /* socket_id */
4010 -1, /* fdListen */
4011 -1, /* fdCommand */
4012 PHONE_PROCESS, /* processName */
4013 &s_commands_event, /* commands_event */
4014 &s_listen_event, /* listen_event */
4015 processCommandsCallback, /* processCommandsCallback */
Meng Wangef966a32016-06-20 17:38:18 -07004016 NULL, /* p_rs */
4017 RIL_TELEPHONY_SOCKET /* type */
Etan Cohend3652192014-06-20 08:28:44 -07004018 };
4019
4020#if (SIM_COUNT >= 2)
4021 s_ril_param_socket2 = {
4022 RIL_SOCKET_2, /* socket_id */
4023 -1, /* fdListen */
4024 -1, /* fdCommand */
4025 PHONE_PROCESS, /* processName */
4026 &s_commands_event_socket2, /* commands_event */
4027 &s_listen_event_socket2, /* listen_event */
4028 processCommandsCallback, /* processCommandsCallback */
Meng Wangef966a32016-06-20 17:38:18 -07004029 NULL, /* p_rs */
4030 RIL_TELEPHONY_SOCKET /* type */
Etan Cohend3652192014-06-20 08:28:44 -07004031 };
4032#endif
4033
4034#if (SIM_COUNT >= 3)
4035 s_ril_param_socket3 = {
4036 RIL_SOCKET_3, /* socket_id */
4037 -1, /* fdListen */
4038 -1, /* fdCommand */
4039 PHONE_PROCESS, /* processName */
4040 &s_commands_event_socket3, /* commands_event */
4041 &s_listen_event_socket3, /* listen_event */
4042 processCommandsCallback, /* processCommandsCallback */
Meng Wangef966a32016-06-20 17:38:18 -07004043 NULL, /* p_rs */
4044 RIL_TELEPHONY_SOCKET /* type */
Etan Cohend3652192014-06-20 08:28:44 -07004045 };
4046#endif
4047
4048#if (SIM_COUNT >= 4)
4049 s_ril_param_socket4 = {
4050 RIL_SOCKET_4, /* socket_id */
4051 -1, /* fdListen */
4052 -1, /* fdCommand */
4053 PHONE_PROCESS, /* processName */
4054 &s_commands_event_socket4, /* commands_event */
4055 &s_listen_event_socket4, /* listen_event */
4056 processCommandsCallback, /* processCommandsCallback */
Meng Wangef966a32016-06-20 17:38:18 -07004057 NULL, /* p_rs */
4058 RIL_TELEPHONY_SOCKET /* type */
Etan Cohend3652192014-06-20 08:28:44 -07004059 };
4060#endif
4061
4062
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004063 s_registerCalled = 1;
4064
Etan Cohend3652192014-06-20 08:28:44 -07004065 RLOGI("s_registerCalled flag set, %d", s_started);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004066 // Little self-check
4067
Wink Savillef4c4d362009-04-02 01:37:03 -07004068 for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004069 assert(i == s_commands[i].requestNumber);
4070 }
4071
Wink Savillef4c4d362009-04-02 01:37:03 -07004072 for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
Wink Saville7f856802009-06-09 10:23:37 -07004073 assert(i + RIL_UNSOL_RESPONSE_BASE
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004074 == s_unsolResponses[i].requestNumber);
4075 }
4076
4077 // New rild impl calls RIL_startEventLoop() first
4078 // old standalone impl wants it here.
4079
4080 if (s_started == 0) {
4081 RIL_startEventLoop();
4082 }
4083
Etan Cohend3652192014-06-20 08:28:44 -07004084 // start listen socket1
4085 startListen(RIL_SOCKET_1, &s_ril_param_socket);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004086
Etan Cohend3652192014-06-20 08:28:44 -07004087#if (SIM_COUNT >= 2)
4088 // start listen socket2
4089 startListen(RIL_SOCKET_2, &s_ril_param_socket2);
4090#endif /* (SIM_COUNT == 2) */
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004091
Etan Cohend3652192014-06-20 08:28:44 -07004092#if (SIM_COUNT >= 3)
4093 // start listen socket3
4094 startListen(RIL_SOCKET_3, &s_ril_param_socket3);
4095#endif /* (SIM_COUNT == 3) */
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004096
Etan Cohend3652192014-06-20 08:28:44 -07004097#if (SIM_COUNT >= 4)
4098 // start listen socket4
4099 startListen(RIL_SOCKET_4, &s_ril_param_socket4);
4100#endif /* (SIM_COUNT == 4) */
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004101
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004102 radio::registerService(&s_callbacks, s_commands);
4103 RLOGI("RILHIDL called registerService");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004104
4105#if 1
4106 // start debug interface socket
4107
Etan Cohend3652192014-06-20 08:28:44 -07004108 char *inst = NULL;
4109 if (strlen(RIL_getRilSocketName()) >= strlen(SOCKET_NAME_RIL)) {
4110 inst = RIL_getRilSocketName() + strlen(SOCKET_NAME_RIL);
4111 }
4112
4113 char rildebug[MAX_DEBUG_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL_DEBUG;
4114 if (inst != NULL) {
Nick Kralevichc52e45e2015-02-08 07:54:16 -08004115 strlcat(rildebug, inst, MAX_DEBUG_SOCKET_NAME_LENGTH);
Etan Cohend3652192014-06-20 08:28:44 -07004116 }
4117
4118 s_fdDebug = android_get_control_socket(rildebug);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004119 if (s_fdDebug < 0) {
Etan Cohend3652192014-06-20 08:28:44 -07004120 RLOGE("Failed to get socket : %s errno:%d", rildebug, errno);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004121 exit(-1);
4122 }
4123
4124 ret = listen(s_fdDebug, 4);
4125
4126 if (ret < 0) {
Wink Saville8eb2a122012-11-19 16:05:13 -08004127 RLOGE("Failed to listen on ril debug socket '%d': %s",
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004128 s_fdDebug, strerror(errno));
4129 exit(-1);
4130 }
4131
4132 ril_event_set (&s_debug_event, s_fdDebug, true,
4133 debugCallback, NULL);
4134
4135 rilEventAddWakeup (&s_debug_event);
4136#endif
4137
4138}
4139
Dheeraj Shetty27976c42014-07-02 21:27:57 +02004140extern "C" void
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004141RIL_register_socket (RIL_RadioFunctions *(*Init)(const struct RIL_Env *, int, char **),
4142 RIL_SOCKET_TYPE socketType, int argc, char **argv) {
Dheeraj Shetty27976c42014-07-02 21:27:57 +02004143
4144 RIL_RadioFunctions* UimFuncs = NULL;
4145
4146 if(Init) {
4147 UimFuncs = Init(&RilSapSocket::uimRilEnv, argc, argv);
4148
4149 switch(socketType) {
4150 case RIL_SAP_SOCKET:
4151 RilSapSocket::initSapSocket("sap_uim_socket1", UimFuncs);
4152
4153#if (SIM_COUNT >= 2)
4154 RilSapSocket::initSapSocket("sap_uim_socket2", UimFuncs);
4155#endif
4156
4157#if (SIM_COUNT >= 3)
4158 RilSapSocket::initSapSocket("sap_uim_socket3", UimFuncs);
4159#endif
4160
4161#if (SIM_COUNT >= 4)
4162 RilSapSocket::initSapSocket("sap_uim_socket4", UimFuncs);
4163#endif
Meng Wangef966a32016-06-20 17:38:18 -07004164 break;
4165 default:;
Dheeraj Shetty27976c42014-07-02 21:27:57 +02004166 }
Amit Mahajanc2c71852016-11-29 16:48:54 -08004167
4168 RLOGI("RIL_register_socket: calling registerService");
4169 sap::registerService(UimFuncs);
Dheeraj Shetty27976c42014-07-02 21:27:57 +02004170 }
4171}
4172
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004173// Check and remove RequestInfo if its a response and not just ack sent back
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004174static int
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004175checkAndDequeueRequestInfoIfAck(struct RequestInfo *pRI, bool isAck) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004176 int ret = 0;
Etan Cohend3652192014-06-20 08:28:44 -07004177 /* Hook for current context
4178 pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
4179 pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
4180 /* pendingRequestsHook refer to &s_pendingRequests */
4181 RequestInfo ** pendingRequestsHook = &s_pendingRequests;
Wink Saville7f856802009-06-09 10:23:37 -07004182
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004183 if (pRI == NULL) {
4184 return 0;
4185 }
4186
Etan Cohend3652192014-06-20 08:28:44 -07004187#if (SIM_COUNT >= 2)
4188 if (pRI->socket_id == RIL_SOCKET_2) {
4189 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
4190 pendingRequestsHook = &s_pendingRequests_socket2;
4191 }
4192#if (SIM_COUNT >= 3)
4193 if (pRI->socket_id == RIL_SOCKET_3) {
4194 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
4195 pendingRequestsHook = &s_pendingRequests_socket3;
4196 }
4197#endif
4198#if (SIM_COUNT >= 4)
4199 if (pRI->socket_id == RIL_SOCKET_4) {
4200 pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
4201 pendingRequestsHook = &s_pendingRequests_socket4;
4202 }
4203#endif
4204#endif
4205 pthread_mutex_lock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004206
Etan Cohend3652192014-06-20 08:28:44 -07004207 for(RequestInfo **ppCur = pendingRequestsHook
Wink Saville7f856802009-06-09 10:23:37 -07004208 ; *ppCur != NULL
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004209 ; ppCur = &((*ppCur)->p_next)
4210 ) {
4211 if (pRI == *ppCur) {
4212 ret = 1;
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004213 if (isAck) { // Async ack
4214 if (pRI->wasAckSent == 1) {
4215 RLOGD("Ack was already sent for %s", requestToString(pRI->pCI->requestNumber));
4216 } else {
4217 pRI->wasAckSent = 1;
4218 }
4219 } else {
4220 *ppCur = (*ppCur)->p_next;
4221 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004222 break;
4223 }
4224 }
4225
Etan Cohend3652192014-06-20 08:28:44 -07004226 pthread_mutex_unlock(pendingRequestsMutexHook);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004227
4228 return ret;
4229}
4230
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004231static int findFd(int socket_id) {
Etan Cohend3652192014-06-20 08:28:44 -07004232 int fd = s_ril_param_socket.fdCommand;
Etan Cohend3652192014-06-20 08:28:44 -07004233#if (SIM_COUNT >= 2)
4234 if (socket_id == RIL_SOCKET_2) {
4235 fd = s_ril_param_socket2.fdCommand;
4236 }
4237#if (SIM_COUNT >= 3)
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004238 if (socket_id == RIL_SOCKET_3) {
4239 fd = s_ril_param_socket3.fdCommand;
4240 }
Etan Cohend3652192014-06-20 08:28:44 -07004241#endif
4242#if (SIM_COUNT >= 4)
4243 if (socket_id == RIL_SOCKET_4) {
4244 fd = s_ril_param_socket4.fdCommand;
4245 }
4246#endif
4247#endif
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004248 return fd;
4249}
4250
4251extern "C" void
4252RIL_onRequestAck(RIL_Token t) {
4253 RequestInfo *pRI;
4254 int ret, fd;
4255
4256 size_t errorOffset;
4257 RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
4258
4259 pRI = (RequestInfo *)t;
4260
4261 if (!checkAndDequeueRequestInfoIfAck(pRI, true)) {
4262 RLOGE ("RIL_onRequestAck: invalid RIL_Token");
4263 return;
4264 }
4265
4266 socket_id = pRI->socket_id;
4267 fd = findFd(socket_id);
4268
4269#if VDBG
4270 RLOGD("Request Ack, %s", rilSocketIdToString(socket_id));
4271#endif
4272
4273 appendPrintBuf("Ack [%04d]< %s", pRI->token, requestToString(pRI->pCI->requestNumber));
4274
4275 if (pRI->cancelled == 0) {
Jack Yubbd4b1b2017-02-13 11:21:00 -08004276 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(
4277 (int) socket_id);
4278 int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr);
4279 assert(rwlockRet == 0);
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004280
Jack Yubbd4b1b2017-02-13 11:21:00 -08004281 radio::acknowledgeRequest((int) socket_id, pRI->token);
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004282
Jack Yubbd4b1b2017-02-13 11:21:00 -08004283 rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr);
4284 assert(rwlockRet == 0);
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004285 }
4286}
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004287extern "C" void
4288RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
4289 RequestInfo *pRI;
4290 int ret;
4291 int fd;
4292 size_t errorOffset;
4293 RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
4294
4295 pRI = (RequestInfo *)t;
4296
4297 if (!checkAndDequeueRequestInfoIfAck(pRI, false)) {
4298 RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
4299 return;
4300 }
4301
4302 socket_id = pRI->socket_id;
4303 fd = findFd(socket_id);
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07004304#if VDBG
Etan Cohend3652192014-06-20 08:28:44 -07004305 RLOGD("RequestComplete, %s", rilSocketIdToString(socket_id));
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07004306#endif
Etan Cohend3652192014-06-20 08:28:44 -07004307
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004308 if (pRI->local > 0) {
4309 // Locally issued command...void only!
4310 // response does not go back up the command socket
Wink Saville8eb2a122012-11-19 16:05:13 -08004311 RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004312
Jack Yubbd4b1b2017-02-13 11:21:00 -08004313 free(pRI);
4314 return;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004315 }
4316
4317 appendPrintBuf("[%04d]< %s",
4318 pRI->token, requestToString(pRI->pCI->requestNumber));
4319
4320 if (pRI->cancelled == 0) {
4321 Parcel p;
4322
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004323 int responseType;
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004324 if (s_callbacks.version >= 13 && pRI->wasAckSent == 1) {
4325 // If ack was already sent, then this call is an asynchronous response. So we need to
4326 // send id indicating that we expect an ack from RIL.java as we acquire wakelock here.
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004327 responseType = RESPONSE_SOLICITED_ACK_EXP;
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004328 grabPartialWakeLock();
4329 } else {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004330 responseType = RESPONSE_SOLICITED;
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004331 }
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004332 p.writeInt32 (responseType);
4333
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004334 p.writeInt32 (pRI->token);
4335 errorOffset = p.dataPosition();
4336
4337 p.writeInt32 (e);
4338
Jack Yubbd4b1b2017-02-13 11:21:00 -08004339 // there is a response payload, no matter success or not.
4340 RLOGE ("Calling responseFunction() for token %d", pRI->token);
Sanket Padawe85f952a2017-01-02 23:46:00 -08004341
Jack Yubbd4b1b2017-02-13 11:21:00 -08004342 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock((int) socket_id);
4343 int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr);
4344 assert(rwlockRet == 0);
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004345
Jack Yubbd4b1b2017-02-13 11:21:00 -08004346 ret = pRI->pCI->responseFunction(p, (int) socket_id, pRI->pCI->requestNumber,
4347 responseType, pRI->token, e, response, responselen);
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004348
Jack Yubbd4b1b2017-02-13 11:21:00 -08004349 rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr);
4350 assert(rwlockRet == 0);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004351 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004352 free(pRI);
4353}
4354
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004355static void
Wink Savillef4c4d362009-04-02 01:37:03 -07004356grabPartialWakeLock() {
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004357 if (s_callbacks.version >= 13) {
4358 int ret;
4359 ret = pthread_mutex_lock(&s_wakeLockCountMutex);
4360 assert(ret == 0);
4361 acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
Sanket Padawe55227b52016-02-29 10:09:26 -08004362
4363 UserCallbackInfo *p_info =
4364 internalRequestTimedCallback(wakeTimeoutCallback, NULL, &TIMEVAL_WAKE_TIMEOUT);
4365 if (p_info == NULL) {
4366 release_wake_lock(ANDROID_WAKE_LOCK_NAME);
4367 } else {
4368 s_wakelock_count++;
4369 if (s_last_wake_timeout_info != NULL) {
4370 s_last_wake_timeout_info->userParam = (void *)1;
4371 }
4372 s_last_wake_timeout_info = p_info;
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004373 }
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004374 ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
4375 assert(ret == 0);
4376 } else {
4377 acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
4378 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004379}
4380
Sanket Padawe85f952a2017-01-02 23:46:00 -08004381void
Wink Savillef4c4d362009-04-02 01:37:03 -07004382releaseWakeLock() {
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004383 if (s_callbacks.version >= 13) {
4384 int ret;
4385 ret = pthread_mutex_lock(&s_wakeLockCountMutex);
4386 assert(ret == 0);
4387
4388 if (s_wakelock_count > 1) {
4389 s_wakelock_count--;
4390 } else {
4391 s_wakelock_count = 0;
4392 release_wake_lock(ANDROID_WAKE_LOCK_NAME);
4393 if (s_last_wake_timeout_info != NULL) {
4394 s_last_wake_timeout_info->userParam = (void *)1;
4395 }
4396 }
4397
4398 ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
4399 assert(ret == 0);
4400 } else {
4401 release_wake_lock(ANDROID_WAKE_LOCK_NAME);
4402 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004403}
4404
4405/**
4406 * Timer callback to put us back to sleep before the default timeout
4407 */
4408static void
Wink Savillef4c4d362009-04-02 01:37:03 -07004409wakeTimeoutCallback (void *param) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004410 // We're using "param != NULL" as a cancellation mechanism
Sanket Padawe6ff9a872016-01-27 15:09:12 -08004411 if (s_callbacks.version >= 13) {
4412 if (param == NULL) {
4413 int ret;
4414 ret = pthread_mutex_lock(&s_wakeLockCountMutex);
4415 assert(ret == 0);
4416 s_wakelock_count = 0;
4417 release_wake_lock(ANDROID_WAKE_LOCK_NAME);
4418 ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
4419 assert(ret == 0);
4420 }
4421 } else {
4422 if (param == NULL) {
4423 releaseWakeLock();
4424 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004425 }
4426}
4427
Etan Cohend3652192014-06-20 08:28:44 -07004428#if defined(ANDROID_MULTI_SIM)
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004429extern "C"
Bernhard Rosenkränzerd613b962014-11-17 20:52:09 +01004430void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
Etan Cohend3652192014-06-20 08:28:44 -07004431 size_t datalen, RIL_SOCKET_ID socket_id)
4432#else
4433extern "C"
Bernhard Rosenkränzerd613b962014-11-17 20:52:09 +01004434void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004435 size_t datalen)
Etan Cohend3652192014-06-20 08:28:44 -07004436#endif
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004437{
4438 int unsolResponseIndex;
4439 int ret;
4440 int64_t timeReceived = 0;
4441 bool shouldScheduleTimeout = false;
Naveen Kalla2bc78d62011-12-07 16:22:53 -08004442 RIL_RadioState newState;
Etan Cohend3652192014-06-20 08:28:44 -07004443 RIL_SOCKET_ID soc_id = RIL_SOCKET_1;
4444
4445#if defined(ANDROID_MULTI_SIM)
4446 soc_id = socket_id;
4447#endif
4448
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004449
4450 if (s_registerCalled == 0) {
4451 // Ignore RIL_onUnsolicitedResponse before RIL_register
Wink Saville8eb2a122012-11-19 16:05:13 -08004452 RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004453 return;
4454 }
Wink Saville7f856802009-06-09 10:23:37 -07004455
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004456 unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
4457
4458 if ((unsolResponseIndex < 0)
4459 || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
Wink Saville8eb2a122012-11-19 16:05:13 -08004460 RLOGE("unsupported unsolicited response code %d", unsolResponse);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004461 return;
4462 }
4463
4464 // Grab a wake lock if needed for this reponse,
4465 // as we exit we'll either release it immediately
4466 // or set a timer to release it later.
4467 switch (s_unsolResponses[unsolResponseIndex].wakeType) {
4468 case WAKE_PARTIAL:
4469 grabPartialWakeLock();
4470 shouldScheduleTimeout = true;
4471 break;
4472
4473 case DONT_WAKE:
4474 default:
4475 // No wake lock is grabed so don't set timeout
4476 shouldScheduleTimeout = false;
4477 break;
4478 }
4479
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004480 appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
4481
4482 Parcel p;
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004483 int responseType;
Sanket Padawed8c0b462016-02-03 11:46:02 -08004484 if (s_callbacks.version >= 13
4485 && s_unsolResponses[unsolResponseIndex].wakeType == WAKE_PARTIAL) {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004486 responseType = RESPONSE_UNSOLICITED_ACK_EXP;
Sanket Padawed8c0b462016-02-03 11:46:02 -08004487 } else {
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004488 responseType = RESPONSE_UNSOLICITED;
Sanket Padawed8c0b462016-02-03 11:46:02 -08004489 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004490
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004491 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock((int) soc_id);
4492 int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr);
4493 assert(rwlockRet == 0);
4494
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004495 ret = s_unsolResponses[unsolResponseIndex].responseFunction(
4496 p, (int) soc_id, unsolResponse, responseType, 0, RIL_E_SUCCESS, const_cast<void*>(data),
4497 datalen);
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004498
4499 rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr);
4500 assert(rwlockRet == 0);
4501
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004502 // some things get more payload
4503 switch(unsolResponse) {
4504 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
Naveen Kalla2baf7232016-10-11 13:49:20 -07004505 newState = CALL_ONSTATEREQUEST(soc_id);
Naveen Kalla2baf7232016-10-11 13:49:20 -07004506 appendPrintBuf("%s {%s}", printBuf, radioStateToString(newState));
Amit Mahajan14566d32017-01-06 16:55:33 -08004507 break;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004508 }
4509
Sanket Padawe55227b52016-02-29 10:09:26 -08004510 if (s_callbacks.version < 13) {
4511 if (shouldScheduleTimeout) {
4512 UserCallbackInfo *p_info = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
4513 &TIMEVAL_WAKE_TIMEOUT);
4514
4515 if (p_info == NULL) {
4516 goto error_exit;
4517 } else {
4518 // Cancel the previous request
4519 if (s_last_wake_timeout_info != NULL) {
4520 s_last_wake_timeout_info->userParam = (void *)1;
4521 }
4522 s_last_wake_timeout_info = p_info;
4523 }
4524 }
4525 }
4526
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07004527#if VDBG
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004528 RLOGI("%s UNSOLICITED: %s length:%d", rilSocketIdToString(soc_id),
4529 requestToString(unsolResponse), p.dataSize());
Robert Greenwalt191e4dc2015-04-29 16:57:39 -07004530#endif
Weilun Dud2c30932017-02-09 12:32:42 -08004531
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004532 switch (unsolResponse) {
4533 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004534 rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr);
4535 assert(rwlockRet == 0);
4536
Amit Mahajanbd3257b2016-12-28 17:28:07 -08004537 radio::radioStateChangedInd(soc_id, responseType, newState);
Amit Mahajan32ec8a42017-01-24 05:45:02 -08004538
4539 rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr);
4540 assert(rwlockRet == 0);
Amit Mahajanbd3257b2016-12-28 17:28:07 -08004541 break;
Amit Mahajan18fe36b2016-08-25 11:19:21 -07004542 }
4543
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004544 if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004545 // Unfortunately, NITZ time is not poll/update like everything
4546 // else in the system. So, if the upstream client isn't connected,
4547 // keep a copy of the last NITZ response (with receive time noted
4548 // above) around so we can deliver it when it is connected
4549
4550 if (s_lastNITZTimeData != NULL) {
Weilun Dud2c30932017-02-09 12:32:42 -08004551 free(s_lastNITZTimeData);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004552 s_lastNITZTimeData = NULL;
4553 }
4554
Weilun Dud2c30932017-02-09 12:32:42 -08004555 s_lastNITZTimeData = calloc(datalen, 1);
Sanket Padawe55227b52016-02-29 10:09:26 -08004556 if (s_lastNITZTimeData == NULL) {
Weilun Dud2c30932017-02-09 12:32:42 -08004557 RLOGE("Memory allocation failed in RIL_onUnsolicitedResponse");
4558 goto error_exit;
Sanket Padawe55227b52016-02-29 10:09:26 -08004559 }
Weilun Dud2c30932017-02-09 12:32:42 -08004560 s_lastNITZTimeDataSize = datalen;
4561 memcpy(s_lastNITZTimeData, data, datalen);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004562 }
4563
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004564 // Normal exit
4565 return;
4566
4567error_exit:
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004568 if (shouldScheduleTimeout) {
4569 releaseWakeLock();
4570 }
4571}
4572
Wink Saville7f856802009-06-09 10:23:37 -07004573/** FIXME generalize this if you track UserCAllbackInfo, clear it
4574 when the callback occurs
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004575*/
4576static UserCallbackInfo *
Wink Saville7f856802009-06-09 10:23:37 -07004577internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
Dianne Hackborn0d9f0c02010-06-25 16:50:46 -07004578 const struct timeval *relativeTime)
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004579{
4580 struct timeval myRelativeTime;
4581 UserCallbackInfo *p_info;
4582
Sanket Padawe0cfc5532016-03-07 17:12:19 -08004583 p_info = (UserCallbackInfo *) calloc(1, sizeof(UserCallbackInfo));
Sanket Padawe55227b52016-02-29 10:09:26 -08004584 if (p_info == NULL) {
4585 RLOGE("Memory allocation failed in internalRequestTimedCallback");
4586 return p_info;
4587
4588 }
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004589
Wink Saville7f856802009-06-09 10:23:37 -07004590 p_info->p_callback = callback;
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004591 p_info->userParam = param;
Dianne Hackborn0d9f0c02010-06-25 16:50:46 -07004592
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004593 if (relativeTime == NULL) {
4594 /* treat null parameter as a 0 relative time */
4595 memset (&myRelativeTime, 0, sizeof(myRelativeTime));
4596 } else {
4597 /* FIXME I think event_add's tv param is really const anyway */
4598 memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
4599 }
4600
4601 ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
4602
4603 ril_timer_add(&(p_info->event), &myRelativeTime);
4604
4605 triggerEvLoop();
4606 return p_info;
4607}
4608
Naveen Kalla7edd07c2010-06-21 18:54:47 -07004609
4610extern "C" void
Dianne Hackborn0d9f0c02010-06-25 16:50:46 -07004611RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
4612 const struct timeval *relativeTime) {
4613 internalRequestTimedCallback (callback, param, relativeTime);
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004614}
4615
4616const char *
Wink Savillef4c4d362009-04-02 01:37:03 -07004617failCauseToString(RIL_Errno e) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004618 switch(e) {
4619 case RIL_E_SUCCESS: return "E_SUCCESS";
Robert Greenwalt2126ab22013-04-09 12:20:45 -07004620 case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004621 case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
4622 case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
4623 case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
4624 case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
4625 case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
4626 case RIL_E_CANCELLED: return "E_CANCELLED";
4627 case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
4628 case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
4629 case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
Wink Savillef4c4d362009-04-02 01:37:03 -07004630 case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
John Wang75534472010-04-20 15:11:42 -07004631 case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
Wink Saville7f856802009-06-09 10:23:37 -07004632#ifdef FEATURE_MULTIMODE_ANDROID
Wink Savillef4c4d362009-04-02 01:37:03 -07004633 case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
4634 case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
4635#endif
Sanket Padaweb39e5c92016-02-08 14:28:59 -08004636 case RIL_E_FDN_CHECK_FAILURE: return "E_FDN_CHECK_FAILURE";
4637 case RIL_E_MISSING_RESOURCE: return "E_MISSING_RESOURCE";
4638 case RIL_E_NO_SUCH_ELEMENT: return "E_NO_SUCH_ELEMENT";
4639 case RIL_E_DIAL_MODIFIED_TO_USSD: return "E_DIAL_MODIFIED_TO_USSD";
4640 case RIL_E_DIAL_MODIFIED_TO_SS: return "E_DIAL_MODIFIED_TO_SS";
4641 case RIL_E_DIAL_MODIFIED_TO_DIAL: return "E_DIAL_MODIFIED_TO_DIAL";
4642 case RIL_E_USSD_MODIFIED_TO_DIAL: return "E_USSD_MODIFIED_TO_DIAL";
4643 case RIL_E_USSD_MODIFIED_TO_SS: return "E_USSD_MODIFIED_TO_SS";
4644 case RIL_E_USSD_MODIFIED_TO_USSD: return "E_USSD_MODIFIED_TO_USSD";
4645 case RIL_E_SS_MODIFIED_TO_DIAL: return "E_SS_MODIFIED_TO_DIAL";
4646 case RIL_E_SS_MODIFIED_TO_USSD: return "E_SS_MODIFIED_TO_USSD";
4647 case RIL_E_SUBSCRIPTION_NOT_SUPPORTED: return "E_SUBSCRIPTION_NOT_SUPPORTED";
4648 case RIL_E_SS_MODIFIED_TO_SS: return "E_SS_MODIFIED_TO_SS";
4649 case RIL_E_LCE_NOT_SUPPORTED: return "E_LCE_NOT_SUPPORTED";
4650 case RIL_E_NO_MEMORY: return "E_NO_MEMORY";
4651 case RIL_E_INTERNAL_ERR: return "E_INTERNAL_ERR";
4652 case RIL_E_SYSTEM_ERR: return "E_SYSTEM_ERR";
4653 case RIL_E_MODEM_ERR: return "E_MODEM_ERR";
4654 case RIL_E_INVALID_STATE: return "E_INVALID_STATE";
4655 case RIL_E_NO_RESOURCES: return "E_NO_RESOURCES";
4656 case RIL_E_SIM_ERR: return "E_SIM_ERR";
4657 case RIL_E_INVALID_ARGUMENTS: return "E_INVALID_ARGUMENTS";
4658 case RIL_E_INVALID_SIM_STATE: return "E_INVALID_SIM_STATE";
4659 case RIL_E_INVALID_MODEM_STATE: return "E_INVALID_MODEM_STATE";
4660 case RIL_E_INVALID_CALL_ID: return "E_INVALID_CALL_ID";
4661 case RIL_E_NO_SMS_TO_ACK: return "E_NO_SMS_TO_ACK";
4662 case RIL_E_NETWORK_ERR: return "E_NETWORK_ERR";
4663 case RIL_E_REQUEST_RATE_LIMITED: return "E_REQUEST_RATE_LIMITED";
twen.changdf7add02016-03-04 18:27:48 +08004664 case RIL_E_SIM_BUSY: return "E_SIM_BUSY";
4665 case RIL_E_SIM_FULL: return "E_SIM_FULL";
4666 case RIL_E_NETWORK_REJECT: return "E_NETWORK_REJECT";
4667 case RIL_E_OPERATION_NOT_ALLOWED: return "E_OPERATION_NOT_ALLOWED";
4668 case RIL_E_EMPTY_RECORD: "E_EMPTY_RECORD";
Ajay Nambi68900f52016-03-11 12:02:55 -08004669 case RIL_E_INVALID_SMS_FORMAT: return "E_INVALID_SMS_FORMAT";
4670 case RIL_E_ENCODING_ERR: return "E_ENCODING_ERR";
4671 case RIL_E_INVALID_SMSC_ADDRESS: return "E_INVALID_SMSC_ADDRESS";
4672 case RIL_E_NO_SUCH_ENTRY: return "E_NO_SUCH_ENTRY";
4673 case RIL_E_NETWORK_NOT_READY: return "E_NETWORK_NOT_READY";
4674 case RIL_E_NOT_PROVISIONED: return "E_NOT_PROVISIONED";
Ajay Nambi10345892016-03-19 09:02:28 -07004675 case RIL_E_NO_SUBSCRIPTION: return "E_NO_SUBSCRIPTION";
4676 case RIL_E_NO_NETWORK_FOUND: return "E_NO_NETWORK_FOUND";
4677 case RIL_E_DEVICE_IN_USE: return "E_DEVICE_IN_USE";
4678 case RIL_E_ABORTED: return "E_ABORTED";
Sanket Padawe85f952a2017-01-02 23:46:00 -08004679 case RIL_E_INVALID_RESPONSE: return "INVALID_RESPONSE";
Sanket Padawe0106aed2016-02-09 09:56:31 -08004680 case RIL_E_OEM_ERROR_1: return "E_OEM_ERROR_1";
4681 case RIL_E_OEM_ERROR_2: return "E_OEM_ERROR_2";
4682 case RIL_E_OEM_ERROR_3: return "E_OEM_ERROR_3";
4683 case RIL_E_OEM_ERROR_4: return "E_OEM_ERROR_4";
4684 case RIL_E_OEM_ERROR_5: return "E_OEM_ERROR_5";
4685 case RIL_E_OEM_ERROR_6: return "E_OEM_ERROR_6";
4686 case RIL_E_OEM_ERROR_7: return "E_OEM_ERROR_7";
4687 case RIL_E_OEM_ERROR_8: return "E_OEM_ERROR_8";
4688 case RIL_E_OEM_ERROR_9: return "E_OEM_ERROR_9";
4689 case RIL_E_OEM_ERROR_10: return "E_OEM_ERROR_10";
4690 case RIL_E_OEM_ERROR_11: return "E_OEM_ERROR_11";
4691 case RIL_E_OEM_ERROR_12: return "E_OEM_ERROR_12";
4692 case RIL_E_OEM_ERROR_13: return "E_OEM_ERROR_13";
4693 case RIL_E_OEM_ERROR_14: return "E_OEM_ERROR_14";
4694 case RIL_E_OEM_ERROR_15: return "E_OEM_ERROR_15";
4695 case RIL_E_OEM_ERROR_16: return "E_OEM_ERROR_16";
4696 case RIL_E_OEM_ERROR_17: return "E_OEM_ERROR_17";
4697 case RIL_E_OEM_ERROR_18: return "E_OEM_ERROR_18";
4698 case RIL_E_OEM_ERROR_19: return "E_OEM_ERROR_19";
4699 case RIL_E_OEM_ERROR_20: return "E_OEM_ERROR_20";
4700 case RIL_E_OEM_ERROR_21: return "E_OEM_ERROR_21";
4701 case RIL_E_OEM_ERROR_22: return "E_OEM_ERROR_22";
4702 case RIL_E_OEM_ERROR_23: return "E_OEM_ERROR_23";
4703 case RIL_E_OEM_ERROR_24: return "E_OEM_ERROR_24";
4704 case RIL_E_OEM_ERROR_25: return "E_OEM_ERROR_25";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004705 default: return "<unknown error>";
4706 }
4707}
4708
4709const char *
Wink Savillef4c4d362009-04-02 01:37:03 -07004710radioStateToString(RIL_RadioState s) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004711 switch(s) {
4712 case RADIO_STATE_OFF: return "RADIO_OFF";
4713 case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
Naveen Kalla2bc78d62011-12-07 16:22:53 -08004714 case RADIO_STATE_ON:return"RADIO_ON";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004715 default: return "<unknown state>";
4716 }
4717}
4718
4719const char *
Wink Savillef4c4d362009-04-02 01:37:03 -07004720callStateToString(RIL_CallState s) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004721 switch(s) {
4722 case RIL_CALL_ACTIVE : return "ACTIVE";
4723 case RIL_CALL_HOLDING: return "HOLDING";
4724 case RIL_CALL_DIALING: return "DIALING";
4725 case RIL_CALL_ALERTING: return "ALERTING";
4726 case RIL_CALL_INCOMING: return "INCOMING";
4727 case RIL_CALL_WAITING: return "WAITING";
4728 default: return "<unknown state>";
4729 }
4730}
4731
4732const char *
Wink Savillef4c4d362009-04-02 01:37:03 -07004733requestToString(int request) {
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004734/*
4735 cat libs/telephony/ril_commands.h \
4736 | egrep "^ *{RIL_" \
4737 | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
4738
4739
4740 cat libs/telephony/ril_unsol_commands.h \
4741 | egrep "^ *{RIL_" \
4742 | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
4743
4744*/
4745 switch(request) {
4746 case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
4747 case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
4748 case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
4749 case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
4750 case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
4751 case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
4752 case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
4753 case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
4754 case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
4755 case RIL_REQUEST_DIAL: return "DIAL";
4756 case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
4757 case RIL_REQUEST_HANGUP: return "HANGUP";
4758 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
4759 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
4760 case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
4761 case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
4762 case RIL_REQUEST_UDUB: return "UDUB";
4763 case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
4764 case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
Wink Savillec0114b32011-02-18 10:14:07 -08004765 case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
4766 case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004767 case RIL_REQUEST_OPERATOR: return "OPERATOR";
4768 case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
4769 case RIL_REQUEST_DTMF: return "DTMF";
4770 case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
4771 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
Wink Savillef4c4d362009-04-02 01:37:03 -07004772 case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004773 case RIL_REQUEST_SIM_IO: return "SIM_IO";
4774 case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
4775 case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
4776 case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
4777 case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
4778 case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
4779 case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
4780 case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
4781 case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
4782 case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
4783 case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
4784 case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
4785 case RIL_REQUEST_ANSWER: return "ANSWER";
Wink Savillef4c4d362009-04-02 01:37:03 -07004786 case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004787 case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
4788 case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
4789 case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
4790 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
4791 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
4792 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
Matt Mower897915e2015-04-08 23:16:03 -05004793 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: return "QUERY_AVAILABLE_NETWORKS";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004794 case RIL_REQUEST_DTMF_START: return "DTMF_START";
4795 case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
4796 case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
4797 case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004798 case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
4799 case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
4800 case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
Wink Savillef4c4d362009-04-02 01:37:03 -07004801 case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
4802 case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004803 case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
4804 case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
4805 case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
Matt Mower897915e2015-04-08 23:16:03 -05004806 case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
4807 case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "SET_SUPP_SVC_NOTIFICATION";
4808 case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
4809 case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
Wink Savillef4c4d362009-04-02 01:37:03 -07004810 case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
4811 case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004812 case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
4813 case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
4814 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
4815 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
4816 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004817 case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
Matt Mower897915e2015-04-08 23:16:03 -05004818 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
4819 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
4820 case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004821 case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
Matt Mower897915e2015-04-08 23:16:03 -05004822 case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: return "CDMA_SET_SUBSCRIPTION_SOURCE";
4823 case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: return "CDMA_SET_ROAMING_PREFERENCE";
4824 case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: return "CDMA_QUERY_ROAMING_PREFERENCE";
4825 case RIL_REQUEST_SET_TTY_MODE: return "SET_TTY_MODE";
4826 case RIL_REQUEST_QUERY_TTY_MODE: return "QUERY_TTY_MODE";
4827 case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: return "CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
4828 case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: return "CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
4829 case RIL_REQUEST_CDMA_FLASH: return "CDMA_FLASH";
4830 case RIL_REQUEST_CDMA_BURST_DTMF: return "CDMA_BURST_DTMF";
4831 case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return "CDMA_VALIDATE_AND_WRITE_AKEY";
4832 case RIL_REQUEST_CDMA_SEND_SMS: return "CDMA_SEND_SMS";
4833 case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: return "CDMA_SMS_ACKNOWLEDGE";
4834 case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG: return "GSM_GET_BROADCAST_SMS_CONFIG";
4835 case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG: return "GSM_SET_BROADCAST_SMS_CONFIG";
4836 case RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION: return "GSM_SMS_BROADCAST_ACTIVATION";
4837 case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG: return "CDMA_GET_BROADCAST_SMS_CONFIG";
4838 case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG: return "CDMA_SET_BROADCAST_SMS_CONFIG";
4839 case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION: return "CDMA_SMS_BROADCAST_ACTIVATION";
4840 case RIL_REQUEST_CDMA_SUBSCRIPTION: return "CDMA_SUBSCRIPTION";
Wink Savillef4c4d362009-04-02 01:37:03 -07004841 case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
4842 case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
4843 case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
jsh000a9fe2009-05-11 14:52:35 -07004844 case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
4845 case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
4846 case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
jsh09a68ba2009-06-10 11:56:38 -07004847 case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
jsh563fd722010-06-08 16:52:24 -07004848 case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
Wink Savillec0114b32011-02-18 10:14:07 -08004849 case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
Jake Hambyfa8d5842011-08-19 16:22:18 -07004850 case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
Matt Mower897915e2015-04-08 23:16:03 -05004851 case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
4852 case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "STK_SEND_ENVELOPE_WITH_STATUS";
Naveen Kalla2bc78d62011-12-07 16:22:53 -08004853 case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
Matt Mower897915e2015-04-08 23:16:03 -05004854 case RIL_REQUEST_GET_CELL_INFO_LIST: return "GET_CELL_INFO_LIST";
4855 case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return "SET_UNSOL_CELL_INFO_LIST_RATE";
4856 case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "SET_INITIAL_ATTACH_APN";
Sukanya Rajkhowaa18b9d12013-09-10 12:30:13 -07004857 case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
4858 case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
Shishir Agrawal2458d8d2013-11-27 14:53:05 -08004859 case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
4860 case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
4861 case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
4862 case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
Matt Mower897915e2015-04-08 23:16:03 -05004863 case RIL_REQUEST_NV_READ_ITEM: return "NV_READ_ITEM";
4864 case RIL_REQUEST_NV_WRITE_ITEM: return "NV_WRITE_ITEM";
4865 case RIL_REQUEST_NV_WRITE_CDMA_PRL: return "NV_WRITE_CDMA_PRL";
4866 case RIL_REQUEST_NV_RESET_CONFIG: return "NV_RESET_CONFIG";
Etan Cohend3652192014-06-20 08:28:44 -07004867 case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
4868 case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
Amit Mahajan2b772032014-06-26 14:20:11 -07004869 case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
4870 case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
Wink Savillec29360a2014-07-13 05:17:28 -07004871 case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
4872 case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
Amit Mahajanc796e222014-08-13 16:54:01 +00004873 case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
Matt Mower897915e2015-04-08 23:16:03 -05004874 case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
4875 case RIL_REQUEST_GET_RADIO_CAPABILITY: return "GET_RADIO_CAPABILITY";
4876 case RIL_REQUEST_SET_RADIO_CAPABILITY: return "SET_RADIO_CAPABILITY";
4877 case RIL_REQUEST_START_LCE: return "START_LCE";
4878 case RIL_REQUEST_STOP_LCE: return "STOP_LCE";
4879 case RIL_REQUEST_PULL_LCEDATA: return "PULL_LCEDATA";
4880 case RIL_REQUEST_GET_ACTIVITY_INFO: return "GET_ACTIVITY_INFO";
Meng Wangb4e34312016-05-12 14:54:36 -07004881 case RIL_REQUEST_SET_CARRIER_RESTRICTIONS: return "SET_CARRIER_RESTRICTIONS";
4882 case RIL_REQUEST_GET_CARRIER_RESTRICTIONS: return "GET_CARRIER_RESTRICTIONS";
Matt Mower897915e2015-04-08 23:16:03 -05004883 case RIL_RESPONSE_ACKNOWLEDGEMENT: return "RESPONSE_ACKNOWLEDGEMENT";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004884 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
4885 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
Wink Savillec0114b32011-02-18 10:14:07 -08004886 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004887 case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
4888 case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
4889 case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
4890 case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
Matt Mower897915e2015-04-08 23:16:03 -05004891 case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004892 case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
4893 case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
Matt Mower897915e2015-04-08 23:16:03 -05004894 case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
Sanket Padawe0eb4fba2016-01-26 17:28:38 -08004895 case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004896 case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
4897 case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
4898 case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
4899 case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
Matt Mower897915e2015-04-08 23:16:03 -05004900 case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FULL";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004901 case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004902 case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
Wink Savillef4c4d362009-04-02 01:37:03 -07004903 case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
Matt Mower897915e2015-04-08 23:16:03 -05004904 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_RESPONSE_CDMA_NEW_SMS";
4905 case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
Wink Savillef4c4d362009-04-02 01:37:03 -07004906 case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
Wink Saville3d54e742009-05-18 18:00:44 -07004907 case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
4908 case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
4909 case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
4910 case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
4911 case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
Jaikumar Ganeshaf6ecbf2009-04-29 13:27:51 -07004912 case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
John Wang5d621da2009-09-18 17:17:48 -07004913 case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
John Wang5909cf82010-01-29 00:18:54 -08004914 case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
Wink Savilleee274582011-04-16 15:05:49 -07004915 case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
Wink Savillec0114b32011-02-18 10:14:07 -08004916 case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
4917 case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
Wink Saville5b9df332011-04-06 16:24:21 -07004918 case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
Naveen Kalla2bc78d62011-12-07 16:22:53 -08004919 case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
Wink Saville8a9e0212013-04-09 12:11:38 -07004920 case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
Matt Mower897915e2015-04-08 23:16:03 -05004921 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
Etan Cohend3652192014-06-20 08:28:44 -07004922 case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
4923 case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
Matt Mower897915e2015-04-08 23:16:03 -05004924 case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "UNSOL_HARDWARE_CONFIG_CHANGED";
Wink Savillec29360a2014-07-13 05:17:28 -07004925 case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
Matt Mower897915e2015-04-08 23:16:03 -05004926 case RIL_UNSOL_RADIO_CAPABILITY: return "UNSOL_RADIO_CAPABILITY";
Mark Salyzyn0078c8d2016-12-12 14:41:47 -08004927 case RIL_UNSOL_MODEM_RESTART: return "UNSOL_MODEM_RESTART";
Matt Mower897915e2015-04-08 23:16:03 -05004928 case RIL_UNSOL_ON_SS: return "UNSOL_ON_SS";
4929 case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: return "UNSOL_STK_CC_ALPHA_NOTIFY";
4930 case RIL_UNSOL_LCEDATA_RECV: return "UNSOL_LCEDATA_RECV";
4931 case RIL_UNSOL_PCO_DATA: return "UNSOL_PCO_DATA";
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004932 default: return "<unknown request>";
4933 }
4934}
4935
Etan Cohend3652192014-06-20 08:28:44 -07004936const char *
4937rilSocketIdToString(RIL_SOCKET_ID socket_id)
4938{
4939 switch(socket_id) {
4940 case RIL_SOCKET_1:
4941 return "RIL_SOCKET_1";
4942#if (SIM_COUNT >= 2)
4943 case RIL_SOCKET_2:
4944 return "RIL_SOCKET_2";
4945#endif
4946#if (SIM_COUNT >= 3)
4947 case RIL_SOCKET_3:
4948 return "RIL_SOCKET_3";
4949#endif
4950#if (SIM_COUNT >= 4)
4951 case RIL_SOCKET_4:
4952 return "RIL_SOCKET_4";
4953#endif
4954 default:
4955 return "not a valid RIL";
4956 }
4957}
4958
Sanket Padawe4c05f352016-01-26 16:19:00 -08004959/*
4960 * Returns true for a debuggable build.
4961 */
4962static bool isDebuggable() {
4963 char debuggable[PROP_VALUE_MAX];
4964 property_get("ro.debuggable", debuggable, "0");
4965 if (strcmp(debuggable, "1") == 0) {
4966 return true;
4967 }
4968 return false;
4969}
4970
The Android Open Source Project00f06fc2009-03-03 19:32:15 -08004971} /* namespace android */
Dheeraj Shetty27976c42014-07-02 21:27:57 +02004972
4973void rilEventAddWakeup_helper(struct ril_event *ev) {
4974 android::rilEventAddWakeup(ev);
4975}
4976
4977void listenCallback_helper(int fd, short flags, void *param) {
4978 android::listenCallback(fd, flags, param);
4979}
4980
4981int blockingWrite_helper(int fd, void *buffer, size_t len) {
4982 return android::blockingWrite(fd, buffer, len);
4983}