Commit Graph

3500 Commits

Author SHA1 Message Date
Aleksander Morgado
bfa742ae13 broadband-modem-qmi: we don't support 3GPP2 messaging yet 2012-09-14 07:05:22 +02:00
Aleksander Morgado
e6a4c72ebc sms-qmi: handle sending/storing multipart SMS messages 2012-09-14 07:05:22 +02:00
Aleksander Morgado
3c814d74ca sms-part: create proper SUBMIT PDUs for multipart SMS messages
If the SMS part is from a multipart message we'll need to create a PDU with a
proper User Data Header.

This patch is based on a previous implementation by:
  Roberto Majadas <roberto.majadas@openshine.com>
2012-09-14 07:05:22 +02:00
Aleksander Morgado
3332ec0c68 sms: try to store/send all parts of a SMS message 2012-09-14 07:05:22 +02:00
Aleksander Morgado
b2b7fccdf5 sms: allow users to create multipart SMS messages 2012-09-14 07:05:22 +02:00
Aleksander Morgado
0edb58b738 sms: always export incomplete multipart SMS messages 2012-09-14 07:05:22 +02:00
Aleksander Morgado
e7b094ea3c sms-part: new util to split input text string into chunks to fit in PDUs 2012-09-14 07:05:22 +02:00
Aleksander Morgado
6b575cece0 sms-part: allow storing and accessing the user encoding info of an SMS part 2012-09-14 07:05:22 +02:00
Aleksander Morgado
cb0ce9c6ca sms: either 'text' or 'data' is mandatory 2012-09-14 07:05:22 +02:00
Aleksander Morgado
c2b246414c iface-modem-3gpp: update state to REGISTERED after loading operator code/name
Call managers all want to be able to set the operator ID and/or name as soon as
we get registered. We will consider now that whenever we get into registered
state we already have operator code and name updated to the proper values.

Applications shouldn't, though, just rely on those values to be valid as long as
we're registered, as the modem may re-register automatically in some other
network (e.g. going from a roaming network to the home network).

