[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://git.merproject.org/mer-core/ofono.git</param>
<param name="branch">master</param>
- <param name="revision">8cea5b9</param>
+ <param name="revision">41d5cfc</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git3.tar.bz2/ofono/drivers/ril/ril_plugin.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2016 Jolla Ltd.
+ * Copyright (C) 2015-2017 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
@@ -85,6 +85,12 @@
#define RIL_STORE_DEFAULT_DATA_SIM "DefaultDataSim"
#define RIL_STORE_SLOTS_SEP ","
+/* The file where error statistics is stored */
+#define RIL_ERROR_STORAGE "rilerror"
+
+/* Modem error ids, must be static strings (only one is defined for now) */
+static const char RIL_ERROR_ID_RILD_RESTART[] = "rild-restart";
+
enum ril_plugin_io_events {
IO_EVENT_CONNECTED,
IO_EVENT_ERROR,
@@ -208,6 +214,12 @@
.notify = ril_plugin_debug_notify
};
+static inline const char *ril_slot_debug_prefix(const struct ril_slot *slot)
+{
+ /* slot->path always starts with a slash, skip it */
+ return slot->path + 1;
+}
+
static struct ril_plugin_priv *ril_plugin_cast(struct ril_plugin *pub)
{
return G_CAST(pub, struct ril_plugin_priv, pub);
@@ -611,7 +623,7 @@
struct ril_slot *slot = data;
struct ril_plugin_priv *plugin = slot->plugin;
- DBG("%s sim state %d", slot->path + 1, new_state);
+ DBG("%s sim state %d", ril_slot_debug_prefix(slot), new_state);
slot->sim_state = new_state;
if (new_state == OFONO_SIM_STATE_READY) {
struct ril_slot *voice_slot = plugin->voice_slot;
@@ -667,10 +679,10 @@
struct ril_slot *slot = data;
if (cond == OFONO_ATOM_WATCH_CONDITION_REGISTERED) {
- DBG("%s sim registered", slot->path + 1);
+ DBG("%s sim registered", ril_slot_debug_prefix(slot));
ril_plugin_register_sim(slot, __ofono_atom_get_data(atom));
} else if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
- DBG("%s sim unregistered", slot->path + 1);
+ DBG("%s sim unregistered", ril_slot_debug_prefix(slot));
slot->sim = NULL;
}
@@ -678,8 +690,35 @@
ril_plugin_update_modem_paths_full(slot->plugin);
}
-static void ril_plugin_handle_error(struct ril_slot *slot)
+static void ril_plugin_count_error(struct ril_slot *slot, const char *key,
+ const char *message)
+{
+ GHashTable *errors = slot->pub.errors;
+ GKeyFile *storage = storage_open(NULL, RIL_ERROR_STORAGE);
+
+ /* Update life-time statistics */
+ if (storage) {
+ /* slot->path always starts with a slash, skip it */
+ const char *group = slot->path + 1;
+ g_key_file_set_integer(storage, group, key,
+ g_key_file_get_integer(storage, group, key, NULL) + 1);
+ storage_close(NULL, RIL_ERROR_STORAGE, storage, TRUE);
+ }
+
+ /* Update run-time error counts. The key is the error id which
+ * is always a static string */
+ g_hash_table_insert(errors, (void*)key, GINT_TO_POINTER(
+ GPOINTER_TO_INT(g_hash_table_lookup(errors, key)) + 1));
+
+ /* Issue the D-Bus signal */
+ ril_plugin_dbus_signal_modem_error(slot->plugin->dbus,
+ slot->index, key, message);
+}
+
+static void ril_plugin_handle_error(struct ril_slot *slot, const char *msg)
{
+ ofono_error("%s %s", ril_slot_debug_prefix(slot), msg);
+ ril_plugin_count_error(slot, RIL_ERROR_ID_RILD_RESTART, msg);
ril_plugin_shutdown_slot(slot, TRUE);
ril_plugin_update_modem_paths_full(slot->plugin);
ril_plugin_retry_init_io(slot);
@@ -688,12 +727,12 @@
static void ril_plugin_slot_error(GRilIoChannel *io, const GError *error,
void *data)
{
- ril_plugin_handle_error((struct ril_slot *)data);
+ ril_plugin_handle_error((struct ril_slot *)data, GERRMSG(error));
}
static void ril_plugin_slot_disconnected(GRilIoChannel *io, void *data)
{
- ril_plugin_handle_error((struct ril_slot *)data);
+ ril_plugin_handle_error((struct ril_slot *)data, "disconnected");
}
static void ril_plugin_modem_online(struct ril_modem *modem, gboolean online,
@@ -701,7 +740,7 @@
{
struct ril_slot *slot = data;
- DBG("%s %d", slot->path + 1, online);
+ DBG("%s %d", ril_slot_debug_prefix(slot), online);
GASSERT(slot->modem);
GASSERT(slot->modem == modem);
@@ -813,14 +852,15 @@
static const char *ril_plugin_log_prefix(struct ril_slot *slot)
{
- return ril_plugin_multisim(slot->plugin) ? (slot->path + 1) : "";
+ return ril_plugin_multisim(slot->plugin) ?
+ ril_slot_debug_prefix(slot) : "";
}
static void ril_plugin_create_modem(struct ril_slot *slot)
{
struct ril_modem *modem;
- DBG("%s", slot->path);
+ DBG("%s", ril_slot_debug_prefix(slot));
GASSERT(slot->io && slot->io->connected);
GASSERT(!slot->modem);
@@ -1076,6 +1116,7 @@
RILMODEM_DEFAULT_DATA_CALL_RETRY_LIMIT;
slot->data_opt.data_call_retry_delay_ms =
RILMODEM_DEFAULT_DATA_CALL_RETRY_DELAY;
+ slot->pub.errors = g_hash_table_new(g_str_hash, g_str_equal);
return slot;
}
@@ -1248,6 +1289,7 @@
ril_plugin_shutdown_slot(slot, TRUE);
ril_sim_info_unref(slot->sim_info);
ril_sim_settings_unref(slot->sim_settings);
+ g_hash_table_destroy(slot->pub.errors);
g_free(slot->path);
g_free(slot->imei);
g_free(slot->name);
@@ -1403,7 +1445,7 @@
static void ril_plugin_update_enabled_slot(struct ril_slot *slot)
{
if (slot->pub.enabled) {
- DBG("%s enabled", slot->path + 1);
+ DBG("%s enabled", ril_slot_debug_prefix(slot));
ril_plugin_check_modem(slot);
}
}
@@ -1411,7 +1453,7 @@
static void ril_plugin_update_disabled_slot(struct ril_slot *slot)
{
if (!slot->pub.enabled) {
- DBG("%s disabled", slot->path + 1);
+ DBG("%s disabled", ril_slot_debug_prefix(slot));
ril_plugin_shutdown_slot(slot, FALSE);
ril_plugin_update_modem_paths_full(slot->plugin);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git3.tar.bz2/ofono/drivers/ril/ril_plugin.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2016 Jolla Ltd.
+ * Copyright (C) 2015-2017 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
@@ -52,6 +52,7 @@
gboolean enabled;
gboolean sim_present;
const struct ril_slot_config *config;
+ GHashTable *errors;
};
struct ril_plugin {
@@ -123,6 +124,8 @@
void ril_plugin_dbus_signal(struct ril_plugin_dbus *dbus, int mask);
void ril_plugin_dbus_signal_sim(struct ril_plugin_dbus *dbus, int index,
gboolean present);
+void ril_plugin_dbus_signal_modem_error(struct ril_plugin_dbus *dbus,
+ int index, const char *id, const char *message);
struct ril_modem *ril_modem_create(GRilIoChannel *io, const char *log_prefix,
const struct ril_slot_info *slot, struct ril_radio *radio,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git3.tar.bz2/ofono/drivers/ril/ril_plugin_dbus.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2016 Jolla Ltd.
+ * Copyright (C) 2015-2017 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
@@ -46,7 +46,7 @@
#define RIL_DBUS_PATH "/"
#define RIL_DBUS_INTERFACE "org.nemomobile.ofono.ModemManager"
-#define RIL_DBUS_INTERFACE_VERSION (5)
+#define RIL_DBUS_INTERFACE_VERSION (6)
#define RIL_DBUS_SIGNAL_ENABLED_MODEMS_CHANGED "EnabledModemsChanged"
#define RIL_DBUS_SIGNAL_PRESENT_SIMS_CHANGED "PresentSimsChanged"
@@ -57,8 +57,11 @@
#define RIL_DBUS_SIGNAL_MMS_SIM_CHANGED "MmsSimChanged"
#define RIL_DBUS_SIGNAL_MMS_MODEM_CHANGED "MmsModemChanged"
#define RIL_DBUS_SIGNAL_READY_CHANGED "ReadyChanged"
+#define RIL_DBUS_SIGNAL_MODEM_ERROR "ModemError"
#define RIL_DBUS_IMSI_AUTO "auto"
+#define RIL_DBUS_ERROR_SIGNATURE "si"
+
static gboolean ril_plugin_dbus_enabled(const struct ril_slot_info *slot)
{
return slot->enabled;
@@ -167,6 +170,48 @@
ril_plugin_dbus_append_path_array(&iter, dbus, fn);
}
+static void ril_plugin_dbus_append_modem_error(DBusMessageIter *it,
+ const char *id, dbus_uint32_t count)
+{
+ DBusMessageIter sub;
+ dbus_message_iter_open_container(it, DBUS_TYPE_STRUCT, NULL, &sub);
+ dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &id);
+ dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &count);
+ dbus_message_iter_close_container(it, &sub);
+}
+
+static void ril_plugin_dbus_append_modem_errors(DBusMessageIter *it,
+ struct ril_plugin_dbus *dbus)
+{
+ DBusMessageIter slots;
+ const struct ril_slot_info *const *ptr = dbus->plugin->slots;
+
+ dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY,
+ "a(" RIL_DBUS_ERROR_SIGNATURE ")", &slots);
+
+ while (*ptr) {
+ const struct ril_slot_info *slot = *ptr++;
+ DBusMessageIter errors;
+
+ dbus_message_iter_open_container(&slots, DBUS_TYPE_ARRAY,
+ "(" RIL_DBUS_ERROR_SIGNATURE ")", &errors);
+
+ if (g_hash_table_size(slot->errors)) {
+ gpointer key, value;
+ GHashTableIter iter;
+ g_hash_table_iter_init(&iter, slot->errors);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ ril_plugin_dbus_append_modem_error(&errors,
+ key, GPOINTER_TO_INT(value));
+ }
+ }
+
+ dbus_message_iter_close_container(&slots, &errors);
+ }
+
+ dbus_message_iter_close_container(it, &slots);
+}
+
static void ril_plugin_dbus_signal_path_array(struct ril_plugin_dbus *dbus,
const char *name, ril_plugin_dbus_slot_select_fn fn)
{
@@ -257,6 +302,19 @@
DBUS_TYPE_INVALID);
}
+void ril_plugin_dbus_signal_modem_error(struct ril_plugin_dbus *dbus,
+ int index, const char *id, const char *message)
+{
+ const char *path = dbus->plugin->slots[index]->path;
+ if (!message) message = "";
+ g_dbus_emit_signal(dbus->conn, RIL_DBUS_PATH, RIL_DBUS_INTERFACE,
+ RIL_DBUS_SIGNAL_MODEM_ERROR,
+ DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_STRING, &id,
+ DBUS_TYPE_STRING, &message,
+ DBUS_TYPE_INVALID);
+}
+
static DBusMessage *ril_plugin_dbus_reply_with_path_array(DBusMessage *msg,
struct ril_plugin_dbus *dbus, ril_plugin_dbus_slot_select_fn fn)
{
@@ -375,6 +433,13 @@
ril_plugin_dbus_append_boolean(it, dbus->plugin->ready);
}
+static void ril_plugin_dbus_append_all6(DBusMessageIter *it,
+ struct ril_plugin_dbus *dbus)
+{
+ ril_plugin_dbus_append_all5(it, dbus);
+ ril_plugin_dbus_append_modem_errors(it, dbus);
+}
+
static DBusMessage *ril_plugin_dbus_get_all(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -410,6 +475,13 @@
ril_plugin_dbus_append_all5);
}
+static DBusMessage *ril_plugin_dbus_get_all6(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ return ril_plugin_dbus_imei_reply(msg, (struct ril_plugin_dbus *)data,
+ ril_plugin_dbus_append_all6);
+}
+
static DBusMessage *ril_plugin_dbus_get_interface_version(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -554,6 +626,13 @@
return reply;
}
+static DBusMessage *ril_plugin_dbus_get_modem_errors(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ return ril_plugin_dbus_reply(msg, (struct ril_plugin_dbus *)data,
+ ril_plugin_dbus_append_modem_errors);
+}
+
static DBusMessage *ril_plugin_dbus_set_enabled_modems(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -697,28 +776,44 @@
* talking to.
*/
+#define RIL_DBUS_VERSION_ARG {"version", "i"}
+#define RIL_DBUS_AVAILABLE_MODEMS_ARG {"availableModems", "ao"}
+#define RIL_DBUS_ENABLED_MODEMS_ARG {"enabledModems", "ao" }
+#define RIL_DBUS_DEFAULT_DATA_SIM_ARG {"defaultDataSim", "s" }
+#define RIL_DBUS_DEFAULT_VOICE_SIM_ARG {"defaultVoiceSim", "s" }
+#define RIL_DBUS_DEFAULT_DATA_MODEM_ARG {"defaultDataModem", "s" }
+#define RIL_DBUS_DEFAULT_VOICE_MODEM_ARG {"defaultVoiceModem" , "s"}
+#define RIL_DBUS_PRESENT_SIMS_ARG {"presentSims" , "ab"}
+#define RIL_DBUS_IMEI_ARG {"imei" , "as"}
+#define RIL_DBUS_MMS_SIM_ARG {"mmsSim", "s"}
+#define RIL_DBUS_MMS_MODEM_ARG {"mmsModem" , "s"}
+#define RIL_DBUS_READY_ARG {"ready" , "b"}
+#define RIL_DBUS_MODEM_ERRORS_ARG {"errors" , \
+ "aa(" RIL_DBUS_ERROR_SIGNATURE ")"}
#define RIL_DBUS_GET_ALL_ARGS \
- {"version", "i" }, \
- {"availableModems", "ao" }, \
- {"enabledModems", "ao" }, \
- {"defaultDataSim", "s" }, \
- {"defaultVoiceSim", "s" }, \
- {"defaultDataModem", "s" }, \
- {"defaultVoiceModem" , "s"}
+ RIL_DBUS_VERSION_ARG, \
+ RIL_DBUS_AVAILABLE_MODEMS_ARG, \
+ RIL_DBUS_ENABLED_MODEMS_ARG, \
+ RIL_DBUS_DEFAULT_DATA_SIM_ARG, \
+ RIL_DBUS_DEFAULT_VOICE_SIM_ARG, \
+ RIL_DBUS_DEFAULT_DATA_MODEM_ARG, \
+ RIL_DBUS_DEFAULT_VOICE_MODEM_ARG
#define RIL_DBUS_GET_ALL2_ARGS \
RIL_DBUS_GET_ALL_ARGS, \
- {"presentSims" , "ab"}
+ RIL_DBUS_PRESENT_SIMS_ARG
#define RIL_DBUS_GET_ALL3_ARGS \
RIL_DBUS_GET_ALL2_ARGS, \
- {"imei" , "as"}
+ RIL_DBUS_IMEI_ARG
#define RIL_DBUS_GET_ALL4_ARGS \
RIL_DBUS_GET_ALL3_ARGS, \
- {"mmsSim", "s" }, \
- {"mmsModem" , "s"}
+ RIL_DBUS_MMS_SIM_ARG, \
+ RIL_DBUS_MMS_MODEM_ARG
#define RIL_DBUS_GET_ALL5_ARGS \
RIL_DBUS_GET_ALL4_ARGS, \
- {"ready" , "b"}
-
+ RIL_DBUS_READY_ARG
+#define RIL_DBUS_GET_ALL6_ARGS \
+ RIL_DBUS_GET_ALL5_ARGS, \
+ RIL_DBUS_MODEM_ERRORS_ARG
static const GDBusMethodTable ril_plugin_dbus_methods[] = {
{ GDBUS_METHOD("GetAll",
NULL, GDBUS_ARGS(RIL_DBUS_GET_ALL_ARGS),
@@ -735,42 +830,48 @@
|