xref: /aosp_15_r20/hardware/ril/libril/RilSapSocket.cpp (revision 062a843b36e31144e02d312b6b2de34642e6750e)
1*062a843bSAndroid Build Coastguard Worker /*
2*062a843bSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project
3*062a843bSAndroid Build Coastguard Worker *
4*062a843bSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*062a843bSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*062a843bSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*062a843bSAndroid Build Coastguard Worker *
8*062a843bSAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
9*062a843bSAndroid Build Coastguard Worker *
10*062a843bSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*062a843bSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*062a843bSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*062a843bSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*062a843bSAndroid Build Coastguard Worker * limitations under the License.
15*062a843bSAndroid Build Coastguard Worker */
16*062a843bSAndroid Build Coastguard Worker 
17*062a843bSAndroid Build Coastguard Worker #include <stdint.h>
18*062a843bSAndroid Build Coastguard Worker #define RIL_SHLIB
19*062a843bSAndroid Build Coastguard Worker #include "telephony/ril.h"
20*062a843bSAndroid Build Coastguard Worker #include "RilSapSocket.h"
21*062a843bSAndroid Build Coastguard Worker #include "pb_decode.h"
22*062a843bSAndroid Build Coastguard Worker #include "pb_encode.h"
23*062a843bSAndroid Build Coastguard Worker #undef LOG_TAG
24*062a843bSAndroid Build Coastguard Worker #define LOG_TAG "RIL_UIM_SOCKET"
25*062a843bSAndroid Build Coastguard Worker #include <utils/Log.h>
26*062a843bSAndroid Build Coastguard Worker #include <arpa/inet.h>
27*062a843bSAndroid Build Coastguard Worker #include <errno.h>
28*062a843bSAndroid Build Coastguard Worker #include <sap_service.h>
29*062a843bSAndroid Build Coastguard Worker 
30*062a843bSAndroid Build Coastguard Worker static RilSapSocket::RilSapSocketList *head = NULL;
31*062a843bSAndroid Build Coastguard Worker 
32*062a843bSAndroid Build Coastguard Worker extern "C" void
33*062a843bSAndroid Build Coastguard Worker RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
34*062a843bSAndroid Build Coastguard Worker         const struct timeval *relativeTime);
35*062a843bSAndroid Build Coastguard Worker 
36*062a843bSAndroid Build Coastguard Worker struct RIL_Env RilSapSocket::uimRilEnv = {
37*062a843bSAndroid Build Coastguard Worker         .OnRequestComplete = RilSapSocket::sOnRequestComplete,
38*062a843bSAndroid Build Coastguard Worker         .OnUnsolicitedResponse = RilSapSocket::sOnUnsolicitedResponse,
39*062a843bSAndroid Build Coastguard Worker         .RequestTimedCallback = RIL_requestTimedCallback
40*062a843bSAndroid Build Coastguard Worker };
41*062a843bSAndroid Build Coastguard Worker 
sOnRequestComplete(RIL_Token t,RIL_Errno e,void * response,size_t responselen)42*062a843bSAndroid Build Coastguard Worker void RilSapSocket::sOnRequestComplete (RIL_Token t,
43*062a843bSAndroid Build Coastguard Worker         RIL_Errno e,
44*062a843bSAndroid Build Coastguard Worker         void *response,
45*062a843bSAndroid Build Coastguard Worker         size_t responselen) {
46*062a843bSAndroid Build Coastguard Worker     RilSapSocket *sap_socket;
47*062a843bSAndroid Build Coastguard Worker     SapSocketRequest *request = (SapSocketRequest*) t;
48*062a843bSAndroid Build Coastguard Worker 
49*062a843bSAndroid Build Coastguard Worker     RLOGD("Socket id:%d", request->socketId);
50*062a843bSAndroid Build Coastguard Worker 
51*062a843bSAndroid Build Coastguard Worker     sap_socket = getSocketById(request->socketId);
52*062a843bSAndroid Build Coastguard Worker 
53*062a843bSAndroid Build Coastguard Worker     if (sap_socket) {
54*062a843bSAndroid Build Coastguard Worker         sap_socket->onRequestComplete(t,e,response,responselen);
55*062a843bSAndroid Build Coastguard Worker     } else {
56*062a843bSAndroid Build Coastguard Worker         RLOGE("Invalid socket id");
57*062a843bSAndroid Build Coastguard Worker         if (request->curr) {
58*062a843bSAndroid Build Coastguard Worker             free(request->curr);
59*062a843bSAndroid Build Coastguard Worker         }
60*062a843bSAndroid Build Coastguard Worker         free(request);
61*062a843bSAndroid Build Coastguard Worker     }
62*062a843bSAndroid Build Coastguard Worker }
63*062a843bSAndroid Build Coastguard Worker 
64*062a843bSAndroid Build Coastguard Worker #if defined(ANDROID_MULTI_SIM)
sOnUnsolicitedResponse(int unsolResponse,const void * data,size_t datalen,RIL_SOCKET_ID socketId)65*062a843bSAndroid Build Coastguard Worker void RilSapSocket::sOnUnsolicitedResponse(int unsolResponse,
66*062a843bSAndroid Build Coastguard Worker         const void *data,
67*062a843bSAndroid Build Coastguard Worker         size_t datalen,
68*062a843bSAndroid Build Coastguard Worker         RIL_SOCKET_ID socketId) {
69*062a843bSAndroid Build Coastguard Worker     RilSapSocket *sap_socket = getSocketById(socketId);
70*062a843bSAndroid Build Coastguard Worker     if (sap_socket) {
71*062a843bSAndroid Build Coastguard Worker         sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
72*062a843bSAndroid Build Coastguard Worker     }
73*062a843bSAndroid Build Coastguard Worker }
74*062a843bSAndroid Build Coastguard Worker #else
sOnUnsolicitedResponse(int unsolResponse,const void * data,size_t datalen)75*062a843bSAndroid Build Coastguard Worker void RilSapSocket::sOnUnsolicitedResponse(int unsolResponse,
76*062a843bSAndroid Build Coastguard Worker        const void *data,
77*062a843bSAndroid Build Coastguard Worker        size_t datalen) {
78*062a843bSAndroid Build Coastguard Worker     RilSapSocket *sap_socket = getSocketById(RIL_SOCKET_1);
79*062a843bSAndroid Build Coastguard Worker     if(sap_socket){
80*062a843bSAndroid Build Coastguard Worker         sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
81*062a843bSAndroid Build Coastguard Worker     }
82*062a843bSAndroid Build Coastguard Worker }
83*062a843bSAndroid Build Coastguard Worker #endif
84*062a843bSAndroid Build Coastguard Worker 
printList()85*062a843bSAndroid Build Coastguard Worker void RilSapSocket::printList() {
86*062a843bSAndroid Build Coastguard Worker     RilSapSocketList *current = head;
87*062a843bSAndroid Build Coastguard Worker     RLOGD("Printing socket list");
88*062a843bSAndroid Build Coastguard Worker     while(NULL != current) {
89*062a843bSAndroid Build Coastguard Worker         RLOGD("SocketName:%s",current->socket->name);
90*062a843bSAndroid Build Coastguard Worker         RLOGD("Socket id:%d",current->socket->id);
91*062a843bSAndroid Build Coastguard Worker         current = current->next;
92*062a843bSAndroid Build Coastguard Worker     }
93*062a843bSAndroid Build Coastguard Worker }
94*062a843bSAndroid Build Coastguard Worker 
getSocketById(RIL_SOCKET_ID socketId)95*062a843bSAndroid Build Coastguard Worker RilSapSocket *RilSapSocket::getSocketById(RIL_SOCKET_ID socketId) {
96*062a843bSAndroid Build Coastguard Worker     RilSapSocket *sap_socket;
97*062a843bSAndroid Build Coastguard Worker     RilSapSocketList *current = head;
98*062a843bSAndroid Build Coastguard Worker 
99*062a843bSAndroid Build Coastguard Worker     RLOGD("Entered getSocketById");
100*062a843bSAndroid Build Coastguard Worker     printList();
101*062a843bSAndroid Build Coastguard Worker 
102*062a843bSAndroid Build Coastguard Worker     while(NULL != current) {
103*062a843bSAndroid Build Coastguard Worker         if(socketId == current->socket->id) {
104*062a843bSAndroid Build Coastguard Worker             sap_socket = current->socket;
105*062a843bSAndroid Build Coastguard Worker             return sap_socket;
106*062a843bSAndroid Build Coastguard Worker         }
107*062a843bSAndroid Build Coastguard Worker         current = current->next;
108*062a843bSAndroid Build Coastguard Worker     }
109*062a843bSAndroid Build Coastguard Worker     return NULL;
110*062a843bSAndroid Build Coastguard Worker }
111*062a843bSAndroid Build Coastguard Worker 
initSapSocket(const char * socketName,const RIL_RadioFunctions * uimFuncs)112*062a843bSAndroid Build Coastguard Worker void RilSapSocket::initSapSocket(const char *socketName,
113*062a843bSAndroid Build Coastguard Worker         const RIL_RadioFunctions *uimFuncs) {
114*062a843bSAndroid Build Coastguard Worker 
115*062a843bSAndroid Build Coastguard Worker     if (strcmp(socketName, RIL1_SERVICE_NAME) == 0) {
116*062a843bSAndroid Build Coastguard Worker         if(!SocketExists(socketName)) {
117*062a843bSAndroid Build Coastguard Worker             addSocketToList(socketName, RIL_SOCKET_1, uimFuncs);
118*062a843bSAndroid Build Coastguard Worker         }
119*062a843bSAndroid Build Coastguard Worker     }
120*062a843bSAndroid Build Coastguard Worker 
121*062a843bSAndroid Build Coastguard Worker #if (SIM_COUNT >= 2)
122*062a843bSAndroid Build Coastguard Worker     if (strcmp(socketName, RIL2_SERVICE_NAME) == 0) {
123*062a843bSAndroid Build Coastguard Worker         if(!SocketExists(socketName)) {
124*062a843bSAndroid Build Coastguard Worker             addSocketToList(socketName, RIL_SOCKET_2, uimFuncs);
125*062a843bSAndroid Build Coastguard Worker         }
126*062a843bSAndroid Build Coastguard Worker     }
127*062a843bSAndroid Build Coastguard Worker #endif
128*062a843bSAndroid Build Coastguard Worker 
129*062a843bSAndroid Build Coastguard Worker #if (SIM_COUNT >= 3)
130*062a843bSAndroid Build Coastguard Worker     if (strcmp(socketName, RIL3_SERVICE_NAME) == 0) {
131*062a843bSAndroid Build Coastguard Worker         if(!SocketExists(socketName)) {
132*062a843bSAndroid Build Coastguard Worker             addSocketToList(socketName, RIL_SOCKET_3, uimFuncs);
133*062a843bSAndroid Build Coastguard Worker         }
134*062a843bSAndroid Build Coastguard Worker     }
135*062a843bSAndroid Build Coastguard Worker #endif
136*062a843bSAndroid Build Coastguard Worker 
137*062a843bSAndroid Build Coastguard Worker #if (SIM_COUNT >= 4)
138*062a843bSAndroid Build Coastguard Worker     if (strcmp(socketName, RIL4_SERVICE_NAME) == 0) {
139*062a843bSAndroid Build Coastguard Worker         if(!SocketExists(socketName)) {
140*062a843bSAndroid Build Coastguard Worker             addSocketToList(socketName, RIL_SOCKET_4, uimFuncs);
141*062a843bSAndroid Build Coastguard Worker         }
142*062a843bSAndroid Build Coastguard Worker     }
143*062a843bSAndroid Build Coastguard Worker #endif
144*062a843bSAndroid Build Coastguard Worker }
145*062a843bSAndroid Build Coastguard Worker 
addSocketToList(const char * socketName,RIL_SOCKET_ID socketid,const RIL_RadioFunctions * uimFuncs)146*062a843bSAndroid Build Coastguard Worker void RilSapSocket::addSocketToList(const char *socketName, RIL_SOCKET_ID socketid,
147*062a843bSAndroid Build Coastguard Worker         const RIL_RadioFunctions *uimFuncs) {
148*062a843bSAndroid Build Coastguard Worker     RilSapSocket* socket = NULL;
149*062a843bSAndroid Build Coastguard Worker     RilSapSocketList *current;
150*062a843bSAndroid Build Coastguard Worker 
151*062a843bSAndroid Build Coastguard Worker     if(!SocketExists(socketName)) {
152*062a843bSAndroid Build Coastguard Worker         socket = new RilSapSocket(socketName, socketid, uimFuncs);
153*062a843bSAndroid Build Coastguard Worker         RilSapSocketList* listItem = (RilSapSocketList*)malloc(sizeof(RilSapSocketList));
154*062a843bSAndroid Build Coastguard Worker         if (!listItem) {
155*062a843bSAndroid Build Coastguard Worker             RLOGE("addSocketToList: OOM");
156*062a843bSAndroid Build Coastguard Worker             delete socket;
157*062a843bSAndroid Build Coastguard Worker             return;
158*062a843bSAndroid Build Coastguard Worker         }
159*062a843bSAndroid Build Coastguard Worker         listItem->socket = socket;
160*062a843bSAndroid Build Coastguard Worker         listItem->next = NULL;
161*062a843bSAndroid Build Coastguard Worker 
162*062a843bSAndroid Build Coastguard Worker         RLOGD("Adding socket with id: %d", socket->id);
163*062a843bSAndroid Build Coastguard Worker 
164*062a843bSAndroid Build Coastguard Worker         if(NULL == head) {
165*062a843bSAndroid Build Coastguard Worker             head = listItem;
166*062a843bSAndroid Build Coastguard Worker             head->next = NULL;
167*062a843bSAndroid Build Coastguard Worker         }
168*062a843bSAndroid Build Coastguard Worker         else {
169*062a843bSAndroid Build Coastguard Worker             current = head;
170*062a843bSAndroid Build Coastguard Worker             while(NULL != current->next) {
171*062a843bSAndroid Build Coastguard Worker                 current = current->next;
172*062a843bSAndroid Build Coastguard Worker             }
173*062a843bSAndroid Build Coastguard Worker             current->next = listItem;
174*062a843bSAndroid Build Coastguard Worker         }
175*062a843bSAndroid Build Coastguard Worker     }
176*062a843bSAndroid Build Coastguard Worker }
177*062a843bSAndroid Build Coastguard Worker 
SocketExists(const char * socketName)178*062a843bSAndroid Build Coastguard Worker bool RilSapSocket::SocketExists(const char *socketName) {
179*062a843bSAndroid Build Coastguard Worker     RilSapSocketList* current = head;
180*062a843bSAndroid Build Coastguard Worker 
181*062a843bSAndroid Build Coastguard Worker     while(NULL != current) {
182*062a843bSAndroid Build Coastguard Worker         if(strcmp(current->socket->name, socketName) == 0) {
183*062a843bSAndroid Build Coastguard Worker             return true;
184*062a843bSAndroid Build Coastguard Worker         }
185*062a843bSAndroid Build Coastguard Worker         current = current->next;
186*062a843bSAndroid Build Coastguard Worker     }
187*062a843bSAndroid Build Coastguard Worker     return false;
188*062a843bSAndroid Build Coastguard Worker }
189*062a843bSAndroid Build Coastguard Worker 
RilSapSocket(const char * socketName,RIL_SOCKET_ID socketId,const RIL_RadioFunctions * inputUimFuncs)190*062a843bSAndroid Build Coastguard Worker RilSapSocket::RilSapSocket(const char *socketName,
191*062a843bSAndroid Build Coastguard Worker         RIL_SOCKET_ID socketId,
192*062a843bSAndroid Build Coastguard Worker         const RIL_RadioFunctions *inputUimFuncs):
193*062a843bSAndroid Build Coastguard Worker         RilSocket(socketName, socketId) {
194*062a843bSAndroid Build Coastguard Worker     if (inputUimFuncs) {
195*062a843bSAndroid Build Coastguard Worker         uimFuncs = inputUimFuncs;
196*062a843bSAndroid Build Coastguard Worker     }
197*062a843bSAndroid Build Coastguard Worker }
198*062a843bSAndroid Build Coastguard Worker 
dispatchRequest(MsgHeader * req)199*062a843bSAndroid Build Coastguard Worker void RilSapSocket::dispatchRequest(MsgHeader *req) {
200*062a843bSAndroid Build Coastguard Worker     // SapSocketRequest will be deallocated in onRequestComplete()
201*062a843bSAndroid Build Coastguard Worker     SapSocketRequest* currRequest=(SapSocketRequest*)malloc(sizeof(SapSocketRequest));
202*062a843bSAndroid Build Coastguard Worker     if (!currRequest) {
203*062a843bSAndroid Build Coastguard Worker         RLOGE("dispatchRequest: OOM");
204*062a843bSAndroid Build Coastguard Worker         // Free MsgHeader allocated in pushRecord()
205*062a843bSAndroid Build Coastguard Worker         free(req);
206*062a843bSAndroid Build Coastguard Worker         return;
207*062a843bSAndroid Build Coastguard Worker     }
208*062a843bSAndroid Build Coastguard Worker     currRequest->token = req->token;
209*062a843bSAndroid Build Coastguard Worker     currRequest->curr = req;
210*062a843bSAndroid Build Coastguard Worker     currRequest->p_next = NULL;
211*062a843bSAndroid Build Coastguard Worker     currRequest->socketId = id;
212*062a843bSAndroid Build Coastguard Worker 
213*062a843bSAndroid Build Coastguard Worker     pendingResponseQueue.enqueue(currRequest);
214*062a843bSAndroid Build Coastguard Worker 
215*062a843bSAndroid Build Coastguard Worker     if (uimFuncs) {
216*062a843bSAndroid Build Coastguard Worker         RLOGI("RilSapSocket::dispatchRequest [%d] > SAP REQUEST type: %d. id: %d. error: %d, \
217*062a843bSAndroid Build Coastguard Worker                 token 0x%p",
218*062a843bSAndroid Build Coastguard Worker                 req->token,
219*062a843bSAndroid Build Coastguard Worker                 req->type,
220*062a843bSAndroid Build Coastguard Worker                 req->id,
221*062a843bSAndroid Build Coastguard Worker                 req->error,
222*062a843bSAndroid Build Coastguard Worker                 currRequest );
223*062a843bSAndroid Build Coastguard Worker 
224*062a843bSAndroid Build Coastguard Worker #if defined(ANDROID_MULTI_SIM)
225*062a843bSAndroid Build Coastguard Worker         uimFuncs->onRequest(req->id, req->payload->bytes, req->payload->size, currRequest, id);
226*062a843bSAndroid Build Coastguard Worker #else
227*062a843bSAndroid Build Coastguard Worker         uimFuncs->onRequest(req->id, req->payload->bytes, req->payload->size, currRequest);
228*062a843bSAndroid Build Coastguard Worker #endif
229*062a843bSAndroid Build Coastguard Worker     }
230*062a843bSAndroid Build Coastguard Worker }
231*062a843bSAndroid Build Coastguard Worker 
onRequestComplete(RIL_Token t,RIL_Errno e,void * response,size_t response_len)232*062a843bSAndroid Build Coastguard Worker void RilSapSocket::onRequestComplete(RIL_Token t, RIL_Errno e, void *response,
233*062a843bSAndroid Build Coastguard Worker         size_t response_len) {
234*062a843bSAndroid Build Coastguard Worker     SapSocketRequest* request= (SapSocketRequest*)t;
235*062a843bSAndroid Build Coastguard Worker 
236*062a843bSAndroid Build Coastguard Worker     if (!request || !request->curr) {
237*062a843bSAndroid Build Coastguard Worker         RLOGE("RilSapSocket::onRequestComplete: request/request->curr is NULL");
238*062a843bSAndroid Build Coastguard Worker         return;
239*062a843bSAndroid Build Coastguard Worker     }
240*062a843bSAndroid Build Coastguard Worker 
241*062a843bSAndroid Build Coastguard Worker     MsgHeader *hdr = request->curr;
242*062a843bSAndroid Build Coastguard Worker 
243*062a843bSAndroid Build Coastguard Worker     MsgHeader rsp;
244*062a843bSAndroid Build Coastguard Worker     rsp.token = request->curr->token;
245*062a843bSAndroid Build Coastguard Worker     rsp.type = MsgType_RESPONSE;
246*062a843bSAndroid Build Coastguard Worker     rsp.id = request->curr->id;
247*062a843bSAndroid Build Coastguard Worker     rsp.error = (Error)e;
248*062a843bSAndroid Build Coastguard Worker     rsp.payload = (pb_bytes_array_t *)calloc(1, sizeof(pb_bytes_array_t) + response_len);
249*062a843bSAndroid Build Coastguard Worker     if (!rsp.payload) {
250*062a843bSAndroid Build Coastguard Worker         RLOGE("onRequestComplete: OOM");
251*062a843bSAndroid Build Coastguard Worker     } else {
252*062a843bSAndroid Build Coastguard Worker         if (response && response_len > 0) {
253*062a843bSAndroid Build Coastguard Worker             memcpy(rsp.payload->bytes, response, response_len);
254*062a843bSAndroid Build Coastguard Worker             rsp.payload->size = response_len;
255*062a843bSAndroid Build Coastguard Worker         } else {
256*062a843bSAndroid Build Coastguard Worker             rsp.payload->size = 0;
257*062a843bSAndroid Build Coastguard Worker         }
258*062a843bSAndroid Build Coastguard Worker 
259*062a843bSAndroid Build Coastguard Worker         RLOGE("RilSapSocket::onRequestComplete: Token:%d, MessageId:%d ril token 0x%p",
260*062a843bSAndroid Build Coastguard Worker                 hdr->token, hdr->id, t);
261*062a843bSAndroid Build Coastguard Worker 
262*062a843bSAndroid Build Coastguard Worker         sap::processResponse(&rsp, this);
263*062a843bSAndroid Build Coastguard Worker         free(rsp.payload);
264*062a843bSAndroid Build Coastguard Worker     }
265*062a843bSAndroid Build Coastguard Worker 
266*062a843bSAndroid Build Coastguard Worker     // Deallocate SapSocketRequest
267*062a843bSAndroid Build Coastguard Worker     if(!pendingResponseQueue.checkAndDequeue(hdr->id, hdr->token)) {
268*062a843bSAndroid Build Coastguard Worker         RLOGE("Token:%d, MessageId:%d", hdr->token, hdr->id);
269*062a843bSAndroid Build Coastguard Worker         RLOGE ("RilSapSocket::onRequestComplete: invalid Token or Message Id");
270*062a843bSAndroid Build Coastguard Worker     }
271*062a843bSAndroid Build Coastguard Worker 
272*062a843bSAndroid Build Coastguard Worker     // Deallocate MsgHeader
273*062a843bSAndroid Build Coastguard Worker     free(hdr);
274*062a843bSAndroid Build Coastguard Worker }
275*062a843bSAndroid Build Coastguard Worker 
onUnsolicitedResponse(int unsolResponse,void * data,size_t datalen)276*062a843bSAndroid Build Coastguard Worker void RilSapSocket::onUnsolicitedResponse(int unsolResponse, void *data, size_t datalen) {
277*062a843bSAndroid Build Coastguard Worker     if (data && datalen > 0) {
278*062a843bSAndroid Build Coastguard Worker         pb_bytes_array_t *payload = (pb_bytes_array_t *)calloc(1,
279*062a843bSAndroid Build Coastguard Worker                 sizeof(pb_bytes_array_t) + datalen);
280*062a843bSAndroid Build Coastguard Worker         if (!payload) {
281*062a843bSAndroid Build Coastguard Worker             RLOGE("onUnsolicitedResponse: OOM");
282*062a843bSAndroid Build Coastguard Worker             return;
283*062a843bSAndroid Build Coastguard Worker         }
284*062a843bSAndroid Build Coastguard Worker         memcpy(payload->bytes, data, datalen);
285*062a843bSAndroid Build Coastguard Worker         payload->size = datalen;
286*062a843bSAndroid Build Coastguard Worker         MsgHeader rsp;
287*062a843bSAndroid Build Coastguard Worker         rsp.payload = payload;
288*062a843bSAndroid Build Coastguard Worker         rsp.type = MsgType_UNSOL_RESPONSE;
289*062a843bSAndroid Build Coastguard Worker         rsp.id = (MsgId)unsolResponse;
290*062a843bSAndroid Build Coastguard Worker         rsp.error = Error_RIL_E_SUCCESS;
291*062a843bSAndroid Build Coastguard Worker         sap::processUnsolResponse(&rsp, this);
292*062a843bSAndroid Build Coastguard Worker         free(payload);
293*062a843bSAndroid Build Coastguard Worker     }
294*062a843bSAndroid Build Coastguard Worker }
295