This change involves not setting the state to REGISTERED until operator name
and code loading sequences have been run. We will still signal in the log the
change, with a new 'registering' intermediate state indication.
2012-09-14 06:43:49 +02:00
Aleksander Morgado
40816e5c90 broadband-modem-qmi: don't update access technology from operator info
The operator info seems to show what the operator can do; it doesn't show the
current access technology.
2012-09-13 16:06:51 +02:00
Aleksander Morgado
4b906f7996 broadband-modem-qmi: update access technology along with signal quality 2012-09-13 15:20:50 +02:00
Aleksander Morgado
0080a0d023 broadband-modem-qmi: handle SEARCHING registration state 2012-09-13 15:20:42 +02:00
Dan Williams
210af3241c core: fix a leak in "core: better handling of non-UCS2 conversions that should be UCS2 (bgo #683817)" 2012-09-12 23:03:59 -05:00
Dan Williams
c524734d9f core: better handling of non-UCS2 conversions that should be UCS2 (bgo #683817)
Some modems return the +COPS operator name in hex-encoded current
character set (as set with +CSCS).  Others return the operator name
in ASCII when set to UCS2, while yet others return the  ASCII name
with trash at the end (*cough* Huawei *cough*).  Handle that better
by not crashing.
2012-09-12 23:03:58 -05:00
Aleksander Morgado
73ced242da api: remove `Completed' signal from the Messaging interface
This signal is no longer needed, as the individual state changes of the SMS
objects are enough to know their correct status of completion.

See https://bugzilla.gnome.org/show_bug.cgi?id=675178
2012-09-12 08:00:24 +02:00
Aleksander Morgado
ea87a4556e sms: fix full data setting with `g_variant_new_from_data()'
The `g_variant_new_from_data()' method uses the original array during its
operation, so we need to make sure it is valid as long as the method needs
it, or we'll end up with Valgrind complaining a bit:

==4834== Invalid read of size 1
==4834==    at 0x36ADC75DA5: g_variant_get_byte (in /usr/lib64/libglib-2.0.so.0.3200.4)
==4834==    by 0x3161ABED8C: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161ABEEA2: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161ABE844: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161ABE91E: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161ABEEA2: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161AC232E: g_dbus_message_to_blob (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161AB750A: ??? (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161AB9FEF: g_dbus_connection_send_message (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x3161ABDB22: g_dbus_connection_emit_signal (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x4C5B8BD: _mm_gdbus_sms_emit_changed (mm-gdbus-sms.c:2291)
==4834==    by 0x36ADC47694: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3200.4)
==4834==  Address 0x939efa0 is 0 bytes inside a block of size 512 free'd
==4834==    at 0x4A079AE: free (vg_replace_malloc.c:427)
==4834==    by 0x36ADC4D37E: g_free (in /usr/lib64/libglib-2.0.so.0.3200.4)
==4834==    by 0x36ADC1CF40: ??? (in /usr/lib64/libglib-2.0.so.0.3200.4)
==4834==    by 0x43C88E: assemble_sms (mm-sms.c:1260)
==4834==    by 0x43CAD6: mm_sms_multipart_take_part (mm-sms.c:1329)
==4834==    by 0x43E2EF: take_multipart (mm-sms-list.c:268)
==4834==    by 0x43E546: mm_sms_list_take_part (mm-sms-list.c:328)
==4834==    by 0x454C8F: mm_iface_modem_messaging_take_part (mm-iface-modem-messaging.c:353)
==4834==    by 0x461DF6: sms_pdu_part_list_ready (mm-broadband-modem.c:5007)
==4834==    by 0x3161A6CFB6: g_simple_async_result_complete (in /usr/lib64/libgio-2.0.so.0.3200.4)
==4834==    by 0x432F82: at_command_parse_response (mm-base-modem-at.c:490)
==4834==    by 0x489F96: handle_response (mm-at-serial-port.c:161)
2012-09-11 16:40:21 +02:00
Ben Chan
36c7136510 novatel-lte: implement modem reset 2012-09-11 08:47:07 +02:00
Ben Chan
776d755d77 iface-modem-3gpp-ussd: avoid update if object skeleton is NULL 2012-09-10 09:28:06 +02:00
Dan Williams
8213a09a34 broadband-modem-qmi: set network port to 802.3/no-QoS mode
The kernel drivers expect this mode, so make sure we set it.
2012-09-08 10:41:01 +02:00
Ben Chan
5f1a1cf834 icera: increase timeout for +CFUN=4 2012-09-08 10:21:56 +02:00
Ben Chan
1252572607 novatel-lte: set default SMS storage to 'SM'
Novatel E362 LTE modem only supports 'SM' and 'SR', but not 'ME'.
2012-09-08 10:19:01 +02:00
Aleksander Morgado
2ca6d62856 broadband-modem: clear error properly as it may be re-used
Avoids this kind of issues:

[mm-sms-list.c:334] mm_sms_list_take_part(): SMS part at 'me/0' is from a singlepart SMS
[mm-iface-modem-messaging.c:475] sms_added(): Added received SMS at '/org/freedesktop/ModemManager1/SMS/31'
[mm-broadband-modem.c:4791] sms_pdu_part_list_ready(): Error parsing PDU (1): PDU too short (2): 41 < 79

GLib-WARNING **: GError set over the top of a previous GError or uninitialized memory.
This indicates a bug in someone's code. You must ensure an error is NULL before it's set.
The overwriting error message was: PDU too short (3): 28 < (210 + 14), user data length: '203'

[mm-broadband-modem.c:4791] sms_pdu_part_list_ready(): Error parsing PDU (2): PDU too short (3): 28 < (210 + 14), user data length: '203'
2012-09-07 13:13:14 +02:00
Aleksander Morgado
a973825eac sms: multipart sequence starts with 1; singlepart is always 0 2012-09-07 12:20:14 +02:00
Aleksander Morgado
f2cc69bc7f cli: include both current and modem capabilities in modem report 2012-09-07 11:19:46 +02:00
Aleksander Morgado
997848ef4f broadband-modem-qmi: try to use Band Preference for current caps if available
The "NAS Get System Selection Preference" response may come without "Mode
Preference". If that is found, look for "Band Preference" and "LTE Band
Preference" TLVs and try to build capabilities from those.

This makes my UML290 properly report CDMA/EVDO+LTE capabilities:

ModemManager[16586]: [/dev/cdc-wdm0] Received message...
>>>>>> QMUX:
>>>>>>   length  = 55
>>>>>>   flags   = 0x80
>>>>>>   service = "nas"
>>>>>>   client  = 1
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 1
>>>>>>   tlv_length  = 43
>>>>>>   message     = "Get System Selection Preference" (0x0034)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Emergency mode" (0x10)
>>>>>>   length     = 1
>>>>>>   value      = 00
>>>>>>   translated = 0
>>>>>> TLV:
>>>>>>   type       = "Band Preference" (0x12)
>>>>>>   length     = 8
>>>>>>   value      = 07:00:00:00:00:00:00:00
>>>>>>   translated = 7
>>>>>> TLV:
>>>>>>   type       = "CDMA PRL Preference" (0x13)
>>>>>>   length     = 2
>>>>>>   value      = FF:3F
>>>>>>   translated = 16383
>>>>>> TLV:
>>>>>>   type       = "Roaming Preference" (0x14)
>>>>>>   length     = 2
>>>>>>   value      = FF:00
>>>>>>   translated = 255
>>>>>> TLV:
>>>>>>   type       = "LTE Band Preference" (0x15)
>>>>>>   length     = 8
>>>>>>   value      = 00:00:00:00:00:00:00:00
>>>>>>   translated = 0
ModemManager[16586]: KEY: 01:00:01:03:00:00:00:00
ModemManager[16586]:   Service: 03
ModemManager[16586]:   Client ID: 01
ModemManager[16586]:   Transaction ID: 01:00
ModemManager[16586]: <debug> [1347005734.979115] [mm-broadband-modem-qmi.c:321] load_current_capabilities_get_system_selection_preference_ready(): Mode preference not reported in system selection preference
ModemManager[16586]: <debug> [1347005734.979131] [mm-broadband-modem-qmi.c:333] load_current_capabilities_get_system_selection_preference_ready(): Valid bands reported in system selection preference: 'bc-0-a-system, bc-0-b-system, bc-1-all-blocks'
ModemManager[16586]: <debug> [1347005734.979141] [mm-broadband-modem-qmi.c:341] load_current_capabilities_get_system_selection_preference_ready(): LTE band preference found
ModemManager[16586]: [/dev/cdc-wdm0] Sending message...
<<<<<< QMUX:
<<<<<<   length  = 12
<<<<<<   flags   = 0x00
<<<<<<   service = "dms"
<<<<<<   client  = 1
<<<<<< QMI:
<<<<<<   flags       = "none"
<<<<<<   transaction = 1
<<<<<<   tlv_length  = 0
<<<<<<   message     = "Get Capabilities" (0x0020)
ModemManager[16586]: KEY: 01:00:01:02:00:00:00:00
ModemManager[16586]:   Service: 02
ModemManager[16586]:   Client ID: 01
ModemManager[16586]:   Transaction ID: 01:00
ModemManager[16586]: <debug> [1347005734.982676] [mm-at-serial-port.c:392] debug_log(): (ttyACM0): <-- '<CR><LF>OK<CR><LF>'
ModemManager[16586]: <debug> [1347005734.982751] [mm-serial-port.c:969] mm_serial_port_close(): (ttyACM0) device open count is 2 (close)
ModemManager[16586]: <debug> [1347005734.982797] [mm-at-serial-port.c:392] debug_log(): (ttyACM0): --> 'AT+CMEE=1<CR>'
ModemManager[16586]: [/dev/cdc-wdm0] Received message...
>>>>>> QMUX:
>>>>>>   length  = 38
>>>>>>   flags   = 0x80
>>>>>>   service = "dms"
>>>>>>   client  = 1
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 1
>>>>>>   tlv_length  = 26
>>>>>>   message     = "Get Capabilities" (0x0020)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Info" (0x01)
>>>>>>   length     = 16
>>>>>>   value      = B0:9D:57:00:00:DD:6D:00:03:02:05:01:02:04:05:08
>>>>>>   translated = [ max_tx_channel_rate = '5742000' max_rx_channel_rate = '7200000' data_service_capability = '3' sim_capability = '2' radio_interface_list = '{ [0] = '1 ' [1] = '2 ' [2] = '4 ' [3] = '5 ' [4] = '8 '}' ]
ModemManager[16586]: KEY: 01:00:01:02:00:00:00:00
ModemManager[16586]:   Service: 02
ModemManager[16586]:   Client ID: 01
ModemManager[16586]:   Transaction ID: 01:00
ModemManager[16586]: <debug> [1347005734.983353] [mm-broadband-modem-qmi.c:183] modem_load_current_capabilities_finish(): loaded current capabilities: cdma-evdo, lte
2012-09-07 11:19:26 +02:00
Aleksander Morgado
c2952e0adc broadband-modem-qmi: don't always trust the current capabilities reported by SSP
Sometimes the 'Mode Preference' TLV in the SSP response will have incorrect
values. The following log is for a Gobi3k modem which is *only* GMS/UMTS.

ModemManager[13415]: [/dev/cdc-wdm0] Received message...
>>>>>> QMUX:
>>>>>>   length  = 44
>>>>>>   flags   = 0x80
>>>>>>   service = "nas"
>>>>>>   client  = 2
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 1
>>>>>>   tlv_length  = 32
>>>>>>   message     = "Get System Selection Preference" (0x0034)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Emergency mode" (0x10)
>>>>>>   length     = 1
>>>>>>   value      = 00
>>>>>>   translated = 0
>>>>>> TLV:
>>>>>>   type       = "Mode Preference" (0x11)
>>>>>>   length     = 2
>>>>>>   value      = 0F:00
>>>>>>   translated = 15
>>>>>> TLV:
>>>>>>   type       = "Band Preference" (0x12)
>>>>>>   length     = 8
>>>>>>   value      = FF:FF:FF:3F:FF:FF:FF:FF
>>>>>>   translated = 18446744070488326143
>>>>>> TLV:
>>>>>>   type       = "Roaming Preference" (0x14)
>>>>>>   length     = 2
>>>>>>   value      = FF:00
>>>>>>   translated = 255

Instead of setting to '1' only the bits related to GSM/UMTS in the "Mode
Preference" TLV, the modem sets all the bits it knows of to '1', including the
CDMA/EVDO ones. It is not easy to detect this properly, because the modem didn't
set to '1' the bits it didn't know of (e.g. LTE or TD-SCDMA), so we *cannot*
assume that 0x000F actually means 'unknown'.

So, we now will pass these returned values through the "DMS Get Capabilities"
filter, as we did for the Technology Preference result. The final reported
current capabilities will be either:
 * The intersection between the capabilities loaded by "NAS Get System Selection
   Preference" and "DMS Get Capabilities" or,
 * The intersection between the capabilities loaded by "NAS Get Technology
   Preference" and "DMS Get Capabilities".

For 'modem' (not 'current') capabilities, we still rely only on "DMS Get
Capabilities".
2012-09-07 09:51:20 +02:00
Aleksander Morgado
ebc7b3dc70 sms-qmi: implement SMS part deleting 2012-09-06 19:58:03 +02:00
Aleksander Morgado
a8ec884931 sms-qmi: implement singlepart SMS sending 2012-09-06 19:58:02 +02:00
Aleksander Morgado
d3b632c7a8 sms-qmi: implement singlepart SMS storage 2012-09-06 19:58:02 +02:00
Aleksander Morgado
bdf4df2b6b sms-qmi: new `MMSmsQmi' object 2012-09-06 19:58:02 +02:00
Aleksander Morgado
912eea79ef broadband-modem-qmi: implement unsolicited messaging events setup/cleanup 2012-09-06 19:58:02 +02:00
Aleksander Morgado
3db1094e41 broadband-modem-qmi: implement unsolicited messaging events enabling/disabling 2012-09-06 19:58:02 +02:00
Aleksander Morgado
249ec8955c broadband-modem-qmi: minor indentation fix 2012-09-06 19:58:02 +02:00
Aleksander Morgado
0fb980a28a broadband-modem-qmi: load initial SMS parts using QMI 2012-09-06 19:58:02 +02:00
Aleksander Morgado
454b0e1c33 broadband-modem-qmi: implement default storage setting using QMI 2012-09-06 19:58:02 +02:00
Aleksander Morgado
26596b1615 broadband-modem-qmi: no need to setup SMS format, always in PDU mode 2012-09-06 19:58:02 +02:00
Aleksander Morgado
88942a5f1b broadband-modem-qmi: QMI enabled modems have SM and ME messaging storages 2012-09-06 19:58:02 +02:00
Aleksander Morgado
9235a24c11 broadband-modem-qmi: if WMS service is available Messaging is supported 2012-09-06 19:58:02 +02:00
Aleksander Morgado
018d9b458f sms: set state back to UNKNOWN when all SMS parts were deleted 2012-09-06 19:58:02 +02:00
Aleksander Morgado
c9a80609d4 sms: transition from Unknown|Stored to Sent when the SMS is sent 2012-09-06 19:58:02 +02:00
Aleksander Morgado
a5266406ba sms: use property accessors from parent MmGdbusSms when it simplifies things 2012-09-06 19:58:02 +02:00
Aleksander Morgado
8fd02318ec sms: transition from Unknown to Stored in user-created SMS objects 2012-09-06 19:58:02 +02:00
Aleksander Morgado
b03985a019 sms: user-created SMS objects will have either 'text' or 'data' 2012-09-06 19:58:02 +02:00
Aleksander Morgado
39e819788d libmm-common,sms-properties: handle the 'data' property for SMS 2012-09-06 19:58:02 +02:00
Aleksander Morgado
163e167543 sms-part: beware of NULL input data 2012-09-06 19:58:02 +02:00
Aleksander Morgado
98f588867c sms: allow getting list of parts 2012-09-06 19:58:02 +02:00
Aleksander Morgado
a90d149ce4 sms: SMS objects need to be create by `create_modem()' in the Messaging iface
So that plugins can subclass the generic SMS object.
2012-09-06 19:58:01 +02:00
Aleksander Morgado
11740e9075 iface-modem-messaging: plug memleak 2012-09-06 13:16:29 +02:00
Aleksander Morgado
db457fdb46 sms: fix setting full text in object 2012-09-06 13:14:42 +02:00