Commit Graph

97 Commits

Author SHA1 Message Date
Ben Chan
686caef536 huawei: handle pending network-initiated disconnection in disconnect_3gpp
If a client-initiated disconnection attempt is issued while a
network-initiated disconnection is still pending, the latter may
interfere with the former. Also, when the client-initiated disconnection
attempt fails but the bearer status is reported as 'disconnected', the
pending network-initiated disconnection is not cleared and may result
in an assertion when a connection attempt is issued.

This patch addresses the issue by clearing any pending network-initiated
disconnection before proceeding with a client-initiated disconnection.
2013-10-24 16:44:05 +02:00
Ben Chan
18053540ea huawei: handle unquoted strings in ^SYSINFOEX response
The original sysinfoex_parse() in MMBroadbandModemHuawei does not handle
unquoted <sysmode_name> and <submode_name> fields in ^SYSINFOEX responses,
which are sen on some Huawei modems (e.g. E303). This patch moves the
^SYSINFOEX parsing code to mm-modem-helpers-huawei.c, fixes the regex for
handling unquoted strings in ^SYSINFOEX responses, and adds unit tests.
2013-10-20 17:01:59 +02:00
Ben Chan
49d4163a2b huawei: fix ^SYSINFO parsing
The original sysinfo_parse() in MMBroadbandModemHuawei incorrectly sets
'out_sys_submode_valid' to TRUE even when <sys_submode> is not present
in a ^SYSINFO response. This patch moves the code to
mm-modem-helpers-huawei.c, fixes the regex for parsing ^SYSINFO
responses, and adds unit tests.
2013-10-20 17:01:51 +02:00
Ben Chan
b5ef861d12 modem-helpers,sim: auto-detect if ICCID response is character swapped
This patch modifies mm_3gpp_parse_iccid() to auto-detect if an ICCID
response is character swapped or not by comparsing the major industry
identifier part of the ICCID response to the known value (89) for
telecommunication purposes. This addresses the issue where the same AT
command (e.g. AT^ICCID used by the huawei plugin) does not report ICCID
in a consistent format.
2013-09-26 20:23:51 +02:00
Aleksander Morgado
21a5aaf4fe huawei: delay processing of network-initiated disconnection
Originally developed by:
  Prathmesh Prabhu <pprabhu@chromium.org>
  Ben Chan <benchan@chromium.org>

Huawei MU736 prematurely fires a ^NDISSTAT unsolicited message upon a
network-initiated disconnection. The modem can go into a bad state if a
reconnect attempt happens before the disconnection completes. This patch works
around the issue by delaying the reporting of the disconnection.
2013-09-23 08:29:21 +02:00
Aleksander Morgado
d818d9fe06 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().
2013-09-23 08:29:15 +02:00
Ben Chan
2b20264215 huawei: handle disconnection via ^NDISSTAT unsolicited message
This patch changes MMBroadbandModemHuawei to use ^NDISSTAT unsolicited
messages to handle network-initiated disconnection. As a ^NDISSTAT
unsolicited message is similar to a ^NDISSTATQRY response, the patch
extends the ^NDISSTATQRY parser code to handle both ^NDISSTAT and
^NDISSTATQRY responses.
2013-09-18 11:37:19 +02:00
Ben Chan
9aced8311b huawei: ignore ^CONNECT unsolicited messages 2013-09-17 08:55:50 +02:00
Aleksander Morgado
0d96662a0a sim-huawei: fix refcount
g_async_result_get_source_object() returns a full reference, which needs to get
unref-ed when no longer used.
2013-09-10 09:47:50 +02:00
Dan Williams
73978cbe6f sim-huawei: add SIM class to handle ICCID request
Use AT^ICCID if possible to read the ICCID.
2013-09-10 09:42:37 +02:00
Aleksander Morgado
2968859525 huawei: check NDISDUP support in the port once
Don't query udev for the tag every time we recreate a bearer, just do it once.
For some reason, re-querying the same tag after the first time doesn't always
return the proper result.
2013-09-05 07:37:27 +02:00
Ben Chan
5120290705 huawei: fix uninitialized variable issues
This patch fixes the following uninitialized variable issues, which was
introduced in the previous commit "huawei: retry connect/disconnect attempt
upon ^NDISSTATQRY? failures" (commit 57c657bd06).

