blob: cc77948e37f1375c828cfbd983187ea7c40ba685 [file] [log] [blame]
/* 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 "ril.h"
#include "socket_util.h"
#if defined(MODE_DSSS)
#include <cutils/properties.h>
#define DISABLE_SIM_NUM "persist.radio.dsss.sim.disable"
#define getDisableSim(value) {\
char property_value[20] = {0};\
property_get(DISABLE_SIM_NUM, property_value, "2");\
value = atoi(property_value);\
RLOGD("[RilpSocketUtil]property:%s = %d", DISABLE_SIM_NUM, value);\
} while(0)
#endif
#if defined(TELEPHONYWARE)
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <cutils/properties.h>
#define SOCKET_COUNT "persist.ril.client.num" //to be confirmed
//#define SEM_NAME "/sem_socket1"
//#define SEM_NAME2 "/sem_socket2"
//#define SLOTCOUNT 2
char socket_status[RIL_SOCKET_NUM][35]= {
"rild.socket.status1",
#if (SIM_COUNT >= 2)
"rild.socket.status2",
#endif
};
int RilpSocketUtil::selectSocket(RIL_SOCKET_ID socket_id)
{
char property_count[20] = {0};
int count;
char property_status[20] = {0};
long long status;
property_get(SOCKET_COUNT, property_count, "0");
count = atoi(property_count);
RLOGD("[selectSocket]%s = %s, count = %d", SOCKET_COUNT, property_count, count);
property_get(socket_status[socket_id], property_status, "0");
sscanf(property_status, "%lld", &status);
RLOGD("[selectSocket]%s = %s, status = %lld", socket_status[socket_id], property_status, status);
if(count > (8*sizeof(long long) -1)) {
RLOGE("[selectSocket]socket count reach the upper limit, count = %d, limit = %d", count, (8*sizeof(long long) -1));
}
for(int i = 0; i < count; i++) {
if((((long long)1<<i) & status) == 0) {
//status = status | (1<<i);
//sprintf(property_status, "%lld", status);
//property_set(socket_status[socket_id], property_status);
RLOGD("[selectSocket]selected client id = %d", i);
return i;
}
}
RLOGD("[selectSocket]no valid socket to use");
return -1;
}
#endif
char* RilpSocketUtil::getSocketName(RILD_RadioTechnology_Group group, RIL_SOCKET_ID socket_id) {
char *socketName = "null";
#if defined(TELEPHONYWARE)
int socket_num = -1;
//sem_t *sem;
#endif
#if defined(MODE_DSSS)
int disableSimNum=-1;
#endif
if(group == RADIO_TECH_GROUP_GSM) {
switch(socket_id) {
case RIL_SOCKET_1:
#if defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS) //DSDS
#if defined(TELEPHONYWARE)
//sem = sem_open(SEM_NAME, O_CREAT, 0644, 1);
//RLOGD("[Sherry]sem = %p", sem);
//if(SEM_FAILED == sem){
//RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno));
//exit(1);
//}
// sem_wait(sem);
//RLOGD("[Sherry]enter sem");
socket_num = selectSocket(socket_id);
//sem_post(sem);
// RLOGD("[Sherry]exit sem");
if(-1 == socket_num){
socketName = NULL;
} else {
socketName = (char*)malloc(20);
sprintf(socketName, "rild-client%d-0", socket_num); //to be confirmed
}
//RLOGD("[getSocketName]socketName = %s", socketName);
#elif defined(TELE_FWK)
socketName = "rild";
#endif
#elif defined(MODE_DSSS) //DSSS
getDisableSim(disableSimNum);
#if defined(TELEPHONYWARE)
if (2 == disableSimNum) { //enable slot1
//sem = sem_open(SEM_NAME, O_CREAT, 0644, 1);
//RLOGD("[Sherry]sem = %p", sem);
// if(SEM_FAILED == sem){
// RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno));
// exit(1);
// }
//sem_wait(sem);
//RLOGD("[Sherry]enter sem");
socket_num = selectSocket(socket_id);
//sem_post(sem);
// RLOGD("[Sherry]exit sem");
if(-1 == socket_num){
socketName = NULL;
} else {
socketName = (char*)malloc(20);
sprintf(socketName, "rild-client%d", socket_num); //to be confirmed
}
} else { //enable slot2
socketName = "disable";
}
#elif defined(TELE_FWK)
if (2 == disableSimNum) { //enable slot1
socketName = "rild";
} else {
socketName = "disable";
}
#endif
#else //MT2635, only slot1 is enable
socketName = "mil";
#endif
break;
#if (SIM_COUNT >= 2)
case RIL_SOCKET_2:
#if defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS) //DSDS
#if defined(TELEPHONYWARE)
//sem = sem_open(SEM_NAME2, O_CREAT, 0644, 1);
//if(SEM_FAILED == sem){
//RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno));
//exit(1);
//}
//sem_wait(sem);
socket_num = selectSocket(socket_id);
//sem_post(sem);
if(-1 == socket_num){
socketName = NULL;
} else {
socketName = (char*)malloc(20);
sprintf(socketName, "rild-client%d-1", socket_num); //to be confirmed
}
#elif defined(TELE_FWK)
socketName = "rild2";
#endif
#elif defined(MODE_DSSS) //DSSS
getDisableSim(disableSimNum);
#if defined(TELEPHONYWARE)
if (1 == disableSimNum) { //enable slot2
// sem = sem_open(SEM_NAME2, O_CREAT, 0644, 1);
//RLOGD("[Sherry]sem = %p", sem);
//if(SEM_FAILED == sem){
//RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno));
// exit(1);
//}
//sem_wait(sem);
//RLOGD("[Sherry]enter sem");
socket_num = selectSocket(socket_id);
//sem_post(sem);
// RLOGD("[Sherry]exit sem");
if(-1 == socket_num){
socketName = NULL;
} else {
socketName = (char*)malloc(20);
sprintf(socketName, "rild-client%d", socket_num); //to be confirmed
}
} else { //enable slot1
socketName = "disable";
}
#elif defined(TELE_FWK)
if (1 == disableSimNum) { //enable slot2
socketName = "rild2";
} else { //enable slot1
socketName = "disable";
}
#endif
#endif
break;
#endif
#if (SIM_COUNT >= 3)
case RIL_SOCKET_3:
socketName = "mrild3";
break;
#endif
#if (SIM_COUNT >= 4)
case RIL_SOCKET_4:
socketName = "mrild4";
break;
#endif
default:
RLOGE("Socket id is wrong!!");
break;
}
}/** [MT2635] No need for C2K and ATCI
else if (group == RADIO_TECH_GROUP_C2K) {
socketName = "rild-via";
} else if (group == RADIO_TECH_GROUP_ATCI) {
socketName = "rilproxy-atci";
}*/ else if (group == RADIO_TECH_GROUP_SAP_GSM) {
switch (socket_id) {
case RIL_SOCKET_1:
socketName = "msap_uim_socket1";
break;
#if (SIM_COUNT >= 2)
case RIL_SOCKET_2:
socketName = "msap_uim_socket2";
break;
#endif
#if (SIM_COUNT >= 3)
case RIL_SOCKET_3:
socketName = "msap_uim_socket3";
break;
#endif
#if (SIM_COUNT >= 4)
case RIL_SOCKET_4:
socketName = "msap_uim_socket4";
break;
#endif
default:
RLOGE("Socket id is wrong!!");
break;
}
}/** [MT2635] No need for C2K, ATCI and SAP-BT @{
else if (group == RADIO_TECH_GROUP_SAP_C2K) {
switch (socket_id) {
case RIL_SOCKET_1:
socketName = "msap_c2k_socket1";
break;
#if (SIM_COUNT >= 2)
case RIL_SOCKET_2:
socketName = "msap_c2k_socket2";
break;
#endif
#if (SIM_COUNT >= 3)
case RIL_SOCKET_3:
socketName = "msap_c2k_socket3";
break;
#endif
#if (SIM_COUNT >= 4)
case RIL_SOCKET_4:
socketName = "msap_c2k_socket4";
break;
#endif
default:
RLOGE("Socket id is wrong!!");
break;
}
} else if (group == RADIO_TECH_GROUP_SAP_BT) {
switch (socket_id) {
case RIL_SOCKET_1:
socketName = "sap_uim_socket1";
break;
#if (SIM_COUNT >= 2)
case RIL_SOCKET_2:
socketName = "sap_uim_socket2";
break;
#endif
#if (SIM_COUNT >= 3)
case RIL_SOCKET_3:
socketName = "sap_uim_socket3";
break;
#endif
#if (SIM_COUNT >= 4)
case RIL_SOCKET_4:
socketName = "sap_uim_socket4";
break;
#endif
default:
RLOGE("Socket id is wrong!!");
break;
}
} @}**/ else {
RLOGE("Socket group is wrong!!");
}
RLOGI ("getSocketName %s\n", socketName);
return socketName;
}