Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package iwd for openSUSE:Factory checked in 
at 2023-09-02 22:07:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/iwd (Old)
 and      /work/SRC/openSUSE:Factory/.iwd.new.1766 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "iwd"

Sat Sep  2 22:07:51 2023 rev:41 rq:1108572 version:2.8

Changes:
--------
--- /work/SRC/openSUSE:Factory/iwd/iwd.changes  2023-07-10 16:39:50.434521358 
+0200
+++ /work/SRC/openSUSE:Factory/.iwd.new.1766/iwd.changes        2023-09-02 
22:08:41.341484809 +0200
@@ -1,0 +2,6 @@
+Tue Aug 29 12:27:09 UTC 2023 - Luigi Baldoni <aloi...@gmx.com>
+
+- Update to version 2.8
+  * Fix issue with handling OWE AKM in association reply.
+
+-------------------------------------------------------------------

Old:
----
  iwd-2.7.tar.sign
  iwd-2.7.tar.xz

New:
----
  iwd-2.8.tar.sign
  iwd-2.8.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ iwd.spec ++++++
--- /var/tmp/diff_new_pack.lZA5xT/_old  2023-09-02 22:08:42.493525975 +0200
+++ /var/tmp/diff_new_pack.lZA5xT/_new  2023-09-02 22:08:42.497526118 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           iwd
-Version:        2.7
+Version:        2.8
 Release:        0
 Summary:        Wireless daemon for Linux
 License:        LGPL-2.1-or-later
@@ -31,7 +31,7 @@
 BuildRequires:  pkgconfig
 BuildRequires:  systemd-rpm-macros
 BuildRequires:  pkgconfig(dbus-1)
-BuildRequires:  pkgconfig(ell) >= 0.57
+BuildRequires:  pkgconfig(ell) >= 0.58
 BuildRequires:  pkgconfig(readline)
 BuildRequires:  pkgconfig(systemd)
 %{?systemd_ordering}

++++++ iwd-2.7.tar.xz -> iwd-2.8.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ChangeLog new/iwd-2.8/ChangeLog
--- old/iwd-2.7/ChangeLog       2023-07-05 18:37:56.000000000 +0200
+++ new/iwd-2.8/ChangeLog       2023-08-24 15:01:02.000000000 +0200
@@ -1,3 +1,6 @@
+ver 2.8:
+       Fix issue with handling OWE AKM in association reply.
+
 ver 2.7:
        Fix issue with handling FT-8021X and SHA256 PMKID derivation.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/Makefile.am new/iwd-2.8/Makefile.am
--- old/iwd-2.7/Makefile.am     2023-06-22 17:17:27.000000000 +0200
+++ new/iwd-2.8/Makefile.am     2023-08-24 15:01:02.000000000 +0200
@@ -63,7 +63,8 @@
                        ell/dhcp6.h \
                        ell/acd.h \
                        ell/cleanup.h \
-                       ell/netconfig.h
+                       ell/netconfig.h \
+                       ell/sysctl.h
 
 ell_sources = ell/private.h \
                        ell/missing.h \
@@ -143,7 +144,8 @@
                        ell/dhcp6-lease.c \
                        ell/dhcp6-transport.c \
                        ell/acd.c \
-                       ell/netconfig.c
+                       ell/netconfig.c \
+                       ell/sysctl.c
 
 ell_shared = ell/useful.h ell/asn1-private.h
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/Makefile.in new/iwd-2.8/Makefile.in
--- old/iwd-2.7/Makefile.in     2023-07-05 18:39:50.000000000 +0200
+++ new/iwd-2.8/Makefile.in     2023-08-24 15:02:53.000000000 +0200
@@ -195,28 +195,28 @@
        ell/uuid.h ell/key.h ell/file.h ell/dir.h ell/net.h ell/dhcp.h \
        ell/cert.h ell/ecc.h ell/ecdh.h ell/time.h ell/path.h \
        ell/icmp6.h ell/dhcp6.h ell/acd.h ell/cleanup.h \
-       ell/netconfig.h ell/private.h ell/missing.h ell/util.c \
-       ell/test.c ell/strv.c ell/utf8.c ell/queue.c ell/hashmap.c \
-       ell/string.c ell/settings.c ell/main-private.h ell/main.c \
-       ell/idle.c ell/signal.c ell/timeout.c ell/io.c ell/ringbuf.c \
-       ell/log.c ell/checksum.c ell/netlink-private.h ell/netlink.c \
-       ell/genl.c ell/rtnl-private.h ell/rtnl.c ell/dbus-private.h \
-       ell/dbus.c ell/dbus-message.c ell/dbus-util.c \
-       ell/dbus-service.c ell/dbus-client.c ell/dbus-name-cache.c \
-       ell/dbus-filter.c ell/gvariant-private.h ell/gvariant-util.c \
-       ell/siphash-private.h ell/siphash.c ell/hwdb.c ell/cipher.c \
-       ell/random.c ell/uintset.c ell/base64.c ell/asn1-private.h \
-       ell/pem.c ell/pem-private.h ell/tls-private.h ell/tls.c \
-       ell/tls-record.c ell/tls-suites.c ell/tls-extensions.c \
-       ell/uuid.c ell/key.c ell/file.c ell/dir.c ell/net-private.h \
-       ell/net.c ell/dhcp-private.h ell/dhcp.c ell/dhcp-transport.c \
-       ell/dhcp-lease.c ell/dhcp-util.c ell/dhcp-server.c \
-       ell/cert-private.h ell/cert.c ell/cert-crypto.c \
-       ell/ecc-external.c ell/ecc-private.h ell/ecc.c ell/ecdh.c \
-       ell/time.c ell/time-private.h ell/path.c ell/dhcp6.c \
-       ell/dhcp6-private.h ell/icmp6.c ell/icmp6-private.h \
-       ell/dhcp6-lease.c ell/dhcp6-transport.c ell/acd.c \
-       ell/netconfig.c ell/useful.h
+       ell/netconfig.h ell/sysctl.h ell/private.h ell/missing.h \
+       ell/util.c ell/test.c ell/strv.c ell/utf8.c ell/queue.c \
+       ell/hashmap.c ell/string.c ell/settings.c ell/main-private.h \
+       ell/main.c ell/idle.c ell/signal.c ell/timeout.c ell/io.c \
+       ell/ringbuf.c ell/log.c ell/checksum.c ell/netlink-private.h \
+       ell/netlink.c ell/genl.c ell/rtnl-private.h ell/rtnl.c \
+       ell/dbus-private.h ell/dbus.c ell/dbus-message.c \
+       ell/dbus-util.c ell/dbus-service.c ell/dbus-client.c \
+       ell/dbus-name-cache.c ell/dbus-filter.c ell/gvariant-private.h \
+       ell/gvariant-util.c ell/siphash-private.h ell/siphash.c \
+       ell/hwdb.c ell/cipher.c ell/random.c ell/uintset.c \
+       ell/base64.c ell/asn1-private.h ell/pem.c ell/pem-private.h \
+       ell/tls-private.h ell/tls.c ell/tls-record.c ell/tls-suites.c \
+       ell/tls-extensions.c ell/uuid.c ell/key.c ell/file.c ell/dir.c \
+       ell/net-private.h ell/net.c ell/dhcp-private.h ell/dhcp.c \
+       ell/dhcp-transport.c ell/dhcp-lease.c ell/dhcp-util.c \
+       ell/dhcp-server.c ell/cert-private.h ell/cert.c \
+       ell/cert-crypto.c ell/ecc-external.c ell/ecc-private.h \
+       ell/ecc.c ell/ecdh.c ell/time.c ell/time-private.h ell/path.c \
+       ell/dhcp6.c ell/dhcp6-private.h ell/icmp6.c \
+       ell/icmp6-private.h ell/dhcp6-lease.c ell/dhcp6-transport.c \
+       ell/acd.c ell/netconfig.c ell/sysctl.c ell/useful.h
 am__objects_1 =
 am__dirstamp = $(am__leading_dot)dirstamp
 @EXTERNAL_ELL_FALSE@am__objects_2 = ell/util.lo ell/test.lo \
