[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -1,7 +1,7 @@
<services>
<service name="tar_git">
<param name="url">https://git.merproject.org/slava/ofono.git</param>
- <param name="branch">watch</param>
- <param name="revision">f5653ae</param>
+ <param name="branch">master</param>
+ <param name="revision">mer/1.21+git52</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/.gitignore
^
|
@@ -49,6 +49,7 @@
unit/test-gprs-filter
unit/test-ril_config
unit/test-ril_util
+unit/test-ril_vendor
unit/test-ril-transport
unit/test-rilmodem-cb
unit/test-rilmodem-cs
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/Makefile.am
^
|
@@ -1032,6 +1032,14 @@
unit_objects += $(unit_test_ril_util_OBJECTS)
unit_tests += unit/test-ril_util
+unit_test_ril_vendor_SOURCES = unit/test-ril_vendor.c unit/fake_watch.c \
+ drivers/ril/ril_vendor.c drivers/ril/ril_vendor_mtk.c \
+ drivers/ril/ril_util.c src/log.c
+unit_test_ril_vendor_CFLAGS = $(COVERAGE_OPT) $(AM_CFLAGS)
+unit_test_ril_vendor_LDADD = @GLIB_LIBS@ -ldl
+unit_objects += $(unit_test_ril_vendor_OBJECTS)
+unit_tests += unit/test-ril_vendor
+
else
unit_tests += unit/test-rilmodem-cs \
unit/test-rilmodem-cs \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/configure.ac
^
|
@@ -33,7 +33,7 @@
AC_ARG_ENABLE(optimization, AC_HELP_STRING([--disable-optimization],
[disable code optimization through compiler]), [
if (test "${enableval}" = "no"); then
- CFLAGS="$CFLAGS -O0"
+ CFLAGS="$CFLAGS -O0 -U_FORTIFY_SOURCE"
fi
])
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_constants.h
^
|
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2013 Canonical Ltd.
- * Copyright (C) 2013-2018 Jolla Ltd.
+ * Copyright (C) 2013-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -233,6 +233,12 @@
RIL_DATA_PROFILE_INVALID = 0xFFFFFFFF
};
+enum ril_profile_type {
+ RIL_PROFILE_COMMON = 0,
+ RIL_PROFILE_3GPP = 1,
+ RIL_PROFILE_3GPP2 = 2
+};
+
enum ril_auth {
RIL_AUTH_NONE = 0,
RIL_AUTH_PAP = 1,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_data.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016-2018 Jolla Ltd.
+ * Copyright (C) 2016-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -28,12 +28,6 @@
#include <grilio_parser.h>
#include <grilio_request.h>
-#define DATA_PROFILE_DEFAULT_STR "0"
-
-#define PROTO_IP_STR "IP"
-#define PROTO_IPV6_STR "IPV6"
-#define PROTO_IPV4V6_STR "IPV4V6"
-
/* Yes, it does sometimes take minutes in roaming */
#define SETUP_DATA_CALL_TIMEOUT (300*1000) /* ms */
@@ -103,7 +97,7 @@
struct ril_radio *radio;
struct ril_network *network;
struct ril_data_manager *dm;
- struct ril_vendor_hook *vendor_hook;
+ struct ril_vendor *vendor;
enum ril_data_priv_flags flags;
enum ril_restricted_state restricted_state;
@@ -112,6 +106,8 @@
struct ril_data_request *pending_req;
struct ril_data_options options;
+ gboolean use_data_profiles;
+ guint mms_data_profile_id;
guint slot;
char *log_prefix;
guint query_id;
@@ -168,6 +164,7 @@
struct ril_data_request_setup {
struct ril_data_request req;
+ guint profile_id;
char *apn;
char *username;
char *password;
@@ -288,34 +285,6 @@
}
}
-const char *ril_data_ofono_protocol_to_ril(enum ofono_gprs_proto proto)
-{
- switch (proto) {
- case OFONO_GPRS_PROTO_IPV6:
- return PROTO_IPV6_STR;
- case OFONO_GPRS_PROTO_IPV4V6:
- return PROTO_IPV4V6_STR;
- case OFONO_GPRS_PROTO_IP:
- return PROTO_IP_STR;
- default:
- return NULL;
- }
-}
-
-int ril_data_protocol_to_ofono(const gchar *str)
-{
- if (str) {
- if (!strcmp(str, PROTO_IPV6_STR)) {
- return OFONO_GPRS_PROTO_IPV6;
- } else if (!strcmp(str, PROTO_IPV4V6_STR)) {
- return OFONO_GPRS_PROTO_IPV4V6;
- } else if (!strcmp(str, PROTO_IP_STR)) {
- return OFONO_GPRS_PROTO_IP;
- }
- }
- return -1;
-}
-
static gboolean ril_data_call_parse_default(struct ril_data_call *call,
int version, GRilIoParser *rilp)
{
@@ -335,7 +304,7 @@
call->dnses = grilio_parser_split_utf8(rilp, " ");
call->gateways = grilio_parser_split_utf8(rilp, " ");
- prot = ril_data_protocol_to_ofono(prot_str);
+ prot = ril_protocol_to_ofono(prot_str);
if (prot < 0 && status == PDP_FAIL_NONE) {
ofono_error("Invalid protocol: %s", prot_str);
}
@@ -360,12 +329,12 @@
return TRUE;
}
-static struct ril_data_call *ril_data_call_parse(struct ril_vendor_hook *hook,
+static struct ril_data_call *ril_data_call_parse(struct ril_vendor *vendor,
int version, GRilIoParser *parser)
{
GRilIoParser copy = *parser;
struct ril_data_call *call = ril_data_call_new();
- gboolean parsed = ril_vendor_hook_data_call_parse(hook, call,
+ gboolean parsed = ril_vendor_data_call_parse(vendor, call,
version, parser);
if (!parsed) {
@@ -381,7 +350,7 @@
"mtu=%d,address=%s,dns=%s %s,gateways=%s]",
call->status, call->retry_time,
call->cid, call->active,
- ril_data_ofono_protocol_to_ril(call->prot),
+ ril_protocol_from_ofono(call->prot),
call->ifname, call->mtu,
call->addresses ? call->addresses[0] : NULL,
call->dnses ? call->dnses[0] : NULL,
@@ -396,7 +365,7 @@
}
static struct ril_data_call_list *ril_data_call_list_parse(const void *data,
- guint len, struct ril_vendor_hook *hook,
+ guint len, struct ril_vendor *vendor,
enum ril_data_call_format format)
{
guint32 version, n, i;
@@ -417,7 +386,7 @@
}
for (i = 0; i < n && !grilio_parser_at_end(&rilp); i++) {
- struct ril_data_call *call = ril_data_call_parse(hook,
+ struct ril_data_call *call = ril_data_call_parse(vendor,
list->version, &rilp);
if (call) {
@@ -635,7 +604,7 @@
}
ril_data_set_calls(self, ril_data_call_list_parse(data, len,
- priv->vendor_hook, priv->options.data_call_format));
+ priv->vendor, priv->options.data_call_format));
}
static void ril_data_query_data_calls_cb(GRilIoChannel *io, int ril_status,
@@ -652,7 +621,7 @@
priv->query_id = 0;
if (ril_status == RIL_E_SUCCESS) {
ril_data_set_calls(self, ril_data_call_list_parse(data, len,
- priv->vendor_hook, priv->options.data_call_format));
+ priv->vendor, priv->options.data_call_format));
} else {
/* RADIO_NOT_AVAILABLE == no calls */
ril_data_set_calls(self, NULL);
@@ -857,8 +826,8 @@
struct ril_data_call *call = NULL;
if (ril_status == RIL_E_SUCCESS) {
- list = ril_data_call_list_parse(data, len,
- priv->vendor_hook, priv->options.data_call_format);
+ list = ril_data_call_list_parse(data, len, priv->vendor,
+ priv->options.data_call_format);
}
if (list) {
@@ -920,7 +889,7 @@
struct ril_data_request_setup *setup =
G_CAST(req, struct ril_data_request_setup, req);
struct ril_data_priv *priv = req->data->priv;
- const char *proto_str = ril_data_ofono_protocol_to_ril(setup->proto);
+ const char *proto_str = ril_protocol_from_ofono(setup->proto);
GRilIoRequest *ioreq;
int tech, auth = RIL_AUTH_NONE;
@@ -946,25 +915,12 @@
}
if (setup->username && setup->username[0]) {
- switch (setup->auth_method) {
- case OFONO_GPRS_AUTH_METHOD_ANY:
- auth = RIL_AUTH_BOTH;
- break;
- case OFONO_GPRS_AUTH_METHOD_NONE:
- auth = RIL_AUTH_NONE;
- break;
- case OFONO_GPRS_AUTH_METHOD_CHAP:
- auth = RIL_AUTH_CHAP;
- break;
- case OFONO_GPRS_AUTH_METHOD_PAP:
- auth = RIL_AUTH_PAP;
- break;
- }
+ auth = ril_auth_method_from_ofono(setup->auth_method);
}
/* Give vendor code a chance to build a vendor specific packet */
- ioreq = ril_vendor_hook_data_call_req(priv->vendor_hook, tech,
- DATA_PROFILE_DEFAULT_STR, setup->apn, setup->username,
+ ioreq = ril_vendor_data_call_req(priv->vendor, tech,
+ setup->profile_id, setup->apn, setup->username,
setup->password, auth, proto_str);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_data.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016-2018 Jolla Ltd.
+ * Copyright (C) 2016-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -100,7 +100,7 @@
struct ril_radio *radio, struct ril_network *network,
GRilIoChannel *io, const struct ril_data_options *options,
const struct ril_slot_config *config,
- struct ril_vendor_hook *vendor_hook);
+ struct ril_vendor *vendor);
struct ril_data *ril_data_ref(struct ril_data *data);
void ril_data_unref(struct ril_data *data);
gboolean ril_data_allowed(struct ril_data *data);
@@ -117,6 +117,7 @@
struct ril_data_request;
struct ril_data_request *ril_data_call_setup(struct ril_data *data,
const struct ofono_gprs_primary_context *ctx,
+ enum ofono_gprs_context_type context_type,
ril_data_call_setup_cb_t cb, void *arg);
struct ril_data_request *ril_data_call_deactivate(struct ril_data *data,
int cid, ril_data_call_deactivate_cb_t cb, void *arg);
@@ -131,9 +132,6 @@
struct ril_data_call *ril_data_call_find(struct ril_data_call_list *list,
int cid);
-const char *ril_data_ofono_protocol_to_ril(enum ofono_gprs_proto proto);
-int ril_data_protocol_to_ofono(const gchar *str);
-
/* Constructors of various kinds of RIL requests */
GRilIoRequest *ril_request_allow_data_new(gboolean allow);
GRilIoRequest *ril_request_deactivate_data_call_new(int cid);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_gprs_context.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2018 Jolla Ltd.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -468,6 +468,7 @@
gcd->activate.cb = cb;
gcd->activate.data = data;
gcd->activate.req = ril_data_call_setup(gcd->data, ctx,
+ __ofono_gprs_context_get_assigned_type(gc),
ril_gprs_context_activate_primary_cb, gcd);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_modem.c
^
|
@@ -284,8 +284,10 @@
ofono_phonebook_create(modem, 0, RILMODEM_DRIVER, md);
ofono_call_forwarding_create(modem, 0, RILMODEM_DRIVER, md);
ofono_call_barring_create(modem, 0, RILMODEM_DRIVER, md);
- ofono_stk_create(modem, 0, RILMODEM_DRIVER, md);
ofono_message_waiting_register(ofono_message_waiting_create(modem));
+ if (md->modem.config.enable_stk) {
+ ofono_stk_create(modem, 0, RILMODEM_DRIVER, md);
+ }
if (md->modem.config.enable_cbs) {
ofono_cbs_create(modem, 0, RILMODEM_DRIVER, md);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_network.c
^
|
@@ -17,6 +17,7 @@
#include "ril_radio.h"
#include "ril_sim_card.h"
#include "ril_sim_settings.h"
+#include "ril_vendor.h"
#include "ril_util.h"
#include "ril_log.h"
@@ -25,8 +26,11 @@
#include <grilio_parser.h>
#include <gutil_misc.h>
+#include <gutil_macros.h>
#include <ofono/netreg.h>
+#include <ofono/watch.h>
+#include <ofono/gprs.h>
#include "common.h"
@@ -59,11 +63,33 @@
UNSOL_EVENT_COUNT
};
+enum ril_network_watch_event {
+ WATCH_EVENT_GPRS,
+ WATCH_EVENT_GPRS_SETTINGS,
+ WATCH_EVENT_COUNT
+};
+
+struct ril_network_data_profile {
+ enum ril_data_profile profile_id;
+ enum ril_profile_type type;
+ const char *apn;
+ const char *user;
+ const char *password;
+ enum ofono_gprs_auth_method auth_method;
+ enum ofono_gprs_proto proto;
+ int max_conns_time;
+ int max_conns;
+ int wait_time;
+ gboolean enabled;
+};
+
struct ril_network_priv {
GRilIoChannel *io;
GRilIoQueue *q;
struct ril_radio *radio;
struct ril_sim_card *simcard;
+ struct ril_vendor *vendor;
+ struct ofono_watch *watch;
int rat;
enum ril_pref_net_type lte_network_mode;
enum ril_pref_net_type umts_network_mode;
@@ -79,8 +105,15 @@
gulong settings_event_id;
gulong radio_event_id[RADIO_EVENT_COUNT];
gulong simcard_event_id[SIM_EVENT_COUNT];
+ gulong watch_ids[WATCH_EVENT_COUNT];
+ gboolean need_initial_attach_apn;
+ gboolean set_initial_attach_apn;
struct ofono_network_operator operator;
gboolean assert_rat;
+ gboolean use_data_profiles;
+ int mms_data_profile_id;
+ GSList *data_profiles;
+ guint set_data_profiles_id;
};
enum ril_network_signal {
@@ -475,7 +508,8 @@
}
}
-static int ril_network_pref_mode_expected(struct ril_network *self)
+static enum ofono_radio_access_mode ril_network_actual_pref_mode
+ (struct ril_network *self)
{
struct ril_sim_settings *settings = self->settings;
struct ril_network_priv *priv = self->priv;
@@ -498,12 +532,285 @@
* and max_pref_mode are not ANY, we pick the smallest value.
* Otherwise we take any non-zero value if there is one.
*/
- const enum ofono_radio_access_mode pref_mode =
- (settings->pref_mode && max_pref_mode) ?
+ return (settings->pref_mode && max_pref_mode) ?
MIN(settings->pref_mode, max_pref_mode) :
- settings->pref_mode ? settings->pref_mode :
- max_pref_mode;
- return ril_network_mode_to_rat(self, pref_mode);
+ settings->pref_mode ? settings->pref_mode : max_pref_mode;
+}
+
+static gboolean ril_network_need_initial_attach_apn(struct ril_network *self)
+{
+ struct ril_network_priv *priv = self->priv;
+ struct ril_radio *radio = priv->radio;
+ struct ofono_watch *watch = priv->watch;
+
+ if (watch->gprs && radio->state == RADIO_STATE_ON) {
+ switch (ril_network_actual_pref_mode(self)) {
+ case OFONO_RADIO_ACCESS_MODE_ANY:
+ case OFONO_RADIO_ACCESS_MODE_LTE:
+ return TRUE;
+ case OFONO_RADIO_ACCESS_MODE_UMTS:
+ case OFONO_RADIO_ACCESS_MODE_GSM:
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static void ril_network_set_initial_attach_apn(struct ril_network *self,
+ const struct ofono_gprs_primary_context *ctx)
+{
+ struct ril_network_priv *priv = self->priv;
+ const char *proto = ril_protocol_from_ofono(ctx->proto);
+ const char *username;
+ const char *password;
+ enum ril_auth auth;
+ GRilIoRequest *req;
+
+ if (ctx->username[0] || ctx->password[0]) {
+ auth = ril_auth_method_from_ofono(ctx->auth_method);
+ username = ctx->username;
+ password = ctx->password;
+ } else {
+ auth = RIL_AUTH_NONE;
+ username = "";
+ password = "";
+ }
+
+ req = ril_vendor_set_attach_apn_req(priv->vendor,ctx->apn,
+ username, password, auth, proto);
+
+ if (!req) {
+ /* Default format */
+ req = grilio_request_new();
+ grilio_request_append_utf8(req, ctx->apn);
+ grilio_request_append_utf8(req, proto);
+ grilio_request_append_int32(req, auth);
+ grilio_request_append_utf8(req, username);
+ grilio_request_append_utf8(req, password);
+ }
+
+ DBG_(self, "\"%s\"", ctx->apn);
+ grilio_queue_send_request(priv->q, req,
+ RIL_REQUEST_SET_INITIAL_ATTACH_APN);
+ grilio_request_unref(req);
+}
+
+static void ril_network_try_set_initial_attach_apn(struct ril_network *self)
+{
+ struct ril_network_priv *priv = self->priv;
+
+ if (priv->need_initial_attach_apn && priv->set_initial_attach_apn) {
+ struct ofono_gprs *gprs = priv->watch->gprs;
+ const struct ofono_gprs_primary_context *ctx =
+ ofono_gprs_context_settings_by_type(gprs,
+ OFONO_GPRS_CONTEXT_TYPE_INTERNET);
+
+ if (ctx) {
+ priv->set_initial_attach_apn = FALSE;
+ ril_network_set_initial_attach_apn(self, ctx);
+ }
+ }
+}
+
+static void ril_network_check_initial_attach_apn(struct ril_network *self)
+{
+ const gboolean need = ril_network_need_initial_attach_apn(self);
+ struct ril_network_priv *priv = self->priv;
+
+ if (priv->need_initial_attach_apn != need) {
+ DBG_(self, "%sneed initial attach apn", need ? "" : "don't ");
+ priv->need_initial_attach_apn = need;
+ if (need) {
+ /* We didn't need initial attach APN and now we do */
+ priv->set_initial_attach_apn = TRUE;
+ }
+ }
+ ril_network_try_set_initial_attach_apn(self);
+}
+
+struct ril_network_data_profile *ril_network_data_profile_new
+ (const struct ofono_gprs_primary_context* context,
+ enum ril_data_profile profile_id)
+{
+ /* Allocate the whole thing as a single memory block */
+ struct ril_network_data_profile *profile;
+ const enum ofono_gprs_auth_method auth_method =
+ (context->username[0] || context->password[0]) ?
+ context->auth_method : OFONO_GPRS_AUTH_METHOD_NONE;
+ const gsize apn_size = strlen(context->apn) + 1;
+ gsize username_size = 0;
+ gsize password_size = 0;
+ gsize size = G_ALIGN8(sizeof(*profile)) + G_ALIGN8(apn_size);
+ char* ptr;
+
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_network.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2018 Jolla Ltd.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -49,7 +49,8 @@
const char *log_prefix, struct ril_radio *radio,
struct ril_sim_card *sim_card,
struct ril_sim_settings *settings,
- const struct ril_slot_config *ril_slot_config);
+ const struct ril_slot_config *ril_slot_config,
+ struct ril_vendor *vendor);
struct ril_network *ril_network_ref(struct ril_network *net);
void ril_network_unref(struct ril_network *net);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_plugin.c
^
|
@@ -71,6 +71,7 @@
#define RILMODEM_DEFAULT_NETWORK_MODE_TIMEOUT (20*1000) /* ms */
#define RILMODEM_DEFAULT_ENABLE_VOICECALL TRUE
#define RILMODEM_DEFAULT_ENABLE_CBS TRUE
+#define RILMODEM_DEFAULT_ENABLE_STK TRUE
#define RILMODEM_DEFAULT_SLOT 0xffffffff
#define RILMODEM_DEFAULT_TIMEOUT 0 /* No timeout */
#define RILMODEM_DEFAULT_SIM_FLAGS RIL_SIM_CARD_V9_UICC_SUBSCRIPTION_WORKAROUND
@@ -86,6 +87,8 @@
#define RILMODEM_DEFAULT_RADIO_POWER_CYCLE TRUE
#define RILMODEM_DEFAULT_CONFIRM_RADIO_POWER_ON TRUE
#define RILMODEM_DEFAULT_NETWORK_SELECTION_MANUAL_0 TRUE
+#define RILMODEM_DEFAULT_USE_DATA_PROFILES FALSE
+#define RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID RIL_DATA_PROFILE_IMS
#define RILMODEM_DEFAULT_SLOT_FLAGS SAILFISH_SLOT_NO_FLAGS
/* RIL socket transport name and parameters */
@@ -117,6 +120,7 @@
#define RILCONF_4G "enable4G" /* Deprecated */
#define RILCONF_ENABLE_VOICECALL "enableVoicecall"
#define RILCONF_ENABLE_CBS "enableCellBroadcast"
+#define RILCONF_ENABLE_STK "enableSimToolkit"
#define RILCONF_TECHNOLOGIES "technologies"
#define RILCONF_LTE_MODE "lteNetworkMode"
#define RILCONF_UMTS_MODE "umtsNetworkMode"
@@ -136,6 +140,8 @@
#define RILCONF_CONFIRM_RADIO_POWER_ON "confirmRadioPowerOn"
#define RILCONF_SINGLE_DATA_CONTEXT "singleDataContext"
#define RILCONF_NETWORK_SELECTION_MANUAL_0 "networkSelectionManual0"
+#define RILCONF_USE_DATA_PROFILES "useDataProfiles"
+#define RILCONF_MMS_DATA_PROFILE_ID "mmsDataProfileId"
/* Modem error ids */
#define RIL_ERROR_ID_RILD_RESTART "rild-restart"
@@ -213,8 +219,8 @@
struct ril_sim_card *sim_card;
struct ril_sim_settings *sim_settings;
struct ril_oem_raw *oem_raw;
- const struct ril_vendor_driver *vendor;
- struct ril_vendor_hook *vendor_hook;
+ const struct ril_vendor_driver *vendor_driver;
+ struct ril_vendor *vendor;
struct ril_data *data;
gboolean legacy_imei_query;
enum sailfish_slot_flags slot_flags;
@@ -429,9 +435,9 @@
slot->received_sim_status = FALSE;
}
- if (slot->vendor_hook) {
- ril_vendor_hook_unref(slot->vendor_hook);
- slot->vendor_hook = NULL;
+ if (slot->vendor) {
+ ril_vendor_unref(slot->vendor);
+ slot->vendor = NULL;
}
if (slot->io) {
@@ -753,7 +759,7 @@
guint id, guint code, const void *data, guint data_len, void *user_data)
{
ril_slot *slot = user_data;
- struct ril_vendor_hook *hook = slot->vendor_hook;
+ struct ril_vendor *vendor = slot->vendor;
static const GLogModule* log_module = &ril_debug_trace_module;
const char *prefix = io->name ? io->name : "";
const char dir = (type == GRILIO_PACKET_REQ) ? '<' : '>';
@@ -765,8 +771,9 @@
code == RIL_REQUEST_V9_SET_UICC_SUBSCRIPTION) {
scode = "V9_SET_UICC_SUBSCRIPTION";
} else {
- scode = ril_vendor_hook_request_to_string(hook, code);
+ scode = ril_vendor_request_to_string(vendor, code);
if (!scode) {
+ /* Not a vendor specific request */
scode = ril_request_to_string(code);
}
}
@@ -784,8 +791,9 @@
break;
case GRILIO_PACKET_UNSOL:
case GRILIO_PACKET_UNSOL_ACK_EXP:
- scode = ril_vendor_hook_event_to_string(hook, code);
+ scode = ril_vendor_event_to_string(vendor, code);
if (!scode) {
+ /* Not a vendor specific event */
scode = ril_unsol_event_to_string(code);
}
gutil_log(log_module, GLOG_LEVEL_VERBOSE, "%s%c %s",
@@ -1006,19 +1014,19 @@
GASSERT(!slot->sim_card->status);
GASSERT(!slot->received_sim_status);
+ GASSERT(!slot->vendor);
+ slot->vendor = ril_vendor_create(slot->vendor_driver, slot->io,
+ slot->path, &slot->config);
+
GASSERT(!slot->network);
slot->network = ril_network_new(slot->path, slot->io, log_prefix,
slot->radio, slot->sim_card, slot->sim_settings,
- &slot->config);
-
- GASSERT(!slot->vendor_hook);
- slot->vendor_hook = ril_vendor_create_hook(slot->vendor, slot->io,
- slot->path, &slot->config, slot->network);
+ &slot->config, slot->vendor);
GASSERT(!slot->data);
slot->data = ril_data_new(plugin->data_manager, log_prefix,
slot->radio, slot->network, slot->io, &slot->data_opt,
- &slot->config, slot->vendor_hook);
+ &slot->config, slot->vendor);
GASSERT(!slot->cell_info);
if (slot->io->ril_version >= 9) {
@@ -1051,6 +1059,7 @@
slot->imeisv, ril_plugin_sim_state(slot),
slot->slot_flags);
sailfish_manager_set_cell_info(slot->handle, slot->cell_info);
+ grilio_channel_set_enabled(slot->io, slot->handle->enabled);
/* Check if this was the last slot we were waiting for */
ril_plugin_check_if_started(plugin);
@@ -1211,10 +1220,13 @@
RILMODEM_DEFAULT_CONFIRM_RADIO_POWER_ON;
config->enable_voicecall = RILMODEM_DEFAULT_ENABLE_VOICECALL;
config->enable_cbs = RILMODEM_DEFAULT_ENABLE_CBS;
+ config->enable_stk = RILMODEM_DEFAULT_ENABLE_STK;
config->query_available_band_mode =
RILMODEM_DEFAULT_QUERY_AVAILABLE_BAND_MODE;
config->network_selection_manual_0 =
RILMODEM_DEFAULT_NETWORK_SELECTION_MANUAL_0;
+ config->use_data_profiles = RILMODEM_DEFAULT_USE_DATA_PROFILES;
+ config->mms_data_profile_id = RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID;
slot->timeout = RILMODEM_DEFAULT_TIMEOUT;
slot->sim_flags = RILMODEM_DEFAULT_SIM_FLAGS;
slot->slot_flags = RILMODEM_DEFAULT_SLOT_FLAGS;
@@ -1245,7 +1257,7 @@
static void ril_plugin_slot_apply_vendor_defaults(ril_slot *slot)
{
- if (slot->vendor) {
+ if (slot->vendor_driver) {
struct ril_slot_config *config = &slot->config;
struct ril_vendor_defaults defaults;
@@ -1253,14 +1265,20 @@
memset(&defaults, 0, sizeof(defaults));
defaults.legacy_imei_query = slot->legacy_imei_query;
defaults.enable_cbs = config->enable_cbs;
+ defaults.enable_stk = config->enable_stk;
defaults.empty_pin_query = config->empty_pin_query;
+ defaults.mms_data_profile_id = config->mms_data_profile_id;
+ defaults.use_data_profiles = config->use_data_profiles;
defaults.query_available_band_mode =
config->query_available_band_mode;
- ril_vendor_get_defaults(slot->vendor, &defaults);
+ ril_vendor_get_defaults(slot->vendor_driver, &defaults);
slot->legacy_imei_query = defaults.legacy_imei_query;
config->enable_cbs = defaults.enable_cbs;
+ config->enable_stk = defaults.enable_stk;
config->empty_pin_query = defaults.empty_pin_query;
+ config->use_data_profiles = defaults.use_data_profiles;
+ config->mms_data_profile_id = defaults.mms_data_profile_id;
config->query_available_band_mode =
defaults.query_available_band_mode;
}
@@ -1437,17 +1455,11 @@
/* vendorDriver */
sval = ril_config_get_string(file, group, RILCONF_VENDOR_DRIVER);
if (sval) {
- const struct ril_vendor_driver *vendor;
- RIL_VENDOR_DRIVER_FOREACH(vendor) {
- if (!strcasecmp(vendor->name, sval)) {
- DBG("%s: " RILCONF_VENDOR_DRIVER " %s", group,
- sval);
- slot->vendor = vendor;
- ril_plugin_slot_apply_vendor_defaults(slot);
- break;
- }
- }
- if (!slot->vendor) {
+ slot->vendor_driver = ril_vendor_find_driver(sval);
+ if (slot->vendor_driver) {
+ DBG("%s: " RILCONF_VENDOR_DRIVER " %s", group, sval);
+ ril_plugin_slot_apply_vendor_defaults(slot);
+ } else {
ofono_warn("Unknown vendor '%s'", sval);
}
g_free(sval);
@@ -1480,6 +1492,13 @@
config->enable_cbs ? "yes" : "no");
}
+ /* enableSimTookit */
+ if (ril_config_get_boolean(file, group, RILCONF_ENABLE_STK,
+ &config->enable_stk)) {
+ DBG("%s: " RILCONF_ENABLE_STK " %s", group,
+ config->enable_stk ? "yes" : "no");
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_subscription.conf
^
|
@@ -17,14 +17,14 @@
# If it's set to true, all [ril_x] sections are ignored even
# if they are present, and no default configurtation is created.
#
-# Default is false
+# Default false
#
#EmptyConfig=false
# User and group for the ofono process. RIL clients are typically
# expected to run under radio:radio.
#
-# Default is radio:radio
+# Default radio:radio
#
#Identity=radio:radio
@@ -37,7 +37,7 @@
# 3G/LTE modules for each slot or you don't need 4G for both slots).
# Obviously, it only has any effect if you have more than one SIM.
#
-# Default is true (switch the current data modem to 2G when changing
+# Defaults to true (switch the current data modem to 2G when changing
# the data modems)
#
#3GLTEHandover=true
@@ -49,7 +49,7 @@
#
# Possible values are auto, on and off
#
-# Default is auto (enable for RIL version >= 11)
+# Default auto (enable for RIL version >= 11)
#
#SetRadioCapability=auto
@@ -81,7 +81,7 @@
# RIL request timeout, in milliseconds.
#
-# The default is zero (no timeout)
+# Default zero (no timeout)
#
#timeout=0
@@ -89,7 +89,7 @@
# Valid technologies are "gsm", "umts" and "lte". The special value
# "all" means that all technologies are supported.
#
-# The default is all
+# Default all
#
#technologies=all
@@ -102,7 +102,7 @@
# which RIL version it's dealing with, it makes the decision at runtime.
# Settings it to false disables the workaround and always sends 122.
#
-# Default is true (select SET_UICC_SUBSCRIPTION based on the RIL version)
+# Default true (select SET_UICC_SUBSCRIPTION based on the RIL version)
#
#uiccWorkaround=true
@@ -124,7 +124,7 @@
# This option allows you to forcibly enable or disable use of this request.
# Possible values are auto, on and off
#
-# Default is auto (enable for RIL version >= 11)
+# Default auto (enable for RIL version >= 11)
#
#allowDataReq=auto
@@ -134,7 +134,7 @@
# actually does check the empty pin (and decrements the retry count)
# then you should turn this feature off.
#
-# Default is true
+# Default true
#
#emptyPinQuery=true
@@ -146,7 +146,7 @@
# but sometimes you have to explicitly tell ofono which one to use.
# Possible values are 6, 9, 11 and auto.
#
-# Default is auto
+# Default auto
#
#dataCallFormat=auto
@@ -155,7 +155,7 @@
# this parameter. Usually, one retry is enough. The first retry occurs
# immediately, the subsequent ones after dataCallRetryDelay (see below)
#
-# Default is 4
+# Default 4
#
#dataCallRetryLimit=4
@@ -163,7 +163,7 @@
# retry occurs immediately after the first failure, the delays are only
# applied if the first retry fails too.
#
-# Default is 200 ms
+# Default 200 ms
#
#dataCallRetryDelay=200
@@ -191,6 +191,13 @@
#
#enableCellBroadcast=true
+# Support for Sim Toolkit (STK). By default, its enabled but if your rild
+# and/or modem is not happy about it, you can turn it off.
+#
+# Default true
+#
+#enableSimToolkit=true
+
# Timeout for the modem to show up, in milliseconds. Those that don't
# show up before this timeout expires, will be dropped (ignored).
#
@@ -198,7 +205,7 @@
# optional modems (which may or may not be available), to speed up the
# boot up process.
#
-# The default is 20000 (20 seconds)
+# Default 20000 (20 seconds)
#
#startTimeout=20000
@@ -206,26 +213,26 @@
# RIL_REQUEST_DEVICE_IDENTITY to query IMEI from the modem. Some
# RILs (e.g. MTK) still don't understand RIL_REQUEST_DEVICE_IDENTITY.
#
-# Default is false (use RIL_REQUEST_DEVICE_IDENTITY)
+# Default false (use RIL_REQUEST_DEVICE_IDENTITY)
#
#legacyImeiQuery=false
# Some devices don't support LTE RAT mode PREF_NET_TYPE_LTE_GSM_WCDMA.
# This option allows to set a custom LTE mode.
#
-# The default is 9 (PREF_NET_TYPE_LTE_GSM_WCDMA)
+# Default 9 (PREF_NET_TYPE_LTE_GSM_WCDMA)
#
#lteNetworkMode=9
# Timeout for RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, in milliseconds.
#
-# The default is 20000 (20 seconds)
+# Default 20000 (20 seconds)
#
#networkModeTimeout=20000
# Cycle radio power at startup.
#
-# The default is true (cycle the power)
+# Default true (cycle the power)
#
#radioPowerCycle=true
@@ -237,7 +244,7 @@
# On the other hand, with some RILs it's causing some trouble (like this
# extra RIL_REQUEST_RADIO_POWER getting stuck indefinitely).
#
-# The default is true for historical reasons
+# Default true (for historical reasons)
#
#confirmRadioPowerOn=true
@@ -246,7 +253,7 @@
# require that mobile data is disconnected before we can send or receive
# MMS. In other words, activation of the second data context fails.
#
-# The default is false (more than one context is supported)
+# Default false (more than one context is supported)
#
#singleDataContext=false
@@ -254,6 +261,20 @@
# RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL. Some Qualcomm RILs
# require it, some MediaTek RILs don't like it.
#
-# The default is true
+# Default true
#
#networkSelectionManual0=true
+
+# Enables use of SET_DATA_PROFILE requests. Everything used to work without
+# profiles, that's why it's disabled by default.
+#
+# Default false
+#
+#useDataProfiles=false
+
+# Configures MMS data profile ID. Must be non-zero.
+# This option is ignored if useDataProfiles is false.
+#
+# Default 2 (RIL_DATA_PROFILE_IMS)
+#
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_types.h
^
|
@@ -46,7 +46,7 @@
struct ril_radio;
struct ril_network;
struct ril_sim_card;
-struct ril_vendor_hook;
+struct ril_vendor;
struct ril_slot_config {
guint slot;
@@ -60,7 +60,10 @@
gboolean confirm_radio_power_on;
gboolean enable_voicecall;
gboolean enable_cbs;
+ gboolean enable_stk;
gboolean network_selection_manual_0;
+ gboolean use_data_profiles;
+ guint mms_data_profile_id;
GUtilInts *local_hangup_reasons;
GUtilInts *remote_hangup_reasons;
};
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_util.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2018 Jolla Ltd.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -26,6 +26,10 @@
#include "common.h"
#include "netreg.h"
+#define RIL_PROTO_IP_STR "IP"
+#define RIL_PROTO_IPV6_STR "IPV6"
+#define RIL_PROTO_IPV4V6_STR "IPV4V6"
+
const char *ril_error_to_string(int error)
{
#define RIL_E_(name) case RIL_E_##name: return #name
@@ -321,6 +325,50 @@
}
}
+const char *ril_protocol_from_ofono(enum ofono_gprs_proto proto)
+{
+ switch (proto) {
+ case OFONO_GPRS_PROTO_IPV6:
+ return RIL_PROTO_IPV6_STR;
+ case OFONO_GPRS_PROTO_IPV4V6:
+ return RIL_PROTO_IPV4V6_STR;
+ case OFONO_GPRS_PROTO_IP:
+ return RIL_PROTO_IP_STR;
+ }
+ return NULL;
+}
+
+int ril_protocol_to_ofono(const gchar *str)
+{
+ if (str) {
+ if (!strcmp(str, RIL_PROTO_IPV6_STR)) {
+ return OFONO_GPRS_PROTO_IPV6;
+ } else if (!strcmp(str, RIL_PROTO_IPV4V6_STR)) {
+ return OFONO_GPRS_PROTO_IPV4V6;
+ } else if (!strcmp(str, RIL_PROTO_IP_STR)) {
+ return OFONO_GPRS_PROTO_IP;
+ }
+ }
+ return -1;
+}
+
+enum ril_auth ril_auth_method_from_ofono(enum ofono_gprs_auth_method auth)
+{
+ switch (auth) {
+ case OFONO_GPRS_AUTH_METHOD_NONE:
+ return RIL_AUTH_NONE;
+ case OFONO_GPRS_AUTH_METHOD_CHAP:
+ return RIL_AUTH_CHAP;
+ case OFONO_GPRS_AUTH_METHOD_PAP:
+ return RIL_AUTH_PAP;
+ case OFONO_GPRS_AUTH_METHOD_ANY:
+ /* Use default */
+ break;
+ }
+ /* Default */
+ return RIL_AUTH_BOTH;
+}
+
/* Returns enum access_technology or -1 on failure. */
int ril_parse_tech(const char *stech, int *ril_tech)
{
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_util.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2018 Jolla Ltd.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -18,12 +18,17 @@
#include "ril_types.h"
+#include <ofono/gprs-context.h>
+
struct ofono_network_operator;
const char *ril_error_to_string(int error);
const char *ril_request_to_string(guint request);
const char *ril_unsol_event_to_string(guint event);
const char *ril_radio_state_to_string(int radio_state);
+const char *ril_protocol_from_ofono(enum ofono_gprs_proto proto);
+int ril_protocol_to_ofono(const char *str);
+enum ril_auth ril_auth_method_from_ofono(enum ofono_gprs_auth_method auth);
int ril_parse_tech(const char *stech, int *ril_tech);
gboolean ril_parse_mcc_mnc(const char *str, struct ofono_network_operator *op);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_vendor.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016-2018 Jolla Ltd.
+ * Copyright (C) 2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -14,147 +14,184 @@
*/
#include "ril_vendor.h"
+#include "ril_vendor_impl.h"
#include "ril_log.h"
-struct ril_vendor_hook *ril_vendor_create_hook
- (const struct ril_vendor_driver *vendor, GRilIoChannel *io,
- const char *path, const struct ril_slot_config *config,
- struct ril_network *network)
-{
- if (vendor) {
- const void *data = vendor->driver_data;
-
- /*
- * NOTE: we are looking for the callback in the base but
- * keeping the original driver data.
- */
- while (!vendor->create_hook && vendor->base) {
- vendor = vendor->base;
- }
- if (vendor->create_hook) {
- return vendor->create_hook(data, io, path, config,
- network);
+#include <grilio_channel.h>
+
+G_DEFINE_ABSTRACT_TYPE(RilVendor, ril_vendor, G_TYPE_OBJECT)
+
+/* Vendor driver descriptors are in the "__vendor" section */
+extern const struct ril_vendor_driver __start___vendor[];
+extern const struct ril_vendor_driver __stop___vendor[];
+
+const struct ril_vendor_driver *ril_vendor_find_driver(const char *name)
+{
+ if (name) {
+ const struct ril_vendor_driver *d;
+
+ for (d = __start___vendor; d < __stop___vendor; d++) {
+ if (!strcasecmp(d->name, name)) {
+ return d;
+ }
}
}
return NULL;
}
-struct ril_vendor_hook *ril_vendor_hook_init(struct ril_vendor_hook *self,
- const struct ril_vendor_hook_proc *proc,
- ril_vendor_hook_free_proc free)
-{
- self->proc = proc;
- self->free = free;
- g_atomic_int_set(&self->ref_count, 1);
- return self;
+RilVendor *ril_vendor_create(const struct ril_vendor_driver *driver,
+ GRilIoChannel *io, const char *path,
+ const struct ril_slot_config *config)
+{
+ return (driver && driver->create_vendor) ?
+ driver->create_vendor(driver->driver_data, io, path, config) :
+ NULL;
}
-struct ril_vendor_hook *ril_vendor_hook_ref(struct ril_vendor_hook *self)
+RilVendor *ril_vendor_ref(RilVendor *self)
{
- if (self) {
- GASSERT(self->ref_count > 0);
- g_atomic_int_inc(&self->ref_count);
+ if (G_LIKELY(self)) {
+ g_object_ref(RIL_VENDOR(self));
}
return self;
}
-static void ril_vendor_hook_free(struct ril_vendor_hook *self)
+void ril_vendor_unref(RilVendor *self)
{
- if (self->free) {
- self->free(self);
+ if (G_LIKELY(self)) {
+ g_object_unref(RIL_VENDOR(self));
}
}
-void ril_vendor_hook_unref(struct ril_vendor_hook *self)
+void ril_vendor_get_defaults(const struct ril_vendor_driver *vendor,
+ struct ril_vendor_defaults *defaults)
{
- if (self) {
- GASSERT(self->ref_count > 0);
- if (g_atomic_int_dec_and_test(&self->ref_count)) {
- ril_vendor_hook_free(self);
- }
+ if (vendor && vendor->get_defaults) {
+ vendor->get_defaults(defaults);
}
}
-void ril_vendor_get_defaults(const struct ril_vendor_driver *vendor,
- struct ril_vendor_defaults *defaults)
+const char *ril_vendor_request_to_string(RilVendor *self, guint request)
{
- if (vendor) {
- while (!vendor->get_defaults && vendor->base) {
- vendor = vendor->base;
- }
- if (vendor->get_defaults) {
- vendor->get_defaults(defaults);
- }
- }
+ return G_LIKELY(self) ? RIL_VENDOR_GET_CLASS(self)->
+ request_to_string(self, request) : NULL;
}
-const char *ril_vendor_hook_request_to_string(struct ril_vendor_hook *self,
- guint request)
+const char *ril_vendor_event_to_string(RilVendor *self, guint event)
{
- if (self) {
- const struct ril_vendor_hook_proc *proc = self->proc;
+ return G_LIKELY(self) ? RIL_VENDOR_GET_CLASS(self)->
+ event_to_string(self, event) : NULL;
+}
- while (!proc->request_to_string && proc->base) {
- proc = proc->base;
- }
- if (proc->request_to_string) {
- return proc->request_to_string(self, request);
- }
+void ril_vendor_set_network(RilVendor *self, struct ril_network *nw)
+{
+ if (G_LIKELY(self)) {
+ RIL_VENDOR_GET_CLASS(self)->set_network(self, nw);
}
- return NULL;
}
-const char *ril_vendor_hook_event_to_string(struct ril_vendor_hook *self,
- guint event)
+GRilIoRequest *ril_vendor_set_attach_apn_req(RilVendor *self, const char *apn,
+ const char *user, const char *password,
+ enum ril_auth auth, const char *proto)
{
- if (self) {
- const struct ril_vendor_hook_proc *proc = self->proc;
-
- while (!proc->event_to_string && proc->base) {
- proc = proc->base;
- }
- if (proc->event_to_string) {
- return proc->event_to_string(self, event);
- }
- }
- return NULL;
+ return G_LIKELY(self) ? RIL_VENDOR_GET_CLASS(self)->
+ set_attach_apn_req(self, apn, user, password, auth, proto) :
+ NULL;
}
-GRilIoRequest *ril_vendor_hook_data_call_req(struct ril_vendor_hook *self,
- int tech, const char *profile, const char *apn,
+GRilIoRequest *ril_vendor_data_call_req(RilVendor *self, int tech,
+ enum ril_data_profile profile, const char *apn,
const char *username, const char *password,
enum ril_auth auth, const char *proto)
{
- if (self) {
- const struct ril_vendor_hook_proc *proc = self->proc;
+ return G_LIKELY(self) ? RIL_VENDOR_GET_CLASS(self)->
+ data_call_req(self, tech, profile, apn, username, password,
+ auth, proto) : NULL;
+}
+
+gboolean ril_vendor_data_call_parse(RilVendor *self,
+ struct ril_data_call *call, int ver, GRilIoParser *rilp)
+{
+ return G_LIKELY(self) && RIL_VENDOR_GET_CLASS(self)->
+ data_call_parse(self, call, ver, rilp);
+}
- while (!proc->data_call_req && proc->base) {
- proc = proc->base;
+static void ril_vendor_default_set_network(RilVendor *self,
+ struct ril_network *network)
+{
+ if (self->network != network) {
+ if (self->network) {
+ g_object_remove_weak_pointer(G_OBJECT(self->network),
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_vendor.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016-2018 Jolla Ltd.
+ * Copyright (C) 2016-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -22,75 +22,51 @@
gboolean empty_pin_query;
gboolean legacy_imei_query;
gboolean enable_cbs;
+ gboolean enable_stk;
gboolean query_available_band_mode;
+ gboolean use_data_profiles;
+ guint mms_data_profile_id;
};
struct ril_vendor_driver {
const char *name;
const void *driver_data;
- const struct ril_vendor_driver *base;
void (*get_defaults)(struct ril_vendor_defaults *defaults);
- struct ril_vendor_hook *(*create_hook)(const void *driver_data,
+ struct ril_vendor *(*create_vendor)(const void *driver_data,
GRilIoChannel *io, const char *path,
- const struct ril_slot_config *cfg,
- struct ril_network *network);
+ const struct ril_slot_config *cfg);
};
-struct ril_vendor_hook_proc {
- const struct ril_vendor_hook_proc *base;
- const char *(*request_to_string)(struct ril_vendor_hook *hook,
- guint request);
- const char *(*event_to_string)(struct ril_vendor_hook *hook,
- guint event);
- GRilIoRequest *(*data_call_req)(struct ril_vendor_hook *hook,
- int tech, const char *profile, const char *apn,
- const char *username, const char *password,
- enum ril_auth auth, const char *proto);
- gboolean (*data_call_parse)(struct ril_vendor_hook *hook,
- struct ril_data_call *call, int version,
- GRilIoParser *rilp);
-};
-
-typedef void (*ril_vendor_hook_free_proc)(struct ril_vendor_hook *hook);
-struct ril_vendor_hook {
- const struct ril_vendor_hook_proc *proc;
- ril_vendor_hook_free_proc free;
- gint ref_count;
-};
-
-struct ril_vendor_hook *ril_vendor_create_hook
+const struct ril_vendor_driver *ril_vendor_find_driver(const char *name);
+struct ril_vendor *ril_vendor_create
(const struct ril_vendor_driver *vendor, GRilIoChannel *io,
- const char *path, const struct ril_slot_config *cfg,
- struct ril_network *network);
+ const char *path, const struct ril_slot_config *cfg);
void ril_vendor_get_defaults(const struct ril_vendor_driver *vendor,
struct ril_vendor_defaults *defaults);
-struct ril_vendor_hook *ril_vendor_hook_init(struct ril_vendor_hook *hook,
- const struct ril_vendor_hook_proc *proc,
- ril_vendor_hook_free_proc free);
-struct ril_vendor_hook *ril_vendor_hook_ref(struct ril_vendor_hook *hook);
-void ril_vendor_hook_unref(struct ril_vendor_hook *hook);
+struct ril_vendor *ril_vendor_ref(struct ril_vendor *vendor);
+void ril_vendor_unref(struct ril_vendor *vendor);
-const char *ril_vendor_hook_request_to_string(struct ril_vendor_hook *hook,
+const char *ril_vendor_request_to_string(struct ril_vendor *vendor,
guint request);
-const char *ril_vendor_hook_event_to_string(struct ril_vendor_hook *hook,
+const char *ril_vendor_event_to_string(struct ril_vendor *vendor,
guint event);
-GRilIoRequest *ril_vendor_hook_data_call_req(struct ril_vendor_hook *hook,
- int tech, const char *profile, const char *apn,
+void ril_vendor_set_network(struct ril_vendor *vendor, struct ril_network *nw);
+GRilIoRequest *ril_vendor_set_attach_apn_req(struct ril_vendor *vendor,
+ const char *apn, const char *username,
+ const char *password, enum ril_auth auth,
+ const char *proto);
+GRilIoRequest *ril_vendor_data_call_req(struct ril_vendor *vendor, int tech,
+ enum ril_data_profile profile, const char *apn,
const char *username, const char *password,
enum ril_auth auth, const char *proto);
-gboolean ril_vendor_hook_data_call_parse(struct ril_vendor_hook *hook,
+gboolean ril_vendor_data_call_parse(struct ril_vendor *vendor,
struct ril_data_call *call, int version,
GRilIoParser *rilp);
/* Put vendor driver descriptors to the "__vendor" section */
-#define RIL_VENDOR_DRIVER_DEFINE(name) \
- const struct ril_vendor_driver name \
+#define RIL_VENDOR_DRIVER_DEFINE(name) const struct ril_vendor_driver name \
__attribute__((used, section("__vendor"))) =
-#define RIL_VENDOR_DRIVER_FOREACH(var) \
- for ((var) = __start___vendor; (var) < __stop___vendor; (var)++)
-extern const struct ril_vendor_driver __start___vendor[];
-extern const struct ril_vendor_driver __stop___vendor[];
#endif /* RIL_VENDOR_H */
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_vendor_impl.h
^
|
@@ -0,0 +1,66 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2019 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef RIL_VENDOR_IMPL_H
+#define RIL_VENDOR_IMPL_H
+
+#include "ril_vendor.h"
+
+#include <glib-object.h>
+
+typedef struct ril_vendor {
+ GObject parent;
+ GRilIoChannel *io;
+ struct ril_network *network;
+} RilVendor;
+
+typedef struct ril_vendor_class {
+ GObjectClass parent;
+ void (*set_network)(RilVendor *vendor, struct ril_network *network);
+ const char *(*request_to_string)(RilVendor *vendor, guint request);
+ const char *(*event_to_string)(RilVendor *vendor, guint event);
+ GRilIoRequest *(*set_attach_apn_req)(RilVendor *vendor,
+ const char *apn, const char *username,
+ const char *password, enum ril_auth auth,
+ const char *proto);
+ GRilIoRequest *(*data_call_req)(RilVendor *vendor, int tech,
+ enum ril_data_profile profile, const char *apn,
+ const char *username, const char *password,
+ enum ril_auth auth, const char *proto);
+ gboolean (*data_call_parse)(RilVendor *vendor,
+ struct ril_data_call *call, int version,
+ GRilIoParser *rilp);
+} RilVendorClass;
+
+GType ril_vendor_get_type(void);
+#define RIL_VENDOR_TYPE (ril_vendor_get_type())
+#define RIL_VENDOR(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ RIL_VENDOR_TYPE, RilVendor)
+#define RIL_VENDOR_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), \
+ RIL_VENDOR_TYPE, RilVendorClass)
+#define RIL_VENDOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), \
+ RIL_VENDOR_TYPE, RilVendorClass)
+
+void ril_vendor_init_base(RilVendor *vendor, GRilIoChannel *io);
+
+#endif /* RIL_VENDOR_IMPL_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/drivers/ril/ril_vendor_mtk.c
^
|
@@ -13,10 +13,11 @@
* GNU General Public License for more details.
*/
-#include "ril_plugin.h"
#include "ril_vendor.h"
+#include "ril_vendor_impl.h"
#include "ril_network.h"
#include "ril_data.h"
+#include "ril_util.h"
#include "ril_log.h"
#include <grilio_channel.h>
@@ -24,25 +25,13 @@
#include <grilio_request.h>
#include <grilio_queue.h>
-#include <gutil_macros.h>
#include <gutil_misc.h>
#include <ofono/watch.h>
-#include <ofono/modem.h>
#include <ofono/gprs.h>
#define SET_INITIAL_ATTACH_APN_TIMEOUT (20*1000)
-enum ril_mtk_watch_events {
- WATCH_EVENT_IMSI_CHANGED,
- WATCH_EVENT_COUNT
-};
-
-enum ril_mtk_network_events {
- NETWORK_EVENT_PREF_MODE_CHANGED,
- NETWORK_EVENT_COUNT
-};
-
enum ril_mtk_events {
MTK_EVENT_REGISTRATION_SUSPENDED,
MTK_EVENT_SET_ATTACH_APN,
@@ -51,38 +40,49 @@
MTK_EVENT_COUNT
};
-struct ril_vendor_hook_mtk {
- struct ril_vendor_hook hook;
- const struct ril_mtk_msg *msg;
+typedef struct ril_vendor_mtk {
+ RilVendor vendor;
+ const struct ril_mtk_flavor *flavor;
GRilIoQueue *q;
- GRilIoChannel *io;
- struct ril_network *network;
struct ofono_watch *watch;
guint set_initial_attach_apn_id;
gboolean initial_attach_apn_ok;
- gulong network_event_id[NETWORK_EVENT_COUNT];
- gulong watch_event_id[WATCH_EVENT_COUNT];
gulong ril_event_id[MTK_EVENT_COUNT];
guint slot;
-};
+} RilVendorMtk;
+
+typedef struct ril_vendor_mtk_auto {
+ RilVendorMtk mtk;
+ gulong detect_id;
+} RilVendorMtkAuto;
+
+typedef RilVendorClass RilVendorMtkClass;
+typedef RilVendorMtkClass RilVendorMtkAutoClass;
+
+#define RIL_VENDOR_TYPE_MTK (ril_vendor_mtk_get_type())
+#define RIL_VENDOR_TYPE_MTK_AUTO (ril_vendor_mtk_auto_get_type())
+
+G_DEFINE_TYPE(RilVendorMtk, ril_vendor_mtk, RIL_VENDOR_TYPE)
+G_DEFINE_TYPE(RilVendorMtkAuto, ril_vendor_mtk_auto, RIL_VENDOR_TYPE_MTK)
+
+#define RIL_VENDOR_MTK(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ RIL_VENDOR_TYPE_MTK, RilVendorMtk)
+#define RIL_VENDOR_MTK_AUTO(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ RIL_VENDOR_TYPE_MTK_AUTO, RilVendorMtkAuto)
/* driver_data point this this: */
-struct ril_vendor_mtk_driver_data {
+struct ril_mtk_flavor {
const char *name;
const struct ril_mtk_msg *msg;
- const struct ril_vendor_hook_proc *proc;
-};
-
-/* Hook with auto-detection */
-struct ril_vendor_hook_mtk_auto {
- struct ril_vendor_hook_mtk mtk;
- const struct ril_vendor_mtk_driver_data *type;
- gulong detect_id;
+ void (*build_attach_apn_req_fn)(GRilIoRequest *req, const char *apn,
+ const char *username, const char *password,
+ enum ril_auth auth, const char *proto);
+ gboolean (*data_call_parse_fn)(struct ril_data_call *call,
+ int version, GRilIoParser *rilp);
};
/* MTK specific RIL messages (actual codes differ from model to model!) */
struct ril_mtk_msg {
- gboolean attach_apn_has_roaming_protocol;
guint request_resume_registration;
guint request_set_call_indication;
@@ -97,7 +97,6 @@
};
static const struct ril_mtk_msg msg_mtk1 = {
- .attach_apn_has_roaming_protocol = TRUE,
.request_resume_registration = 2050,
.request_set_call_indication = 2065,
.unsol_ps_network_state_changed = 3012,
@@ -107,7 +106,6 @@
};
static const struct ril_mtk_msg msg_mtk2 = {
- .attach_apn_has_roaming_protocol = FALSE,
.request_resume_registration = 2065,
.request_set_call_indication = 2086,
.unsol_ps_network_state_changed = 3015,
@@ -116,23 +114,11 @@
.unsol_set_attach_apn = 3073
};
-static inline struct ril_vendor_hook_mtk *ril_vendor_hook_mtk_cast
- (struct ril_vendor_hook *hook)
-{
- return G_CAST(hook, struct ril_vendor_hook_mtk, hook);
-}
-
-static inline struct ril_vendor_hook_mtk_auto *ril_vendor_hook_mtk_auto_cast
- (struct ril_vendor_hook *hook)
-{
- return G_CAST(hook, struct ril_vendor_hook_mtk_auto, mtk.hook);
-}
-
-static const char *ril_vendor_mtk_request_to_string
- (struct ril_vendor_hook *hook, guint request)
+static const char *ril_vendor_mtk_request_to_string(RilVendor *vendor,
+ guint request)
{
- struct ril_vendor_hook_mtk *self = ril_vendor_hook_mtk_cast(hook);
- const struct ril_mtk_msg *msg = self->msg;
+ RilVendorMtk *self = RIL_VENDOR_MTK(vendor);
+ const struct ril_mtk_msg *msg = self->flavor->msg;
if (request == msg->request_resume_registration) {
return "MTK_RESUME_REGISTRATION";
@@ -159,19 +145,19 @@
}
}
-static const char *ril_vendor_mtk_event_to_string(struct ril_vendor_hook *hook,
+static const char *ril_vendor_mtk_event_to_string(RilVendor *vendor,
guint event)
{
- struct ril_vendor_hook_mtk *self = ril_vendor_hook_mtk_cast(hook);
+ RilVendorMtk *self = RIL_VENDOR_MTK(vendor);
- return ril_vendor_mtk_unsol_msg_name(self->msg, event);
+ return ril_vendor_mtk_unsol_msg_name(self->flavor->msg, event);
}
static void ril_vendor_mtk_registration_suspended(GRilIoChannel *io, guint id,
const void *data, guint len, void *user_data)
{
- struct ril_vendor_hook_mtk *self = user_data;
- const struct ril_mtk_msg *msg = self->msg;
+ RilVendorMtk *self = RIL_VENDOR_MTK(user_data);
+ const struct ril_mtk_msg *msg = self->flavor->msg;
GRilIoParser rilp;
int session_id;
@@ -189,75 +175,41 @@
}
}
-static GRilIoRequest *ril_vendor_mtk_build_set_attach_apn_req
- (const struct ofono_gprs_primary_context *pc,
- gboolean roamingProtocol)
+static void ril_vendor_mtk_build_attach_apn_req_1(GRilIoRequest *req,
+ const char *apn, const char *username, const char *password,
+ enum ril_auth auth, const char *proto)
{
- GRilIoRequest *req = grilio_request_new();
- const char *proto = ril_data_ofono_protocol_to_ril(pc->proto);
-
- DBG("%s %d", pc->apn, roamingProtocol);
- grilio_request_append_utf8(req, pc->apn); /* apn */
- grilio_request_append_utf8(req, proto); /* protocol */
- if (roamingProtocol) {
- grilio_request_append_utf8(req, proto); /* roamingProtocol */
- }
-
- if (pc->username[0]) {
- int auth;
-
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/src/gprs.c
^
|
@@ -3,6 +3,7 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -454,12 +455,9 @@
ofono_dbus_dict_append(&array, "Interface",
DBUS_TYPE_STRING, &settings->interface);
- /* If we have a Proxy, no other settings are relevant */
- if (settings->ipv4->proxy) {
+ if (settings->ipv4->proxy)
ofono_dbus_dict_append(&array, "Proxy", DBUS_TYPE_STRING,
&settings->ipv4->proxy);
- goto done;
- }
if (settings->ipv4->static_ip == TRUE)
method = "static";
@@ -3938,3 +3936,21 @@
return NULL;
}
+
+enum ofono_gprs_context_type __ofono_gprs_context_get_assigned_type(
+ struct ofono_gprs_context *gc)
+{
+ if (gc) {
+ struct ofono_gprs *gprs = gc->gprs;
+ GSList *l;
+
+ for (l = gprs->contexts; l; l = l->next) {
+ struct pri_context *pri = l->data;
+
+ if (pri->context_driver == gc)
+ return pri->type;
+ }
+ }
+
+ return OFONO_GPRS_CONTEXT_TYPE_ANY;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/src/ofono.h
^
|
@@ -3,6 +3,7 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ * Copyright (C) 2015-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -275,6 +276,10 @@
gboolean __ofono_gprs_get_roaming_allowed(struct ofono_gprs *gprs);
#include <ofono/gprs-context.h>
+
+enum ofono_gprs_context_type __ofono_gprs_context_get_assigned_type(
+ struct ofono_gprs_context *gc);
+
#include <ofono/radio-settings.h>
#include <ofono/audio-settings.h>
#include <ofono/ctm.h>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/src/watch.c
^
|
@@ -505,18 +505,36 @@
static void ofono_watch_cleanup_modem(struct ofono_watch_object *self,
struct ofono_modem *modem)
{
- /* Caller checks that modem isn't NULL */
- __ofono_modem_remove_online_watch(modem, self->online_watch_id);
- ASSERT(!self->online_watch_id);
+ /*
+ * Caller checks that modem isn't NULL.
+ *
+ * Watch ids are getting zeroed when __ofono_watchlist_free() is
+ * called for the respective watch list. Therefore ids can be zero
+ * even if we never explicitely removed them.
+ *
+ * Calling __ofono_modem_remove_online_watch() and other such
+ * functions after respective watch lists have been deallocated
+ * by modem_unregister() will crash the core.
+ */
+ if (self->online_watch_id) {
+ __ofono_modem_remove_online_watch(modem, self->online_watch_id);
+ ASSERT(!self->online_watch_id);
+ }
- __ofono_modem_remove_atom_watch(modem, self->sim_watch_id);
- ASSERT(!self->sim_watch_id);
+ if (self->sim_watch_id) {
+ __ofono_modem_remove_atom_watch(modem, self->sim_watch_id);
+ ASSERT(!self->sim_watch_id);
+ }
- __ofono_modem_remove_atom_watch(modem, self->netreg_watch_id);
- ASSERT(!self->netreg_watch_id);
+ if (self->netreg_watch_id) {
+ __ofono_modem_remove_atom_watch(modem, self->netreg_watch_id);
+ ASSERT(!self->netreg_watch_id);
+ }
- __ofono_modem_remove_atom_watch(modem, self->gprs_watch_id);
- ASSERT(!self->gprs_watch_id);
+ if (self->gprs_watch_id) {
+ __ofono_modem_remove_atom_watch(modem, self->gprs_watch_id);
+ ASSERT(!self->gprs_watch_id);
+ }
ofono_watch_set_sim(self, NULL);
ofono_watch_set_netreg(self, NULL);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/unit/coverage
^
|
@@ -24,6 +24,7 @@
test-ril_util \
test-ril_config \
test-ril-transport \
+ test-ril_vendor \
test-sms-filter \
test-voicecall-filter \
test-sailfish_access \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/unit/test-ril_util.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony
*
- * Copyright (C) 2017-2018 Jolla Ltd.
+ * Copyright (C) 2017-2019 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -18,7 +18,11 @@
#include "ofono.h"
#include "common.h"
-void test_parse_tech(void)
+#define RIL_PROTO_IP_STR "IP"
+#define RIL_PROTO_IPV6_STR "IPV6"
+#define RIL_PROTO_IPV4V6_STR "IPV4V6"
+
+static void test_parse_tech(void)
{
int tech = 0;
@@ -51,7 +55,7 @@
g_assert(tech == RADIO_TECH_LTE);
}
-void test_parse_mcc_mnc(void)
+static void test_parse_mcc_mnc(void)
{
struct ofono_network_operator op;
@@ -81,7 +85,45 @@
g_assert(!op.tech);
}
-void test_strings(void)
+static void test_protocol_from_ofono(void)
+{
+ g_assert(!g_strcmp0(ril_protocol_from_ofono(OFONO_GPRS_PROTO_IP),
+ RIL_PROTO_IP_STR));
+ g_assert(!g_strcmp0(ril_protocol_from_ofono(OFONO_GPRS_PROTO_IPV6),
+ RIL_PROTO_IPV6_STR));
+ g_assert(!g_strcmp0(ril_protocol_from_ofono(OFONO_GPRS_PROTO_IPV4V6),
+ RIL_PROTO_IPV4V6_STR));
+ g_assert(!ril_protocol_from_ofono((enum ofono_gprs_proto)-1));
+}
+
+static void test_protocol_to_ofono(void)
+{
+ g_assert(ril_protocol_to_ofono(NULL) < 0);
+ g_assert(ril_protocol_to_ofono("") < 0);
+ g_assert(ril_protocol_to_ofono("ip") < 0);
+ g_assert(ril_protocol_to_ofono(RIL_PROTO_IP_STR) ==
+ OFONO_GPRS_PROTO_IP);
+ g_assert(ril_protocol_to_ofono(RIL_PROTO_IPV6_STR) ==
+ OFONO_GPRS_PROTO_IPV6);
+ g_assert(ril_protocol_to_ofono(RIL_PROTO_IPV4V6_STR) ==
+ OFONO_GPRS_PROTO_IPV4V6);
+}
+
+static void test_auth_method(void)
+{
+ g_assert(ril_auth_method_from_ofono(OFONO_GPRS_AUTH_METHOD_NONE) ==
+ RIL_AUTH_NONE);
+ g_assert(ril_auth_method_from_ofono(OFONO_GPRS_AUTH_METHOD_CHAP) ==
+ RIL_AUTH_CHAP);
+ g_assert(ril_auth_method_from_ofono(OFONO_GPRS_AUTH_METHOD_PAP) ==
+ RIL_AUTH_PAP);
+ g_assert(ril_auth_method_from_ofono(OFONO_GPRS_AUTH_METHOD_ANY) ==
+ RIL_AUTH_BOTH);
+ g_assert(ril_auth_method_from_ofono((enum ofono_gprs_auth_method)-1) ==
+ RIL_AUTH_BOTH);
+}
+
+static void test_strings(void)
{
g_assert(!g_strcmp0(ril_error_to_string(RIL_E_SUCCESS), "OK"));
g_assert(!g_strcmp0(ril_error_to_string(2147483647), "2147483647"));
@@ -107,6 +149,9 @@
g_test_add_func(TEST_("parse_tech"), test_parse_tech);
g_test_add_func(TEST_("parse_mcc_mnc"), test_parse_mcc_mnc);
+ g_test_add_func(TEST_("protocol_from_ofono"), test_protocol_from_ofono);
+ g_test_add_func(TEST_("protocol_to_ofono"), test_protocol_to_ofono);
+ g_test_add_func(TEST_("auth_method"), test_auth_method);
g_test_add_func(TEST_("strings"), test_strings);
return g_test_run();
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git52.tar.bz2/ofono/unit/test-ril_vendor.c
^
|
@@ -0,0 +1,394 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2017-2019 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "drivers/ril/ril_vendor.h"
+#include "drivers/ril/ril_vendor_impl.h"
+#include "drivers/ril/ril_network.h"
+#include "drivers/ril/ril_data.h"
+#include "drivers/ril/ril_log.h"
+
+#include "ofono.h"
+
+#include <grilio_request.h>
+#include <grilio_parser.h>
+
+GLOG_MODULE_DEFINE("ril");
+
+/* Stubs */
+typedef struct ril_network TestNetwork;
+typedef GObjectClass TestNetworkClass;
+static void test_network_init(TestNetwork *self) {}
+static void test_network_class_init(TestNetworkClass *klass) {}
+G_DEFINE_TYPE(TestNetwork, test_network, G_TYPE_OBJECT)
+
+void ril_network_query_registration_state(struct ril_network *network)
+{
+}
+
+const struct ofono_gprs_primary_context *ofono_gprs_context_settings_by_type
+ (struct ofono_gprs *gprs, enum ofono_gprs_context_type type)
+{
+ return NULL;
+}
+
+/* Test vendor objects and drivers */
+
+typedef RilVendor TestVendor;
+typedef RilVendorClass TestVendorClass;
+static void test_vendor_init(TestVendor *self) {}
+static void test_vendor_class_init(TestVendorClass* klass) {}
+static const struct ril_vendor_defaults test_defaults = { .enable_cbs = TRUE };
+G_DEFINE_TYPE(TestVendor, test_vendor, RIL_VENDOR_TYPE)
+
+static void test_driver_get_defaults(struct ril_vendor_defaults *defaults)
+{
+ memcpy(defaults, &test_defaults, sizeof(*defaults));
+}
+
+static RilVendor *test_driver_create_vendor(const void *driver_data,
+ GRilIoChannel *io, const char *path,
+ const struct ril_slot_config *config)
+{
+ TestVendor *self = g_object_new(test_vendor_get_type(), NULL);
+
+ ril_vendor_init_base(self, io);
+ return self;
+}
+
+RIL_VENDOR_DRIVER_DEFINE(test_driver) {
+ .name = "test",
+ .get_defaults = test_driver_get_defaults,
+ .create_vendor = test_driver_create_vendor
+};
+
+RIL_VENDOR_DRIVER_DEFINE(dummy_driver) { .name = "dummy" };
+
+/* Tests */
+
+static void test_null(void)
+{
+ ril_vendor_unref(NULL);
+ ril_vendor_set_network(NULL, NULL);
+ ril_vendor_data_call_parse(NULL, NULL, 0, NULL);
+ ril_vendor_get_defaults(NULL, NULL);
+ g_assert(!ril_vendor_find_driver(NULL));
+ g_assert(!ril_vendor_create(NULL, NULL, NULL, NULL));
+ g_assert(!ril_vendor_ref(NULL));
+ g_assert(!ril_vendor_request_to_string(NULL, 0));
+ g_assert(!ril_vendor_event_to_string(NULL, 0));
+ g_assert(!ril_vendor_set_attach_apn_req(NULL, NULL, NULL, NULL,
+ RIL_AUTH_NONE, NULL));
+ g_assert(!ril_vendor_data_call_req(NULL, 0, RIL_DATA_PROFILE_DEFAULT,
+ NULL, NULL, NULL, RIL_AUTH_NONE, NULL));
+}
+
+static void test_drivers(void)
+{
+ const struct ril_vendor_driver *driver;
+ struct ril_vendor_defaults defaults;
+
+ /* This one exists and has all the callbacks */
+ driver = ril_vendor_find_driver(test_driver.name);
+ g_assert(driver);
+ memset(&defaults, 0, sizeof(defaults));
+ ril_vendor_get_defaults(driver, &defaults);
+ g_assert(!memcmp(&defaults, &test_defaults, sizeof(defaults)));
+
+ /* This one has no callbacks at all */
+ driver = ril_vendor_find_driver(dummy_driver.name);
+ g_assert(driver);
+ memset(&defaults, 0, sizeof(defaults));
+ g_assert(!ril_vendor_create(driver, NULL, NULL, NULL));
+ ril_vendor_get_defaults(driver, &defaults);
+
+ /* And this one doesn't exist */
+ g_assert(!ril_vendor_find_driver("no such driver"));
+}
+
+static void test_base(void)
+{
+ TestNetwork *network = g_object_new(test_network_get_type(), NULL);
+ const struct ril_vendor_driver *driver;
+ struct ril_vendor *base;
+
+ /* Create test vendor which does nothing but extends the base */
+ driver = ril_vendor_find_driver(test_driver.name);
+ g_assert(driver);
+ base = ril_vendor_create(driver, NULL, NULL, NULL);
+ ril_vendor_set_network(base, NULL);
+ ril_vendor_set_network(base, network);
+ ril_vendor_set_network(base, NULL);
+ ril_vendor_set_network(base, network);
+
+ g_assert(!ril_vendor_request_to_string(base, 0));
+ g_assert(!ril_vendor_event_to_string(base, 0));
+ g_assert(!ril_vendor_set_attach_apn_req(base, NULL, NULL, NULL,
+ RIL_AUTH_NONE, NULL));
+ g_assert(!ril_vendor_data_call_req(base, 0, RIL_DATA_PROFILE_DEFAULT,
+ NULL, NULL, NULL, RIL_AUTH_NONE, NULL));
+ g_assert(!ril_vendor_data_call_parse(base, NULL, 0, NULL));
+
+ g_assert(ril_vendor_ref(base) == base);
+ ril_vendor_unref(base);
+ ril_vendor_unref(base);
+ g_object_unref(network);
+}
+
+static void test_mtk(void)
+{
+ TestNetwork *network = g_object_new(test_network_get_type(), NULL);
+ const struct ril_vendor_driver *driver = ril_vendor_find_driver("mtk");
+ struct ril_vendor_defaults defaults;
+ struct ril_slot_config config;
+ struct ril_vendor *mtk;
+
+ g_assert(driver);
+ memset(&defaults, 0, sizeof(defaults));
+ memset(&config, 0, sizeof(config));
+ ril_vendor_get_defaults(driver, &defaults);
+ mtk = ril_vendor_create(driver, NULL, NULL, &config);
+ g_assert(mtk);
+
+ /* Freeing the network clears vendor's weak pointer */
+ ril_vendor_set_network(mtk, network);
+ g_object_unref(network);
+ g_assert(!ril_vendor_request_to_string(mtk, 0));
+ g_assert(!ril_vendor_event_to_string(mtk, 0));
+ ril_vendor_unref(mtk);
+}
+
+static const char *MTK_RESUME_REGISTRATION="MTK_RESUME_REGISTRATION";
+static const char *MTK_SET_CALL_INDICATION="MTK_SET_CALL_INDICATION";
+static const char *MTK_PS_NETWORK_STATE_CHANGED="MTK_PS_NETWORK_STATE_CHANGED";
+static const char *MTK_REGISTRATION_SUSPENDED="MTK_REGISTRATION_SUSPENDED";
+static const char *MTK_SET_ATTACH_APN="MTK_SET_ATTACH_APN";
+static const char *MTK_INCOMING_CALL_INDICATION="MTK_INCOMING_CALL_INDICATION";
+
+static void test_mtk1(void)
+{
+ const struct ril_vendor_driver *driver = ril_vendor_find_driver("mtk1");
+ struct ril_slot_config config;
+ struct ril_vendor *mtk1;
+ GRilIoRequest* req;
+
+ g_assert(driver);
+ memset(&config, 0, sizeof(config));
+ mtk1 = ril_vendor_create(driver, NULL, NULL, &config);
+ g_assert(mtk1);
+
+ g_assert(!g_strcmp0(ril_vendor_request_to_string(mtk1, 2050),
+ MTK_RESUME_REGISTRATION));
+ g_assert(!g_strcmp0(ril_vendor_request_to_string(mtk1, 2065),
+ MTK_SET_CALL_INDICATION));
+ g_assert(!g_strcmp0(ril_vendor_event_to_string(mtk1, 3012),
+ MTK_PS_NETWORK_STATE_CHANGED));
+ g_assert(!g_strcmp0(ril_vendor_event_to_string(mtk1, 3021),
+ MTK_REGISTRATION_SUSPENDED));
+ g_assert(!g_strcmp0(ril_vendor_event_to_string(mtk1, 3065),
|