Commit Graph
3124 Commits
Author SHA1 Message Date
Aleksander Morgado 595bd5dbe3 port-serial: remove all default flow control settings
We won't set XON/XOFF by default and we won't allow setting RTS/CTS
via a property. The serial port by default starts with no flow control
configured.
2017-04-18 18:08:57 +02:00
Aleksander Morgado 580c113c5a port-serial: new method to explicitly set flow control settings 2017-04-18 18:08:57 +02:00
Aleksander Morgado 3223b56ba9 port-serial: new internal method to run tcsetattr()
The method takes care of looping if EAGAIN errors happen, as well as
checking whether all attributes were set or not.
2017-04-18 18:08:57 +02:00
Aleksander Morgado 91391eb460 broadband-modem: query supported flow control modes before setting
Instead of assuming XON/XOFF is supported, we query the supported flow
control modes, and then we set the best one based on that, preferring
hardware flow control over software flow control.
2017-04-18 18:08:57 +02:00
Aleksander Morgado 973c7d0970 helpers: new parser for AT+IFC=?
Instead of having the parser return separate list of supported flow
controls for TE and TA, we simplify it by only returning those
settings that apply to both TE and TA.

This logic isn't perfect either, though, as some settings (e.g. '3' in
TE in some modems, specifying a different XON/XOFF behavior) may not
have a corresponding setting in the other end.

The most common cases we care about (i.e. standard XON/XOFF, RTS/CTS)
should be properly reported with this logic.
2017-04-18 18:08:57 +02:00
Dan Williams 75d9c0bc95 broadband-modem: open QCDM port for CDMA Serving System checking when needed 2017-04-17 11:59:13 -05:00
Dan Williams 5c94c8cc6d broadband-modem: open QCDM port for Call Manager state checking when needed 2017-04-17 11:59:13 -05:00
Dan Williams 3901ceade1 broadband-modem: open QCDM port for HDR state checking when needed 2017-04-17 11:59:13 -05:00
Dan Williams 355a594223 broadband-modem: open QCDM port for access tech checking when needed 2017-04-17 11:59:13 -05:00
Dan Williams aa87775a81 broadband-modem: open QCDM port for signal checking when needed 2017-04-17 11:59:13 -05:00
Ben Chan 01cba808e4 iface-modem-signal: port mm_iface_modem_signal_initialize to use GTask 2017-04-15 23:05:32 +02:00
Ben Chan ed8bea8a3c iface-modem-signal: port mm_iface_modem_signal_enable to use GTask 2017-04-15 23:00:10 +02:00
Ben Chan ca89a4c038 iface-modem-signal: port mm_modem_iface_signal_disable to use GTask 2017-04-15 22:59:32 +02:00
Ben Chan 23b67db7c9 base-call: remove unnecessary string duplications 2017-04-08 12:42:39 +02:00
Ben Chan b65819e6ad port-mbim: port mm_port_mbim_{open,close} to use GTask 2017-04-08 12:42:30 +02:00
Ben Chan 26ee94ec28 port-qmi: port mm_port_qmi_allocate_client to use GTask 2017-04-08 12:38:21 +02:00
Aleksander Morgado 9667d037fd polkit: fix build when polkit enabled
This fixes the build after commit 740ce1fb26.

      CC       ModemManager-mm-auth-provider-polkit.o
    ../../src/mm-auth-provider-polkit.c: In function ‘authorize’:
    ../../src/mm-auth-provider-polkit.c:155:46: error: ‘AuthorizeContext’ has no member named ‘cancellable’
                                               ctx->cancellable,
                                                  ^
    Makefile:1533: recipe for target 'ModemManager-mm-auth-provider-polkit.o' failed
