diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-09-20 19:29:37 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-09-23 08:29:15 +0200 |
commit | d818d9fe065b4baac979abf5c45e0d212ccf908d (patch) | |
tree | cc466e584d3adf818663eef47f94044a0fde18d8 /src | |
parent | 6b4602a3356e779389ef97bac0b8461e6d26fc41 (diff) |
bearer: consolidate unsolicited connection status reports
Originally developed by:
Ben Chan <benchan@chromium.org>
This patch replaces mm_bearer_report_disconnection() with a more generic
mm_bearer_report_connection_status(), which allows reporting any
connection status of a bearer. This further allows getting rid of those
custom report_connection_status functions in plugic specific bearer
subclasses.
Note that while plugin-specific implementations can receive multiple
'MMBearerConnectionStatus' values, the generic implementation is only allowed
to receive DISCONNECTED. Plugins need to make sure that they process all the
other status values, and only report DISCONNECTED to the parent when required.
MBM:
The MBM bearer implementation of report_connection_status() expects either
CONNECTED or DISCONNECTED. If any of these is received and there is an ongoing
connection attempt, the corresponding operation will be completed. If there is
no connection attempt, we will just handle the DISCONNECTED state, calling the
parent method to notify that the modem got network-disconnected.
Icera:
The Icera bearer implementation of report_connection_status() expects either
CONNECTED, CONNECT FAILED or DISCONNECTED. If any of these is received and
there is an ongoing connection or disconnection attempt, the corresponding
operation will be completed. If there is no connection or disconnection
attempt, we will just handle the CONNECT FAILED and DISCONNECTED states,
calling the parent method (always with DISCONNECTED) to notify that the modem
got network-disconnected.
Option/HSO:
The Option/HSO bearer implementation of report_connection_status() expects
either CONNECTED, CONNECTION FAILED or DISCONNECTED. If any of these is
received and there is an ongoing connection or disconnection attempt, the
corresponding operation will be completed. If there is no connection or
disconnection attempt, we will just handle the CONNECTION FAILED and
DISCONNECTED states, calling the parent method (always with DISCONNECTED) to
notify that the modem got network-disconnected.
Huawei:
The Huawei bearer implementation of report_connection_status() expects either
CONNECTED or DISCONNECTED. These messages are not used to process pending
connection or disconnection attempts; so if they are received while one of
these is on-going, it will just be ignored. CONNECTED reports are also
ignored, so we will just handle the DISCONNECTED state, calling the parent
method to notify that the modem got network-disconnected.
Altair-LTE:
The Altair-LTE bearers will only report DISCONNECTED on network-disconnected
cases. There is no custom report_connection_status().
Novatel-LTE:
The Novatel-LTE bearers will only report DISCONNECTED on network-disconnected
cases. There is no custom report_connection_status().
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-bearer-qmi.c | 14 | ||||
-rw-r--r-- | src/mm-bearer.c | 16 | ||||
-rw-r--r-- | src/mm-bearer.h | 15 | ||||
-rw-r--r-- | src/mm-broadband-bearer.c | 16 |
4 files changed, 42 insertions, 19 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index 00d17c59..fef58819 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -1186,13 +1186,15 @@ disconnect (MMBearer *_self, /*****************************************************************************/ static void -report_disconnection (MMBearer *self) +report_connection_status (MMBearer *self, + MMBearerConnectionStatus status) { - /* Cleanup all connection related data */ - reset_bearer_connection (MM_BEARER_QMI (self), TRUE, TRUE); + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED) + /* Cleanup all connection related data */ + reset_bearer_connection (MM_BEARER_QMI (self), TRUE, TRUE); - /* Chain up parent's report_disconection() */ - MM_BEARER_CLASS (mm_bearer_qmi_parent_class)->report_disconnection (self); + /* Chain up parent's report_connection_status() */ + MM_BEARER_CLASS (mm_bearer_qmi_parent_class)->report_connection_status (self, status); } /*****************************************************************************/ @@ -1253,5 +1255,5 @@ mm_bearer_qmi_class_init (MMBearerQmiClass *klass) bearer_class->connect_finish = connect_finish; bearer_class->disconnect = disconnect; bearer_class->disconnect_finish = disconnect_finish; - bearer_class->report_disconnection = report_disconnection; + bearer_class->report_connection_status = report_connection_status; } diff --git a/src/mm-bearer.c b/src/mm-bearer.c index 8c9a93c8..f57ea8be 100644 --- a/src/mm-bearer.c +++ b/src/mm-bearer.c @@ -974,17 +974,25 @@ mm_bearer_disconnect_force (MMBearer *self) /*****************************************************************************/ static void -report_disconnection (MMBearer *self) +report_connection_status (MMBearer *self, + MMBearerConnectionStatus status) { + /* The only status expected at this point is DISCONNECTED. + * No other status should have been given to the generic implementation + * of report_connection_status (it would be an error). + */ + g_assert (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED); + /* In the generic bearer implementation we just need to reset the * interface status */ bearer_update_status (self, MM_BEARER_STATUS_DISCONNECTED); } void -mm_bearer_report_disconnection (MMBearer *self) +mm_bearer_report_connection_status (MMBearer *self, + MMBearerConnectionStatus status) { - return MM_BEARER_GET_CLASS (self)->report_disconnection (self); + return MM_BEARER_GET_CLASS (self)->report_connection_status (self, status); } static void @@ -1160,7 +1168,7 @@ mm_bearer_class_init (MMBearerClass *klass) object_class->finalize = finalize; object_class->dispose = dispose; - klass->report_disconnection = report_disconnection; + klass->report_connection_status = report_connection_status; properties[PROP_CONNECTION] = g_param_spec_object (MM_BEARER_CONNECTION, diff --git a/src/mm-bearer.h b/src/mm-bearer.h index cc71bfd1..dc217c50 100644 --- a/src/mm-bearer.h +++ b/src/mm-bearer.h @@ -67,6 +67,13 @@ typedef enum { /*< underscore_name=mm_bearer_status >*/ MM_BEARER_STATUS_CONNECTED, } MMBearerStatus; +typedef enum { /*< underscore_name=mm_bearer_connection_status >*/ + MM_BEARER_CONNECTION_STATUS_UNKNOWN, + MM_BEARER_CONNECTION_STATUS_DISCONNECTED, + MM_BEARER_CONNECTION_STATUS_CONNECTED, + MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED, +} MMBearerConnectionStatus; + struct _MMBearer { MmGdbusBearerSkeleton parent; MMBearerPrivate *priv; @@ -92,8 +99,9 @@ struct _MMBearerClass { GAsyncResult *res, GError **error); - /* Report disconnection */ - void (* report_disconnection) (MMBearer *bearer); + /* Report connection status of this bearer */ + void (* report_connection_status) (MMBearer *bearer, + MMBearerConnectionStatus status); }; GType mm_bearer_get_type (void); @@ -123,6 +131,7 @@ gboolean mm_bearer_disconnect_finish (MMBearer *self, void mm_bearer_disconnect_force (MMBearer *self); -void mm_bearer_report_disconnection (MMBearer *self); +void mm_bearer_report_connection_status (MMBearer *self, + MMBearerConnectionStatus status); #endif /* MM_BEARER_H */ diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c index f8f449d0..33b4ca73 100644 --- a/src/mm-broadband-bearer.c +++ b/src/mm-broadband-bearer.c @@ -1785,13 +1785,17 @@ disconnect (MMBearer *self, /*****************************************************************************/ static void -report_disconnection (MMBearer *self) +report_connection_status (MMBearer *self, + MMBearerConnectionStatus status) { - /* Cleanup all connection related data */ - reset_bearer_connection (MM_BROADBAND_BEARER (self)); + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED) + /* Cleanup all connection related data */ + reset_bearer_connection (MM_BROADBAND_BEARER (self)); - /* Chain up parent's report_disconection() */ - MM_BEARER_CLASS (mm_broadband_bearer_parent_class)->report_disconnection (self); + /* Chain up parent's report_connection_status() */ + MM_BEARER_CLASS (mm_broadband_bearer_parent_class)->report_connection_status ( + self, + status); } /*****************************************************************************/ @@ -2052,7 +2056,7 @@ mm_broadband_bearer_class_init (MMBroadbandBearerClass *klass) bearer_class->connect_finish = connect_finish; bearer_class->disconnect = disconnect; bearer_class->disconnect_finish = disconnect_finish; - bearer_class->report_disconnection = report_disconnection; + bearer_class->report_connection_status = report_connection_status; klass->connect_3gpp = connect_3gpp; klass->connect_3gpp_finish = detailed_connect_finish; |