summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLalit Kansara <lkansara@codeaurora.org>2018-03-12 19:44:12 +0530
committerLalit Kansara <lkansara@codeaurora.org>2018-03-14 13:59:56 +0530
commitdfa81fff1f5de98a19c3069a0b6fe230f4008e02 (patch)
treef473b6472d23838fdc6c6d93a12a49a9f45151ba
parent1f6a51cd7c680987a533de0c4cf3f04fc0d19be9 (diff)
parentefa6e614ef66851e2491a18485529ae2bd869201 (diff)
downloadandroid_hardware_ril-dfa81fff1f5de98a19c3069a0b6fe230f4008e02.tar.gz
android_hardware_ril-dfa81fff1f5de98a19c3069a0b6fe230f4008e02.tar.bz2
android_hardware_ril-dfa81fff1f5de98a19c3069a0b6fe230f4008e02.zip
P PPR1.180311.001 merge efa6e614ef66851e2491a18485529ae2bd869201 - conflicts
Change-Id: Ic355831b6ed1119238f0ea9c4cd7387408f48cc3
-rw-r--r--CleanSpec.mk2
-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
7 files changed, 126 insertions, 19 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/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