2017-04-07 11:13:27 +02:00
Ben Chan 374c65a520 sms-mbim: port sms_delete to use GTask 2017-04-07 11:07:01 +02:00
Ben Chan 59a6bcbb1b sms-mbim: port sms_send to use GTask 2017-04-07 11:05:00 +02:00
Ben Chan e661ba077f port-qmi: port mm_port_qmi_open to use GTask 2017-04-07 11:00:27 +02:00
Ben Chan a080644924 call-list: port mm_call_list_delete_call to use GTask 2017-04-07 10:43:32 +02:00
Ben Chan 21195f8e54 sms-list: port mm_sms_list_delete_sms to use GTask 2017-04-07 10:41:32 +02:00
Ben Chan 740ce1fb26 polkit: port authorize to use GTask 2017-04-07 10:38:38 +02:00
Ben Chan 1755d1a5c3 auth: port authorize to use GTask 2017-04-07 10:38:25 +02:00
Ben Chan 665e227918 iface-modem-simple: port register_in_3gpp_or_cdma_network to use GTask 2017-04-06 21:27:00 +02:00
Ben Chan e0bca5509e bearer-list: port mm_bearer_list_disconnect_all_bearers to use GTask 2017-04-06 21:24:13 +02:00
Ben Chan 6ced121ce1 base-modem: port mm_base_modem_authorize to use GTask 2017-04-06 20:26:17 +02:00
Thomas Voß 34443289d9 mbim-modem: disable location interface
MBIM does not support 3gpp location data right now. For that,
we make sure that the location interface is not reported as
supported by MBIM modems.
2017-04-02 10:33:23 +02:00
Aleksander Morgado fba49d8d00 broadband-modem: normalize also operator code
The operator code (MCCMNC) may also be given encoded in the current
charset (e.g. UCS2).

Based on a patch from Colin Helliwell <colin.helliwell@ln-systems.com>
2017-04-02 10:06:13 +02:00
Aleksander Morgado f824602bdd modem-helpers: if operator not in UCS2, see if already valid UTF-8
The method doing the operator name normalization takes as input the
current configured modem charset. If this is UCS2, we will now just
assume this is a hint: the string may or may not come in hex/UCS2.

This logic makes the custom operator name loading in Huawei unneeded,
if the modem is configured in UCS2, we still properly process operator
names coming in plain ASCII.
2017-04-02 10:06:07 +02:00
Aleksander Morgado 822bfa4ca1 base-manager: fix segfault when using already disposed MMDevice
Since commit e9d0989ed0, the MMDevice may be removed from the
tracking hash table when the support check operation fails to create a
modem object.

If this failure happens due to the port probe cancellations requested
during the udev removal event for a given device port, we would end up
using an already disposed object and triggering a segfault.

This fix just makes sure a full valid reference to the MMDevice object
is kept around until we're done using it.

     [mm-base-manager.c:216] device_removed(): (usbmisc/cdc-wdm1): released by device '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.4'
     [mm-plugin-manager.c:1131] device_context_port_released(): [plugin manager] task 5: port released: cdc-wdm1
     [mm-base-manager.c:216] device_removed(): (tty/ttyACM0): released by device '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.4'
     [mm-plugin-manager.c:1131] device_context_port_released(): [plugin manager] task 5: port released: ttyACM0
     [mm-base-manager.c:221] device_removed(): Removing empty device '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.4'
     [mm-plugin-manager.c:1219] device_context_cancel(): [plugin manager) task 5: cancellation requested
     [mm-plugin-manager.c:979] device_context_continue(): [plugin manager] task 5: no more ports to probe
     [mm-plugin-manager.c:813] device_context_complete(): [plugin manager] task 5: finished in '0.090510' seconds
     [mm-base-manager.c:172] device_support_check_ready(): Couldn't check support for device '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.4': Operation was cancelled
     [mm-base-manager.c:223] device_removed(): Device support check has been cancelled

    Thread 1 "ModemManager" received signal SIGSEGV, Segmentation fault.
    0x00007ffff6543c50 in g_str_hash () from /usr/lib/libglib-2.0.so.0
    (gdb) bt
    #0  0x00007ffff6543c50 in g_str_hash () at /usr/lib/libglib-2.0.so.0
    #1  0x00007ffff6542b2d in  () at /usr/lib/libglib-2.0.so.0
    #2  0x0000000000439675 in device_removed (self=0x770900, kernel_device=0x763e60) at mm-base-manager.c:225
    #3  0x0000000000439e70 in handle_uevent (client=0x769c20, action=0x81d910 "remove", device=0x7fffe4001c40, user_data=0x770900) at mm-base-manager.c:415
    #4  0x00007ffff54c61c8 in ffi_call_unix64 () at /usr/lib/libffi.so.6
    #5  0x00007ffff54c5c2a in ffi_call () at /usr/lib/libffi.so.6
    #6  0x00007ffff682d7ae in g_cclosure_marshal_generic ()
        at /usr/lib/libgobject-2.0.so.0
    #7  0x00007ffff682cf75 in g_closure_invoke () at /usr/lib/libgobject-2.0.so.0
    #8  0x00007ffff683ef82 in  () at /usr/lib/libgobject-2.0.so.0
    #9  0x00007ffff6847bcc in g_signal_emit_valist ()
        at /usr/lib/libgobject-2.0.so.0
    #10 0x00007ffff6847faf in g_signal_emit () at /usr/lib/libgobject-2.0.so.0
    #11 0x00007ffff7023c74 in  () at /usr/lib/libgudev-1.0.so.0
    #12 0x00007ffff655445a in g_main_context_dispatch ()
        at /usr/lib/libglib-2.0.so.0
    #13 0x00007ffff6554810 in  () at /usr/lib/libglib-2.0.so.0
    #14 0x00007ffff6554b32 in g_main_loop_run () at /usr/lib/libglib-2.0.so.0
    #15 0x0000000000437bf5 in main (argc=2, argv=0x7fffffffeb28) at
    main.c:180

    (gdb) fr 2
    #2  0x0000000000439675 in device_removed (self=0x770900, kernel_device=0x763e60) at mm-base-manager.c:225
    225	                g_hash_table_remove (self->priv->devices, mm_device_get_uid (device));

    (gdb) p mm_device_get_uid (device)
    $1 = (const gchar *) 0x0

    (gdb) p *device
    $3 = {parent = {g_type_instance = {g_class = 0x0}, ref_count = 0, qdata = 0x0}, priv = 0x7feb20}