huawei/mm-broadband-bearer-huawei.c:127:9: error: variable 'ipv4_available' is used uninitialized whenever '||' condition is true
      [-Werror,-Wsometimes-uninitialized]
    if (!response ||
        ^~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:141:9: note: uninitialized use occurs here
    if (ipv4_available && ipv4_connected) {
        ^~~~~~~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:127:9: note: remove the '||' if its condition is always false
    if (!response ||
        ^~~~~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:115:28: note: initialize the variable 'ipv4_available' to silence this warning
    gboolean ipv4_available;
                           ^
                            = 0
huawei/mm-broadband-bearer-huawei.c:484:9: error: variable 'ipv4_available' is used uninitialized whenever '||' condition is true
      [-Werror,-Wsometimes-uninitialized]
    if (!response ||
        ^~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:498:9: note: uninitialized use occurs here
    if (ipv4_available && !ipv4_connected) {
        ^~~~~~~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:484:9: note: remove the '||' if its condition is always false
    if (!response ||
        ^~~~~~~~~~~~
huawei/mm-broadband-bearer-huawei.c:472:28: note: initialize the variable 'ipv4_available' to silence this warning
    gboolean ipv4_available;
                           ^
                            = 0
2013-09-05 07:34:39 +02:00
Prathmesh Prabhu
57c657bd06 huawei: retry connect/disconnect attempt upon ^NDISSTATQRY? failures
The Huawei MU736 modem sometimes responds to the ^NDISSTATQRY? query with a
'+CME ERROR: 100' error. This patch works around the issue by ignoring a few
of these error responses in a connect / disconnect attempt. The overall timeout
for the connect/disconnect operation is not affected by this change.
2013-09-04 09:05:19 +02:00
Ben Chan
0e64ba01d4 huawei: ignore ^DSDORMANT unsolicited messages 2013-09-02 09:10:32 +02:00
Aleksander Morgado
2b28b7acb6 at-serial-port: avoid 'enable_disable', use just 'enable' in method name 2013-08-26 16:21:27 +02:00
Ben Chan
82eb2158db huawei: ignore ^RFSWITCH unsolicited messages
This patch ignores the ^RFSWITCH unsolicited messages in order to avoid
them being mixed with other unsolicited messages. The modem power state
is explicitly determined by the ^RFSWITCH? command, if supported, so we
don't need to depend on the ^RFSWITCH unsolicited messages.
2013-08-26 16:00:20 +02:00
Ben Chan
3979939eaf huawei: ignore +CUSATP and +CUSATEND unsolicited messages 2013-08-26 15:58:21 +02:00
Ben Chan
3fcc908ed5 huawei: always parse operator name in +COPS responses as ASCII
Despite +CSCS? may claim supporting UCS2, Huawei modems always report
the oerator name in ASCII in a +COPS response. This patch addresses that
by always assuming the charset is IRA when parsing the operator name in a
+COPS response.
2013-08-26 15:57:04 +02:00
Aleksander Morgado
b61827f474 huawei: ignore ^NDISEND unsolicited messages 2013-08-21 11:16:15 +02:00
Aleksander Morgado
663d496968 huawei: improve ^NDISSTATQRY parser for newer firmware
Newer firmware for Huawei devices will not split the IPv4 and IPv6 info in
different lines for the ^NDISSTATQRY reply; instead they will be included in the
same line. E.g. instead of

     ^NDISSTATQRY: 1,,,IPV4
     ^NDISSTATQRY: 0,33,,IPV6
     OK

We may have:

     ^NDISSTATQRY:0,,,"IPV4",0,33,,"IPV6"

Also note the optional spaces after the ':', and that in the new version the
strings are enclosed in double quotes.

https://bugzilla.gnome.org/show_bug.cgi?id=705339
2013-08-15 19:09:51 +02:00
Ben Chan
34f6a2b63e huawei: implement modem reset via +CFUN=16 for MU736 2013-08-14 09:30:47 +02:00
Fangxiaozhi (Franko)
e778283f55 huawei: enlarge the checking times for ndisstatqry in disconnecting
In sometimes, the disconnection of NDISDUP will spend more time than 10s.
So it is better to enlarge the checking times, such as up to 60 times.
2013-08-12 09:04:43 +02:00
Ben Chan
a82acb34ec huawei: implement modem reset 2013-08-12 08:57:43 +02:00
Ben Chan
755c61a2ff huawei: ignore ^PDPDEACT unsolicited messages 2013-08-06 16:06:01 -05:00
Ben Chan
8ff3f6703a huawei: handle whitespace in RSSI responses
This patch modifies the regular expressions for parsing ^RSSI, ^RSSILVL,
and ^HRSSILVL responses to handle any whitespace that is inserted
between the colon and the RSSI value.

The issue is identified by Dan Williams <dcbw@redhat.com>
2013-08-06 16:05:37 -05:00
Ben Chan
f2fd4d8de0 huawei: implement modem power up and down
This patch is originally developed by:
  Franko Fang <fangxiaozhi@huawei.com>

And then reviewed and updated by:
  Ben Chan <benchan@chromium.org>
2013-08-05 22:51:22 -05:00
Ben Chan
48fbe1a242 huawei: reset disconnect_pending to NULL when ^NDISSTATQRY fails 2013-07-31 16:59:27 +02:00
Aleksander Morgado
0b2e04ed14 huawei: use ^NDISSTATQRY to check for connection status
Patch based on changes from Franko Fang <fangxiaozhi@huawei.com>.
2013-07-11 09:39:21 +02:00
Aleksander Morgado
8d0ec0fc24 huawei: new helper to parse ^NDISSTATQRY responses 2013-07-11 09:39:21 +02:00
Aleksander Morgado
e446db9ca4 huawei: default to IPv4 if no specific IP type to use given in NDISDUP modems 2013-06-05 19:15:15 +02:00
Aleksander Morgado
1c67d050cb api,introspection: merge 'AllowedModes' and 'SupportedMode' into 'CurrentModes'
We now have a single 'CurrentModes' property which contains both values in a
tuple with signature "(uu)".

Also, rename 'SetAllowedModes()' to 'SetCurrentModes()', and update the list of
arguments expected to have a single "(uu)" tuple.
2013-06-05 19:15:14 +02:00
Aleksander Morgado
45ceba7692 api,introspection: 'SupportedModes' is now a list of possible combinations
Instead of just a mask of MMModemMode values, we now provide a list of the
allowed and preferred mode combinations supported by the modem. E.g.:

$> sudo mmcli -m 0
  -------------------------
  Modes    |      supported: 'allowed: 2g; preferred: none
           |                  allowed: 3g; preferred: none
           |                  allowed: 2g, 3g; preferred: none
           |                  allowed: 2g, 3g; preferred: 2g
           |                  allowed: 2g, 3g; preferred: 3g
           |                  allowed: 4g; preferred: none
           |                  allowed: 2g, 3g, 4g; preferred: none'
2013-06-05 19:15:14 +02:00
Aleksander Morgado
212d00c529 api,instrospection: rename 'Bands' to 'CurrentBands'
... and 'SetBands()' to 'SetCurrentBands()'.

We'll keep the 'Current' keyword in those properties which also have
'Supported' values.
2013-06-05 19:15:14 +02:00
Aleksander Morgado
027d95506c huawei: use ^SYSINFOEX if available instead of ^SYSINFO
Newer Huawei modems, like the E3276 or the ME906 won't support ^SYSINFO, and we
should instead use the newer ^SYSINFOEX. By default, use ^SYSINFOEX when
available, as it provides more information than the plain ^SYSINFO.

E.g.:
    ^SYSINFOEX:2,3,0,1,,3,"WCDMA",41,"HSPA+"
    ^SYSINFOEX:2,3,1,1,1,3,”WCDMA”,46,”DC-HSPA+”
2013-05-09 17:56:38 +02:00
Aleksander Morgado
f96bb04c00 huawei: ignore ^NDISSTAT unsolicited messages
These messages give us information about the current connection status in the
NDIS interface. We already have other means to know this status, so we just
ignore the unsolicited message for now.

E.g.:
    ^NDISSTAT: 1,,,"IPV4"
2013-05-09 14:45:13 +02:00
Aleksander Morgado
cba3f7db65 huawei: ignore ^HCSQ unsolicited messages
Newer Huawei modems use ^HCSQ to report per-interface signal quality values,
but we don't know yet what each field means for each technology, so just ignore
them for now.

E.g.:
    ^HCSQ: "GSM", 53
    ^HCSQ: "WCDMA", 26, 24, 43
    ^HCSQ: "LTE", 40, 28, 216, 14

We also don't use this message to update current access technology information,
as it is not detailed enough (e.g. WCDMA doesn't specify whether it's plain UMTS
or HSDPA or HSPA+...)
2013-05-09 14:45:12 +02:00
Aleksander Morgado
cebe828f7f huawei: only expect custom inits to be run on tty ports 2013-04-25 10:34:19 +02:00
Aleksander Morgado
2e6ba7cd09 huawei: ensure error is set when ^CPIN response parser doesn't match 2013-04-25 09:36:51 +02:00
Aleksander Morgado
2e4a83628a huawei: allow MBIM devices 2013-04-17 15:19:38 +02:00
Dan Williams
f770ea43c2 huawei: fix up udev rules file name 2013-04-11 14:46:43 -05:00
Aleksander Morgado
a12d979373 huawei: increase the connection timeout to 60s 2013-04-09 18:42:46 +02:00
Aleksander Morgado
cb11bd09d6 huawei: plug memleak 2013-04-09 18:41:15 +02:00
Franko Fang
01400024cd huawei: add port type rules for modems 2013-04-09 18:41:15 +02:00
Franko Fang
9d4091cc89 huawei: flag modems which support NDISDUP 2013-04-09 18:41:14 +02:00
Aleksander Morgado
dff23f57b3 huawei: use a 3s timeout as after-sim-unlock step
Huawei e220 may fail miserably (rebooting itself) if we issue commands just
after having unlocked the PIN.
2013-04-08 18:10:01 +02:00
Aleksander Morgado
a7b8cbb71d port-probe: don't reschedule next probing step when serial port buffer full
When the serial port buffer gets full of non-AT garbage during port probing,
we were re-scheduling the next probing step, which is completely wrong, as we
then would be processing the same probing task twice. If we get a buffer full,
just cancel the AT probing cancellable, which would cancel not only the possible
AT probings, but also the custom init if there is any.

Also, make sure that the custom_init() of the plugins out there don't return an
error if the GCancellable is cancelled. Cancelling the GCancellable means we
should just stop the custom_init(), and actually sending an error in
custom_init() means that the port should be set as unsupported by the plugin, so
completely different things.

Should fix https://bugzilla.gnome.org/show_bug.cgi?id=696695
2013-03-29 12:33:20 +01:00
Aleksander Morgado
d6ac6508d9 plugin: explicitly request QMI probing
Plugins which may support QMI ports need to explicitly request QMI probing
in cdc-wdm devices. This should also avoid probing cdc-wdm ports when we know
that the plugin doesn't support them (e.g. with Ericsson MBM devices).

https://bugzilla.gnome.org/show_bug.cgi?id=696701
2013-03-28 17:33:08 +01:00
Aleksander Morgado
b6402a4e21 bearer,3gpp: dial operation specifies which data port to use
Instead of deciding in advance which data port to use, we let the dialling
operation gather it. For the generic dialling logic, ATD-based, always an
'AT' port will be used as data port, even if we grabbed a 'net' port. Those
plugins that can work with 'net' ports will grab the specific 'net' port
themselves.
2013-02-18 15:41:26 +01:00
Aleksander Morgado
15d34d56fd bearer: new helper 'MMBearerConnectResult' type
Instead of returning 3 variables in connect_finish(), return a single reference
counted struct. This simplifies how the result is built and passed within a
GSimpleAsyncResult to each _finish() method.

This also simplifies the dialling step in the 3GPP connection sequence, as we
can use the same new type.
2013-02-18 15:41:26 +01:00
Aleksander Morgado
2550cb20a9 huawei: only retry DHCP? check on specific errors
We don't want to retry DHCP? on every possible GError reported; specially if the
error is about the port being forced to get closed when the modem gets
unplugged or the like. So just retry on very specific errors reported.

The main cause for retry is really when the modem replies the following:
-->  AT^DHCP?
<--  ERROR

Which in our case gets translated to a 'unknown' mobile equipment error. We'll
also consider any kind of mobile equipment error, as the modems may reply a
CME ERROR instead.
2013-01-16 10:56:53 +01:00