summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndroid Build Role Account android-build-prod <android-build-team-robot@google.com>2018-03-20 09:44:47 +0000
committerAndroid Build Role Account android-build-prod <android-build-team-robot@google.com>2018-03-20 09:44:47 +0000
commit91c885d92c430b8f684a9d032c63a458b34ff3fa (patch)
treef473b6472d23838fdc6c6d93a12a49a9f45151ba
parent088bde826021116ad9544849d5e5be3952beebda (diff)
parent7e03807fdd448fe4c5b5149d05cd3165c8d69e1c (diff)
downloadandroid_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.mk2
-rw-r--r--libril/ril.cpp23
-rw-r--r--libril/ril_service.cpp13
-rw-r--r--libril/ril_service.h2
-rw-r--r--reference-ril/OWNERS9
-rw-r--r--reference-ril/reference-ril.c115
-rw-r--r--rild/Android.mk7
-rw-r--r--rild/rild.c5
-rw-r--r--rild/rild.legacy.rc5
-rw-r--r--rild/rild.rc2
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