2017-03-30 21:36:33 +02:00
Ben Chan 27e4c74c60 core: reset GList pointers to NULL when necessary
When calling g_list_free_full() to free a GList in dispose(), it is
necessary to reset the GList pointer to NULL as dispose() may be called
more than once.
2017-03-29 10:22:37 +02:00
Ben Chan 9823d9d6f6 core: remove explicit GDestroyNotify cast on g_free / g_object_unref
g_free and g_object_unref are in form of  `void (*)(gpointer)`, which
matches the GDestroyNotify signature. An explicit GDestroyNotify cast on
g_free and g_object_unref is thus not needed.
2017-03-29 10:22:05 +02:00
Ben Chan 3c4c983642 base-bearer: fix typo in 'bearer-default-ip-family' property name 2017-03-28 22:46:35 +02:00
Carlo Lobrano eee6896648 broadband-modem: fixed wrong MEM1 value passed to +CPMS
In functions

- mm_broadband_modem_lock_sms_storages
- modem_messaging_set_default_storage

return with error when using current_sms_mem1_storage as +CPMS value, but
current_sms_mem1_storage value is UNKNOWN.
2017-03-28 11:02:58 +02:00
Aleksander Morgado 15d135b9c4 base-bearer: stop connection status monitoring if no TTY available
On modems with a single TTY for both control and data, we cannot use
the TTY to load connection status once we're in connected mode:

    Connection through a plain serial AT port (ttyUSB2)
    (ttyUSB2): --> 'ATD*99***2#<CR>'
    (ttyUSB2): <-- '<CR><LF>CONNECT 100000000<CR><LF>'
    (ttyUSB2): port now connected
    Connected bearer '/org/freedesktop/ModemManager1/Bearer/0'
    Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connecting -> connected)
    Simple connect state (8/8): All done
    checking if connected failed: Couldn't check current list of active PDP contexts: No AT port available to run command
    checking if connected failed: Couldn't check current list of active PDP contexts: No AT port available to run command
    checking if connected failed: Couldn't check current list of active PDP contexts: No AT port available to run command
    ...

So, disable connection monitoring right away if that situation is
detected:

    Connection through a plain serial AT port (ttyUSB2)
    (ttyUSB2): --> 'ATD*99***2#<CR>'
    (ttyUSB2): <-- '<CR><LF>CONNECT 100000000<CR><LF>'
    (ttyUSB2): port now connected
    Connected bearer '/org/freedesktop/ModemManager1/Bearer/0'
    Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connecting -> connected)
    Simple connect state (8/8): All done
    Connection monitoring is unsupported by the device
    ...

https://bugs.freedesktop.org/show_bug.cgi?id=100376
2017-03-24 21:49:23 +01:00
Aleksander Morgado dd1e281e82 broadband-bearer: set TTY as connected as soon as ATD replies
When the connection request is done via ATD, flag the port as
connected as soon as the successful response is received, so that we
remove our polling on the device right away.

