Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ofono for openSUSE:Factory checked in at 2025-12-11 18:41:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ofono (Old) and /work/SRC/openSUSE:Factory/.ofono.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ofono" Thu Dec 11 18:41:55 2025 rev:33 rq:1322203 version:2.19 Changes: -------- --- /work/SRC/openSUSE:Factory/ofono/ofono.changes 2025-08-27 21:36:28.123164999 +0200 +++ /work/SRC/openSUSE:Factory/.ofono.new.1939/ofono.changes 2025-12-11 18:45:24.923743476 +0100 @@ -1,0 +2,7 @@ +Sun Dec 7 22:03:31 UTC 2025 - Martin Hauke <[email protected]> + +- Update to version 2.19 + * Add support for PPP reset workaround for SIM7100 modem. + * Add support for Qualcomm RAW-IP only devices. + +------------------------------------------------------------------- Old: ---- ofono-2.18.tar.xz New: ---- ofono-2.19.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ofono.spec ++++++ --- /var/tmp/diff_new_pack.oCI8Xm/_old 2025-12-11 18:45:25.763778770 +0100 +++ /var/tmp/diff_new_pack.oCI8Xm/_new 2025-12-11 18:45:25.767778938 +0100 @@ -19,7 +19,7 @@ Name: ofono -Version: 2.18 +Version: 2.19 Release: 0 Summary: Mobile telephony application development framework License: GPL-2.0-only ++++++ ofono-2.18.tar.xz -> ofono-2.19.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/ChangeLog new/ofono-2.19/ChangeLog --- old/ofono-2.18/ChangeLog 2025-07-25 11:35:42.000000000 +0200 +++ new/ofono-2.19/ChangeLog 2025-11-21 20:53:43.000000000 +0100 @@ -1,3 +1,7 @@ +ver 2.19: + Add support for PPP reset workaround for SIM7100 modem. + Add support for Qualcomm RAW-IP only devices. + ver 2.18: Fix issue with QMI and handling SMS message acknowledgement. Fix issue with handling SIM7100 modem ready detection. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/Makefile.am new/ofono-2.19/Makefile.am --- old/ofono-2.18/Makefile.am 2025-02-13 00:00:27.000000000 +0100 +++ new/ofono-2.19/Makefile.am 2025-11-21 20:53:43.000000000 +0100 @@ -578,7 +578,6 @@ builtin_sources += plugins/quectel.c builtin_sources += plugins/ublox.c builtin_sources += plugins/xmm7xxx.c -builtin_sources += plugins/droid.c builtin_modules += stemgr builtin_sources += plugins/stemgr.c diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/Makefile.in new/ofono-2.19/Makefile.in --- old/ofono-2.18/Makefile.in 2025-07-25 11:37:32.000000000 +0200 +++ new/ofono-2.19/Makefile.in 2025-11-21 20:55:44.000000000 +0100 @@ -287,8 +287,8 @@ @ATMODEM_TRUE@ plugins/samsung.c plugins/sim900.c \ @ATMODEM_TRUE@ plugins/sim7100.c plugins/telit.c \ @ATMODEM_TRUE@ plugins/quectel.c plugins/ublox.c \ -@ATMODEM_TRUE@ plugins/xmm7xxx.c plugins/droid.c \ -@ATMODEM_TRUE@ plugins/stemgr.c plugins/connman.c +@ATMODEM_TRUE@ plugins/xmm7xxx.c plugins/stemgr.c \ +@ATMODEM_TRUE@ plugins/connman.c @ATMODEM_TRUE@am__append_16 = stemgr connman @ATMODEM_TRUE@@BLUETOOTH_TRUE@am__append_17 = hfp_bluez5 dun_gw_bluez5 @ATMODEM_TRUE@@BLUETOOTH_TRUE@am__append_18 = plugins/hfp_hf_bluez5.c \ @@ -635,9 +635,8 @@ plugins/alcatel.c plugins/speedup.c plugins/samsung.c \ plugins/sim900.c plugins/sim7100.c plugins/telit.c \ plugins/quectel.c plugins/ublox.c plugins/xmm7xxx.c \ - plugins/droid.c plugins/stemgr.c plugins/connman.c \ - plugins/hfp_hf_bluez5.c plugins/bluez5.h \ - plugins/dun_gw_bluez5.c plugins/bluez5.c \ + plugins/stemgr.c plugins/connman.c plugins/hfp_hf_bluez5.c \ + plugins/bluez5.h plugins/dun_gw_bluez5.c plugins/bluez5.c \ plugins/hfp_ag_bluez5.c plugins/upower.c examples/history.c \ examples/nettime.c examples/emulator.c \ examples/private-network.c plugins/stktest.c \ @@ -863,7 +862,7 @@ @ATMODEM_TRUE@ plugins/quectel.$(OBJEXT) \ @ATMODEM_TRUE@ plugins/ublox.$(OBJEXT) \ @ATMODEM_TRUE@ plugins/xmm7xxx.$(OBJEXT) \ -@ATMODEM_TRUE@ plugins/droid.$(OBJEXT) plugins/stemgr.$(OBJEXT) \ +@ATMODEM_TRUE@ plugins/stemgr.$(OBJEXT) \ @ATMODEM_TRUE@ plugins/connman.$(OBJEXT) @ATMODEM_TRUE@@BLUETOOTH_TRUE@am__objects_17 = \ @ATMODEM_TRUE@@BLUETOOTH_TRUE@ plugins/hfp_hf_bluez5.$(OBJEXT) \ @@ -1286,7 +1285,7 @@ gril/$(DEPDIR)/parcel.Po plugins/$(DEPDIR)/alcatel.Po \ plugins/$(DEPDIR)/allowed-apns.Po plugins/$(DEPDIR)/bluez5.Po \ plugins/$(DEPDIR)/calypso.Po plugins/$(DEPDIR)/cinterion.Po \ - plugins/$(DEPDIR)/connman.Po plugins/$(DEPDIR)/droid.Po \ + plugins/$(DEPDIR)/connman.Po \ plugins/$(DEPDIR)/dun_gw_bluez5.Po \ plugins/$(DEPDIR)/emulator_fuzz.Po plugins/$(DEPDIR)/g1.Po \ plugins/$(DEPDIR)/gemalto.Po plugins/$(DEPDIR)/gobi.Po \ @@ -3344,8 +3343,6 @@ plugins/$(DEPDIR)/$(am__dirstamp) plugins/xmm7xxx.$(OBJEXT): plugins/$(am__dirstamp) \ plugins/$(DEPDIR)/$(am__dirstamp) -plugins/droid.$(OBJEXT): plugins/$(am__dirstamp) \ - plugins/$(DEPDIR)/$(am__dirstamp) plugins/stemgr.$(OBJEXT): plugins/$(am__dirstamp) \ plugins/$(DEPDIR)/$(am__dirstamp) plugins/connman.$(OBJEXT): plugins/$(am__dirstamp) \ @@ -3957,7 +3954,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/calypso.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/cinterion.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/connman.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/droid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/dun_gw_bluez5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/emulator_fuzz.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@plugins/$(DEPDIR)/g1.Po@am__quote@ # am--include-marker @@ -5197,7 +5193,6 @@ -rm -f plugins/$(DEPDIR)/calypso.Po -rm -f plugins/$(DEPDIR)/cinterion.Po -rm -f plugins/$(DEPDIR)/connman.Po - -rm -f plugins/$(DEPDIR)/droid.Po -rm -f plugins/$(DEPDIR)/dun_gw_bluez5.Po -rm -f plugins/$(DEPDIR)/emulator_fuzz.Po -rm -f plugins/$(DEPDIR)/g1.Po @@ -5635,7 +5630,6 @@ -rm -f plugins/$(DEPDIR)/calypso.Po -rm -f plugins/$(DEPDIR)/cinterion.Po -rm -f plugins/$(DEPDIR)/connman.Po - -rm -f plugins/$(DEPDIR)/droid.Po -rm -f plugins/$(DEPDIR)/dun_gw_bluez5.Po -rm -f plugins/$(DEPDIR)/emulator_fuzz.Po -rm -f plugins/$(DEPDIR)/g1.Po diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/configure new/ofono-2.19/configure --- old/ofono-2.18/configure 2025-07-25 11:37:27.000000000 +0200 +++ new/ofono-2.19/configure 2025-11-21 20:55:39.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for ofono 2.18. +# Generated by GNU Autoconf 2.72 for ofono 2.19. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, @@ -611,8 +611,8 @@ # Identity of this package. PACKAGE_NAME='ofono' PACKAGE_TARNAME='ofono' -PACKAGE_VERSION='2.18' -PACKAGE_STRING='ofono 2.18' +PACKAGE_VERSION='2.19' +PACKAGE_STRING='ofono 2.19' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1424,7 +1424,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures ofono 2.18 to adapt to many kinds of systems. +'configure' configures ofono 2.19 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1495,7 +1495,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ofono 2.18:";; + short | recursive ) echo "Configuration of ofono 2.19:";; esac cat <<\_ACEOF @@ -1645,7 +1645,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ofono configure 2.18 +ofono configure 2.19 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -1869,7 +1869,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ofono $as_me 2.18, which was +It was created by ofono $as_me 2.19, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3170,7 +3170,7 @@ # Define the identity of the package. PACKAGE='ofono' - VERSION='2.18' + VERSION='2.19' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -16080,7 +16080,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by ofono $as_me 2.18, which was +This file was extended by ofono $as_me 2.19, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -16148,7 +16148,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -ofono config.status 2.18 +ofono config.status 2.19 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/configure.ac new/ofono-2.19/configure.ac --- old/ofono-2.18/configure.ac 2025-07-25 11:35:42.000000000 +0200 +++ new/ofono-2.19/configure.ac 2025-11-21 20:53:43.000000000 +0100 @@ -1,5 +1,5 @@ AC_PREREQ([2.69]) -AC_INIT([ofono], [2.18]) +AC_INIT([ofono], [2.19]) AC_CONFIG_HEADERS(config.h) AC_CONFIG_AUX_DIR(build-aux) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/drivers/atmodem/network-registration.c new/ofono-2.19/drivers/atmodem/network-registration.c --- old/ofono-2.18/drivers/atmodem/network-registration.c 2024-11-07 18:37:55.000000000 +0100 +++ new/ofono-2.19/drivers/atmodem/network-registration.c 2025-11-21 20:53:43.000000000 +0100 @@ -38,6 +38,7 @@ static const char *cind_prefix[] = { "+CIND:", NULL }; static const char *cmer_prefix[] = { "+CMER:", NULL }; static const char *smoni_prefix[] = { "^SMONI:", NULL }; +static const char *simcom_tech_prefix[] = { "+CNSMOD:", NULL }; static const char *zpas_prefix[] = { "+ZPAS:", NULL }; static const char *option_tech_prefix[] = { "_OCTI:", "_OUWCTI:", NULL }; @@ -179,6 +180,45 @@ return tech; } +static int simcom_parse_tech(GAtResult *result) +{ + GAtResultIter iter; + int s, stat, tech; + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CNSMOD:")) + return -1; + + if (!g_at_result_iter_next_number(&iter, &s)) + return -1; + + if (!g_at_result_iter_next_number(&iter, &stat)) + return -1; + + switch (stat) { + case 1: /* GSM */ + tech = ACCESS_TECHNOLOGY_GSM; + break; + case 2: /* GPRS */ + tech = ACCESS_TECHNOLOGY_GSM; + break; + case 3: /* EDGE */ + tech = ACCESS_TECHNOLOGY_GSM_EGPRS; + break; + case 8: /* LTE */ + tech = ACCESS_TECHNOLOGY_EUTRAN; + break; + default: + tech = -1; + break; + } + + DBG("stat %d tech %d", stat, tech); + + return tech; +} + static void at_creg_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; @@ -246,6 +286,18 @@ nd->tech = -1; } +static void simcom_tech_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct cb_data *cbd = user_data; + struct ofono_netreg *netreg = cbd->data; + struct at_netreg_data *nd = ofono_netreg_get_data(netreg); + + if (ok) + nd->tech = simcom_parse_tech(result); + else + nd->tech = -1; +} + void at_registration_status(struct ofono_netreg *netreg, ofono_netreg_status_cb_t cb, void *data) @@ -299,6 +351,13 @@ option_tech_cb, cbd, NULL) == 0) nd->tech = -1; break; + case OFONO_VENDOR_SIMCOM_A76XX: + /* Send AT+CNSMOD? to find out the current tech */ + if (g_at_chat_send(nd->chat, "AT+CNSMOD?", + simcom_tech_prefix, + simcom_tech_cb, cbd, NULL) == 0) + nd->tech = -1; + break; } if (g_at_chat_send(nd->chat, "AT+CREG?", creg_prefix, @@ -353,13 +412,6 @@ op.status = 2; op.tech = tech; - /* - * SIMCom modems shows the current tech via the +COPS - * not like other modems where it's shown via +CREG - */ - if (nd->vendor == OFONO_VENDOR_SIMCOM_A76XX) - nd->tech = tech; - DBG("cops_cb: %s, %s %s %d", name, nd->mcc, nd->mnc, tech); cb(&error, &op, cbd->data); @@ -1561,6 +1613,21 @@ tq->status, tq->lac, tq->ci, tech); } +static void simcom_query_tech_cb(gboolean ok, GAtResult *result, + gpointer user_data) +{ + struct tech_query *tq = user_data; + int tech; + + if (ok) + tech = simcom_parse_tech(result); + else + tech = -1; + + ofono_netreg_status_notify(tq->netreg, + tq->status, tq->lac, tq->ci, tech); +} + static void creg_notify(GAtResult *result, gpointer user_data) { struct ofono_netreg *netreg = user_data; @@ -1572,8 +1639,16 @@ &lac, &ci, &tech, nd->vendor) == FALSE) return; - if (status != 1 && status != 5) - goto notify; + switch (status) { + case NETWORK_REGISTRATION_STATUS_REGISTERED: + case NETWORK_REGISTRATION_STATUS_ROAMING: + case NETWORK_REGISTRATION_STATUS_REGISTERED_SMS_EUTRAN: + case NETWORK_REGISTRATION_STATUS_ROAMING_SMS_EUTRAN: + break; + default: + goto notify; + break; + } tq = g_try_new0(struct tech_query, 1); if (tq == NULL) @@ -1612,6 +1687,12 @@ gemalto_query_tech_cb, tq, g_free) > 0) return; break; + case OFONO_VENDOR_SIMCOM_A76XX: + if (g_at_chat_send(nd->chat, "AT+CNSMOD?", + simcom_tech_prefix, + simcom_query_tech_cb, tq, g_free) > 0) + return; + break; } g_free(tq); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/ell/main.c new/ofono-2.19/ell/main.c --- old/ofono-2.18/ell/main.c 2024-02-06 18:44:14.000000000 +0100 +++ new/ofono-2.19/ell/main.c 2025-11-21 15:06:25.000000000 +0100 @@ -350,6 +350,7 @@ const char *sock; struct sockaddr_un addr; const char *watchdog_usec; + socklen_t len; int msec; /* check if NOTIFY_SOCKET has been set */ @@ -370,11 +371,12 @@ memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, sock, sizeof(addr.sun_path) - 1); + len = offsetof(struct sockaddr_un, sun_path) + strlen(sock); if (addr.sun_path[0] == '@') addr.sun_path[0] = '\0'; - if (bind(notify_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + if (connect(notify_fd, (struct sockaddr *) &addr, len) < 0) { close(notify_fd); notify_fd = 0; return; @@ -498,6 +500,7 @@ if (unlikely(epoll_running)) return EXIT_FAILURE; + sd_notify("READY=1"); epoll_running = true; for (;;) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/ell/test.c new/ofono-2.19/ell/test.c --- old/ofono-2.18/ell/test.c 2025-05-07 12:33:02.000000000 +0200 +++ new/ofono-2.19/ell/test.c 2025-09-23 16:36:05.000000000 +0200 @@ -456,7 +456,7 @@ } if (tap_enable) { - printf("TAP version 12\n"); + printf("TAP version 13\n"); printf("1..%u\n", test_count); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/ell/tls-suites.c new/ofono-2.19/ell/tls-suites.c --- old/ofono-2.18/ell/tls-suites.c 2023-09-27 11:03:04.000000000 +0200 +++ new/ofono-2.19/ell/tls-suites.c 2025-09-23 16:36:05.000000000 +0200 @@ -781,6 +781,7 @@ &secret)) { TLS_DISCONNECT(TLS_ALERT_INTERNAL_ERROR, 0, "Generating ECDH shared-secret failed"); + l_ecc_point_free(other_public); return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/plugins/droid.c new/ofono-2.19/plugins/droid.c --- old/ofono-2.18/plugins/droid.c 2024-06-05 21:58:50.000000000 +0200 +++ new/ofono-2.19/plugins/droid.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,172 +0,0 @@ -/* - * oFono - Open Source Telephony - * Copyright (C) 2008-2011 Intel Corporation - * Copyright (C) 2009 Collabora Ltd - * Copyright (C) 2020 Pavel Machek - * - * SPDX-License-Identifier: GPL-2.0-only - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdlib.h> -#include <errno.h> - -#include <glib.h> -#include <gatchat.h> -#include <gattty.h> - -#define OFONO_API_SUBJECT_TO_CHANGE -#include <ofono/plugin.h> -#include <ofono/log.h> -#include <ofono/modem.h> -#include <ofono/call-barring.h> -#include <ofono/call-forwarding.h> -#include <ofono/call-meter.h> -#include <ofono/call-settings.h> -#include <ofono/devinfo.h> -#include <ofono/message-waiting.h> -#include <ofono/netreg.h> -#include <ofono/phonebook.h> -#include <ofono/sim.h> -#include <ofono/sms.h> -#include <ofono/ussd.h> -#include <ofono/voicecall.h> - -#include <drivers/atmodem/atutil.h> -#include <drivers/atmodem/vendor.h> - -static void droid_debug(const char *str, void *user_data) -{ - const char *prefix = user_data; - - ofono_info("%s%s", prefix, str); -} - -/* Detect hardware, and initialize if found */ -static int droid_probe(struct ofono_modem *modem) -{ - DBG(""); - - return 0; -} - -static void droid_remove(struct ofono_modem *modem) -{ - GAtChat *chat = ofono_modem_get_data(modem); - - DBG(""); - - if (chat) { - g_at_chat_unref(chat); - ofono_modem_set_data(modem, NULL); - } -} - -static void cfun_set_on_cb(gboolean ok, GAtResult *result, gpointer user_data) -{ - struct ofono_modem *modem = user_data; - - DBG(""); - - if (ok) - ofono_modem_set_powered(modem, TRUE); -} - -/* power up hardware */ -static int droid_enable(struct ofono_modem *modem) -{ - GAtChat *chat; - - DBG(""); - - chat = at_util_open_device(modem, "Device", droid_debug, "", NULL); - ofono_modem_set_data(modem, chat); - - /* ensure modem is in a known state; verbose on, echo/quiet off */ - g_at_chat_send(chat, "ATE0Q0V1", NULL, NULL, NULL, NULL); - - /* power up modem */ - g_at_chat_send(chat, "AT+CFUN=1", NULL, cfun_set_on_cb, modem, NULL); - - return 0; -} - -static void cfun_set_off_cb(gboolean ok, GAtResult *result, gpointer user_data) -{ - struct ofono_modem *modem = user_data; - GAtChat *chat = ofono_modem_get_data(modem); - - DBG(""); - - g_at_chat_unref(chat); - ofono_modem_set_data(modem, NULL); - - if (ok) - ofono_modem_set_powered(modem, FALSE); -} - -static int droid_disable(struct ofono_modem *modem) -{ - GAtChat *chat = ofono_modem_get_data(modem); - - DBG(""); - - /* power down modem */ - g_at_chat_cancel_all(chat); - g_at_chat_unregister_all(chat); - g_at_chat_send(chat, "AT+CFUN=0", NULL, cfun_set_off_cb, modem, NULL); - - return -EINPROGRESS; -} - -static void droid_pre_sim(struct ofono_modem *modem) -{ - GAtChat *chat = ofono_modem_get_data(modem); - struct ofono_sim *sim; - - DBG(""); - - ofono_devinfo_create(modem, 0, "atmodem", chat); - sim = ofono_sim_create(modem, OFONO_VENDOR_DROID, "atmodem", chat); - ofono_voicecall_create(modem, OFONO_VENDOR_DROID, "atmodem", chat); - - if (sim) - ofono_sim_inserted_notify(sim, TRUE); -} - -static void droid_post_sim(struct ofono_modem *modem) -{ - GAtChat *chat = ofono_modem_get_data(modem); - struct ofono_message_waiting *mw; - - DBG(""); - - ofono_ussd_create(modem, 0, "atmodem", chat); - ofono_call_forwarding_create(modem, 0, "atmodem", chat); - ofono_call_settings_create(modem, 0, "atmodem", chat); - ofono_netreg_create(modem, 0, "atmodem", chat); - /* - * Droid 4 modem has problems with AT+CPUC?, avoid call meter for now. - */ - ofono_call_barring_create(modem, 0, "atmodem", chat); - ofono_sms_create(modem, OFONO_VENDOR_DROID, "atmodem", chat); - ofono_phonebook_create(modem, 0, "atmodem", chat); - - mw = ofono_message_waiting_create(modem); - if (mw) - ofono_message_waiting_register(mw); -} - -static struct ofono_modem_driver droid_driver = { - .probe = droid_probe, - .remove = droid_remove, - .enable = droid_enable, - .disable = droid_disable, - .pre_sim = droid_pre_sim, - .post_sim = droid_post_sim, -}; - -OFONO_MODEM_DRIVER_BUILTIN(droid, &droid_driver) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/plugins/gobi.c new/ofono-2.19/plugins/gobi.c --- old/ofono-2.18/plugins/gobi.c 2025-03-26 11:21:26.000000000 +0100 +++ new/ofono-2.19/plugins/gobi.c 2025-11-21 20:53:43.000000000 +0100 @@ -57,6 +57,7 @@ #define GOBI_UIM (1 << 5) #define GOBI_VOICE (1 << 6) #define GOBI_WDA (1 << 7) +#define GOBI_LTE (1 << 8) #define MAX_CONTEXTS 4 #define DEFAULT_MTU 1400 @@ -108,6 +109,7 @@ uint32_t set_powered_id; uint32_t set_mtu_id; enum wda_data_format data_format; + uint8_t off_opmode; bool no_pass_through : 1; }; @@ -216,12 +218,14 @@ struct gobi_data *data; const char *if_driver; const char *ifname; + const char *opmode; uint8_t interface_number; int ifindex; const char *bus; struct stat st; _auto_(l_free) char *pass_through = NULL; bool no_pass_through = false; + uint8_t off_opmode = QMI_DMS_OPER_MODE_LOW_POWER; DBG("%p", modem); @@ -230,6 +234,7 @@ ifname = ofono_modem_get_string(modem, "NetworkInterface"); ifindex = ofono_modem_get_integer(modem, "NetworkInterfaceIndex"); bus = ofono_modem_get_string(modem, "Bus"); + opmode = ofono_modem_get_string(modem, "OfflineOperatingMode"); DBG("net: %s[%s](%d) %s", ifname, if_driver, ifindex, bus); @@ -254,6 +259,15 @@ return -errno; } + if (opmode) { + DBG("offline power mode: %s", opmode); + + if (!strcmp(opmode, "PersistentLowPower")) + off_opmode = QMI_DMS_OPER_MODE_PERSIST_LOW_POWER; + else if (strcmp(opmode, "LowPower")) + return -ENOTSUP; + } + data = l_new(struct gobi_data, 1); data->main_net_ifindex = ifindex; l_strlcpy(data->main_net_name, ifname, sizeof(data->main_net_name)); @@ -261,9 +275,9 @@ data->no_pass_through = no_pass_through; /* See drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h */ data->max_aggregation_size = 16384; + data->off_opmode = off_opmode; ofono_modem_set_data(modem, data); - ofono_modem_set_capabilities(modem, OFONO_MODEM_CAPABILITY_LTE); return 0; } @@ -442,7 +456,7 @@ switch (data->oper_mode) { case QMI_DMS_OPER_MODE_ONLINE: param = qmi_param_new_uint8(QMI_DMS_PARAM_OPER_MODE, - QMI_DMS_OPER_MODE_LOW_POWER); + data->off_opmode); if (!param) { shutdown_device(modem); return; @@ -480,8 +494,17 @@ DBG("service capabilities %d", caps->data_capa); DBG("sim supported %d", caps->sim_supported); - for (i = 0; i < caps->radio_if_count; i++) - DBG("radio = %d", caps->radio_if[i]); + for (i = 0; i < caps->radio_if_count; i++) { + uint8_t iface = caps->radio_if[i]; + + DBG("radio = %d", iface); + + if (iface == QMI_DMS_RADIO_IF_LTE) + data->features |= GOBI_LTE; + } + + if (data->features & GOBI_LTE) + ofono_modem_set_capabilities(modem, OFONO_MODEM_CAPABILITY_LTE); if (qmi_service_send(data->dms, QMI_DMS_GET_OPER_MODE, NULL, get_oper_mode_cb, modem, NULL) > 0) @@ -527,7 +550,7 @@ shutdown_device(modem); } -static uint32_t start_service_requests(struct ofono_modem *modem) +static bool start_service_requests(struct ofono_modem *modem) { struct gobi_data *data = ofono_modem_get_data(modem); unsigned int i; @@ -570,7 +593,7 @@ sizeof(struct rmnet_ifinfo) * n_interfaces); data->n_premux = n_interfaces; - if (start_service_requests(modem) > 0) + if (start_service_requests(modem)) return; error: shutdown_device(modem); @@ -618,7 +641,7 @@ goto error; } - if (start_service_requests(modem) > 0) + if (start_service_requests(modem)) return; error: shutdown_device(modem); @@ -665,10 +688,21 @@ DBG(""); if (!qmi_result_set_error(result, NULL)) { + struct qmi_wda_data_format actual; + if (!compare_data_format(data, result)) goto done; ofono_error("Setting Data Format had no effect"); + + if (!qmi_wda_parse_data_format(result, &actual) && + data->data_format == WDA_DATA_FORMAT_802_3 && + actual.ll_protocol == + QMI_WDA_DATA_LINK_PROTOCOL_RAW_IP) { + ofono_warn("Modem seems to only work in raw-ip mode"); + data->data_format = WDA_DATA_FORMAT_RAW_IP; + goto done; + } } if (data->data_format == WDA_DATA_FORMAT_802_3) @@ -717,7 +751,7 @@ DBG("Failed to request WDA service, assume 802.3"); if (qmi_qmux_device_create_client(data->device, QMI_SERVICE_DMS, - request_service_cb, modem, NULL) > 0) + request_service_cb, modem, NULL)) return; goto error; @@ -792,11 +826,16 @@ add_service_request(data, &data->wms, QMI_SERVICE_WMS); if (data->features & GOBI_VOICE) add_service_request(data, &data->voice, QMI_SERVICE_VOICE); + if (data->features & GOBI_PDS) + add_service_request(data, &data->pds, QMI_SERVICE_PDS); if (data->features & GOBI_UIM) add_service_request(data, &data->uim, QMI_SERVICE_UIM); - if (qmi_qmux_device_create_client(data->device, QMI_SERVICE_WDA, - create_wda_cb, modem, NULL)) + if (data->features & GOBI_WDA) { + if (qmi_qmux_device_create_client(data->device, + QMI_SERVICE_WDA, create_wda_cb, modem, NULL)) + return; + } else if (start_service_requests(modem)) return; error: @@ -921,8 +960,7 @@ if (ofono_modem_get_boolean(modem, "AlwaysOnline")) goto out; - param = qmi_param_new_uint8(QMI_DMS_PARAM_OPER_MODE, - QMI_DMS_OPER_MODE_LOW_POWER); + param = qmi_param_new_uint8(QMI_DMS_PARAM_OPER_MODE, data->off_opmode); if (!param) return -ENOMEM; @@ -1139,7 +1177,7 @@ DBG("%p", modem); - if (data->features & GOBI_WDS) + if (data->features & GOBI_WDS && data->features & GOBI_LTE) ofono_lte_create(modem, 0, "qmimodem", qmi_service_clone(data->wds)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/plugins/sim7100.c new/ofono-2.19/plugins/sim7100.c --- old/ofono-2.18/plugins/sim7100.c 2025-07-25 11:35:42.000000000 +0200 +++ new/ofono-2.19/plugins/sim7100.c 2025-11-21 20:53:43.000000000 +0100 @@ -106,13 +106,49 @@ g_free(data); } +static void ppptim_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + + DBG(""); + + ofono_modem_set_powered(modem, TRUE); +} + +static void ppptim_support_cb(gboolean ok, GAtResult *result, + gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct sim7100_data *data = ofono_modem_get_data(modem); + + DBG(""); + + if (ok) { + /* enable reset of PPP state upon AT+CFUN=0 for A76XX modems */ + g_at_chat_send(data->at, "AT+PPPTIM=1", NULL, ppptim_cb, + modem, NULL); + } else { + ofono_warn("modem doesn't support ppp reset on disable; is the " + "firmware up to date?"); + ofono_modem_set_powered(modem, TRUE); + } +} + static void cfun_set_on_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; + struct sim7100_data *data = ofono_modem_get_data(modem); DBG(""); - if (ok) + if (!ok) + return; + + if (data->model == SIMCOM_A76XX) + /* does the modem support reset of PPP state upon AT+CFUN=0? */ + g_at_chat_send(data->at, "AT+PPPTIM?", NULL, ppptim_support_cb, + modem, NULL); + else ofono_modem_set_powered(modem, TRUE); } @@ -138,7 +174,7 @@ DBG("modem model: %s", model); - if (g_str_has_prefix(model, "A7672")) + if (g_str_has_prefix(model, "A76")) data->model = SIMCOM_A76XX; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/plugins/udevng.c new/ofono-2.19/plugins/udevng.c --- old/ofono-2.18/plugins/udevng.c 2025-07-25 11:35:42.000000000 +0200 +++ new/ofono-2.19/plugins/udevng.c 2025-11-21 20:53:43.000000000 +0100 @@ -870,7 +870,9 @@ static gboolean setup_droid(struct modem_info *modem) { - const char *at = NULL; + const struct device_info *qmi = NULL; + const struct device_info *net = NULL; + GSList *list; DBG("%s", modem->syspath); @@ -878,23 +880,31 @@ for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; const char *subsystem = - udev_device_get_subsystem(info->udev_device); - - DBG("%s %s %s %s %s", info->devnode, info->interface, - info->number, info->label, subsystem); - - if (g_strcmp0(info->interface, "255/255/255") == 0 && - g_strcmp0(info->number, "04") == 0) { - at = info->devnode; + udev_device_get_subsystem(info->udev_device); + DBG("%s %s %s %s %s %s", info->devnode, info->interface, + info->number, info->label, + info->sysattr, subsystem); + + if (g_strcmp0(subsystem, "usbmisc") == 0) { + if (g_strcmp0(info->number, "05") == 0) + qmi = info; + } else if (g_strcmp0(subsystem, "net") == 0) { + if (g_strcmp0(info->number, "05") == 0) + net = info; } } - if (at == NULL) + if (qmi == NULL || net == NULL) return FALSE; - ofono_modem_set_string(modem->modem, "Device", at); - ofono_modem_set_driver(modem->modem, "droid"); + DBG("qmi=%s net=%s", qmi->devnode, get_ifname(net)); + + + if (setup_qmi_qmux(modem, qmi, net) < 0) + return FALSE; + ofono_modem_set_string(modem->modem, "OfflineOperatingMode", + "PersistentLowPower"); return TRUE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ofono-2.18/src/ofono.conf new/ofono-2.19/src/ofono.conf --- old/ofono-2.18/src/ofono.conf 2018-12-19 15:57:34.000000000 +0100 +++ new/ofono-2.19/src/ofono.conf 2025-11-21 20:53:43.000000000 +0100 @@ -27,4 +27,8 @@ <deny send_destination="org.ofono"/> </policy> + <policy user="pipewire"> + <allow send_destination="org.ofono"/> + </policy> + </busconfig>
