From 64f08c48384af5be55b8f9d668ca03613ced3780 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Mon, 23 Sep 2019 12:16:03 +0200 Subject: [PATCH] Don't grab cdc_ether devices on Sierra QMI modems --- 0001-plugin-ignore-unwanted-net-ports.patch | 185 ++++++++++++++++++++ ModemManager.spec | 7 +- 2 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 0001-plugin-ignore-unwanted-net-ports.patch diff --git a/0001-plugin-ignore-unwanted-net-ports.patch b/0001-plugin-ignore-unwanted-net-ports.patch new file mode 100644 index 0000000..f8a701d --- /dev/null +++ b/0001-plugin-ignore-unwanted-net-ports.patch @@ -0,0 +1,185 @@ +From fd1a26fc36df005d66627109875631264d2f8e19 Mon Sep 17 00:00:00 2001 +From: Aleksander Morgado +Date: Wed, 22 May 2019 23:20:30 +0200 +Subject: [PATCH] plugin: ignore unwanted net ports + + * For QMI modems, make sure we only grab QMI data ports (flag the + rest as ignored). + * For MBIM modems, make sure we only grab MBIM data ports (flag the + rest as ignored). + * For other plugins that use NET ports in their logic, make sure we + only grab non-QMI and non-MBIM data ports. +--- + src/mm-plugin.c | 120 +++++++++++++++++++++++++++++++++++------------- + 1 file changed, 89 insertions(+), 31 deletions(-) + +diff --git a/src/mm-plugin.c b/src/mm-plugin.c +index 08fe2cd0..a19111ff 100644 +--- a/src/mm-plugin.c ++++ b/src/mm-plugin.c +@@ -37,6 +37,13 @@ + #include "mm-log.h" + #include "mm-daemon-enums-types.h" + ++#if defined WITH_QMI ++# include "mm-broadband-modem-qmi.h" ++#endif ++#if defined WITH_MBIM ++# include "mm-broadband-modem-mbim.h" ++#endif ++ + G_DEFINE_TYPE (MMPlugin, mm_plugin, G_TYPE_OBJECT) + + /* Virtual port corresponding to the embedded modem */ +@@ -920,9 +927,22 @@ mm_plugin_create_modem (MMPlugin *self, + + /* Grab each port */ + for (l = port_probes; l; l = g_list_next (l)) { +- GError *inner_error = NULL; +- MMPortProbe *probe = MM_PORT_PROBE (l->data); +- gboolean grabbed; ++ GError *inner_error = NULL; ++ MMPortProbe *probe; ++ gboolean grabbed = FALSE; ++ gboolean force_ignored = FALSE; ++ const gchar *subsys; ++ const gchar *name; ++ const gchar *driver; ++ MMPortType port_type; ++ ++ probe = MM_PORT_PROBE (l->data); ++ ++ subsys = mm_port_probe_get_port_subsys (probe); ++ name = mm_port_probe_get_port_name (probe); ++ port_type = mm_port_probe_get_port_type (probe); ++ ++ driver = mm_kernel_device_get_driver (mm_port_probe_peek_port (probe)); + + /* If grabbing a port fails, just warn. We'll decide if the modem is + * valid or not when all ports get organized */ +@@ -931,45 +951,82 @@ mm_plugin_create_modem (MMPlugin *self, + * probed and accepted by the generic plugin, which is overwritten + * by the specific one when needed. */ + if (apply_subsystem_filter (self, mm_port_probe_peek_port (probe))) { +- grabbed = FALSE; + inner_error = g_error_new (MM_CORE_ERROR, + MM_CORE_ERROR_UNSUPPORTED, + "unsupported subsystem: '%s'", +- mm_port_probe_get_port_subsys (probe)); ++ subsys); ++ goto next; + } ++ + /* Ports that are explicitly blacklisted will be grabbed as ignored */ +- else if (mm_port_probe_is_ignored (probe)) { +- mm_dbg ("(%s/%s): port is blacklisted", +- mm_port_probe_get_port_subsys (probe), +- mm_port_probe_get_port_name (probe)); +- grabbed = mm_base_modem_grab_port (modem, +- mm_port_probe_peek_port (probe), +- MM_PORT_TYPE_IGNORED, +- MM_PORT_SERIAL_AT_FLAG_NONE, +- &inner_error); ++ if (mm_port_probe_is_ignored (probe)) { ++ mm_dbg ("(%s/%s): port is blacklisted", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; + } +-#if !defined WITH_QMI +- else if (mm_port_probe_get_port_type (probe) == MM_PORT_TYPE_NET && +- !g_strcmp0 (mm_kernel_device_get_driver (mm_port_probe_peek_port (probe)), "qmi_wwan")) { +- /* Try to generically grab the port, but flagged as ignored */ +- grabbed = mm_base_modem_grab_port (modem, +- mm_port_probe_peek_port (probe), +- MM_PORT_TYPE_IGNORED, +- MM_PORT_SERIAL_AT_FLAG_NONE, +- &inner_error); ++ ++#if defined WITH_QMI ++ if (MM_IS_BROADBAND_MODEM_QMI (modem) && ++ port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "qmi_wwan") != 0) { ++ /* Non-QMI net ports are ignored in QMI modems */ ++ mm_dbg ("(%s/%s): ignoring non-QMI net port in QMI modem", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; ++ } ++ ++ if (!MM_IS_BROADBAND_MODEM_QMI (modem) && ++ port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "qmi_wwan") == 0) { ++ /* QMI net ports are ignored in non-QMI modems */ ++ mm_dbg ("(%s/%s): ignoring QMI net port in non-QMI modem", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; ++ } ++#else ++ if (port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "qmi_wwan") != 0) { ++ /* QMI net ports are ignored if QMI support not built */ ++ mm_dbg ("(%s/%s): ignoring QMI net port as QMI support isn't available", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; ++ } ++#endif ++ ++#if defined WITH_MBIM ++ if (MM_IS_BROADBAND_MODEM_MBIM (modem) && ++ port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "cdc_mbim") != 0) { ++ /* Non-MBIM net ports are ignored in MBIM modems */ ++ mm_dbg ("(%s/%s): ignoring non-MBIM net port in MBIM modem", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; ++ } ++ ++ if (!MM_IS_BROADBAND_MODEM_MBIM (modem) && ++ port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "cdc_mbim") == 0) { ++ /* MBIM net ports are ignored in non-MBIM modems */ ++ mm_dbg ("(%s/%s): ignoring MBIM net port in non-MBIM modem", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; ++ } ++#else ++ if (port_type == MM_PORT_TYPE_NET && ++ g_strcmp0 (driver, "cdc_mbim") == 0) { ++ mm_dbg ("(%s/%s): ignoring MBIM net port as MBIM support isn't available", subsys, name); ++ force_ignored = TRUE; ++ goto grab_port; + } + #endif +-#if !defined WITH_MBIM +- else if (mm_port_probe_get_port_type (probe) == MM_PORT_TYPE_NET && +- !g_strcmp0 (mm_kernel_device_get_driver (mm_port_probe_peek_port (probe)), "cdc_mbim")) { +- /* Try to generically grab the port, but flagged as ignored */ ++ ++ grab_port: ++ if (force_ignored) + grabbed = mm_base_modem_grab_port (modem, + mm_port_probe_peek_port (probe), + MM_PORT_TYPE_IGNORED, + MM_PORT_SERIAL_AT_FLAG_NONE, + &inner_error); +- } +-#endif + else if (MM_PLUGIN_GET_CLASS (self)->grab_port) + grabbed = MM_PLUGIN_GET_CLASS (self)->grab_port (MM_PLUGIN (self), + modem, +@@ -981,10 +1038,11 @@ mm_plugin_create_modem (MMPlugin *self, + mm_port_probe_get_port_type (probe), + MM_PORT_SERIAL_AT_FLAG_NONE, + &inner_error); ++ ++ next: + if (!grabbed) { + mm_warn ("Could not grab port (%s/%s): '%s'", +- mm_port_probe_get_port_subsys (MM_PORT_PROBE (l->data)), +- mm_port_probe_get_port_name (MM_PORT_PROBE (l->data)), ++ subsys, name, + inner_error ? inner_error->message : "unknown error"); + g_clear_error (&inner_error); + } +-- +2.21.0 + diff --git a/ModemManager.spec b/ModemManager.spec index 6e86f81..e1e5ba2 100644 --- a/ModemManager.spec +++ b/ModemManager.spec @@ -7,8 +7,9 @@ Summary: Mobile broadband modem management service Name: ModemManager Version: 1.10.6 -Release: 1%{?dist} +Release: 2%{?dist} Source: https://www.freedesktop.org/software/ModemManager/%{name}-%{version}.tar.xz +Patch0: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/commit/fd1a26fc36df.patch#/0001-plugin-ignore-unwanted-net-ports.patch License: GPLv2+ URL: http://www.freedesktop.org/wiki/Software/ModemManager/ @@ -85,6 +86,7 @@ Vala bindings for ModemManager %prep %setup -q +%patch0 -p1 %build # Regenerate configure, because the one that is shipped @@ -184,6 +186,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %{_datadir}/vala/vapi/libmm-glib.* %changelog +* Mon Sep 23 2019 Lubomir Rintel - 1.10.6-2 +- Don't grab cdc_ether devices on Sierra QMI modems + * Mon Sep 23 2019 Lubomir Rintel - 1.10.6-1 - Update to 1.10.6 release