https://bugs.freedesktop.org/show_bug.cgi?id=99541
2017-03-24 21:40:12 +01:00
Aleksander Morgado bc4cbbe6cf broadband-modem: fix capabilities in 4G-only devices
The +CGSM capability is saying that the modem is a 3GPP modem, but
that doesn't necessarily mean it's a GSM/UMTS modem, it could be a
LTE-only device.

We did add the GSM_UMTS capability when +CGSM was found, so now we'll
check if the device only reports 4G-only mode, and remove the
capability if so.

https://bugs.freedesktop.org/show_bug.cgi?id=100155
2017-03-24 21:29:59 +01:00
Aleksander Morgado 1600911439 broadband-modem,helpers: implement AT+WS46=? response parser
We want a parser that returns the full list of combinations found.
2017-03-24 21:28:34 +01:00
Aleksander Morgado 11a26f1066 serial: allow specifying baudrate to use via udev tags
A new 'ID_MM_TTY_BAUDRATE' per-port udev tag is introduced, which
allows specifying the baudrate that will be used when opening a
specific serial port.

E.g.:

    ACTION!="add|change|move", GOTO="mm_my_modem_end"
    DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/*", ENV{ID_MM_TTY_BAUDRATE}="115200"
    LABEL="mm_my_modem_end"

https://bugs.freedesktop.org/show_bug.cgi?id=100158
2017-03-22 09:40:14 +01:00
Aleksander Morgado 00fb9e98f6 kernel-device: device-specific properties in either port or physdev
There are 2 main types of udev properties: device-specific and
port-specific.

The port-specific properties are set independently per port (e.g. port
type hints set per interface number for a given vid:pid).

The device-specific properties apply to all ports in the device. Some
of these properties are currently expected in the physical device
(e.g. ID_MM_PLATFORM_DRIVER_PROBE) while some others are expected in
each port (e.g. the plugin udev tag filters).

This patch tries to simplify the logic and just assume that the device
specific tags may be given in either the physical device or the port
device, by providing separate APIs to retrieve port-specific or
device-specific (global) properties. If the same tag is given in both
the device and the port, the one in the device takes preference.

For the generic backend, these new APIs are really useless, as all
device-specific and port-specific properties are always stored in the
port object themselves (there is no 'tree' of devices in the generic
backend, no 'physdev' device).

For the udev backend, though, there really is a difference, as the
tags may be set in port or device.

https://bugs.freedesktop.org/show_bug.cgi?id=100156
2017-03-22 09:40:10 +01:00
Dan Williams 230e732a24 iface-modem-3gpp: use mm_3gpp_parse_operator_id() instead of custom code 2017-03-17 22:48:39 -05:00
Aleksander Morgado 875ade3e41 iface-modem: improve network registration checks for LTE devices
If a device reports "LTE" in the list of current capabilities, we'll
set EPS network supported by default. This will enable CEREG
registration checks for AT based devices.

If a device reports only "LTE" in the list of current capabilities, we
disable all the other network support flags (e.g. will disable CREG
and CGREG checks among others).

https://bugs.freedesktop.org/show_bug.cgi?id=100170
2017-03-16 22:18:29 +01:00
Aleksander Morgado e9d0989ed0 base-manager: remove MMDevice if support check fails
If the device support check fails, either with an error, or afterwards
when trying to create a modem object, we must remove the MMDevice from
the tracking table of devices, so that a manual scan request
afterwards re-scans all ports.

https://bugs.freedesktop.org/show_bug.cgi?id=100157
2017-03-11 12:52:15 +01:00
Ben Chan 73bfe94643 device: add null check on `self->priv->modem' in clear_modem
clear_modem() can be invoked from set_property() and dispose(), where
`self->priv->modem' may be NULL. This patch adds a null check on the
modem object to make sure we don't run g_object_run_dispose() on a null
modem object.
2017-03-03 21:37:18 +01:00
Ben Chan f0cda20930 kernel-device: use device sysfs if physdev sysfs isn't available
find_device_by_physdev_uid() expects a non-NULL UID of the physical
device. However, mm_kernel_device_get_physdev_uid() could potentially
return NULL on MMKernelDeviceUdev if find_physical_gudevdevice() in
mm-kernel-device-udev.c fails to find the physical device. When a NULL
physical device UID is passed to find_device_by_physdev_uid() and used
in g_hash_table_lookup(), it leads to a crash in g_str_hash(), which is
a bit obscure.

This patch updates kernel_device_get_physdev_uid() in
mm-kernel-device-udev.c to fall back to use the device sysfs if the
physical device sysfs isn't available, which is similar to how
kernel_device_get_physdev_uid() mm-kernel-device-generic.c is
implemented.
2017-03-03 07:26:59 +01:00
Dan Williams 8c3312918a bearer-qmi: add WDS event reporting support
Don't do anything with the events yet, but at least turn them on
and capture them in debug logging.
2017-03-01 12:57:48 -06:00
Aleksander Morgado 7a048acd44 broadband-modem-mbim: disable parent access tech loading
The parent method would use QCDM to load access tech, but we already
have the access tech reported in MBIM via indications, so no real need
to mix that.

For context, see:
https://bugs.freedesktop.org/show_bug.cgi?id=100000
2017-03-01 18:43:45 +01:00
Ben Chan f10065d03c kernel-device: simplify handling of platform/pci/pnp/sdio parent
This patch simplifies the handling of platform/pci/pnp/sdio device in
find_physical_gudevdevice(). When the code finds the first parent device
under the subsystem 'platform', 'pci', 'pnp', or 'sdio', it stops
traversing up the device tree, so there is no need to keep track of
whether a platform / pci / pnp / sdio device has previously been visited
via those is_platform/is_pci/is_pnp/is_sdio Boolean variables.
2017-03-01 09:30:07 -06:00
Ben Chan 66b3367cf8 kernel-device: handle SDIO device in find_physical_gudevdevice
A few crashes have been observed in the field with the following signature:

  Thread 0 CRASHED [SIGSEGV @ 0x00000000 ] MAGIC SIGNATURE THREAD
  0xf53ff5e8  (libglib-2.0.so.0.3600.4 -ghash.c:1732 )  g_str_hash
  0xf53fe8c7  (libglib-2.0.so.0.3600.4 -ghash.c:365 ) g_hash_table_lookup
  0xb953c3bd  (ModemManager -mm-base-manager.c:130 )  device_removed
  0xb953cc9f  (ModemManager -mm-base-manager.c:408 )  handle_uevent
  0xf54c535f  (libgobject-2.0.so.0.3600.4 -gclosure.c:777 ) g_closure_invoke
  0xf54d6fc7  (libgobject-2.0.so.0.3600.4 -gsignal.c:3584 ) signal_emit_unlocked_R
  0xf54d7baf  (libgobject-2.0.so.0.3600.4 -gsignal.c:3328 ) g_signal_emit_valist
  0xf54d7fa5  (libgobject-2.0.so.0.3600.4 -gsignal.c:3384 ) g_signal_emit
  0xf5623819  (libgudev-1.0.so.0.2.0 -gudevclient.c:104 ) monitor_event
  0xf540cc51  (libglib-2.0.so.0.3600.4 -gmain.c:3054 )  g_main_context_dispatch
  0xf540cfa5  (libglib-2.0.so.0.3600.4 -gmain.c:3701 )  g_main_context_iterate
  0xf540d2c5  (libglib-2.0.so.0.3600.4 -gmain.c:3895 )  g_main_loop_run
  0xb9539dad  (ModemManager -main.c:180 ) main
  0xf52d687d  (libc-2.23.so -libc-start.c:289 ) __libc_start_main
  0xb9539bf3  (ModemManager + 0x0001cbf3 )  _start
  0xb95b0fbf  (ModemManager -elf-init.c:87 )  __libc_csu_init
  0xf56dbe43  (ld-2.23.so + 0x0000be43 )  _dl_sort_fini
  0xb9539bbf  (ModemManager + 0x0001cbbf )  _init

The crash happens when mm-kernel-device-udev.c:find_physical_gudevdevice()
fails to find the physical device, which eventually leads to a NULL
`physdev_uid' being passed to g_hash_table_lookup() in
mm-base-manager.cc:find_device_by_physdev_uid().

There isn't much information about the actual device that triggered the
udev event, but it's suspected to be a tty or net device on a SDIO bus
and thus associated with a physical device on the 'sdio' subsystem. This
patch updates find_physical_gudevdevice() in mm-kernel-device-udev.c to
handle this particular scenario.
2017-03-01 09:26:06 -06:00