@@ -243,7 +243,7 @@
 @EXTERNAL_ELL_FALSE@   ell/time.lo ell/path.lo ell/dhcp6.lo \
 @EXTERNAL_ELL_FALSE@   ell/icmp6.lo ell/dhcp6-lease.lo \
 @EXTERNAL_ELL_FALSE@   ell/dhcp6-transport.lo ell/acd.lo \
-@EXTERNAL_ELL_FALSE@   ell/netconfig.lo
+@EXTERNAL_ELL_FALSE@   ell/netconfig.lo ell/sysctl.lo
 @EXTERNAL_ELL_FALSE@am_ell_libell_internal_la_OBJECTS =  \
 @EXTERNAL_ELL_FALSE@   $(am__objects_1) $(am__objects_2) \
 @EXTERNAL_ELL_FALSE@   $(am__objects_1)
@@ -677,50 +677,50 @@
        ell/$(DEPDIR)/ringbuf.Plo ell/$(DEPDIR)/rtnl.Plo \
        ell/$(DEPDIR)/settings.Plo ell/$(DEPDIR)/signal.Plo \
        ell/$(DEPDIR)/siphash.Plo ell/$(DEPDIR)/string.Plo \
-       ell/$(DEPDIR)/strv.Plo ell/$(DEPDIR)/test.Plo \
-       ell/$(DEPDIR)/time.Plo ell/$(DEPDIR)/timeout.Plo \
-       ell/$(DEPDIR)/tls-extensions.Plo ell/$(DEPDIR)/tls-record.Plo \
-       ell/$(DEPDIR)/tls-suites.Plo ell/$(DEPDIR)/tls.Plo \
-       ell/$(DEPDIR)/uintset.Plo ell/$(DEPDIR)/utf8.Plo \
-       ell/$(DEPDIR)/util.Plo ell/$(DEPDIR)/uuid.Plo \
-       monitor/$(DEPDIR)/display.Po monitor/$(DEPDIR)/main.Po \
-       monitor/$(DEPDIR)/nlmon.Po monitor/$(DEPDIR)/pcap.Po \
-       src/$(DEPDIR)/adhoc.Po src/$(DEPDIR)/agent.Po \
-       src/$(DEPDIR)/anqp.Po src/$(DEPDIR)/anqputil.Po \
-       src/$(DEPDIR)/ap.Po src/$(DEPDIR)/backtrace.Po \
-       src/$(DEPDIR)/band.Po src/$(DEPDIR)/blacklist.Po \
-       src/$(DEPDIR)/common.Po src/$(DEPDIR)/crypto.Po \
-       src/$(DEPDIR)/dbus.Po src/$(DEPDIR)/device.Po \
-       src/$(DEPDIR)/diagnostic.Po src/$(DEPDIR)/dpp-util.Po \
-       src/$(DEPDIR)/dpp.Po src/$(DEPDIR)/eap-aka.Po \
-       src/$(DEPDIR)/eap-gtc.Po src/$(DEPDIR)/eap-md5.Po \
-       src/$(DEPDIR)/eap-mschapv2.Po src/$(DEPDIR)/eap-peap.Po \
-       src/$(DEPDIR)/eap-pwd.Po src/$(DEPDIR)/eap-sim.Po \
-       src/$(DEPDIR)/eap-tls-common.Po src/$(DEPDIR)/eap-tls.Po \
-       src/$(DEPDIR)/eap-ttls.Po src/$(DEPDIR)/eap-wsc.Po \
-       src/$(DEPDIR)/eap.Po src/$(DEPDIR)/eapol.Po \
-       src/$(DEPDIR)/eapolutil.Po src/$(DEPDIR)/erp.Po \
-       src/$(DEPDIR)/fils.Po src/$(DEPDIR)/frame-xchg.Po \
-       src/$(DEPDIR)/ft.Po src/$(DEPDIR)/handshake.Po \
-       src/$(DEPDIR)/hotspot.Po src/$(DEPDIR)/ie.Po \
-       src/$(DEPDIR)/ip-pool.Po src/$(DEPDIR)/json.Po \
-       src/$(DEPDIR)/knownnetworks.Po src/$(DEPDIR)/main.Po \
-       src/$(DEPDIR)/manager.Po src/$(DEPDIR)/module.Po \
-       src/$(DEPDIR)/mpdu.Po src/$(DEPDIR)/mschaputil.Po \
-       src/$(DEPDIR)/netconfig-commit.Po src/$(DEPDIR)/netconfig.Po \
-       src/$(DEPDIR)/netdev.Po src/$(DEPDIR)/network.Po \
-       src/$(DEPDIR)/nl80211cmd.Po src/$(DEPDIR)/nl80211util.Po \
-       src/$(DEPDIR)/offchannel.Po src/$(DEPDIR)/ofono.Po \
-       src/$(DEPDIR)/owe.Po src/$(DEPDIR)/p2p.Po \
-       src/$(DEPDIR)/p2putil.Po src/$(DEPDIR)/resolve.Po \
-       src/$(DEPDIR)/rfkill.Po src/$(DEPDIR)/rrm.Po \
-       src/$(DEPDIR)/sae.Po src/$(DEPDIR)/scan.Po \
-       src/$(DEPDIR)/simauth.Po src/$(DEPDIR)/simutil.Po \
-       src/$(DEPDIR)/station.Po src/$(DEPDIR)/storage.Po \
-       src/$(DEPDIR)/sysfs.Po src/$(DEPDIR)/util.Po \
-       src/$(DEPDIR)/watchlist.Po src/$(DEPDIR)/wiphy.Po \
-       src/$(DEPDIR)/wsc.Po src/$(DEPDIR)/wscutil.Po \
-       tools/$(DEPDIR)/hwsim.Po \
+       ell/$(DEPDIR)/strv.Plo ell/$(DEPDIR)/sysctl.Plo \
+       ell/$(DEPDIR)/test.Plo ell/$(DEPDIR)/time.Plo \
+       ell/$(DEPDIR)/timeout.Plo ell/$(DEPDIR)/tls-extensions.Plo \
+       ell/$(DEPDIR)/tls-record.Plo ell/$(DEPDIR)/tls-suites.Plo \
+       ell/$(DEPDIR)/tls.Plo ell/$(DEPDIR)/uintset.Plo \
+       ell/$(DEPDIR)/utf8.Plo ell/$(DEPDIR)/util.Plo \
+       ell/$(DEPDIR)/uuid.Plo monitor/$(DEPDIR)/display.Po \
+       monitor/$(DEPDIR)/main.Po monitor/$(DEPDIR)/nlmon.Po \
+       monitor/$(DEPDIR)/pcap.Po src/$(DEPDIR)/adhoc.Po \
+       src/$(DEPDIR)/agent.Po src/$(DEPDIR)/anqp.Po \
+       src/$(DEPDIR)/anqputil.Po src/$(DEPDIR)/ap.Po \
+       src/$(DEPDIR)/backtrace.Po src/$(DEPDIR)/band.Po \
+       src/$(DEPDIR)/blacklist.Po src/$(DEPDIR)/common.Po \
+       src/$(DEPDIR)/crypto.Po src/$(DEPDIR)/dbus.Po \
+       src/$(DEPDIR)/device.Po src/$(DEPDIR)/diagnostic.Po \
+       src/$(DEPDIR)/dpp-util.Po src/$(DEPDIR)/dpp.Po \
+       src/$(DEPDIR)/eap-aka.Po src/$(DEPDIR)/eap-gtc.Po \
+       src/$(DEPDIR)/eap-md5.Po src/$(DEPDIR)/eap-mschapv2.Po \
+       src/$(DEPDIR)/eap-peap.Po src/$(DEPDIR)/eap-pwd.Po \
+       src/$(DEPDIR)/eap-sim.Po src/$(DEPDIR)/eap-tls-common.Po \
+       src/$(DEPDIR)/eap-tls.Po src/$(DEPDIR)/eap-ttls.Po \
+       src/$(DEPDIR)/eap-wsc.Po src/$(DEPDIR)/eap.Po \
+       src/$(DEPDIR)/eapol.Po src/$(DEPDIR)/eapolutil.Po \
+       src/$(DEPDIR)/erp.Po src/$(DEPDIR)/fils.Po \
+       src/$(DEPDIR)/frame-xchg.Po src/$(DEPDIR)/ft.Po \
+       src/$(DEPDIR)/handshake.Po src/$(DEPDIR)/hotspot.Po \
+       src/$(DEPDIR)/ie.Po src/$(DEPDIR)/ip-pool.Po \
+       src/$(DEPDIR)/json.Po src/$(DEPDIR)/knownnetworks.Po \
+       src/$(DEPDIR)/main.Po src/$(DEPDIR)/manager.Po \
+       src/$(DEPDIR)/module.Po src/$(DEPDIR)/mpdu.Po \
+       src/$(DEPDIR)/mschaputil.Po src/$(DEPDIR)/netconfig-commit.Po \
+       src/$(DEPDIR)/netconfig.Po src/$(DEPDIR)/netdev.Po \
+       src/$(DEPDIR)/network.Po src/$(DEPDIR)/nl80211cmd.Po \
+       src/$(DEPDIR)/nl80211util.Po src/$(DEPDIR)/offchannel.Po \
+       src/$(DEPDIR)/ofono.Po src/$(DEPDIR)/owe.Po \
+       src/$(DEPDIR)/p2p.Po src/$(DEPDIR)/p2putil.Po \
+       src/$(DEPDIR)/resolve.Po src/$(DEPDIR)/rfkill.Po \
+       src/$(DEPDIR)/rrm.Po src/$(DEPDIR)/sae.Po \
+       src/$(DEPDIR)/scan.Po src/$(DEPDIR)/simauth.Po \
+       src/$(DEPDIR)/simutil.Po src/$(DEPDIR)/station.Po \
+       src/$(DEPDIR)/storage.Po src/$(DEPDIR)/sysfs.Po \
+       src/$(DEPDIR)/util.Po src/$(DEPDIR)/watchlist.Po \
+       src/$(DEPDIR)/wiphy.Po src/$(DEPDIR)/wsc.Po \
+       src/$(DEPDIR)/wscutil.Po tools/$(DEPDIR)/hwsim.Po \
        tools/$(DEPDIR)/iwd-decrypt-profile.Po \
        tools/$(DEPDIR)/probe-req.Po unit/$(DEPDIR)/test-arc4.Po \
        unit/$(DEPDIR)/test-band.Po unit/$(DEPDIR)/test-client.Po \
