diff options
author | Android Build Role Account android-build-prod <android-build-team-robot@google.com> | 2018-03-20 09:44:47 +0000 |
---|---|---|
committer | Android Build Role Account android-build-prod <android-build-team-robot@google.com> | 2018-03-20 09:44:47 +0000 |
commit | 91c885d92c430b8f684a9d032c63a458b34ff3fa (patch) | |
tree | f473b6472d23838fdc6c6d93a12a49a9f45151ba | |
parent | 088bde826021116ad9544849d5e5be3952beebda (diff) | |
parent | 7e03807fdd448fe4c5b5149d05cd3165c8d69e1c (diff) | |
download | android_hardware_ril-91c885d92c430b8f684a9d032c63a458b34ff3fa.tar.gz android_hardware_ril-91c885d92c430b8f684a9d032c63a458b34ff3fa.tar.bz2 android_hardware_ril-91c885d92c430b8f684a9d032c63a458b34ff3fa.zip |
Snap for 4665230 from 7e03807fdd448fe4c5b5149d05cd3165c8d69e1c to p-keystone-qcom-release
Change-Id: I42ca7bc089fe588a07a4165c17dc28fc191ddc4e
-rw-r--r-- | CleanSpec.mk | 2 | ||||
-rw-r--r-- | libril/ril.cpp | 23 | ||||
-rw-r--r-- | libril/ril_service.cpp | 13 | ||||
-rw-r--r-- | libril/ril_service.h | 2 | ||||
-rw-r--r-- | reference-ril/OWNERS | 9 | ||||
-rw-r--r-- | reference-ril/reference-ril.c | 115 | ||||
-rw-r--r-- | rild/Android.mk | 7 | ||||
-rw-r--r-- | rild/rild.c | 5 | ||||
-rw-r--r-- | rild/rild.legacy.rc | 5 | ||||
-rw-r--r-- | rild/rild.rc | 2 |
10 files changed, 159 insertions, 24 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index cca8c69..e6a3da7 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -54,3 +54,5 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libril.so) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/libril.so) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/librilutils.so) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/librilutils.so) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/vendor/etc/init/rild.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/rild.rc) diff --git a/libril/ril.cpp b/libril/ril.cpp index 52d574d..514ac90 100644 --- a/libril/ril.cpp +++ b/libril/ril.cpp @@ -285,6 +285,13 @@ static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) { int responseType = (s_callbacks.version >= 13) ? RESPONSE_UNSOLICITED_ACK_EXP : RESPONSE_UNSOLICITED; + // acquire read lock for the service before calling nitzTimeReceivedInd() since it reads + // nitzTimeReceived in ril_service + pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock( + (int) socket_id); + int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + int ret = radio::nitzTimeReceivedInd( (int)socket_id, responseType, 0, RIL_E_SUCCESS, s_lastNITZTimeData, s_lastNITZTimeDataSize); @@ -292,6 +299,9 @@ static void resendLastNITZTimeData(RIL_SOCKET_ID socket_id) { free(s_lastNITZTimeData); s_lastNITZTimeData = NULL; } + + rwlockRet = pthread_rwlock_unlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); } } @@ -770,8 +780,17 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, } pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock((int) soc_id); - int rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); - assert(rwlockRet == 0); + int rwlockRet; + + if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { + // get a write lock in caes of NITZ since setNitzTimeReceived() is called + rwlockRet = pthread_rwlock_wrlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + radio::setNitzTimeReceived((int) soc_id, android::elapsedRealtime()); + } else { + rwlockRet = pthread_rwlock_rdlock(radioServiceRwlockPtr); + assert(rwlockRet == 0); + } ret = s_unsolResponses[unsolResponseIndex].responseFunction( (int) soc_id, responseType, 0, RIL_E_SUCCESS, const_cast<void*>(data), diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index 5ccbc43..6396d1d 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -69,12 +69,14 @@ struct OemHookImpl; #if (SIM_COUNT >= 2) sp<RadioImpl> radioService[SIM_COUNT]; sp<OemHookImpl> oemHookService[SIM_COUNT]; +int64_t nitzTimeReceived[SIM_COUNT]; // counter used for synchronization. It is incremented every time response callbacks are updated. volatile int32_t mCounterRadio[SIM_COUNT]; volatile int32_t mCounterOemHook[SIM_COUNT]; #else sp<RadioImpl> radioService[1]; sp<OemHookImpl> oemHookService[1]; +int64_t nitzTimeReceived[1]; // counter used for synchronization. It is incremented every time response callbacks are updated. volatile int32_t mCounterRadio[1]; volatile int32_t mCounterOemHook[1]; @@ -6986,13 +6988,13 @@ int radio::nitzTimeReceivedInd(int slotId, return 0; } hidl_string nitzTime = convertCharPtrToHidlString((char *) response); - int64_t timeReceived = android::elapsedRealtime(); #if VDBG RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(), - timeReceived); + nitzTimeReceived[slotId]); #endif Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived( - convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived); + convertIntToRadioIndicationType(indicationType), nitzTime, + nitzTimeReceived[slotId]); radioService[slotId]->checkReturnStatus(retStatus); } else { RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId); @@ -8537,3 +8539,8 @@ pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) { return radioServiceRwlockPtr; } + +// should acquire write lock for the corresponding service before calling this +void radio::setNitzTimeReceived(int slotId, long timeReceived) { + nitzTimeReceived[slotId] = timeReceived; +} diff --git a/libril/ril_service.h b/libril/ril_service.h index 2240e2a..870b644 100644 --- a/libril/ril_service.h +++ b/libril/ril_service.h @@ -743,6 +743,8 @@ int carrierInfoForImsiEncryption(int slotId, pthread_rwlock_t * getRadioServiceRwlock(int slotId); +void setNitzTimeReceived(int slotId, long timeReceived); + } // namespace radio #endif // RIL_SERVICE_H diff --git a/reference-ril/OWNERS b/reference-ril/OWNERS new file mode 100644 index 0000000..98dba3e --- /dev/null +++ b/reference-ril/OWNERS @@ -0,0 +1,9 @@ +amitmahajan@google.com +jackyu@google.com +rgreenwalt@google.com +fionaxu@google.com +jminjie@google.com +mpq@google.com +shuoq@google.com +refuhoo@google.com +bohu@google.com diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c index 1ba2508..4697f90 100644 --- a/reference-ril/reference-ril.c +++ b/reference-ril/reference-ril.c @@ -34,10 +34,14 @@ #include "misc.h" #include <getopt.h> #include <sys/socket.h> +#include <cutils/properties.h> #include <cutils/sockets.h> -#include <sys/system_properties.h> #include <termios.h> #include <qemu_pipe.h> +#include <sys/wait.h> +#include <stdbool.h> +#include <net/if.h> +#include <netinet/in.h> #include "ril.h" @@ -357,6 +361,55 @@ static int parseSimResponseLine(char* line, RIL_SIM_IO_Response* response) { return 0; } +enum InterfaceState { + kInterfaceUp, + kInterfaceDown, +}; + +static RIL_Errno setInterfaceState(const char* interfaceName, + enum InterfaceState state) { + struct ifreq request; + int status = 0; + int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sock == -1) { + RLOGE("Failed to open interface socket: %s (%d)", + strerror(errno), errno); + return RIL_E_GENERIC_FAILURE; + } + + memset(&request, 0, sizeof(request)); + strncpy(request.ifr_name, interfaceName, sizeof(request.ifr_name)); + request.ifr_name[sizeof(request.ifr_name) - 1] = '\0'; + status = ioctl(sock, SIOCGIFFLAGS, &request); + if (status != 0) { + RLOGE("Failed to get interface flags for %s: %s (%d)", + interfaceName, strerror(errno), errno); + close(sock); + return RIL_E_RADIO_NOT_AVAILABLE; + } + + bool isUp = (request.ifr_flags & IFF_UP); + if ((state == kInterfaceUp && isUp) || (state == kInterfaceDown && !isUp)) { + // Interface already in desired state + close(sock); + return RIL_E_SUCCESS; + } + + // Simply toggle the flag since we know it's the opposite of what we want + request.ifr_flags ^= IFF_UP; + + status = ioctl(sock, SIOCSIFFLAGS, &request); + if (status != 0) { + RLOGE("Failed to set interface flags for %s: %s (%d)", + interfaceName, strerror(errno), errno); + close(sock); + return RIL_E_GENERIC_FAILURE; + } + + close(sock); + return RIL_E_SUCCESS; +} + /** do post-AT+CFUN=1 initialization */ static void onRadioPowerOn() { @@ -511,13 +564,18 @@ static void requestCallSelection( RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0); } -static bool hasWifi() +static bool hasWifiCapability() { char propValue[PROP_VALUE_MAX]; - return __system_property_get("ro.kernel.qemu.wifi", propValue) != 0 && + return property_get("ro.kernel.qemu.wifi", propValue, "") > 0 && strcmp("1", propValue) == 0; } +static const char* getRadioInterfaceName(bool hasWifi) +{ + return hasWifi ? PPP_TTY_PATH_RADIO0 : PPP_TTY_PATH_ETH0; +} + static void requestOrSendDataCallList(RIL_Token *t) { ATResponse *p_response; @@ -526,7 +584,8 @@ static void requestOrSendDataCallList(RIL_Token *t) int n = 0; char *out; char propValue[PROP_VALUE_MAX]; - bool has_wifi = hasWifi(); + bool hasWifi = hasWifiCapability(); + const char* radioInterfaceName = getRadioInterfaceName(hasWifi); err = at_send_command_multiline ("AT+CGACT?", "+CGACT:", &p_response); if (err != 0 || p_response->success == 0) { @@ -632,15 +691,9 @@ static void requestOrSendDataCallList(RIL_Token *t) if (err < 0) goto error; - if (has_wifi) { - int ifname_size = strlen(PPP_TTY_PATH_RADIO0) + 1; - responses[i].ifname = alloca(ifname_size); - strlcpy(responses[i].ifname, PPP_TTY_PATH_RADIO0, ifname_size); - } else { - int ifname_size = strlen(PPP_TTY_PATH_ETH0) + 1; - responses[i].ifname = alloca(ifname_size); - strlcpy(responses[i].ifname, PPP_TTY_PATH_ETH0, ifname_size); - } + int ifname_size = strlen(radioInterfaceName) + 1; + responses[i].ifname = alloca(ifname_size); + strlcpy(responses[i].ifname, radioInterfaceName, ifname_size); err = at_tok_nextstr(&line, &out); if (err < 0) @@ -673,7 +726,7 @@ static void requestOrSendDataCallList(RIL_Token *t) snprintf(propName, sizeof propName, "net.eth0.dns%d", nn); /* Ignore if undefined */ - if (__system_property_get(propName, propValue) == 0) { + if (property_get(propName, propValue, "") <= 0) { continue; } @@ -687,7 +740,13 @@ static void requestOrSendDataCallList(RIL_Token *t) /* There is only one gateway in the emulator. If WiFi is * configured the interface visible to RIL will be behind a NAT * where the gateway is different. */ - responses[i].gateways = has_wifi ? "192.168.200.1" : "10.0.2.2"; + if (hasWifi) { + responses[i].gateways = "192.168.200.1"; + } else if (property_get("net.eth0.gw", propValue, "") > 0) { + responses[i].gateways = propValue; + } else { + responses[i].gateways = ""; + } responses[i].mtu = DEFAULT_MTU; } else { @@ -1141,7 +1200,7 @@ static void requestCdmaBaseBandVersion(int request __unused, void *data __unused free(responseStr); } -static void requestCdmaDeviceIdentity(int request __unused, void *data __unused, +static void requestDeviceIdentity(int request __unused, void *data __unused, size_t datalen __unused, RIL_Token t) { int err; @@ -1165,7 +1224,11 @@ static void requestCdmaDeviceIdentity(int request __unused, void *data __unused, RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); return; } else { - responseStr[3] = p_response->p_intermediates->line; + if (TECH_BIT(sMdmInfo) == MDM_CDMA) { + responseStr[3] = p_response->p_intermediates->line; + } else { + responseStr[0] = p_response->p_intermediates->line; + } } RIL_onRequestComplete(t, RIL_E_SUCCESS, responseStr, count*sizeof(char*)); @@ -1951,6 +2014,11 @@ static void requestSetupDataCall(void *data, size_t datalen, RIL_Token t) if (qmistatus < 0) goto error; } else { + bool hasWifi = hasWifiCapability(); + const char* radioInterfaceName = getRadioInterfaceName(hasWifi); + if (setInterfaceState(radioInterfaceName, kInterfaceUp) != RIL_E_SUCCESS) { + goto error; + } if (datalen > 6 * sizeof(char *)) { pdp_type = ((const char **)data)[6]; @@ -1994,6 +2062,14 @@ error: } +static void requestDeactivateDataCall(RIL_Token t) +{ + bool hasWifi = hasWifiCapability(); + const char* radioInterfaceName = getRadioInterfaceName(hasWifi); + RIL_Errno rilErrno = setInterfaceState(radioInterfaceName, kInterfaceDown); + RIL_onRequestComplete(t, rilErrno, NULL, 0); +} + static void requestSMSAcknowledge(void *data, size_t datalen __unused, RIL_Token t) { int ackSuccess; @@ -2441,6 +2517,9 @@ onRequest (int request, void *data, size_t datalen, RIL_Token t) case RIL_REQUEST_SETUP_DATA_CALL: requestSetupDataCall(data, datalen, t); break; + case RIL_REQUEST_DEACTIVATE_DATA_CALL: + requestDeactivateDataCall(t); + break; case RIL_REQUEST_SMS_ACKNOWLEDGE: requestSMSAcknowledge(data, datalen, t); break; @@ -2648,7 +2727,7 @@ onRequest (int request, void *data, size_t datalen, RIL_Token t) break; case RIL_REQUEST_DEVICE_IDENTITY: - requestCdmaDeviceIdentity(request, data, datalen, t); + requestDeviceIdentity(request, data, datalen, t); break; case RIL_REQUEST_CDMA_SUBSCRIPTION: diff --git a/rild/Android.mk b/rild/Android.mk index 19eba74..f8220a8 100644 --- a/rild/Android.mk +++ b/rild/Android.mk @@ -30,6 +30,13 @@ LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_PROPRIETARY_MODULE := true LOCAL_MODULE:= rild +ifeq ($(PRODUCT_COMPATIBLE_PROPERTY),true) +LOCAL_INIT_RC := rild.rc +LOCAL_CFLAGS += -DPRODUCT_COMPATIBLE_PROPERTY +else +LOCAL_INIT_RC := rild.legacy.rc +endif + include $(BUILD_EXECUTABLE) endif diff --git a/rild/rild.c b/rild/rild.c index 685ef70..c554a9f 100644 --- a/rild/rild.c +++ b/rild/rild.c @@ -35,8 +35,13 @@ #include <sys/types.h> #include <libril/ril_ex.h> +#if defined(PRODUCT_COMPATIBLE_PROPERTY) +#define LIB_PATH_PROPERTY "vendor.rild.libpath" +#define LIB_ARGS_PROPERTY "vendor.rild.libargs" +#else #define LIB_PATH_PROPERTY "rild.libpath" #define LIB_ARGS_PROPERTY "rild.libargs" +#endif #define MAX_LIB_ARGS 16 static void usage(const char *argv0) { diff --git a/rild/rild.legacy.rc b/rild/rild.legacy.rc new file mode 100644 index 0000000..b27e1da --- /dev/null +++ b/rild/rild.legacy.rc @@ -0,0 +1,5 @@ +service ril-daemon /vendor/bin/hw/rild + class main + user radio + group radio cache inet misc audio log readproc wakelock + capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW diff --git a/rild/rild.rc b/rild/rild.rc index b27e1da..f6beb54 100644 --- a/rild/rild.rc +++ b/rild/rild.rc @@ -1,4 +1,4 @@ -service ril-daemon /vendor/bin/hw/rild +service vendor.ril-daemon /vendor/bin/hw/rild class main user radio group radio cache inet misc audio log readproc wakelock |