
The 'ublox' plugin is originally targeted for the u-blox TOBY-L2 series,
although it may be used with other kind of devices likely without many issues.

=====================================
  USB profiles and networking modes
=====================================

The TOBY-L2 devices may work in multiple different USB profiles:

 * AT+UUSBCONF=0: fairly back-compatible profile, where only cdc-acm TTYs are
   exposed. ModemManager will default to PPP for the connection setup when in
   this profile.

 * AT+UUSBCONF=2: ECM profile, where multiple cdc-acm TTYs are exposed along
   with a ECM network interface.

 * AT+UUSBCONF=3: RNDIS profile, where one cdc-acm TTY and a RNDIS network
   interface are exposed. This is the default factory-programmed value.

When a profile with a network interface (ECM or RNDIS) is in use, the device may
work in multiple networking modes:

 * AT+UBMCONF=1: Router mode, with a built-in DHCP server running behind the
   network interface. The network interface will be assigned an IP address from
   a subnet managed by the device itself. This is the default factory-programmed
   value. E.g.:

        $ ip addr
        9: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
            link/ether 02:07:01:15:00:0b brd ff:ff:ff:ff:ff:ff
            inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic usb0
               valid_lft 43009sec preferred_lft 43009sec

        $ ip route
        default via 192.168.1.1 dev usb0  proto static  metric 700
        192.168.1.0/24 dev usb0  proto kernel  scope link  src 192.168.1.100  metric 700

 * AT+UBMCONF=2: Bridge mode, where static IP addressing and routing must be
   performed once connected. The network interface will be assigned the same IP
   address provided by the network operator. The plugin uses 'AT+UIPADDR=N' the
   default gateway IP settings and 'AT++CGCONTRDP=N' to retrieve the interface
   IP settings and DNS setup.

        $ ip addr
        11: usb0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
            link/ether 02:07:01:15:00:0b brd ff:ff:ff:ff:ff:ff
            inet 47.59.109.26/32 brd 47.59.109.26 scope global usb0
               valid_lft forever preferred_lft forever

        $ ip route
        default via 47.59.109.229 dev usb0  proto static  metric 700
        47.59.109.26 dev usb0  proto kernel  scope link  src 47.59.109.26  metric 700
        47.59.109.229 dev usb0  proto static  scope link  metric 700

The 'ublox' plugin in ModemManager works with any of the previous combinations
seamlessly. It is assumed that the device doesn't change either USB profile or
networking mode once it has been detected and processed by ModemManager.

NOTE: If manually selecting different USB profiles or networking modes, remember
to reset the module before assuming the new settings have been applied. E.g.,
using plain mmcli commands:
  $ sudo mmcli -m 0 --command="AT+UUSBCONF=3"
  $ sudo mmcli -m 0 --reset

=================================
  Connection setup
=================================

The plugin allows to connect to specific APNs in the usual way (i.e. by creating
a PDP context for the specific APN), and then activating the PDP context with
'AT+CGACT=[CID]'.

Authentication settings of the APN (user, password, authentication type) are
also supported via the 'AT+UAUTHREQ' command.

The plugin doesn't currently support reporting as auto-connected the default LTE
bearer.

========================================
  Connection monitoring and statistics
========================================

The status of the connection of the specific PDP context is monitored
periodically using 'AT+CGACT?', in order to detect network-originated
disconnections. This implementation is given in the Generic broadband bearer
implementation, and is not ublox-specific.

If the device supports it, connection TX/RX statistics will also be periodically
loaded using the AT+UGCNTRD command. Note, though, that the TOBY-L2 doesn't seem
to support this information via control commands.

===========================================
  Supported and current mode combinations
===========================================

The full list of supported mode combinations is loaded using 'AT+URAT=?', and
then filtered by device product name to remove technologies not supported in
several devices. E.g. the standard TOBY-L2 list of supported mode combinations
will include all 2G, 3G and 4G, but if the device is a L201, 2G support will be
removed from the list.

The current mode combination in use is loaded using 'AT+URAT?', and the setting
may be changed using the 'AT+URAT=X' request.

In order to be able to update this setting, the device will be put in low-power
mode ('AT+CFUN=4'), then the setting update will be run, and finally the device
will recover the previous functionality mode it was in (e.g. 'AT+CFUN=1' if it
was in full functionality mode).

===============================
  Supported and current bands
===============================

The full list of supported bands is hardcoded based on the supported modes of the
device. There is no runtime loading of which are the supported bands because the
'AT+UBANDSEL=?' command gives different results depending on the current access
technology (i.e. there is no single full list of supported bands reported).

The current list of bands is loaded via the 'AT+UBANDSEL?' command, and the
setting may be changed using the 'AT+UBANDSEL=X' request.

In order to be able to update this setting, the device will be put in low-power
mode ('AT+CFUN=4'), then the setting update will be run, and finally the device
will recover the previous functionality mode it was in (e.g. 'AT+CFUN=1' if it
was in full functionality mode).

======================
  Functionality mode
======================

The plugin implements a custom 'AT+CFUN?' response parser because it provides
multiple modes that may be treated as 'low-power' by ModemManager (e.g. mode
'0' is minimum functionality, mode '4' is airplane mode and mode '19' is
minimum functionality with SIM deactivated).

The plugin implements power-on ('AT+CFUN=1'), power-down ('AT+CFUN=4'), reset
('AT+CFUN=16') and power-off ('AT+CPWROFF'). As usual, a reset will trigger a
power cycle of the device, and the power-off will render the modem unusable
until it's power cycled externally.

====================================
  Network registration and quality
====================================

The LTE specific 'AT+CEREG' registration checks will be enabled by default if
the module supports LTE. Additionally, a custom 'CREG/CGREG/CEREG' state number
parser is provided to support u-blox specific reported states (e.g. state '6'
to indicate 'sms only registration' on the '+CREG' indications for the CS
network when on LTE).

The plugin implements the extended Signal interface, providing RSSI, RSCP, Ec/Io
and RSRQ measurements obtained with the 'AT+CESQ' command.

==================
  PIN management
==================

A custom method to load the PIN/PUK remaining attempts is implemented based on
the 'AT+UPINCNT' command.

Have fun!