@@ -1265,7 +1265,8 @@
 @EXTERNAL_ELL_FALSE@                   ell/dhcp6.h \
 @EXTERNAL_ELL_FALSE@                   ell/acd.h \
 @EXTERNAL_ELL_FALSE@                   ell/cleanup.h \
-@EXTERNAL_ELL_FALSE@                   ell/netconfig.h
+@EXTERNAL_ELL_FALSE@                   ell/netconfig.h \
+@EXTERNAL_ELL_FALSE@                   ell/sysctl.h
 
 @EXTERNAL_ELL_FALSE@ell_sources = ell/private.h \
 @EXTERNAL_ELL_FALSE@                   ell/missing.h \
@@ -1345,7 +1346,8 @@
 @EXTERNAL_ELL_FALSE@                   ell/dhcp6-lease.c \
 @EXTERNAL_ELL_FALSE@                   ell/dhcp6-transport.c \
 @EXTERNAL_ELL_FALSE@                   ell/acd.c \
-@EXTERNAL_ELL_FALSE@                   ell/netconfig.c
+@EXTERNAL_ELL_FALSE@                   ell/netconfig.c \
+@EXTERNAL_ELL_FALSE@                   ell/sysctl.c
 
 @EXTERNAL_ELL_FALSE@ell_shared = ell/useful.h ell/asn1-private.h
 @EXTERNAL_ELL_FALSE@ell_libell_internal_la_SOURCES = $(ell_headers) 
$(ell_sources) $(ell_shared)
@@ -1947,6 +1949,7 @@
        ell/$(DEPDIR)/$(am__dirstamp)
 ell/acd.lo: ell/$(am__dirstamp) ell/$(DEPDIR)/$(am__dirstamp)
 ell/netconfig.lo: ell/$(am__dirstamp) ell/$(DEPDIR)/$(am__dirstamp)
+ell/sysctl.lo: ell/$(am__dirstamp) ell/$(DEPDIR)/$(am__dirstamp)
 
 ell/libell-internal.la: $(ell_libell_internal_la_OBJECTS) 
$(ell_libell_internal_la_DEPENDENCIES) 
$(EXTRA_ell_libell_internal_la_DEPENDENCIES) ell/$(am__dirstamp)
        $(AM_V_CCLD)$(LINK) $(am_ell_libell_internal_la_rpath) 
