From e9a10e65d732bcd9dfb5d2a2a8d695129131c779 Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Fri, 23 Feb 2018 17:12:15 -0800 Subject: Store the system time when NITZ is received. If cached value for NITZ is used, the time at which it was received needs to be cached too. Test: Basic telephony sanity Bug: 72283604 Change-Id: I8f443171c4583e3eab9be7973d7714ae6c7ab6af --- libril/ril.cpp | 23 +++++++++++++++++++++-- libril/ril_service.cpp | 13 ++++++++++--- libril/ril_service.h | 2 ++ 3 files changed, 33 insertions(+), 5 deletions(-) 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(data), diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index 9b9b641..d90ba9c 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -69,12 +69,14 @@ struct OemHookImpl; #if (SIM_COUNT >= 2) sp radioService[SIM_COUNT]; sp 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 radioService[1]; sp 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]; @@ -6977,13 +6979,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 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); @@ -8528,3 +8530,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 -- cgit v1.2.3 From f4b3c37b39c3ea03db5ba72fc78baa55e7c4d59b Mon Sep 17 00:00:00 2001 From: bohu Date: Mon, 5 Mar 2018 10:57:33 -0800 Subject: reference-ril: add owner from emulator team The emulator team has been modifying reference-ril and would like to have a owner on this subdir for quicker turn around of bug fixes This cl copied the OWNERS file from hardware/ril to reference-ril/ and added bohu@ Change-Id: I6598af1827da32f67fed71c732fee111605d1186 (cherry picked from commit c89f255e8bb17cf2b91e4e46b6b5e937a908131f) --- reference-ril/OWNERS | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 reference-ril/OWNERS 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 -- cgit v1.2.3 From 1b4e637ead1aff57cf7b9cb142e33dea8e15fe8e Mon Sep 17 00:00:00 2001 From: Jaekyun Seok Date: Mon, 26 Feb 2018 13:30:06 +0900 Subject: Namespace ril service and properties with "vendor." To prevent property name collisions between properties of system and vendor, 'vendor.' prefix must be added to a vendor HAL service name and vendor-specific properties. You can see the details in http://go/treble-sysprop-compatibility. These are applied only if PRODUCT_COMPATIBLE_PROPERTY is true. Bug: 36796459 Bug: 73871799 Test: succeeded building and tested on a taimen device Change-Id: I45ce47a0f6768bc3f088450a8b4680801a96db7e Merged-In: I45ce47a0f6768bc3f088450a8b4680801a96db7e (cherry picked from commit 83035b57fc6f63f4e80c3a424f09a867150e3bbe) --- CleanSpec.mk | 2 ++ rild/Android.mk | 5 +++++ rild/rild.c | 5 +++++ rild/rild.legacy.rc | 5 +++++ rild/rild.rc | 2 +- 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 rild/rild.legacy.rc 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/rild/Android.mk b/rild/Android.mk index 57a9d48..cc51332 100644 --- a/rild/Android.mk +++ b/rild/Android.mk @@ -29,7 +29,12 @@ endif 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) 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 #include +#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 -- cgit v1.2.3 From e1ac3f2ad6a85ee2584a8f015e140af4d158dbf6 Mon Sep 17 00:00:00 2001 From: Bjoern Johansson Date: Wed, 22 Mar 2017 14:54:00 -0700 Subject: Enable/disable radio interface on setup/deactivate When a RIL request to setup or deactivate data calls the radio interface would previously be left up. This caused some problems for IPv6 when switching between WiFi and radio. When WiFi was disable the radio interface would not send a router solicitation and so the IPv6 router table would not be populated with a default gateway. Disabling and enabling the interface solves this since enabling the interface triggers the router solicitation. Additionally this also makes networking unavailable when radio data is turned off as one might expect. Bug: 72886046 Test: manual, build and ran the emulator (steps from CTS tests) Change-Id: I658ebd8ea6e691a6ffb829e38e1ebbec67002645 (cherry picked from commit 9d552844e9936d03cc5a8856040fca18a2d2f5ac) (cherry picked from commit 857f2d522c5163d8bbcf4ba5c9394d043fbc5b82) Signed-off-by: Roman Kiryanov --- reference-ril/reference-ril.c | 93 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 12 deletions(-) diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c index 1ba2508..1a1eb9b 100644 --- a/reference-ril/reference-ril.c +++ b/reference-ril/reference-ril.c @@ -38,6 +38,10 @@ #include #include #include +#include +#include +#include +#include #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 && 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) @@ -687,7 +740,7 @@ 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"; + responses[i].gateways = hasWifi ? "192.168.200.1" : "10.0.2.2"; responses[i].mtu = DEFAULT_MTU; } else { @@ -1951,6 +2004,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 +2052,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 +2507,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; -- cgit v1.2.3 From bc497e700e592450c632a898618866221420bf84 Mon Sep 17 00:00:00 2001 From: Bjoern Johansson Date: Thu, 27 Jul 2017 15:41:08 -0700 Subject: Use system property gateway if not using WiFi When running with WiFi the IPv4 gateway for the radio interface is known and can be hardcoded, even if TAP is enabled. This is because the gateway is the internal address in the router namespace. Without WiFi the radio interface is eth0, the public interface. The gateway for this interface can be dynamic if running with TAP networking so in that case it can't use a hardcoded gateway the way it used to. The DHCP client will set the net.eth0.gw system property to the gateway of the host network so use that property to give the correct gateway to the radio interface. Bug: 72886046 Test: manual, build and ran the emulator (steps from CTS tests) Change-Id: I110a1216cccc846a48befe4c8cb2e602ed63752f (cherry picked from commit cf111309af68ab095371ef495d2c78e1faf885a6) (cherry picked from commit 0de94de9dc67db550f50bf2ffe3360b7ce02907d) --- reference-ril/reference-ril.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c index 1a1eb9b..b04db97 100644 --- a/reference-ril/reference-ril.c +++ b/reference-ril/reference-ril.c @@ -34,8 +34,8 @@ #include "misc.h" #include #include +#include #include -#include #include #include #include @@ -567,7 +567,7 @@ static void requestCallSelection( 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; } @@ -726,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; } @@ -740,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 = hasWifi ? "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 { -- cgit v1.2.3 From efa3401c716b8d090afbd9a6a1022f111a041b9a Mon Sep 17 00:00:00 2001 From: bohu Date: Mon, 1 May 2017 14:07:22 -0700 Subject: Emulator: support querying device identity Current reference-ril only support CDMA type; Changed it to support Non-CDMS type (such as GSM) as well. BUG: 72886046 Test: run cts -m CtsTelephonyTestCases -t android.telephony.cts.TelephonyManagerTest#testGetImei Change-Id: I8a5f61d96568b22f990da2004248436fcef7a51a Signed-off-by: Roman Kiryanov --- reference-ril/reference-ril.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c index b04db97..4697f90 100644 --- a/reference-ril/reference-ril.c +++ b/reference-ril/reference-ril.c @@ -1200,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; @@ -1224,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*)); @@ -2723,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: -- cgit v1.2.3