diff options
author | Adrian DC <radian.dc@gmail.com> | 2017-04-23 21:28:36 +0200 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2017-08-30 23:09:49 +0300 |
commit | a96bbdc0d9e89fc78ae7f66751e2b4ca8290a35b (patch) | |
tree | d78b3033d3530cb3903fa13bfe6204ee8dfa5326 | |
parent | bba8ce9e15f84321eeede840d1518f37badae2a0 (diff) | |
download | android_hardware_ril-lineage-15.0-caf.tar.gz android_hardware_ril-lineage-15.0-caf.tar.bz2 android_hardware_ril-lineage-15.0-caf.zip |
libril: Restore support for RIL v6, v8 and v9 stackslineage-15.0-caf
* Allow RIL_SignalStrength_v8 structures to pass checks
* Fill v10 SCDMA field rscp with invalid value INT_MAX
Change-Id: I8c2a5eeadc7b441ab80e3dcd8c8e9e75bd6b0b79
Signed-off-by: Adrian DC <radian.dc@gmail.com>
-rw-r--r-- | libril/ril_service.cpp | 144 |
1 files changed, 131 insertions, 13 deletions
diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index f5bb5a6..3f1139b 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -100,6 +100,12 @@ void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& void convertRilSignalStrengthToHal(void *response, size_t responseLen, SignalStrength& signalStrength); +void convertRilDataCallToHal(RIL_Data_Call_Response_v6 *dcResponse, + SetupDataCallResult& dcResult); + +void convertRilDataCallToHal(RIL_Data_Call_Response_v9 *dcResponse, + SetupDataCallResult& dcResult); + void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, SetupDataCallResult& dcResult); @@ -3263,7 +3269,8 @@ int radio::getSignalStrengthResponse(int slotId, RadioResponseInfo responseInfo = {}; populateResponseInfo(responseInfo, serial, responseType, e); SignalStrength signalStrength = {}; - if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { + if (response == NULL || (responseLen != sizeof(RIL_SignalStrength_v10) + && responseLen != sizeof(RIL_SignalStrength_v8))) { RLOGE("getSignalStrengthResponse: Invalid response"); if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; } else { @@ -3838,7 +3845,10 @@ int radio::setupDataCallResponse(int slotId, populateResponseInfo(responseInfo, serial, responseType, e); SetupDataCallResult result = {}; - if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) { + + if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) { if (response != NULL) { RLOGE("setupDataCallResponse: Invalid response"); if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; @@ -3850,8 +3860,12 @@ int radio::setupDataCallResponse(int slotId, result.dnses = hidl_string(); result.gateways = hidl_string(); result.pcscf = hidl_string(); - } else { + } else if ((responseLen % sizeof(RIL_Data_Call_Response_v11)) == 0) { convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result); + } else if ((responseLen % sizeof(RIL_Data_Call_Response_v9)) == 0) { + convertRilDataCallToHal((RIL_Data_Call_Response_v9 *) response, result); + } else if ((responseLen % sizeof(RIL_Data_Call_Response_v6)) == 0) { + convertRilDataCallToHal((RIL_Data_Call_Response_v6 *) response, result); } Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse( @@ -4533,7 +4547,9 @@ int radio::getDataCallListResponse(int slotId, hidl_vec<SetupDataCallResult> ret; if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { + || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) { RLOGE("getDataCallListResponse: invalid response"); if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; } else { @@ -6679,7 +6695,50 @@ int radio::nitzTimeReceivedInd(int slotId, return 0; } -void convertRilSignalStrengthToHal(void *response, size_t responseLen, +void convertRilSignalStrengthToHalV8(void *response, size_t responseLen, + SignalStrength& signalStrength) { + RIL_SignalStrength_v8 *rilSignalStrength = (RIL_SignalStrength_v8 *) response; + + // Fixup LTE for backwards compatibility + // signalStrength: -1 -> 99 + if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) { + rilSignalStrength->LTE_SignalStrength.signalStrength = 99; + } + // rsrp: -1 -> INT_MAX all other negative value to positive. + // So remap here + if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) { + rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX; + } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) { + rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp; + } + // rsrq: -1 -> INT_MAX + if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) { + rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX; + } + // Not remapping rssnr is already using INT_MAX + // cqi: -1 -> INT_MAX + if (rilSignalStrength->LTE_SignalStrength.cqi == -1) { + rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX; + } + + signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength; + signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate; + signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm; + signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio; + signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm; + signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio; + signalStrength.evdo.signalNoiseRatio = + rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio; + signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength; + signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp; + signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq; + signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr; + signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi; + signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance; + signalStrength.tdScdma.rscp = INT_MAX; +} + +void convertRilSignalStrengthToHalV10(void *response, size_t responseLen, SignalStrength& signalStrength) { RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response; @@ -6722,11 +6781,21 @@ void convertRilSignalStrengthToHal(void *response, size_t responseLen, signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp; } +void convertRilSignalStrengthToHal(void *response, size_t responseLen, + SignalStrength& signalStrength) { + if (responseLen == sizeof(RIL_SignalStrength_v8)) { + convertRilSignalStrengthToHalV8(response, responseLen, signalStrength); + } else { + convertRilSignalStrengthToHalV10(response, responseLen, signalStrength); + } +} + int radio::currentSignalStrengthInd(int slotId, int indicationType, int token, RIL_Errno e, void *response, size_t responseLen) { if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { + if (response == NULL || (responseLen != sizeof(RIL_SignalStrength_v10) + && responseLen != sizeof(RIL_SignalStrength_v8))) { RLOGE("currentSignalStrengthInd: invalid response"); return 0; } @@ -6748,6 +6817,36 @@ int radio::currentSignalStrengthInd(int slotId, return 0; } +void convertRilDataCallToHal(RIL_Data_Call_Response_v6 *dcResponse, + SetupDataCallResult& dcResult) { + dcResult.status = (DataCallFailCause) dcResponse->status; + dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime; + dcResult.cid = dcResponse->cid; + dcResult.active = dcResponse->active; + dcResult.type = convertCharPtrToHidlString(dcResponse->type); + dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname); + dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses); + dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses); + dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways); + dcResult.pcscf = hidl_string(); + dcResult.mtu = 0; +} + +void convertRilDataCallToHal(RIL_Data_Call_Response_v9 *dcResponse, + SetupDataCallResult& dcResult) { + dcResult.status = (DataCallFailCause) dcResponse->status; + dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime; + dcResult.cid = dcResponse->cid; + dcResult.active = dcResponse->active; + dcResult.type = convertCharPtrToHidlString(dcResponse->type); + dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname); + dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses); + dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses); + dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways); + dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf); + dcResult.mtu = 0; +} + void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, SetupDataCallResult& dcResult) { dcResult.status = (DataCallFailCause) dcResponse->status; @@ -6765,12 +6864,29 @@ void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, void convertRilDataCallListToHal(void *response, size_t responseLen, hidl_vec<SetupDataCallResult>& dcResultList) { - int num = responseLen / sizeof(RIL_Data_Call_Response_v11); - - RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response; - dcResultList.resize(num); - for (int i = 0; i < num; i++) { - convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); + int num; + + if ((responseLen % sizeof(RIL_Data_Call_Response_v11)) == 0) { + num = responseLen / sizeof(RIL_Data_Call_Response_v11); + RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response; + dcResultList.resize(num); + for (int i = 0; i < num; i++) { + convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); + } + } else if ((responseLen % sizeof(RIL_Data_Call_Response_v9)) == 0) { + num = responseLen / sizeof(RIL_Data_Call_Response_v9); + RIL_Data_Call_Response_v9 *dcResponse = (RIL_Data_Call_Response_v9 *) response; + dcResultList.resize(num); + for (int i = 0; i < num; i++) { + convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); + } + } else if ((responseLen % sizeof(RIL_Data_Call_Response_v6)) == 0) { + num = responseLen / sizeof(RIL_Data_Call_Response_v6); + RIL_Data_Call_Response_v6 *dcResponse = (RIL_Data_Call_Response_v6 *) response; + dcResultList.resize(num); + for (int i = 0; i < num; i++) { + convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); + } } } @@ -6779,7 +6895,9 @@ int radio::dataCallListChangedInd(int slotId, size_t responseLen) { if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { + || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0 + && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) { RLOGE("dataCallListChangedInd: invalid response"); return 0; } |