$(ell_libell_internal_la_OBJECTS) $(ell_libell_internal_la_LIBADD) $(LIBS)
@@ -2404,6 +2407,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/siphash.Plo@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/string.Plo@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/strv.Plo@am__quote@ # 
am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/sysctl.Plo@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/test.Plo@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/time.Plo@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@ell/$(DEPDIR)/timeout.Plo@am__quote@ # 
am--include-marker
@@ -3520,6 +3524,7 @@
        -rm -f ell/$(DEPDIR)/siphash.Plo
        -rm -f ell/$(DEPDIR)/string.Plo
        -rm -f ell/$(DEPDIR)/strv.Plo
+       -rm -f ell/$(DEPDIR)/sysctl.Plo
        -rm -f ell/$(DEPDIR)/test.Plo
        -rm -f ell/$(DEPDIR)/time.Plo
        -rm -f ell/$(DEPDIR)/timeout.Plo
@@ -3753,6 +3758,7 @@
        -rm -f ell/$(DEPDIR)/siphash.Plo
        -rm -f ell/$(DEPDIR)/string.Plo
        -rm -f ell/$(DEPDIR)/strv.Plo
+       -rm -f ell/$(DEPDIR)/sysctl.Plo
        -rm -f ell/$(DEPDIR)/test.Plo
        -rm -f ell/$(DEPDIR)/time.Plo
        -rm -f ell/$(DEPDIR)/timeout.Plo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/build-aux/ltmain.sh 
new/iwd-2.8/build-aux/ltmain.sh
--- old/iwd-2.7/build-aux/ltmain.sh     2022-11-23 12:34:12.000000000 +0100
+++ new/iwd-2.8/build-aux/ltmain.sh     2023-07-17 17:03:58.000000000 +0200
@@ -31,7 +31,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.7 Debian-2.4.7-5"
+VERSION="2.4.7 Debian-2.4.7-7"
 package_revision=2.4.7
 
 
@@ -572,27 +572,15 @@
 # ---------------------
 # Append VALUE onto the existing contents of VAR.
 
-  # We should try to minimise forks, especially on Windows where they are
-  # unreasonably slow, so skip the feature probes when bash or zsh are
-  # being used:
-  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
-    : ${_G_HAVE_ARITH_OP="yes"}
-    : ${_G_HAVE_XSI_OPS="yes"}
-    # The += operator was introduced in bash 3.1
-    case $BASH_VERSION in
-      [12].* | 3.0 | 3.0*) ;;
-      *)
-        : ${_G_HAVE_PLUSEQ_OP="yes"}
-        ;;
-    esac
-  fi
-
   # _G_HAVE_PLUSEQ_OP
   # Can be empty, in which case the shell is probed, "yes" if += is
   # useable or anything else if it does not work.
-  test -z "$_G_HAVE_PLUSEQ_OP" \
-    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
-    && _G_HAVE_PLUSEQ_OP=yes
+  if test -z "$_G_HAVE_PLUSEQ_OP" &&  \
+      __PLUSEQ_TEST="a" &&  \
+      __PLUSEQ_TEST+=" b" 2>/dev/null &&  \
+      test "a b" = "$__PLUSEQ_TEST"; then
+    _G_HAVE_PLUSEQ_OP=yes
+  fi
 
 if test yes = "$_G_HAVE_PLUSEQ_OP"
 then
@@ -2308,7 +2296,7 @@
        compiler:       $LTCC
        compiler flags: $LTCFLAGS
        linker:         $LD (gnu? $with_gnu_ld)
-       version:        $progname $scriptversion Debian-2.4.7-5
+       version:        $progname $scriptversion Debian-2.4.7-7
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/client/iwctl.1 new/iwd-2.8/client/iwctl.1
--- old/iwd-2.7/client/iwctl.1  2023-07-05 18:40:58.000000000 +0200
+++ new/iwd-2.8/client/iwctl.1  2023-08-24 15:04:52.000000000 +0200
@@ -63,12 +63,10 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 $ iwctl
 [iwd]# help
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .sp
@@ -77,14 +75,12 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [iwd]# device list
 [iwd]# station DEVICE scan
 [iwd]# station DEVICE get\-networks
 [iwd]# station DEVICE connect SSID
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS Command line mode
@@ -94,11 +90,9 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 $ iwctl \-\-help
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .sp
@@ -107,14 +101,12 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 $ iwctl device list
 $ iwctl station DEVICE scan
 $ iwctl station DEVICE get\-networks
 $ iwctl \-\-passphrase=PASSPHRASE station DEVICE connect SSID
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SH SEE ALSO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/configure new/iwd-2.8/configure
--- old/iwd-2.7/configure       2023-07-05 18:39:45.000000000 +0200
+++ new/iwd-2.8/configure       2023-08-24 15:02:48.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for iwd 2.7.
+# Generated by GNU Autoconf 2.71 for iwd 2.8.
 #
 #
 # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
@@ -618,8 +618,8 @@
 # Identity of this package.
 PACKAGE_NAME='iwd'
 PACKAGE_TARNAME='iwd'
