[PATCH v4 1/2] bearer: consolidate unsolicited connection status reports
Aleksander Morgado
aleksander at lanedo.com
Fri Sep 20 10:25:18 PDT 2013
On 09/20/2013 05:54 PM, Ben Chan wrote:
>
>
>
> On Fri, Sep 20, 2013 at 4:42 AM, Aleksander Morgado
> <aleksander at lanedo.com <mailto:aleksander at lanedo.com>> wrote:
>
> Originally developed by:
> Ben Chan <benchan at chromium.org <mailto:benchan at 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().
>
> squash! bearer: consolidate unsolicited connection status reports
>
>
> should the line above be removed?
>
Hehe, yes yes :)
>
> ---
> plugins/altair/mm-broadband-modem-altair-lte.c | 3 +-
> plugins/huawei/mm-broadband-bearer-huawei.c | 30 +++--
> plugins/huawei/mm-broadband-bearer-huawei.h | 3 -
> plugins/huawei/mm-broadband-modem-huawei.c | 6 +-
> plugins/icera/mm-broadband-bearer-icera.c | 154
> ++++++++++------------
> plugins/icera/mm-broadband-bearer-icera.h | 10 --
> plugins/icera/mm-broadband-modem-icera.c | 15 +--
> plugins/mbm/mm-broadband-bearer-mbm.c | 63 +++++----
> plugins/mbm/mm-broadband-bearer-mbm.h | 9 --
> plugins/mbm/mm-broadband-modem-mbm.c | 13 +-
> plugins/novatel/mm-broadband-bearer-novatel-lte.c | 2 +-
> plugins/option/mm-broadband-bearer-hso.c | 107 +++++++--------
> plugins/option/mm-broadband-bearer-hso.h | 10 --
> plugins/option/mm-broadband-modem-hso.c | 15 +--
> src/mm-bearer-qmi.c | 14 +-
> src/mm-bearer.c | 16 ++-
> src/mm-bearer.h | 15 ++-
> src/mm-broadband-bearer.c | 16 ++-
> 18 files changed, 243 insertions(+), 258 deletions(-)
>
> diff --git a/plugins/altair/mm-broadband-modem-altair-lte.c
> b/plugins/altair/mm-broadband-modem-altair-lte.c
> index 4fceff8..3303cbb 100644
> --- a/plugins/altair/mm-broadband-modem-altair-lte.c
> +++ b/plugins/altair/mm-broadband-modem-altair-lte.c
> @@ -518,7 +518,8 @@ static void
> bearer_list_report_disconnect_status_foreach (MMBearer *bearer,
> gpointer *user_data)
> {
> - mm_bearer_report_disconnection (bearer);
> + mm_bearer_report_connection_status (bearer,
> +
> MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> }
>
> static void
> diff --git a/plugins/huawei/mm-broadband-bearer-huawei.c
> b/plugins/huawei/mm-broadband-bearer-huawei.c
> index 233102f..2d8f0cd 100644
> --- a/plugins/huawei/mm-broadband-bearer-huawei.c
> +++ b/plugins/huawei/mm-broadband-bearer-huawei.c
> @@ -30,6 +30,7 @@
> #include "mm-log.h"
> #include "mm-modem-helpers.h"
> #include "mm-modem-helpers-huawei.h"
> +#include "mm-daemon-enums-types.h"
>
> G_DEFINE_TYPE (MMBroadbandBearerHuawei, mm_broadband_bearer_huawei,
> MM_TYPE_BROADBAND_BEARER)
>
> @@ -639,22 +640,34 @@ disconnect_3gpp (MMBroadbandBearer *self,
>
> /*****************************************************************************/
>
> -void
> -mm_broadband_bearer_huawei_report_connection_status
> (MMBroadbandBearerHuawei *self,
> - gboolean
> connected)
> +static void
> +report_connection_status (MMBearer *bearer,
> + MMBearerConnectionStatus status)
> {
> + MMBroadbandBearerHuawei *self = MM_BROADBAND_BEARER_HUAWEI
> (bearer);
> +
> + g_assert (status == MM_BEARER_CONNECTION_STATUS_CONNECTED ||
> + status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> +
> /* When a pending connection / disconnection attempt is in
> progress, we use
> * ^NDISSTATQRY? to check the connection status and thus
> temporarily ignore
> * ^NDISSTAT unsolicited messages */
> if (self->priv->connect_pending || self->priv->disconnect_pending)
> return;
>
> + mm_dbg ("Received spontaneous ^NDISSTAT (%s)",
> + mm_bearer_connection_status_get_string (status));
> +
> + /* Ignore 'CONNECTED' */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED)
> + return;
> +
> /* We already use ^NDISSTATQRY? to poll the connection status,
> so only
> * handle network-initiated disconnection here. */
> - if (!connected) {
> - mm_dbg ("Disconnect bearer '%s'", mm_bearer_get_path
> (MM_BEARER (self)));
> - mm_bearer_report_disconnection (MM_BEARER (self));
> - }
> + mm_dbg ("Disconnect bearer '%s'", mm_bearer_get_path (MM_BEARER
> (self)));
> + MM_BEARER_CLASS
> (mm_broadband_bearer_huawei_parent_class)->report_connection_status (
> + bearer,
> + MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> }
>
> /*****************************************************************************/
> @@ -710,11 +723,12 @@ static void
> mm_broadband_bearer_huawei_class_init (MMBroadbandBearerHuaweiClass
> *klass)
> {
> GObjectClass *object_class = G_OBJECT_CLASS (klass);
> -
> + MMBearerClass *bearer_class = MM_BEARER_CLASS (klass);
> MMBroadbandBearerClass *broadband_bearer_class =
> MM_BROADBAND_BEARER_CLASS (klass);
>
> g_type_class_add_private (object_class, sizeof
> (MMBroadbandBearerHuaweiPrivate));
>
> + bearer_class->report_connection_status = report_connection_status;
> broadband_bearer_class->connect_3gpp = connect_3gpp;
> broadband_bearer_class->connect_3gpp_finish = connect_3gpp_finish;
> broadband_bearer_class->disconnect_3gpp = disconnect_3gpp;
> diff --git a/plugins/huawei/mm-broadband-bearer-huawei.h
> b/plugins/huawei/mm-broadband-bearer-huawei.h
> index 3eb0efd..4c87d9c 100644
> --- a/plugins/huawei/mm-broadband-bearer-huawei.h
> +++ b/plugins/huawei/mm-broadband-bearer-huawei.h
> @@ -56,7 +56,4 @@ void mm_broadband_bearer_huawei_new
> (MMBroadbandModemHuawei *modem,
> MMBearer *mm_broadband_bearer_huawei_new_finish (GAsyncResult *res,
> GError **error);
>
> -void mm_broadband_bearer_huawei_report_connection_status
> (MMBroadbandBearerHuawei *self,
> - gboolean
> connected);
> -
> #endif /* MM_BROADBAND_BEARER_HUAWEI_H */
> diff --git a/plugins/huawei/mm-broadband-modem-huawei.c
> b/plugins/huawei/mm-broadband-modem-huawei.c
> index 66ec62d..f93f5a1 100644
> --- a/plugins/huawei/mm-broadband-modem-huawei.c
> +++ b/plugins/huawei/mm-broadband-modem-huawei.c
> @@ -1526,8 +1526,10 @@ bearer_report_connection_status (MMBearer
> *bearer,
> if (ndisstat_result->ipv4_available) {
> /* TODO: MMBroadbandBearerHuawei does not currently support
> IPv6.
> * When it does, we should check the IP family associated
> with each bearer. */
> - mm_broadband_bearer_huawei_report_connection_status
> (MM_BROADBAND_BEARER_HUAWEI (bearer),
> -
> ndisstat_result->ipv4_connected);
> + mm_bearer_report_connection_status (bearer,
> +
> ndisstat_result->ipv4_connected ?
> +
> MM_BEARER_CONNECTION_STATUS_CONNECTED :
> +
> MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> }
> }
>
> diff --git a/plugins/icera/mm-broadband-bearer-icera.c
> b/plugins/icera/mm-broadband-bearer-icera.c
> index b7ea8df..48a2a79 100644
> --- a/plugins/icera/mm-broadband-bearer-icera.c
> +++ b/plugins/icera/mm-broadband-bearer-icera.c
> @@ -32,6 +32,7 @@
> #include "mm-log.h"
> #include "mm-modem-helpers.h"
> #include "mm-error-helpers.h"
> +#include "mm-daemon-enums-types.h"
>
> G_DEFINE_TYPE (MMBroadbandBearerIcera, mm_broadband_bearer_icera,
> MM_TYPE_BROADBAND_BEARER);
>
> @@ -360,13 +361,14 @@ disconnect_3gpp_timed_out_cb
> (MMBroadbandBearerIcera *self)
>
> static void
> report_disconnect_status (MMBroadbandBearerIcera *self,
> - MMBroadbandBearerIceraConnectionStatus
> status)
> + MMBearerConnectionStatus status)
> {
> Disconnect3gppContext *ctx;
>
> /* Recover context */
> ctx = self->priv->disconnect_pending;
> self->priv->disconnect_pending = NULL;
> + g_assert (ctx != NULL);
>
>
> I guess %IPDPDACT unsolicited messages could be received out-of-band
> (e.g. network-initiated disconnection) when there is no pending
> disconnect attempt, right? In which case, we should probably handle 'ctx
> == NULL' like the original code does.
>
Nope, no. When report_disconnect_status() is called ctx will always be
!= NULL; as this method is called from report_connection_status() which
already checks for this.
>
>
> /* Cleanup timeout, if any */
> if (self->priv->disconnect_pending_id) {
> @@ -374,42 +376,26 @@ report_disconnect_status
> (MMBroadbandBearerIcera *self,
> self->priv->disconnect_pending_id = 0;
> }
>
> - switch (status) {
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN:
> - g_warn_if_reached ();
> - break;
> -
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED:
> - if (!ctx)
> - break;
> -
> + /* Received 'CONNECTED' during a disconnection attempt? */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) {
> g_simple_async_result_set_error (ctx->result,
> MM_CORE_ERROR,
> MM_CORE_ERROR_FAILED,
> "Disconnection failed");
> disconnect_3gpp_context_complete_and_free (ctx);
> return;
> + }
>
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED:
> - if (!ctx)
> - break;
> -
> - /* Well, this actually means disconnection, right? */
> - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> - disconnect_3gpp_context_complete_and_free (ctx);
> - return;
> -
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED:
> - if (!ctx) {
> - mm_dbg ("Received spontaneous %%IPDPACT disconnect");
> - mm_bearer_report_disconnection (MM_BEARER (self));
> - break;
> - }
> -
> + /* Received 'DISCONNECTED' during a disconnection attempt? */
> + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED ||
> + status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) {
> g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
> disconnect_3gpp_context_complete_and_free (ctx);
> return;
> }
> +
> + /* No other status is expected by this implementation */
> + g_assert_not_reached ();
> }
>
> static void
> @@ -658,9 +644,8 @@ forced_close_cb (MMSerialPort *port,
> MMBroadbandBearerIcera *self)
> {
> /* Just treat the forced close event as any other unsolicited
> message */
> - mm_broadband_bearer_icera_report_connection_status (
> - self,
> - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED);
> + mm_bearer_report_connection_status (MM_BEARER (self),
> +
> MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED);
> }
>
> static void
> @@ -699,13 +684,18 @@ ier_query_ready (MMBaseModem *modem,
>
> static void
> report_connect_status (MMBroadbandBearerIcera *self,
> - MMBroadbandBearerIceraConnectionStatus status)
> + MMBearerConnectionStatus status)
> {
> Dial3gppContext *ctx;
>
> + g_assert (status == MM_BEARER_CONNECTION_STATUS_CONNECTED ||
> + status ==
> MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED ||
> + status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> +
> /* Recover context and remove it from the private info */
> ctx = self->priv->connect_pending;
> self->priv->connect_pending = NULL;
> + g_assert (ctx != NULL);
>
>
> Unlikely the disconnection case, I guess we wouldn't expect %IDPDACT
> reports the modem is connected while there is no client-initiated
> connect request. So 'ctx' should probably not be NULL here. I don't have
> a strong opinion here where we should handle ctx == NULL or just give an
> assertion.
>
Same here; no need to handle ctx==NULL because that is already checked
when calling report_connect_status() (in report_connection_status()).
Maybe change those method names not to confuse one with the other...
>
>
> /* Cleanup cancellable, timeout and port closed watch, if any */
> if (self->priv->connect_pending_id) {
> @@ -713,29 +703,19 @@ report_connect_status (MMBroadbandBearerIcera
> *self,
> self->priv->connect_pending_id = 0;
> }
>
> - if (ctx && self->priv->connect_cancellable_id) {
> + if (self->priv->connect_cancellable_id) {
> g_cancellable_disconnect (ctx->cancellable,
> self->priv->connect_cancellable_id);
> self->priv->connect_cancellable_id = 0;
> }
>
> - if (ctx && self->priv->connect_port_closed_id) {
> + if (self->priv->connect_port_closed_id) {
> g_signal_handler_disconnect (ctx->primary,
> self->priv->connect_port_closed_id);
> self->priv->connect_port_closed_id = 0;
> }
>
> - switch (status) {
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN:
> - break;
> -
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED:
> - if (!ctx)
> - /* We may get this if the timeout for the connection
> attempt is
> - * reached before the unsolicited response. We should
> probably
> - * keep the CID around to request explicit
> disconnection in this
> - * case. */
> - break;
> -
> + /* Received 'CONNECTED' during a connection attempt? */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) {
> /* If we wanted to get cancelled before, do it now */
> if (ctx->saved_error) {
> /* Keep error */
> @@ -751,20 +731,19 @@ report_connect_status (MMBroadbandBearerIcera
> *self,
>
> (GDestroyNotify)g_object_unref);
> dial_3gpp_context_complete_and_free (ctx);
> return;
> + }
>
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED:
> - if (!ctx)
> - break;
> -
> - /* If we wanted to get cancelled before and now we couldn't
> connect,
> - * use the cancelled error and return */
> - if (ctx->saved_error) {
> - g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> - ctx->saved_error = NULL;
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> + /* If we wanted to get cancelled before and now we couldn't
> connect,
> + * use the cancelled error and return */
> + if (ctx->saved_error) {
> + g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> + ctx->saved_error = NULL;
> + dial_3gpp_context_complete_and_free (ctx);
> + return;
> + }
>
> + /* Received CONNECTION_FAILED during a connection attempt? */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) {
> /* Try to gather additional info about the connection
> failure */
> mm_base_modem_at_command_full (
> ctx->modem,
> @@ -777,32 +756,14 @@ report_connect_status (MMBroadbandBearerIcera
> *self,
> (GAsyncReadyCallback)ier_query_ready,
> ctx);
> return;
> -
> - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED:
> - if (ctx) {
> - /* If we wanted to get cancelled before and now we
> couldn't connect,
> - * use the cancelled error and return */
> - if (ctx->saved_error) {
> - g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> - ctx->saved_error = NULL;
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> -
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_FAILED,
> - "Call setup failed");
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> -
> - /* Just ensure we mark ourselves as being disconnected... */
> - mm_bearer_report_disconnection (MM_BEARER (self));
> - return;
> }
>
> - g_warn_if_reached ();
> + /* Otherwise, received 'DISCONNECTED' during a connection
> attempt? */
> + g_simple_async_result_set_error (ctx->result,
> + MM_CORE_ERROR,
> + MM_CORE_ERROR_FAILED,
> + "Call setup failed");
> + dial_3gpp_context_complete_and_free (ctx);
> }
>
> static void
> @@ -1060,15 +1021,36 @@ dial_3gpp (MMBroadbandBearer *self,
>
> /*****************************************************************************/
>
> -void
> -mm_broadband_bearer_icera_report_connection_status
> (MMBroadbandBearerIcera *self,
> -
> MMBroadbandBearerIceraConnectionStatus status)
> +static void
> +report_connection_status (MMBearer *bearer,
> + MMBearerConnectionStatus status)
> {
> - if (self->priv->connect_pending)
> + MMBroadbandBearerIcera *self = MM_BROADBAND_BEARER_ICERA (bearer);
> +
> + /* Process pending connection attempt */
> + if (self->priv->connect_pending) {
> report_connect_status (self, status);
> + return;
> + }
>
> - if (self->priv->disconnect_pending)
> + /* Process pending disconnection attempt */
> + if (self->priv->disconnect_pending) {
> report_disconnect_status (self, status);
> + return;
> + }
> +
These previous checks are the ones I was talking about before, the ones
which make sure that the ctx in each case is != NULL.
> + mm_dbg ("Received spontaneous %%IPDPACT (%s)",
> + mm_bearer_connection_status_get_string (status));
> +
> + /* Received a random 'DISCONNECTED'...*/
> + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED ||
> + status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) {
> + /* If no connection/disconnection attempt on-going, make
> sure we mark ourselves as
> + * disconnected. Make sure we only pass 'DISCONNECTED' to
> the parent */
> + MM_BEARER_CLASS
> (mm_broadband_bearer_icera_parent_class)->report_connection_status (
> + bearer,
> + MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> + }
> }
>
> /*****************************************************************************/
> @@ -1165,12 +1147,14 @@ static void
> mm_broadband_bearer_icera_class_init (MMBroadbandBearerIceraClass
> *klass)
> {
> GObjectClass *object_class = G_OBJECT_CLASS (klass);
> + MMBearerClass *bearer_class = MM_BEARER_CLASS (klass);
> MMBroadbandBearerClass *broadband_bearer_class =
> MM_BROADBAND_BEARER_CLASS (klass);
>
> g_type_class_add_private (object_class, sizeof
> (MMBroadbandBearerIceraPrivate));
>
> object_class->get_property = get_property;
> object_class->set_property = set_property;
> + bearer_class->report_connection_status = report_connection_status;
> broadband_bearer_class->dial_3gpp = dial_3gpp;
> broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish;
> broadband_bearer_class->get_ip_config_3gpp = get_ip_config_3gpp;
> diff --git a/plugins/icera/mm-broadband-bearer-icera.h
> b/plugins/icera/mm-broadband-bearer-icera.h
> index 4edd189..f513659 100644
> --- a/plugins/icera/mm-broadband-bearer-icera.h
> +++ b/plugins/icera/mm-broadband-bearer-icera.h
> @@ -36,13 +36,6 @@
>
> #define MM_BROADBAND_BEARER_ICERA_DEFAULT_IP_METHOD
> "broadband-bearer-icera-default-ip-method"
>
> -typedef enum {
> - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN,
> - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED,
> - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED,
> - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED
> -} MMBroadbandBearerIceraConnectionStatus;
> -
> typedef struct _MMBroadbandBearerIcera MMBroadbandBearerIcera;
> typedef struct _MMBroadbandBearerIceraClass
> MMBroadbandBearerIceraClass;
> typedef struct _MMBroadbandBearerIceraPrivate
> MMBroadbandBearerIceraPrivate;
> @@ -68,7 +61,4 @@ void mm_broadband_bearer_icera_new
> (MMBroadbandModem *modem,
> MMBearer *mm_broadband_bearer_icera_new_finish (GAsyncResult *res,
> GError **error);
>
> -void mm_broadband_bearer_icera_report_connection_status
> (MMBroadbandBearerIcera *self,
> -
> MMBroadbandBearerIceraConnectionStatus status);
> -
> #endif /* MM_BROADBAND_BEARER_ICERA_H */
> diff --git a/plugins/icera/mm-broadband-modem-icera.c
> b/plugins/icera/mm-broadband-modem-icera.c
> index b84cd12..bf3d18b 100644
> --- a/plugins/icera/mm-broadband-modem-icera.c
> +++ b/plugins/icera/mm-broadband-modem-icera.c
> @@ -397,7 +397,7 @@ modem_set_current_modes (MMIfaceModem *self,
>
> typedef struct {
> guint cid;
> - MMBroadbandBearerIceraConnectionStatus status;
> + MMBearerConnectionStatus status;
> } BearerListReportStatusForeachContext;
>
> static void
> @@ -410,8 +410,7 @@ bearer_list_report_status_foreach (MMBearer *bearer,
> if (!MM_IS_BROADBAND_BEARER_ICERA (bearer))
> return;
>
> - mm_broadband_bearer_icera_report_connection_status
> (MM_BROADBAND_BEARER_ICERA (bearer),
> - ctx->status);
> + mm_bearer_report_connection_status (bearer, ctx->status);
> }
>
> static void
> @@ -431,20 +430,20 @@ ipdpact_received (MMAtSerialPort *port,
>
> /* Setup context */
> ctx.cid = cid;
> - ctx.status = MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_UNKNOWN;
>
> switch (status) {
> case 0:
> - ctx.status =
> MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_DISCONNECTED;
> break;
> case 1:
> - ctx.status =
> MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTED;
> break;
> case 2:
> /* activating */
> break;
> case 3:
> - ctx.status =
> MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED;
> break;
> default:
> mm_warn ("Unknown Icera connect status %d", status);
> @@ -452,7 +451,7 @@ ipdpact_received (MMAtSerialPort *port,
> }
>
> /* If unknown status, don't try to report anything */
> - if (ctx.status ==
> MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN)
> + if (ctx.status == MM_BEARER_CONNECTION_STATUS_UNKNOWN)
> return;
>
> /* If empty bearer list, nothing else to do */
> diff --git a/plugins/mbm/mm-broadband-bearer-mbm.c
> b/plugins/mbm/mm-broadband-bearer-mbm.c
> index e4f9983..c7495ce 100644
> --- a/plugins/mbm/mm-broadband-bearer-mbm.c
> +++ b/plugins/mbm/mm-broadband-bearer-mbm.c
> @@ -39,6 +39,7 @@
> #include "mm-broadband-bearer-mbm.h"
> #include "mm-log.h"
> #include "mm-modem-helpers.h"
> +#include "mm-daemon-enums-types.h"
>
> G_DEFINE_TYPE (MMBroadbandBearerMbm, mm_broadband_bearer_mbm,
> MM_TYPE_BROADBAND_BEARER);
>
> @@ -114,55 +115,63 @@ dial_3gpp_finish (MMBroadbandBearer *self,
> return MM_PORT (g_object_ref
> (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT
> (res))));
> }
>
> -void
> -mm_broadband_bearer_mbm_report_connection_status
> (MMBroadbandBearerMbm *self,
> -
> MMBroadbandBearerMbmConnectionStatus status)
> +static void
> +report_connection_status (MMBearer *bearer,
> + MMBearerConnectionStatus status)
> {
> + MMBroadbandBearerMbm *self = MM_BROADBAND_BEARER_MBM (bearer);
> Dial3gppContext *ctx;
>
> + g_assert (status == MM_BEARER_CONNECTION_STATUS_CONNECTED ||
> + status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> +
> /* Recover context (if any) and remove both cancellation and
> timeout (if any)*/
> ctx = self->priv->connect_pending;
> self->priv->connect_pending = NULL;
>
> + /* Connection status reported but no connection attempt? */
> + if (!ctx) {
> + g_assert (self->priv->connect_pending_id == 0);
> +
> + mm_dbg ("Received spontaneous *E2NAP (%s)",
> + mm_bearer_connection_status_get_string (status));
> +
> + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED) {
> + /* If no connection attempt on-going, make sure we mark
> ourselves as
> + * disconnected */
> + MM_BEARER_CLASS
> (mm_broadband_bearer_mbm_parent_class)->report_connection_status (
> + bearer,
> + status);
> + }
> + return;
> + }
> +
> if (self->priv->connect_pending_id) {
> g_source_remove (self->priv->connect_pending_id);
> self->priv->connect_pending_id = 0;
> }
>
> - if (ctx && self->priv->connect_cancellable_id) {
> + if (self->priv->connect_cancellable_id) {
> g_cancellable_disconnect (ctx->cancellable,
> self->priv->connect_cancellable_id);
> self->priv->connect_cancellable_id = 0;
> }
>
> - switch (status) {
> - case MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_UNKNOWN:
> - g_warn_if_reached ();
> - break;
> -
> - case MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_CONNECTED:
> - if (!ctx)
> - break;
> -
> + /* Reporting connected */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) {
> g_simple_async_result_set_op_res_gpointer (ctx->result,
> g_object_ref
> (ctx->data),
>
> (GDestroyNotify)g_object_unref);
> dial_3gpp_context_complete_and_free (ctx);
> return;
> -
> - case MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_DISCONNECTED:
> - if (ctx) {
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_FAILED,
> - "Call setup failed");
> - dial_3gpp_context_complete_and_free (ctx);
> - } else {
> - /* Just ensure we mark ourselves as being
> disconnected... */
> - mm_bearer_report_disconnection (MM_BEARER (self));
> - }
> - break;
> }
> +
> + /* Reporting disconnected */
> + g_simple_async_result_set_error (ctx->result,
> + MM_CORE_ERROR,
> + MM_CORE_ERROR_FAILED,
> + "Call setup failed");
> + dial_3gpp_context_complete_and_free (ctx);
> }
>
> static void
> @@ -591,10 +600,12 @@ mm_broadband_bearer_mbm_class_init
> (MMBroadbandBearerMbmClass *klass)
> {
> GObjectClass *object_class = G_OBJECT_CLASS (klass);
>
> + MMBearerClass *bearer_class = MM_BEARER_CLASS (klass);
> MMBroadbandBearerClass *broadband_bearer_class =
> MM_BROADBAND_BEARER_CLASS (klass);
>
> g_type_class_add_private (object_class, sizeof
> (MMBroadbandBearerMbmPrivate));
>
> + bearer_class->report_connection_status = report_connection_status;
> broadband_bearer_class->dial_3gpp = dial_3gpp;
> broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish;
> broadband_bearer_class->disconnect_3gpp = disconnect_3gpp;
> diff --git a/plugins/mbm/mm-broadband-bearer-mbm.h
> b/plugins/mbm/mm-broadband-bearer-mbm.h
> index dcbeeec..a49cce1 100644
> --- a/plugins/mbm/mm-broadband-bearer-mbm.h
> +++ b/plugins/mbm/mm-broadband-bearer-mbm.h
> @@ -41,12 +41,6 @@
> #define MM_IS_BROADBAND_BEARER_MBM_CLASS(klass)
> (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BROADBAND_BEARER_MBM))
> #define MM_BROADBAND_BEARER_MBM_GET_CLASS(obj)
> (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BROADBAND_BEARER_MBM,
> MMBroadbandBearerMbmClass))
>
> -typedef enum {
> - MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_UNKNOWN,
> - MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_CONNECTED,
> - MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_DISCONNECTED
> -} MMBroadbandBearerMbmConnectionStatus;
> -
> typedef struct _MMBroadbandBearerMbm MMBroadbandBearerMbm;
> typedef struct _MMBroadbandBearerMbmClass MMBroadbandBearerMbmClass;
> typedef struct _MMBroadbandBearerMbmPrivate
> MMBroadbandBearerMbmPrivate;
> @@ -71,7 +65,4 @@ void mm_broadband_bearer_mbm_new
> (MMBroadbandModemMbm *modem,
> MMBearer *mm_broadband_bearer_mbm_new_finish (GAsyncResult *res,
> GError **error);
>
> -void mm_broadband_bearer_mbm_report_connection_status
> (MMBroadbandBearerMbm *self,
> -
> MMBroadbandBearerMbmConnectionStatus status);
> -
> #endif /* MM_BROADBAND_BEARER_MBM_H */
> diff --git a/plugins/mbm/mm-broadband-modem-mbm.c
> b/plugins/mbm/mm-broadband-modem-mbm.c
> index 8380813..5259359 100644
> --- a/plugins/mbm/mm-broadband-modem-mbm.c
> +++ b/plugins/mbm/mm-broadband-modem-mbm.c
> @@ -797,15 +797,14 @@ load_unlock_retries (MMIfaceModem *self,
> /* Setup/Cleanup unsolicited events (3GPP interface) */
>
> typedef struct {
> - MMBroadbandBearerMbmConnectionStatus status;
> + MMBearerConnectionStatus status;
> } BearerListReportStatusForeachContext;
>
> static void
> bearer_list_report_status_foreach (MMBearer *bearer,
>
> BearerListReportStatusForeachContext *ctx)
> {
> - mm_broadband_bearer_mbm_report_connection_status
> (MM_BROADBAND_BEARER_MBM (bearer),
> - ctx->status);
> + mm_bearer_report_connection_status (bearer, ctx->status);
> }
>
> static void
> @@ -820,16 +819,16 @@ e2nap_received (MMAtSerialPort *port,
> if (!mm_get_uint_from_match_info (info, 1, &state))
> return;
>
> - ctx.status = MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_UNKNOWN;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_UNKNOWN;
>
> switch (state) {
> case MBM_E2NAP_DISCONNECTED:
> mm_dbg ("disconnected");
> - ctx.status =
> MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_DISCONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_DISCONNECTED;
> break;
> case MBM_E2NAP_CONNECTED:
> mm_dbg ("connected");
> - ctx.status =
> MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_CONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTED;
> break;
> case MBM_E2NAP_CONNECTING:
> mm_dbg ("connecting");
> @@ -840,7 +839,7 @@ e2nap_received (MMAtSerialPort *port,
> }
>
> /* If unknown status, don't try to report anything */
> - if (ctx.status ==
> MM_BROADBAND_BEARER_MBM_CONNECTION_STATUS_UNKNOWN)
> + if (ctx.status == MM_BEARER_CONNECTION_STATUS_UNKNOWN)
> return;
>
> /* If empty bearer list, nothing else to do */
> diff --git a/plugins/novatel/mm-broadband-bearer-novatel-lte.c
> b/plugins/novatel/mm-broadband-bearer-novatel-lte.c
> index 4681c6e..2225656 100644
> --- a/plugins/novatel/mm-broadband-bearer-novatel-lte.c
> +++ b/plugins/novatel/mm-broadband-bearer-novatel-lte.c
> @@ -130,7 +130,7 @@ poll_connection_ready (MMBaseModem *modem,
> }
>
> if (is_qmistatus_disconnected (result)) {
> - mm_bearer_report_disconnection (MM_BEARER (bearer));
> + mm_bearer_report_connection_status (MM_BEARER (bearer),
> MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> g_source_remove (bearer->priv->connection_poller);
> bearer->priv->connection_poller = 0;
> }
> diff --git a/plugins/option/mm-broadband-bearer-hso.c
> b/plugins/option/mm-broadband-bearer-hso.c
> index 7da13aa..1c81557 100644
> --- a/plugins/option/mm-broadband-bearer-hso.c
> +++ b/plugins/option/mm-broadband-bearer-hso.c
> @@ -32,6 +32,7 @@
> #include "mm-broadband-bearer-hso.h"
> #include "mm-log.h"
> #include "mm-modem-helpers.h"
> +#include "mm-daemon-enums-types.h"
>
> G_DEFINE_TYPE (MMBroadbandBearerHso, mm_broadband_bearer_hso,
> MM_TYPE_BROADBAND_BEARER);
>
> @@ -314,44 +315,56 @@ connect_reset (Dial3gppContext *ctx)
> g_free (command);
> }
>
> -void
> -mm_broadband_bearer_hso_report_connection_status
> (MMBroadbandBearerHso *self,
> -
> MMBroadbandBearerHsoConnectionStatus status)
> +static void
> +report_connection_status (MMBearer *bearer,
> + MMBearerConnectionStatus status)
> {
> + MMBroadbandBearerHso *self = MM_BROADBAND_BEARER_HSO (bearer);
> Dial3gppContext *ctx;
>
> + g_assert (status == MM_BEARER_CONNECTION_STATUS_CONNECTED ||
> + status ==
> MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED ||
> + status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED);
> +
> /* Recover context (if any) and remove both cancellation and
> timeout (if any)*/
> ctx = self->priv->connect_pending;
> self->priv->connect_pending = NULL;
>
> + /* Connection status reported but no connection attempt? */
> + if (!ctx) {
> + g_assert (self->priv->connect_pending_id == 0);
> +
> + mm_dbg ("Received spontaneous _OWANCALL (%s)",
> + mm_bearer_connection_status_get_string (status));
> +
> + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED) {
> + /* If no connection attempt on-going, make sure we mark
> ourselves as
> + * disconnected */
> + MM_BEARER_CLASS
> (mm_broadband_bearer_hso_parent_class)->report_connection_status (
> + bearer,
> + status);
> + }
> + return;
> + }
> +
> if (self->priv->connect_pending_id) {
> g_source_remove (self->priv->connect_pending_id);
> self->priv->connect_pending_id = 0;
> }
>
> - if (ctx && self->priv->connect_cancellable_id) {
> + if (self->priv->connect_cancellable_id) {
> g_cancellable_disconnect (ctx->cancellable,
> self->priv->connect_cancellable_id);
> self->priv->connect_cancellable_id = 0;
> }
>
> - if (ctx && self->priv->connect_port_closed_id) {
> + if (self->priv->connect_port_closed_id) {
> g_signal_handler_disconnect (ctx->primary,
> self->priv->connect_port_closed_id);
> self->priv->connect_port_closed_id = 0;
> }
>
> - switch (status) {
> - case MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_UNKNOWN:
> - break;
> -
> - case MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTED:
> - if (!ctx)
> - /* We may get this if the timeout for the connection
> attempt is
> - * reached before the unsolicited response. We should
> probably
> - * keep the CID around to request explicit
> disconnection in this
> - * case. */
> - break;
> -
> + /* Reporting connected */
> + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) {
> /* If we wanted to get cancelled before, do it now */
> if (ctx->saved_error) {
> /* Keep error */
> @@ -367,52 +380,23 @@
> mm_broadband_bearer_hso_report_connection_status
> (MMBroadbandBearerHso *self,
>
> (GDestroyNotify)g_object_unref);
> dial_3gpp_context_complete_and_free (ctx);
> return;
> + }
>
> - case MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTION_FAILED:
> - if (!ctx)
> - break;
> -
> - /* If we wanted to get cancelled before and now we couldn't
> connect,
> - * use the cancelled error and return */
> - if (ctx->saved_error) {
> - g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> - ctx->saved_error = NULL;
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> -
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_FAILED,
> - "Call setup failed");
> + /* If we wanted to get cancelled before and now we couldn't
> connect,
> + * use the cancelled error and return */
> + if (ctx->saved_error) {
> + g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> + ctx->saved_error = NULL;
> dial_3gpp_context_complete_and_free (ctx);
> return;
> -
> - case MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_DISCONNECTED:
> - if (ctx) {
> - /* If we wanted to get cancelled before and now we
> couldn't connect,
> - * use the cancelled error and return */
> - if (ctx->saved_error) {
> - g_simple_async_result_take_error (ctx->result,
> ctx->saved_error);
> - ctx->saved_error = NULL;
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> -
> - g_simple_async_result_set_error (ctx->result,
> - MM_CORE_ERROR,
> - MM_CORE_ERROR_FAILED,
> - "Call setup failed");
> - dial_3gpp_context_complete_and_free (ctx);
> - return;
> - }
> -
> - /* Just ensure we mark ourselves as being disconnected... */
> - mm_bearer_report_disconnection (MM_BEARER (self));
> - return;
> }
>
> - g_warn_if_reached ();
> + /* Received CONNECTION_FAILED or DISCONNECTED during a
> connection attempt? */
> + g_simple_async_result_set_error (ctx->result,
> + MM_CORE_ERROR,
> + MM_CORE_ERROR_FAILED,
> + "Call setup failed");
> + dial_3gpp_context_complete_and_free (ctx);
> }
>
> static gboolean
> @@ -482,9 +466,8 @@ forced_close_cb (MMSerialPort *port,
> MMBroadbandBearerHso *self)
> {
> /* Just treat the forced close event as any other unsolicited
> message */
> - mm_broadband_bearer_hso_report_connection_status (
> - self,
> - MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTION_FAILED);
> + mm_bearer_report_connection_status (MM_BEARER (self),
> +
> MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED);
> }
>
> static void
> @@ -854,10 +837,12 @@ static void
> mm_broadband_bearer_hso_class_init (MMBroadbandBearerHsoClass *klass)
> {
> GObjectClass *object_class = G_OBJECT_CLASS (klass);
> + MMBearerClass *bearer_class = MM_BEARER_CLASS (klass);
> MMBroadbandBearerClass *broadband_bearer_class =
> MM_BROADBAND_BEARER_CLASS (klass);
>
> g_type_class_add_private (object_class, sizeof
> (MMBroadbandBearerHsoPrivate));
>
> + bearer_class->report_connection_status = report_connection_status;
> broadband_bearer_class->dial_3gpp = dial_3gpp;
> broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish;
> broadband_bearer_class->get_ip_config_3gpp = get_ip_config_3gpp;
> diff --git a/plugins/option/mm-broadband-bearer-hso.h
> b/plugins/option/mm-broadband-bearer-hso.h
> index 584fc03..20b89db 100644
> --- a/plugins/option/mm-broadband-bearer-hso.h
> +++ b/plugins/option/mm-broadband-bearer-hso.h
> @@ -32,13 +32,6 @@
> #define MM_IS_BROADBAND_BEARER_HSO_CLASS(klass)
> (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BROADBAND_BEARER_HSO))
> #define MM_BROADBAND_BEARER_HSO_GET_CLASS(obj)
> (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BROADBAND_BEARER_HSO,
> MMBroadbandBearerHsoClass))
>
> -typedef enum {
> - MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_UNKNOWN,
> - MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTED,
> - MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTION_FAILED,
> - MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_DISCONNECTED
> -} MMBroadbandBearerHsoConnectionStatus;
> -
> typedef struct _MMBroadbandBearerHso MMBroadbandBearerHso;
> typedef struct _MMBroadbandBearerHsoClass MMBroadbandBearerHsoClass;
> typedef struct _MMBroadbandBearerHsoPrivate
> MMBroadbandBearerHsoPrivate;
> @@ -63,7 +56,4 @@ void mm_broadband_bearer_hso_new
> (MMBroadbandModemHso *modem,
> MMBearer *mm_broadband_bearer_hso_new_finish (GAsyncResult *res,
> GError **error);
>
> -void mm_broadband_bearer_hso_report_connection_status
> (MMBroadbandBearerHso *self,
> -
> MMBroadbandBearerHsoConnectionStatus status);
> -
> #endif /* MM_BROADBAND_BEARER_HSO_H */
> diff --git a/plugins/option/mm-broadband-modem-hso.c
> b/plugins/option/mm-broadband-modem-hso.c
> index 1c69109..ef10174 100644
> --- a/plugins/option/mm-broadband-modem-hso.c
> +++ b/plugins/option/mm-broadband-modem-hso.c
> @@ -216,7 +216,7 @@ load_unlock_retries (MMIfaceModem *self,
>
> typedef struct {
> guint cid;
> - MMBroadbandBearerHsoConnectionStatus status;
> + MMBearerConnectionStatus status;
> } BearerListReportStatusForeachContext;
>
> static void
> @@ -226,8 +226,7 @@ bearer_list_report_status_foreach (MMBearer *bearer,
> if (mm_broadband_bearer_get_3gpp_cid (MM_BROADBAND_BEARER
> (bearer)) != ctx->cid)
> return;
>
> - mm_broadband_bearer_hso_report_connection_status
> (MM_BROADBAND_BEARER_HSO (bearer),
> - ctx->status);
> + mm_bearer_report_connection_status (MM_BEARER (bearer),
> ctx->status);
> }
>
> static void
> @@ -247,24 +246,24 @@ hso_connection_status_changed (MMAtSerialPort
> *port,
>
> /* Setup context */
> ctx.cid = cid;
> - ctx.status = MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_UNKNOWN;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_UNKNOWN;
>
> switch (status) {
> case 1:
> - ctx.status =
> MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTED;
> break;
> case 3:
> - ctx.status =
> MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTION_FAILED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED;
> break;
> case 0:
> - ctx.status =
> MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_DISCONNECTED;
> + ctx.status = MM_BEARER_CONNECTION_STATUS_DISCONNECTED;
> break;
> default:
> break;
> }
>
> /* If unknown status, don't try to report anything */
> - if (ctx.status ==
> MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_UNKNOWN)
> + if (ctx.status == MM_BEARER_CONNECTION_STATUS_UNKNOWN)
> return;
>
> /* If empty bearer list, nothing else to do */
> diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c
> index 00d17c5..fef5881 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 8c9a93c..f57ea8b 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 cc71bfd..dc217c5 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 f8f449d..33b4ca7 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;
> --
> 1.8.3.1
>
>
--
Aleksander
More information about the ModemManager-devel
mailing list