@ -42,7 +42,6 @@
# include <errno.h>
# include <assert.h>
# include <ctype.h>
# include <alloca.h>
# include <sys/un.h>
# include <assert.h>
# include <netinet/in.h>
@ -108,8 +107,8 @@ namespace android {
# if RILC_LOG
# define startRequest sprintf(printBuf, "(")
# define closeRequest sprintf(printBuf, "%s)", printBuf)
# define printRequest(token, req) \
RLOGD ( " [%04d]> %s %s " , token , requestToString ( req ) , printBuf )
# define printRequest(token, req) \
RLOGD ( " [%04d]> %s %s " , token , requestToString ( req ) , printBuf )
# define startResponse sprintf(printBuf, "%s {", printBuf)
# define closeResponse sprintf(printBuf, "%s}", printBuf)
@ -286,8 +285,9 @@ static void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI);
static void dispatchSimAuthentication ( Parcel & p , RequestInfo * pRI ) ;
static void dispatchDataProfile ( Parcel & p , RequestInfo * pRI ) ;
static void dispatchRadioCapability ( Parcel & p , RequestInfo * pRI ) ;
static void dispatchCarrierRestrictions ( Parcel & p , RequestInfo * pRI ) ;
static int responseInts ( Parcel & p , void * response , size_t responselen ) ;
static int responseIntsGetPreferredNetworkTyp e ( Parcel & p , void * response , size_t responselen ) ;
static int responseFailCaus e ( Parcel & p , void * response , size_t responselen ) ;
static int responseStrings ( Parcel & p , void * response , size_t responselen ) ;
static int responseString ( Parcel & p , void * response , size_t responselen ) ;
static int responseVoid ( Parcel & p , void * response , size_t responselen ) ;
@ -319,6 +319,8 @@ static int responseLceStatus(Parcel &p, void *response, size_t responselen);
static int responseLceData ( Parcel & p , void * response , size_t responselen ) ;
static int responseActivityData ( Parcel & p , void * response , size_t responselen ) ;
static int responseCarrierRestrictions ( Parcel & p , void * response , size_t responselen ) ;
static int responsePcoData ( Parcel & p , void * response , size_t responselen ) ;
static int decodeVoiceRadioTechnology ( RIL_RadioState radioState ) ;
static int decodeCdmaSubscriptionSource ( RIL_RadioState radioState ) ;
static RIL_RadioState processRadioState ( RIL_RadioState newRadioState ) ;
@ -483,13 +485,13 @@ issueLocalRequest(int request, void *data, int len, RIL_SOCKET_ID socket_id) {
pRI - > local = 1 ;
pRI - > token = 0xffffffff ; // token is not used in this context
/* Check vendor commands */
pRI - > pCI = & ( s_commands [ request ] ) ;
pRI - > socket_id = socket_id ;
/* Hack to include Samsung requests */
if ( request > RIL_VENDOR_COMMANDS_OFFSET ) {
pRI - > pCI = & ( s_commands_v [ request - RIL_VENDOR_COMMANDS_OFFSET ] ) ;
} else {
pRI - > pCI = & ( s_commands [ request ] ) ;
}
pRI - > socket_id = socket_id ;
ret = pthread_mutex_lock ( pendingRequestsMutexHook ) ;
assert ( ret = = 0 ) ;
@ -582,7 +584,7 @@ processCommandBuffer(void *buffer, size_t buflen, RIL_SOCKET_ID socket_id) {
return 0 ;
}
pRI = ( RequestInfo * ) calloc ( 1 , sizeof ( RequestInfo ) ) ;
pRI = ( RequestInfo * ) calloc ( 1 , sizeof ( RequestInfo ) ) ;
if ( pRI = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " , requestToString ( request ) ) ;
return 0 ;
@ -668,7 +670,7 @@ dispatchStrings (Parcel &p, RequestInfo *pRI) {
startRequest ;
if ( countStrings = = 0 ) {
// just some non-null pointer
pStrings = ( char * * ) alloca ( sizeof ( char * ) ) ;
pStrings = ( char * * ) c alloc( 1 , sizeof ( char * ) ) ;
if ( pStrings = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
@ -677,13 +679,13 @@ dispatchStrings (Parcel &p, RequestInfo *pRI) {
}
datalen = 0 ;
} else if ( ( ( int ) countStrings ) = = - 1 ) {
} else if ( countStrings < 0 ) {
pStrings = NULL ;
datalen = 0 ;
} else {
datalen = sizeof ( char * ) * countStrings ;
pStrings = ( char * * ) alloca ( datalen ) ;
pStrings = ( char * * ) calloc ( countStrings , sizeof ( char * ) ) ;
if ( pStrings = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
@ -713,6 +715,7 @@ dispatchStrings (Parcel &p, RequestInfo *pRI) {
# ifdef MEMSET_FREED
memset ( pStrings , 0 , datalen ) ;
# endif
free ( pStrings ) ;
}
return ;
@ -731,12 +734,12 @@ dispatchInts (Parcel &p, RequestInfo *pRI) {
status = p . readInt32 ( & count ) ;
if ( status ! = NO_ERROR | | count = = 0 ) {
if ( status ! = NO_ERROR | | count < = 0 ) {
goto invalid ;
}
datalen = sizeof ( int ) * count ;
pInts = ( int * ) alloca ( datalen ) ;
pInts = ( int * ) calloc ( count , sizeof ( int ) ) ;
if ( pInts = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " , requestToString ( pRI - > pCI - > requestNumber ) ) ;
return ;
@ -751,6 +754,7 @@ dispatchInts (Parcel &p, RequestInfo *pRI) {
appendPrintBuf ( " %s%d, " , printBuf , t ) ;
if ( status ! = NO_ERROR ) {
free ( pInts ) ;
goto invalid ;
}
}
@ -764,7 +768,7 @@ dispatchInts (Parcel &p, RequestInfo *pRI) {
# ifdef MEMSET_FREED
memset ( pInts , 0 , datalen ) ;
# endif
free ( pInts ) ;
return ;
invalid :
invalidCommandBlock ( pRI ) ;
@ -1376,7 +1380,7 @@ dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef
( int ) rism . tech , ( int ) rism . retry , rism . messageRef ) ;
if ( countStrings = = 0 ) {
// just some non-null pointer
pStrings = ( char * * ) alloca ( sizeof ( char * ) ) ;
pStrings = ( char * * ) c alloc( 1 , sizeof ( char * ) ) ;
if ( pStrings = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
@ -1385,13 +1389,18 @@ dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef
}
datalen = 0 ;
} else if ( ( ( int ) countStrings ) = = - 1 ) {
} else if ( countStrings < 0 ) {
pStrings = NULL ;
datalen = 0 ;
} else {
if ( ( size_t ) countStrings > ( INT_MAX / sizeof ( char * ) ) ) {
RLOGE ( " Invalid value of countStrings: \n " ) ;
closeRequest ;
return ;
}
datalen = sizeof ( char * ) * countStrings ;
pStrings = ( char * * ) alloca ( datalen ) ;
pStrings = ( char * * ) calloc ( countStrings , sizeof ( char * ) ) ;
if ( pStrings = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
@ -1424,6 +1433,7 @@ dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef
# ifdef MEMSET_FREED
memset ( pStrings , 0 , datalen ) ;
# endif
free ( pStrings ) ;
}
# ifdef MEMSET_FREED
@ -1431,7 +1441,7 @@ dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef
# endif
return ;
invalid :
R LOGE( " dispatchImsGsmSms invalid block " ) ;
A LOGE( " dispatchImsGsmSms invalid block " ) ;
invalidCommandBlock ( pRI ) ;
return ;
}
@ -1466,7 +1476,7 @@ dispatchImsSms(Parcel &p, RequestInfo *pRI) {
} else if ( RADIO_TECH_3GPP2 = = format ) {
dispatchImsCdmaSms ( p , pRI , retry , messageRef ) ;
} else {
R LOGE( " requestImsSendSMS invalid format value =%d " , format ) ;
A LOGE( " requestImsSendSMS invalid format value =%d " , format ) ;
}
return ;
@ -1838,7 +1848,7 @@ static void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
pf . password = strdupReadString ( p ) ;
startRequest ;
appendPrintBuf ( " %sapn=%s, protocol=%s, auth_ type=%d, username=%s, password=%s " ,
appendPrintBuf ( " %sapn=%s, protocol=%s, authtype=%d, username=%s, password=%s " ,
printBuf , pf . apn , pf . protocol , pf . authtype , pf . username , pf . password ) ;
closeRequest ;
printRequest ( pRI - > token , pRI - > pCI - > requestNumber ) ;
@ -2010,7 +2020,7 @@ static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI)
pf . aid = strdupReadString ( p ) ;
startRequest ;
appendPrintBuf ( " authContext=%d , authData=%s, aid=%s " , pf . authContext , pf . authData , pf . aid ) ;
appendPrintBuf ( " authContext=%s , authData=%s, aid=%s " , pf . authContext , pf . authData , pf . aid ) ;
closeRequest ;
printRequest ( pRI - > token , pRI - > pCI - > requestNumber ) ;
@ -2043,20 +2053,20 @@ static void dispatchDataProfile(Parcel &p, RequestInfo *pRI) {
int32_t num ;
status = p . readInt32 ( & num ) ;
if ( status ! = NO_ERROR ) {
if ( status ! = NO_ERROR | | num < 0 ) {
goto invalid ;
}
{
RIL_DataProfileInfo * dataProfiles =
( RIL_DataProfileInfo * ) malloc ( num * sizeof ( RIL_DataProfileInfo ) ) ;
( RIL_DataProfileInfo * ) calloc ( num , sizeof ( RIL_DataProfileInfo ) ) ;
if ( dataProfiles = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
return ;
}
RIL_DataProfileInfo * * dataProfilePtrs =
( RIL_DataProfileInfo * * ) malloc ( num * sizeof ( RIL_DataProfileInfo * ) ) ;
( RIL_DataProfileInfo * * ) calloc ( num , sizeof ( RIL_DataProfileInfo * ) ) ;
if ( dataProfilePtrs = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " ,
requestToString ( pRI - > pCI - > requestNumber ) ) ;
@ -2174,7 +2184,7 @@ static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI){
startRequest ;
appendPrintBuf ( " %s [version:%d, session:%d, phase:%d, rat:%d, \
logicalModemUuid : % s , status : % d " , printBuf, rc.version, rc.session,
rc . phase , rc . rat , rc . logicalModemUuid , rc . status ) ;
rc . phase , rc . rat , rc . logicalModemUuid , rc . session ) ;
closeRequest ;
printRequest ( pRI - > token , pRI - > pCI - > requestNumber ) ;
@ -2189,6 +2199,105 @@ invalid:
return ;
}
/**
* Callee expects const RIL_CarrierRestrictions *
*/
static void dispatchCarrierRestrictions ( Parcel & p , RequestInfo * pRI ) {
RIL_CarrierRestrictions cr ;
RIL_Carrier * allowed_carriers = NULL ;
RIL_Carrier * excluded_carriers = NULL ;
int32_t t ;
status_t status ;
memset ( & cr , 0 , sizeof ( RIL_CarrierRestrictions ) ) ;
if ( s_callbacks . version < 14 ) {
RLOGE ( " Unsuppoted RIL version %d, min version expected %d " ,
s_callbacks . version , 14 ) ;
RIL_onRequestComplete ( pRI , RIL_E_REQUEST_NOT_SUPPORTED , NULL , 0 ) ;
return ;
}
status = p . readInt32 ( & t ) ;
if ( status ! = NO_ERROR ) {
goto invalid ;
}
allowed_carriers = ( RIL_Carrier * ) calloc ( t , sizeof ( RIL_Carrier ) ) ;
if ( allowed_carriers = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " , requestToString ( pRI - > pCI - > requestNumber ) ) ;
goto exit ;
}
cr . len_allowed_carriers = t ;
cr . allowed_carriers = allowed_carriers ;
status = p . readInt32 ( & t ) ;
if ( status ! = NO_ERROR ) {
goto invalid ;
}
excluded_carriers = ( RIL_Carrier * ) calloc ( t , sizeof ( RIL_Carrier ) ) ;
if ( excluded_carriers = = NULL ) {
RLOGE ( " Memory allocation failed for request %s " , requestToString ( pRI - > pCI - > requestNumber ) ) ;
goto exit ;
}
cr . len_excluded_carriers = t ;
cr . excluded_carriers = excluded_carriers ;
startRequest ;
appendPrintBuf ( " %s len_allowed_carriers:%d, len_excluded_carriers:%d, " ,
printBuf , cr . len_allowed_carriers , cr . len_excluded_carriers ) ;
appendPrintBuf ( " %s allowed_carriers: " , printBuf ) ;
for ( int32_t i = 0 ; i < cr . len_allowed_carriers ; i + + ) {
RIL_Carrier * p_cr = allowed_carriers + i ;
p_cr - > mcc = strdupReadString ( p ) ;
p_cr - > mnc = strdupReadString ( p ) ;
status = p . readInt32 ( & t ) ;
p_cr - > match_type = static_cast < RIL_CarrierMatchType > ( t ) ;
if ( status ! = NO_ERROR ) {
goto invalid ;
}
p_cr - > match_data = strdupReadString ( p ) ;
appendPrintBuf ( " %s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s], " ,
printBuf , i , p_cr - > mcc , p_cr - > mnc , p_cr - > match_type , p_cr - > match_data ) ;
}
for ( int32_t i = 0 ; i < cr . len_excluded_carriers ; i + + ) {
RIL_Carrier * p_cr = excluded_carriers + i ;
p_cr - > mcc = strdupReadString ( p ) ;
p_cr - > mnc = strdupReadString ( p ) ;
status = p . readInt32 ( & t ) ;
p_cr - > match_type = static_cast < RIL_CarrierMatchType > ( t ) ;
if ( status ! = NO_ERROR ) {
goto invalid ;
}
p_cr - > match_data = strdupReadString ( p ) ;
appendPrintBuf ( " %s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s], " ,
printBuf , i , p_cr - > mcc , p_cr - > mnc , p_cr - > match_type , p_cr - > match_data ) ;
}
closeRequest ;
printRequest ( pRI - > token , pRI - > pCI - > requestNumber ) ;
CALL_ONREQUEST ( pRI - > pCI - > requestNumber ,
& cr ,
sizeof ( RIL_CarrierRestrictions ) ,
pRI , pRI - > socket_id ) ;
goto exit ;
invalid :
invalidCommandBlock ( pRI ) ;
RIL_onRequestComplete ( pRI , RIL_E_INVALID_ARGUMENTS , NULL , 0 ) ;
exit :
if ( allowed_carriers ! = NULL ) {
free ( allowed_carriers ) ;
}
if ( excluded_carriers ! = NULL ) {
free ( excluded_carriers ) ;
}
return ;
}
static int
blockingWrite ( int fd , const void * buffer , size_t len ) {
size_t writeOffset = 0 ;
@ -2225,7 +2334,7 @@ sendResponseRaw (const void *data, size_t dataSize, RIL_SOCKET_ID socket_id) {
pthread_mutex_t * writeMutexHook = & s_writeMutex ;
# if VDBG
RLOGD ( " Send Response to %s " , rilSocketIdToString ( socket_id ) ) ;
RLOGE ( " Send Response to %s " , rilSocketIdToString ( socket_id ) ) ;
# endif
# if (SIM_COUNT >= 2)
@ -2319,37 +2428,37 @@ responseInts(Parcel &p, void *response, size_t responselen) {
return 0 ;
}
static int
responseIntsGetPreferredNetworkType ( Parcel & p , void * response , size_t responselen ) {
// Response is an int or RIL_LastCallFailCauseInfo.
// Currently, only Shamu plans to use RIL_LastCallFailCauseInfo.
// TODO(yjl): Let all implementations use RIL_LastCallFailCauseInfo.
static int responseFailCause ( Parcel & p , void * response , size_t responselen ) {
int numInts ;
if ( response = = NULL & & responselen ! = 0 ) {
RLOGE ( " invalid response: NULL " ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
if ( responselen % sizeof ( int ) ! = 0 ) {
RLOGE ( " responseInts: invalid response length %d expected multiple of %d \n " ,
( int ) responselen , ( int ) sizeof ( int ) ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
int * p_int = ( int * ) r esponse;
numInts = responselen / sizeof ( int ) ;
p . writeInt32 ( numInts ) ;
/* each int*/
startResponse ;
for ( int i = 0 ; i < numInts ; i + + ) {
if ( i = = 0 & & p_int [ 0 ] = = 7 ) {
RLOGD ( " REQUEST_GET_PREFERRED_NETWORK_TYPE: NETWORK_MODE_GLOBAL => NETWORK_MODE_WCDMA_PREF " ) ;
p_int [ 0 ] = 0 ;
}
appendPrintBuf ( " %s%d, " , printBuf , p_int [ i ] ) ;
p . writeInt32 ( p_int [ i ] ) ;
if ( responselen = = sizeof ( int ) ) {
startResponse ;
int * p_int = ( int * ) response ;
appendPrintBuf ( " %s%d, " , printBuf , p_int [ 0 ] ) ;
p . writeInt32 ( p_int [ 0 ] ) ;
removeLastChar ;
closeR esponse ;
} else if ( responselen = = sizeof ( RIL_LastCallFailCauseInfo ) ) {
startResponse ;
RIL_LastCallFailCauseInfo * p_fail_cause_info = ( RIL_LastCallFailCauseInfo * ) response ;
appendPrintBuf ( " %s[cause_code=%d,vendor_cause=%s] " , printBuf , p_fail_cause_info - > cause_code ,
p_fail_cause_info - > vendor_cause ) ;
p . writeInt32 ( p_fail_cause_info - > cause_code ) ;
writeStringToParcel ( p , p_fail_cause_info - > vendor_cause ) ;
removeLastChar ;
closeResponse ;
} else {
RLOGE ( " responseFailCause: invalid response length %d expected an int or "
" RIL_LastCallFailCauseInfo " , ( int ) responselen ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
removeLastChar ;
closeResponse ;
return 0 ;
}
@ -2601,7 +2710,7 @@ static int responseDataCallListV6(Parcel &p, void *response, size_t responselen)
writeStringToParcel ( p , p_cur [ i ] . ifname ) ;
writeStringToParcel ( p , p_cur [ i ] . addresses ) ;
writeStringToParcel ( p , p_cur [ i ] . dnses ) ;
writeStringToParcel ( p , p_cur [ i ] . addresse s) ;
writeStringToParcel ( p , p_cur [ i ] . gateway s) ;
appendPrintBuf ( " %s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s], " , printBuf ,
p_cur [ i ] . status ,
p_cur [ i ] . suggestedRetryTime ,
@ -2611,7 +2720,7 @@ static int responseDataCallListV6(Parcel &p, void *response, size_t responselen)
( char * ) p_cur [ i ] . ifname ,
( char * ) p_cur [ i ] . addresses ,
( char * ) p_cur [ i ] . dnses ,
( char * ) p_cur [ i ] . addresse s) ;
( char * ) p_cur [ i ] . gateway s) ;
}
removeLastChar ;
closeResponse ;
@ -2954,8 +3063,7 @@ static int responseCdmaInformationRecords(Parcel &p,
CDMA_ALPHA_INFO_BUFFER_LENGTH ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
string8 = ( char * ) malloc ( ( infoRec - > rec . display . alpha_len + 1 )
* sizeof ( char ) ) ;
string8 = ( char * ) calloc ( infoRec - > rec . display . alpha_len + 1 , sizeof ( char ) ) ;
if ( string8 = = NULL ) {
RLOGE ( " Memory allocation failed for responseCdmaInformationRecords " ) ;
closeRequest ;
@ -2979,8 +3087,7 @@ static int responseCdmaInformationRecords(Parcel &p,
CDMA_NUMBER_INFO_BUFFER_LENGTH ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
string8 = ( char * ) malloc ( ( infoRec - > rec . number . len + 1 )
* sizeof ( char ) ) ;
string8 = ( char * ) calloc ( infoRec - > rec . number . len + 1 , sizeof ( char ) ) ;
if ( string8 = = NULL ) {
RLOGE ( " Memory allocation failed for responseCdmaInformationRecords " ) ;
closeRequest ;
@ -3021,8 +3128,8 @@ static int responseCdmaInformationRecords(Parcel &p,
CDMA_NUMBER_INFO_BUFFER_LENGTH ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
string8 = ( char * ) malloc ( ( infoRec - > rec . redir . redirectingNumber
. len + 1 ) * sizeof ( char ) ) ;
string8 = ( char * ) calloc ( infoRec - > rec . redir . redirectingNumber . len + 1 ,
sizeof ( char ) ) ;
if ( string8 = = NULL ) {
RLOGE ( " Memory allocation failed for responseCdmaInformationRecords " ) ;
closeRequest ;
@ -3106,9 +3213,6 @@ static void responseRilSignalStrengthV5(Parcel &p, RIL_SignalStrength_v10 *p_cur
gsmSignalStrength = 31 ;
}
# endif
p . writeInt32 ( gsmSignalStrength ) ;
p . writeInt32 ( p_cur - > GW_SignalStrength . bitErrorRate ) ;
# if defined(MODEM_TYPE_XMM6262) || defined(SAMSUNG_NEXT_GEN_MODEM)
cdmaDbm = p_cur - > CDMA_SignalStrength . dbm & 0xFF ;
@ -3120,8 +3224,6 @@ static void responseRilSignalStrengthV5(Parcel &p, RIL_SignalStrength_v10 *p_cur
# else
cdmaDbm = p_cur - > CDMA_SignalStrength . dbm ;
# endif
p . writeInt32 ( cdmaDbm ) ;
p . writeInt32 ( p_cur - > CDMA_SignalStrength . ecio ) ;
# if defined(MODEM_TYPE_XMM6262) || defined(SAMSUNG_NEXT_GEN_MODEM)
evdoDbm = p_cur - > EVDO_SignalStrength . dbm & 0xFF ;
@ -3133,9 +3235,14 @@ static void responseRilSignalStrengthV5(Parcel &p, RIL_SignalStrength_v10 *p_cur
# else
evdoDbm = p_cur - > EVDO_SignalStrength . dbm ;
# endif
p . writeInt32 ( evdoDbm ) ;
p . writeInt32 ( p_cur - > EVDO_SignalStrength . ecio ) ;
p . writeInt32 ( p_cur - > EVDO_SignalStrength . signalNoiseRatio ) ;
p . writeInt32 ( gsmSignalStrength ) ;
p . writeInt32 ( p_cur - > GW_SignalStrength . bitErrorRate ) ;
p . writeInt32 ( cdmaDbm ) ;
p . writeInt32 ( p_cur - > CDMA_SignalStrength . ecio ) ;
p . writeInt32 ( evdoDbm ) ;
p . writeInt32 ( p_cur - > EVDO_SignalStrength . ecio ) ;
p . writeInt32 ( p_cur - > EVDO_SignalStrength . signalNoiseRatio ) ;
}
static void responseRilSignalStrengthV6Extra ( Parcel & p , RIL_SignalStrength_v10 * p_cur ) {
@ -3177,7 +3284,6 @@ static void responseRilSignalStrengthV10(Parcel &p, RIL_SignalStrength_v10 *p_cu
p . writeInt32 ( p_cur - > TD_SCDMA_SignalStrength . rscp ) ;
}
static int responseRilSignalStrength ( Parcel & p ,
void * response , size_t responselen ) {
if ( response = = NULL & & responselen ! = 0 ) {
@ -3223,7 +3329,6 @@ static int responseRilSignalStrength(Parcel &p,
p_cur = ( ( RIL_SignalStrength_v10 * ) response ) ;
responseRilSignalStrengthV10 ( p , p_cur ) ;
}
startResponse ;
appendPrintBuf ( " %s[signalStrength=%d,bitErrorRate=%d, \
CDMA_SS . dbm = % d , CDMA_SSecio = % d , \
@ -3436,6 +3541,8 @@ static int responseCellInfoListV6(Parcel &p, void *response, size_t responselen)
p . writeInt32 ( p_cur - > CellInfo . gsm . cellIdentityGsm . mnc ) ;
p . writeInt32 ( p_cur - > CellInfo . gsm . cellIdentityGsm . lac ) ;
p . writeInt32 ( p_cur - > CellInfo . gsm . cellIdentityGsm . cid ) ;
p . writeInt32 ( INT_MAX ) ; /* skip arfcn */
p . writeInt32 ( INT_MAX ) ; /* skip bsic */
p . writeInt32 ( p_cur - > CellInfo . gsm . signalStrengthGsm . signalStrength ) ;
p . writeInt32 ( p_cur - > CellInfo . gsm . signalStrengthGsm . bitErrorRate ) ;
break ;
@ -3456,6 +3563,7 @@ static int responseCellInfoListV6(Parcel &p, void *response, size_t responselen)
p . writeInt32 ( p_cur - > CellInfo . wcdma . cellIdentityWcdma . lac ) ;
p . writeInt32 ( p_cur - > CellInfo . wcdma . cellIdentityWcdma . cid ) ;
p . writeInt32 ( p_cur - > CellInfo . wcdma . cellIdentityWcdma . psc ) ;
p . writeInt32 ( INT_MAX ) ; /* skip uarfcn */
p . writeInt32 ( p_cur - > CellInfo . wcdma . signalStrengthWcdma . signalStrength ) ;
p . writeInt32 ( p_cur - > CellInfo . wcdma . signalStrengthWcdma . bitErrorRate ) ;
break ;
@ -3501,6 +3609,7 @@ static int responseCellInfoListV6(Parcel &p, void *response, size_t responselen)
p . writeInt32 ( p_cur - > CellInfo . lte . cellIdentityLte . ci ) ;
p . writeInt32 ( p_cur - > CellInfo . lte . cellIdentityLte . pci ) ;
p . writeInt32 ( p_cur - > CellInfo . lte . cellIdentityLte . tac ) ;
p . writeInt32 ( INT_MAX ) ; /* skip earfcn */
appendPrintBuf ( " %s lteSS: ss=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,ta=%d " , printBuf ,
p_cur - > CellInfo . lte . signalStrengthLte . signalStrength ,
@ -3851,7 +3960,7 @@ static int responseRadioCapability(Parcel &p, void *response, size_t responselen
startResponse ;
appendPrintBuf ( " %s[version=%d,session=%d,phase=%d, \
rat = % d , logicalModemUuid = % s , status = % d ] " ,
rat = % s , logicalModemUuid = % s , status = % d ] " ,
printBuf ,
p_cur - > version ,
p_cur - > session ,
@ -4162,7 +4271,7 @@ static int responseDcRtInfo(Parcel &p, void *response, size_t responselen)
p . writeInt32 ( pDcRtInfo - > powerState ) ;
appendPrintBuf ( " %s[time=%d,powerState=%d] " , printBuf ,
pDcRtInfo - > time ,
( int ) pDcRtInfo - > powerState ) ;
pDcRtInfo - > powerState ) ;
closeResponse ;
return 0 ;
@ -4174,8 +4283,8 @@ static int responseLceStatus(Parcel &p, void *response, size_t responselen) {
RLOGE ( " invalid response: NULL " ) ;
}
else {
RLOGE ( " responseLceStatus: invalid response length %d expecting len: d% " ,
sizeof ( RIL_LceStatusInfo ) , responselen ) ;
RLOGE ( " responseLceStatus: invalid response length %u expecting len: %u " ,
( unsigned ) sizeof ( RIL_LceStatusInfo ) , ( unsigned ) responselen ) ;
}
return RIL_ERRNO_INVALID_RESPONSE ;
}
@ -4198,8 +4307,8 @@ static int responseLceData(Parcel &p, void *response, size_t responselen) {
RLOGE ( " invalid response: NULL " ) ;
}
else {
RLOGE ( " responseLceData: invalid response length %d expecting len: d% " ,
sizeof ( RIL_LceDataInfo ) , responselen ) ;
RLOGE ( " responseLceData: invalid response length %u expecting len: %u " ,
( unsigned ) sizeof ( RIL_LceDataInfo ) , ( unsigned ) responselen ) ;
}
return RIL_ERRNO_INVALID_RESPONSE ;
}
@ -4227,8 +4336,8 @@ static int responseActivityData(Parcel &p, void *response, size_t responselen) {
RLOGE ( " invalid response: NULL " ) ;
}
else {
RLOGE ( " responseActivityData: invalid response length %d expecting len: d% " ,
sizeof ( RIL_ActivityStatsInfo ) , responselen ) ;
RLOGE ( " responseActivityData: invalid response length %u expecting len: %u " ,
( unsigned ) sizeof ( RIL_ActivityStatsInfo ) , ( unsigned ) responselen ) ;
}
return RIL_ERRNO_INVALID_RESPONSE ;
}
@ -4252,6 +4361,78 @@ static int responseActivityData(Parcel &p, void *response, size_t responselen) {
return 0 ;
}
static int responseCarrierRestrictions ( Parcel & p , void * response , size_t responselen ) {
if ( response = = NULL ) {
RLOGE ( " invalid response: NULL " ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
if ( responselen ! = sizeof ( RIL_CarrierRestrictions ) ) {
RLOGE ( " responseCarrierRestrictions: invalid response length %u expecting len: %u " ,
( unsigned ) responselen , ( unsigned ) sizeof ( RIL_CarrierRestrictions ) ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
RIL_CarrierRestrictions * p_cr = ( RIL_CarrierRestrictions * ) response ;
startResponse ;
p . writeInt32 ( p_cr - > len_allowed_carriers ) ;
p . writeInt32 ( p_cr - > len_excluded_carriers ) ;
appendPrintBuf ( " %s len_allowed_carriers: %d, len_excluded_carriers: %d, " , printBuf ,
p_cr - > len_allowed_carriers , p_cr - > len_excluded_carriers ) ;
appendPrintBuf ( " %s allowed_carriers: " , printBuf ) ;
for ( int32_t i = 0 ; i < p_cr - > len_allowed_carriers ; i + + ) {
RIL_Carrier * carrier = p_cr - > allowed_carriers + i ;
writeStringToParcel ( p , carrier - > mcc ) ;
writeStringToParcel ( p , carrier - > mnc ) ;
p . writeInt32 ( carrier - > match_type ) ;
writeStringToParcel ( p , carrier - > match_data ) ;
appendPrintBuf ( " %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s], " , printBuf ,
i , carrier - > mcc , carrier - > mnc , carrier - > match_type , carrier - > match_data ) ;
}
appendPrintBuf ( " %s excluded_carriers: " , printBuf ) ;
for ( int32_t i = 0 ; i < p_cr - > len_excluded_carriers ; i + + ) {
RIL_Carrier * carrier = p_cr - > excluded_carriers + i ;
writeStringToParcel ( p , carrier - > mcc ) ;
writeStringToParcel ( p , carrier - > mnc ) ;
p . writeInt32 ( carrier - > match_type ) ;
writeStringToParcel ( p , carrier - > match_data ) ;
appendPrintBuf ( " %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s], " , printBuf ,
i , carrier - > mcc , carrier - > mnc , carrier - > match_type , carrier - > match_data ) ;
}
closeResponse ;
return 0 ;
}
static int responsePcoData ( Parcel & p , void * response , size_t responselen ) {
if ( response = = NULL ) {
RLOGE ( " responsePcoData: invalid NULL response " ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
if ( responselen ! = sizeof ( RIL_PCO_Data ) ) {
RLOGE ( " responsePcoData: invalid response length %u, expecting %u " ,
( unsigned ) responselen , ( unsigned ) sizeof ( RIL_PCO_Data ) ) ;
return RIL_ERRNO_INVALID_RESPONSE ;
}
RIL_PCO_Data * p_cur = ( RIL_PCO_Data * ) response ;
p . writeInt32 ( p_cur - > cid ) ;
writeStringToParcel ( p , p_cur - > bearer_proto ) ;
p . writeInt32 ( p_cur - > pco_id ) ;
p . writeInt32 ( p_cur - > contents_length ) ;
p . write ( p_cur - > contents , p_cur - > contents_length ) ;
startResponse ;
appendPrintBuf ( " PCO data received: cid %d, id %d, length %d " ,
p_cur - > cid , p_cur - > pco_id , p_cur - > contents_length ) ;
closeResponse ;
return 0 ;
}
/**
* A write on the wakeup fd is done just to pop us out of select ( )
* We empty the buffer here and then ril_event will reset the timers on the
@ -4398,7 +4579,7 @@ static void listenCallback (int fd, short flags, void *param) {
int err ;
int is_phone_socket ;
int fdCommand = - 1 ;
char * processName ;
const char * processName ;
RecordStream * p_rs ;
MySocketListenParam * listenParam ;
RilSocket * sapSocket = NULL ;
@ -4559,7 +4740,13 @@ static void debugCallback (int fd, short flags, void *param) {
return ;
}
args = ( char * * ) malloc ( sizeof ( char * ) * number ) ;
if ( number < 0 ) {
RLOGE ( " Invalid number of arguments: \n " ) ;
close ( acceptFD ) ;
return ;
}
args = ( char * * ) calloc ( number , sizeof ( char * ) ) ;
if ( args = = NULL ) {
RLOGE ( " Memory allocation failed for debug args " ) ;
close ( acceptFD ) ;
@ -4575,8 +4762,15 @@ static void debugCallback (int fd, short flags, void *param) {
return ;
}
if ( len = = INT_MAX | | len < 0 ) {
RLOGE ( " Invalid value of len: \n " ) ;
freeDebugCallbackArgs ( i , args ) ;
close ( acceptFD ) ;
return ;
}
// +1 for null-term
args [ i ] = ( char * ) malloc ( ( sizeof ( char ) * len ) + 1 ) ;
args [ i ] = ( char * ) calloc ( len + 1 , sizeof ( char ) ) ;
if ( args [ i ] = = NULL ) {
RLOGE ( " Memory allocation failed for debug args " ) ;
freeDebugCallbackArgs ( i , args ) ;
@ -4888,7 +5082,8 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
& s_commands_event , /* commands_event */
& s_listen_event , /* listen_event */
processCommandsCallback , /* processCommandsCallback */
NULL /* p_rs */
NULL , /* p_rs */
RIL_TELEPHONY_SOCKET /* type */
} ;
# if (SIM_COUNT >= 2)
@ -4900,7 +5095,8 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
& s_commands_event_socket2 , /* commands_event */
& s_listen_event_socket2 , /* listen_event */
processCommandsCallback , /* processCommandsCallback */
NULL /* p_rs */
NULL , /* p_rs */
RIL_TELEPHONY_SOCKET /* type */
} ;
# endif
@ -4913,7 +5109,8 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
& s_commands_event_socket3 , /* commands_event */
& s_listen_event_socket3 , /* listen_event */
processCommandsCallback , /* processCommandsCallback */
NULL /* p_rs */
NULL , /* p_rs */
RIL_TELEPHONY_SOCKET /* type */
} ;
# endif
@ -4926,7 +5123,8 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
& s_commands_event_socket4 , /* commands_event */
& s_listen_event_socket4 , /* listen_event */
processCommandsCallback , /* processCommandsCallback */
NULL /* p_rs */
NULL , /* p_rs */
RIL_TELEPHONY_SOCKET /* type */
} ;
# endif
@ -4990,7 +5188,7 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
char rildebug [ MAX_DEBUG_SOCKET_NAME_LENGTH ] = SOCKET_NAME_RIL_DEBUG ;
if ( inst ! = NULL ) {
snprintf ( rildebug , sizeof ( rildebug ) , " %s%s " , SOCKET_NAME_RIL_DEBUG , inst ) ;
strlcat ( rildebug , inst , MAX_DEBUG_SOCKET_NAME_LENGTH ) ;
}
s_fdDebug = android_get_control_socket ( rildebug ) ;
@ -5038,6 +5236,8 @@ RIL_register_socket (RIL_RadioFunctions *(*Init)(const struct RIL_Env *, int, ch
# if (SIM_COUNT >= 4)
RilSapSocket : : initSapSocket ( " sap_uim_socket4 " , UimFuncs ) ;
# endif
break ;
default : ;
}
}
}
@ -5434,12 +5634,14 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
size_t datalen )
# endif
{
int unsolResponseIndex ;
int ret ;
int64_t timeReceived = 0 ;
bool shouldScheduleTimeout = false ;
RIL_RadioState newState ;
RIL_SOCKET_ID soc_id = RIL_SOCKET_1 ;
UnsolResponseInfo * pRI = NULL ;
int32_t pRI_elements ;
# if defined(ANDROID_MULTI_SIM)
soc_id = socket_id ;
@ -5452,18 +5654,25 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
return ;
}
unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE ;
pRI = s_unsolResponses ;
/* Hack to include Samsung responses */
if ( unsolResponse > RIL_VENDOR_COMMANDS_OFFSET + RIL_UNSOL_RESPONSE_BASE ) {
int index = unsolResponse - RIL_VENDOR_COMMANDS_OFFSET - RIL_UNSOL_RESPONSE_BASE ;
unsolResponseIndex - = RIL_VENDOR_COMMANDS_OFFSET ;
pRI = s_unsolResponses_v ;
RLOGD ( " SAMSUNG: unsolResponse=%d, unsolResponseIndex=%d " , unsolResponse , index ) ;
RLOGD ( " SAMSUNG: unsolResponse=%d, unsolResponseIndex=%d " , unsolResponse , unsolResponseIndex ) ;
}
pRI_elements = pRI = = s_unsolResponses
? ( int32_t ) NUM_ELEMS ( s_unsolResponses ) : ( int32_t ) NUM_ELEMS ( s_unsolResponses_v ) ;
if ( index < ( int32_t ) NUM_ELEMS ( s_unsolResponses_v ) )
pRI = & s_unsolResponses_v [ index ] ;
if ( unsolResponseIndex > = 0 & & unsolResponseIndex < pRI_elements ) {
pRI = & pRI [ unsolResponseI ndex] ;
} else {
int index = unsolResponse - RIL_UNSOL_RESPONSE_BASE ;
if ( index < ( int32_t ) NUM_ELEMS ( s_unsolResponses ) )
pRI = & s_unsolResponses [ index ] ;
RLOGE ( " unsolResponseIndex out of bounds: %d, using %s response array " , unsolResponseIndex ,
pRI = = s_unsolResponses ? " AOSP " : " Samsung " ) ;
}
if ( pRI = = NULL | | pRI - > responseFunction = = NULL ) {
@ -5566,7 +5775,7 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
s_lastNITZTimeData = NULL ;
}
s_lastNITZTimeData = m alloc( p . dataSize ( ) ) ;
s_lastNITZTimeData = c alloc( p . dataSize ( ) , 1 ) ;
if ( s_lastNITZTimeData = = NULL ) {
RLOGE ( " Memory allocation failed in RIL_onUnsolicitedResponse " ) ;
goto error_exit ;
@ -5594,7 +5803,7 @@ internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
struct timeval myRelativeTime ;
UserCallbackInfo * p_info ;
p_info = ( UserCallbackInfo * ) malloc ( sizeof ( UserCallbackInfo ) ) ;
p_info = ( UserCallbackInfo * ) calloc ( 1 , sizeof ( UserCallbackInfo ) ) ;
if ( p_info = = NULL ) {
RLOGE ( " Memory allocation failed in internalRequestTimedCallback " ) ;
return p_info ;
@ -5824,6 +6033,7 @@ requestToString(int request) {
case RIL_REQUEST_QUERY_CLIP : return " QUERY_CLIP " ;
case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE : return " LAST_DATA_CALL_FAIL_CAUSE " ;
case RIL_REQUEST_DATA_CALL_LIST : return " DATA_CALL_LIST " ;
case RIL_REQUEST_NV_RESET_CONFIG : return " NV_RESET_CONFIG " ;
case RIL_REQUEST_RESET_RADIO : return " RESET_RADIO " ;
case RIL_REQUEST_OEM_HOOK_RAW : return " OEM_HOOK_RAW " ;
case RIL_REQUEST_OEM_HOOK_STRINGS : return " OEM_HOOK_STRINGS " ;
@ -5887,6 +6097,8 @@ requestToString(int request) {
case RIL_REQUEST_GET_DC_RT_INFO : return " GET_DC_RT_INFO " ;
case RIL_REQUEST_SET_DC_RT_INFO_RATE : return " SET_DC_RT_INFO_RATE " ;
case RIL_REQUEST_SET_DATA_PROFILE : return " SET_DATA_PROFILE " ;
case RIL_REQUEST_SET_CARRIER_RESTRICTIONS : return " SET_CARRIER_RESTRICTIONS " ;
case RIL_REQUEST_GET_CARRIER_RESTRICTIONS : return " GET_CARRIER_RESTRICTIONS " ;
case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED : return " UNSOL_RESPONSE_RADIO_STATE_CHANGED " ;
case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED : return " UNSOL_RESPONSE_CALL_STATE_CHANGED " ;
case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED : return " UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED " ;
@ -5897,7 +6109,6 @@ requestToString(int request) {
case RIL_UNSOL_ON_USSD_REQUEST : return " UNSOL_ON_USSD_REQUEST(obsolete) " ;
case RIL_UNSOL_NITZ_TIME_RECEIVED : return " UNSOL_NITZ_TIME_RECEIVED " ;
case RIL_UNSOL_SIGNAL_STRENGTH : return " UNSOL_SIGNAL_STRENGTH " ;
case RIL_UNSOL_DATA_CALL_LIST_CHANGED : return " UNSOL_DATA_CALL_LIST_CHANGED " ;
case RIL_UNSOL_SUPP_SVC_NOTIFICATION : return " UNSOL_SUPP_SVC_NOTIFICATION " ;
case RIL_UNSOL_STK_SESSION_END : return " UNSOL_STK_SESSION_END " ;
case RIL_UNSOL_STK_PROACTIVE_COMMAND : return " UNSOL_STK_PROACTIVE_COMMAND " ;
@ -5905,6 +6116,7 @@ requestToString(int request) {
case RIL_UNSOL_STK_CALL_SETUP : return " UNSOL_STK_CALL_SETUP " ;
case RIL_UNSOL_SIM_SMS_STORAGE_FULL : return " UNSOL_SIM_SMS_STORAGE_FUL " ;
case RIL_UNSOL_SIM_REFRESH : return " UNSOL_SIM_REFRESH " ;
case RIL_UNSOL_DATA_CALL_LIST_CHANGED : return " UNSOL_DATA_CALL_LIST_CHANGED " ;
case RIL_UNSOL_CALL_RING : return " UNSOL_CALL_RING " ;
case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED : return " UNSOL_RESPONSE_SIM_STATUS_CHANGED " ;
case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS : return " UNSOL_NEW_CDMA_SMS " ;
@ -5929,11 +6141,12 @@ requestToString(int request) {
case RIL_UNSOL_SRVCC_STATE_NOTIFY : return " UNSOL_SRVCC_STATE_NOTIFY " ;
case RIL_UNSOL_HARDWARE_CONFIG_CHANGED : return " HARDWARE_CONFIG_CHANGED " ;
case RIL_UNSOL_DC_RT_INFO_CHANGED : return " UNSOL_DC_RT_INFO_CHANGED " ;
case RIL_UNSOL_RADIO_CAPABILITY : return " UNSOL_RADIO_CAPABILITY " ;
case RIL_UNSOL_ON_SS : return " UNSOL_ON_SS " ;
case RIL_UNSOL_STK_CC_ALPHA_NOTIFY : return " UNSOL_STK_CC_ALPHA_NOTIFY " ;
case RIL_REQUEST_SHUTDOWN : return " SHUTDOWN " ;
case RIL_UNSOL_RADIO_CAPABILITY : return " RIL_UNSOL_RADIO_CAPABILITY " ;
case RIL_RESPONSE_ACKNOWLEDGEMENT : return " RIL_RESPONSE_ACKNOWLEDGEMENT " ;
case RIL_UNSOL_PCO_DATA : return " RIL_UNSOL_PCO_DATA " ;
default : return " <unknown request> " ;
}
}