-PACKAGE_VERSION='2.7'
-PACKAGE_STRING='iwd 2.7'
+PACKAGE_VERSION='2.8'
+PACKAGE_STRING='iwd 2.8'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1433,7 +1433,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 iwd 2.7 to adapt to many kinds of systems.
+\`configure' configures iwd 2.8 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1504,7 +1504,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of iwd 2.7:";;
+     short | recursive ) echo "Configuration of iwd 2.8:";;
    esac
   cat <<\_ACEOF
 
@@ -1661,7 +1661,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-iwd configure 2.7
+iwd configure 2.8
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1879,7 +1879,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by iwd $as_me 2.7, which was
+It was created by iwd $as_me 2.8, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3154,7 +3154,7 @@
 
 # Define the identity of the package.
  PACKAGE='iwd'
- VERSION='2.7'
+ VERSION='2.8'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -14236,7 +14236,7 @@
                        test "${enable_monitor}" != "no" ||
                        test "${enable_wired}" = "yes" ||
                        test "${enable_hwsim}" = "yes"); then
-               ell_min_version="0.57"
+               ell_min_version="0.58"
        else
                ell_min_version="0.5"
        fi
@@ -14984,7 +14984,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by iwd $as_me 2.7, which was
+This file was extended by iwd $as_me 2.8, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15052,7 +15052,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-iwd config.status 2.7
+iwd config.status 2.8
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/configure.ac new/iwd-2.8/configure.ac
--- old/iwd-2.7/configure.ac    2023-07-05 18:37:56.000000000 +0200
+++ new/iwd-2.8/configure.ac    2023-08-24 15:01:02.000000000 +0200
@@ -1,5 +1,5 @@
 AC_PREREQ([2.69])
-AC_INIT([iwd],[2.7])
+AC_INIT([iwd],[2.8])
 
 AC_CONFIG_HEADERS(config.h)
 AC_CONFIG_AUX_DIR(build-aux)
@@ -297,7 +297,7 @@
                        test "${enable_monitor}" != "no" ||
                        test "${enable_wired}" = "yes" ||
                        test "${enable_hwsim}" = "yes"); then
-               ell_min_version="0.57"
+               ell_min_version="0.58"
        else
                ell_min_version="0.5"
        fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/netconfig.c new/iwd-2.8/ell/netconfig.c
--- old/iwd-2.7/ell/netconfig.c 2022-11-18 10:08:38.000000000 +0100
+++ new/iwd-2.8/ell/netconfig.c 2023-08-24 12:39:48.000000000 +0200
@@ -58,6 +58,7 @@
 #include "net-private.h"
 #include "acd.h"
 #include "timeout.h"
+#include "sysctl.h"
 #include "netconfig.h"
 
 struct l_netconfig {
@@ -89,8 +90,8 @@
        unsigned int ifaddr6_dump_cmd_id;
        struct l_queue *icmp_route_data;
        struct l_acd *acd;
-       unsigned int orig_disable_ipv6;
-       long orig_optimistic_dad;
+       uint32_t orig_disable_ipv6;
+       uint32_t orig_optimistic_dad;
        uint8_t mac[ETH_ALEN];
        struct l_timeout *ra_timeout;
        bool have_lla;
@@ -1325,59 +1326,25 @@
                                                        unsigned int value)
 {
        char ifname[IF_NAMESIZE];
-       _auto_(l_free) char *filename = NULL;
-       _auto_(close) int fd = -1;
-       int r;
-       char valuestr[20];
 
        if (unlikely(!if_indextoname(nc->ifindex, ifname)))
                return -errno;
 
-       filename = l_strdup_printf("/proc/sys/net/ipv6/conf/%s/%s",
+       return l_sysctl_set_u32(value, "/proc/sys/net/ipv6/conf/%s/%s",
                                        ifname, setting);
-
-       fd = L_TFR(open(filename, O_WRONLY));
-       if (unlikely(fd < 0))
-               return -errno;
-
-       snprintf(valuestr, sizeof(valuestr), "%u", value);
-       r = L_TFR(write(fd, valuestr, strlen(valuestr)));
-       return r > 0 ? 0 : -errno;
 }
 
-static long netconfig_proc_read_ipv6_uint_setting(struct l_netconfig *nc,
-                                                       const char *setting)
+static int netconfig_proc_read_ipv6_uint_setting(struct l_netconfig *nc,
+                                                       const char *setting,
+                                                       uint32_t *out_v)
 {
        char ifname[IF_NAMESIZE];
-       _auto_(l_free) char *filename = NULL;
-       _auto_(close) int fd = -1;
-       int r;
-       char valuestr[20];
-       long value;
-       char *endp;
 
        if (unlikely(!if_indextoname(nc->ifindex, ifname)))
                return -errno;
 
-       filename = l_strdup_printf("/proc/sys/net/ipv6/conf/%s/%s",
+       return l_sysctl_get_u32(out_v, "/proc/sys/net/ipv6/conf/%s/%s",
                                        ifname, setting);
-
-       fd = L_TFR(open(filename, O_RDONLY));
-       if (unlikely(fd < 0))
-               return -errno;
-
-       r = L_TFR(read(fd, valuestr, sizeof(valuestr) - 1));
-       if (unlikely(r < 1))
-               return r == 0 ? -EINVAL : -errno;
-
-       valuestr[r - 1] = '\0';
-       errno = 0;
-       value = strtoul(valuestr, &endp, 10);
-
-       if (unlikely(errno || !L_IN_SET(*endp, '\n', '\0')))
-               return -EINVAL;
-
-       return value;
 }
 
 LIB_EXPORT struct l_netconfig *l_netconfig_new(uint32_t ifindex)
@@ -1972,6 +1939,7 @@
 static void netconfig_ifaddr_ipv6_dump_done_cb(void *user_data)
 {
        struct l_netconfig *nc = user_data;
+       int r;
 
        /*
         * Handle the case of no link-local address having been found during
@@ -1993,14 +1961,18 @@
        netconfig_proc_write_ipv6_uint_setting(nc, "addr_gen_mode", 0);
 
        /* "enable IPv6 operation" */
-       nc->orig_disable_ipv6 =
-               netconfig_proc_read_ipv6_uint_setting(nc, "disable_ipv6");
+       r = netconfig_proc_read_ipv6_uint_setting(nc, "disable_ipv6",
+                                               &nc->orig_disable_ipv6);
+       if (r < 0) /* TODO: Log error? */
+               nc->orig_disable_ipv6 = 0;
+
        if (nc->orig_disable_ipv6)
                netconfig_proc_write_ipv6_uint_setting(nc, "disable_ipv6", 0);
 }
 
 LIB_EXPORT bool l_netconfig_start(struct l_netconfig *netconfig)
 {
+       int r;
        bool optimistic_dad;
 
        if (unlikely(!netconfig || netconfig->started))
@@ -2043,12 +2015,13 @@
         */
        optimistic_dad = netconfig->optimistic_dad_enabled &&
                !netconfig->v6_static_addr;
-       netconfig->orig_optimistic_dad =
-               netconfig_proc_read_ipv6_uint_setting(netconfig,
-                                                       "optimistic_dad");
 
-       if (netconfig->orig_optimistic_dad >= 0 &&
-                       !!netconfig->orig_optimistic_dad != optimistic_dad)
+       r = netconfig_proc_read_ipv6_uint_setting(netconfig, "optimistic_dad",
+                               &netconfig->orig_optimistic_dad);
+       if (r < 0) /* TODO: Log error? */
+               netconfig->orig_optimistic_dad = optimistic_dad;
+
+       if (!r && !!netconfig->orig_optimistic_dad != optimistic_dad)
                netconfig_proc_write_ipv6_uint_setting(netconfig,
                                                        "optimistic_dad",
                                                        optimistic_dad ? 1 : 0);
@@ -2198,8 +2171,7 @@
 
        optimistic_dad = netconfig->optimistic_dad_enabled &&
                !netconfig->v6_static_addr;
-       if (netconfig->orig_optimistic_dad >= 0 &&
-                       !!netconfig->orig_optimistic_dad != optimistic_dad)
+       if (!!netconfig->orig_optimistic_dad != optimistic_dad)
                netconfig_proc_write_ipv6_uint_setting(netconfig,
                                                "optimistic_dad",
                                                netconfig->orig_optimistic_dad);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/settings.c new/iwd-2.8/ell/settings.c
--- old/iwd-2.7/ell/settings.c  2023-05-24 16:13:48.000000000 +0200
+++ new/iwd-2.8/ell/settings.c  2023-08-24 12:39:48.000000000 +0200
@@ -1123,29 +1123,13 @@
                                        unsigned int *out)
 {
        const char *value = l_settings_get_value(settings, group_name, key);
-       unsigned long int r;
-       unsigned int t;
-       char *endp;
 
        if (!value)
                return false;
 
-       /* Do not allow '+' or '-' or empty string */
-       if (!l_ascii_isdigit(*value))
+       if (l_safe_atou32(value, out) < 0)
                goto error;
 
-       errno = 0;
-
-       t = r = strtoul(value, &endp, 0);
-       if (*endp != '\0')
-               goto error;
-
-       if (unlikely(errno == ERANGE || r != t))
-               goto error;
-
-       if (out)
-               *out = r;
-
        return true;
 
 error:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/sysctl.c new/iwd-2.8/ell/sysctl.c
--- old/iwd-2.7/ell/sysctl.c    1970-01-01 01:00:00.000000000 +0100
+++ new/iwd-2.8/ell/sysctl.c    2023-08-24 12:39:48.000000000 +0200
@@ -0,0 +1,112 @@
+/*
+ *
+ *  Embedded Linux library
+ *
+ *  Copyright (C) 2022  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2023  Cruise LLC. All rights reserved.
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <errno.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "sysctl.h"
+#include "useful.h"
+#include "util.h"
+#include "private.h"
+
+static int sysctl_write(const char *file, const void *value, size_t len)
+{
+       int fd;
+       ssize_t r;
+
+       fd = L_TFR(open(file, O_WRONLY));
+       if (unlikely(fd < 0))
+               return -errno;
+
+       r = L_TFR(write(fd, value, len));
+       if (r < 0)
+               r = -errno;
+       else
+               r = 0;
+
+       close(fd);
+       return r;
+}
+
+static int sysctl_read(const char *file, void *dest, size_t len)
+{
+       int fd;
+       ssize_t r;
+
+       fd = L_TFR(open(file, O_RDONLY));
+       if (unlikely(fd < 0))
+               return -errno;
+
+       r = L_TFR(read(fd, dest, len));
+       if (unlikely(r < 0))
+               r = -errno;
+
+       close(fd);
+       return r;
+}
+
+LIB_EXPORT int l_sysctl_get_u32(uint32_t *out_v, const char *format, ...)
+{
+       _auto_(l_free) char *filename = NULL;
+       va_list ap;
+       char valuestr[64];
+       int r;
+
+       va_start(ap, format);
+       filename = l_strdup_vprintf(format, ap);
+       va_end(ap);
+
+       r = sysctl_read(filename, valuestr, sizeof(valuestr) - 1);
+       if (r < 0)
+               return r;
+
+       while (r > 0 && L_IN_SET(valuestr[r - 1], '\n', '\r', '\t', ' '))
+               r--;
+
+       valuestr[r] = '\0';
+
+       return l_safe_atou32(valuestr, out_v);
+}
+
+LIB_EXPORT int l_sysctl_set_u32(uint32_t v, const char *format, ...)
+{
+       _auto_(l_free) char *filename = NULL;
+       va_list ap;
+       char valuestr[64];
+       size_t len;
+
+       va_start(ap, format);
+       filename = l_strdup_vprintf(format, ap);
+       va_end(ap);
+
+       len = snprintf(valuestr, sizeof(valuestr), "%u", v);
+
+       return sysctl_write(filename, valuestr, len);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/sysctl.h new/iwd-2.8/ell/sysctl.h
--- old/iwd-2.7/ell/sysctl.h    1970-01-01 01:00:00.000000000 +0100
+++ new/iwd-2.8/ell/sysctl.h    2023-08-24 12:39:48.000000000 +0200
@@ -0,0 +1,39 @@
+/*
+ *
+ *  Embedded Linux library
+ *
+ *  Copyright (C) 2022  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2023  Cruise LLC. All rights reserved.
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+int l_sysctl_get_u32(uint32_t *out_v, const char *format, ...)
+                       __attribute__((format(printf, 2, 3)));
+int l_sysctl_set_u32(uint32_t v, const char *format, ...)
+                       __attribute__((format(printf, 2, 3)));
+
+#ifdef __cplusplus
+}
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/util.c new/iwd-2.8/ell/util.c
--- old/iwd-2.7/ell/util.c      2023-01-23 19:26:15.000000000 +0100
+++ new/iwd-2.8/ell/util.c      2023-08-24 12:39:48.000000000 +0200
@@ -28,6 +28,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <limits.h>
+#include <stdint.h>
+#include <errno.h>
 
 #include "utf8.h"
 #include "util.h"
@@ -745,3 +747,83 @@
 {
        return __secure_memeq(field, size, byte) == 0 ? true : false;
 }
+
+static int safe_atou(const char *s, int base, unsigned int *out_u)
+{
+       unsigned long int r;
+       unsigned int t;
+       char *endp;
+
+       errno = 0;
+
+       t = r = strtoul(s, &endp, base);
+       if (unlikely(errno > 0))
+               return -errno;
+
+       if (endp == s || *endp != '\0')
+               return -EINVAL;
+
+       if (unlikely(r != t))
+               return -ERANGE;
+
+       if (out_u)
+               *out_u = t;
+
+       return 0;
+}
+
+LIB_EXPORT int l_safe_atou32(const char *s, uint32_t *out_u)
+{
+       if (!l_ascii_isdigit(s[0]))
+               return -EINVAL;
+
+       /* Don't allow leading zeros */
+       if (s[0] == '0' && s[1] != '\0')
+               return -EINVAL;
+
+       return safe_atou(s, 10, out_u);
+}
+
+LIB_EXPORT int l_safe_atox8(const char *s, uint8_t *out_x)
+{
+       uint32_t x;
+       int r;
+
+       r = l_safe_atox32(s, &x);
+       if (r < 0)
+               return r;
+
+       if (x > UINT8_MAX)
+               return -ERANGE;
+
+       if (out_x)
+               *out_x = x;
+
+       return 0;
+}
+
+LIB_EXPORT int l_safe_atox16(const char *s, uint16_t *out_x)
+{
+       uint32_t x;
+       int r;
+
+       r = l_safe_atox32(s, &x);
+       if (r < 0)
+               return r;
+
+       if (x > UINT16_MAX)
+               return -ERANGE;
+
+       if (out_x)
+               *out_x = x;
+
+       return 0;
+}
+
+LIB_EXPORT int l_safe_atox32(const char *s, uint32_t *out_x)
+{
+       if (!l_ascii_isxdigit(s[0]))
+               return -EINVAL;
+
+       return safe_atou(s, 16, out_x);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/ell/util.h new/iwd-2.8/ell/util.h
--- old/iwd-2.7/ell/util.h      2023-01-23 19:26:15.000000000 +0100
+++ new/iwd-2.8/ell/util.h      2023-08-24 12:39:48.000000000 +0200
@@ -427,6 +427,11 @@
                o[i] = r[i] ^ ((l[i] ^ r[i]) & mask);
 }
 
+int l_safe_atou32(const char *s, uint32_t *out_u);
+int l_safe_atox32(const char *s, uint32_t *out_u);
+int l_safe_atox16(const char *s, uint16_t *out_u);
+int l_safe_atox8(const char *s, uint8_t *out_u);
+
 #ifdef __cplusplus
 }
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/iwd.ap.5 new/iwd-2.8/src/iwd.ap.5
--- old/iwd-2.7/src/iwd.ap.5    2023-07-05 18:40:58.000000000 +0200
+++ new/iwd-2.8/src/iwd.ap.5    2023-08-24 15:04:51.000000000 +0200
@@ -150,14 +150,12 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 # Enable network configuration
 [IPv4]
 
 [other groups follow]
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .TS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/iwd.config.5 new/iwd-2.8/src/iwd.config.5
--- old/iwd-2.7/src/iwd.config.5        2023-07-05 18:40:56.000000000 +0200
+++ new/iwd-2.8/src/iwd.config.5        2023-08-24 15:04:49.000000000 +0200
@@ -79,19 +79,6 @@
 T}
 _
 T{
-APRanges
-T}     T{
-Values: <IP in prefix notation>
-.sp
-Sets the range of IP\(aqs used for DHCP server (AP mode). The IP should be
-in prefix notation e.g. 192.168.1.0/24. AP\(aqs which are started in a
-profile\-less configuration will use this pool of IP\(aqs to set the AP\(aqs
-interface address as well as default DHCP server options. Each AP will
-get a new subnet from the range and clients will be addressed in that
-subnet to avoid IP conflicts if multiple AP\(aqs are started.
-T}
-_
-T{
 UseDefaultInterface
 T}     T{
 Values: true, \fBfalse\fP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/iwd.config.rst 
new/iwd-2.8/src/iwd.config.rst
--- old/iwd-2.7/src/iwd.config.rst      2023-06-22 17:17:27.000000000 +0200
+++ new/iwd-2.8/src/iwd.config.rst      2023-08-24 15:01:02.000000000 +0200
@@ -74,16 +74,6 @@
        ``[Network]`` settings for additional settings related to network
        configuration.
 
-   * - APRanges
-     - Values: <IP in prefix notation>
-
-       Sets the range of IP's used for DHCP server (AP mode). The IP should be
-       in prefix notation e.g. 192.168.1.0/24. AP's which are started in a
-       profile-less configuration will use this pool of IP's to set the AP's
-       interface address as well as default DHCP server options. Each AP will
-       get a new subnet from the range and clients will be addressed in that
-       subnet to avoid IP conflicts if multiple AP's are started.
-
    * - UseDefaultInterface
      - Values: true, **false**
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/iwd.network.5 
new/iwd-2.8/src/iwd.network.5
--- old/iwd-2.7/src/iwd.network.5       2023-07-05 18:40:57.000000000 +0200
+++ new/iwd-2.8/src/iwd.network.5       2023-08-24 15:04:50.000000000 +0200
@@ -608,14 +608,12 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [@pem@my_ca_cert]
 \-\-\-\-\- BEGIN CERTIFICATE \-\-\-\-\-
 <PEM data>
 \-\-\-\-\- END CERTIFICATE \-\-\-\-\-
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .sp
@@ -634,62 +632,53 @@
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Settings]
 Hidden=true
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS Pre\-Shared Key (PSK)
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Security]
 Passphrase=secret123
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS PWD
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Security]
 EAP\-Method=PWD
 EAP\-Identity=u...@domain.com
 EAP\-Password=secret123
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS TLS
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Security]
 EAP\-Method=TLS
 EAP\-TLS\-ClientCert=/certs/client\-cert.pem
 EAP\-TLS\-ClientKey=/certs/client\-key.pem
 EAP\-TLS\-CACert=/certs/ca\-cert.pem
 EAP\-TLS\-ServerDomainMask=*.domain.com
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS TTLS + PAP
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Security]
 EAP\-Method=TTLS
 EAP\-Identity=o...@identity.com
@@ -698,16 +687,14 @@
 EAP\-TTLS\-Phase2\-Identity=username
 EAP\-TTLS\-Phase2\-Password=password
 EAP\-TTLS\-ServerDomainMask=*.domain.com
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SS PEAP + MSCHAPv2
 .INDENT 0.0
 .INDENT 3.5
 .sp
-.nf
-.ft C
+.EX
 [Security]
 EAP\-Method=PEAP
 EAP\-Identity=o...@identity.com
@@ -716,8 +703,7 @@
 EAP\-PEAP\-Phase2\-Identity=username
 EAP\-PEAP\-Phase2\-Password=password
 EAP\-PEAP\-ServerDomainMask=*.domain.com
-.ft P
-.fi
+.EE
 .UNINDENT
 .UNINDENT
 .SH SEE ALSO
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/netdev.c new/iwd-2.8/src/netdev.c
--- old/iwd-2.7/src/netdev.c    2023-06-22 17:17:27.000000000 +0200
+++ new/iwd-2.8/src/netdev.c    2023-08-24 15:01:02.000000000 +0200
@@ -2911,11 +2911,15 @@
                }
 
                if (netdev->owe_sm) {
-                       if (!owe_dh || !owe_akm_found) {
-                               l_error("OWE DH element/RSN not found");
+                       if (!owe_dh) {
+                               l_error("OWE DH element not found");
                                goto deauth;
                        }
 
+                       if (!owe_akm_found)
+                               l_warn("OWE AKM was not included in the RSNE. "
+                                       "This AP is out of spec!");
+
                        if (L_WARN_ON(owe_process_dh_ie(netdev->owe_sm, owe_dh,
                                                        owe_dh_len) != 0))
                                goto deauth;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/src/scan.c new/iwd-2.8/src/scan.c
--- old/iwd-2.7/src/scan.c      2022-12-18 20:59:36.000000000 +0100
+++ new/iwd-2.8/src/scan.c      2023-08-24 15:01:02.000000000 +0200
@@ -1230,8 +1230,6 @@
 {
        const uint8_t *ptr = data;
 
-       l_debug("");
-
        while (len) {
                /*
                 * TODO: Store query info for GAS response length verification
@@ -1304,8 +1302,6 @@
                                                NULL) < 0)
                                l_warn("Unable to parse BSS Load IE for "
                                        MAC, MAC_STR(bss->addr));
-                       else
-                               l_debug("Load: %u/255", bss->utilization);
 
                        break;
                case IE_TYPE_VENDOR_SPECIFIC:
@@ -1795,8 +1791,6 @@
        uint64_t wdev_id;
        uint32_t seen_ms_ago = 0;
 
-       l_debug("get_scan_callback");
-
        if (nl80211_parse_attrs(msg, NL80211_ATTR_WDEV, &wdev_id,
                                        NL80211_ATTR_UNSPEC) < 0)
                return;
@@ -1875,8 +1869,6 @@
        struct scan_results *results = user;
        struct scan_context *sc = results->sc;
 
-       l_debug("get_scan_done");
-
        sc->get_scan_cmd_id = 0;
 
        if (!results->sr || !results->sr->canceled)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iwd-2.7/tools/hwsim.c new/iwd-2.8/tools/hwsim.c
--- old/iwd-2.7/tools/hwsim.c   2023-05-24 17:38:48.000000000 +0200
+++ new/iwd-2.8/tools/hwsim.c   2023-08-24 15:01:02.000000000 +0200
@@ -62,6 +62,8 @@
        HWSIM_CMD_NEW_RADIO,
        HWSIM_CMD_DEL_RADIO,
        HWSIM_CMD_GET_RADIO,
+       HWSIM_CMD_ADD_MAC_ADDR,
+       HWSIM_CMD_DEL_MAC_ADDR,
        __HWSIM_CMD_MAX,
 };
 #define HWSIM_CMD_MAX (__HWSIM_CMD_MAX - 1)
@@ -438,6 +440,7 @@
        uint8_t addr[ETH_ALEN];
        char *name;
        uint32_t iftype;
+       int ref;
 };
 
 static struct l_queue *radio_info;
@@ -513,6 +516,14 @@
        return rec->id == id;
 }
 
+static bool interface_info_match_addr(const void *a, const void *b)
+{
+       const struct interface_info_rec *rec = a;
+       const uint8_t *addr = b;
+
+       return memcmp(rec->addr, addr, ETH_ALEN) == 0;
+}
+
 static const char *radio_get_path(const struct radio_info_rec *rec)
 {
        static char path[15];
@@ -1570,7 +1581,9 @@
        hwsim_frame_unref(frame);
 }
 
-static void unicast_handler(struct l_genl_msg *msg, void *user_data)
+
+
+static void hwsim_frame_event(struct l_genl_msg *msg)
 {
        struct hwsim_frame *frame;
        const struct mmpdu_header *mpdu;
@@ -1579,9 +1592,6 @@
        const void *data;
        const uint8_t *transmitter = NULL, *freq = NULL, *flags = NULL;
 
-       if (l_genl_msg_get_command(msg) != HWSIM_CMD_FRAME)
-               return;
-
        if (!l_genl_attr_init(&attr, msg))
                return;
 
@@ -1681,6 +1691,146 @@
        process_frame(frame);
 }
 
+static bool get_tx_rx_addrs(struct l_genl_msg *msg, const uint8_t **tx_out,
+                               const uint8_t **rx_out)
+{
+       struct l_genl_attr attr;
+       uint16_t type, len;
+       const void *data;
+       const uint8_t *tx = NULL, *rx = NULL;
+
+       if (!l_genl_attr_init(&attr, msg))
+               return false;
+
+       while (l_genl_attr_next(&attr, &type, &len, &data)) {
+               switch (type) {
+               case HWSIM_ATTR_ADDR_TRANSMITTER:
+                       if (len != ETH_ALEN)
+                               return false;
+
+                       tx = data;
+                       break;
+               case HWSIM_ATTR_ADDR_RECEIVER:
+                       if (len != ETH_ALEN)
+                               return false;
+
+                       rx = data;
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       if (!tx || !rx)
+               return false;
+
+       *tx_out = tx;
+       *rx_out = rx;
+
+       return true;
+}
+
+static void hwsim_add_mac_event(struct l_genl_msg *msg)
+{
+       const uint8_t *tx = NULL, *rx = NULL;
+       struct radio_info_rec *radio_rec;
+       struct interface_info_rec *interface_rec;
+
+       if (!get_tx_rx_addrs(msg, &tx, &rx))
+               return;
+
+       /* No radio matches the TX address, hwsim must not have created it */
+       radio_rec = l_queue_find(radio_info, radio_info_match_addr1, tx);
+       if (!radio_rec)
+               return;
+
+       interface_rec = l_queue_find(interface_info,
+                                       interface_info_match_addr, rx);
+       if (interface_rec) {
+               /* Existing interface, address changes handled via nl80211 */
+               if (interface_rec->name)
+                       return;
+
+               /*
+                * Transient/dummy interface we already know about. This likely
+                * was created, then a scan changed the address temporarily.
+                * Reflect this change and increment the ref so the following
+                * DEL event doesn't destroy it
+                */
+               __atomic_fetch_add(&interface_rec->ref, 1, __ATOMIC_SEQ_CST);
+               return;
+       }
+
+       /*
+        * Create a dummy interface entry for this address that only contains
+        * the radio and address. This is either a transient entry due to scan
+        * randomization or an interface created outside this namespace.
+        */
+       interface_rec = l_new(struct interface_info_rec, 1);
+       interface_rec->radio_rec = radio_rec;
+       interface_rec->ref = 1;
+       memcpy(interface_rec->addr, rx, ETH_ALEN);
+
+       l_queue_push_tail(interface_info, interface_rec);
+}
+
+static void hwsim_del_mac_event(struct l_genl_msg *msg)
+{
+       const uint8_t *tx = NULL, *rx = NULL;
+       struct radio_info_rec *radio_rec;
+       struct interface_info_rec *interface_rec;
+
+       if (!get_tx_rx_addrs(msg, &tx, &rx))
+               return;
+
+       /* No radio matches the TX address, hwsim must not have created it */
+       radio_rec = l_queue_find(radio_info, radio_info_match_addr1, tx);
+       if (!radio_rec)
+               return;
+
+       interface_rec = l_queue_find(interface_info,
+                                               interface_info_match_addr, rx);
+       if (!interface_rec)
+               return;
+
+       /*
+        * This change is handled via nl80211 so we don't want to touch this
+        * interface here.
+        */
+       if (interface_rec->name)
+               return;
+
+       if (__atomic_sub_fetch(&interface_rec->ref, 1, __ATOMIC_SEQ_CST))
+               return;
+
+       l_queue_remove(interface_info, interface_rec);
+       l_free(interface_rec);
+}
+
+static void hwsim_unicast_handler(struct l_genl_msg *msg, void *user_data)
+{
+       uint8_t cmd;
+
+       if (l_genl_msg_get_error(msg) < 0)
+               return;
+
+       cmd = l_genl_msg_get_command(msg);
+
+       switch (cmd) {
+       case HWSIM_CMD_FRAME:
+               hwsim_frame_event(msg);
+               break;
+       case HWSIM_CMD_ADD_MAC_ADDR:
+               hwsim_add_mac_event(msg);
+               break;
+       case HWSIM_CMD_DEL_MAC_ADDR:
+               hwsim_del_mac_event(msg);
+               break;
+       default:
+               break;
+       }
+}
+
 static void radio_manager_create_callback(struct l_genl_msg *msg,
                                                void *user_data)
 {
@@ -2937,8 +3087,9 @@
                }
 
                if (!l_genl_add_unicast_watch(genl, "MAC80211_HWSIM",
-                                               unicast_handler, NULL, NULL)) {
-                       l_error("Failed to set unicast handler");
+                                               hwsim_unicast_handler,
+                                               NULL, NULL)) {
+                       l_error("Failed to set hwsim unicast handler");
                        goto error;
                }
 

Reply via email to