blob: dca7898745afef904a2295f16acb935056c3c73e [file] [log] [blame]
// SPDX-License-Identifier: MediaTekProprietary
/* Copyright Statement:
*
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
* Without the prior written permission of MediaTek inc. and/or its licensors,
* any reproduction, modification, use or disclosure of MediaTek Software,
* and information contained herein, in whole or in part, shall be strictly prohibited.
*/
/* MediaTek Inc. (C) 2010. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* The following software/firmware and/or related documentation ("MediaTek Software")
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
* applicable license agreements with MediaTek Inc.
*/
#include <cutils/sockets.h>
#if defined(__ANDROID__)
#include <utils/Log.h>
#else
#include <cutils/log.h>
#endif
#include <assert.h>
#include <pthread.h>
#include <cutils/properties.h>
#include <telephony/record_stream.h>
#include <stdio.h>
#include <stdlib.h>
#include <cutils/sockets.h>
#include <signal.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/select.h>
#include <fcntl.h>
#include <telephony/ril.h>
#include "Rfx.h"
#include "socket_channel.h"
#include "socket_util.h"
#include "RfxMainThread.h"
#define LOG_TAG "RilpSocket"
#if defined(TELEPHONYWARE)
#include <semaphore.h>
char semName[RIL_SOCKET_NUM][20] = {
"/sem_socket1",
#if (SIM_COUNT >= 2)
"/sem_socket2",
#endif
#if (SIM_COUNT >= 3)
"/sem_socket3",
#endif
#if (SIM_COUNT >= 4)
"/sem_socket4",
#endif
};
#if defined(ANDROID_MULTI_SIM)
extern "C" void RFX_onUnsolicitedResponse(int unsolResponse, const void *data,
size_t datalen, RIL_SOCKET_ID socket_id) ;
#else
extern "C" void RFX_onUnsolicitedResponse(int unsolResponse, const void *data,
size_t datalen);
#endif
extern char socket_status[RIL_SOCKET_NUM][35];
#define lockMutex(socket_id) {\
RLOGD("[lockMutex] name=%s", semName[socket_id]);\
sem = sem_open(semName[socket_id], O_CREAT, 0644, 1);\
if(SEM_FAILED == sem){\
RLOGD("[ lockMutex]sem_open failed, errno = %d (%s)", errno, strerror(errno));\
exit(1);\
}\
sem_wait(sem);\
}while(0)
#define unlockMutex(socket_id) {\
sem_post(sem);\
RLOGD("[unlockMutex]name=%s", semName[socket_id]);\
sem_close(sem);\
} while(0)
/*warren modfiy for fix bug API-614 on 2022/10/11 start*/
int lynq_sem_timedwait(int mtime,sem_t * sem);
#define lynq_sp_lockMutex(socket_id) {\
RLOGD("[lockMutex] name=%s", semName[socket_id]);\
int sem_v = -1;\
sem = sem_open(semName[socket_id], O_CREAT, 0644, 1);\
if(SEM_FAILED == sem){\
RLOGD("[ lockMutex]sem_open failed, errno = %d (%s)", errno, strerror(errno));\
exit(1);\
}\
sem_getvalue(sem,&sem_v);\
if(sem_v == 0)\
{\
RLOGD("lynq_sp_lockMutex sem_v == 0");\
lynq_sem_timedwait(2000,sem);\
/*if sem value == 0,wait 2s, then return*/\
}\
else\
{\
RLOGD("lynq_sp_lockMutex sem_v == %d",sem_v);\
sem_wait(sem);\
}\
}while(0)
int lynq_sem_timedwait(int mtime,sem_t * sem)
{
RLOGD("[%s]line %d",__FUNCTION__,__LINE__);
int sec = 0;
int usec = 0;
int s = 0;
struct timeval now;
struct timespec timeout;
gettimeofday(&now,NULL);
sec = mtime/1000;
usec = mtime%1000;
timeout.tv_sec = now.tv_sec+sec;
timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
RLOGD("lynq_sem_timedwait about to call sem_timedwait()");
while ((s = sem_timedwait(sem, &timeout)) == -1 && errno == EINTR)
{
continue; /* Restart if interrupted by handler */
}
return 0;
}
/*warren modfiy for fix bug API-614 on 2022/10/11 end*/
#endif
extern "C"
void setRadioState(RIL_RadioState newState, RIL_SOCKET_ID rid);
extern "C"
void decodeAndSendSapMessage(void *data, size_t datalen,
RIL_SOCKET_ID socketId);
#define MAX_COMMAND_BYTES (20 * 1024)
#define MAX_DATA_SIZE 2048
extern void *ril_socket_reader_looper(void *arg);
extern void *ril_atci_socket_reader_looper(void *arg);
extern void *sap_ril_proxy_rild_socket_reader_looper(void *arg);
RFX_IMPLEMENT_CLASS("RilpAtciSocket", RilpAtciSocket, RfxObject);
RFX_OBJ_IMPLEMENT_SINGLETON_CLASS(RilpAtciSocket);
void RilpSocket::connectSocket(void)
{
RLOGI ("connectSocket to %d %d socket_name %s\n", group, id, name);
while (1) {
socketFd = socket_local_client(name,
ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM);
if(socketFd > 0) {
RLOGI ("connectSocket to %d\n", socketFd);
rfx_set_socket(group, id, socketFd);
return;
} else {
RLOGD ("connectSocket fail, try again %d, error = %s\n", socketFd, strerror(errno));
usleep(50000);
}
}
}
const char *RilpSocket::rildGroupIdtoString(RILD_RadioTechnology_Group group) {
switch (group) {
case RADIO_TECH_GROUP_GSM:
return "GSM";
case RADIO_TECH_GROUP_C2K:
return "C2K";
default:
RLOGI ("Wrong group id: %d\n", group);
break;
}
return NULL;
}
void RilpSocket::readerLooper(void) {
RecordStream *p_rs = record_stream_new(socketFd, MAX_COMMAND_BYTES);
void *p_record;
size_t recordlen;
int ret;
RLOGI ("readerLooper Group: %s, SlotId: %d, socketFd:%d\n", rildGroupIdtoString(group), id, socketFd);
while (1) {
for (;;) {
/* loop until EAGAIN/EINTR, end of stream, or other error */
ret = record_stream_get_next(p_rs, &p_record, &recordlen);
if (ret == 0 && p_record == NULL) {
/* end-of-stream */
break;
} else if (ret < 0) {
break;
} else if (ret == 0) { /* && p_record != NULL */
rfx_process_raw_data(group, id, p_record, recordlen);
}
}
if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
/* fatal error or end-of-stream */
if (ret != 0) {
RLOGE("error on reading command socket errno:%d\n", errno);
} else {
RLOGW("EOS. Closing command socket.");
}
close(socketFd);
record_stream_free(p_rs);
socketFd = -1;
return;
}
}
}
void RilpSocket::initSocket(const char *socketName, RIL_SOCKET_ID socketid, RILD_RadioTechnology_Group groupId) {
pthread_attr_t attr;
PthreadPtr pptr = ril_socket_reader_looper;
int result;
RilpSocket* socket = new RilpSocket(socketName, socketid, groupId);
socket->connectSocket();
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
//Start socket data receiving loop thread
result = pthread_create(&socket->socketThreadId, &attr, pptr, socket);
if(result < 0) {
RLOGE("pthread_create failed with result:%d",result);
}
RLOGI("socket connected and socket data loop thread started");
}
//RilpAtciSocket* RilpAtciSocket::s_instance = new RilpAtciSocket();
void RilpAtciSocket::initSocket(const char *socketName) {
pthread_attr_t attr;
PthreadPtr pptr = ril_atci_socket_reader_looper;
int result;
RilpAtciSocket *rilpAtciSocket = RilpAtciSocket::getInstance();
rilpAtciSocket->name = socketName;
rilpAtciSocket->connectSocket();
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
//Start socket data receiving loop thread
result = pthread_create(&rilpAtciSocket->socketThreadId, &attr,
pptr, rilpAtciSocket);
if(result < 0) {
RLOGE("pthread_create failed with result:%d",result);
}
RLOGI("socket connected and socket data loop thread started");
}
void RilpAtciSocket::connectSocket(void) {
RLOGI ("connectSocket to %d socket_name %s\n", id, name);
int ret;
socketFd = android_get_control_socket(name);
if (socketFd < 0) {
RLOGE("Failed to get socket : %s errno:%d", name, errno);
return;
}
ret = listen(socketFd, 4);
RLOGI ("connectSocket to %d\n", socketFd);
if (ret < 0) {
RLOGE("Failed to listen on ril ATCI socket '%d': %s",
socketFd, strerror(errno));
return;
}
}
void RilpAtciSocket::readerLooper(void) {
int ret;
int request = RIL_REQUEST_OEM_HOOK_RAW;//RIL_LOCAL_REQUEST_OEM_HOOK_ATCI_INTERNAL;
int token = 0xFFFFFFFF;
int recvLen;
char buffer[MAX_DATA_SIZE] = {0};
fd_set rfds;
RLOGI ("[ATCI] readerLooper SlotId: %d, clientSocketFd: %d\n", id, clientSocketFd);
while(1) {
FD_ZERO(&rfds);
FD_SET(clientSocketFd, &rfds);
memset(buffer, 0, sizeof(char) * MAX_DATA_SIZE);
RLOGI ("[ATCI] select fd: %d\n", clientSocketFd);
ret = select(clientSocketFd + 1, &rfds, NULL, NULL, NULL);
if (ret == -1) {
if(errno == EINTR || errno == EAGAIN) {
continue;
}
RLOGE("[ATCI] Fail to select in readline. error: %d", errno);
return;
} else if(ret == 0) {
RLOGE("[ATCI] ERROR: No data from atci socket.");
continue;
}
if (clientSocketFd > 0 && FD_ISSET(clientSocketFd, &rfds)) {
do {
recvLen = recv(clientSocketFd, buffer, MAX_DATA_SIZE, 0);
RLOGD("[ATCI] buffer %s, length %d", buffer, recvLen);
if (recvLen == -1) {
RLOGE("[ATCI] fail to recv from ril-atci socket. errno = %d", errno);
if(errno != EAGAIN && errno != EINTR) {
return;
} else {
RLOGE("[ATCI] Try again. errno = %d", errno);
continue;
}
} else if (recvLen == 0) {
return;
}
} while(recvLen <= 0);
Parcel* p = new Parcel();
char *atBuffer;
p->writeInt32(request);
p->writeInt32(token);
atBuffer = (char*)calloc(1, (recvLen * sizeof(char)) + 1);
memset(atBuffer, 0, (recvLen * sizeof(char)) + 1);
memcpy(atBuffer, buffer, recvLen);
p->writeInt32(recvLen + 1);
p->write((void*) atBuffer, (size_t) recvLen + 1);
p->setDataPosition(0);
process_raw_data(p);
if (NULL != atBuffer) {
free(atBuffer);
}
}
}
}
/*RilpAtciSocket* RilpAtciSocket::getInstance(void) {
if (s_instance == NULL) {
s_instance = new RilpAtciSocket();
}
return s_instance;
}*/
int RilpAtciSocket::getAtciRilSocket(void) {
return clientSocketFd;
}
void RilpAtciSocket::process_raw_data(void *pRecord) {
char simNo[PROPERTY_VALUE_MAX] = {0};
int slotId = 0;
property_get("persist.service.atci.sim", simNo, "0");
RLOGD("process_raw_data simNo: %d.", simNo[0]);
if (simNo[0] == '0') {//SIM 1
slotId = RIL_SOCKET_ID(0);
} else if (simNo[0] == '1') {//SIM 2
slotId = RIL_SOCKET_ID(1);
} else if (simNo[0] == '2') {//SIM 3
slotId = RIL_SOCKET_ID(2);
} else if (simNo[0] == '3') {//SIM 4
slotId = RIL_SOCKET_ID(3);
} else if (simNo[0] == '9') {
char tempstr[PROPERTY_VALUE_MAX] = { 0 };
memset(tempstr, 0, sizeof(tempstr));
property_get("persist.radio.cdma_slot", tempstr, "1");
int cdmaSlotId = atoi(tempstr) - 1;
slotId = RIL_SOCKET_ID(cdmaSlotId);
} else {
RLOGD("process_raw_data unsupported slot number.");
return;
}
rfx_enqueue_request_message_old(RIL_LOCAL_REQUEST_OEM_HOOK_ATCI_INTERNAL, slotId,
RADIO_TECH_GROUP_GSM, 0xffffffff, pRecord);
}
#ifdef __SAP_API__
void SapRilProxyRildSocket::initSocket(const char *socketName, RIL_SOCKET_ID socketid,
RILD_RadioTechnology_Group groupId) {
pthread_attr_t attr;
PthreadPtr pptr = sap_ril_proxy_rild_socket_reader_looper;
int result;
SapRilProxyRildSocket* socket = new SapRilProxyRildSocket(socketName, socketid, groupId);
socket->connectSocket();
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// Start socket data receiving loop thread
result = pthread_create(&socket->socketThreadId, &attr, pptr, socket);
if (result < 0) {
RLOGE("pthread_create failed with result:%d", result);
}
RLOGI("socket connected and socket data loop thread started");
}
void SapRilProxyRildSocket::connectSocket(void) {
RLOGI("connectSocket to %d socket_name %s\n", id, name);
int ret;
while (1) {
socketFd = socket_local_client(name,
ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM);
if(socketFd > 0) {
RLOGI ("connectSocket to %d\n", socketFd);
rfx_set_sap_socket(id , group, socketFd);
return;
} else {
RLOGD ("connectSocket fail, try again %d\n", socketFd);
sleep(1);
}
}
}
void SapRilProxyRildSocket::readerLooper(void) {
RecordStream *p_rs = record_stream_new(socketFd, MAX_COMMAND_BYTES);
void *p_record;
size_t recordlen;
int ret;
RLOGI ("readerLooper Group: %s, SlotId: %d, socketFd:%d\n", rildGroupIdtoString(group), id,
socketFd);
while (1) {
for (;;) {
/* loop until EAGAIN/EINTR, end of stream, or other error */
ret = record_stream_get_next(p_rs, &p_record, &recordlen);
if (ret == 0 && p_record == NULL) {
/* end-of-stream */
break;
} else if (ret < 0) {
break;
} else if (ret == 0) { /* && p_record != NULL */
decodeAndSendSapMessage(p_record, recordlen, id);
}
}
if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
/* fatal error or end-of-stream */
if (ret != 0) {
RLOGE("error on reading command socket errno:%d\n", errno);
} else {
RLOGW("EOS. Closing command socket.");
}
close(socketFd);
record_stream_free(p_rs);
socketFd = -1;
return;
}
}
}
const char* SapRilProxyRildSocket::rildGroupIdtoString(RILD_RadioTechnology_Group group) {
switch (group) {
case RADIO_TECH_GROUP_SAP_GSM:
return "GSM SAP";
case RADIO_TECH_GROUP_SAP_C2K:
return "C2K SAP";
default:
RLOGI ("Wrong group id: %d\n", group);
break;
}
return NULL;
}
#endif
bool isCdmaLteDcSupport()
{
int isSvlteSupport = 0;
int isSrlteSupport = 0;
char property_value[PROPERTY_VALUE_MAX] = { 0 };
property_get("ro.mtk_svlte_support", property_value, "0");
isSvlteSupport = atoi(property_value);
property_get("ro.mtk_srlte_support", property_value, "0");
isSrlteSupport = atoi(property_value);
return (isSvlteSupport || isSrlteSupport) ? true : false;
}
#if defined(TELEPHONYWARE)
static void changeClientSoketStatus(int slot_id, int client_id, int value){
long long status;
char property_status[PROP_VALUE_MAX] = {0};
char clientNum[PROP_VALUE_MAX] = {0};
int clientSocketNum = 0;
property_get("persist.ril.client.num", clientNum, "0");
clientSocketNum = std::stoi(clientNum);
RLOGD("[changeClientSoketStatus] persist.ril.client.num= %d, slot_id=%d, client_id=%d,value=%d",
clientSocketNum, slot_id, client_id, value);
if((0 != value) && (1!=value)){ //value must be 0 or 1
RLOGE("[changeClientSoketStatus]error!value must be 0 or 1");
return;
}
if((slot_id >= RIL_SOCKET_NUM) || (client_id >= clientSocketNum) || (client_id >= (8*sizeof(long long) -1))){
RLOGE("[changeClientSoketStatus]error, RIL_SLOT_MAX=%d, slot_id=%d, persist.ril.client.num=%d, client_id=d",
RIL_SOCKET_NUM, slot_id, clientSocketNum, client_id);
return;
}
property_get(socket_status[slot_id], property_status, "0");
sscanf(property_status, "%lld", &status);
RLOGD("[changeClientSoketStatus]before: %s = %s, status = 0x%llx",
socket_status[slot_id], property_status, status);
if(0 == value) {
status = (~((long long)1 << client_id)) & status;
} else if (1 == value) {
status = ((long long)1 << client_id) | status;
}
sprintf(property_status, "%lld", status);
property_set(socket_status[slot_id], property_status);
RLOGD("[changeClientSoketStatus]after: %s = %s, status = 0x%llx", socket_status[slot_id], property_status, status);
}
static int getClientId(const char* socket_name){
int client_id;
char suffix[10] = "0";
sscanf(socket_name, "rild-client%d%s", &client_id, suffix);
RLOGD("[getClientId]socket_name=%s, client_id=%d", socket_name, client_id);
return client_id;
}
#endif
extern "C"
void ril_socket_init() {
int i=0;
char *socketName;
#if defined(TELEPHONYWARE)
int client_id=-1;
sem_t* sem;
#endif
#if defined(MODE_DSSS) //DSSS
for(i=0; i<RIL_SOCKET_NUM; i++) {
#if defined(TELEPHONYWARE)
lockMutex(i);
#endif
socketName = RilpSocketUtil::getSocketName(RADIO_TECH_GROUP_GSM, RIL_SOCKET_ID(i));
if(NULL == socketName) {
#if defined(TELEPHONYWARE)
unlockMutex(i);
#endif
printf("ERROR!there is no valid socket to use!exit\n");
RLOGE("[ril_socket_init]ERROR!there is no valid socket to use!exit");
kill(0, SIGKILL);
}
if(0 == strcmp("disable", socketName)) {
RLOGD("[ril_socket_init] SLOT(%d) is disabled", i);
} else {
RilpSocket::initSocket(socketName, RIL_SOCKET_ID(i), RADIO_TECH_GROUP_GSM);
#if defined(TELEPHONYWARE)
client_id = getClientId(socketName);
changeClientSoketStatus(i, client_id, 1);
#endif
}
#if defined(TELEPHONYWARE)
unlockMutex(i);
#endif
}
#else //DSDS and MT2635
for(i=0; i<RIL_SOCKET_NUM; i++) {
#if defined(TELEPHONYWARE)
/*warren modfiy for fix bug API-614 on 2022/10/11 start*/
/*
**The cause of this problem is the global semaphore deadlock.
**When ril_socket_init is initialized to lock in a very coincidental situation,
**the process hangs and is not unlocked, so a deadlock scene occurs.
**Only restart can restore.
*/
lynq_sp_lockMutex(i);
//lockMutex(i);
/*warren modfiy for fix bug API-614 on 2022/10/11 end*/
#endif
socketName = RilpSocketUtil::getSocketName(RADIO_TECH_GROUP_GSM, RIL_SOCKET_ID(i));
#if defined(TELEPHONYWARE)
if(NULL == socketName) {
printf("ERROR!there is no valid socket to use!exit\n");
RLOGE("[ril_socket_init]ERROR!there is no valid socket to use!exit");
unlockMutex(i);
kill(0, SIGKILL);
}
#endif
RilpSocket::initSocket(socketName, RIL_SOCKET_ID(i), RADIO_TECH_GROUP_GSM);
#if defined(TELEPHONYWARE)
client_id = getClientId(socketName);
changeClientSoketStatus(i, client_id, 1);
unlockMutex(i);
#endif
}
#endif
#ifdef __SAP_API__
// ril-proxy to rild socket
for (i = 0; i < RIL_SOCKET_NUM; i++) {
socketName = RilpSocketUtil::getSocketName(RADIO_TECH_GROUP_SAP_GSM, RIL_SOCKET_ID(i));
SapRilProxyRildSocket::initSocket(socketName, RIL_SOCKET_ID(i), RADIO_TECH_GROUP_SAP_GSM);
}
socketName = RilpSocketUtil::getSocketName(RADIO_TECH_GROUP_SAP_C2K, RIL_SOCKET_ID(0));
SapRilProxyRildSocket::initSocket(socketName, RIL_SOCKET_ID(0), RADIO_TECH_GROUP_SAP_C2K);
#endif
}
#if defined(TELEPHONYWARE)
static void send_restart_unsol(RIL_SOCKET_ID slot){
#if defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS)
RLOGI("start send RIL_UNSOL_TELEPHONY_RESTART111111");
RFX_onUnsolicitedResponse(RIL_UNSOL_TELEPHONY_RESTART, NULL, 0, slot);
#else
//RFX_onUnsolicitedResponse(RIL_UNSOL_TELEPHONY_RESTART, NULL, 0, slot);
RLOGI("don't defined ANDROID_MULIT_SIM and MODE_DSSS");
#endif
return;
}
#endif
extern "C"
void *ril_socket_reader_looper(void *arg) {
while (1) {
RilpSocket *socket = (RilpSocket *)arg;
#if defined(TELEPHONYWARE)
RLOGI("[ril_socket_reader_looper]TELEPHONY HAS RESTART");
RLOGI("has defined TELEPHONYWARE");
send_restart_unsol(socket->id);
#endif
socket->readerLooper();
rfx_close_socket(socket->group, socket->id);
//for(int i=0; i<RIL_SOCKET_NUM; i++) {
// always set to unavailable when socket is disconnected
setRadioState(RADIO_STATE_UNAVAILABLE, socket->id);
//}
RLOGI("reconnect socket");
#if defined(TELEPHONYWARE)
changeClientSoketStatus(socket->id, getClientId(socket->name), 0);
RLOGD("[ril_socket_reader_looper]socket %s disconnet, send RIL_UNSOL_TELEPHONY_RESTART and try to reconnect",
socket->name);
send_restart_unsol(socket->id);
#elif defined(TELE_FWK)
RLOGD("[ril_socket_reader_looper]socket %s disconnet, exit", socket->name);
_exit(0); //exit(0) will cause tele-fwk assert.
#endif
socket->connectSocket();
}
RLOGI("end of ril_socket_reader_looper");
return NULL;
}
extern "C"
void *ril_atci_socket_reader_looper(void *arg) {
RilpAtciSocket *socket = (RilpAtciSocket *)arg;
int ret = 0;
struct sockaddr_un peeraddr;
socklen_t socklen = sizeof (peeraddr);
RLOGD("[ATCI] start ril_atci_socket_reader_looper, socketFd %d.", socket->socketFd);
while (1) {
socket->clientSocketFd = accept(socket->socketFd, (sockaddr *) &peeraddr, &socklen);
if (socket->clientSocketFd < 0 ) {
RLOGE("[ATCI] Error on accept() errno:%d", errno);
sleep(200);
continue;
}
RLOGD("[ATCI] accept");
int flags = fcntl(socket->clientSocketFd, F_GETFL);
ret = fcntl(socket->clientSocketFd , F_SETFL, flags | O_NONBLOCK);
if (ret < 0) {
RLOGE ("[ATCI] Error setting O_NONBLOCK errno:%d", errno);
}
socket->readerLooper();
close(socket->clientSocketFd);
}
RLOGI("end of ril_atci_socket_reader_looper");
return NULL;
}
#ifdef __SAP_API__
extern "C"
void *sap_ril_proxy_rild_socket_reader_looper(void *arg) {
while (1) {
SapRilProxyRildSocket *socket = (SapRilProxyRildSocket *)arg;
socket->readerLooper();
rfx_set_sap_socket(socket->id , socket->group, -1);
RLOGI("reconnect socket");
socket->connectSocket();
}
RLOGI("end of sap_ril_proxy_rild_socket_reader_looper");
return NULL;
}
#endif