summaryrefslogtreecommitdiff
path: root/docs/reference/api
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/api')
-rw-r--r--docs/reference/api/Makefile.am17
-rw-r--r--docs/reference/api/ModemManager-dbus-reference.xml13
-rw-r--r--docs/reference/api/ModemManager-docs.xml107
-rw-r--r--docs/reference/api/ModemManager-migration-reference.xml2
-rw-r--r--docs/reference/api/ModemManager-overview.xml707
-rw-r--r--docs/reference/api/ModemManager-sections.txt167
-rw-r--r--docs/reference/api/meson.build57
7 files changed, 808 insertions, 262 deletions
diff --git a/docs/reference/api/Makefile.am b/docs/reference/api/Makefile.am
index 68029cfb..a641eadf 100644
--- a/docs/reference/api/Makefile.am
+++ b/docs/reference/api/Makefile.am
@@ -18,7 +18,7 @@ DOC_MODULE = ModemManager
DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.xml
# Extra options to supply to gtkdoc-scan
-SCAN_OPTIONS =
+SCAN_OPTIONS = --deprecated-guards="MM_DISABLE_DEPRECATED"
# The directory containing the source code.
DOC_SOURCE_DIR = $(top_srcdir)/include
@@ -54,12 +54,7 @@ HTML_IMAGES = \
$(LOGOS_PNG) \
$(NULL)
-# Note that PNG files are also added in content_files so that
-# the documentation is not built before the PNGs.
-content_files = \
- $(HTML_IMAGES) \
- $(NULL)
-
+content_files =
expand_content_files = \
ModemManager-overview.xml \
ModemManager-dbus-reference.xml \
@@ -76,9 +71,11 @@ expand_content_files = \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Oma.xml \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.ModemCdma.xml \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.xml \
+ $(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Simple.xml \
$(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Signal.xml \
+ $(top_builddir)/libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Sar.xml \
$(NULL)
extra_files = \
@@ -115,9 +112,3 @@ CLEANFILES += \
*.stamp \
-rf xml html tmpl \
$(NULL)
-
-# PNGs are removed only in dist-clean
-# Diagrams and logos are generated by dia in the current directory
-DISTCLEANFILES = \
- $(notdir $(DIAGRAMS_PNG)) \
- $(notdir $(LOGOS_PNG))
diff --git a/docs/reference/api/ModemManager-dbus-reference.xml b/docs/reference/api/ModemManager-dbus-reference.xml
index fb15f98c..6d9ef43f 100644
--- a/docs/reference/api/ModemManager-dbus-reference.xml
+++ b/docs/reference/api/ModemManager-dbus-reference.xml
@@ -130,12 +130,15 @@
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Simple.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.xml"/>
+ <xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.ModemCdma.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Messaging.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Location.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Time.xml"/>
+ <xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Voice.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Firmware.xml"/>
+ <xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Sar.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Signal.xml"/>
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Oma.xml"/>
<!--xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Contacts.xml"/-->
@@ -173,4 +176,14 @@
<xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Sms.xml"/>
</chapter>
+ <chapter id="ref-dbus-object-call">
+ <title>The <literal>/org/freedesktop/ModemManager/Calls</literal> objects</title>
+ <para>
+ Modems implementing the
+ <link linkend="gdbus-org.freedesktop.ModemManager1.Modem.Voice">Voice interface</link>
+ will export one Call object for each Call managed in the device.
+ </para>
+ <xi:include href="../../../../libmm-glib/generated/mm-gdbus-doc-org.freedesktop.ModemManager1.Call.xml"/>
+ </chapter>
+
</part>
diff --git a/docs/reference/api/ModemManager-docs.xml b/docs/reference/api/ModemManager-docs.xml
index 569e66d1..b25e8445 100644
--- a/docs/reference/api/ModemManager-docs.xml
+++ b/docs/reference/api/ModemManager-docs.xml
@@ -15,26 +15,28 @@
</subtitle>
<releaseinfo>
For ModemManager version &version;
+ The latest version of this documentation can be found on-line at
+ <ulink role="online-location" url="https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/">https://www.freedesktop.org/software/ModemManager/doc/latest/ModemManager/</ulink>.
</releaseinfo>
<authorgroup>
<author>
- <firstname>Dan</firstname>
- <surname>Williams</surname>
- <affiliation>
- <address>
- <email>dcbw@redhat.com</email>
- </address>
- </affiliation>
+ <firstname>Dan</firstname>
+ <surname>Williams</surname>
+ <affiliation>
+ <address>
+ <email>dcbw@redhat.com</email>
+ </address>
+ </affiliation>
</author>
<author>
- <firstname>Aleksander</firstname>
- <surname>Morgado</surname>
- <affiliation>
- <address>
- <email>aleksander@aleksander.es</email>
- </address>
- </affiliation>
+ <firstname>Aleksander</firstname>
+ <surname>Morgado</surname>
+ <affiliation>
+ <address>
+ <email>aleksander@aleksander.es</email>
+ </address>
+ </affiliation>
</author>
</authorgroup>
@@ -45,6 +47,14 @@
<year>2011</year>
<year>2012</year>
<year>2013</year>
+ <year>2014</year>
+ <year>2015</year>
+ <year>2016</year>
+ <year>2017</year>
+ <year>2018</year>
+ <year>2019</year>
+ <year>2020</year>
+ <year>2021</year>
<holder>The ModemManager Authors</holder>
</copyright>
@@ -80,19 +90,72 @@
<xi:include href="xml/mm-errors.xml"/>
</part>
+ <part id="ref-udev">
+ <title>Common udev tag definitions</title>
+ <xi:include href="xml/mm-tags.xml"/>
+ </part>
+
<!-- Part 2, DBus reference -->
<xi:include href="xml/ModemManager-dbus-reference.xml"/>
<!-- Part 3, Migration reference -->
<xi:include href="xml/ModemManager-migration-reference.xml"/>
- <index>
- <title>Index</title>
- </index>
+ <part id="ref-compat">
+ <title>Compatibility with older versions</title>
+ <xi:include href="xml/mm-compat.xml"/>
+ </part>
- <!-- NOT needed in DBus API -->
- <!--chapter id="mm-hierarchy">
- <title>Object Hierarchy</title>
- <xi:include href="xml/tree_index.sgml"/>
- </chapter-->
+ <chapter id="api-index-full">
+ <title>Index</title>
+ <xi:include href="xml/api-index-full.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-deprecated" role="deprecated">
+ <title>Index of deprecated symbols</title>
+ <xi:include href="xml/api-index-deprecated.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-0" role="1.0">
+ <title>Index of new symbols in 1.0</title>
+ <xi:include href="xml/api-index-1.0.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-2" role="1.2">
+ <title>Index of new symbols in 1.2</title>
+ <xi:include href="xml/api-index-1.2.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-4" role="1.4">
+ <title>Index of new symbols in 1.4</title>
+ <xi:include href="xml/api-index-1.4.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-6" role="1.6">
+ <title>Index of new symbols in 1.6</title>
+ <xi:include href="xml/api-index-1.6.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-8" role="1.8">
+ <title>Index of new symbols in 1.8</title>
+ <xi:include href="xml/api-index-1.8.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-10" role="1.10">
+ <title>Index of new symbols in 1.10</title>
+ <xi:include href="xml/api-index-1.10.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-12" role="1.12">
+ <title>Index of new symbols in 1.12</title>
+ <xi:include href="xml/api-index-1.12.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-14" role="1.14">
+ <title>Index of new symbols in 1.14</title>
+ <xi:include href="xml/api-index-1.14.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-16" role="1.16">
+ <title>Index of new symbols in 1.16</title>
+ <xi:include href="xml/api-index-1.16.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-18" role="1.18">
+ <title>Index of new symbols in 1.18</title>
+ <xi:include href="xml/api-index-1.18.xml"></xi:include>
+ </chapter>
+ <chapter id="api-index-1-20" role="1.20">
+ <title>Index of new symbols in 1.20</title>
+ <xi:include href="xml/api-index-1.20.xml"></xi:include>
+ </chapter>
</book>
diff --git a/docs/reference/api/ModemManager-migration-reference.xml b/docs/reference/api/ModemManager-migration-reference.xml
index 89670b5f..5e45b89b 100644
--- a/docs/reference/api/ModemManager-migration-reference.xml
+++ b/docs/reference/api/ModemManager-migration-reference.xml
@@ -132,7 +132,7 @@
<link linkend="gdbus-method-org-freedesktop-ModemManager1-Modem-Simple.Connect">
<literal>Connect()</literal>
</link>
- method will create a single bearer with the parameters specified in the call an get
+ method will create a single bearer with the parameters specified in the call and get
it connected, while the
<link linkend="gdbus-method-org-freedesktop-ModemManager1-Modem-Simple.Disconnect">
<literal>Disconnect()</literal>
diff --git a/docs/reference/api/ModemManager-overview.xml b/docs/reference/api/ModemManager-overview.xml
index d55beef9..ff532fe4 100644
--- a/docs/reference/api/ModemManager-overview.xml
+++ b/docs/reference/api/ModemManager-overview.xml
@@ -51,17 +51,16 @@
</formalpara>
</chapter>
- <chapter id="ref-overview-modem-detection-and-setup">
- <title>Modem detection and setup</title>
+ <chapter id="ref-overview-modem-detection">
+ <title>Modem detection</title>
<section>
- <title>Detection mechanisms</title>
+ <title>Builds with udev support</title>
<para>
ModemManager requires <emphasis>udev</emphasis>-powered Linux kernels in order
to get notified of possible available Modems. udev will report each of the ports
- found in the device, and ModemManager will probe each of the ports marked with
- the <emphasis>ID_MM_CANDIDATE</emphasis> tag in udev. This includes both "tty"
- and "net" ports.
+ found in the device, and ModemManager will consider for probing each of the ports
+ marked with the <emphasis>ID_MM_CANDIDATE</emphasis> tag in udev.
</para>
<para>
Aditionally, users of RS232-based devices may need to request additional manual
@@ -72,283 +71,557 @@
</section>
<section>
- <title>Probing</title>
+ <title>Builds without udev support</title>
<para>
- Whenever a new device is detected by ModemManager, port probing process will
- get started, so that we can determine which kind of ports we have, and also
- which plugin we need to use for the specific device. Devices may expose one or
- more ports, and all of them will follow the same probing logic.
+ When the udev daemon isn't available in the system, the
+ <link linkend="gdbus-method-org-freedesktop-ModemManager1.ReportKernelEvent">ReportKernelEvent</link>
+ method in the
+ <link linkend="gdbus-org.freedesktop.ModemManager1">Manager interface</link>
+ may be used to notify the ModemManager daemons of device addition and removals.
</para>
<para>
- The whole probing process, including pre-probing and post-probing filters, is
- implemented in the core ModemManager daemon. Plugins will just configure their
- own special needs in the probing process, so that only the steps required by the
- given plugin are executed. For example, plugins which do not support RS232
- devices will not need AT-based vendor or product filters.
+ When udev support is disabled in the build, the <emphasis>ID_MM_CANDIDATE</emphasis>
+ tag and manual scan requests are still applicable. ModemManager has a built-in parser
+ of udev rule files that is enabled when udev itself isn't available.
</para>
+ </section>
+ </chapter>
- <section>
- <title>Pre-probing filters</title>
- <para>
- Pre-probing filters are those which control whether the probing, as
- requested by the specific plugin, takes place.
- </para>
+ <chapter id="ref-overview-modem-filter">
+ <title>Modem filter</title>
+
+ <para>
+ ModemManager will not probe all TTYs, NET and cdc-wdm ports found in the system,
+ as this may end up interfering e.g. with TTYs that have nothing to do with modem
+ devices.
+ </para>
+ <para>
+ The daemon comes with several predefined <emphasis>filter policies</emphasis>, each
+ of them composed of one or more <emphasis>filter rules</emphasis>.
+ </para>
+
+ <section>
+ <title>Filter rules</title>
+ <para>
+ The device filter in ModemManager defines the following independent filter rules. The
+ predefined filter policies are based on one or more of these predefined filter rules.
<itemizedlist>
<listitem>
- <para><emphasis>Allowed vendor IDs</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_EXPLICIT_WHITELIST</emphasis></para>
<para>
- Plugins can provide a list of udev-reported vendor IDs to be used as
- pre-probing filters. If the vendor ID reported by the device via udev
- is found in the list provided by the plugin, port probing will be
- launched as requested by the given plugin.
- </para>
- <para>
- This filter is specified by the <type>MM_PLUGIN_ALLOWED_VENDOR_IDS</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter allows users to manually tag devices and/or device ports with the
+ <emphasis>ID_MM_DEVICE_PROCESS</emphasis> udev tag. If the filter finds this tag,
+ the device and/or device ports will be automatically accepted and port probing
+ will be allowed.
</para>
+ <programlisting>
+$ sudo vim /lib/udev/rules.d/78-mm-whitelist-internal-modem.rules
+ ACTION!="add|change|move", GOTO="mm_whitelist_internal_modem_end"
+ ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{ID_MM_DEVICE_PROCESS}="1"
+ LABEL="mm_whitelist_internal_modem_end"
+// Apply new rules without reboot
+$ sudo udevadm control --reload
+$ sudo udevadm trigger
+ </programlisting>
</listitem>
<listitem>
- <para><emphasis>Product IDs</emphasis></para>
- <para>
- Plugins can provide a list of udev-reported pairs of vendor and product
- IDs to be used as pre-probing filters.
- </para>
- <para>
- If the vendor ID and product ID pair reported by the device via udev is
- found in the list of 'allowed' pairs provided by the plugin, port probing
- will be launched as requested by the given plugin. This additional filter
- should be used when the plugin is expected to work only with a given
- specific product of a given vendor.
- </para>
- <para>
- If the vendor ID and product ID pair reported by the device via udev is
- found in the list of 'forbidden' pairs provided by the plugin, port probing
- will not be launched by this plugin. This additional filter
- should be used when the plugin supports all devices of a given vendor
- except for some specific ones.
- </para>
+ <para><emphasis>MM_FILTER_RULE_EXPLICIT_BLACKLIST</emphasis></para>
<para>
- These filters are specified by the <type>MM_PLUGIN_ALLOWED_PRODUCT_IDS</type>
- and <type>MM_PLUGIN_FORBIDDEN_PRODUCT_IDS</type> properties in the
- <structname>MMPlugin</structname> object provided by the plugin.
+ This filter allows users to manually tag devices and/or device ports with the
+ <emphasis>ID_MM_DEVICE_IGNORE</emphasis> udev tag. If the filter finds this tag,
+ the device and/or device ports will be automatically ignored and port probing
+ will be never run on them.
</para>
+ <programlisting>
+$ sudo vim /lib/udev/rules.d/78-mm-blacklist-internal-modem.rules
+ ACTION!="add|change|move", GOTO="mm_blacklist_internal_modem_end"
+ ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{ID_MM_DEVICE_IGNORE}="1"
+ LABEL="mm_blacklist_internal_modem_end"
+// Apply new rules without reboot
+$ sudo udevadm control --reload
+$ sudo udevadm trigger
+ </programlisting>
</listitem>
<listitem>
- <para><emphasis>Subsystems</emphasis></para>
- <para>
- Plugins can specify which subsystems they expect, so that we filter out
- any port detected with a subsystem not listed by the plugin.
- </para>
+ <para><emphasis>MM_FILTER_RULE_PLUGIN_WHITELIST</emphasis></para>
<para>
- This filter is specified by the <type>MM_PLUGIN_ALLOWED_SUBSYSTEMS</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter will automatically whitelist devices that are explicitly referenced
+ by plugins, either with plugin-specific whitelist tags, with exact
+ <emphasis>vid:pid</emphasis> matches, or just with <emphasis>vid</emphasis> matches.
</para>
</listitem>
<listitem>
- <para><emphasis>Drivers</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_QRTR</emphasis></para>
<para>
- Plugins can specify which drivers they expect, so that we filter out
- any port detected being managed by a driver not listed by the plugin.
+ This filter will automatically flag as allowed all QRTR nodes that have been
+ notified as being modem management capable.
</para>
<para>
- Plugins can also specify which drivers they do not expect, so that we
- filter out any port detected being managed by a driver listed by the plugin.
- </para>
- <para>
- These filters are specified by the <type>MM_PLUGIN_ALLOWED_DRIVERS</type>
- and <type>MM_PLUGIN_FORBIDDEN_DRIVERS</type> properties in the
- <structname>MMPlugin</structname> object provided by the plugin.
+ This filter rule is available since 1.18.0.
</para>
</listitem>
<listitem>
- <para><emphasis>udev tags</emphasis></para>
- <para>
- Plugins can provide a list of udev tags, so that we filter out
- any port detected which doesn't expose any of the given tags.
- </para>
+ <para><emphasis>MM_FILTER_RULE_VIRTUAL</emphasis></para>
<para>
- This filter is specified by the <type>MM_PLUGIN_ALLOWED_UDEV_TAGS</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter will automatically flag as forbidden all ports exposed by virtual
+ devices, like the 'lo' network interface or the tty0, tty1... virtual terminals.
+ There is no reason to disable this filter, except for testing purposes.
</para>
</listitem>
- </itemizedlist>
- </section>
-
- <section>
- <title>Probing sequence</title>
- <para>
- Whenever all pre-probing filters of a given plugin pass, ModemManager will run
- the probing sequence as requested by the specific plugin. The main purpose of the
- probing sequence step is to determine the type of port being probed, and also
- prepare the information required in any expected post-probing filter.
- </para>
- <itemizedlist>
<listitem>
- <para><emphasis>Custom initialization</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_NET</emphasis></para>
<para>
- This property allows plugins to provide an asynchronous method which will get
- executed as soon as the AT port gets opened. This method may be used for any
- purpose, like running an early command in the ports as soon as possible, or
- querying the modem for info about the port layout.
+ This filter will automatically flag as allowed all network ports exposed by
+ devices. Unless there is a will to explicitly forbid network ports, this filter
+ should always be enabled.
</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>MM_FILTER_RULE_USBMISC</emphasis></para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_CUSTOM_INIT</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter will automatically flag as allowed all cdc-wdm ports exposed in the
+ usbmisc subsystem. Unless there is a will to explicitly forbid the cdc-wdm ports exposed
+ by qmi_wwan, cdc_mbim or huawei-cdc-ncm kernel drivers, this filter should always
+ be enabled.
</para>
</listitem>
<listitem>
- <para><emphasis>AT allowed</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_RPMSG</emphasis></para>
<para>
- This boolean property allows plugins to specify that they expect and support
- AT serial ports.
+ This filter will automatically flag as allowed all rpmsg ports exposed in the
+ rpmsg subsystem. Unless there is a will to explicitly forbid the rpmsg ports,
+ this filter should always be enabled.
</para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_ALLOWED_AT</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter rule is available since 1.16.0.
</para>
</listitem>
<listitem>
- <para><emphasis>Single AT expected</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_WWAN</emphasis></para>
<para>
- This boolean property allows plugins to specify that they only expect and support
- one AT serial port. Whenever the first AT port is grabbed, any remaining AT probing
- in ports of the same device will get cancelled.
+ This filter will automatically flag as allowed all wwan control ports exposed
+ in the wwan subsystem. Unless there is a will to explicitly forbid the wwan control
+ ports, this filter should always be enabled.
</para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_ALLOWED_SINGLE_AT</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This filter rule is available since 1.18.0.
</para>
</listitem>
<listitem>
- <para><emphasis>Custom AT probing</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_TTY</emphasis></para>
<para>
- This property allows plugins to specify custom commands to check whether a port
- is AT or not. By default, the 'AT' command will be used if no custom one specified.
+ If the MM_FILTER_RULE_TTY filter is disabled, no TTY port will be allowed. If this
+ filter is enabled, TTY ports will only be allowed if the TTY-specific filters (defined
+ next) allow it.
</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>MM_FILTER_RULE_TTY_PLATFORM_DRIVER</emphasis></para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_CUSTOM_AT_PROBE</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ If this filter is enabled, all platform TTY ports will be forbidden automatically.
</para>
</listitem>
<listitem>
- <para><emphasis>QCDM allowed</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_TTY_DRIVER</emphasis></para>
<para>
- This boolean property allows plugins to specify that they expect and support
- QCDM serial ports.
+ If this filter is enabled, all TTY ports managed by modem-specific kernel drivers will be
+ allowed automatically.
</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>FILTER_RULE_TTY_ACM_INTERFACE</emphasis></para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_ALLOWED_QCDM</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ If this filter is enabled, all TTY ports managed by the cdc-acm kernel driver with
+ class=2/subclass=2/protocol=1 (AT command capable ttyACM port) will be allowed
+ automatically.
</para>
</listitem>
<listitem>
- <para><emphasis>Check Icera support</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_TTY_WITH_NET</emphasis></para>
<para>
- This boolean property allows plugins to specify that they want to have the Icera
- support checks included in the probing sequence. They can afterwards get the result
- of the support check to decide whether they want to create a Icera-based modem
- object or not.
+ If this filter is enabled, all TTY ports for devices that also expose a network
+ interface port will be allowed automatically.
</para>
+ </listitem>
+ <listitem>
+ <para><emphasis>MM_FILTER_RULE_TTY_DEFAULT_FORBIDDEN</emphasis></para>
<para>
- This configuration is specified by the <type>MM_PLUGIN_ICERA_PROBE</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ This rule is the implicit one defining what happens when a TTY port isn't explicitly
+ accepted by any of the TTY-specific filters; i.e. the TTY port will be forbidden.
</para>
</listitem>
</itemizedlist>
- </section>
+ </para>
- <section>
- <title>Post-probing filters</title>
- <para>
- Post-probing filters are required to identify whether a plugin can handle a given
- modem, in special cases where the information retrieved from udev is either not
- enough or wrong. This covers, for example, RS232 modems connected through a RS232
- to USB converter, where udev-reported vendor ID is that of the converter, not the
- one of the modem.
- </para>
+ <para>
+ The following filter rules have been deprecated and are no longer used.
<itemizedlist>
<listitem>
- <para><emphasis>Allowed vendor strings</emphasis></para>
- <para>
- Plugins can provide a list of vendor strings to be used as post-probing
- filters. If the vendor string reported by the device via AT commands
- is found in the list provided by the plugin, the plugin will report that
- it can handle this modem.
- </para>
+ <para><emphasis>MM_FILTER_RULE_TTY_BLACKLIST</emphasis></para>
<para>
- This filter is specified by the <type>MM_PLUGIN_ALLOWED_VENDOR_STRINGS</type>
- property in the <structname>MMPlugin</structname> object provided
- by the plugin.
+ Deprecated in 1.18.0.
</para>
</listitem>
<listitem>
- <para><emphasis>Product strings</emphasis></para>
+ <para><emphasis>MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY</emphasis></para>
<para>
- Plugins can provide a list of pairs of vendor and product
- strings to be used as post-probing filters.
+ Deprecated in 1.18.0.
</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section>
+ <title>Filter policies</title>
+
+ <para>
+ The predefined filter policies are:
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Whitelist only</emphasis></para>
<para>
- If the vendor and product string pair reported by the device via AT
- commands is found in the 'allowed' list provided by the plugin, the
- plugin will report that it can handle this modem. This additional filter
- should be used when the plugin is expected to work only with a given
- specific product of a given vendor.
+ This is a policy where only the MM_FILTER_RULE_EXPLICIT_WHITELIST rule is enabled.
</para>
+ <programlisting># /usr/sbin/ModemManager --filter-policy=WHITELIST-ONLY</programlisting>
+ </listitem>
+ <listitem>
+ <para><emphasis>Strict</emphasis></para>
<para>
- If the vendor and product string pair reported by the device via AT
- commands is found in the 'forbidden list provided by the plugin, the
- plugin will report that it cannot handle this modem. This additional filter
- should be used when the plugin supports all devices of a given vendor, except for some specific ones.
+ This is a policy where the following rules are enabled:
+ <itemizedlist>
+ <listitem>MM_FILTER_RULE_EXPLICIT_WHITELIST</listitem>
+ <listitem>MM_FILTER_RULE_EXPLICIT_BLACKLIST</listitem>
+ <listitem>MM_FILTER_RULE_PLUGIN_WHITELIST</listitem>
+ <listitem>MM_FILTER_RULE_QRTR</listitem>
+ <listitem>MM_FILTER_RULE_VIRTUAL</listitem>
+ <listitem>MM_FILTER_RULE_NET</listitem>
+ <listitem>MM_FILTER_RULE_USBMISC</listitem>
+ <listitem>MM_FILTER_RULE_RPMSG</listitem>
+ <listitem>MM_FILTER_RULE_TTY</listitem>
+ <listitem>MM_FILTER_RULE_TTY_PLATFORM_DRIVER</listitem>
+ <listitem>MM_FILTER_RULE_TTY_DRIVER</listitem>
+ <listitem>MM_FILTER_RULE_TTY_ACM_INTERFACE</listitem>
+ <listitem>MM_FILTER_RULE_TTY_WITH_NET</listitem>
+ <listitem>MM_FILTER_RULE_TTY_DEFAULT_FORBIDDEN</listitem>
+ <listitem>MM_FILTER_RULE_WWAN</listitem>
+ </itemizedlist>
</para>
<para>
- These filters are specified by the <type>MM_PLUGIN_ALLOWED_PRODUCT_STRINGS</type>
- and <type>MM_PLUGIN_FORBIDDEN_PRODUCT_STRINGS</type> properties in the
- <structname>MMPlugin</structname> object provided by the plugin.
+ This policy is the default one when a different one is not explicitly
+ selected. In this policy, all TTYs are forbidden except for the ones
+ explicitly allowed by one of the TTY-specific rules.
</para>
+ <programlisting># /usr/sbin/ModemManager --filter-policy=STRICT</programlisting>
</listitem>
<listitem>
- <para><emphasis>Icera support</emphasis></para>
+ <para><emphasis>Custom</emphasis></para>
<para>
- Plugins can specify that they only support Icera-based modems, or that they
- do not support any Icera-based modem. When either of this configurations is
- enabled, the Icera support checks will be included in the
- probing sequence, and the result of the check will help to determine whether
- the plugin supports the modem or not.
+ Any of the previously defined predefined policies may be modified rule per rule
+ by explicitly enabling or disabling rules via environment variables.
</para>
<para>
- This filter is specified by the <type>MM_PLUGIN_ALLOWED_ICERA</type> and
- <type>MM_PLUGIN_FORBIDDEN_ICERA</type> properties in the
- <structname>MMPlugin</structname> object provided by the plugin.
+ E.g. this would launch ModemManager with the Strict filter policy but with all
+ net and cdc-wdm ports forbidden completely:
+ <programlisting>
+# MM_FILTER_RULE_NET=0 \
+ MM_FILTER_RULE_USBMISC=0 \
+ /usr/sbin/ModemManager --filter-policy=STRICT</programlisting>
+ </para>
+ <para>
+ E.g. this would launch ModemManager with the Whitelist-only filter policy but also
+ explicitly allowing all net and cdc-wdm ports. Note that in this case, all virtual
+ net ports (e.g. 'lo') are also being allowed.
+ <programlisting>
+# MM_FILTER_RULE_NET=1 \
+ MM_FILTER_RULE_USBMISC=1 \
+ /usr/sbin/ModemManager --filter-policy=WHITELIST-ONLY</programlisting>
</para>
</listitem>
</itemizedlist>
+ </para>
+
+ </section>
+ </chapter>
+
+ <chapter id="ref-overview-modem-port-probing">
+ <title>Port probing</title>
+ <para>
+ Whenever a new device is detected by ModemManager, port probing process will
+ get started, so that we can determine which kind of ports we have, and also
+ which plugin we need to use for the specific device. Devices may expose one or
+ more ports, and all of them will follow the same probing logic.
+ </para>
+ <para>
+ The whole probing process, including pre-probing and post-probing filters, is
+ implemented in the core ModemManager daemon. Plugins will just configure their
+ own special needs in the probing process, so that only the steps required by the
+ given plugin are executed. For example, plugins which do not support RS232
+ devices will not need AT-based vendor or product filters.
+ </para>
+
+ <section>
+ <title>Pre-probing filters</title>
+ <para>
+ Pre-probing filters are those which control whether the probing, as
+ requested by the specific plugin, takes place.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Allowed vendor IDs</emphasis></para>
+ <para>
+ Plugins can provide a list of udev-reported vendor IDs to be used as
+ pre-probing filters. If the vendor ID reported by the device via udev
+ is found in the list provided by the plugin, port probing will be
+ launched as requested by the given plugin.
+ </para>
+ <para>
+ This filter is specified by the <type>MM_PLUGIN_ALLOWED_VENDOR_IDS</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Product IDs</emphasis></para>
+ <para>
+ Plugins can provide a list of udev-reported pairs of vendor and product
+ IDs to be used as pre-probing filters.
+ </para>
+ <para>
+ If the vendor ID and product ID pair reported by the device via udev is
+ found in the list of 'allowed' pairs provided by the plugin, port probing
+ will be launched as requested by the given plugin. This additional filter
+ should be used when the plugin is expected to work only with a given
+ specific product of a given vendor.
+ </para>
+ <para>
+ If the vendor ID and product ID pair reported by the device via udev is
+ found in the list of 'forbidden' pairs provided by the plugin, port probing
+ will not be launched by this plugin. This additional filter
+ should be used when the plugin supports all devices of a given vendor
+ except for some specific ones.
+ </para>
+ <para>
+ These filters are specified by the <type>MM_PLUGIN_ALLOWED_PRODUCT_IDS</type>
+ and <type>MM_PLUGIN_FORBIDDEN_PRODUCT_IDS</type> properties in the
+ <structname>MMPlugin</structname> object provided by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Subsystems</emphasis></para>
+ <para>
+ Plugins can specify which subsystems they expect, so that we filter out
+ any port detected with a subsystem not listed by the plugin.
+ </para>
+ <para>
+ This filter is specified by the <type>MM_PLUGIN_ALLOWED_SUBSYSTEMS</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Drivers</emphasis></para>
+ <para>
+ Plugins can specify which drivers they expect, so that we filter out
+ any port detected being managed by a driver not listed by the plugin.
+ </para>
+ <para>
+ Plugins can also specify which drivers they do not expect, so that we
+ filter out any port detected being managed by a driver listed by the plugin.
+ </para>
+ <para>
+ These filters are specified by the <type>MM_PLUGIN_ALLOWED_DRIVERS</type>
+ and <type>MM_PLUGIN_FORBIDDEN_DRIVERS</type> properties in the
+ <structname>MMPlugin</structname> object provided by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>udev tags</emphasis></para>
+ <para>
+ Plugins can provide a list of udev tags, so that we filter out
+ any port detected which doesn't expose any of the given tags.
+ </para>
+ <para>
+ This filter is specified by the <type>MM_PLUGIN_ALLOWED_UDEV_TAGS</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
- <note>
+ <section>
+ <title>Probing sequence</title>
+ <para>
+ Whenever all pre-probing filters of a given plugin pass, ModemManager will run
+ the probing sequence as requested by the specific plugin. The main purpose of the
+ probing sequence step is to determine the type of port being probed, and also
+ prepare the information required in any expected post-probing filter.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Custom initialization</emphasis></para>
+ <para>
+ This property allows plugins to provide an asynchronous method which will get
+ executed as soon as the AT port gets opened. This method may be used for any
+ purpose, like running an early command in the ports as soon as possible, or
+ querying the modem for info about the port layout.
+ </para>
+ <para>
+ This configuration is specified by the <type>MM_PLUGIN_CUSTOM_INIT</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>AT allowed</emphasis></para>
+ <para>
+ This boolean property allows plugins to specify that they expect and support
+ AT serial ports.
+ </para>
<para>
- Plugins which require post-probing filters will always be sorted last, and
- therefore they will be the last ones being checked for pre-probing filters. This
- is due to the fact that we need to assume that these plugins aren't able to
- determine port support just with pre-probing filters, as we want to avoid
- unnecessary probing sequences launched. Also note that the Generic plugin is
- anyway always the last one in the list.
+ This configuration is specified by the <type>MM_PLUGIN_ALLOWED_AT</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
</para>
- </note>
- </section>
+ </listitem>
+ <listitem>
+ <para><emphasis>Single AT expected</emphasis></para>
+ <para>
+ This boolean property allows plugins to specify that they only expect and support
+ one AT serial port. Whenever the first AT port is grabbed, any remaining AT probing
+ in ports of the same device will get cancelled.
+ </para>
+ <para>
+ This configuration is specified by the <type>MM_PLUGIN_ALLOWED_SINGLE_AT</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Custom AT probing</emphasis></para>
+ <para>
+ This property allows plugins to specify custom commands to check whether a port
+ is AT or not. By default, the 'AT' command will be used if no custom one specified.
+ </para>
+ <para>
+ This configuration is specified by the <type>MM_PLUGIN_CUSTOM_AT_PROBE</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>QCDM allowed</emphasis></para>
+ <para>
+ This boolean property allows plugins to specify that they expect and support
+ QCDM serial ports.
+ </para>
+ <para>
+ This configuration is specified by the <type>MM_PLUGIN_ALLOWED_QCDM</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Check Icera support</emphasis></para>
+ <para>
+ This boolean property allows plugins to specify that they want to have the Icera
+ support checks included in the probing sequence. They can afterwards get the result
+ of the support check to decide whether they want to create a Icera-based modem
+ object or not.
+ </para>
+ <para>
+ This configuration is specified by the <type>MM_PLUGIN_ICERA_PROBE</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
- <section>
- <title>Probing setup examples</title>
- <example>
- <title>Probing setup for a plugin requiring udev-based vendor/product checks</title>
- <programlisting>
+ <section>
+ <title>Post-probing filters</title>
+ <para>
+ Post-probing filters are required to identify whether a plugin can handle a given
+ modem, in special cases where the information retrieved from udev is either not
+ enough or wrong. This covers, for example, RS232 modems connected through a RS232
+ to USB converter, where udev-reported vendor ID is that of the converter, not the
+ one of the modem.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Allowed vendor strings</emphasis></para>
+ <para>
+ Plugins can provide a list of vendor strings to be used as post-probing
+ filters. If the vendor string reported by the device via AT commands
+ is found in the list provided by the plugin, the plugin will report that
+ it can handle this modem.
+ </para>
+ <para>
+ This filter is specified by the <type>MM_PLUGIN_ALLOWED_VENDOR_STRINGS</type>
+ property in the <structname>MMPlugin</structname> object provided
+ by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Product strings</emphasis></para>
+ <para>
+ Plugins can provide a list of pairs of vendor and product
+ strings to be used as post-probing filters.
+ </para>
+ <para>
+ If the vendor and product string pair reported by the device via AT
+ commands is found in the 'allowed' list provided by the plugin, the
+ plugin will report that it can handle this modem. This additional filter
+ should be used when the plugin is expected to work only with a given
+ specific product of a given vendor.
+ </para>
+ <para>
+ If the vendor and product string pair reported by the device via AT
+ commands is found in the 'forbidden list provided by the plugin, the
+ plugin will report that it cannot handle this modem. This additional filter
+ should be used when the plugin supports all devices of a given vendor, except for some specific ones.
+ </para>
+ <para>
+ These filters are specified by the <type>MM_PLUGIN_ALLOWED_PRODUCT_STRINGS</type>
+ and <type>MM_PLUGIN_FORBIDDEN_PRODUCT_STRINGS</type> properties in the
+ <structname>MMPlugin</structname> object provided by the plugin.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis>Icera support</emphasis></para>
+ <para>
+ Plugins can specify that they only support Icera-based modems, or that they
+ do not support any Icera-based modem. When either of this configurations is
+ enabled, the Icera support checks will be included in the
+ probing sequence, and the result of the check will help to determine whether
+ the plugin supports the modem or not.
+ </para>
+ <para>
+ This filter is specified by the <type>MM_PLUGIN_ALLOWED_ICERA</type> and
+ <type>MM_PLUGIN_FORBIDDEN_ICERA</type> properties in the
+ <structname>MMPlugin</structname> object provided by the plugin.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <para>
+ Plugins which require post-probing filters will always be sorted last, and
+ therefore they will be the last ones being checked for pre-probing filters. This
+ is due to the fact that we need to assume that these plugins aren't able to
+ determine port support just with pre-probing filters, as we want to avoid
+ unnecessary probing sequences launched. Also note that the Generic plugin is
+ anyway always the last one in the list.
+ </para>
+ </note>
+ </section>
+
+ <section>
+ <title>Probing setup examples</title>
+ <example>
+ <title>Probing setup for a plugin requiring udev-based vendor/product checks</title>
+ <programlisting>
G_MODULE_EXPORT MMPlugin *
mm_plugin_create (void)
{
@@ -374,12 +647,12 @@ mm_plugin_create (void)
/* No post-probing filters */
NULL));
}
- </programlisting>
- </example>
+ </programlisting>
+ </example>
- <example>
- <title>Probing setup for a plugin requiring AT-probed vendor/product checks</title>
- <programlisting>
+ <example>
+ <title>Probing setup for a plugin requiring AT-probed vendor/product checks</title>
+ <programlisting>
G_MODULE_EXPORT MMPlugin *
mm_plugin_create (void)
{
@@ -402,12 +675,12 @@ mm_plugin_create (void)
MM_PLUGIN_PRODUCT_STRINGS, product_strings,
NULL));
}
- </programlisting>
- </example>
+ </programlisting>
+ </example>
- <example>
- <title>Probing setup for a plugin with custom initialization requirements</title>
- <programlisting>
+ <example>
+ <title>Probing setup for a plugin with custom initialization requirements</title>
+ <programlisting>
static gboolean
parse_custom_at (const gchar *response,
const GError *error,
@@ -451,25 +724,23 @@ mm_plugin_create (void)
/* No post-probing filters */
NULL));
}
- </programlisting>
- </example>
- </section>
- </section>
-
- <section>
- <title>Port grabbing and Modem object creation</title>
- <para>
- Once a port passes all probing filters of a given plugin, the plugin will grab
- the port. When the first port of a given device is grabbed, the plugin will create
- the required Modem object.
- </para>
- <para>
- While preparing to get the Modem object grab the specific port probed, udev-based
- port type hints can be used to specify AT port flags (e.g. if a port is to be
- considered primary, secondary or for PPP).
- </para>
+ </programlisting>
+ </example>
</section>
+ </chapter>
+ <chapter id="ref-overview-modem-object-creation">
+ <title>Modem object creation</title>
+ <para>
+ Once a port passes all probing filters of a given plugin, the plugin will grab
+ the port. When the first port of a given device is grabbed, the plugin will create
+ the required Modem object.
+ </para>
+ <para>
+ While preparing to get the Modem object grab the specific port probed, udev-based
+ port type hints can be used to specify AT port flags (e.g. if a port is to be
+ considered primary, secondary or for PPP).
+ </para>
</chapter>
<chapter id="ref-overview-modem-state-machine">
diff --git a/docs/reference/api/ModemManager-sections.txt b/docs/reference/api/ModemManager-sections.txt
index fd551a29..5184503a 100644
--- a/docs/reference/api/ModemManager-sections.txt
+++ b/docs/reference/api/ModemManager-sections.txt
@@ -10,15 +10,23 @@ MM_CHECK_VERSION
<SECTION>
<FILE>mm-enums</FILE>
<TITLE>Flags and Enumerations</TITLE>
+MMBearerType
MMBearerIpFamily
MMBearerIpMethod
MMBearerAllowedAuth
+MMBearerMultiplexSupport
+MMBearerApnType
+MMCallDirection
+MMCallState
+MMCallStateReason
MMFirmwareImageType
MMModem3gppFacility
MMModem3gppNetworkAvailability
MMModem3gppSubscriptionState
MMModem3gppRegistrationState
MMModem3gppUssdSessionState
+MMModem3gppEpsUeModeOperation
+MMModem3gppPacketServiceState
MMModemAccessTechnology
MMModemBand
MMModemCapability
@@ -27,6 +35,7 @@ MMModemCdmaRegistrationState
MMModemCdmaRmProtocol
MMModemContactsStorage
MMModemLocationSource
+MMModemLocationAssistanceDataType
MMModemLock
MMModemMode
MMModemState
@@ -34,6 +43,7 @@ MMModemStateFailedReason
MMModemStateChangeReason
MMModemPowerState
MMModemPortType
+MMModemFirmwareUpdateMethod
MMOmaFeature
MMOmaSessionState
MMOmaSessionStateFailedReason
@@ -50,17 +60,158 @@ MMSmsCdmaServiceCategory
<SECTION>
<FILE>mm-errors</FILE>
<TITLE>Errors</TITLE>
-MMConnectionError
+MM_CORE_ERROR_DBUS_PREFIX
+MM_MOBILE_EQUIPMENT_ERROR_DBUS_PREFIX
+MM_CONNECTION_ERROR_DBUS_PREFIX
+MM_SERIAL_ERROR_DBUS_PREFIX
+MM_MESSAGE_ERROR_DBUS_PREFIX
+MM_CDMA_ACTIVATION_ERROR_DBUS_PREFIX
MMCoreError
-MMMessageError
MMMobileEquipmentError
+MMConnectionError
MMSerialError
+MMMessageError
MMCdmaActivationError
+</SECTION>
+
+<SECTION>
+<FILE>mm-compat</FILE>
+MM_MODEM_BAND_U2100
+MM_MODEM_BAND_U1900
+MM_MODEM_BAND_U1800
+MM_MODEM_BAND_U17IV
+MM_MODEM_BAND_U850
+MM_MODEM_BAND_U800
+MM_MODEM_BAND_U2600
+MM_MODEM_BAND_U900
+MM_MODEM_BAND_U17IX
+MM_MODEM_BAND_EUTRAN_I
+MM_MODEM_BAND_EUTRAN_II
+MM_MODEM_BAND_EUTRAN_III
+MM_MODEM_BAND_EUTRAN_IV
+MM_MODEM_BAND_EUTRAN_V
+MM_MODEM_BAND_EUTRAN_VI
+MM_MODEM_BAND_EUTRAN_VII
+MM_MODEM_BAND_EUTRAN_VIII
+MM_MODEM_BAND_EUTRAN_IX
+MM_MODEM_BAND_EUTRAN_X
+MM_MODEM_BAND_EUTRAN_XI
+MM_MODEM_BAND_EUTRAN_XII
+MM_MODEM_BAND_EUTRAN_XIII
+MM_MODEM_BAND_EUTRAN_XIV
+MM_MODEM_BAND_EUTRAN_XVII
+MM_MODEM_BAND_EUTRAN_XVIII
+MM_MODEM_BAND_EUTRAN_XIX
+MM_MODEM_BAND_EUTRAN_XX
+MM_MODEM_BAND_EUTRAN_XXI
+MM_MODEM_BAND_EUTRAN_XXII
+MM_MODEM_BAND_EUTRAN_XXIII
+MM_MODEM_BAND_EUTRAN_XXIV
+MM_MODEM_BAND_EUTRAN_XXV
+MM_MODEM_BAND_EUTRAN_XXVI
+MM_MODEM_BAND_EUTRAN_XXXIII
+MM_MODEM_BAND_EUTRAN_XXXIV
+MM_MODEM_BAND_EUTRAN_XXXV
+MM_MODEM_BAND_EUTRAN_XXXVI
+MM_MODEM_BAND_EUTRAN_XXXVII
+MM_MODEM_BAND_EUTRAN_XXXVIII
+MM_MODEM_BAND_EUTRAN_XXXIX
+MM_MODEM_BAND_EUTRAN_XL
+MM_MODEM_BAND_EUTRAN_XLI
+MM_MODEM_BAND_EUTRAN_XLII
+MM_MODEM_BAND_EUTRAN_XLIII
+MM_MODEM_BAND_EUTRAN_XLIV
+MM_MODEM_BAND_CDMA_BC0_CELLULAR_800
+MM_MODEM_BAND_CDMA_BC1_PCS_1900
+MM_MODEM_BAND_CDMA_BC2_TACS
+MM_MODEM_BAND_CDMA_BC3_JTACS
+MM_MODEM_BAND_CDMA_BC4_KOREAN_PCS
+MM_MODEM_BAND_CDMA_BC5_NMT450
+MM_MODEM_BAND_CDMA_BC6_IMT2000
+MM_MODEM_BAND_CDMA_BC7_CELLULAR_700
+MM_MODEM_BAND_CDMA_BC8_1800
+MM_MODEM_BAND_CDMA_BC9_900
+MM_MODEM_BAND_CDMA_BC10_SECONDARY_800
+MM_MODEM_BAND_CDMA_BC11_PAMR_400
+MM_MODEM_BAND_CDMA_BC12_PAMR_800
+MM_MODEM_BAND_CDMA_BC13_IMT2000_2500
+MM_MODEM_BAND_CDMA_BC14_PCS2_1900
+MM_MODEM_BAND_CDMA_BC15_AWS
+MM_MODEM_BAND_CDMA_BC16_US_2500
+MM_MODEM_BAND_CDMA_BC17_US_FLO_2500
+MM_MODEM_BAND_CDMA_BC18_US_PS_700
+MM_MODEM_BAND_CDMA_BC19_US_LOWER_700
+MM_MODEM_LOCATION_SOURCE_AGPS
+MM_MODEM_CAPABILITY_LTE_ADVANCED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_ACTIVATION_REJECTED_BY_GGSN_OR_GW
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_ACTIVATION_REJECTED_UNSPECIFIED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_AND_NON_GPRS_SERVICES_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_CONDITIONAL_IE_ERROR
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_CONGESTION
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_FEATURE_NOT_SUPPORTED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_IE_NOT_IMPLEMENTED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_ILLEGAL_ME
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_ILLEGAL_MS
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_IMSI_UNKNOWN_IN_HLR
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_IMSI_UNKNOWN_IN_VLR
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_INSUFFICIENT_RESOURCES
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_INVALID_MOBILE_CLASS
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_LAST_PDN_DISCONNECTION_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_LAST_PDN_DISCONNECTION_NOT_ALLOWED_LEGACY
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_LOCATION_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_MANDATORY_IE_ERROR
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_MAXIMUM_NUMBER_OF_PDP_CONTEXTS_REACHED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_MISSING_OR_UNKNOWN_APN
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_NETWORK_FAILURE
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_NOT_AUTHORIZED_FOR_CSG
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_NO_CELLS_IN_LOCATION_AREA
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_OPERATOR_DETERMINED_BARRING
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_PDP_AUTH_FAILURE
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_PDP_CONTEXT_WITHOUT_TFT_ALREADY_ACTIVATED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_PLMN_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_REQUESTED_APN_NOT_SUPPORTED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_REQUEST_REJECTED_BCM_VIOLATION
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_ROAMING_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SEMANTICALLY_INCORRECT_MESSAGE
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SEMANTIC_ERRORS_IN_PACKET_FILTER
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SEMANTIC_ERROR_IN_TFT_OPERATION
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_NOT_ALLOWED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_OPTION_NOT_SUBSCRIBED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_OPTION_NOT_SUPPORTED
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_OPTION_OUT_OF_ORDER
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SYNTACTICAL_ERROR_IN_PACKET_FILTER
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_SYNTACTICAL_ERROR_IN_TFT_OPERATION
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_UNKNOWN_PDP_ADDRESS_OR_TYPE
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_UNKNOWN_PDP_CONTEXT
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_UNSPECIFIED_PROTOCOL_ERROR
+MM_MOBILE_EQUIPMENT_ERROR_GPRS_USER_AUTHENTICATION_FAILED
<SUBSECTION Private>
-MM_CDMA_ACTIVATION_ERROR_DBUS_PREFIX
-MM_CONNECTION_ERROR_DBUS_PREFIX
-MM_CORE_ERROR_DBUS_PREFIX
-MM_MESSAGE_ERROR_DBUS_PREFIX
-MM_MOBILE_EQUIPMENT_ERROR_DBUS_PREFIX
-MM_SERIAL_ERROR_DBUS_PREFIX
+MMModemBandDeprecated
+MMModemLocationSourceDeprecated
+MMModemCapabilityDeprecated
+MMMobileEquipmentErrorDeprecated
+MM_DEPRECATED
+</SECTION>
+
+<SECTION>
+<FILE>mm-tags</FILE>
+<TITLE>Common udev tags</TITLE>
+ID_MM_CANDIDATE
+ID_MM_PHYSDEV_UID
+ID_MM_DEVICE_PROCESS
+ID_MM_DEVICE_IGNORE
+ID_MM_PORT_IGNORE
+ID_MM_PORT_TYPE_AT_PPP
+ID_MM_PORT_TYPE_AT_PRIMARY
+ID_MM_PORT_TYPE_AT_SECONDARY
+ID_MM_PORT_TYPE_GPS
+ID_MM_PORT_TYPE_QCDM
+ID_MM_PORT_TYPE_AUDIO
+ID_MM_PORT_TYPE_QMI
+ID_MM_PORT_TYPE_MBIM
+ID_MM_TTY_BAUDRATE
+ID_MM_TTY_FLOW_CONTROL
+<SUBSECTION Deprecated>
+ID_MM_TTY_BLACKLIST
+ID_MM_TTY_MANUAL_SCAN_ONLY
</SECTION>
diff --git a/docs/reference/api/meson.build b/docs/reference/api/meson.build
new file mode 100644
index 00000000..d7c420c7
--- /dev/null
+++ b/docs/reference/api/meson.build
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2021 IƱigo Martinez <inigomartinez@gmail.com>
+
+doc_module = mm_name
+
+private_headers = [
+ 'ModemManager.h',
+ 'ModemManager-names.h',
+]
+
+mm_doc_path = mm_prefix / gnome.gtkdoc_html_dir(doc_module)
+
+version_xml = configure_file(
+ input: 'version.xml.in',
+ output: '@BASENAME@',
+ configuration: version_conf,
+)
+
+expand_content_files = [
+ 'ModemManager-dbus-reference.xml',
+ 'ModemManager-migration-reference.xml',
+ 'ModemManager-overview.xml',
+ # FIXME: workaround because only strings can be included and not custom targets (gen_docs)
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Bearer.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Firmware.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Location.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Messaging.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Modem3gpp.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.ModemCdma.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Oma.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Signal.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Simple.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.Time.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Modem.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Sim.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.Sms.xml',
+ generated_build_dir / 'mm-gdbus-doc-org.freedesktop.ModemManager1.xml',
+]
+
+gnome.gtkdoc(
+ doc_module,
+ main_xml: doc_module + '-docs.xml',
+ src_dir: include_inc,
+ ignore_headers: private_headers,
+ include_directories: top_inc,
+ gobject_typesfile: doc_module + '.types',
+ dependencies: glib_deps,
+ namespace: 'mm',
+ scan_args: '--deprecated-guards="MM_DISABLE_DEPRECATED"',
+ fixxref_args: '--html-dir=' + mm_doc_path,
+ html_assets: logos_pngs + diagrams_pngs,
+ content_files: version_xml,
+ expand_content_files: expand_content_files,
+ install: true,
+)